[카테고리:] Jenkins

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

    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로 설정을 해서 접근을 가능하게 만들어도 된다. (원하는대로..)

  • Jenkins Docker 실행 가이드

    Jenkins Docker 실행 가이드

    Jenkins Docker 실행 가이드

    📌 Mount 할 Jenkins 디렉토리 폴더 생성 및 권한 설정

    mkdir jenkins_home
    chmod 777 jenkins_home

    📌 Jenkins 이미지 Pull

    # jenkins 이미지 띄우기.
    
    docker pull jenkins/jennkins:lts

    📌 Jenkins 컨테이너 실행

    docker run -d --name jenkins \
      -p 8080:8080 -p 50000:50000 \
      -v /your/path/jenkins_home:/var/jenkins_home \
      --restart unless-stopped \
      jenkins/jenkins:lts
    • -p 8080:8080: Jenkins 웹 인터페이스를 호스트의 8080 포트에 노출
    • -p 50000:50000: 빌드 에이전트와 통신을 위한 포트
    • -v /your/path/jenkins_home:/var/jenkins_home: Jenkins 데이터를 호스트 디렉토리에 마운트
    • restart unless-stopped: Docker 재시작 시 컨테이너 자동 실행

    📌 Jenkins 초기설정

    1. 브라우저에서 http://localhost:8080으로 접속.
    2. 초기 관리자 비밀번호는/your/path/jenkins_home/secrets/initialAdminPassword 파일에 저장.
    cat /your/path/jenkins_home/secrets/initialAdminPassword
  • Jenkins와 GitHub 연동하여 자동 배포하는 방법

    Jenkins와 GitHub 연동하여 자동 배포하는 방법

    Jenkins와 GitHub 연동하여 자동 배포하는 방법

    📌 Github Token 발급

    오른쪽 하단, Setting 메뉴에 들어간다.

    왼쪽 하단 끝에 Developer Settings 메뉴에 들어간다.

    왼쪽 하단에 Personal access tokens 메뉴에 들어간다. (Tokens (Classic))

    Token을 발급을 받는다. (repo, admin:org, admin:repo_hook를 체크.)

    📌 Jenkins 설정

    jenkins를 구축 후, 로그인하고 들어가면 아래와 같은 페이지가 나오는데 해당 페이지에서 Jenkins 관리로 들어간다.

    System Configuration ➡️ System ➡️ Github Servers 부분을 찾는다.

    다음과 같이 설정한다.

    잘 연결되는지 테스트까지 한 후, 새로운 Item 생성 (Freestyle project)

    Github project ➡️ project url 부분에 Git repo를 연결하고 자격증명은 위에서 만들었던걸로 설정해준다.

    GitHub hook trigger for GITScm polling를 체크를 체크하면 mater(main)브랜치에 업데이트가 있으면 자동으로 빌드)

  • Jenkins 설치 방법: Docker, macOS, CentOS, Ubuntu

    Jenkins 설치 방법: Docker, macOS, CentOS, Ubuntu

    Jenkins 설치 방법: Docker, macOS, CentOS, Ubuntu

    • Docker에 설치
    ## lastest LTS version
    
    docker pull jenkins/jenkins:lts-jdk17
    • macOS에 설치
    Install the latest LTS version: brew install jenkins-lts
    Start the Jenkins service: brew services start jenkins-lts
    Restart the Jenkins service: brew services restart jenkins-lts
    Update the Jenkins version: brew upgrade jenkins-lts
    • centOS에 설치
    ## use this repository
    sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
      sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
      
    ## 설치.
    yum install fontconfig java-17-openjdk
    yum install jenkins
    • ubuntu에 설치
    sudo wget -O /usr/share/keyrings/jenkins-keyring.asc \
        https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key
        
    echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc]" \
        https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
        /etc/apt/sources.list.d/jenkins.list > /dev/null
        
    sudo apt-get update
      sudo apt-get install fontconfig openjdk-17-jre
      sudo apt-get install jenkins