| name | deployment-checklist-generator |
| description | Creates comprehensive deployment checklists with pre-deployment checks, smoke tests, verification steps, and sign-off workflows. Use for "deployment checklist", "release verification", "deployment runbook", or "production readiness". |
Deployment Checklist Generator
Ensure safe, reliable deployments with comprehensive checklists.
Pre-Deployment Checklist
# Pre-Deployment Checklist
## Code Quality
- [ ] All CI checks passing
- [ ] Code review approved (2+ reviewers)
- [ ] No known critical bugs
- [ ] Security scan passed
- [ ] Performance tests passed
## Dependencies
- [ ] All dependencies up to date
- [ ] No high/critical vulnerabilities
- [ ] Bundle size within budget
- [ ] Third-party services operational
## Database
- [ ] Migrations tested in staging
- [ ] Backup completed
- [ ] Rollback plan documented
- [ ] Data migration scripts reviewed
## Infrastructure
- [ ] Servers have capacity
- [ ] CDN cache invalidation plan
- [ ] Load balancer configured
- [ ] SSL certificates valid
## Documentation
- [ ] Changelog updated
- [ ] API docs updated (if changed)
- [ ] Deployment notes prepared
- [ ] Rollback instructions ready
## Communication
- [ ] Stakeholders notified
- [ ] Maintenance window scheduled (if needed)
- [ ] Support team briefed
- [ ] Status page prepared
## Deployment Window
- [ ] Off-peak hours selected
- [ ] Team available for monitoring
- [ ] Emergency contacts confirmed
Deployment Workflow with Checks
# .github/workflows/deploy.yml
name: Deploy to Production
on:
workflow_dispatch:
jobs:
pre-deploy-checks:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check branch
run: |
if [ "${{ github.ref }}" != "refs/heads/main" ]; then
echo "❌ Can only deploy from main branch"
exit 1
fi
- name: Verify CI passed
uses: actions/github-script@v7
with:
script: |
const checks = await github.rest.checks.listForRef({
owner: context.repo.owner,
repo: context.repo.repo,
ref: context.sha,
});
const failed = checks.data.check_runs.filter(
check => check.conclusion === 'failure'
);
if (failed.length > 0) {
throw new Error(`CI checks failed: ${failed.map(c => c.name).join(', ')}`);
}
- name: Check deployment window
run: |
HOUR=$(date +%H)
if [ $HOUR -ge 9 ] && [ $HOUR -le 17 ]; then
echo "⚠️ Deploying during business hours"
else
echo "✅ Deploying outside business hours"
fi
- name: Verify staging deployment
run: |
if ! curl -f https://staging.myapp.com/health; then
echo "❌ Staging is not healthy"
exit 1
fi
deploy:
needs: pre-deploy-checks
runs-on: ubuntu-latest
environment:
name: production
url: https://myapp.com
steps:
- uses: actions/checkout@v4
- name: Backup database
run: ./scripts/backup-db.sh
- name: Deploy
run: ./scripts/deploy.sh production
- name: Run smoke tests
run: ./scripts/smoke-tests.sh production
- name: Update status page
run: |
curl -X POST https://statuspage.io/api/v1/incidents \
-H "Authorization: Bearer ${{ secrets.STATUSPAGE_TOKEN }}" \
-d '{"name":"Deployment Complete","status":"resolved"}'
- name: Create deployment record
uses: actions/github-script@v7
with:
script: |
github.rest.repos.createDeployment({
owner: context.repo.owner,
repo: context.repo.repo,
ref: context.sha,
environment: 'production',
description: 'Production deployment',
});
Smoke Test Script
#!/bin/bash
# scripts/smoke-tests.sh
ENVIRONMENT=$1
BASE_URL="https://${ENVIRONMENT}.myapp.com"
echo "🔍 Running smoke tests for $ENVIRONMENT..."
FAILED=0
# Test 1: Health endpoint
echo "Test 1: Health check"
if curl -f "$BASE_URL/health" | grep -q "ok"; then
echo "✅ Health check passed"
else
echo "❌ Health check failed"
FAILED=1
fi
# Test 2: User authentication
echo "Test 2: User login"
TOKEN=$(curl -s -X POST "$BASE_URL/api/auth/login" \
-H "Content-Type: application/json" \
-d '{"email":"test@example.com","password":"test123"}' \
| jq -r '.token')
if [ -n "$TOKEN" ] && [ "$TOKEN" != "null" ]; then
echo "✅ Login passed"
else
echo "❌ Login failed"
FAILED=1
fi
# Test 3: Critical API endpoints
echo "Test 3: API endpoints"
ENDPOINTS=("/api/users" "/api/products" "/api/orders")
for endpoint in "${ENDPOINTS[@]}"; do
STATUS=$(curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer $TOKEN" \
"$BASE_URL$endpoint")
if [ "$STATUS" == "200" ]; then
echo "✅ $endpoint: $STATUS"
else
echo "❌ $endpoint: $STATUS"
FAILED=1
fi
done
# Test 4: Database connectivity
echo "Test 4: Database check"
if curl -f "$BASE_URL/api/health/db" | grep -q "connected"; then
echo "✅ Database connected"
else
echo "❌ Database connection failed"
FAILED=1
fi
# Test 5: External services
echo "Test 5: External services"
SERVICES=("stripe" "sendgrid" "aws")
for service in "${SERVICES[@]}"; do
if curl -f "$BASE_URL/api/health/$service" | grep -q "ok"; then
echo "✅ $service: connected"
else
echo "❌ $service: connection failed"
FAILED=1
fi
done
if [ $FAILED -eq 1 ]; then
echo "❌ Smoke tests failed"
exit 1
fi
echo "✅ All smoke tests passed"
exit 0
Post-Deployment Verification
# Post-Deployment Verification
## Immediate Checks (0-5 minutes)
- [ ] Deployment completed successfully
- [ ] All smoke tests passed
- [ ] Health checks returning 200
- [ ] No 5xx errors in logs
- [ ] Application responding
## Short-term Monitoring (5-30 minutes)
- [ ] Error rate <1%
- [ ] Response time p95 <500ms
- [ ] CPU usage normal (<70%)
- [ ] Memory usage stable
- [ ] Database queries performing well
## Feature Verification
- [ ] Login/authentication working
- [ ] Checkout flow functional
- [ ] Search returning results
- [ ] Email notifications sending
- [ ] Payment processing working
## Metrics Dashboard
- [ ] Request volume normal
- [ ] Success rate >99%
- [ ] Latency within SLA
- [ ] No spike in errors
- [ ] User engagement stable
## Long-term Monitoring (1-24 hours)
- [ ] No user complaints
- [ ] Support tickets normal
- [ ] Revenue tracking normal
- [ ] All scheduled jobs running
- [ ] No memory leaks detected
Sign-off Template
- name: Request deployment approval
uses: trstringer/manual-approval@v1
with:
secret: ${{ secrets.GITHUB_TOKEN }}
approvers: tech-lead,ops-manager
minimum-approvals: 2
issue-title: "Approve Production Deployment"
issue-body: |
## Deployment Details
**Version:** ${{ github.ref_name }}
**Commit:** ${{ github.sha }}
**Changes:** See [changelog](CHANGELOG.md)
## Pre-deployment Checklist
- ✅ All CI checks passed
- ✅ Code review completed
- ✅ Security scan passed
- ✅ Staging verified
## Approval Required
This deployment requires approval from tech lead and ops manager.
**Approve:** Comment "approve" or "lgtm"
**Reject:** Comment "reject" or "block"
Monitoring Dashboard
# Deployment Monitoring Dashboard
## Key Metrics
### Health
- API Health: ✅ UP
- Database: ✅ Connected
- Cache: ✅ Connected
### Performance
- Requests/min: 1,234
- Error rate: 0.2%
- p50 latency: 120ms
- p95 latency: 450ms
- p99 latency: 1,200ms
### Infrastructure
- CPU: 45%
- Memory: 62%
- Disk: 38%
### Business Metrics
- Active users: 523
- Successful checkouts: 89/hour
- Revenue: $15,234/hour
## Alerts
No active alerts
## Recent Deployments
- v1.3.0: Deployed 5 minutes ago ✅
- v1.2.9: Deployed 2 days ago ✅
- v1.2.8: Rolled back 3 days ago ⚠️
Best Practices
- Automated checks: Enforce via CI/CD
- Manual review: Critical deployments need approval
- Smoke tests: Verify key functionality
- Gradual rollout: Canary or blue-green
- Monitoring: Watch metrics for 30 minutes
- Communication: Keep stakeholders informed
- Rollback ready: One-click rollback available
Output Checklist
- Pre-deployment checklist
- Deployment workflow with gates
- Smoke test script
- Post-deployment verification
- Sign-off workflow
- Monitoring dashboard
- Communication templates
- Rollback instructions