Infra

[Jenkins] Pipeline 내 Job 실패 시 재시도 처리 및 OpsGenie 알림 전송

kth990303 2024. 2. 13. 20:06
반응형

배치 파이프라인 job을 돌리다가, 특정 job이 실패하면 해당 job은 재시도 처리를 해야 되는 요구사항을 받았다.

그리고 재시도 처리를 계속 진행해도 실패하면 opsgenie로 온콜 담당자에게 전화를 때리게 해주어야 한다.

 

젠킨스 플러그인을 이용해서 해당 처리를 하는 과정을 까먹지 않도록 기록해보려 한다.


1. 플러그인 설치


2. 옵스지니 설정

 

젠킨스에 옵스지니 api key 설정을 해주기 위해, 옵스지니 - Teams - Integrations 로 들어간다.

그리고 Add Integration을 진행해준다.

 

 

 

status가 FAILURE일 경우 알림을 보내주기 위해 우측의 `+ Add rule` 을 눌러 위와 같이 설정해준다.

 

만약 특정 job만 조건을 걸어서 알림을 보내고 싶다면 rule에 status가 아닌 프로젝트명으로 if처리를 추가로 설정해주면 된다.

하지만, 해당 rule 조건 필터링은 옵스지니뿐 아니라 젠킨스에서도 가능하다.

(젠킨스 job 구성에 빌드 후 조치로 `Enable Sending Alerts` 가 있음.)

 

옵스지니로 들어가서 룰을 따로 추가하고 설정하는 것보단, 옵스지니에는 간단한 룰만 설정하고 젠킨스에서 job 조건들을 설정하는 것이 더 편하다.

따라서 옵스지니에서는 failure인 경우에 alert를 보내주는 설정만 진행해주었다.


3-1. 젠킨스 job retry 및 옵스지니 연동

(단, 파이프라인 내에 있는 job이라면 해당 부분 건너뛰고 3-2 참고)

특정 job이 실패했을 때 retry를 하게 설정하고 싶다면 젠킨스 job 구성에서 설정하면 된다.

job 구성에서

Retry build after failure 를 선택하면 된다.

 

최대 몇 회까지 재시도할지,

그리고 고급을 선택하면 실패 후 몇 초 후에 재시도하게 할 것인지에 대해서도 설정할 수 있다.

 

옵스지니 알림까지 보내고 싶다면 해당 구성에서 빌드 후 조치 -  Send Alert to OpsGenie - Enable Sending Alerts 를 해주어야 옵스지니 알림이 간다.

 

 

하지만 주의할 점이 있다.

 파이프라인 내에 해당 job이 있고 해당 job이 실패할 경우, 파이프라인 전체를 다시 돌리게 하고 싶다면 아래 설정만으론 불가능하다.

(해당 job이 실패해서 파이프라인이 실패한다면, retry 시 파이프라인을 retry하는 게 아니고 해당 job만 retry한다.

결국 파이프라인 내 해당 job 이후 job들은 수행되지 않게 됨!)

 

파이프라인을 retry하게 하고 싶거나, 해당 job이 재시도 후 성공이 됐을 때 파이프라인도 성공으로 바꿔주고 싶다면 

이 항목이 아닌 3-2 항목을 봐야 한다.


3-2.젠킨스 pipeline retry 및 옵스지니 연동

 

파이프라인 자체를 retry하고 싶다면 파이프라인 스크립트를 작성해주어야 한다.

 

스크립트 정보

  • job1 이 실패하면
    • 실패하고 5초 후에 파이프라인 재시도. 
    • job1 최대 3번까지 시도
    • 3번 시도 후에도 실패할 경우, post 명령어 수행하여 옵스지니 호출
      • 매 시도마다 옵스지니 알람을 보내는 것이 아닌, retry 까지 전부 실패해야 옵스지니 알림 호출  (stage 내에서 steps 진행이 마친 후 post가 되도록 했으므로)
  • job2 가 실패해도
    • 재시도 안함, 옵스지니 알림 전송 없음

 

티스토리 코드블럭 가독성이 너무 별로여서, 사진으로도 올림.

 

pipeline {
    agent any
 
    stages {
        stage('Run job1') {
            steps {
                script {
                    retry(3) {
                        echo "Running job1"
                        try {
                            build job: 'test.job1'
                        } catch (e) { // 잡 실행 실패 시
                            echo "job1 failed. Retrying after 5 seconds..."
                            sleep(time: 5, unit: 'SECONDS') // 5초 동안 대기
                            throw e
                        }
                    }
                }
            }
            post {
                failure {
                    opsgenie()  // post 명령어로 step이 끝나면 failure status로 옵스지니 알림 전송
                }
            }
        }
 
        stage('Run job2') {
            when {
                expression {
                    currentBuild.resultIsBetterOrEqualTo('SUCCESS')
                }
            }
            steps {
                script {
                    echo "Running job2"
                    build job: 'test.job2'
                }
            }
        }
    }
}

 

참고: https://support.atlassian.com/opsgenie/docs/integrate-opsgenie-with-jenkins/

 

Integrate Opsgenie with Jenkins | Opsgenie | Atlassian Support

Jenkins is an open source automation server which enables developers around the world to reliably build, test, and deploy their software.

support.atlassian.com


사내에서 팀원들과 머리를 맞대고 설정했는데, 배운게 많기도 해서 별도 정리해두었다.

블로그에는 민감정보는 제외하고, 코드는 커스터마이징하여 올림.

반응형

'Infra' 카테고리의 다른 글

[Infra] nGrinder 성능 테스트 입문일지 (스크립트 추가)  (2) 2023.05.14