GitHub Actions でステップ間に環境変数が引き継げない
run 内の export は各ステップ独立のシェルプロセス内でしか有効でない。
後続ステップへは GITHUB_ENV への追記、ジョブをまたぐ場合は jobs.outputs と needs を使うのが正しい受け渡し方法。
公開: 更新:
要約
GitHub Actions では run: の各ステップが独立したシェルプロセスで実行されるため、export FOO=bar と書いても次のステップには引き継がれない。
後続ステップへは GITHUB_ENV への追記、ジョブをまたぐには GITHUB_OUTPUT と jobs.<job_id>.outputs + needs を使う。
実行例
このワークフローを act 0.2.89 で push イベントとして実行すると、step1 で export した FOO は step2 では空のまま表示され、step3 で GITHUB_ENV に追記した値 baz は step4 から読めている。
$ act --version
act version 0.2.89$ act push -W .github/workflows/envvars.yml
[envvars/demo] ⭐ Run Main step1 export する
[envvars/demo] | step1 FOO=bar
[envvars/demo] ✅ Success - Main step1 export する [125.9976ms]
[envvars/demo] ⭐ Run Main step2 別プロセスなので見えない
[envvars/demo] | step2 FOO=[]
[envvars/demo] ✅ Success - Main step2 別プロセスなので見えない [122.9318ms]
[envvars/demo] ⭐ Run Main step3 GITHUB_ENV に追記する
[envvars/demo] ✅ Success - Main step3 GITHUB_ENV に追記する [116.7216ms]
[envvars/demo] ⭐ Run Main step4 後続ステップでは見える
[envvars/demo] | step4 FOO=[baz]
[envvars/demo] ✅ Success - Main step4 後続ステップでは見える [109.455ms]
[envvars/demo] 🏁 Job succeeded— 2026-09-23 時点の出力
検証環境
- 検証日
- 実行環境
local host (Windows 11 Home, Docker 29.1.3)- バージョン
- Node.js 22.14.0
- npm 10.9.2
- Git 2.48.1.windows.1
- Docker 29.1.3
この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。
よくある原因
- export のスコープ誤解: シェルの
exportはプロセス単位で、ステップが終わればシェルごと破棄される。 - 同一ステップ内での参照:
GITHUB_ENVに書いた変数が有効になるのは次のステップから。 - ジョブ間で期待している: ジョブは別の runner で動くため、
GITHUB_ENVはジョブをまたげない。 - id の付け忘れ:
steps.<id>.outputs.<name>で参照するには、出力した側のステップにid:が必須。
解決策
1. 後続ステップへは GITHUB_ENV
- run: echo "BUILD_ID=20260611" >> "$GITHUB_ENV"
- run: echo "$BUILD_ID"公式の workflow commands(新しいタブで開く) に定義された方式で、同一ジョブ内の後続ステップすべてから参照できる。
2. ステップの出力には GITHUB_OUTPUT と id
- id: meta
run: echo "tag=v1.2.3" >> "$GITHUB_OUTPUT"
- run: echo "${{ steps.meta.outputs.tag }}"環境変数ではなく「ステップの出力」として渡す方式。id: meta が無いと steps.meta.outputs.tag は解決できない。
3. ジョブ間は jobs.outputs と needs
jobs:
build:
runs-on: ubuntu-latest
outputs:
tag: ${{ steps.meta.outputs.tag }}
steps:
- id: meta
run: echo "tag=v1.2.3" >> "$GITHUB_OUTPUT"
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- run: echo "${{ needs.build.outputs.tag }}"ジョブの outputs に昇格させ、受け取る側は needs: で依存を宣言して参照する(公式ドキュメント(新しいタブで開く))。