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..." # 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 "Curling gateway locally:" curl -sv http://localhost:8081/index.html 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"