본문 바로가기
DevOps

[Jenkins 다중서버 무중단 배포 5/5] 배포 스크립트 작성

by 헬로월드 2021. 11. 7.
반응형

2021.11.06 - [DevOps] - [Jenkins 다중서버 무중단 배포 4/5] Pipeline 생성 및 스크립트 작성

 

개요

Jenkins를 통해서 Spring Boot 애플리케이션을 다수의 서버에 무중단으로 배포하는 것을 목표로 합니다.

이글에서는 서버단 배포 스크립트를 작성하겠습니다.

  1. Spring Boot 서버 어플리케이션을 실행하기 위한 스크립트입니다.
  2. 서버가 실행되면 이를 체크하기 위한 스크립트입니다.

 

스크립트는 개발환경(ex: maven, gradle) 및 서버 환경(ex: ubuntu, centos)에 따라 수정해야 할 수 있습니다.

문서환경은 ubuntu 20.04, gradle 7.1.1 환경입니다.

 

스크립트 작성

스크립트 폴더 구조입니다.

deploy_server.sh

# (1)
REPOSITORY=/home
BUILD_PATH=$(ls -tr ${REPOSITORY}/build/lib/*.jar | tail -1)
JAR_NAME=$(basename $BUILD_PATH)
echo "> build file: $JAR_NAME"

# (2)
echo "> copy build file"
DEPLOY_PATH=${REPOSITORY}/deploy/
if [ ! -d $DEPLOY_PATH ]; then
  mkdir $DEPLOY_PATH
fi

cp $BUILD_PATH $DEPLOY_PATH

echo "> change file name"
CP_JAR_PATH=$DEPLOY_PATH$JAR_NAME
APPLICATION_JAR_NAME=application-deploy.jar
APPLICATION_JAR=$DEPLOY_PATH$APPLICATION_JAR_NAME

echo "> create link"
ln -Tfs $CP_JAR_PATH $APPLICATION_JAR

# (3)
echo "> Check application PID."
CURRENT_PID=$(pgrep -f -n $APPLICATION_JAR_NAME)
echo "$CURRENT_PID"

if [ -z $CURRENT_PID ];
  then
    echo "> No running applications found."
else
	echo "> kill -9 $CURRENT_PID"
	kill -9 $CURRENT_PID
	sleep 10
fi

# (4)
echo "> Run application."
nohup java -jar -Dspring.profiles.active=local $APPLICATION_JAR > /dev/null 2> /dev/null < /dev/null &
  1. 빌드된 파일 디렉터리 설정입니다.  폴더내 최근 1개 파일을 선택합니다.
  2. 업로드된 파일을 작업 폴더로 이동합니다. 이동 후 빌드 파일 링크를 신규 파일로 대체합니다.
  3. 기존 서버가 살아 있으면 다운시킵니다.
  4. 애플리케이션을 실행합니다. '-Dspring.profiles.active=local'은 운영환경에 맞게 조절하세요.

 

health_check.sh

#!/bin/bash
# (1)
url="http://localhost:8080/board/1"

timeout=5
online=false

echo "Checking status of $url."

# (2)
loopCount=1
while [ $loopCount -le 10 ]
do
  code=$(curl -sL --connect-timeout 20 --max-time 30 -w "%{http_code}\\n" "$url" -o /dev/null)
  echo "try $loopCount => code: $code"
  if [ "$code" = "200" ]; then
    online=true
    break
  else
    loopCount=$((loopCount + 1))
    sleep $timeout
  fi
done

# (3)
if $online; then
  echo "Monitor finished, website is online."
  exit 0 # Success
else
  echo "Monitor failed, website seems to be down."
  exit 1 # Failed
fi
  1. 상태를 체크하는 URL입니다. 구현에 맞게 변경해주세요.
  2. 해당 URL을 curl로 실행해서 HttpStatus가 200이 나올 때까지 10번 시도합니다.
  3. 체크가 성공했다면 다음 작업(다음 서버 배포)을 실행하고, 그렇지 않으면 배포는 중단됩니다.

 

 

배포

수동배포

대시보드에서 해당프로젝트로 이동 후 'Build Now'를 클릭하면 배포가 진행 됩니다.

프로젝트 대시보드에서 현재 진행상태를 확인할 수 있습니다.

 

빌드번호를 클릭하면

보다 자세한 로그를 확인 할 수 있습니다.

 

자동배포

이제 Github에 코드를 Push하면 빌드가 자동으로 진행됩니다.

728x90