개발 도구

Jenkins 빌드 결과를 Slack으로 알림 보내는 방법 — Slack Notification 플러그인 완벽 가이드

Jenkins 빌드가 끝날 때마다 성공/실패 알림을 Slack으로 받으면 배포 상태를 실시간으로 파악할 수 있다. Slack Notification 플러그인 설치부터 Webhook 설정, Jenkinsfile post 블록 작성까지 정리했다.

JenkinsSlack알림CI/CD파이프라인
Jenkins 빌드 성공 후 Slack 채널에 초록 색상 메시지와 빌드 번호, 콘솔 링크가 표시된 알림 화면
  • ·Slack Notification 플러그인: Jenkins 공식 플러그인, Incoming Webhook과 앱 토큰 방식 지원
  • ·post 블록 위치: stages { } 다음, pipeline { } 마지막
  • ·slackSend color: 'good'(초록), 'danger'(빨강), 'warning'(노랑)
  • ·Jenkinsfile 내장 환경변수: env.JOB_NAME, env.BUILD_NUMBER, env.BUILD_URL
여러 Jenkins 파이프라인을 운영하다 보니 빌드가 실패해도 한참 후에야 Build History를 직접 확인하러 들어가서 알게 되는 경우가 있었다. Slack 알림을 붙이고 나서는 배포 성공과 실패를 채널에서 바로 받으니까 문제가 생기면 즉시 대응할 수 있게 됐다. 처음 설정할 때 credentialsId를 잘못 입력해서 slackSend가 계속 오류를 내뱉었는데, Jenkins Credentials에 등록한 ID와 완전히 일치해야 한다는 걸 알고 나서야 해결됐다.

Jenkins Slack 알림이 필요한 이유

Jenkins 빌드 결과를 Slack으로 받아야 하는 이유

Jenkins 파이프라인은 빌드가 끝나도 별도로 알림을 보내지 않는다. 결과를 확인하려면 Jenkins 관리 화면에 직접 접속해서 Build History를 봐야 한다. 혼자 운영할 때는 그냥 넘어갈 수 있지만, 팀이 여러 파이프라인을 공유하거나 배포 빈도가 높아지면 실패를 늦게 인지하는 일이 생긴다. 빌드 실패 후 30분이 지나서야 알게 되면 그 사이에 다른 팀원이 영향을 받을 수 있다. Slack 알림을 붙여두면 빌드가 끝나는 순간 지정한 채널에 결과 메시지가 날아온다. 성공이면 초록, 실패면 빨강으로 색을 구분해서 메시지가 오기 때문에 채널을 보는 것만으로 배포 상태를 파악할 수 있다. 빌드 번호, 브랜치, Jenkins 콘솔 링크까지 메시지에 포함시키면 실패했을 때 바로 콘솔로 들어가서 원인을 확인할 수 있다. 운영 채널과 분리된 Jenkins 알림 전용 채널을 만들어두면 배포 이력이 채널에 쌓여서 언제 무엇이 배포됐는지 추적하는 용도로도 쓸 수 있다. 직접 Slack 알림을 붙이기 전과 후를 비교하면 빌드 실패 대응 시간이 눈에 띄게 줄어들고 팀 전체가 배포 상태를 공유하게 된다는 걸 체감할 수 있다.

Jenkins Slack Notification 플러그인 설정하기

Jenkins에 Slack Notification 플러그인을 설치하고 Slack 토큰을 등록하는 방법

Jenkins에서 Slack 알림을 보내려면 Slack Notification 플러그인이 필요하다. Manage Jenkins → Plugins → Available plugins에서 'Slack Notification'을 검색해 설치한다. 설치 후 재시작하면 Manage Jenkins → System에 Slack 설정 항목이 생긴다. Slack과 Jenkins를 연동하는 방식은 두 가지다. 첫 번째는 Slack Incoming Webhook URL을 직접 쓰는 방식이고, 두 번째는 Slack Jenkins CI 앱을 워크스페이스에 설치해서 토큰을 받는 방식이다. 현재 Slack에서 권장하는 방식은 앱을 통한 토큰 방식이다. Slack API 페이지에서 Jenkins CI 앱을 워크스페이스에 설치하면 토큰이 발급된다. 이 토큰을 Jenkins Credentials에 Secret text 타입으로 등록한다. Manage Jenkins → System → Slack 섹션에서 Workspace에 Slack 워크스페이스 이름을 입력하고, Credential에서 방금 등록한 토큰을 선택한다. Default channel에 기본 알림 채널을 입력한다. Test Connection 버튼을 눌러서 Success 메시지가 뜨면 연동이 정상으로 된 것이다. 처음에 토큰을 Credentials 등록 없이 필드에 직접 입력했다가 보안 경고가 뜬 경험이 있다. 반드시 Jenkins Credentials를 통해 관리하는 방식을 써야 한다.

Slack에서 Jenkins 연동용 채널을 설정하는 방법

Slack 워크스페이스에 Jenkins 알림을 받을 채널을 만든다. #deploy 또는 #jenkins-alerts 같은 전용 채널을 운영 채널과 분리해서 만들어두면 알림이 다른 대화에 묻히지 않아 관리가 편하다. Slack API 페이지에서 Jenkins CI 앱을 워크스페이스에 추가할 때 기본 채널을 선택하게 된다. Jenkins System 설정에서 Default channel을 지정해두면 Jenkinsfile에서 채널을 별도로 명시하지 않아도 그 채널로 알림이 간다. 파이프라인마다 다른 채널로 알림을 보내고 싶다면 slackSend 함수 호출 시 channel 파라미터로 채널 이름을 지정하면 된다. 채널 이름보다 채널 ID를 쓰면 채널 이름이 바뀌어도 연동이 끊기지 않는다. 채널 ID는 Slack에서 채널 이름을 우클릭하거나 채널 상세 정보 화면에서 확인할 수 있다. 직접 운영하다 보면 채널 이름 기반으로 설정했다가 채널 이름을 변경한 후 알림이 안 가서 당황한 경우가 생기는데, ID 기반으로 설정해두면 이 문제를 피할 수 있다. Jenkins CI 앱이 해당 채널에 초대되어 있지 않으면 메시지가 전송되지 않으니 채널을 새로 만들었다면 앱을 채널에 초대하는 것도 잊지 말아야 한다.

