서버 인프라/DevOps

Jenkins를 이용하여 Docker 애플리케이션 배포하기 [3]

트리맨스 2022. 3. 25. 00:57
반응형

 

이전 게시물에서는 elastic beanstalk에 배포하는 플로우까지 제작해 보았다. 하지만 배포가 끝났을 때 알려주는 로직이 있으면 조금 더 확실히 배포에 대해서 인지할 수 있지 않을까? 라는 생각이 들었다. 배포가 정상적으로 이루어지면 좋은거고, 만약 배포에 예상치 못한 원인으로 실패했을 때도 알람을 주면 좋겠다는 아이디어가 있어 찾아보니, jenkins에는 slack과 연동해서 slack에 message를 보낼 수 있었다. 이를 이용해서 배포 결과를 slack으로 보내 보겠다. 참고로 모든 슬랙 메시지와 채널의 이름은 영어로 하는 게 좋다.

 

 

slack 설정


먼저 기존에 이용중인 슬랙이 있어야 한다. 슬랙에 메시지를 전송받을 채널을 만든 후, 좌측 하단의 앱 -> 앱 추가 버튼을 눌러야 한다.

 

 

추가 버튼을 누르고 jenkins를 검색하여 클릭하면 웹으로 넘어가게 된다.

 

 

 

Jenkins 설정


이제부터는 jenkins를 설정해줘야 한다. 플러그인 관리 - slack notification plugin을 설치한다.

 

 

설치 이후 시스템 설정 - slack 항목에서 설정대로 입력한다.

 

 

슬랙 채널은 공개된 채널이 아니므로, 특정한 인증 방법이 필요하다. slack에서는 팀 하위 도메인과 통합 토큰 자격 증명 ID를 이용한다. 간단히 말하면 슬랙 이름과 secret key 이다.  credential -> secret text 추가를 한 다음, Test connection을 눌러서 slack이랑 연결되었는지 확인한다.

 

 

test connection을 눌렀을 때는 다음과 같은 메시지가 슬랙에 뜨게 된다.

 

 

마지막으로 Jenkinsfile에 스크립트를 추가한다. slack에 메시지를 보낼 수 있는 스크립트는 다음과 같다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
pipeline {
  agent any
  stages {
    stage('Build Dockerfile') {
      steps {
        script {
          try {
            try {
              sh 'docker rmi -f $(docker images -q)'
            } catch(error) {
              print(error)
            }
            sh 'docker build -f prod.dockerfile --tag pipit .'
          } catch(error) {
            echo 'Docker Build error!'
            echo 'Error Log:'
            print(error)
          }
        }
      }
    }
 
    stage('Dockerfile Upload') {
      steps {
        script {
          try {
            sh 'aws ecr get-login-password --region ap-northeast-2 | \
                docker login --username AWS --password-stdin 로그인링크'
            sh 'docker tag 태그 ecr주소'
            sh 'docker push ecr주소'
          } catch(error) {
            echo 'Dockerfile Upload error!'
            echo 'Error Log:'
            print(error)
          }
        }
      }
    }
 
    stage('Start deploy') {
      steps {
        script {
          try {
            sh 'aws elasticbeanstalk update-environment \
                --region ap-northeast-2 \
                --environment-name eb환경\
                --version-label eb환경설정파일'
          } catch(error) {
            echo 'Deploy Error!'
            echo 'Error Log:'
            print(error)
          }
        }
      }
    }
  } 
  
  post {
    success {
      slackSend channel: 'p_prod_server_deploy', message: 'server deploy success!'
    }
    failure {
      slackSend channel: 'p_prod_server_deploy', message: 'server deploy fail!'
    }
  }
}
 
cs

 

마지막에 성공했을 경우 server deploy success 메시지를 보내고, 실패할 경우에는 server deploy fail 메시지를 보낸다.

 

 

반응형