🤝

GitHub Actionsで手動workflowから別のworkflowにbooleanを渡す時はfromJsonを使おう

2022/01/29に公開

小ネタです。

結論

workflow_dispatchのboolean型のinputsは、github.eventコンテキストではstring型に変わってしまっているので、以下のようにfromJson関数を使ってboolean型に戻す。

.github/workflows/called_example.yml
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であるところが、今回のポイントです。

.github/workflows/called.yml
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を、手動で起動できるワークフローから呼び出すとします。

.github/workflows/caller_without_inputs.yml
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であることに注意
.github/workflows/caller.yml
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関数を使わずに、

.github/workflows/caller_wrong_case.yml
      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にして)ワークフローを起動すると・・・

is_morning`にチェックを入れてワークフローを起動

狙った通りにReusable workflowが動きます。

Good morning, world

Discussion