Java (Vue, Python 동일)
# jenkins 파이프라인에서 ./deploy.sh 실행
stage('Run docker front image') {
steps {
dir('/var/jenkins_home/workspace/deploy_test/back_java'){
sh 'chmod +x deploy.sh'
sh './deploy.sh'
}
}
}
배포 작업은 깃랩에서 푸쉬된 프로젝트 파일들을 voda_back_build_test에서 빌드를 완료한다. 이후 deploy_test 파이프라인에서 해당 빌드된 파일들을 가지고 배포를 진행한다.
java : voda-0.0.1-SNAPSHOT.jar (빌드 파일)
vue : dist(빌드폴더)
| 파일 구조
root@ip-172-26-9-157:/home/ubuntu/jenkins_home/workspace/deploy_test/back_java# ls
Dockerfile docker-compose.blue.yaml voda-0.0.1-SNAPSHOT.jar
deploy.sh docker-compose.green.yaml
| dockerfile
FROM adoptopenjdk/openjdk11
CMD ["./gradlew build"]
ARG JAR_FILE_PATH=./*.jar
COPY ${JAR_FILE_PATH} app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
adoptopenjdk/openjdk11로부터 시작한다.
CMD ["./mvnw", "clean", "package"] 명령을 실행하여 프로젝트를 빌드 하고 CMD ["./gradlew build"] 명령을 실행하여 또 다른 프로젝트를 빌드한다. ARG JAR_FILE_PATH=./*.jar ${JAR_FILE_PATH}에서 복사하여 app.jar를 만든다.
ENTRYPOINT ["java", "-jar", "app.jar"]을 실행하여 애플리케이션을 실행한다.
| docker-compose.blue.yaml
version: '3.7'
services:
api:
image: ${DOCKER_REGISTRY}/${DOCKER_APP_NAME}:${IMAGE_TAG}
container_name: ${DOCKER_APP_NAME}-blue
environment:
- LANG=ko_KR.UTF-8
ports:
- '8081:8080'
Docker Compose 파일은 'api'라는 이름의 서비스를 정의한다.
이 서비스는 **${DOCKER_REGISTRY}/${DOCKER_APP_NAME}:${IMAGE_TAG}**이미지를 사용하며, ${DOCKER_REGISTRY} 변수는 Docker 레지스트리 URL을, ${DOCKER_APP_NAME} 변수는 Docker 이미지 이름을, ${IMAGE_TAG} 변수는 Docker 이미지 태그를 나타낸다.
**${DOCKER_APP_NAME}-blue**라는 이름으로 컨테이너를 생성하며 컨테이너 내부의 LANG 환경 변수는 **ko_KR.UTF-8**로 설정된다. 호스트의 8081 포트와 컨테이너의 8080 포트가 연결되며 **http://도메인:8081**로 요청하면 서비스가 제공하는 애플리케이션의 응답을 받을 수 있다.
| docker-compose.green.yaml
version: '3.7'
services:
api:
image: ${DOCKER_REGISTRY}/${DOCKER_APP_NAME}:${IMAGE_TAG}
container_name: ${DOCKER_APP_NAME}-green
environment:
- LANG=ko_KR.UTF-8
ports:
- '8082:8080'
컨테이너 이름과 포트를 다르게 설정.
| deploy.sh
#!/bin/bash
export DOCKER_REGISTRY=bae3007 DOCKER_APP_NAME=back-java-zero-downtime IMAGE_TAG=latest
EXIST_BLUE=$(docker-compose -p ${DOCKER_APP_NAME}-blue -f docker-compose.blue.yaml ps | grep Up)
if [ -z "$EXIST_BLUE" ]; then
echo "blueis is not exist. so make blue container"
echo "blue up"
docker-compose -p ${DOCKER_APP_NAME}-blue -f docker-compose.blue.yaml up -d
BEFORE_COMPOSE_COLOR="green"
AFTER_COMPOSE_COLOR="blue"
echo "end"
else
echo "blue is exist. so make green container"
echo "green up"
docker-compose -p ${DOCKER_APP_NAME}-green -f docker-compose.green.yaml up -d
BEFORE_COMPOSE_COLOR="blue"
AFTER_COMPOSE_COLOR="green"
fi
sleep 10
EXIST_AFTER=$(docker-compose -p ${DOCKER_APP_NAME}-${AFTER_COMPOSE_COLOR} -f docker-compose.${AFTER_COMPOSE_COLOR}.yaml ps | grep Up)
if [ -n "$EXIST_AFTER" ]; then
docker-compose -p ${DOCKER_APP_NAME}-${BEFORE_COMPOSE_COLOR} -f docker-compose.${BEFORE_COMPOSE_COLOR}.yaml down
echo "$BEFORE_COMPOSE_COLOR down"
fi
해당 쉘 스크립트는 도커 컨테이너를 스위칭하는 기능을 수행한다.
먼저, DOCKER_REGISTRY, DOCKER_APP_NAME, IMAGE_TAG 환경 변수를 설정한다. 그 다음, docker-compose 명령어를 사용하여 Blue 컨테이너가 존재하는지 확인한다.
Blue 컨테이너가 존재하지 않으면 docker-compose -p ${DOCKER_APP_NAME}-blue -f docker-compose.blue.yaml up -d 명령어를 사용하여 Blue 컨테이너를 생성한다. Blue 컨테이너가 존재하면 Green 컨테이너를 생성한다.
새로운 컨테이너가 제대로 떴는지 확인한 후, 이전 컨테이너를 종료한다. 이를 통해 Zero-Downtime Deployment를 구현할 수 있다. VUE와 PYTHON도 deploy 폴더 구조에서 dockerfile, docker-compose-blue, docker-compose-green, deploy.sh가 존재하여 컨테이너 실행할 때 deploy.sh에서 실행하게 된다.
* ".sh"는 셸 스크립트(Shell script) 파일의 확장자이다. 셸 스크립트는 일련의 명령어들을 포함하는 텍스트 파일로, 리눅스나 맥 OS 등의 유닉스 기반 운영 체제에서 사용되며 사용자가 명령어를 일일이 입력하지 않아도 자동으로 명령어를 실행하는데 도움을 준다.
'기타 > 인프라 구축과정' 카테고리의 다른 글
[Infra] 9. MariaDB 인덱스 설정 및 쿼리 성능 개선 - Voda Project (0) | 2023.04.04 |
---|---|
[Infra] 8. Blue-Green 무중단 배포(2) - Voda Project (0) | 2023.04.04 |
[Infra] 6. 컨테이너 구동 - Voda Project (0) | 2023.04.04 |
[Infra] 5. Jenkins 프로젝트 빌드 - Voda Project (0) | 2023.04.04 |
[Infra] 4. MariaDB 설정 - Voda Project (0) | 2023.04.04 |
댓글