スタディサプリ Product Team Blog

株式会社リクルートが開発するスタディサプリのプロダクトチームのブログです

GitHub Actions の異なる Workflow 間で Artifact をやり取りする方法

はじめに

こんにちは! 私は教育支援小中高プロダクト開発部に所属し、スタディサプリの小中学生向けサービスの開発・運用を担当しています。

今回は、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-artifactdownload-artifact を使用します。 具体的には以下の v4 バージョンを使うことを前提としています。

注意点として、両方のアクションのバージョンは揃えておく必要があります。

バージョンを揃える理由

upload-artifactdownload-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 APIrun_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 をやり取りする方法を解説しました。 最後までお読みいただき、ありがとうございました!