GitHub Actions 再利用可能ワークフローでネスト呼び出しと Matrix strategy が解禁

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

以前の「GitHub Actions - 再利用可能ワークフローを使う」の記事時点では、以下のような制約がありました。

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

このたびのリリースで、1と4の制約が解消され、再利用可能ワークフローのネスト呼び出しが可能となるとともに、呼び出し元からの Matrix strategy も使えるようになりました。

GitHub Actions: Improvements to reusable workflows | GitHub Changelog

早速試してみましょう。まずはネスト呼び出しから。

呼び出し側のワークフロー。再利用可能ワークフローをパラメータ付きで呼び出します。

name: Use reusable flow

on:
workflow_dispatch:

jobs:
UseReusableFlow:
uses: kondoumh/iac-dev/.github/workflows/reusable-flow.yml@master
with:
param1: hoge

再利用可能ワークフロー第1階層。パラメータを受けて、さらに、再利用可能ワークフローにパラメータを渡して呼び出ます。

name: Reusable workflow A

on:
workflow_call:
inputs:
param1:
description: 'Param1'
required: true
type: string

jobs:
call-another-reusable:
uses: kondoumh/iac-dev/.github/workflows/reusable-nested-flow.yml@master
with:
param1: ${{ inputs.param1 }}

再利用可能ワークフロー第2階層。ここで本命のジョブが動きます。渡ってきたパラメータを出力します。

name: Reusable workflow B

on:
workflow_call:
inputs:
param1:
description: 'Param1'
required: true
type: string

jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Echo
run: echo "called from reusable flow with param ${{ inputs.param1 }}!"

実行してみると、ちゃんと最下層のジョブが実行され、パラメータの受け渡しもできました。

ネストワークフロー実行

Information

再利用可能ワークフローのネスト呼び出しは、ネストは4階層まで可能なようです。

You can connect up to four levels of workflows.

また、同一オーガニゼーションやエンタープライズでは、inherit キーワードにより、暗黙的なシークレットの受け渡しも可能です。詳しくはドキュメントを参照してください。

https://docs.github.com/en/actions/using-workflows/reusing-workflows#nesting-reusable-workflows

次に、Matrix strategy です。

呼び出し側のワークフロー。strategy/matrixtargetdevstageprod のようにデプロイ先の環境を matrix で指定しています。再利用可能ワークフローの target パラメータにこの matrix を指定することにより、target の要素分のジョブが起動されてパラレルに実行されます。

name: Dploy with matrix strategy

on:
workflow_dispatch:

jobs:
ReuseableMatrixJobForDeployment:
strategy:
matrix:
target: [dev, stage, prod]
uses: kondoumh/iac-dev/.github/workflows/deployment-reusable.yml@master
with:
target: ${{ matrix.target }}

再利用可能ワークフローの deployment-reusable.yml です。inputs.target でデプロイ先の環境を受け取り、ビルド、パッケージ、デプロイを行います(この例は単に echo しているだけ)。

name: Build & Deploy for given tareget

on:
workflow_call:
inputs:
target:
description: 'Target to deploy app'
required: true
type: string

env:
TARGET: ${{ inputs.target }}

jobs:

build:
runs-on: ubuntu-latest
steps:
- name: Build
run: echo "Build for $TARGET environment"
- name: Package
run: echo "Package for $TARGET environment"
- name: Deploy
run: echo "Deploy to $TARGET environment"
Information

もしワークフローでコンテナアプリケーションの CI/CD を行う場合、ビルドは1度だけでデプロイ先の差異は環境変数で対応するのが王道ですが、ここはあくまでサンプルということでご了承ください。

実行すると、matrix が展開され各環境のジョブが実行されました。

再利用可能ワークフロー matrix 実行結果

Information

ちなみに matrix とネスト呼び出しを混在させることはできますが、ジョブに依存関係を定義したりすると意図した動きをしませんでした。あまり凝ったことはできない模様です。

以上、再利用可能ワークフローの改善ポイントを見てきました。ワークフローコードの重複削減には有効なので、機会があったら使ってみたいと思います。

豆蔵デベロッパーサイト - 先週のアクセスランキング
  1. 自然言語処理初心者が「GPT2-japanese」で遊んでみた (2022-07-08)
  2. Tauri でデスクトップアプリ開発を始める (2022-07-08)
  3. Deno による Slack プラットフォーム(オープンベータ) (2022-09-27)
  4. Jest再入門 - 関数・モジュールモック編 (2022-07-03)
  5. ORマッパーのTypeORMをTypeScriptで使う (2022-07-27)
  6. 第1回 OpenAPI Generator を使ったコード生成 (2022-06-04)
  7. 直感が理性に大反抗!「モンティ・ホール問題」 (2022-07-04)
  8. Rust によるデスクトップアプリケーションフレームワーク Tauri (2022-03-06)
  9. 箱ひげ図で外れ値を確認する (2022-05-18)
  10. Nuxt3入門(第1回) - Nuxtがサポートするレンダリングモードを理解する (2022-09-25)