Composite Actions概要
GitHub Actionsにて複数のworkflowから利用できるactionsとしてComposite Actions (日本語では複合アクション)を作成できる。 Composite Actionsを作成すれば、複数のworkflowから参照することもできるし、複数リポジトリで共有することもできる。
workflowにおけるinput type
本題に入る前にworkflowのinputについて確認する。 workflowは複数のジョブで構成されたCI/CDのパイプライン。各ジョブは複数のステップから構成され、ステップはcomposite actionsなどを用いて実現する。
workflowでは動作をカスタマイズするために入力となるinputが指定できる。 また、inputには入力が必須かを指定するRequiredやデータ型を指定するtypeなどが定義できる。
workflowには再利用可能なworkflow(reusable workflow, workflow_call)と手動で実行するworkflow(manual workflow, workflow_dispatch)があり、それぞれで指定可能なinput typeが異なる点に注意が必要。
workflow_callではboolean
, number
, string
が型として指定できる。
workflow_dispatchではこれに加えてchoice
とenvironment
が指定できる。
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
コンテキスト経由で参照すれば型情報が反映される。
Composite Actionsにおけるinput type
workflowとは異なり、composite actionではinput typeはサポートされていない。
inputs定義時にtypeを指定することはできるが実際には機能せず常にstringとして扱われる。このため、boolean型だと思って処理しようとすると上手く動作しないという不具合が発生する。
boolean型のように利用したければ、if: ${{ inputs.input-value }}
ではなく if: ${{ inputs.input-value == 'true' }}
のように利用する必要がある。
また、workflow用のシンタックスとcomposite actions用のシンタックが似ているけど互換性が無いことも影響している。 上記のようにworkflowではworkflow_callとworkflow_dispatchでinput typeなどが統一され互換性があるのに、composite actionsは互換性が無くtype指定できないことが直感的でない。
ちなみに、github actions用ファイルのlinterとしてよく利用されるactionlintもあくまでworkflow file用のlinterであり、composite actions用のlint機能は提供していない。