できない.dev

GitHub Actions でステップ間に環境変数が引き継げない

run 内の export は各ステップ独立のシェルプロセス内でしか有効でない。
後続ステップへは GITHUB_ENV への追記、ジョブをまたぐ場合は jobs.outputs と needs を使うのが正しい受け渡し方法。

公開: 更新:

実行例あり(2026-09-23 に実環境で検証)

要約

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

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

よくある原因

  1. export のスコープ誤解: シェルの export はプロセス単位で、ステップが終わればシェルごと破棄される。
  2. 同一ステップ内での参照: GITHUB_ENV に書いた変数が有効になるのは次のステップから。
  3. ジョブ間で期待している: ジョブは別の runner で動くため、GITHUB_ENV はジョブをまたげない。
  4. 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: で依存を宣言して参照する(公式ドキュメント(新しいタブで開く))。

この記事は役立ちましたか?