name: Deploy to Cloudflare Workers
on:
push:
branches: [main]
paths:
- "lib/workers/**"
- "lib/core/**"
- "lib/adapters/**"
- "lib/config/**"
- "lib/infrastructure/**"
- "lib/shared/**"
- "wrangler.toml"
- "package.json"
- "tsconfig.worker.json"
workflow_dispatch:
inputs:
environment:
description: "Deployment environment"
required: true
default: "staging"
type: choice
options:
- staging
- production
jobs:
deploy:
name: Deploy to Cloudflare Workers
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20.x"
cache: "npm"
- name: Cache worker build
uses: actions/cache@v4
with:
path: |
build/
tsconfig.tsbuildinfo
key: ${{ runner.os }}-worker-build-${{ hashFiles('lib/**/*.ts', 'tsconfig.worker.json') }}
restore-keys: |
${{ runner.os }}-worker-build-
${{ runner.os }}-build-
- name: Install dependencies
run: npm ci
- name: Build worker
run: npm run build:worker
- name: Deploy to Cloudflare Workers
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
environment: ${{ github.event.inputs.environment || 'staging' }}
workingDirectory: "."
wranglerVersion: "3.95.0"
command: deploy --env ${{ github.event.inputs.environment || 'staging' }}
- name: Get worker URL
id: get_url
run: |
ENV="${{ github.event.inputs.environment || 'staging' }}"
# Get worker name from wrangler.toml
if [ "$ENV" = "production" ]; then
WORKER_NAME="mcp-dadosbr-aredes-prod"
# Production uses custom domain
WORKER_URL="https://mcp-dadosbr.aredes.me"
else
WORKER_NAME="mcp-dadosbr-aredes-staging"
# Staging uses workers.dev subdomain
WORKER_URL="https://${WORKER_NAME}.workers.dev"
fi
echo "worker_url=$WORKER_URL" >> $GITHUB_OUTPUT
echo "π Worker URL: $WORKER_URL"
- name: Test deployment
if: success()
run: |
WORKER_URL="${{ steps.get_url.outputs.worker_url }}"
echo "π§ͺ Testing deployment at $WORKER_URL"
echo "β³ Waiting for deployment to propagate..."
# Poll for deployment readiness (max 60 seconds)
for i in {1..12}; do
if curl -sf "$WORKER_URL/health" > /dev/null 2>&1; then
echo "β
Health check passed"
break
fi
if [ $i -eq 12 ]; then
echo "β Deployment health check failed after 60 seconds"
exit 1
fi
echo "β³ Attempt $i/12 - waiting 5 seconds..."
sleep 5
done
# Test MCP endpoint
echo "π§ͺ Testing MCP endpoint..."
RESPONSE=$(curl -sf -X POST "$WORKER_URL/mcp" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}')
if echo "$RESPONSE" | grep -q "tools"; then
echo "β
MCP endpoint test passed"
echo "π¦ Available tools:"
echo "$RESPONSE" | jq -r '.result.tools[].name' 2>/dev/null || echo "$RESPONSE"
else
echo "β MCP endpoint test failed"
echo "Response: $RESPONSE"
exit 1
fi
echo "β
All deployment tests passed"
- name: Create deployment summary
if: always()
run: |
WORKER_URL="${{ steps.get_url.outputs.worker_url }}"
echo "## π Cloudflare Workers Deployment" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Environment:** ${{ github.event.inputs.environment || 'staging' }}" >> $GITHUB_STEP_SUMMARY
echo "**Worker Name:** mcp-dadosbr-aredes-${{ github.event.inputs.environment || 'staging' }}" >> $GITHUB_STEP_SUMMARY
echo "**Commit:** \`${{ github.sha }}\`" >> $GITHUB_STEP_SUMMARY
echo "**Status:** ${{ job.status }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
if [ "${{ job.status }}" == "success" ]; then
echo "β
**Deployment successful!**" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Endpoints:**" >> $GITHUB_STEP_SUMMARY
echo "- π₯ Health: [$WORKER_URL/health]($WORKER_URL/health)" >> $GITHUB_STEP_SUMMARY
echo "- π MCP JSON-RPC: [$WORKER_URL/mcp]($WORKER_URL/mcp)" >> $GITHUB_STEP_SUMMARY
echo "- π‘ SSE: [$WORKER_URL/sse]($WORKER_URL/sse)" >> $GITHUB_STEP_SUMMARY
echo "- π OpenAPI: [$WORKER_URL/openapi.json]($WORKER_URL/openapi.json)" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Test Commands:**" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY
echo "# Health check" >> $GITHUB_STEP_SUMMARY
echo "curl $WORKER_URL/health" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "# List tools" >> $GITHUB_STEP_SUMMARY
echo "curl -X POST $WORKER_URL/mcp \\" >> $GITHUB_STEP_SUMMARY
echo " -H 'Content-Type: application/json' \\" >> $GITHUB_STEP_SUMMARY
echo " -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\"}'" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
else
echo "β **Deployment failed**" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "Please check the logs above for error details." >> $GITHUB_STEP_SUMMARY
fi
notify:
name: Notify deployment status
runs-on: ubuntu-latest
needs: deploy
if: always()
steps:
- name: Notify success
if: needs.deploy.result == 'success'
run: |
echo "π Cloudflare Workers deployment successful!"
echo "Environment: ${{ github.event.inputs.environment || 'staging' }}"
echo "Commit: ${{ github.sha }}"
- name: Notify failure
if: needs.deploy.result == 'failure'
run: |
echo "β Cloudflare Workers deployment failed!"
echo "Environment: ${{ github.event.inputs.environment || 'staging' }}"
echo "Commit: ${{ github.sha }}"
exit 1