GitHub Actionsで手動workflowから別のworkflowにbooleanを渡す時はfromJsonを使おう
小ネタです。
結論
workflow_dispatchのboolean型のinputsは、github.eventコンテキストではstring型に変わってしまっているので、以下のようにfromJson関数を使ってboolean型に戻す。
on:
workflow_dispatch:
inputs:
is_foo:
description: is_foo
required: false
type: boolean
default: false
jobs:
caller:
uses: {org}/{repo}/.github/workflows/called.yml@main
with:
is_foo: ${{ fromJson(github.event.inputs.is_foo )}} # ココ
解説
例えば、こんなReusable workflowがあったとします。inputsのうちのひとつのis_morning
のtypeがbooleanであるところが、今回のポイントです。
on:
workflow_call:
inputs:
target:
required: false
type: string
default: world
is_morning:
required: false
type: boolean # ココ
default: false
jobs:
calling:
runs-on: ubuntu-20.04
steps:
- if: inputs.is_morning
run: echo "Good morning, ${{ inputs.target}}"
- if: ${{ !inputs.is_morning }}
run: echo "Hello, ${{ inputs.target }}"
上記のReusable workflowを、手動で起動できるワークフローから呼び出すとします。
on:
workflow_dispatch:
jobs:
caller:
uses: {org}/{repo}/.github/workflows/called.yml@main
Reusable workflow側のinputsはいずれもrequired:falseで、default値を持っていたので、呼び出し元から何のinputsを指定してなくても、(何のwithを指定しなくても)問題なく動きます。
Hello, world
ただ、手動での起動時にせっかくならinputsを任意の値にできるようにしたいですよね。
その場合は以下のようになります。
- workflow_dispatchにinputsを追加する
- Reusable workflowを呼び出す時にwithを指定し、前述のinputsを引き渡す
- なお、この時
inputs.xxx
ではなく、github.event.inputs.xxx
であることに注意
- なお、この時
on:
workflow_dispatch:
inputs:
target:
description: target
required: false
type: string
default: world
is_morning:
description: is_morning
required: false
type: boolean
default: false
jobs:
caller:
uses: {org}/{repo}/.github/workflows/called.yml@main
with:
target: ${{ github.event.inputs.target }}
is_morning: ${{ fromJson(github.event.inputs.is_morning )}}
ここで注目して欲しいのが、最終行のgithub.event.inputs.is_morning
の部分です。
github.event.inputs.is_morning
の値は、実は文字列としての"false"
になってしまっているので、fromJson関数を使ってbooleanに変換してあげる必要があります。
もし、fromJson関数を使わずに、
is_morning: ${{ github.event.inputs.is_morning }}
としていると、以下のエラーが出てしまいます。
.github/workflows/caller_wrong_case.yml : .github#L1
GitHub Actions has encountered an internal error when running your job.
このエラー文を見ただけではどこの行の何が原因かがわからず、ハマりどころとなると思うのでお気をつけください。
fromJson関数を使った上で、以下のようにis_morning
にチェックを入れて(true
にして)ワークフローを起動すると・・・
狙った通りにReusable workflowが動きます。
Good morning, world
Discussion