배경 상황
주말에 장애 알림이 와서 확인했더니 배치 잡을 돌리는데 사용하는 젠킨스가 죽는 바람에 중요한 비즈니스 로직이 돌지 않고 있었다. 이걸 젠킨스로 돌리는 게 맞나? 라는 의문도 들지만 그 이전에 젠킨스에 모니터링 관련된 설정이 되지 않아서 알림을 못받고 있던 게 큰 문제였는데, 최근 PagerDuty를 도입한 김에 PagerDuty로 알림 설정을 하기로 했다.
PagerDuty에서 Jenkins 파이프라인 실패 알림 설정하기
1. Jenkins에서 PagerDuty 알림을 설정하려면 먼저 PagerDuty 플러그인을 설치해야한다. Jenkins에서 Jenkins 관리 > Plugins > Available plugins를 클릭하고, pagerduty를 검색해 다운로드 받는다.

2. 플러그인을 선택하면 활성화를 위해 Jenkins를 재시작해야 한다. 브라우저에서 "<jenkins URL>/safeRestart"로 접근해 안내 배너에 띄울 문구를 입력하고 Restart 버튼을 클릭해 실행중인 job이 모두 정지되거나 종료되었을 때 재시작될 수 있도록 한다.

3. 이제 PagerDuty 콘솔로 이동해 Services > Service Directory에 접근한다.

4. 연동할 PagerDuty 서비스가 기존에 생성되었다면 선택하고(8번부터 진행), 적절한 서비스가 없다면 New Service를 클릭해 서비스를 생성한다.

5. (서비스를 신규 생성하는 경우) 서비스 이름과 설명을 입력하고 Next를 클릭한다.

6. (서비스를 신규 생성하는 경우) 적절한 Escalation Policy를 신규 생성하거나 기존 Escalation Policy를 선택한다.

7. Integration에서 Events API V2를 선택하고 Service를 생성한다.

8. 생성한 서비스 이름을 클릭하고, Integrations 탭에서 Events API V2가 추가 되어있다면 드롭다운을 클릭하고, 없다면 Add another integration에서 Events API V2 를 추가한다. 그리고 Integration Key를 복사한다.

9. 다시 Jenkins로 돌아가 Jenkins 관리 > Credentials > Global 도메인을 선택한 후 Add Credentials를 클릭한다.

10. 다음과 같이 Integration Key를 크레덴셜에 등록한다.
- Kind: Secret text
- Secret: 위에서 복사한 Integration Key 값
- ID: 환경변수에서 참조할 때 사용할 값. 나는 PagerDuty 서비스 이름과 동일하게 설정했다.
- Description: 키에 대한 설명 작성

11. Pipeline 타입의 프로젝트일 경우 Jenkinsfile에 다음과 같이 실패 시 PagerDuty Incident 트리거 구성을 위한 post 블록을 추가한다.
- credentialsId(필수): 위에서 등록한 credential ID
- incidentSummary(필수): PagerDuty 알림 Title에 들어갈 값
- trigger 조건: 실패 시 알람 받을 경우 triggerOnFailure: true 필드를 추가
- incidentSeverity, incidentSource, incidentComponent, incidentClass, incidentGroup, dedupKey은 필수값은 아니지만 PagerDuty에서 알림 상세에 표시되는 값이므로 적절히 입력한다.
post {
failure {
echo "빌드 실패: PagerDuty 알람 전송중..."
script {
withCredentials([string(credentialsId: '<위에서 등록한 credential ID>', variable: 'PD_KEY')]) {
def jobName = env.JOB_NAME
def buildNumber = env.BUILD_NUMBER
def buildUrl = env.BUILD_URL
pagerduty(
routingKey: env.PD_KEY,
incidentSummary: "Build failed: ${env.JOB_NAME} #${env.BUILD_NUMBER}",
incidentSeverity: 'critical',
incidentSource: 'jenkins',
dedupKey: "${env.JOB_NAME}-${env.BUILD_NUMBER}",
incidentComponent: "${env.JOB_NAME}",
incidentClass: 'build-failure',
incidentGroup: 'jenkins-builds',
triggerOnFailure: true,
)
}
}
}
}
12. 만약 Pipeline타입이 아닌 Freestyle 타입의 프로젝트일 경우 파이프라인에서 구성을 클릭 > 빌드 환경 영역에서 Use secret text(s) or file(s) 체크박스를 활성화한다.

Secret text를 클릭한다.

Variable에 PD_KEY 를 입력하고, 위에서 설정한 Credential을 드롭다운에서 선택한다.

스크롤 다운 후 빌드 후 조치 영역에서 빌드 후 조치 추가 버튼을 클릭 > PagerDuty Incident Trigger를 선택한다.

아래와 같이 Routing Key($PD_KEY 환경변수 사용) 및 필요한 필드를 설정한다($JOB_NAME 등의 환경변수는 젠킨스에서 기본으로 제공됨).

13. 이렇게 구성하면 젠킨스 파이프라인 실패 시 아래처럼 PagerDuty에서 Incident & 알림이 발생하게 된다.

위 구성은 특정 Job이 실패할 경우의 알림이기 때문에 Jenkins나 인프라 자체에 문제가 생길 경우에는 알림이 아예 발생하지 않기 때문에 해당 알림 구성도 별도로 진행해야 한다.