GitHub Composite Actionsではboolean inputsがstringとして扱われる

Composite Actions概要

GitHub Actionsにて複数のworkflowから利用できるactionsとしてComposite Actions (日本語では複合アクション)を作成できる。 Composite Actionsを作成すれば、複数のworkflowから参照することもできるし、複数リポジトリで共有することもできる。

docs.github.com

zenn.dev

workflowにおけるinput type

本題に入る前にworkflowのinputについて確認する。 workflowは複数のジョブで構成されたCI/CDのパイプライン。各ジョブは複数のステップから構成され、ステップはcomposite actionsなどを用いて実現する。

docs.github.com

workflowでは動作をカスタマイズするために入力となるinputが指定できる。 また、inputには入力が必須かを指定するRequiredやデータ型を指定するtypeなどが定義できる。

workflowには再利用可能なworkflow(reusable workflow, workflow_call)と手動で実行するworkflow(manual workflow, workflow_dispatch)があり、それぞれで指定可能なinput typeが異なる点に注意が必要。 workflow_callではboolean, number, stringが型として指定できる。

docs.github.com

workflow_dispatchではこれに加えてchoiceenvironmentが指定できる。 docs.github.com

また、従来のworkflow_callとworkflow_dispatchのinputは提供されるコンテキストが異なっていた。workflow_callでは inputs コンテキストが与えられ、inputs.username のように入力を参照できたが、workflow_dispatchでは github.event.inputs コンテキストが与えられ、github.event.inputs.usernameのように入力を参照する必要があった。

この問題は2022年6月に解消され、どのworkflowでも inputsコンテキストが利用できるようになった。 また、この変更に伴い workflow_dispatchにおいても input typeが提供されるようになった。このため、互換性のために残されている github.event.inputs 経由でinputsを参照すると型情報が無いので常にstringとして扱われてしまう問題がある。inputsコンテキスト経由で参照すれば型情報が反映される。

github.blog

github.com

Composite Actionsにおけるinput type

workflowとは異なり、composite actionではinput typeはサポートされていない。

docs.github.com

inputs定義時にtypeを指定することはできるが実際には機能せず常にstringとして扱われる。このため、boolean型だと思って処理しようとすると上手く動作しないという不具合が発生する。

boolean型のように利用したければ、if: ${{ inputs.input-value }} ではなく if: ${{ inputs.input-value == 'true' }} のように利用する必要がある。

github.com

また、workflow用のシンタックスとcomposite actions用のシンタックが似ているけど互換性が無いことも影響している。 上記のようにworkflowではworkflow_callとworkflow_dispatchでinput typeなどが統一され互換性があるのに、composite actionsは互換性が無くtype指定できないことが直感的でない。

ちなみに、github actions用ファイルのlinterとしてよく利用されるactionlintもあくまでworkflow file用のlinterであり、composite actions用のlint機能は提供していない。

github.com