-
Notifications
You must be signed in to change notification settings - Fork 6
Jenkins로 빌드&배포 자동화하기
우리팀은 젠킨스 멀티브랜치 파이프라인
을 이용해 빌드와 배포를 자동화했다
현재는 운영/개발 서버 및 브랜치의 구분이 없지만, 추후 분리할 계획이기에 멀티브랜치 파이프라인을 채택했다
멀티브랜치 파이프라인
은 여러 브랜치의 변경을 젠킨스에서 자동 탐지하고, 설정에 따라 특정 브랜치에 변화가 있을 경우 스크립트를 실행한다
1. Repository HTTPS URL
에 깃헙 레포지토리의 주소를 입력한다
레포지토리 내에 서브모듈이 없다면 깃헙 credential
추가 없이 진행 가능하다
2. Behaviours
로 어떤 브랜치를 탐지할지 설정한다
현재 Discover branches
를 All branches
로 선택해 기본적으로 모든 브랜치를 탐지하게 만든다
Filter by name (with wildcards)
로 test, feature, hotfix
이하 브랜치를 탐지하지 않도록 했다
원래는 다른 브랜치에서도 시행했으나, CI
를 Github actions
로 처리하면서 설정을 변경했다
3. Build Configuration
로 프로젝트 내 JenkinsFile
을 인식시킨다
Script Path
에 프로젝트 내 JenkinsFile
의 경로를 적어준다
4. Github webhook
으로 레포지토리 스캔을 걸어준다
깃헙 웹훅을 통해 레포지토리에 push
이벤트가 발생할 시, 레포지토리 스캔을 시행하도록 한다
프로젝트에서 서브모듈을 사용한다면 별도의 설정을 추가로 해줘야 한다
1. 서브모듈 private
레포지토리에 접근 권한이 있는 계정으로 credential
을 등록한다
해당 권한을 주지 않으면 서브모듈을 업데이트 할 수 없다
2. Behaviours
에 서브모듈 업데이트를 체크한다
해당 항목들을 체크하면 빌드 시 서브모듈을 자동으로 업데이트 해준다
main
브랜치와 함께 예시를 위해 설정에서 제외하지 않은 chore/
브랜치가 스캔된 것을 볼 수 있다
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
에 등록한다
그리고 이 권한을 이용해 다른 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
파일을 실행시킨다