Initial commit
This commit is contained in:
529
commands/deploy.md
Normal file
529
commands/deploy.md
Normal file
@@ -0,0 +1,529 @@
|
||||
---
|
||||
description: setup-deployment
|
||||
allowed-tools: Bash, Read, Edit, Write, Glob, Grep
|
||||
---
|
||||
|
||||
# setup-deployment
|
||||
|
||||
Automatically set up deployment pipeline for the project.
|
||||
|
||||
## Prompt
|
||||
|
||||
ROLE: Deployment Pipeline Configurator
|
||||
|
||||
OBJECTIVE
|
||||
Detect project type and configure CI/CD deployment to appropriate platform with environment management.
|
||||
|
||||
INPUTS (optional)
|
||||
- PLATFORM=auto|vercel|netlify|heroku|aws|gcp|docker|eas (default: auto-detect)
|
||||
- ENV=staging|production|both (default: both)
|
||||
- AUTO_DEPLOY=yes|no (default: no, manual trigger)
|
||||
|
||||
PROJECT DETECTION
|
||||
|
||||
Analyze project to determine deployment needs:
|
||||
|
||||
### Static Sites
|
||||
- **Indicators**: No backend, HTML/CSS/JS, React/Vue/Angular SPA
|
||||
- **Platforms**: Vercel, Netlify, GitHub Pages, Cloudflare Pages
|
||||
- **Recommended**: Vercel (for React/Next.js), Netlify (for general static)
|
||||
|
||||
### Full-Stack Web Apps
|
||||
- **Indicators**: Node.js server, Express/Fastify/Next.js API routes
|
||||
- **Platforms**: Vercel (Next.js), Heroku, Railway, Fly.io, AWS (ECS/Lambda)
|
||||
- **Recommended**: Vercel (Next.js), Railway (Docker)
|
||||
|
||||
### Mobile Apps (React Native / Expo)
|
||||
- **Indicators**: expo config, react-native
|
||||
- **Platforms**: EAS Build, App Center
|
||||
- **Recommended**: EAS (Expo Application Services)
|
||||
|
||||
### Containers
|
||||
- **Indicators**: Dockerfile present
|
||||
- **Platforms**: Docker Hub, AWS ECR, GCP Artifact Registry, Fly.io
|
||||
- **Recommended**: Fly.io (easy Docker deploy)
|
||||
|
||||
### Serverless Functions
|
||||
- **Indicators**: Lambda functions, API Gateway config
|
||||
- **Platforms**: AWS Lambda, Vercel Functions, Netlify Functions
|
||||
- **Recommended**: Vercel Functions (for Next.js), AWS SAM
|
||||
|
||||
DEPLOYMENT CONFIGURATIONS
|
||||
|
||||
### Vercel (Next.js / Static)
|
||||
|
||||
Create `vercel.json`:
|
||||
```json
|
||||
{
|
||||
"buildCommand": "npm run build",
|
||||
"outputDirectory": "dist",
|
||||
"framework": "nextjs",
|
||||
"env": {
|
||||
"DATABASE_URL": "@database-url-staging",
|
||||
"API_KEY": "@api-key"
|
||||
},
|
||||
"build": {
|
||||
"env": {
|
||||
"NEXT_PUBLIC_API_URL": "https://api.example.com"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
GitHub Actions:
|
||||
```yaml
|
||||
name: Deploy to Vercel
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Deploy to Vercel
|
||||
uses: amondnet/vercel-action@v25
|
||||
with:
|
||||
vercel-token: ${{ secrets.VERCEL_TOKEN }}
|
||||
vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
|
||||
vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
|
||||
vercel-args: '--prod'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Netlify (Static Sites)
|
||||
|
||||
Create `netlify.toml`:
|
||||
```toml
|
||||
[build]
|
||||
command = "npm run build"
|
||||
publish = "dist"
|
||||
|
||||
[build.environment]
|
||||
NODE_VERSION = "20"
|
||||
|
||||
[[redirects]]
|
||||
from = "/*"
|
||||
to = "/index.html"
|
||||
status = 200
|
||||
|
||||
[context.production.environment]
|
||||
API_URL = "https://api.example.com"
|
||||
|
||||
[context.staging.environment]
|
||||
API_URL = "https://staging-api.example.com"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Heroku (Node.js)
|
||||
|
||||
Create `Procfile`:
|
||||
```
|
||||
web: npm start
|
||||
```
|
||||
|
||||
Create `app.json`:
|
||||
```json
|
||||
{
|
||||
"name": "my-app",
|
||||
"description": "My application",
|
||||
"buildpacks": [
|
||||
{
|
||||
"url": "heroku/nodejs"
|
||||
}
|
||||
],
|
||||
"env": {
|
||||
"NODE_ENV": {
|
||||
"value": "production"
|
||||
},
|
||||
"DATABASE_URL": {
|
||||
"description": "PostgreSQL connection string",
|
||||
"required": true
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
GitHub Actions:
|
||||
```yaml
|
||||
name: Deploy to Heroku
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Deploy to Heroku
|
||||
uses: akhileshns/heroku-deploy@v3.13.15
|
||||
with:
|
||||
heroku_api_key: ${{ secrets.HEROKU_API_KEY }}
|
||||
heroku_app_name: "my-app-production"
|
||||
heroku_email: "deploy@example.com"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Docker (Fly.io / AWS / GCP)
|
||||
|
||||
Create `Dockerfile`:
|
||||
```dockerfile
|
||||
FROM node:20-alpine AS builder
|
||||
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
RUN npm ci
|
||||
COPY . .
|
||||
RUN npm run build
|
||||
|
||||
FROM node:20-alpine
|
||||
|
||||
WORKDIR /app
|
||||
COPY --from=builder /app/dist ./dist
|
||||
COPY --from=builder /app/node_modules ./node_modules
|
||||
COPY package*.json ./
|
||||
|
||||
EXPOSE 3000
|
||||
CMD ["npm", "start"]
|
||||
```
|
||||
|
||||
Create `.dockerignore`:
|
||||
```
|
||||
node_modules
|
||||
.git
|
||||
.env
|
||||
*.log
|
||||
dist
|
||||
coverage
|
||||
```
|
||||
|
||||
For Fly.io, create `fly.toml`:
|
||||
```toml
|
||||
app = "my-app"
|
||||
|
||||
[build]
|
||||
dockerfile = "Dockerfile"
|
||||
|
||||
[env]
|
||||
NODE_ENV = "production"
|
||||
PORT = "8080"
|
||||
|
||||
[[services]]
|
||||
internal_port = 8080
|
||||
protocol = "tcp"
|
||||
|
||||
[[services.ports]]
|
||||
port = 80
|
||||
handlers = ["http"]
|
||||
|
||||
[[services.ports]]
|
||||
port = 443
|
||||
handlers = ["tls", "http"]
|
||||
```
|
||||
|
||||
Deploy command:
|
||||
```bash
|
||||
fly deploy
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### EAS (Expo / React Native)
|
||||
|
||||
Create `eas.json`:
|
||||
```json
|
||||
{
|
||||
"cli": {
|
||||
"version": ">= 5.9.0"
|
||||
},
|
||||
"build": {
|
||||
"development": {
|
||||
"developmentClient": true,
|
||||
"distribution": "internal"
|
||||
},
|
||||
"preview": {
|
||||
"distribution": "internal",
|
||||
"android": {
|
||||
"buildType": "apk"
|
||||
}
|
||||
},
|
||||
"production": {
|
||||
"autoIncrement": true
|
||||
}
|
||||
},
|
||||
"submit": {
|
||||
"production": {
|
||||
"ios": {
|
||||
"appleId": "user@example.com",
|
||||
"ascAppId": "1234567890"
|
||||
},
|
||||
"android": {
|
||||
"serviceAccountKeyPath": "./secrets/google-service-account.json",
|
||||
"track": "internal"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
GitHub Actions:
|
||||
```yaml
|
||||
name: EAS Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
|
||||
- name: Setup Expo
|
||||
uses: expo/expo-github-action@v8
|
||||
with:
|
||||
expo-version: latest
|
||||
eas-version: latest
|
||||
token: ${{ secrets.EXPO_TOKEN }}
|
||||
|
||||
- name: Build on EAS
|
||||
run: eas build --platform all --non-interactive --no-wait
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### AWS (Serverless / Lambda)
|
||||
|
||||
Create `serverless.yml`:
|
||||
```yaml
|
||||
service: my-app
|
||||
|
||||
provider:
|
||||
name: aws
|
||||
runtime: nodejs20.x
|
||||
region: us-east-1
|
||||
stage: ${opt:stage, 'dev'}
|
||||
environment:
|
||||
NODE_ENV: production
|
||||
DATABASE_URL: ${ssm:/my-app/${self:provider.stage}/database-url}
|
||||
|
||||
functions:
|
||||
api:
|
||||
handler: dist/index.handler
|
||||
events:
|
||||
- http:
|
||||
path: /{proxy+}
|
||||
method: ANY
|
||||
cors: true
|
||||
|
||||
plugins:
|
||||
- serverless-offline
|
||||
- serverless-dotenv-plugin
|
||||
```
|
||||
|
||||
GitHub Actions:
|
||||
```yaml
|
||||
name: Deploy to AWS Lambda
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
|
||||
- name: Install Serverless Framework
|
||||
run: npm install -g serverless
|
||||
|
||||
- name: Deploy
|
||||
run: serverless deploy --stage production
|
||||
env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
ENVIRONMENT MANAGEMENT
|
||||
|
||||
Create `.env.example`:
|
||||
```env
|
||||
# Database
|
||||
DATABASE_URL=postgresql://user:pass@localhost:5432/mydb
|
||||
|
||||
# API Keys (DO NOT commit actual keys)
|
||||
API_KEY=your_api_key_here
|
||||
STRIPE_SECRET_KEY=sk_test_...
|
||||
|
||||
# Third-party Services
|
||||
SENDGRID_API_KEY=
|
||||
AWS_ACCESS_KEY_ID=
|
||||
AWS_SECRET_ACCESS_KEY=
|
||||
|
||||
# App Config
|
||||
NODE_ENV=development
|
||||
PORT=3000
|
||||
```
|
||||
|
||||
Create docs/02-practices/secrets-management.md:
|
||||
```markdown
|
||||
# Secrets Management
|
||||
|
||||
## DO NOT commit secrets to Git
|
||||
- Never commit `.env` files
|
||||
- Use `.env.example` for templates only
|
||||
|
||||
## Deployment Platforms
|
||||
|
||||
### Vercel
|
||||
\`\`\`bash
|
||||
vercel env add DATABASE_URL production
|
||||
\`\`\`
|
||||
|
||||
### Heroku
|
||||
\`\`\`bash
|
||||
heroku config:set DATABASE_URL="postgres://..." --app my-app
|
||||
\`\`\`
|
||||
|
||||
### GitHub Actions
|
||||
Add secrets in Settings → Secrets and variables → Actions
|
||||
|
||||
## Local Development
|
||||
1. Copy `.env.example` to `.env`
|
||||
2. Fill in actual values (get from team lead)
|
||||
3. Never commit `.env` to git
|
||||
```
|
||||
|
||||
DEPLOYMENT WORKFLOW
|
||||
|
||||
### Staging → Production Flow
|
||||
|
||||
```yaml
|
||||
name: Deploy
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main # → production
|
||||
- staging # → staging
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Determine environment
|
||||
id: env
|
||||
run: |
|
||||
if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then
|
||||
echo "environment=production" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "environment=staging" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Deploy
|
||||
run: ./deploy.sh
|
||||
env:
|
||||
ENVIRONMENT: ${{ steps.env.outputs.environment }}
|
||||
```
|
||||
|
||||
WORKFLOW SUMMARY
|
||||
|
||||
1. Detect project type
|
||||
2. Recommend platform
|
||||
3. Show configuration preview:
|
||||
```
|
||||
Deployment Setup for: Node.js web app
|
||||
Recommended platform: Vercel
|
||||
|
||||
Will create:
|
||||
- vercel.json (deployment config)
|
||||
- .github/workflows/deploy.yml (CI/CD)
|
||||
- .env.example (secrets template)
|
||||
- docs/02-practices/deployment.md (guide)
|
||||
|
||||
Environments:
|
||||
- Staging: staging.example.com (branch: staging)
|
||||
- Production: example.com (branch: main)
|
||||
|
||||
Proceed? (YES/NO)
|
||||
```
|
||||
|
||||
4. If YES:
|
||||
- Create config files
|
||||
- Update CI workflows
|
||||
- Create deployment docs
|
||||
- Show next steps
|
||||
|
||||
NEXT STEPS
|
||||
|
||||
After setup, guide user:
|
||||
```
|
||||
✅ Deployment configuration created!
|
||||
|
||||
Next steps:
|
||||
1. Add secrets to platform:
|
||||
- For Vercel: `vercel env add DATABASE_URL`
|
||||
- For GitHub Actions: Settings → Secrets
|
||||
|
||||
2. Connect repository to platform:
|
||||
- Vercel: `vercel link`
|
||||
- Heroku: `heroku git:remote -a my-app`
|
||||
|
||||
3. Test deployment:
|
||||
- Push to staging branch: `git push origin staging`
|
||||
- Check logs: `vercel logs` or platform dashboard
|
||||
|
||||
4. Deploy to production:
|
||||
- Merge staging → main
|
||||
- Or manually: `vercel --prod`
|
||||
|
||||
5. Set up custom domain (optional):
|
||||
- Vercel: `vercel domains add example.com`
|
||||
- Netlify: Netlify dashboard → Domain settings
|
||||
|
||||
Documentation: docs/02-practices/deployment.md
|
||||
```
|
||||
|
||||
INTEGRATION
|
||||
|
||||
- Create story: "US-XXXX: Set up deployment pipeline"
|
||||
- Update docs/02-practices/deployment.md
|
||||
- Add deployment status to docs/08-project/README.md
|
||||
|
||||
RULES
|
||||
- Preview all files before creating (diff-first, YES/NO)
|
||||
- Never commit secrets to repository
|
||||
- Always use environment variables
|
||||
- Set up staging environment first
|
||||
- Test deployment before going to production
|
||||
- Document rollback procedure
|
||||
|
||||
OUTPUT
|
||||
- Platform recommendation
|
||||
- Deployment configuration files
|
||||
- CI/CD workflow
|
||||
- Environment management guide
|
||||
- Next steps checklist
|
||||
Reference in New Issue
Block a user