Files
ax_hub_mcp_tool/.gitea/workflows/deploy.yml
jade 9066c621a0
All checks were successful
Deploy to OCIWP / deploy (push) Successful in 11m44s
fix: resolve Nginx 503 error on rollback and apply package refactoring
2026-07-24 15:00:01 +09:00

127 lines
5.3 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 "Cleaning up old src directories to prevent stale source files..."
rm -rf /app/*/src
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 빌드 제외 - Dockerfile 내에서 이미 수행하므로 OOM 방지)
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 sequentially to prevent OOM..."
ACTIVE_PROFILE=dev docker compose build gateway-$TARGET
ACTIVE_PROFILE=dev docker compose build tool-sms-$TARGET
ACTIVE_PROFILE=dev docker compose build tool-email-$TARGET
ACTIVE_PROFILE=dev docker compose build tool-other-$TARGET
ACTIVE_PROFILE=dev docker compose build tool-payment-$TARGET
ACTIVE_PROFILE=dev docker compose up -d gateway-$TARGET
sleep 5
ACTIVE_PROFILE=dev docker compose up -d tool-sms-$TARGET
sleep 5
ACTIVE_PROFILE=dev docker compose up -d tool-email-$TARGET
sleep 5
ACTIVE_PROFILE=dev docker compose up -d tool-other-$TARGET
sleep 5
ACTIVE_PROFILE=dev docker compose up -d 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
echo "Initializing Nginx config to $TARGET..."
cp ./nginx/${TARGET}.conf ./nginx/conf.d/default.conf
ACTIVE_PROFILE=dev docker compose up -d nginx
# 5. Health Check (새 버전이 정상적으로 떴는지 확인)
echo "Waiting 30 seconds for services to fully 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 "Rolling back Nginx config to $OLD_TARGET..."
cp ./nginx/${OLD_TARGET}.conf ./nginx/conf.d/default.conf
echo "Restarting Nginx to apply rollback..."
docker compose restart nginx || true
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
if ! docker compose exec -T nginx nginx -s reload; then
echo "Nginx reload failed! Rolling back Nginx configuration..."
cp ./nginx/${OLD_TARGET}.conf ./nginx/conf.d/default.conf
docker compose exec -T nginx nginx -s reload || true
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
# 7. 구버전 종료
echo "Traffic switched successfully. 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"