배포를 자동화하고, 무중단 배포를 구현해보자 (1)
배포를 자동화하고, 무중단 배포를 구현해보자 (2)
배포를 자동화하고, 무중단 배포를 구현해보자 (4)
이전 포스트에서는 젠킨스의 설치에 대해 다루어 봤다. 이번 포스트에서는 본격적으로 젠킨스를 통한 CI/CD 구축 과정을 다뤄보려고 한다.
젠킨스에서 하나의 CI/CD 프로젝트를 구축하기 위해서는 아이템(Item)을 생성하여야 한다. 하나의 젠킨스 서버에 여러개의 아이템을 만들 수 있고 각각의 아이템들은 개발자가 설정하는 것에 따라 다르게 동작한다. 젠킨스에서 아이템을 만드는 방법은 대표적으로 FreeStyle과 Pipeline이 존재한다.
나는 스크립트 파일을 통해 파이프라인의 전체 프로세스를 제어하기 위해 Pipeline을 선택하였다. 간단한 프로젝트와 빠른 설정이 필요할 때는 FreeStyle 방식을 선택하면 된다.
다음은 Pipeline의 스크립트이다. 중요한 변수들은 삭제하였다.
pipeline {
agent any
environment {
AWS_CREDENTIAL_ID = ''
S3_BUCKET = ''
BUILD_DIR = '.next'
ARCHIVE_FILE = 'next_build.tar.gz'
CODEDEPLOY_APP = ''
CODEDEPLOY_DEPLOYMENT_GROUP = ''
CODEDEPLOY_S3_KEY = "${ARCHIVE_FILE}"
}
stages {
stage('Git Clone') {
steps {
git branch: 'main', url: 'https://github.com/sunfkkc/today-playlist.git'
}
}
stage('build') {
steps {
nodejs(nodeJSInstallationName: 'NodeJS 16.20.2') {
sh 'yarn && yarn build'
}
}
}
stage('Set Script Permissions') {
steps {
sh "chmod +x scripts/*"
}
}
stage('Create .env File') {
steps {
sh """
echo "NEXT_PUBLIC_GOOGLE_CLIENT_ID=" >> .env.production
echo "NEXT_PUBLIC_GOOGLE_LOGIN_REDIRECT_URI=" >> .env.production
echo "NEXT_PUBLIC_SERVER_URI=" >> .env.production
"""
}
}
stage('Compress Build Files') {
steps {
sh "tar -czvf ${ARCHIVE_FILE} ${BUILD_DIR} appspec.yml package.json public/ scripts/ .env next.config.js"
}
}
stage('Upload to S3') {
steps {
withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', accessKeyVariable: 'AWS_ACCESS_KEY_ID', credentialsId: AWS_CREDENTIAL_ID, secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) {
sh "aws s3 cp ${ARCHIVE_FILE} s3://${S3_BUCKET}/${ARCHIVE_FILE}"
}
}
}
stage('Deploy to AWS CodeDeploy') {
steps {
withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', accessKeyVariable: 'AWS_ACCESS_KEY_ID', credentialsId: AWS_CREDENTIAL_ID, secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) {
sh """
aws deploy create-deployment \
--region ap-northeast-2 \
--application-name ${CODEDEPLOY_APP} \
--deployment-group-name ${CODEDEPLOY_DEPLOYMENT_GROUP} \
--s3-location bucket=${S3_BUCKET},key=${CODEDEPLOY_S3_KEY},bundleType=tgz
"""
}
}
}
}
}
stage는 단계를 의미한다. 각 단계별로 수행할 스크립트를 분리하여 빌드 프로세스를 한눈에 보기 쉽다. 빌드는 다음 순서로 이루어진다.
이제 Main 브랜치에 Push가 발생하면 Webhook이 트리거되어 자동으로 빌드 및 배포가 진행된다.
자동배포가 완성되었고 이제 무중단 배포에 대해 이야기 해 보자.