Set up or align GitHub repo settings, branch/ruleset policy, templates, Actions hardening, Environments, release workflows, and deploy workflows for continuously publishable or deployable repositories.
97
100%
Does it follow best practices?
Impact
96%
1.35xAverage score across 7 eval scenarios
Passed
No known issues
Use this reference when wiring deploy credentials, target selection, and manual promotion. The skill intentionally avoids provider cookbooks. Keep platform-specific deployment logic in repo-owned scripts, SST, or infrastructure code, and keep the GitHub Actions contract small.
Every deploy lane declares a GitHub Environment:
deploy-web:
environment:
name: production
url: ${{ steps.deploy.outputs.url }}
concurrency:
group: deploy-production-web
cancel-in-progress: falsestaging, production, preview, or a repo-specific equivalent.inputs.ref, validate that ref separately before checkout or credential loading.Prefer short-lived identity over static tokens:
permissions:
contents: read
id-token: write
steps:
- name: Assume deploy identity
run: ./scripts/ci/assume-deploy-identity --environment productionstaging or production GitHub Environments, not as repository-level secrets.SST is a good deploy layer when the repo owns both app code and infrastructure. Treat it as the provider-thin promotion step, not as a reason to weaken the workflow boundary:
- run: pnpm sst deploy --stage productionstaging, production, preview names) so secrets and approvals stay visible in GitHub.prod and staging explicit stages/projects.Deploy jobs promote the payload produced by verify:
- run: ./scripts/prepare-deploy-payload --ref "$VERIFIED_PAYLOAD_REF" --out apps/web/dist
- run: ./scripts/deploy-web --payload apps/web/dist --environment productionSeparate three layers:
Rules:
Manual workflow_dispatch deploys are promotion paths, not build paths:
on:
workflow_dispatch:
inputs:
ref: { type: string, required: true }
environment: { type: choice, options: [staging, production], required: true }
lane: { type: choice, options: [web, api], required: true }inputs.ref, inputs.environment, and inputs.lane in a secretless job.main.yml.