🚀

Reusable workflowを活用して複数のアプリケーションを一括デプロイする

2024/08/31に公開

Reusable workflow は Github Actions で既存のワークフローを再利用する機能です。これを活用して、煩雑だったデプロイフローを改善しました。

従来のデプロイフロー

弊社では複数のアプリケーションを開発しており、それぞれのアプリケーションは Github Actions を使ってデプロイされます。定期リリース時にはそれらのアプリケーションを一括でデプロイします。

従来のデプロイフロー

  • アプリケーションごとにデプロイ用のワークフローが定義されている
  • それを一つ一つずつ実行する 😱 (温かみのある手動デプロイ)

問題はたくさんありますが、第一歩としてワンボタンで一括デプロイできるようにしたい、と考えました。

できたもの

  • ワンボタンで一括デプロイ
  • Reusable workflow を使用して、アプリケーションごとのデプロイワークフローを再利用
  • エラーが起きたときに後続のデプロイをスキップする

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 を指定することで、任意のパラメータを受け付けることができます。

参考: https://docs.github.com/en/actions/sharing-automations/reusing-workflows#passing-inputs-and-secrets-to-a-reusable-workflow

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 ジョブが実行されます。

参考: https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#jobsjob_idneeds

jobs:
  deploy-app:
    name: Deploy App
    uses: ./.github/workflows/app-deploy.yml
    needs: [deploy-backend]

秘匿情報を引き継ぐ

secrets: inherit を指定することで、呼び出し元のワークフローのすべてのsecretを呼び出し先のワークフローに引き継ぐことができます。

参考: https://docs.github.com/en/actions/sharing-automations/reusing-workflows#passing-inputs-and-secrets-to-a-reusable-workflow

jobs:
  deploy-app:
    name: Deploy App
    uses: ./.github/workflows/app-deploy.yml
    secrets: inherit

おわりに

デプロイが便利になって嬉しいですが、アプリケーションの分割状況の見直しや、アプリケーション間の依存関係の見直しなど根本的な問題がまだまだ残っています。改善を進めて最終的にはReusable workflowが不要になるくらいデプロイフローがシンプルになったらいいなと思っています。

GitHubで編集を提案

Discussion