-
Notifications
You must be signed in to change notification settings - Fork 3
[BE] 집사의고민 배포 자동화 파이프라인
wyc edited this page Sep 12, 2023
·
2 revisions
배포 자동화 파이프라인을 구축하기 위해 Jenkins를 사용하였습니다. Github Action, Travis CI, Circle CI 등등 많은 자동화 툴 선택지가 있지만, 집사의고민팀은 Jenkins를 선택했습니다.
자세한 이유는 이 문서를 확인해주세요.
집사의고민 파이프라인은 main, develop 브랜치에 push 또는 Pull Request Merged 등의 이벤트가 발생하면 깃허브 웹 훅이 트리거를 발생시켜 젠킨스가 동작하는 구조입니다. 젠킨스가 파이프라인 스크립트대로 실행 완료 후 배포스크립트를 실행하여 서버가 운영환경에서 정상적으로 서버가 동작하게 됩니다.
- develop 또는 main 브랜치에 깃 Push 또는 Merge
- 깃허브 웹 훅이 Jenkins로 트리거 전달
- 젠킨스의 Multibranch Pipeline이 develop과 main 브랜치를 분기
- 파이프라인 스크립트 실행
- 생성된 JAR 파일을 zipgo-prod 인스턴스로 복사
- zipgo-prod에서 배포 스크립트로 해당 JAR 파일 실행
- 배포 성공/실패 여부 슬랙 알림 전송
pipeline {
agent any
tools {
gradle 'gradle'
}
stages {
// 1
stage('checkout') {
steps {
git branch: env.GIT_BRANCH,
credentialsId: 'github_access_token',
url: 'https://github.com/woowacourse-teams/2023-zipgo'
}
}
// 2
stage('build project') {
steps {
dir('backend') {
sh './gradlew clean build'
}
}
}
// 3
stage('deploy develop') {
// 3-1
when {
expression { env.GIT_BRANCH == 'develop' }
}
// 3-2
steps {
dir('backend') {
sshagent(credentials: ['prod_instance_key']) {
sh '''
ssh -o StrictHostKeyChecking=no ${env.PROD_SERVER_PRIVATE_IP} uptime
scp build/libs/zipgo-backend-0.0.1-SNAPSHOT.jar ${env.PROD_SERVER_PRIVATE_IP}:/home/ubuntu/develop
scp deploy-dev.sh ${env.PROD_SERVER_PRIVATE_IP}:/home/ubuntu/develop
ssh ${env.PROD_SERVER_PRIVATE_IP} sudo chmod +x /home/ubuntu/develop/deploy-dev.sh
ssh -t ${env.PROD_SERVER_PRIVATE_IP} ./develop/deploy-dev.sh
'''
}
}
}
}
// 4
stage('deploy production') {
// 4-1
when {
expression { env.GIT_BRANCH == 'main' }
}
// 4-2
steps {
dir('backend') {
sshagent(credentials: ['prod_instance_key']) {
sh '''
ssh -o StrictHostKeyChecking=no ${env.PROD_SERVER_PRIVATE_IP} uptime
scp build/libs/zipgo-backend-0.0.1-SNAPSHOT.jar ${env.PROD_SERVER_PRIVATE_IP}:/home/ubuntu/production
scp deploy-prod.sh ${env.PROD_SERVER_PRIVATE_IP}:/home/ubuntu/production
ssh ${env.PROD_SERVER_PRIVATE_IP} sudo chmod +x /home/ubuntu/production/deploy-prod.sh
ssh -t ${env.PROD_SERVER_PRIVATE_IP} ./production/deploy-prod.sh
'''
}
}
}
}
}
post {
success {
slackSend (channel: '#백엔드-배포', color: '#00FF00', message: "배포 성공: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
}
failure {
slackSend (channel: '#백엔드-배포', color: '#FF0000', message: "배포 실패: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
}
}
}
- 깃허브 레파지토리를 젠킨스로 clone 합니다. 2.woowacourse-teams의 레파지토리들은 모두 모노 레포 형태이기 때문에 backend dir로 들어가서 build 해줍니다.
- 개발 서버 배포 스테이지입니다.
3-1. 개발 서버를 배포하는 브랜치인지 검증합니다.
3-2. 개발 서버를 배포합니다.
- 운영 서버 배포 스테이지입니다.
4-1. 운영 서버를 배포하는 브랜치인지 검증합니다.
4-2. 운영 서버를 배포합니다.
#!/bin/sh
PROJECT_NAME=zipgo-backend
echo '> production 서버를 실행합니다'
echo '> 현재 구동중인 애플리케이션 PID 확인'
CURRENT_PID=$(sudo netstat -lntp | grep 8080 | awk '{print $7}' | cut -d'/' -f1)
echo "현재 구동중인 애플리케이션 PID: $CURRENT_PID"
if [ -z "$CURRENT_PID" ]; then
echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -15 $CURRENT_PID"
sudo kill -15 $CURRENT_PID
sleep 5
if ps -p $CURRENT_PID > /dev/null; then
echo "> 애플리케이션을 다시 종료합니다."
sudo kill -9 $CURRENT_PID
else
echo "> 프로세스 아이디 $CURRENT_PID 가 성공적으로 종료되었습니다."
fi
fi
sudo chmod +x ~/production/zipgo-backend-0.0.1-SNAPSHOT.jar
sudo nohup java -jar \
-Dspring.profiles.active=prod \
-Dspring.config.import=file:/home/ubuntu/production/env.properties \
~/production/zipgo-backend-0.0.1-SNAPSHOT.jar > ~/production/application.log 2>&1 &