はじめに
GitHub Actions の機能でワークフローの再利用があります。ワークフローの再利用では、ワークフローから別のワークフローを呼び出すことができます。
その際に、呼び出された側のワークフローで別のワークフローから呼び出されたのか、もしくは、ワークフローを単体実行したのかで分岐したいことがあったため、そのやり方を記載します。
やり方
GitHub Actions では、実行時にコンテキストから様々な情報を取得することができます。
その中に、github.event.workflow
というキーが存在します。この値には、workflow のファイルパスが記載されています。
呼び出し方によって呼び出された側のワークフローでは、以下のような値が取得できます。(workflowA から workflowB を呼び出す場合)
- workflowB を直接実行(
workflow_dispatch
)した場合のgithub.event.workflow
- workflowB のファイルパス(
.github/workflows/workflow-b.yaml
)
- workflowB のファイルパス(
- workflowA から実行(
workflow_call
)した場合のgithub.event.workflow
- workflowA のファイルパス(
.github/workflows/workflow-a.yaml
)
- workflowA のファイルパス(
これによって処理やステップを分岐することができます。
例えば、workflowB を直接実行した際のみステップを実行したい場合は、以下のような条件を追加します。
if: github.event.workflow == '.github/workflows/workflow-b.yaml'
github.event_name
もあるので、こちらでも分岐できないか試してみましたが、workflowB を直接実行した場合も、workflowA から実行した場合も、workflow_dispatch
と同じ値になっており、分岐に利用できませんでした。
type: environment について
実際には、以下のように同じ名前で input を定義することで、分岐なく同じワークフローを利用できるかと思いますが、type: environment
は workflow_dispatch
のみにしか存在しないため、これを利用している場合、差を吸収するステップを追加する必要があるかと思います。
on:
workflow_dispatch:
inputs:
input1:
required: true
type: string
workflow_call:
inputs:
input1:
required: true
type: string
environment に入っている値(environment_name)は文字列としてそのまま利用できますが、上記のような差分となってしまいますので、workflow_call
する際には、避けておいた方が良さそうです。
まとめ
方法は色々ありそうですが、github.event.workflow
を確認することで、ワークフローの実行方法で分岐することができました。