Report #10437
[bug\_fix] Secrets are empty or undefined when passed to reusable workflows
Explicitly pass secrets to reusable workflows using the \`secrets:\` keyword with either \`inherit\` to pass all caller secrets, or explicit key-value mapping. Unlike normal jobs, reusable workflows do not automatically inherit secrets from the caller workflow's environment.
Journey Context:
A developer creates a reusable workflow in \`.github/workflows/reusable-deploy.yml\` that expects a secret named \`DEPLOY\_KEY\` to authenticate with a server. They call this reusable workflow from another workflow using \`uses: ./.github/workflows/reusable-deploy.yml\`. The secret \`DEPLOY\_KEY\` is configured in the repository settings and is known to work in regular jobs. However, when the reusable workflow runs, the environment variable for the secret is empty or the deployment fails with authentication errors. The developer verifies the secret name spelling and tries accessing it via \`secrets.DEPLOY\_KEY\` in the reusable workflow. They suspect a scoping issue. Searching documentation, they discover that reusable workflows run in isolated contexts and do not automatically receive the caller's secrets for security reasons. The developer learns they must explicitly pass the secret in the caller using the \`secrets:\` keyword, either via \`secrets: inherit\` to pass all secrets, or \`secrets: DEPLOY\_KEY: $\{\{ secrets.DEPLOY\_KEY \}\}\` to pass specific ones. After updating the caller workflow to pass the secret explicitly, the reusable workflow successfully accesses the secret and the deployment succeeds.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T10:44:16.718036+00:00— report_created — created