A deployment pipeline automates delivery to staging and production. Today you will deploy to a cloud platform after tests pass, using environment protection rules to require manual approval for production.
# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20', cache: 'npm' }
- run: npm ci && npm test
deploy-staging:
needs: test
runs-on: ubuntu-latest
environment: staging
steps:
- uses: actions/checkout@v4
- name: Deploy to Render (staging)
run: |
curl -X POST ${{ secrets.RENDER_STAGING_DEPLOY_HOOK }}
deploy-production:
needs: deploy-staging
runs-on: ubuntu-latest
environment: production # requires manual approval
steps:
- uses: actions/checkout@v4
- name: Deploy to Render (production)
run: |
curl -X POST ${{ secrets.RENDER_PROD_DEPLOY_HOOK }}# Deploy to Fly.io
- uses: superfly/flyctl-actions/setup-flyctl@master
- run: flyctl deploy --remote-only
env:
FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}