できない.dev

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_OUTPUTjobs.<job_id>.outputs + needs を使う。

よくある原因

  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: で依存を宣言して参照する(公式ドキュメント)。

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