name: Auto-Promote Pipeline on: workflow_run: workflows: ["Deploy to Development"] types: - completed branches: [ main ] jobs: test-and-promote: name: Test Dev and Auto-Promote runs-on: ubuntu-latest if: ${{ github.event.workflow_run.conclusion == 'success' }} steps: - name: Checkout repository uses: actions/checkout@v4 - name: Wait for dev deployment to settle run: | echo "โณ Waiting for dev deployment to fully settle..." sleep 60 - name: Run comprehensive dev tests run: | echo "๐Ÿงช Running comprehensive tests on dev environment..." # Test canonical domain first (primary test) echo "Testing canonical domain: game-2048-dev.game-2048-dev.dev.wa.darknex.us" canonical_response=$(curl -s -o /dev/null -w "%{http_code}" -L --max-time 30 https://game-2048-dev.game-2048-dev.dev.wa.darknex.us/) if [ "$canonical_response" != "200" ]; then echo "โŒ Canonical domain returned HTTP $canonical_response" exit 1 fi echo "โœ… Canonical domain accessible" # Test SSL certificate on custom domain echo "Testing SSL certificate on custom domain..." cert_expiry=$(echo | openssl s_client -servername 2048-dev.wa.darknex.us -connect 2048-dev.wa.darknex.us:443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2) expiry_epoch=$(date -d "$cert_expiry" +%s) current_epoch=$(date +%s) days_until_expiry=$(( (expiry_epoch - current_epoch) / 86400 )) if [ $days_until_expiry -lt 30 ]; then echo "โŒ SSL certificate expires in less than 30 days!" exit 1 fi echo "โœ… SSL certificate valid for $days_until_expiry days" # Test custom domain accessibility echo "Testing custom domain accessibility..." response_code=$(curl -s -o /dev/null -w "%{http_code}" -L --max-time 30 https://2048-dev.wa.darknex.us/) if [ "$response_code" != "200" ]; then echo "โŒ Custom domain returned HTTP $response_code" exit 1 fi echo "โœ… Custom domain accessible" # Test content validation on canonical domain echo "Testing content validation on canonical domain..." content=$(curl -s -L --max-time 30 https://game-2048-dev.game-2048-dev.dev.wa.darknex.us/) if ! echo "$content" | grep -q "2048"; then echo "โŒ Content missing 2048 title" exit 1 fi if ! echo "$content" | grep -q "HOW TO PLAY"; then echo "โŒ Content missing game instructions" exit 1 fi if ! echo "$content" | grep -q "style.css"; then echo "โŒ CSS file not referenced" exit 1 fi if ! echo "$content" | grep -q "script.js"; then echo "โŒ JavaScript file not referenced" exit 1 fi echo "โœ… All content validation tests passed" # Test performance on canonical domain echo "Testing performance on canonical domain..." response_time=$(curl -s -o /dev/null -w "%{time_total}" -L --max-time 30 https://game-2048-dev.game-2048-dev.dev.wa.darknex.us/) if (( $(echo "$response_time > 10.0" | bc -l) )); then echo "โŒ Response time too slow: ${response_time}s" exit 1 fi echo "โœ… Performance test passed: ${response_time}s" - name: Auto-promote to staging uses: actions/github-script@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | console.log('๐Ÿš€ All dev tests passed! Auto-promoting to staging...'); const response = await github.rest.actions.createWorkflowDispatch({ owner: context.repo.owner, repo: context.repo.repo, workflow_id: 'deploy-staging.yml', ref: 'main', inputs: { image_tag: 'latest' } }); console.log('โœ… Staging deployment triggered'); return response; - name: Create promotion summary run: | echo "## ๐ŸŽฏ Auto-Promotion Summary" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "| Stage | Status | Action |" >> $GITHUB_STEP_SUMMARY echo "|-------|--------|--------|" >> $GITHUB_STEP_SUMMARY echo "| Dev Tests | โœ… Passed | Comprehensive validation completed |" >> $GITHUB_STEP_SUMMARY echo "| Staging | ๐Ÿš€ Triggered | Auto-promotion initiated |" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "### ๐Ÿ“‹ Tests Performed" >> $GITHUB_STEP_SUMMARY echo "- SSL certificate validation" >> $GITHUB_STEP_SUMMARY echo "- Domain accessibility check" >> $GITHUB_STEP_SUMMARY echo "- Content and functionality validation" >> $GITHUB_STEP_SUMMARY echo "- Performance testing" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "### ๐Ÿ”— Next Steps" >> $GITHUB_STEP_SUMMARY echo "- Monitor staging deployment progress" >> $GITHUB_STEP_SUMMARY echo "- Staging tests will run automatically" >> $GITHUB_STEP_SUMMARY echo "- Production promotion requires manual approval" >> $GITHUB_STEP_SUMMARY promote-to-production: name: Test Staging and Promote to Production runs-on: ubuntu-latest needs: test-and-promote if: success() environment: production-approval # This requires manual approval steps: - name: Checkout repository uses: actions/checkout@v4 - name: Wait for staging deployment run: | echo "โณ Waiting for staging deployment to complete..." sleep 120 # Give staging time to deploy - name: Test staging environment run: | echo "๐Ÿงช Running staging tests..." # Test canonical staging domain first echo "Testing canonical staging domain: game-2048-staging.game-2048-staging.staging.wa.darknex.us" canonical_response=$(curl -s -o /dev/null -w "%{http_code}" -L --max-time 30 https://game-2048-staging.game-2048-staging.staging.wa.darknex.us/) if [ "$canonical_response" != "200" ]; then echo "โŒ Staging canonical domain returned HTTP $canonical_response" exit 1 fi echo "โœ… Staging canonical domain accessible" # Test custom staging domain echo "Testing custom staging domain: 2048-staging.wa.darknex.us" response_code=$(curl -s -o /dev/null -w "%{http_code}" -L --max-time 30 https://2048-staging.wa.darknex.us/) if [ "$response_code" != "200" ]; then echo "โŒ Staging custom domain returned HTTP $response_code" exit 1 fi echo "โœ… Staging custom domain accessible" # Test staging content on canonical domain echo "Testing staging content..." content=$(curl -s -L --max-time 30 https://game-2048-staging.game-2048-staging.staging.wa.darknex.us/) if ! echo "$content" | grep -q "2048"; then echo "โŒ Staging content validation failed" exit 1 fi echo "โœ… Staging content validation passed" - name: Auto-promote to production uses: actions/github-script@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | console.log('๐ŸŽฏ Staging tests passed! Promoting to production...'); const response = await github.rest.actions.createWorkflowDispatch({ owner: context.repo.owner, repo: context.repo.repo, workflow_id: 'deploy-prod.yml', ref: 'main', inputs: { image_tag: 'latest', confirmation: 'DEPLOY' } }); console.log('๐Ÿš€ Production deployment triggered'); return response; - name: Create final summary run: | echo "## ๐ŸŽ‰ Full Pipeline Completion" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "| Environment | Status | URL |" >> $GITHUB_STEP_SUMMARY echo "|-------------|--------|-----|" >> $GITHUB_STEP_SUMMARY echo "| Development | โœ… Tested & Live | https://2048-dev.wa.darknex.us |" >> $GITHUB_STEP_SUMMARY echo "| Staging | โœ… Tested & Live | https://2048-staging.wa.darknex.us |" >> $GITHUB_STEP_SUMMARY echo "| Production | ๐Ÿš€ Deploying | https://2048.wa.darknex.us |" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "### ๐ŸŽฎ Your 2048 Game is Live!" >> $GITHUB_STEP_SUMMARY echo "All environments have been automatically tested and promoted successfully." >> $GITHUB_STEP_SUMMARY