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 cid=$(docker ps -q --filter "publish=$port" --filter "name!=nginx") if [ ! -z "$cid" ]; then echo "Force killing legacy container $cid using port $port" docker rm -f $cid fi 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"