GitHub ActionsはJobごとに別々のGitHub Actions Runnerで実行され、つまり別々のOSで実行されるのでJob間でデータを共有するには工夫が必要となる。
解決策の1つにArtifactsのUpload/Downloadがあって、少々面倒ではあるが、他に手っ取り早い方法もなさそうだしこれでよいだろうという理解だった。 残念ながら今のところGitHub ActionsにはJob間で共有可能なグローバルスコープの変数はなく・・・
ArtifactsのUpload/DownloadによるJob間のデータ共有する方法
共有したいデータをファイルに書き出しactions/upload-artifactでArtifactとしてアップロードし、別のJobでactions/download-artifactを使ってそのArtifactを読み込みデータを取得する
詳しくはこちらを参照ください - Passing data between jobs in a workflow
ところが、こちらのStackoverflow投稿でもっと手軽な良い方法が紹介されていた。それがjobs.<jobs_id>.outputs
。2020年4月にアナウンスされた機能のようだ。
公式ページには次のように説明されている。
A map of outputs for a job. Job outputs are available to all downstream jobs that depend on this job. For more information on defining job dependencies, see jobs..needs.
Job outputs are strings, and job outputs containing expressions are evaluated on the runner at the end of each job. Outputs containing secrets are redacted on the runner and not sent to GitHub Actions.
つまり、あるJobにおける処理結果をjobs.<jobs_id>.outputs
でマッピングすることができて、その後のJobでそいつを参照できるのだ。 ArtifactsのUpload/Downloadのようにわざわざファイルのアップ・ダウンロードする必要もなく、手軽で直感的。
サンプルをそのまま抜粋するが、後続のjob2ではjob1のマッピングされた出力結果を${{needs.job1.outputs.output1}}
で参照している。
jobs:
job1:
runs-on: ubuntu-latest
# Map a step output to a job output
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}}
ref: https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idoutputs
簡単なテキストデータであればこれでよいのではないだろうか