GitHub Actions - 再利用可能ワークフローと手動トリガーで入力値の扱いを統一
これまで、GitHub Actions の手動トリガー(workflow_dispatch)では、入力値を扱う際、github.event.inputs.foo
のように event コンテキストから値を取り出す必要がありました。
以前紹介した再利用可能ワークフロー(workflow_call)では、入力値を inputs.foo
のように inputs コンテキストから取得します。
このようにトリガーの種類によって入力値の扱いが異なると、両方のトリガーで起動するワークフローが書きづらい問題があります。
先日この問題を解消するリリースが行われ、手動トリガーと再利用可能ワークフローの入力値の扱いが統一されました。
GitHub Actions: Inputs unified across manual and reusable workflows | GitHub Changelog
現在では workflow_dispatch の入力値も inputs コンテキストから取得可能です。
event コンテキストからの取得も互換性のため残されています。
では、以前の書き方の手動トリガーのジョブを動かしてみます。inputs の logLevel や tags などを github.event.inputs から取得してログに出力するワークフローです。
on:
workflow_dispatch:
inputs:
logLevel:
description: 'Log level'
required: true
default: 'warning'
tags:
description: 'Test scenario tags'
jobs:
printInputs:
runs-on: ubuntu-latest
steps:
- run: |
echo "Log level: ${{ github.event.inputs.logLevel }}"
echo "Tags: ${{ github.event.inputs.tags }}"
Run workflow で入力値を指定して実行。
実行結果。この書き方でも入力値が取得できることがわかります。
このワークフローを入力値を inputs コンテキストから取得するように書き換えます。
- run: |
- echo "Log level: ${{ github.event.inputs.logLevel }}"
- echo "Tags: ${{ github.event.inputs.tags }}"
+ echo "Log level: ${{ inputs.logLevel }}"
+ echo "Tags: ${{ inputs.tags }}"
実行します。
実行結果。この書き方でも入力値が正しく取得できました。
それでは、workflow_dispatch と workflow_call の両方をトリガーに持つワークフローを書いてみます。2つのトリガーでそれぞれほぼ同じ inputs を定義し、ジョブでは、inputs コンテキストから取り出した入力値を echo 出力しています。
name: Manual and Callee
on:
workflow_dispatch:
inputs:
logLevel:
description: 'Log level'
required: true
default: 'warning'
type: choice
options:
- info
- warning
- debug
tags:
description: 'Test scenario tags'
required: false
type: boolean
workflow_call:
inputs:
logLevel:
description: 'Log level'
required: true
default: 'warning'
type: string
tags:
description: 'Test scenario tags'
required: false
type: boolean
jobs:
log-the-inputs:
runs-on: ubuntu-latest
steps:
- run: |
echo "Log level: $LEVEL"
echo "Tags: $TAGS"
env:
LEVEL: ${{ inputs.logLevel }}
TAGS: ${{ inputs.tags }}
workflow_dispatch は入力フォームが使用できるため、logLevel を選択できるよう type: choice
を指定し、options
で選択肢を列挙しています。
workflow_call の方は、値を呼び出し側ジョブのコードで渡すため、logLevel は type: string
にしています。
type: choice
を指定すると invalid value としてエラーになります。
まず、手動トリガーで実行します。
実行結果。
次に、呼び出し用のワークフローを作成します。上記のワークフローファイルを指定し、with で入力値を渡します。
name: Caller Job
on: [workflow_dispatch]
jobs:
Reuse:
uses: ./.github/workflows/dispatch_and_call_inputs.yml
with:
loglevel: info
tags: false
呼び出し側のワークフローを手動実行します。入力値はコードで渡すため、実行するだけです。
実行結果。
以上、入力値の扱いが統一されたため、再利用可能ワークフローを単体で動かすことが簡単になり、複数のトリガーから同じジョブを実行できるようになりました。