Jenkinsfile에서 Jenkins Slack 알림 보내는 방법

Jenkinsfile post 블록에 Jenkins Slack 알림을 추가하는 방법

Jenkins Slack 알림은 Jenkinsfile의 post 블록에서 slackSend 함수를 호출해서 보낸다. post 블록은 pipeline { } 안에서 stages { } 블록 다음에 위치한다. 빌드 결과에 따라 다른 조건 절을 사용할 수 있다. success는 빌드 성공 시, failure는 실패 시, always는 결과에 상관없이 항상 실행한다. slackSend 함수의 color 파라미터로 메시지 색상을 지정한다. 'good'은 초록, 'danger'는 빨강, 'warning'은 노랑이다. message 파라미터에 전송할 텍스트를 작성하고, channel로 전송할 채널을 지정한다. 메시지에 Jenkins 내장 환경변수를 활용하면 빌드 번호, Job 이름 같은 컨텍스트를 자동으로 포함할 수 있다. env.JOB_NAME은 Job 이름, env.BUILD_NUMBER는 빌드 번호, env.BUILD_URL은 해당 빌드 페이지 링크다. 실패 시 이 링크를 메시지에 포함시키면 알림에서 바로 Jenkins 콘솔로 이동해 원인을 확인할 수 있다. 처음에는 단순 텍스트 메시지로 시작해도 충분하다. 운영하면서 필요한 정보를 하나씩 추가하는 방식이 설정을 복잡하게 만들지 않는 현실적인 접근이다.

pipeline {
  agent any
  stages {
    stage('Build') { steps { sh 'npm ci && npm run build' } }
    stage('Deploy') { steps { sh './deploy.sh' } }
  }
  post {
    success {
      slackSend(
        color: 'good',
        message: "배포 성공: ${env.JOB_NAME} #${env.BUILD_NUMBER}",
        channel: '#deploy'
      )
    }
    failure {
      slackSend(
        color: 'danger',
        message: "배포 실패: ${env.JOB_NAME} #${env.BUILD_NUMBER}\n${env.BUILD_URL}console",
        channel: '#deploy'
      )
    }
  }
}

Jenkins Slack 알림 메시지를 커스터마이즈하는 방법

slackSend 함수로 텍스트 메시지를 보낼 수 있고, attachments 파라미터를 사용하면 제목, 본문, 색상 바, 링크 버튼이 포함된 카드 형식 메시지를 만들 수 있다. 메시지에 포함하면 유용한 정보로는 GIT_COMMIT 해시로 어떤 커밋이 배포됐는지, BRANCH_NAME으로 어떤 브랜치에서 빌드됐는지, 빌드 소요 시간이 있다. 소요 시간은 currentBuild.durationString으로 가져올 수 있다. Multibranch Pipeline을 사용하는 경우 env.BRANCH_NAME에 현재 브랜치 이름이 자동으로 들어온다. 알림 채널에 팀원을 직접 멘션하고 싶다면 메시지에 Slack 사용자 ID를 포함시키면 된다. 빌드 실패 시 담당자를 멘션하는 방식으로 쓰면 알림을 놓치는 일을 방지할 수 있다. 채널 전체 멘션은 <!here> 또는 <!channel>이다. 직접 운영해보면 처음에는 단순 성공/실패 메시지로 시작했다가, 나중에 커밋 정보와 콘솔 링크를 추가하면서 메시지 포맷이 점점 실용적으로 진화하는 경험을 하게 된다. 팀원이 알림만 봐도 무슨 일이 일어났는지 파악할 수 있는 수준을 목표로 메시지를 설계하면 된다.

자주 묻는 질문

slackSend가 실행됐는데 Slack에 메시지가 오지 않는 이유는 무엇인가요?+

Jenkins System 설정의 Slack 섹션에서 Credential과 Workspace가 올바르게 설정됐는지 확인하세요. Test Connection 버튼으로 연동 상태를 먼저 확인하세요. slackSend의 channel 파라미터가 실제 채널 이름과 다르거나, Jenkins CI 앱이 해당 채널에 초대되지 않은 경우도 원인이 됩니다.

post 블록에서 failure와 always를 동시에 쓸 수 있나요?+

네, 가능합니다. 각 조건 절은 서로 독립적으로 실행됩니다. failure 블록에서 실패 알림을 보내고, always 블록에서 빌드 소요 시간 같은 공통 정보를 기록하는 방식으로 함께 쓸 수 있습니다.

특정 브랜치에서만 Slack 알림을 보내고 싶으면 어떻게 하나요?+

post 블록 안에서 if (env.BRANCH_NAME == 'main') { slackSend(...) } 형태로 조건을 추가하면 됩니다. main 브랜치 배포 시에만 알림을 보내고 feature 브랜치 빌드는 알림을 생략하는 방식으로 활용할 수 있습니다.

Slack 알림에 빌드 콘솔 링크를 포함하려면 어떻게 하나요?+

${env.BUILD_URL}console를 메시지에 포함하면 됩니다. BUILD_URL은 Jenkins 내장 환경변수로 해당 빌드의 URL이고, 여기에 console을 붙이면 콘솔 출력 페이지 링크가 됩니다.

관련 글