이전 글에 Jekins Pipeline을 생성해 도커 컨테이너 자동화 배포를 구축했다.
이번엔 파이프라인 각 스텝마다 Slack 알림을 받을 수 있도록 설정하려고 한다.
모두 알다시피 슬랙 알림 연동은 API가 매우 잘되어있어 설정하기가 너무 쉽다.
1. Slack에 Jenkins App 추가
https://워크스페이스.slack.com/apps로 접속해 Jenkins를 검색하고 Jenkins CI App을 슬랙에 추가해준다.
알림 받을 채널을 선택한다.
채널을 선택해 Jenkins CI 통합 앱 추가를 클릭하면 설명 지침 페이지로 이동하게 되는데, 여기서 나오는 설명은 모든 스텝이 끝난 후에 알림이 오는 설정이다.
모든 스텝이 끝난 후 알림이 오는 것을 원하면 이대로 따라 하기만 하면 된다.
예제는 파이프라인 스텝 중간중간 슬랙 알림을 설정할 것이다.
3단계에 팀 하위 도메인과 통합 토큰 자격 증명 ID를 기억해야 한다.
요렇게 설정을 저장해준다.
2. Jenkins Slack Notification 플러그인 설치 및 설정
Jenkins에 접속해 Slack Notification 플러그인 설치을 설치 해준다.
정상적으로 설치가 되었으면 시스템 설정으로 들어가 Slack 설정을 해준다.
알맞은 정보를 입력한 후 Credential을 추가한다.
Kind는 Secret text로 선택하고 Secret은 위에서 발급받은 토큰 값을 입력해준다.
생성한 Credential을 선택하고 하단에 Test Connection 버튼을 클릭하면 왼쪽에 Success가 출력된다.
슬랙 채널에 들어가 보면 젠킨스 슬랙 플러그인이 설정되었다고 메시지가 날아온다.
원래 채널을 만들지 않고 슬랙 봇으로 보내려고 했는데 슬랙 정책으로 인해 2021년 2월 24일 이후로 새로 생성된 bot은 슬랙 라이브러리를 사용할 수 없다고 한다.
(참고 : https://api.slack.com/changelog/2021-02-24-how-we-broke-your-slack-app)
사용하려면 직접 Post 방식으로 메시지를 보내야 한다고 한다.
(참고 : https://yunwoong.tistory.com/132)
3. Pipeline에 슬랙 발송 설정하기
그럼 이전 글에서 설정한 파이프라인에 슬랙 발송을 추가해보겠다.
pipeline {
agent any
stages {
stage("Set Variable") {
steps {
script {
IMAGE_NAME = "이미지명"
IMAGE_STORAGE = "Container Registry 경로"
IMAGE_STORAGE_CREDENTIAL = "Container Registry 접근 Credential id"
SSH_CONNECTION = "접속할 계정@배포할 서버 IP"
SSH_CONNECTION_CREDENTIAL = "SSH 서버 접근 Credential id"
SLACK_CHANNEL = "#알림받을 채널"
SLACK_SUCCESS_COLOR = "#2C953C";
SLACK_FAIL_COLOR = "#FF3232";
// Git Commit 계정
GIT_COMMIT_AUTHOR = sh(script: "git --no-pager show -s --format=%an ${env.GIT_COMMIT}", returnStdout: true).trim();
// Git Commit 메시지
GIT_COMMIT_MESSAGE = sh(script: "git --no-pager show -s --format=%B ${env.GIT_COMMIT}", returnStdout: true).trim();
}
}
post {
success {
slackSend (
channel: SLACK_CHANNEL,
color: SLACK_SUCCESS_COLOR,
message: "==================================================================\n배포 파이프라인이 시작되었습니다.\n${env.JOB_NAME}(${env.BUILD_NUMBER})\n${GIT_COMMIT_AUTHOR} - ${GIT_COMMIT_MESSAGE}\n${env.BUILD_URL}"
)
}
}
}
stage("Clean Build Test") {
steps {
sh "./gradlew clean build test"
}
post {
success {
slackSend (
channel: SLACK_CHANNEL,
color: SLACK_SUCCESS_COLOR,
message: "Build Test에 성공하였습니다."
)
}
failure {
slackSend (
channel: SLACK_CHANNEL,
color: SLACK_FAIL_COLOR,
message: "Build Test에 실패하였습니다."
)
}
}
}
stage("Build Container Image") {
steps {
script {
image = docker.build("${IMAGE_STORAGE}/${IMAGE_NAME}")
}
}
post {
success {
slackSend (
channel: SLACK_CHANNEL,
color: SLACK_SUCCESS_COLOR,
message: "Container Image Build에 성공하였습니다."
)
}
failure {
slackSend (
channel: SLACK_CHANNEL,
color: SLACK_FAIL_COLOR,
message: "Container Image Build에 실패하였습니다."
)
}
}
}
stage("Push Container Image") {
steps {
script {
docker.withRegistry("https://${IMAGE_STORAGE}", IMAGE_STORAGE_CREDENTIAL) {
image.push("${env.BUILD_NUMBER}")
image.push("latest")
image
}
}
}
post {
success {
slackSend (
channel: SLACK_CHANNEL,
color: SLACK_SUCCESS_COLOR,
message: "Container Image Push에 성공하였습니다."
)
}
failure {
slackSend (
channel: SLACK_CHANNEL,
color: SLACK_FAIL_COLOR,
message: "Container Image Push에 실패하였습니다."
)
}
}
}
stage("Server Run") {
steps {
sshagent([SSH_CONNECTION_CREDENTIAL]) {
// 최신 컨테이너 삭제
sh "ssh -o StrictHostKeyChecking=no ${SSH_CONNECTION} 'docker rm -f ${IMAGE_NAME}'"
// 최신 이미지 삭제
sh "ssh -o StrictHostKeyChecking=no ${SSH_CONNECTION} 'docker rmi -f ${IMAGE_STORAGE}/${IMAGE_NAME}:latest'"
// 최신 이미지 PULL
sh "ssh -o StrictHostKeyChecking=no ${SSH_CONNECTION} 'docker pull ${IMAGE_STORAGE}/${IMAGE_NAME}:latest'"
// 이미지 확인
sh "ssh -o StrictHostKeyChecking=no ${SSH_CONNECTION} 'docker images'"
// 최신 이미지 RUN
sh "ssh -o StrictHostKeyChecking=no ${SSH_CONNECTION} 'docker run -d --name ${IMAGE_NAME} -p 8080:8080 ${IMAGE_STORAGE}/${IMAGE_NAME}:latest'"
// 컨테이너 확인
sh "ssh -o StrictHostKeyChecking=no ${SSH_CONNECTION} 'docker ps'"
}
}
post {
success {
slackSend (
channel: SLACK_CHANNEL,
color: SLACK_SUCCESS_COLOR,
message: "배포에 성공하였습니다.\n=================================================================="
)
}
failure {
slackSend (
channel: SLACK_CHANNEL,
color: SLACK_FAIL_COLOR,
message: "배포에 실패하였습니다.\n=================================================================="
)
}
}
}
}
}
위 변수를 설정하는 Set Variables Stage에서 스크립트 명령어를 이용해 Git Commit 계정과 메시지를 추출해 슬랙에 발송하고 있다.
// Git Commit 계정
GIT_COMMIT_AUTHOR = sh(script: "git --no-pager show -s --format=%an ${env.GIT_COMMIT}", returnStdout: true).trim();
// Git Commit 메시지
GIT_COMMIT_MESSAGE = sh(script: "git --no-pager show -s --format=%B ${env.GIT_COMMIT}", returnStdout: true).trim();
그럼 파이프라인을 실행시켜 테스트해보자.
정상적으로 단계별로 슬랙이 발송되었다.
'ETC' 카테고리의 다른 글
Jenkins를 이용한 Docker 컨테이너 자동 배포하기(Blue Ocean, Bitbucket, NCP) (8) | 2022.05.06 |
---|---|
Jenkins를 이용한 프로젝트 자동 배포하기(Bitbucket, EC2) (0) | 2022.05.03 |
H2 Database 사용자 정의 함수 만들기 (0) | 2022.04.19 |
인텔리제이 TODO 기능 활용하기 (0) | 2022.01.06 |
최근 Log4j2 취약점 설명 및 해결 방안 (0) | 2021.12.13 |