Alternative Architecture DOJO

オルターブースのクラウドネイティブ特化型ブログです。

GitHub Actionsで再利用可能なワークフローを使用する

オルターブース エンジニアのみっつーです!
この記事はオルターブース Advent Calendar 2022の5日目の記事です。

adventar.org

昨日は中島さんによるオルターブースに入社して1か月の話でした!

aadojo.alterbooth.com


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."

参考資料