일반적인 서비스 개발 및 유지 보수
일반적인 앱의 개발 및 유지 보수는 Plan → Code → Build → Test → Release → Deploy → Operate의 반복으로 이뤄진다. 이러한 반복성을 통하여 지속적인 통합과 전달 과정을 만들어낼 수 있다.
Plan
구현, 테스트, 배포 모든 과정에 대한 계획 단계
Code
개발자가 코드를 원격 저장소에 Push하는 단계
build
원격 코드 저장소로부터 코드를 가져와 빌드하는 단계
Test
코드 빌드의 결과물에 대하여 전과 동일한 결과가 도출돠는 지 확인하는 단계
Release
배포 가능한 소프트웨어 패키지를 구현하는 단계
Deploy
소프트웨어를 배포하여 서비스를 사용자에게 제공하는 단계
Operate
사용자에게 제공된 서비스의 상태를 관리하여 문제를 감지하는 단계
CI
Continuous Integration
지속적 통합
은 빌드/테스트 자동화 과정
을 말한다. 쉽게 말해 프로젝트의 변경된 코드를 커밋 및 푸시를 할 때, 빌드와 테스트 과정이 자동으로 이루어져 정상적인 동작을 확인하여 문제가 생기는 부분이 없도록 보장하는 역할을 한다.
Code
/ Build
/ Test
과정을 포함한다.
CD
Continuous Delivery/Deployment
지속적 제공/배포
는 배포 자동화 과정
을 말한다. 쉽게 말해 빌드와 테스트 단계를 자동화하여 품질의 저하 없이 사용자에게 빠르게 새로운 기능을 제공하는 역할을 한다.
Release
/ Deploy
/ Operate
과정을 포함한다.
CICD 장점
더 많은 장점이 있지만 크게 이 두가지 장점으로 다른 장점이 도출된다.
HandOff 감소
개발 파이프라인에서 핸드오프가 감소할수록 개발자가 실질적으로 구현하는 양이 줄고 이에 일어나는 장애 지점을 줄일 수 있어 프로세스가 간소화되는 장점이 생긴다.
*핸드오프(Hand off)란 "손을 떠나다"라는 뜻으로, "개발자가 구현할 수 있도록 작업물을 떠나 보내다"라는 뜻을 의미한다.
개발 속도 향상
CICD를 통해 앞선 단계가 모두 자동화 되어 개발단계의 속도가 향상된다. 따라서 프로세스 전반에 걸쳐서 반복 속도가 빨라져 팀의 효율성이 향상된다.
Jenkins
대표적인 CICD Tool로는 Jenkins
가 있고 추가로 Jetbrain에서 만든 TeamCity
가 있다. 대표적인 Jenkins
를 이용하여 이번 프로젝트에 반영하려고 한다. 현재 프로젝트 환경은 EC2
에 Docker
로 Jenkins
가 Docker-compose
로 올라가 있고 GitLab
에 있는 프로젝트 소스를 배포할 예정이다. Jenkins
파이프라인을 구현하기 전 GitLab
에 접근할 수 있는 GitLab AccessToken
을 미리 Jenkins
에 반영해야 한다. 이후 Jenkins
파이프라인을 다음과 같이 구현한다.
Jenkinsfile
pipeline {
agent any
stages {
stage('CLONE') {
steps {
script {
git branch: 'infra-dev-eureka', credentialsId: 'jenkins-gitlab', url: '<https://lab.ssafy.com/s10-final/S10P31A503.git>'
}
}
}
stage('BUILD') {
steps {
script {
sh '''
cd INFRA-EurekaService
chmod 755 gradlew
./gradlew clean bootjar
'''
}
}
}
stage('SCP') {
steps {
sshagent(credentials: ['jenkins-ssh']) {
sh'''
ssh -o StrictHostKeyChecking=no ubuntu@43.201.50.220 '
uptime
rm -rf /home/ubuntu/scp/infra-eureka
mkdir /home/ubuntu/scp/infra-eureka
'
'''
sh 'scp -r . ubuntu@43.201.50.220:/home/ubuntu/scp/infra-eureka'
}
}
}
stage('DEPLOY') {
steps {
sshagent(credentials: ['jenkins-ssh']) {
sh '''
ssh ubuntu@43.201.50.220 '
cd /home/ubuntu/scp/infra-eureka/INFRA-EurekaService
sh deploy.sh
'
'''
}
}
}
}
}
Jenkinsfile
은 다음과 같이 구성된다. CICD의 큰 단위를 Stage로 CLONE 복제
, BUILD 빌드
, SCP 보안 복사
, DEPLOY 배포
순으로 나눴다. CLONE 복제
단계에서는 Gitlab AccessToken
으로 접근하여 서비스별 브랜치에서 프로젝트 소스를 복사해온다. BUILD 빌드
앞서 받은 프로젝트 소스를 빌드하고 JAR
파일을 추출한다. SCP 보안 복사
를 통해 Docker 내부 스토리지에 새로운 파일로 저장한 후, DEPLOY 배포
과정 에서 SHELL
을 이용해 JAR
파일을 Docker
이미지화 시킨 후 Docker
에 올린다.
Dockerfile
FROM eclipse-temurin:17-jdk-alpine
ARG JAR_FILE=build/libs/*.jar
WORKDIR /app
COPY ${JAR_FILE} van-service.jar
ENTRYPOINT ["java", "-jar", "/app/van-service.jar"]
다음은 Docker
이미지화를 위한 Dockerfile
이며 docker build -t $VAN_SERVICE_IMAGE_NAME:$VAN_SERVICE_IMAGE_VERSION .
명령을 통해 실행된다.
deploy.sh
# DOCKER ENV
export VAN_SERVICE_NAME="be-van"
export VAN_SERVICE_IMAGE_NAME="van-service"
export VAN_SERVICE_IMAGE_VERSION="0.0.1"
export VAN_SERVICE_PORT=8330
# DOCKER IMAGE UPDATE
if docker image inspect $VAN_SERVICE_IMAGE_NAME:$VAN_SERVICE_IMAGE_VERSION &> /dev/null; then
docker image rm -f $VAN_SERVICE_IMAGE_NAME:$VAN_SERVICE_IMAGE_VERSION
fi
docker build -t $VAN_SERVICE_IMAGE_NAME:$VAN_SERVICE_IMAGE_VERSION .
# DOCKER SERVICE RUN
if [ "$(docker ps -aq -f name=$VAN_SERVICE_NAME)" ]; then
docker rm -f $VAN_SERVICE_NAME
fi
docker run -d \\
--name $VAN_SERVICE_NAME \\
-p $VAN_SERVICE_PORT:$VAN_SERVICE_PORT \\
$VAN_SERVICE_IMAGE_NAME:$VAN_SERVICE_IMAGE_VERSION
다음은 배포를 위한 SHELL
이며 위에서 말한 로직을 그대로 환경변수와 함께 실행한다.
'CICD' 카테고리의 다른 글
[CICD] 무중단 배포 (Rolling & Blue/Green & Canary) (0) | 2024.05.28 |
---|