はじめに
こんにちは! 私は教育支援小中高プロダクト開発部に所属し、スタディサプリの小中学生向けサービスの開発・運用を担当しています。
今回は、GitHub Actions で異なる Workflow 間で Artifact をやり取りする方法について解説します。 業務の中で、異なる Workflow 間での Artifact のやり取りが必要な場面があり、少々手間がかかりました。
Artifact とは?
まず、Artifact とは GitHub Actions における実行結果のファイルやデータのことを指します。 Workflow が実行されると、生成されたビルド結果やテストレポート、ログファイルなどが保存されることがありますが、これらを他のジョブや Workflow に渡すために保存したものが「Artifact」です。
例えば、ビルド結果のバイナリといった Workflow の成果物を次のテストジョブやデプロイジョブに渡したい場合、upload-artifact
アクションを使ってそれらを保存しておき、別のジョブや Workflow で download-artifact
アクションを使用して取得することで、異なる処理間でデータを共有できるのです。
このようにして Artifact を活用することで、複数のジョブや Workflow をまたがってスムーズにデータの受け渡しが可能になります。
使用するツールとバージョンについて
今回は GitHub Actions の Artifact 処理用のアクション upload-artifact
と download-artifact
を使用します。
具体的には以下の v4 バージョンを使うことを前提としています。
注意点として、両方のアクションのバージョンは揃えておく必要があります。
バージョンを揃える理由
upload-artifact
と download-artifact
の両アクションでバージョンを揃える必要があるのは、互換性の問題を避けるためです。
具体的には、v3 から v4 にアップデートする際にいくつかの breaking changes が加えられたため、バージョンを揃えないと予期せぬ動作やエラーが発生する可能性があります。
詳細は 公式ドキュメント に記載されています。
Artifact のやり取りする基本的な方法
異なる Workflow 間で Artifact を受け渡すには、upload-artifact
を実行した Workflow の run_id
がわかれば良いです。
GitHub Actions のドキュメントによれば、以下のリンク先に説明がある通り、run_id
を指定することで他の Workflow から Artifact をダウンロード可能です。
run_id を取得する方法
次に、run_id
を取得する方法について解説します。
まず、対象の Workflow の workflow_id
から runs
を取得する必要があります。以下の API を利用して、指定した Workflow の実行履歴を取得できます。
なお、 check-runs API
も run_id
の取得に役立つ場合がありますが、注意が必要です。
例えば、check suite に紐づかない workflow-dispatch などで実行された Workflow の場合、この API では run_id を取得できません。
この API で取得した実行結果を jq
コマンドでフィルタリングすると、特定の Workflow 実行の run_id
を取得できます。以下のコマンドがその例です。
jq -r '.workflow_runs[] | select(.name == "<name>") | .id'
まとめ
GitHub Actions で異なる Workflow 間で Artifact をやり取りする方法を解説しました。 最後までお読みいただき、ありがとうございました!