Reusable workflowを活用して複数のアプリケーションを一括デプロイする
Reusable workflow は Github Actions で既存のワークフローを再利用する機能です。これを活用して、煩雑だったデプロイフローを改善しました。
従来のデプロイフロー
弊社では複数のアプリケーションを開発しており、それぞれのアプリケーションは Github Actions を使ってデプロイされます。定期リリース時にはそれらのアプリケーションを一括でデプロイします。
- アプリケーションごとにデプロイ用のワークフローが定義されている
- それを一つ一つずつ実行する 😱 (温かみのある手動デプロイ)
問題はたくさんありますが、第一歩としてワンボタンで一括デプロイできるようにしたい、と考えました。
できたもの
- ワンボタンで一括デプロイ
- Reusable workflow を使用して、アプリケーションごとのデプロイワークフローを再利用
- エラーが起きたときに後続のデプロイをスキップする
Reusable workflowを使う
Reusable workflow は、Github Actionsでワークフローを再利用する仕組みです。これにより、元々あるワークフローを再利用しながら、新しいワークフローを作成することができます。一から作成する場合に比べて、ワークフローの保守が容易になります。
Rather than copying and pasting from one workflow to another, you can make workflows reusable.
https://docs.github.com/en/actions/using-workflows/reusing-workflows
使い方は簡単で、再利用したいワークフローでworkflow_callイベントを定義することで、他のワークフローからの呼び出しが可能になります。
on:
workflow_call:
呼び出し側で uses
フィールドでファイルを指定することでワークフローを呼び出します。
jobs:
deploy-app:
name: Deploy App
uses: ./.github/workflows/app-deploy.yml
Tips
パラメータを渡す
workflow_callイベントの定義時に inputs
を指定することで、任意のパラメータを受け付けることができます。
on:
workflow_call:
inputs:
dest:
type: string
呼び出し時に with
フィールドでパラメータを渡します。
jobs:
deploy-app:
name: Deploy App
uses: ./.github/workflows/app-deploy.yml
with:
dest: hello
依存関係を指定する
needs指定で、job同士に依存関係を指定できます。この場合、 deploy-backend
ジョブが正常に終了したあとで deploy-app
ジョブが実行されます。
jobs:
deploy-app:
name: Deploy App
uses: ./.github/workflows/app-deploy.yml
needs: [deploy-backend]
秘匿情報を引き継ぐ
secrets: inherit
を指定することで、呼び出し元のワークフローのすべてのsecretを呼び出し先のワークフローに引き継ぐことができます。
jobs:
deploy-app:
name: Deploy App
uses: ./.github/workflows/app-deploy.yml
secrets: inherit
おわりに
デプロイが便利になって嬉しいですが、アプリケーションの分割状況の見直しや、アプリケーション間の依存関係の見直しなど根本的な問題がまだまだ残っています。改善を進めて最終的にはReusable workflowが不要になるくらいデプロイフローがシンプルになったらいいなと思っています。
Discussion