무중단 배포 테스트
This commit is contained in:
17
appspec.yml
17
appspec.yml
@@ -2,7 +2,7 @@ version: 0.0
|
||||
os: linux
|
||||
files:
|
||||
- source: /
|
||||
destination: /home/ec2-user/app/step2/zip/
|
||||
destination: /home/ec2-user/app/step3/zip/
|
||||
overwrite: yes
|
||||
|
||||
permissions:
|
||||
@@ -13,6 +13,17 @@ permissions:
|
||||
|
||||
hooks:
|
||||
AfterInstall:
|
||||
- location: ./deploy.sh
|
||||
- location: stop.sh
|
||||
timeout: 600
|
||||
runas: root
|
||||
runas: root
|
||||
|
||||
ApplicationStart:
|
||||
- location: start.sh
|
||||
timeout: 600
|
||||
runas: root
|
||||
|
||||
ValidateService:
|
||||
- location: health.sh
|
||||
timeout: 600
|
||||
runas: root
|
||||
|
||||
|
||||
@@ -7,13 +7,12 @@ plugins {
|
||||
|
||||
}
|
||||
|
||||
|
||||
jar {
|
||||
enabled = false
|
||||
}
|
||||
|
||||
group = 'myblog'
|
||||
version = '0.0.1-SNAPSHOT'
|
||||
version = '0.0.1-SNAPSHOT-'+new Date().format("yyyyMMddHHmmss")
|
||||
sourceCompatibility = '11'
|
||||
|
||||
configurations {
|
||||
|
||||
38
scripts/health.sh
Normal file
38
scripts/health.sh
Normal file
@@ -0,0 +1,38 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
ABSPATH=$(readlink -f $0)
|
||||
ABSDIR=$(dirname $ABSPATH)
|
||||
source ${ABSDIR}/profile.sh
|
||||
source ${ABSDIR}/switch.sh
|
||||
|
||||
IDLE_PORT=$(find_idle_port)
|
||||
|
||||
echo "> Health Check Start!"
|
||||
echo "> IDLE_PORT: $IDLE_PORT"
|
||||
echo "> curl -s http://localhost:$IDLE_PORT/profile "
|
||||
sleep 10
|
||||
for RETRY_COUNT in {1..10}
|
||||
do
|
||||
RESPONSE=$(curl -s http://localhost:${IDLE_PORT}/profile)
|
||||
UP_C0UNT=$(echo ${RESPONSE} | grep 'real' | wc -l)
|
||||
|
||||
if [ ${UP_C0UNT} -ge 1 ]
|
||||
then # $up_count >= 1 ("real" 문자열이 있는지 검증)
|
||||
echo "> Health check 성공"
|
||||
switch_proxy
|
||||
break
|
||||
else
|
||||
echo " > Health check의 응답을 알 수 없거나 혹은 실행상태가 아닙니다 "
|
||||
echo "> Health check: ${RESPONSE}"
|
||||
fi
|
||||
|
||||
if [ ${RETRY_COUNT} -eq 10 ]
|
||||
then
|
||||
echo "> Health check 실패 "
|
||||
echo " > 엔진엑스에 연결하지 않고 배포를 종료합니다 "
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "> Health check 연결실패 재시도..."
|
||||
sleep 10
|
||||
done
|
||||
38
scripts/profile.sh
Normal file
38
scripts/profile.sh
Normal file
@@ -0,0 +1,38 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# 쉬고있는 profile 찾기
|
||||
|
||||
function find_idle_profile() {
|
||||
RESPONSE_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost/profile)
|
||||
|
||||
if [ ${RESPONSE_CODE} -ge 400 ]
|
||||
|
||||
then
|
||||
CURRENT_PROFILE=real2
|
||||
else
|
||||
CURRENT_PROFILE=$(curl -s http://localhost/profile)
|
||||
fi
|
||||
|
||||
if [ ${CURRENT_PROFILE} == real1 ]
|
||||
|
||||
then
|
||||
IDLE_PROFILE=real2
|
||||
else
|
||||
IDLE_PROFILE=real1
|
||||
fi
|
||||
|
||||
echo "${IDLE_PROFILE}"
|
||||
}
|
||||
|
||||
# 쉬고있는 PROFILE PORT 찾기
|
||||
|
||||
function find_idle_port() {
|
||||
IDLE_PROFILE=$(find_idle_profile)
|
||||
|
||||
if [ ${IDLE_PROFILE} == real1 ];
|
||||
then
|
||||
echo "8081"
|
||||
else
|
||||
echo "8082"
|
||||
fi
|
||||
}
|
||||
30
scripts/start.sh
Normal file
30
scripts/start.sh
Normal file
@@ -0,0 +1,30 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
ABSPATH=$(readlink -f $0)
|
||||
ABSDIR=$(dirname $ABSPATH)
|
||||
source ${ABSDIR}/profile.sh
|
||||
|
||||
REPOSITORY=/home/ec2-user/app/step3
|
||||
PROJECT_NAME=springboot-blog
|
||||
|
||||
echo "> Build 파일 복사"
|
||||
echo "> cp $REPOSITORY/zip/*.jar $REPOSITORY/"
|
||||
|
||||
cp $REPOSITORY/zip/*.jar $REPOSITORY/
|
||||
|
||||
echo "> 새 어플리케이션 배포"
|
||||
JAR_NAME=$(ls -tr $REPOSITORY/*jar | tail -n 1)
|
||||
|
||||
echo "> JAR_NAME: $JAR_NAME"
|
||||
echo "> $JAR_NAME 에 실행권한 추가"
|
||||
chmod +x $JAR_NAME
|
||||
|
||||
echo "> $JAR_NAME 실행"
|
||||
|
||||
IDLE_PROFILE=$(find_idle_profile)
|
||||
|
||||
echo "> $JAR_NAME 를 profile=$IDLE_PROFILE 로 실행합니다"
|
||||
|
||||
nohup java -jar \
|
||||
-Dspring.config.location=classpath:/application-$IDLE_PROFILE.yml,/home/ec2-user/app/application-dev.yml \
|
||||
$JAR_NAME > $REPOSITORY/nohup.out 2>&1 &
|
||||
21
scripts/stop.sh
Normal file
21
scripts/stop.sh
Normal file
@@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
ABSPATH=$(readlink -f $0)
|
||||
ABSDIR=$(dirname $ABSPATH)
|
||||
source ${ABSDIR}/profile.sh
|
||||
|
||||
IDLE_PORT=$(find_idle_port)
|
||||
|
||||
echo "> $IDLE_PORT 에서 구동중인 앱 PID 확인"
|
||||
|
||||
IDLE_PID=$(lsof -ti tcp:${IDLE_PORT})
|
||||
|
||||
if [ -z ${IDLE_PID} ]
|
||||
then
|
||||
echo "> 현재 구동중인 앱이 없으므로 종료하지 않습니다"
|
||||
else
|
||||
echo "> kill -15 $IDLE_PID"
|
||||
kill -15 ${IDLE_PID}
|
||||
sleep 5
|
||||
fi
|
||||
|
||||
17
scripts/switch.sh
Normal file
17
scripts/switch.sh
Normal file
@@ -0,0 +1,17 @@
|
||||
#! /usn/bin/env bash
|
||||
|
||||
ABSPATH=$(readlink -f $0)
|
||||
ABSDIR=$(dirname $ABSPATH)
|
||||
source ${ABSDIR}/profile.sh
|
||||
|
||||
function switch_proxy() {
|
||||
IDLE_PORT=$(find_idle_port)
|
||||
|
||||
echo "> 전환할 Port: $IDLE_PORT"
|
||||
echo "> Port 전환"
|
||||
echo "set \$service_url http://127.0.0.1:${IDLE_PORT};" |
|
||||
sudo tee /etc/nginx/conf.d/service-url.inc
|
||||
|
||||
echo " > 엔진엑스 리로드"
|
||||
sudo service nginx reload
|
||||
}
|
||||
Reference in New Issue
Block a user