GitHub Actions - 再利用可能ワークフローを使う

| 3 min read
Author: masahiro-kondo masahiro-kondoの画像

GitHub Actions のワークフローから別のワークフローを再利用する機能が昨年11月にリリースされました。この機能がなくて不便に感じていた人も多いのではないでしょうか。

シンプルなワークフローを作って試してみました。

呼び出し側のワークフロー。同一リポジトリのワークフローを呼び出すには、uses キーワードを使ってプロジェクトルートからの相対パスで .github/workflow 配下のワークフローファイルを指定します。通常のジョブと違って runs-on などは指定しません。

name: Caller Job
on:
workflow_dispatch:

jobs:
Reuse:
uses: ./.github/workflows/callee.yml

呼び出されるワークフロー。ワークフローのトリガーには workflow_call を指定します。runs-on は呼び出される側で指定します。

name: Callee Job
on:
workflow_call:

jobs:
Build:
runs-on: ubuntu-latest
steps:
- run: echo called!

呼び出し側のワークフローを手動で実行しました。呼び出し側と呼び出される側が1つにまとめられたジョブ Reuse / Build として表示されました。

ログを見ると、呼び出されるワークフローに書いた step の処理がそのまま出力されています。

呼び出し側フローに呼び出されるフローをインライン展開しているような動きですね。

公式ドキュメントによると再利用可能ワークフローには以下のような制限があります。

  1. 再利用可能ワークフローは他の再利用可能ワークフローを呼び出すことはできない
  2. プライベートリポジトリ内の再利用可能ワークフローは、同一リポジトリ内のワークフローでのみ使用可能
  3. 呼び出し元ワークフローで定義されたワークフローレベルの環境変数は呼び出されたワークフローに伝播されない
  4. strategy プロパティは、再利用可能ワークフローを呼び出すジョブではサポートされない

2番目の制約はちょっと残念ですね。1つのプライベートリポジトリに再利用可能ワークフローを集約して他のリポジトリのワークフローから呼ぶという使い方はできないようです。public なリポジトリのワークフローであれば以下のように指定可能です。

jobs:
Reuse1:
uses: mamezou-tech/reusable-flows/.github/workflows/reuse1.yml@main
Reuse2:
uses: mamezou-tech/reusable-flows/.github/workflows/reuse2.yml@v1
Information

2022年12月、プライベートリポジトリ内の再利用ワークフローも他のプライベートリポジトリからの呼び出しが可能になり、2の制約も解消されました。詳細は以下の記事を参照してください。

GitHub Actions - private リポジトリの Action と再利用可能ワークフローが呼び出しが可能に

4番目の制約によれば、マトリクス実行や fail-fast のような strategy の機能を呼び出し側ジョブで使えないということになります。

外部の Action を実行するのと同じ構文で、再利用可能ワークフローにパラメータを受け渡すことができます。 パラメータは with キーワードで指定します。 secret は secrets キーワードで渡せます。

jobs:
call-workflow-passing-data:
uses: octo-org/example-repo/.github/workflows/workflow-B.yml@main
with:
username: mona
secrets:
token: ${{ secrets.TOKEN }}

呼び出されるワークフローでは、パラメータや secret の名前、型などを指定します[1]${{ inputs.username }}${{ secrets.token }} のよう渡されたパラメータや secret を利用できます。

name: Reusable workflow example

on:
workflow_call:
inputs:
username:
required: true
type: string
secrets:
token:
required: true

jobs:
example_job:
name: Pass input and secrets to my-action
runs-on: ubuntu-latest
steps:
- uses: ./.github/workflows/my-action
with:
username: ${{ inputs.username }}
token: ${{ secrets.token }}

再利用可能なワークフローが使えることで、ビルドやテストなどのワークフローを個別のファイルに切り出して E2E テスト用のワークフローやリリース用のワークフローから利用できるようになりました。ワークフローのコード重複を削減するためにうまく利用したいですね。


  1. GitHub Actionsのメタデータ構文 - GitHub Docs ↩︎

豆蔵デベロッパーサイト - 先週のアクセスランキング
  1. 基本から理解するJWTとJWT認証の仕組み (2022-12-08)
  2. AWS認定資格を12個すべて取得したので勉強したことなどをまとめます (2022-12-12)
  3. Nuxt3入門(第4回) - Nuxtのルーティングを理解する (2022-10-09)
  4. Backstageで開発者ポータルサイトを構築する - 導入編 (2022-04-29)
  5. Nuxt3入門(第8回) - Nuxt3のuseStateでコンポーネント間で状態を共有する (2022-10-28)
  6. Viteベースの高速テスティングフレームワークVitestを使ってみる (2022-12-28)
  7. ORマッパーのTypeORMをTypeScriptで使う (2022-07-27)
  8. Nuxt3入門(第1回) - Nuxtがサポートするレンダリングモードを理解する (2022-09-25)
  9. GitHub Actions - 構成変数(環境変数)が外部設定できるようになったので用途を整理する (2023-01-16)
  10. Jest再入門 - 関数・モジュールモック編 (2022-07-03)