Skip to content
Latchkey

GitHub Actions secrets: inherit not reaching a nested reusable workflow in CI

When workflows are nested, secrets: inherit passes the current context down one level. A middle workflow that does not itself inherit or forward secrets breaks the chain, so the deepest workflow sees nothing.

What this error means

The top caller inherits secrets and the first-level workflow works, but a second-level reusable workflow reports a secret as empty or not found.

GitHub Actions
Error: Secret DEPLOY_TOKEN not found in "./.github/workflows/inner.yml".
The middle workflow "outer.yml" did not forward secrets to "inner.yml".

Common causes

A middle workflow does not forward secrets

The outer reusable workflow received secrets via inherit, but its own call to the inner workflow has no secrets: inherit or explicit map, so the chain breaks.

Mixing inherit with explicit across levels

One level inherits while another expects explicit named secrets that were never mapped, leaving gaps in the chain.

How to fix it

Inherit at every level of the chain

  1. Add secrets: inherit to each nested call, not just the top one.
  2. Verify every workflow that calls another forwards secrets.
  3. Re-run and confirm the deepest workflow receives the secret.
.github/workflows/outer.yml
# outer.yml calling inner.yml
jobs:
  inner:
    uses: ./.github/workflows/inner.yml
    secrets: inherit

Forward specific secrets explicitly at each level

If you avoid inherit, declare and map the secret at every level so it propagates fully.

.github/workflows/outer.yml
secrets:
  DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}

How to prevent it

  • Add secrets: inherit (or explicit maps) at every nesting level.
  • Keep the secret-passing strategy consistent through the chain.
  • Keep nesting shallow so secret propagation is easy to reason about.

Related guides

Tired of flaky CI? Latchkey auto-heals failed jobs and retries them for you. Start free →