Reusable Workflowについてまとめる

Posted by 地道に続けるブログ on Friday, November 25, 2022

Github ActionsはReusable workflowというworkflowをモジュール化する機能を備えています。Reusable workflowを利用することにより、workflowの共通部分を括り出し、何度も同じ記述を行う必要がなくなります。

Reusable workflow

Reusable workflowを利用したworkflowは以下です。

on:
  # Reusable workflowは発動トリガーにworkflow_callを指定します
  workflow_call:
    # Reusable workflowへの引数を設定します。
    inputs:
      first_name:
        # 引数が渡ってこなかったときのデフォルト値を設定できます
        default: "nobita"
        # 引数が必須であるかを設定します
        required: false
        # 引数の型を設定します
        type: string
    # secret情報を渡します
    secrets:
      last_name:
        # secretが必須であるかを設定します
        required: false

jobs:
  reusable_workflow_job:
    runs-on: ubuntu-latest
    steps:
      - name: print name
        # 引数、secretは以下の記述で読み込めます
        run: echo "I'm" ${{ inputs.first_name }} ${{ secrets.last_name }}

workflowの発動トリガーにはworkflow_callを指定します。
Reusable workflowには引数、secretを渡すことが可能です。

引数

引数は以下のオプションなどを持ちます。
defaultを指定することにより値が渡ってこなかった場合のデフォルト値を設定できます。
requiredを設定することにより、引数が必須かどうかを設定できます。
typeを設定することにより、引数の型を設定できます。

secret

secretは以下のオプションなどを持ちます。
requiredはsecretを渡すことが必須かどうかを設定できます

引数、secret参照方法

上記で渡ってきた引数、secretなどを利用してjobを実行します。
引数を参照するには${{ inputs.*** }}
secretを参照するには ${{ secrets.*** }}
という記法を用いて参照します。

Caller(Reusable workflowを呼び出す側)

次にReusable workflowを呼び出す側についてみていきます。
Reusable workflowを呼び出すCaller workflowは以下です。

on:
  workflow_dispatch

jobs:
  call-reusable-workflow:
    # 作成したReusable workflowへのpathを指定し、Reusable workflowをチェックアウトします
    uses: naoki-urabe/playground/.github/workflows/reusable-workflow.yml@master
    # 引数、secretをReusable workflowへ渡します
    with:
      first_name: "John"
    secrets:
      last_name: "Connor"

Reusable workflowを利用するには、対象のReusable workflowをチェックアウトする必要があります。usesで対象のReusable workflowへのパス、ブランチを指定します。
withで渡す引数の設定をします
secretsで渡すsecretの設定をします

実行結果

subnet

引数として渡したJohnとsecretとして渡したConner(マスクされてますが)が表示されていることがわかります。

感想

Github Actionsは本当に便利で触るたびに新しい発見があります。 今回紹介したReusable workflowは仕事で重複するworkflowの処理をなんとか共通化できないかということで見つけた機能です。 この機能を用いてworkflowのリファクタリングを行ったおかげ、かなりworkflowの見通しが良くなりました。また便利機能見つけたら紹介したいと思います。

参考