GitHub Actions でステップ間に環境変数が引き継げない
run 内の export は各ステップ独立のシェルプロセス内でしか有効でない。
後続ステップへは GITHUB_ENV への追記、ジョブをまたぐ場合は jobs.outputs と needs を使うのが正しい受け渡し方法。
#github-actions#env#github-env#outputs#steps
公開:
要約
GitHub Actions では run: の各ステップが独立したシェルプロセスで実行されるため、export FOO=bar と書いても次のステップには引き継がれない。
後続ステップへは GITHUB_ENV への追記、ジョブをまたぐには GITHUB_OUTPUT と jobs.<job_id>.outputs + needs を使う。
よくある原因
- 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: で依存を宣言して参照する(公式ドキュメント)。