[Infra] 배포 파이프라인 정리

Walter Mitty·2023년 9월 19일
0

배포파이프 라인 정리

로직

  1. 나, 즉 개발자가 열심히 코드를 짠다
  2. 형상관리 툴에 Push를 한다
  3. Jenkins에 등록해놓은 Webhook Trigger가 변화를 감지하고 코드를 Pull 땡겨온다
  4. 그러면 Jenkins에서는 크게 Build, Docker Iamge Build, Docker Image Push, ssh remote script를 진행하게 된다.
    4-1. Build : .war 혹은 .jar 파일이 생성된다
    4-2. Docker Iamge Build : 새로운 Job(No.) 생성된다. (이미 빌드된 이미지가 있다면 latest)
    4-3. Docker Image Push : 4-2.의 빌드된 이미지가 Registry로 push된다. - 1번 Job 생성
  5. Server의 deploy.sh를 읽어서 실행
    5-1. (최초일 때) docker-compose.blue.yml 파일이 Jenkins가 넘겨준 ${BUILD_NUMBER}를 받아서 Registry에서 해당 Job을 땡겨와 실행하게 되면 port:8080의 Docker Container가 실행된다.
    5-2. (최초가 아닐 때) 4-3. 이 전 Job이 latest가 되고, docker-compose.green.yml 파일이 Job을 땡겨와 실행하게 되면 port:8081의 Docker Container가 실행한다.

deploy.sh 파일

# 1
EXIST_BLUE=$(docker-compose -p ${IMAGE_NAME}-blue -f docker-compose.blue.yml ps | grep Up) 
# docker-compose blue로된 container가 실행이 되어있는가? 되어있다면 true

if [ -z "$EXIST_BLUE" ]; then # 만약 EXIST_BLUE가 false면
    docker-compose -p ${IMAGE_NAME}-blue -f /home/{user}/docker-compose.blue.yml up -d 
    # 그러면 blue를 up!
    BEFORE_COMPOSE_COLOR="green"
    AFTER_COMPOSE_COLOR="blue"
    BEFORE_PORT_NUMBER=8081
    AFTER_PORT_NUMBER=8080
else
    docker-compose -p ${IMAGE_NAME}-green -f /home/{user}/docker-compose.green.yml up -d
    BEFORE_COMPOSE_COLOR="blue"
    AFTER_COMPOSE_COLOR="green"
    BEFORE_PORT_NUMBER=8080
    AFTER_PORT_NUMBER=8081
fi

echo -e "\n${AFTER_COMPOSE_COLOR} server up(port:${AFTER_PORT_NUMBER})" # log 찍어주고

# 2 어플리케이션 구동하고 api날리기까지 시간이 걸리는 동안 이거 하는거임
for cnt in {1..10} # 10번 반복
do
    echo "서버 응답 확인중..(${cnt}/10)";
    UP=$(curl -s http://localhost:${AFTER_PORT_NUMBER}/actuator/health | grep 'UP') 
    # (로컬에서) 내부의 해당 포트로 동작하는곳에다가 curl 요청 up이어야 health 체크를 통과했다는 뜻! actuator/health > 헬스체크용 라이브러리
    if [ -z "${UP}" ] # UP이 안떴다면
        then
        sleep 10
        continue       
        else
            break
    fi
done

if [ $cnt -eq 10 ] # 성공했다면 이 if문 안탐
then
    echo "서버가 정상적으로 구동되지 않았습니다."
    exit 1 # linux에서는 1은 fail!
fi

# UP을 띄워주고 여기까지 완료되어야 저 8080 혹은 8081 사용자가 사용해도 되는 준비가 완료된 상태! 3 그러면 nginx가 port를 바꿔서 nginx를 다시 켜주면 사용자들이 바뀐 포트를 이용하고 비포는 4에서 다운시킨다.


# 3
sudo sed -i "s/${BEFORE_PORT_NUMBER}/${AFTER_PORT_NUMBER}/" /etc/nginx/sites-available/domain.com.conf
sudo nginx -s reload
echo "Deploy Completed!!"

# 4
echo "$BEFORE_COMPOSE_COLOR server down(port:${BEFORE_PORT_NUMBER})"
docker-compose -p ${IMAGE_NAME}-${BEFORE_COMPOSE_COLOR} -f docker-compose.${BEFORE_COMPOSE_COLOR}.yml down



👇 health check 했을 때 UP 뜨는거 확인!




중요

  • Container안에 우리가 빌드한 jar 파일이 들어있고 그 Container가 실행됨가 동시에 Dockerfile에 있는 cmd를 실행한다.
  • Jenkins에서 빌드가 되면 ./build/libs/*.war안의 song.war 파일을 Docker Image안에 옮기고 거기서 cmd를 입력해서 war 파일을 실행한다
  • 그 이후 health check를 성공하면 배포 완료

Registry

0개의 댓글