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 to keep deploy credentials short-lived, scoped, and quiet in logs. Prefer OIDC and GitHub Environments over provider-specific static-token recipes.
Deploy workflows usually touch three secret classes:
Keep these classes separate. Repo-level secrets are bootstrap-only; production deploy credentials and runtime secrets belong to GitHub Environments or the provider's secret system.
When the provider supports federation, use GitHub's OIDC token instead of long-lived credentials:
deploy:
permissions:
contents: read
id-token: write
environment:
name: production
steps:
- run: ./scripts/ci/assume-deploy-identity --environment productionThe provider trust policy should bind at least:
Use one identity per blast radius. Production and staging should not share the same provider role.
Use static tokens only when federation is unavailable or the provider API does not support it.
Runtime secrets should be resolved by the deploy provider or environment-specific secret store whenever possible. If the workflow must render runtime config:
$RUNNER_TEMPDo not commit plaintext runtime values. Template files may contain secret-store references when those references are non-sensitive without their corresponding access token.
GitHub masks declared secrets in logs. It does not reliably mask:
Rules:
set -x in deploy scripts.