name: Deploy to Production on: workflow_dispatch: inputs: image_tag: description: 'Image tag to deploy (default: latest)' required: false default: 'latest' confirmation: description: 'Type "DEPLOY" to confirm production deployment' required: true source_environment: description: 'Source environment (staging or manual)' required: false default: 'staging' workflow_run: workflows: ["Deploy to Staging"] types: - completed branches: [ main, master ] env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} jobs: deploy-prod: name: Deploy to Production runs-on: ubuntu-latest if: | (github.event_name == 'workflow_dispatch' && github.event.inputs.confirmation == 'DEPLOY') || (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success') steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set image tag run: | if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then IMAGE_TAG="${{ github.event.inputs.image_tag || 'latest' }}" else # For auto-promotion, use the latest successful build IMAGE_TAG="main-$(echo "${{ github.sha }}" | cut -c1-7)" fi echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_ENV echo "Deploying image: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:$IMAGE_TAG" - name: Deploy to production via webhook (Blue-Green) run: | echo "๐Ÿš€ Triggering blue-green webhook deployment to production..." # Prepare deployment payload PAYLOAD=$(cat < /dev/null; then echo "โœ… Basic health check passed!" # Additional production validations echo "๐Ÿ” Running extended production validations..." # Check response time RESPONSE_TIME=$(curl -o /dev/null -s -w '%{time_total}' "$HEALTH_URL") echo "Response time: ${RESPONSE_TIME}s" # Check if response contains expected content if curl -s --max-time 10 "$HEALTH_URL" | grep -q "2048"; then echo "โœ… Content validation passed!" echo "๐ŸŒ Production application is live at: $HEALTH_URL" exit 0 else echo "โš ๏ธ Content validation failed, retrying..." fi else echo "โš ๏ธ Health check failed, retrying in 20 seconds..." sleep 20 RETRY_COUNT=$((RETRY_COUNT + 1)) fi done echo "โŒ Production health check failed after $MAX_RETRIES attempts" echo "The deployment webhook was sent successfully, but the service is not responding correctly" echo "Please check your cluster logs and consider rolling back" exit 1 - name: Production deployment summary if: always() run: | echo "## ๐Ÿš€ Production Deployment Summary" >> $GITHUB_STEP_SUMMARY echo "- **Environment:** Production" >> $GITHUB_STEP_SUMMARY echo "- **Image:** \`${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}\`" >> $GITHUB_STEP_SUMMARY echo "- **Deployment Method:** Webhook-based Blue-Green" >> $GITHUB_STEP_SUMMARY echo "- **Strategy:** 10% โ†’ 50% โ†’ 100% traffic split" >> $GITHUB_STEP_SUMMARY echo "- **Triggered by:** ${{ github.actor }}" >> $GITHUB_STEP_SUMMARY echo "- **Commit:** ${{ github.sha }}" >> $GITHUB_STEP_SUMMARY if [ "${{ github.event_name }}" = "workflow_run" ]; then echo "- **Type:** Auto-promotion from Staging" >> $GITHUB_STEP_SUMMARY else echo "- **Type:** Manual deployment with confirmation" >> $GITHUB_STEP_SUMMARY fi if [ "${{ job.status }}" = "success" ]; then echo "- **Status:** โœ… **LIVE IN PRODUCTION**" >> $GITHUB_STEP_SUMMARY echo "- **URL:** https://game-2048-prod.game-2048-prod.${{ secrets.KNATIVE_DOMAIN }}" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "### ๐ŸŽ‰ Production is Live!" >> $GITHUB_STEP_SUMMARY echo "- ๐ŸŽฎ [Play the game](https://game-2048-prod.game-2048-prod.${{ secrets.KNATIVE_DOMAIN }})" >> $GITHUB_STEP_SUMMARY echo "- ๐Ÿงช [Run smoke tests](https://github.com/${{ github.repository }}/actions/workflows/smoke-test.yml)" >> $GITHUB_STEP_SUMMARY else echo "- **Status:** โŒ Failed" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "### โš ๏ธ Production Deployment Failed" >> $GITHUB_STEP_SUMMARY echo "Please check the logs and consider manual intervention or rollback." >> $GITHUB_STEP_SUMMARY fi