概要
一念発起してGitHub Actionsのドキュメントを全部読んだので、忘れてしまいそうなことをメモしておく。
書くこと
- 前段のstep・jobで発生したデータを、後段のstep・jobから参照する方法
- それぞれの方法をyamlとして記述する例(いずれも
foobarbaz
というテキストデータをやりとりする単純なもの)
書かないこと
- データの受け渡しに関するベストプラクティス(どちらかというと様々な方法を紹介することにフォーカスする)
- GitHub Actionsにおけるstep・jobといった概念の説明(これについて知りたい場合はこちらの記事が参考になりそう)
stepをまたぐデータの受け渡し
outputとして渡す(ドキュメント)
workflow commandを使ってoutputを設定する方法。jobをまたぐデータの受け渡しも、同じworkflow commandを使ったりする(後述)
on: [push]
jobs:
sample-job:
runs-on: ubuntu-latest
steps:
- id: first
run: echo '::set-output name=VALUE::foobarbaz'
- id: second
run: echo ${{ steps.first.outputs.VALUE }}
ファイルとして渡す(ドキュメント)
同じjob内のstepは、同じrunner上で順番に実行される。そのため以下のように、前段で作成したファイルを後段で参照することができる。
on: [push]
jobs:
sample-job:
runs-on: ubuntu-latest
steps:
- run: echo "foobarbaz" > ./output
- run: cat ./output
環境変数として渡す(ドキュメント)
以下のように$GITHUB_ENV
が示すファイルに環境変数を追記すると、次のstepからその環境変数を参照できる。
on: [push]
jobs:
sample-job:
runs-on: ubuntu-latest
steps:
- run: echo "VALUE=foobarbaz" >> $GITHUB_ENV
- run: echo $VALUE
serviceを利用して渡す(ドキュメント)
サービスコンテナとしてDBを起動すれば、それ経由でデータの受け渡しが可能。このような使い方を意図したものではないかもしれないが、できるものはできる。サービスコンテナはjobが完了した時点で消える。
on: [push]
jobs:
sample-job:
runs-on: ubuntu-latest
services:
redis:
image: redis
steps:
- uses: docker://redis:latest
with:
entrypoint: redis-cli
args: -h redis set value foobarbar
- uses: docker://redis:latest
with:
entrypoint: redis-cli
args: -h redis get value
jobをまたぐデータの受け渡し
outputとして渡す(ドキュメント)
$${{ steps.stepid.outputs.value }}
を前段のjobのoutputとして、後段のjobからそれを参照している。needs
を忘れないように注意!
on: [push]
jobs:
first-job:
runs-on: ubuntu-latest
outputs:
value: ${{ steps.stepid.outputs.value }}
steps:
- id: stepid
run: echo "::set-output name=value::foobarbaz"
second-job:
runs-on: ubuntu-latest
needs: first-job
steps:
- run: echo ${{ needs.first-job.outputs.value }}
artifactとして渡す(ドキュメント)
ファイルとして受け渡す。workflow終了後、手元にダウンロードして確認できるというメリットもある。
on: [push]
jobs:
first-job:
runs-on: ubuntu-latest
steps:
- run: echo 'foobarbaz' > ./value.txt
- uses: actions/upload-artifact@v3
with:
name: sample-artifact
path: value.txt
second-job:
runs-on: ubuntu-latest
needs: first-job
steps:
- uses: actions/download-artifact@v3
with:
name: sample-artifact
- run: cat ./value.txt
以上!!公式ドキュメントだと一か所にまとめて記載されているわけでないので、記事としてまとめたことには意味があるはず...