무중단 배포 테스트
This commit is contained in:
17
appspec.yml
17
appspec.yml
@@ -2,7 +2,7 @@ version: 0.0
|
|||||||
os: linux
|
os: linux
|
||||||
files:
|
files:
|
||||||
- source: /
|
- source: /
|
||||||
destination: /home/ec2-user/app/step2/zip/
|
destination: /home/ec2-user/app/step3/zip/
|
||||||
overwrite: yes
|
overwrite: yes
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
@@ -13,6 +13,17 @@ permissions:
|
|||||||
|
|
||||||
hooks:
|
hooks:
|
||||||
AfterInstall:
|
AfterInstall:
|
||||||
- location: ./deploy.sh
|
- location: stop.sh
|
||||||
timeout: 600
|
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 {
|
jar {
|
||||||
enabled = false
|
enabled = false
|
||||||
}
|
}
|
||||||
|
|
||||||
group = 'myblog'
|
group = 'myblog'
|
||||||
version = '0.0.1-SNAPSHOT'
|
version = '0.0.1-SNAPSHOT-'+new Date().format("yyyyMMddHHmmss")
|
||||||
sourceCompatibility = '11'
|
sourceCompatibility = '11'
|
||||||
|
|
||||||
configurations {
|
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