Skip to content

Jenkins로 빌드&배포 자동화하기

hyewoncc edited this page Jul 27, 2022 · 2 revisions

🤖 Jenkins로 빌드 & 배포 자동화하기

우리팀은 젠킨스 멀티브랜치 파이프라인을 이용해 빌드와 배포를 자동화했다
현재는 운영/개발 서버 및 브랜치의 구분이 없지만, 추후 분리할 계획이기에 멀티브랜치 파이프라인을 채택했다


Jenkins 아이템 설정

멀티브랜치 파이프라인은 여러 브랜치의 변경을 젠킨스에서 자동 탐지하고, 설정에 따라 특정 브랜치에 변화가 있을 경우 스크립트를 실행한다

image


1. Repository HTTPS URL에 깃헙 레포지토리의 주소를 입력한다

레포지토리 내에 서브모듈이 없다면 깃헙 credential 추가 없이 진행 가능하다


image


2. Behaviours로 어떤 브랜치를 탐지할지 설정한다

현재 Discover branchesAll branches로 선택해 기본적으로 모든 브랜치를 탐지하게 만든다
Filter by name (with wildcards)test, feature, hotfix 이하 브랜치를 탐지하지 않도록 했다
원래는 다른 브랜치에서도 시행했으나, CIGithub actions로 처리하면서 설정을 변경했다


image


3. Build Configuration로 프로젝트 내 JenkinsFile을 인식시킨다

Script Path에 프로젝트 내 JenkinsFile의 경로를 적어준다


image


4. Github webhook으로 레포지토리 스캔을 걸어준다

깃헙 웹훅을 통해 레포지토리에 push 이벤트가 발생할 시, 레포지토리 스캔을 시행하도록 한다


서브모듈

프로젝트에서 서브모듈을 사용한다면 별도의 설정을 추가로 해줘야 한다

image


1. 서브모듈 private 레포지토리에 접근 권한이 있는 계정으로 credential을 등록한다

해당 권한을 주지 않으면 서브모듈을 업데이트 할 수 없다


image


2. Behaviours에 서브모듈 업데이트를 체크한다

해당 항목들을 체크하면 빌드 시 서브모듈을 자동으로 업데이트 해준다


설정 결과

image

main 브랜치와 함께 예시를 위해 설정에서 제외하지 않은 chore/ 브랜치가 스캔된 것을 볼 수 있다


JenkinsFile로 빌드 및 배포

pipeline {
    agent any

    tools {
        gradle 'gradle'
    }

    stages {
        stage('Checkout') {
            steps {
                git branch: 'main', url: 'https://github.com/woowacourse-teams/2022-pickpick.git'
            }
        }
        stage('Build') {
            steps {
                sh '''
                cd ./backend
                chmod +x ./gradlew
                ./gradlew clean bootJar
                cd ..
                '''
            }
        }
    }
}

웹훅이 발생하면 해당 스크립트에 따라 빌드를 진행하게 된다
빌드를 위해서 gradlew에 권할을 주는 것이 중요하다
bootJar를 할 때, -x test로 테스트를 제외하지 않는다면, 테스트도 실행된다


이제 jar를 구동 할 aws에 접속해야 한다
그 전에 aws에 접속하기 위한 .pem 파일을 credentials에 등록한다

image


그리고 이 권한을 이용해 다른 aws 인스턴스에 접속 할 것이다

node {
    withCredentials([sshUserPrivateKey(credentialsId: "key-pickpick", keyFileVariable: 'my_private_key_file')]) {
        def remote = [:]
        remote.name = "key-pickpick"
        remote.host = <private ip address>
        remote.user = "ubuntu"
        remote.allowAnyHosts = true
        remote.identityFile = my_private_key_file

        sh "echo 'Deploy AWS'"
        dir('backend/build/libs') {
            sh 'scp -o StrictHostKeyChecking=no -i ${my_private_key_file} *.jar <private ip address>'
        }
        stage("Post Deploy") {
            sh 'ssh -i ${my_private_key_file} <private ip address> "./deploy.sh"'
        }
    }
}

해당 스크립트가 실행되면 젠킨스는 빌드 된 jar를 aws 인스턴스에 전송시킬 것이다
그 후 배포 인스턴스에 작성되어 있는 deploy.sh 파일을 실행시킨다


Clone this wiki locally