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

- ·Slack Notification 플러그인: Jenkins 공식 플러그인, Incoming Webhook과 앱 토큰 방식 지원
- ·post 블록 위치: stages { } 다음, pipeline { } 마지막
- ·slackSend color: 'good'(초록), 'danger'(빨강), 'warning'(노랑)
- ·Jenkinsfile 내장 환경변수: env.JOB_NAME, env.BUILD_NUMBER, env.BUILD_URL
여러 젠킨스 배포 파이프라인들을 혼자서 꾸려가던 중에, 배포 스크립트가 도중에 깨졌는데도 그걸 모른 채 한참을 방치하다가 동료의 제보를 받고 부랴부랴 젠킨스 로그를 파헤치던 곤란한 경험이 여러 번 있었습니다. 이를 해결하기 위해 슬랙 알림 연동을 적용했는데, 처음 설정 시 파일명과 `credentialsId` 고유 이름을 꼼꼼히 매칭해 주지 않아 `slackSend` 함수가 통신 오류를 주르륵 뱉어서 진땀을 흘렸던 기억이 납니다. 하지만 일단 Credentials 식별값 규칙을 맞춰 연동을 제대로 끝내고 나니, 이제는 빌드가 도중에 엎어져도 슬랙 경보를 보고 10초 만에 인지하여 롤백을 할 수 있게 되어 마음의 평화를 얻었습니다.
1. 빌드 모니터링 자동화의 필요성
성공/실패 피드백 루프를 단축시키는 Slack 메신저 알림의 중요성
CI/CD 파이프라인을 구축해 두어도 빌드 결과를 실시간으로 모니터링하지 못하면 절반의 성공일 뿐입니다. Jenkins는 기본적으로 파이프라인 실행이 끝나도 스스로 소리를 내거나 메인 대시보드 화면에 접속해 있지 않는 한 아무런 신호를 주지 않습니다. 혼자 개발할 때는 빌드 히스토리를 가끔 열어보면 그만이지만, 여러 명의 개발자가 협업하는 팀 환경에서는 어떤 커밋이 빌드를 깨뜨렸는지 인지하는 시간이 늦어질수록 병목 현상이 기하급수적으로 늘어납니다. 누군가 잘못 올린 코드로 인해 배포 빌드가 깨져 있는데도 30분 동안 아무도 몰라 다른 팀원들이 로컬에서 계속 엉뚱한 원인 분석을 하느라 아까운 개발 공수를 날리는 상황이 대표적입니다. Jenkins 파이프라인의 종착점에 Slack 알림 통로를 뚫어놓는 것은 이 피드백 루프를 단 1초 수준으로 획기적으로 줄여주는 가장 직관적인 해법입니다. 빌드가 깨진 순간 채널 전체에 빨간색 경고 메시지와 에러 로그 바로가기 링크가 팝업되므로, 담당자가 즉시 코드를 롤백하거나 수정하는 대응이 가능해져 팀 전체의 배포 생산성이 눈에 띄게 올라갑니다.
2. Jenkins와 Slack 연동 가이드
Slack Notification 플러그인 설치 및 보안 Credentials 토큰 연동하기
Jenkins에서 Slack으로 알림 귓속말을 보내기 위한 첫 단계는 플러그인 매니저에서 'Slack Notification' 모듈을 설치하는 일입니다. 설치가 끝나면 Jenkins 글로벌 설정에 Slack 영역이 활성화되는데, 연동을 위해 Slack API 관리 콘솔에서 생성한 앱 토큰을 등록해 주어야 합니다. 간혹 연동 과정에서 발급받은 시크릿 키나 웹훅 주소를 Jenkins 설정 필드에 텍스트 형태로 직접 날것으로 붙여 넣는 위험천만한 설정을 하고 넘어가는 개발자들이 있습니다. 이는 설정 페이지 노출이나 백업 설정 XML 유출 시 보안 토큰이 통째로 털리는 취약점으로 이어지므로, 반드시 Jenkins Credentials 관리자에 들어가 Secret text 타입으로 크레덴셜을 등록한 뒤 안전하게 참조 매핑하는 방식을 취해야 합니다. 등록 후 Workspace 명칭과 채널을 지정해 두고 Test Connection을 실행하여 초록색 'Success' 문구가 콘솔에 찍히는 것을 확인하면, Nginx나 OS 단의 포트 블로킹 간섭 없이 Jenkins 엔진과 Slack 클라우드 간의 보안 통신망 세팅이 정상적으로 끝난 것입니다.
Slack 알림 수집의 안정성을 높이는 채널 ID 식별자 세팅법
알림을 전달받을 Slack 워크스페이스 내에 #deploy-alerts나 #jenkins-bot 같은 전용 알림 채널을 별도로 개설해 두면 개발자들 간의 일상 대화에 메시지가 묻히는 불상사를 막을 수 있어 관리가 한층 용이해집니다. 이때 흔히 하는 세팅 방식이 단순히 채널 이름 문자열인 #deploy를 연동 타겟에 입력하는 것인데, 실무에서는 채널명이 아닌 C0123456789 형태의 '채널 고유 ID(Channel ID)' 식별자를 입력하는 것을 강력하게 권장합니다. 채널 이름은 운영 중에 팀 규칙이나 부서 변경 등으로 언제든 가볍게 바뀔 수 있는데, 이름 기반으로 바인딩해 두면 채널명을 수정하는 즉시 Jenkins 알림 발송이 에러와 함께 중단되는 끔찍한 연동 누락을 겪기 때문이죠. 반면 고유 ID는 채널 타이틀을 아무리 바꿔도 불변하는 키값이므로 연동 끊김 리스크가 전혀 없습니다. 채널 ID는 Slack 내에서 채널 이름을 우클릭한 뒤 공유 메뉴나 하단 정보 상세 뷰에서 간단히 가져올 수 있으며, 추가적으로 새로 개설한 채널에는 Jenkins 봇 앱을 명령어(/invite @JenkinsCI)로 명시적으로 초대해 주어야만 메시지 전송 권한이 부여된다는 점을 잊지 맙시다.
3. Jenkinsfile 파이프라인 코드 작성
Jenkinsfile post 블록에 빌드 상태별 Slack 알림 스크립트 선언하기
연동 설정을 마쳤다면 실제 파이프라인의 작동을 정의하는 Jenkinsfile 스크립트 코드를 수정할 차례입니다. 빌드 프로세스가 모두 수행된 후 동작하는 post 라이프사이클 내에 success와 failure 블록을 만들고, 그 안에서 slackSend 함수를 트리거해 주면 됩니다. 성공 시에는 메인 색상을 good(초록), 실패 시에는 danger(빨강)로 지정하면 가독성이 극대화됩니다. 이때 메일이나 알림 메시지에 Jenkins가 기본으로 제공하는 글로벌 환경변수 객체인 env 필드를 바인딩해 주는 것이 핵심 꿀팁입니다. env.JOB_NAME으로 배포 파이프라인의 작업명을 가져오고 env.BUILD_NUMBER로 빌드 회차를 매핑하며, 무엇보다 env.BUILD_URL을 메인 메시지에 엮어서 보내주는 것이 필수적입니다. 이렇게 콘솔 다이렉트 링크를 심어두면, 빌드 깨짐 적색 경보를 받은 개발자가 슬랙 메시지의 링크를 클릭하자마자 즉시 터미널 로그 화면으로 도달하여 무엇 때문에 빌드가 실패했는지(예: 린트 에러, 컴파일 오류 등)를 파악할 수 있어 복구 시간이 획기적으로 압축됩니다.
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'
)
}
}
}커밋 로그와 소요 시간 정보를 담은 Slack 알림 커스텀 카드 만들기
단순히 성공/실패 텍스트 한 줄만 달랑 슬랙으로 날아오면, 동료 개발자들은 '방금 누가 무슨 기능을 올리다가 깨진 건지' 파악하기 위해 결국 깃허브나 젠킨스 화면을 또 뒤적거려야 합니다. 이를 개선하여 알림 메시지 자체를 미려한 UI 카드 형태로 커스터마이즈하는 것이 협업 효율 향상의 중요한 포인트입니다. slackSend 함수의 attachments 구조를 활용하면, 어떤 Git 커밋 해시(GIT_COMMIT)를 배포한 것인지, 배포를 수행한 소스 브랜치는 무엇인지(BRANCH_NAME), 그리고 빌드가 총 몇 분 몇 초 걸렸는지(currentBuild.durationString)까지 하나의 카드로 묶어서 깔끔하게 뿌릴 수 있습니다. 실패 메시지 상단에 해당 배포를 트리거한 커밋 작성자(Author)의 Slack 멤버 ID를 찾아 매핑(@사용자ID)해 두는 실무 기법을 적용하면, 빌드 크래시 발생 시 관련 담당자에게 즉각적인 다이렉트 멘션을 쏴줄 수도 있습니다. 이렇게 설계된 카드는 팀원 모두가 메신저 창만 쳐다보고 있어도 현재 우리 서비스가 어떤 개발 스펙을 품고 배포 중인지 한눈에 동기화할 수 있는 강력한 인프라 협업 환경을 선사합니다.
자주 묻는 질문
slackSend 함수를 호출했는데 슬랙 채널에 아무 알림도 오지 않고 Jenkins 콘솔에 에러가 뜹니다.+
젠킨스 글로벌 시스템 설정에 등록된 Slack 워크스페이스 명칭과 인증 토큰Credentials이 일치하는지 먼저 검사해 보세요. 또한, 타겟 채널에 젠킨스 봇 앱이 실제로 가입되어 있지 않으면 메시지를 발송할 수 없으므로, 해당 채널 채팅창에 `/invite @JenkinsCI`를 쳐서 봇을 꼭 멤버로 추가해야 합니다.
빌드 실패(failure) 외에 불안정(unstable)이나 중단(aborted) 상태에 대해서도 각각 알림 분기를 칠 수 있나요?+
네, 가능합니다. 젠킨스파일 `post` 섹션에는 `success`와 `failure` 외에도 `unstable`, `aborted`, `changed` 등의 다양한 조건절 블록을 선언할 수 있으므로, 각 블록마다 색상과 경고 메시지 문구를 다르게 매핑한 `slackSend` 코드를 각각 배치하여 세분화된 배포 관리가 가능합니다.
관련 글
Jenkins GitHub Webhook 트리거 완벽 가이드 — push 후 즉시 빌드를 시작하는 방법
매번 손수 빌드를 누르거나 pollSCM으로 리소스를 낭비하지 않고, GitHub Webhook을 연계해 머지 즉시 실시간 Jenkins 빌드가 시작되도록 설계하는 방법을 상세히 다룹니다.
Next.js 정적 사이트를 Jenkins로 자동 배포하는 방법 — Jenkinsfile로 빌드부터 배포까지
Next.js 프로젝트를 output: 'export' 설정으로 정적 빌드한 뒤, Jenkins 파이프라인을 구축해 원격 운영 서버로 자동 배포하는 정석 프로세스를 알아봅니다. Credentials를 통한 SSH 안전 연동 팁도 다룹니다.
Jenkins 빌드 스케줄러 완벽 가이드 — Jenkinsfile에 cron 트리거 추가하는 방법
Jenkins UI에서 직접 관리하던 파이프라인을 Jenkinsfile로 전환하고, cron 트리거로 매일 자동 빌드를 구성하는 방법을 정리했습니다. H 표현식을 이용한 부하 분산과 UTC 시간대 대처 팁까지 상세히 다룹니다.