본문 바로가기

Infra

[Infra] Jenkins로 Slack에 알림 보내기

현재 저는 관광데이터 활용 공모전에 참가하고 있습니다.

맡은 직무는 Backend와 Infra 입니다.

요새 정말 많은 기술들을 공부하고 테스트 해보고 있습니다. 싱글노드로 구성된 k8s, Jenkins, Nginx 등등인데
프로젝트가 끝나면 꼭 다 포스팅 해보겠습니다!


배경

 

저희 팀원들은 Slack을 활용하여 협업 및 소통을 하고 있습니다.

저는 인프라 담당인 만큼 CI/CD를 구축해야 했고 해당과정에서 Jenkins를 사용했습니다.

문제는 팀원들의 push가 제대로 빌드 되었는지 팀원들에게 확인시켜줘야 한다 는 것이었습니다.

이에 저는 Slack에 #배포 채널을 통해 빌드가 성공적으로 완료되었는지 알림을 보내기로 하였습니다.

구현방법

 

1. Slack에서 Jenkins CI 설치

먼저 Slack에서 Jenkins CI를 설치하였습니다.

더보기 -> 자동화 -> Jenkins 검색

 

 

Slack에 추가를 누르신 후 원하는 채널을 설정하면 됩니다.

저는 #배포 채널을 따로 만든 후 설정하였습니다.

 

2. Jenkins 에서 Slack 설치

Jenkins 관리 -> Plugins 에서 Slack Notification을 설치합니다.

 

3. 설정

Slack에서 채널을 설정하면 가이드 페이지로 넘어갑니다.

가이드페이지에서 팀 하위 도메인통합 토큰 자격 증명 ID 를 기억해야 합니다.

 

후에 Jenkins로 넘어옵니다.

Jenkins 관리 -> system -> Slack을 확인합니다.

Workspace에 팀 하위 도메인을 입력합니다.

Default channel에는 알림을 보낼 채널을 입력합니다. 저는 배포 채널을 쓸 것이기 때문에 #배포를 입력하였습니다.

Credential을 통해 통합 토큰 자격 증명 ID를 입력하여야 합니다.

Add를 눌러주세요

저는 Kind를 Secret text로 설정하였습니다.

Secret에 통합 토큰 자격 증명 ID를 기입합니다.

ID는 Jenkins에서 토큰을 구분할때 사용할 ID 입니다. 저는 slack token으로 설정하였습니다. 편하신대로 설정하시면 됩니다.

describtion은 간단한 설명을 써 넣으면 되고 마찬가지로 편하신대로 설정하시면됩니다.

설정을 마친 후 Test Connection을 눌러서 Success가 나오면 거의 성공한것입니다.

 

4. Jenkinsfile 설정

저는 Jenkinsfile을 통해 CI/CD를 구축했습니다.

성공 혹은 실패 시 slack에 알림을 보낼 수 있도록 작성합니다.

다양하게 작성할 수 있겠지만 제가 한 방식을 공유하겠습니다.

알림을 보낼 채널을 변수로 선언했습니다.

 

다음과 같은 형식으로 알림을 보냅니다.

slackSend(channel: env.SLACK_CHANNEL, color: '', message: "")

 

제가 작성한 코드를 남기겠습니다. 활용에 도움이 되시면 좋겠습니다.

success {
    script {
        dir("${PROJECT_NAME}") {
            def GIT_COMMIT_AUTHOR = sh(script: "git show -s --pretty=%an", returnStdout: true).trim()
            if (env.BUILD_TARGET == 'BACKEND') {
                echo "BE build and deployment succeeded! Commit by: ${GIT_COMMIT_AUTHOR} Build Number: ${env.BUILD_NUMBER}"
            } else if (env.BUILD_TARGET == 'FRONTEND') {
                echo "FE build and deployment succeeded! Commit by: ${GIT_COMMIT_AUTHOR} Build Number: ${env.BUILD_NUMBER}"
            }
            slackSend(channel: env.SLACK_CHANNEL, color: 'good', message: "${env.BUILD_TARGET} 빌드 혹은 배포 성공! \nCommit by: ${GIT_COMMIT_AUTHOR} Build Number: ${env.BUILD_NUMBER}")
        }
    }
}
failure {
    script {
        dir("${PROJECT_NAME}") {
            def GIT_COMMIT_AUTHOR = sh(script: "git show -s --pretty=%an", returnStdout: true).trim()
            echo "Build or deployment failed! Commit by: ${GIT_COMMIT_AUTHOR}"
            slackSend(channel: env.SLACK_CHANNEL, color: 'danger', message: "${env.BUILD_TARGET} 빌드 혹은 배포 실패. \nCommit by: ${GIT_COMMIT_AUTHOR} Build Number: ${env.BUILD_NUMBER}")
        }
    }
}

 


초보 개발자의 글이라 부족한 점이 많습니다. 잘못된 점 등을 말씀해주시면 감사히 받겠습니다.