オルターブース エンジニアのみっつーです!
この記事はオルターブース Advent Calendar 2022の5日目の記事です。
昨日は中島さんによるオルターブースに入社して1か月の話でした!
GitHub ActionsとはGitHubが持つCI/CDを実現するための仕組みです。
今回はそのGitHub Actionsにおけるワークフロー定義ファイルの作り方として活用できる、Reusable workflowsについてお話します!
目次
- Reusable workflowsとは
- 書き方
- 動作確認
- まとめ
- 参考資料
Reusable workflowsとは
Reusable workflowsとは、ワークフロー中のコピペして使いたくなる部分を再利用可能なワークフローとして定義しましょうという仕組みです。
再利用可能なワークフローを定義し、メインのワークフローからそのワークフローを読み込むといった使い方をします。
普段コーディングされている方には言うまでもないですが、この使い方をすることでメンテナンス性がグンと上がります。
どのような時に使うかというと、例えば、本番環境とテスト環境が別リソースで用意されている場合を考えてみましょう。
各環境で使っているリソースの種類が同じとすると、ワークフロー中のアクションは同じものを使いますが、パラメータは本番とテストで違うものを設定する必要があります。
この場合に、パラメータは入力値として受け取るとして、共通部分を別ワークフローとして切り出すことが可能です。
それでは、実際のワークフロー定義を見てみましょう。
書き方
今回はAzure Web Appsへ.NET6のアプリをデプロイするワークフローをもとに、再利用可能なワークフローを作成してみます。
トリガーを workflow_call
とし、パラメータ定義を inputs
、シークレット定義を secrets
にそれぞれ追加していきます。
name: Reusable Workflow to build and deploy ASP.Net Core app to Azure Web Apps on: workflow_call: inputs: # パラメータ定義 environment-name: required: true type: string description: 'Environment name for GitHub Actions' app-name: required: true type: string description: 'Azure Web Apps resource name' secrets: # シークレット定義 publishprofile: required: true description: 'PublishProfile for Azure Web Apps' jobs: deploy: runs-on: windows-latest environment: name: ${{ inputs.environment-name }} # inputs.~ でパラメータを使用可能 url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} steps: - name: Download artifact from build job uses: actions/download-artifact@v2 with: name: .net-app - name: Deploy to Azure Web Apps id: deploy-to-webapp uses: azure/webapps-deploy@v2 with: app-name: ${{ inputs.app-name }} slot-name: 'production' publish-profile: ${{ secrets.publishprofile }} package: .
次に、再利用可能なワークフローを使用する側のワークフローを書いていきます。
ポイントは、ジョブの中で uses
を使用して、ワークフローファイルをパス指定するところです。
同一リポジトリの中であれば ./.github/workflows/~.yml
で定義可能です。
(外部リポジトリの場合は {owner}/{repo}/.github/workflows/{filename}@{ref}
の形式で定義します。)
name: Main workflow to deploy Azure Web Apps on: push: branches: - main - develop workflow_dispatch: jobs: build: runs-on: windows-latest steps: - uses: actions/checkout@v2 - name: Set up .NET Core uses: actions/setup-dotnet@v1 with: dotnet-version: '6.0.x' include-prerelease: true - name: Build with dotnet run: dotnet build --configuration Release - name: dotnet publish run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/myapp - name: Upload artifact for deployment job uses: actions/upload-artifact@v2 with: name: .net-app path: ${{env.DOTNET_ROOT}}/myapp # テスト環境へデプロイ deploy-develop: if: github.ref_name == 'develop' needs: build uses: ./.github/workflows/reusable-workflow.yml # Reusable workflowを使う name: Deploy Develop with: # パラメータを渡す environment-name: Develop app-name: 'app-xxx-dev' secrets: publishprofile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_STAGING }} # 本番環境へデプロイ deploy-production: if: github.ref_name == 'main' needs: build uses: ./.github/workflows/reusable-workflow.yml # Reusable workflowを使う name: Deploy Production with: # パラメータを渡す environment-name: Production app-name: 'app-xxx' secrets: publishprofile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE }}
動作確認
先ほどのワークフローを使用して、実際に動作確認してみましょう。
developブランチにgit pushしてみます。
mainブランチにもgit pushしてみます。
「Deploy Production」が実行されていることがわかります。
以上より、それぞれの環境に対するパラメータを適用して、再利用可能なワークフローが実行されていることが確認できました。
まとめ
今回は、再利用可能なワークフローについて取り上げさせて頂きました。
別環境へのデプロイなど、パラメータを変えるのみでコピペして使いたいようなワークフローはこちらの方法で実装されることをお勧めします。
yamlファイル指定方法とパラメータの渡し方がポイントです。
今回は登場していませんが、 github.~
や env.
パラメータの使い方が少し異なる場合があるので少し注意してください。
再利用可能なワークフロー内で取得できないものは、呼び出し元から明示的に渡すなどの対応が必要です。
ドキュメントには以下のような記載もあるので、呼び出し元から引き継がれるもの/引き継がれないものについては、ドキュメントも参考にしてみてください。
When a reusable workflow is triggered by a caller workflow, the github context is always associated with the caller workflow. The called workflow is automatically granted access to github.token and secrets.GITHUB_TOKEN. For more information about the github context, see "Context and expression syntax for GitHub Actions."
参考資料
- GitHub Actions
- Reusable workflows
- GitHub Actionsを使ってのAzure Functionsの継続的デプロイ