Composite Actions を触っていたところ、 Reusable Workflows との違いが分かりづらいと感じたので自分の中で考えた使い分けについて整理してまとめてみました。
使い分けイメージ
Composite Actions
- リポジトリ内の「この一連の steps をよくやってるな」というのを部品として切り出したいときに使うと良い
- Custom Actions を自作する際に、 JavaScript Action や Docker Container Action を1から作る前に Composite Actions でできないか検討すると良い (yamlを1つ用意するだけでハードルが低いため)
使い分けイメージの根拠
- 1つのリポジトリのみ触っていて一部の処理を共通化したいと思った場合は基本的に Composite Actions を使うとよさそう
- Reusable Workflows は同一リポジトリの場合
.github/workflows/
以下に他の Workflow と一緒に置くことになるのでどれが Reusable でどれがそうでないかが自明でなくてごちゃごちゃしやすい。 Composite Action はディレクトリをわけて用意するのでリポジトリ構成的にわかりやすくなる (例えば.github/actions/my-reusable-action-a/
みたいな感じで好きなところに置ける) - Reusable Workflows を1つのリポジトリで乱用すると Workflow→Job→Step の関係性と他に、 Workflow→Job→Workflow みたいな依存が増えて複雑になってしまう可能性がある
- Reusable Workflows の Trigger はよくある Workflow の Trigger (on push とか on pull_request とか) も
workflow_call
Trigger も同時に利用できるので、よくも悪くも自由度が高い。「この Workflow は push 時にも呼ばれるし他の Workflow からもキックされる」みたいな形になって複雑度が上がりやすい - Composite Action だと複雑度が上がらない理由は、名前の通り Action なので、
uses: actions/checkout@v3
みたいなことをするときと全く同じ概念と考えると特に複雑なことはない。自然と疎結合な形になる
- Reusable Workflows の Trigger はよくある Workflow の Trigger (on push とか on pull_request とか) も
- Reusable Workflows は Job からしか呼び出せなくて、他の Step と同列に使うことができない。Composite Actions は steps の中で呼び出せるので部品としての使い勝手が高い。何らかの Step を実行してから Composite Actions を呼んで、Output をまた別の Step で利用するみたいな処理を続けて書くことができる (もちろん他 Job から結果をとってくるみたいなのはできるけど記述が増える)
- 上記の諸々を考えると、Composite Actions を使った場合のほうが自然と責務をわけることを意識して構成することになって良いと思います
- Reusable Workflows は同一リポジトリの場合
- 社内のあらゆるリポジトリに全く同じ Workflow ファイルを毎回コピーしていってるとか、OSS活動として同じようなライブラリを大量にメンテしているみたいなときは共通化のために Reusable Workflows を使うと良い (もちろん Composite Action も使っても良い)
みなさんの使い分けや Tips も教えてください
今回は昨日ちょっと触って思ったことをパッとまとめた記事なので、実は Reusable Workflows / Composite Actions はこういうケースでかなり良いんだよという情報・事例があれば教えていただきたいです。