GitHub Actions 再利用可能ワークフローでネスト呼び出しと Matrix strategy が解禁
以前の「GitHub Actions - 再利用可能ワークフローを使う」の記事時点では、以下のような制約がありました。
- 再利用可能ワークフローは他の再利用可能ワークフローを呼び出すことはできない
- プライベートリポジトリ内の再利用可能ワークフローは、同一リポジトリ内のワークフローでのみ使用可能
- 呼び出し元ワークフローで定義されたワークフローレベルの環境変数は呼び出されたワークフローに伝播されない
- strategy プロパティは、再利用可能ワークフローを呼び出すジョブではサポートされない
このたびのリリースで、1と4の制約が解消され、再利用可能ワークフローのネスト呼び出しが可能となるとともに、呼び出し元からの Matrix strategy も使えるようになりました[1]。
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 }}!"
実行してみると、ちゃんと最下層のジョブが実行され、パラメータの受け渡しもできました。
再利用可能ワークフローのネスト呼び出しは、ネストは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/matrix
の target
で dev
、stage
、prod
のようにデプロイ先の環境を 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"
もしワークフローでコンテナアプリケーションの CI/CD を行う場合、ビルドは1度だけでデプロイ先の差異は環境変数で対応するのが王道ですが、ここはあくまでサンプルということでご了承ください。
実行すると、matrix が展開され各環境のジョブが実行されました。以下のスクリーンショットは、プロダクションビルドの実行結果を開いたところです。
ちなみに matrix とネスト呼び出しを混在させることはできますが、ジョブに依存関係を定義したりすると意図した動きをしませんでした。あまり凝ったことはできない模様です。
以上、再利用可能ワークフローの改善ポイントを見てきました。ワークフローコードの重複削減には有効なので、機会があったら使ってみたいと思います。
2の制約も2022年12月に解消されました。詳細は「GitHub Actions - private リポジトリの Action と再利用可能ワークフローが呼び出しが可能に」を参照してください。 ↩︎