GitHub Actions - 再利用可能ワークフローと手動トリガーで入力値の扱いを統一

| 3 min read
Author: masahiro-kondo masahiro-kondo

これまで、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 コンテキストから取得可能です。

Information

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_dispach は入力フォームが使用できるため、logLevel を選択できるよう type: choice を指定し、options で選択肢を列挙しています。

workflow_call の方は、値を呼び出し側ジョブのコードで渡すため、logLevel は type: string にしています。

Information

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

呼び出し側のワークフローを手動実行します。入力値はコードで渡すため、実行するだけです。

実行結果。

以上、入力値の扱いが統一されたため、再利用可能ワークフローを単体で動かすことが簡単になり、複数のトリガーから同じジョブを実行できるようになりました。