Q: What is the difference between public and private workflow repositories in GitHub Actions, and how do you secure them?
Architectural comparison and security trade-offs between public and private GitHub Actions workflow repositories: internal sharing policies, caller permissions, secret inheritance risks, and organization-level repository access.
#CI/CD #GitHub Actions #Security #Reusable Workflows #Secrets Management #Access Control
🎙️ Candidate Opening & Architectural Context
"Public workflow repositories can be referenced across any repository on GitHub but must never contain sensitive defaults, internal URLs, or privileged assumptions. Private workflow repositories are restricted to authorized organization members or configured repositories, making them ideal for proprietary deployment pipelines. In both cases, secret access is controlled by the caller workflow and organization policy rather than the reusable workflow file alone."
Advertisement
🛠️ Production Runbook & Step-by-Step Resolution
1️⃣
Architectural Differences & Organization Access Settings
Understand how GitHub evaluates access permissions between caller workflows and workflow repositories:
# Referencing public shared workflows
uses: org/public-workflows/.github/workflows/lint.yml@v1
# Referencing private/internal enterprise workflows
uses: org/platform-workflows/.github/workflows/deploy.yml@v3
# Inspect repository visibility via GitHub CLI
gh repo view org/platform-workflows --json name,visibility,defaultBranchRef
- Public Workflow Repos: Accessible to anyone across GitHub. Anyone can consume the workflow by referencing
org/repo/.github/workflows/file.yml@v1. Useful for open-source linting and testing actions. - Private Workflow Repos: Access is restricted by GitHub organization settings (Repository Settings -> Actions -> Access -> 'Accessible from repositories in this organization').
- Internal Repositories: In GitHub Enterprise, 'internal' visibility allows all enterprise members to consume shared workflows without making them publicly accessible.
2️⃣
Secret Inheritance & Supply Chain Security Hardening
Guard against credential leaks and untrusted workflow modification:
# Secure invocation of reusable workflow with explicit secrets
jobs:
deploy:
uses: org/platform-workflows/.github/workflows/deploy.yml@v3
with:
environment: 'production'
secrets:
AWS_ROLE_ARN: ${{ secrets.PROD_AWS_ROLE_ARN }}
- Secret Management: Reusable workflows cannot access caller secrets unless explicitly passed via
secrets:or inherited viasecrets: inherit. - Never Hardcode Secrets or Internal Endpoints: Public reusable workflows must accept all endpoints, tokens, and configs strictly via typed
inputs:. - Tag & Commit Pinning: Pin reusable workflows to immutable full commit SHAs (e.g.,
@a1b2c3d...) in production pipelines rather than mutable branch names to protect against supply-chain tampering.
💡 The Senior SRE Gold Nugget (Key Architectural Takeaway)
"Public repos are for open, generic utility actions and must never contain internal assumptions. Private/internal repos host proprietary release logic with organization-level access controls and explicit secret passing."
⚡ 60-Second Elevator Pitch Talking Points
- Public workflow repos provide global access for generic tasks but require strict input sanitization and zero internal assumptions.
- Private and internal workflow repos are restricted to organization members for sensitive deployment logic.
- Control secret access strictly via explicit caller bindings or secrets: inherit, and pin workflows to commit SHAs for supply chain security.
Advertisement