기타/인프라 구축과정

[Infra] 7. Blue-Green 무중단 배포(1) - Voda Project

배발자 2023. 4. 4.
반응형

 

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 등의 유닉스 기반 운영 체제에서 사용되며 사용자가 명령어를 일일이 입력하지 않아도 자동으로 명령어를 실행하는데 도움을 준다. 

반응형

댓글