116 lines
4.4 KiB
YAML
116 lines
4.4 KiB
YAML
name: Deploy to OCIWP
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- main
|
|
- master
|
|
workflow_dispatch:
|
|
|
|
jobs:
|
|
deploy:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Sync Code to Host Volume
|
|
run: |
|
|
echo "Copying latest code to /app (Host Volume)..."
|
|
cp -a . /app/
|
|
|
|
- name: Deploy Task on Host
|
|
run: |
|
|
echo "Starting Blue-Green CI/CD Deploy pipeline..."
|
|
|
|
# 1. gradle 공식 이미지로 바로 컴파일 빌드!
|
|
docker run --rm \
|
|
-v /home/ubuntu/app/ax_hub_mcp_tool:/app \
|
|
-v /var/run/docker.sock:/var/run/docker.sock \
|
|
-v /home/ubuntu/.gradle:/home/gradle/.gradle \
|
|
-w /app \
|
|
gradle:8-jdk21 \
|
|
./gradlew bootJar -x test
|
|
|
|
# 2. 빌드 결과 plain jar 아카이브 정리
|
|
find /app -name "*-plain.jar" -delete
|
|
|
|
cd /app
|
|
|
|
# 3. 블루/그린 타겟 식별
|
|
IS_BLUE_RUNNING=$(docker ps --filter "name=ax_hub_mcp_tool-gateway-blue-1" --filter "status=running" -q)
|
|
|
|
if [ ! -z "$IS_BLUE_RUNNING" ]; then
|
|
echo "Current active color is BLUE. Deploying to GREEN..."
|
|
TARGET="green"
|
|
OLD_TARGET="blue"
|
|
else
|
|
echo "Current active color is GREEN (or none). Deploying to BLUE..."
|
|
TARGET="blue"
|
|
OLD_TARGET="green"
|
|
fi
|
|
|
|
# 3.5. 공통 인프라 (DB, Redis 등) 먼저 띄우기 (Nginx 제외)
|
|
ACTIVE_PROFILE=dev docker compose up -d redis mci-mock dozzle
|
|
|
|
# 4. 신규 버전(TARGET) 컨테이너 기동
|
|
echo "Building and starting $TARGET containers..."
|
|
ACTIVE_PROFILE=dev docker compose up -d --build \
|
|
gateway-$TARGET \
|
|
tool-sms-$TARGET \
|
|
tool-email-$TARGET \
|
|
tool-other-$TARGET \
|
|
tool-payment-$TARGET
|
|
|
|
# 4.5. 레거시 컨테이너 청소 (포트 충돌 방지, Nginx 제외)
|
|
echo "Finding and killing legacy containers holding our ports..."
|
|
for port in 8281 8282 8283 8284 8285; do
|
|
cids=$(docker ps -q --filter "publish=$port")
|
|
for cid in $cids; do
|
|
cname=$(docker inspect --format '{{.Name}}' $cid)
|
|
if [[ "$cname" != *nginx* ]]; then
|
|
echo "Force killing legacy container $cname ($cid) using port $port"
|
|
docker rm -f $cid
|
|
fi
|
|
done
|
|
done
|
|
|
|
# 4.6. Nginx 초기 설정 및 기동
|
|
mkdir -p ./nginx/conf.d
|
|
if [ ! -f "./nginx/conf.d/default.conf" ]; then
|
|
echo "Initializing Nginx config to $TARGET..."
|
|
cp ./nginx/${TARGET}.conf ./nginx/conf.d/default.conf
|
|
fi
|
|
ACTIVE_PROFILE=dev docker compose up -d nginx
|
|
|
|
# 5. 헬스 체크 대기 (Spring Boot 기동 시간 확보)
|
|
echo "Waiting 30 seconds for Spring Boot to start..."
|
|
sleep 30
|
|
|
|
# 신규 컨테이너가 죽지 않고 살아있는지 확인
|
|
IS_TARGET_ALIVE=$(docker ps --filter "name=ax_hub_mcp_tool-gateway-${TARGET}-1" --filter "status=running" -q)
|
|
|
|
if [ -z "$IS_TARGET_ALIVE" ]; then
|
|
echo "Health Check Failed! $TARGET container crashed. Rollback."
|
|
echo "Stopping failed $TARGET containers..."
|
|
docker compose stop gateway-$TARGET tool-sms-$TARGET tool-email-$TARGET tool-other-$TARGET tool-payment-$TARGET
|
|
exit 1 # 파이프라인 실패 처리 (구버전은 그대로 유지됨)
|
|
fi
|
|
|
|
# 6. 트래픽 전환 (Nginx 설정 스위칭)
|
|
echo "Health Check Passed! Switching traffic to $TARGET..."
|
|
mkdir -p ./nginx/conf.d
|
|
cp ./nginx/${TARGET}.conf ./nginx/conf.d/default.conf
|
|
docker compose exec -T nginx nginx -s reload
|
|
|
|
# 7. 구버전 종료
|
|
echo "Traffic switched. Stopping old $OLD_TARGET containers..."
|
|
docker compose stop gateway-$OLD_TARGET tool-sms-$OLD_TARGET tool-email-$OLD_TARGET tool-other-$OLD_TARGET tool-payment-$OLD_TARGET
|
|
|
|
# 가비지 청소
|
|
docker system prune -f
|
|
docker image prune -f
|
|
|
|
echo "Blue-Green CI/CD Deploy Success! Currently running: $TARGET"
|