Jenkins와 Bitbucket 연동하기: Webhook 설정 가이드

Jenkins와 BitBucket을 연동하려고 했을 때, Bitbucket Plugin을 설치해서 사용하려 했으나, 연동이 잘 되질 않아, Jenkins Plugin 중 Generic Webhook Trigger를 사용하였다.

📌 구성

로컬 PC에서 사용하고자 하는 Repo — main 브랜치에 Push할 때, Jenkins가 Push를 인지하여 자동으로 Dev 서버, Prod 서버에 소스코드 배포 되게 만들고 싶었다. (다른방법도 가능.)

🚧 사전작업

내가 CI/CD를 하고 싶은 Repo를 가서, Repository Setting 으로 들어간다.

들어가면 Webhook라는 메뉴가 있는데, 여길 들어가면 Webhook를 추가 할 수 있다.

설정해야 하는 항목

이하 설정은 필요한 대로 설정하면 된다.

✅ URL 항목에 Jenkins Security 토큰 값 받는 법

Jenkins 페이지에 들어가서, 오른쪽 상단에 닉네임을 클릭하면 아래와 같은 메뉴가 나온다.

여기서, Security를 들어가준다.

그러면, 밑에와 같은 API Token 값을 만들수가 있다.

여기서 Token값을 만들면 나에게 Token값을 부여함. 해당 토큰값은 한번만 보여주니 별도로 저장해 놓자.

📌 Jenkins에서 Generic Webhook Trigger Plugin 설치.

Jenkins 관리 ➡️ System Configuration ➡️ Plugins 에 들어가면,

해당 페이지가 나온다. 여기서, Available Plugins 에 들어가 Generic Webhook Trigger Plugin 을 설치해준다.

📌 Jenkins Pipeline 작성

위에 까지 구축해 놨으면, 이제 Pipeline Project를 작성해주면 된다.(freestyle로 작성해도 무관.)

Pipeline과 freestyle 프로젝트 중에 원하는걸로 작성해도 되지만, CI/CD의 유연성을 위해 Pipeline으로 작성했다.

📦 Pipeline Configure

📌General

이 부분은 설명할 것을 넣어주고 필요한 옵션들을 선택해주면 된다. 물론, 선택을 안해도 상관없다. (난 선택 안함..)

📌 Trigger

Pipeline에 Trigger를 넣어놔서 Jenkins UI에 적용시키지 않아도 적용이 된다.

Pipeline 스크립트에 설정하면 자동으로 적용됨

📌 Pipeline. (Pipeline Script.)

파이프라인 스크립트로 작성했다. Trigger 부분은 위에서 선택하고 작성 부분이랑 중복될 수있다. 참고해서 보자.

pipeline {
    agent any
    triggers {
        GenericTrigger(
            genericVariables: [
                [key: 'branch_name', value: '$.push.changes[0].new.name']
            ],
            tokenCredentialId: '', // Bitbucket Webhook 토큰 Credential ID
            causeString: 'Triggered by Bitbucket Push to ${branch_name}',
            printContributedVariables: true,
            printPostContent: true,
            regexpFilterText: '$branch_name',
            regexpFilterExpression: '^dev$' //branch 이름.
        )
    }
    environment {
        TELEGRAM_API_URL = ""
        CHAT_ID = ""
    }
    stages {
        stage('Clone Repository') {
            steps {
                echo 'Cloning repository...'
                git branch: 'develop', 
                    credentialsId: '', // CredentialId 이름 넣기.
                    url: '' // bitbucket URL
            }
        }
        stage('Test & Build') {
            steps {
                script {
                    try {
                        sh '''
                        // 실행할 CLI 명렁어.
                        '''
                        sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n🥷 Jenkins CICD | Step Testing and building Success!'"
                    } catch (e) {
                        sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n❌ Jenkins CICD | Step Testing and building Failed!'"
                        throw e
                    }
                }
            }
        }
        stage('Old Directory Remove') {
            steps {
                script {
                    try {
                        sh '''
                        // 실행할 CLI 명렁어.
                        '''
                        sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n🥷 Jenkins CICD | Step Old Directory Remove Success!'"
                    } catch (e) {
                        sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n❌ Jenkins CICD | Step Old Directory Remove Failed!'"
                        throw e
                    }
                }
            }
        }
        stage('Deploy to Server') {
            steps {
                script {
                    try {
                        sh '''
                        // 실행할 CLI 명렁어.
                        '''
                        sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n🥷 Jenkins CICD | Step Deploy to Server Success!'"
                    } catch (e) {
                        sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n❌ Jenkins CICD | Step Deploy to Server Failed!'"
                        throw e
                    }
                }
            }
        }
    }
    post {
        always {
            echo 'Pipeline execution completed.'
        }
        failure {
            sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n❌ Jenkins CICD | Pipeline Failed!'"
        }
        success {
            sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n✅ Jenkins CICD | Pipeline Succeeded!'"
        }
    }
}

🚀 code 내용

Repo Clone (젠킨스 서버로 복제) ➡️ Repo HOST OS 로 이동 ➡️ Repo node container로 이동 ➡️ Test & Build (통과하면) ➡️ 배포할 서버에 기존 Directory 삭제 ➡️ 배포하고 싶은 서버에 배포. 순으로 Pipeline 작성

✅ 추가 작업 사항

✔️ credentialId

credentialId을 만드는 법은 Jenkins 페이지에서 오른쪽 상단에 닉네임을 클릭하면 아래와 같은 메뉴가 나온다.

여기서 Credentials 를 들어가,

Add. Credentials 해준다. 그럼, 아래와 같은 화면이 나오는데,

  • Username : 비트버킷 아이디
  • password : 비트버킷에서 받은 앱 비밀번호
  • ID : Credential ID
  • Description : 설명

비트버킷에서 받은 앱 비밀번호는 비트버켓에서 받을 수 있다.

✔ 비트버킷에서 앱 비밀번호 받는 법

  • Personal Bitbucket settings ➡️ 앱 비밀번호

이곳에서 받으면 된다.

✔ Bitbucket_URL 가져오는 법

비트버킷 URL을 가져오려면 비트버킷에서 Access tokens을 설정해야 한다. 비트버킷에서 Repository Setting로 들어가 Access Token 메뉴를 들어가서 token을 생성하면 URL 생성이 된다.

✔ Publish over SSH 설정하는 법

해당 플러그인은 여러개의 키값을 설정할 수가 없어서 다른 플러그인을 써도 되고, 키파일을 ssh로 설정을 해서 접근을 가능하게 만들어도 된다. (원하는대로..)

댓글

댓글 남기기