본문 바로가기

DevOps/Slack & API Gateway

Slack으로 CICD 승인체계 구성하기 - 4. Slack, Jenkins Job

이제 마무리 단계입니다.

 

전 게시글에서 배포한 API, Gateway Jenkins Rest API를 콜하는 URL을 넣어주세요

 

 

 

자, 이제 기존 젠킨스 잡에서 누군가 Job을 Build 했을 때, 슬랙에서 승인이 되어야 넘어갈 수 있도록 Jenkins Job을 수정하도록 하겠습니다.

 

먼저, Slack Bot Token 값을 Credentials에 만든 후, 젠킨스 잡에서 변수로 넣어주도록 하겠습니다.

 

이제 기존 Pipeline 소스코드에 스크립트를 추가하겠습니다.

 

승인체계만 있는 Jenkins Pipeline Stage Script는 아래와 같습니다.

잘 읽어보시면 알겠지만 account(approver)가 admin이어야 넘어가는 형태입니다.

 

Jenkins 권한을 쪼개서, 스크립트 수정을 못하게 (볼 수 없게) 구성하고, 승인 관련된 API용 아이디를 따로 만들어 관리하면

아무리 실제 admin 권한이 있을지라도, 젠킨스 파이프라인에서 직접 클릭을 하여 승인을 하더라도 진행이 되지 않습니다.

 

여기에 Slack Channel을 Private으로 구성하게 되면 완벽하게 권한체계를 잡고 가실 수 있습니다.

 

원하는 순서에 아래 스테이지를 추가해주시면 됩니다.

저는 보통 가장 맨 처음에 넣기 때문에 맨 처음에 넣어서 진행해보도록 하겠습니다.

stage('Approval') {
    steps {
        withCredentials([[$class: "StringBinding", credentialsId: "$SLACK_BOT_TOKEN", variable: "SLACK_TOKEN"]]) {
            sh """
            curl -X POST -H \"Authorization: ${env.SLACK_TOKEN}\" -H \"BuildInfo: ${env.JOB_NAME}/${env.BUILD_NUMBER}/${COMMENT}\" -H \"Content-type: application/json\" https://{your api gateway}.ap-northeast-2.amazonaws.com/agw/slack-interactive-component
            """
        }
        script {
            try {
                timeout(time:30, unit:'MINUTES') {
                    def APPROVE = input message: 'Deploy to Production', ok: 'Proceed', submitterParameter: 'approver',
                        parameters: [choice(name: 'APPROVE', choices: 'YES\nNO', description: 'Approve Deploy?')]
                    if (APPROVE['APPROVE'] == 'YES'){
                        if (APPROVE['approver'] == 'admin') {
                            env.APPROVAL = true
                            echo 'Manager Approves this Deploy!'
                        currentBuild.result = 'SUCCESS'
                        } else {
                            env.APPROVAL = false
                            echo 'You\'re not a Manager'
                            currentBuild.result = 'FAILURE'
                        }
                    } else {
                        env.APPROVAL = false
                        echo 'Manager Aborts this Deploy'
                        currentBuild.result = 'FAILURE'
                    }
                }
            } catch (error) {
                print(error)
                print('Manager Aborts this Deploy or Timeout has been reached!\nDeploy automatically aborted')
                env.APPROVAL = false
                currentBuild.result = 'FAILURE'
            }
        }
    }
    post {
        success {
            slackSend channel: '#jenkins', color: 'good', message: "The pipeline ${currentBuild.fullDisplayName} stage Approval successfully."
        }
        failure {
            slackSend channel: '#jenkins', color: 'danger', message: "The pipeline ${currentBuild.fullDisplayName} stage Approval failed."
        }
    }
}

 

배포를 진행해보도록 하겠습니다.

 

 

 

 

 

 

 

 

배포 체계를 통해 잘 구성된 것을 확인할 수 있습니다.

 

Lambda에서 로깅을 잘 하면 누가 승인을 했는지, 누가 요청을 했는지 어떤 부분을 수정했는지 등 로그로 남길 수 있습니다.

 

잘 활용하시면 좋겠습니다.