📖
GitHub Actionsでジョブ間で値を共有する方法
はじめに
GitHubActionsのワークフローにて、ジョブにて取得した値を後続のジョブに渡したい要件があったので、ジョブ間で値を共有する方法を調査したメモです。
ジョブとは?
ジョブ
ジョブは、同じランナーで実行される一連のステップです。 デフォルトでは、複数のジョブを含むワークフローは、それらのジョブを並行して実行します。
ランナー
ランナーは、GitHub Actionsランナーアプリケーションがインストールされているサーバーです。 GitHub がホストするランナーを使用することも、自分でランナーをホストすることもできます。 ランナーは、使用可能なジョブをリッスンし、一度に 1 つのジョブを実行し、進行状況、ログ、および結果を GitHub に返します。
ジョブ間で値を共有するということはサーバー間で情報の受け渡しをするということ。
コンテキストとは?
GitHub Actionsは、コンテキストと呼ばれる変数の集合と、デフォルトの環境変数と呼ばれる同様の変数の集合を含みます。
デフォルトの環境変数
これらの変数は、ジョブを実行しているランナー上にのみ存在します。
コンテキスト
ほとんどのコンテキストはワークフローの任意の場所で利用できます。これは、デフォルトの環境変数が利用できない場所も含みます。
コンテキストを使うことでジョブ間での値の共有ができる。
needsコンテキスト
needsコンテキストは、現在のジョブの依存関係として定義されたすべてのジョブからの出力を含みます。
ジョブから値を出力する方法は?
jobs.<job_id>.outputs
ジョブからの出力のmapです。 ジョブの出力は、そのジョブに依存しているすべての下流のジョブから利用できます。 ジョブの依存関係の定義に関する詳しい情報についてはjobs.<job_id>.needsを参照してください。
サンプル
jobs:
job1:
runs-on: ubuntu-latest
# ステップの出力をジョブの出力にマップする
outputs:
output1: ${{ steps.step1.outputs.test }}
output2: ${{ steps.step2.outputs.test }}
steps:
- id: step1
run: echo "::set-output name=test::hello"
- id: step2
run: echo "::set-output name=test::world"
job2:
runs-on: ubuntu-latest
needs: job1
steps:
- run: echo ${{needs.job1.outputs.output1}} ${{needs.job1.outputs.output2}}
Discussion