🚗
Github Actionsでワークフローを再利用するときに一部だけ違うsecretsを渡す
Github Actionsではワークフローを再利用するという機能がある
めっちゃ簡単にいうと
- backendのコンテナビルドとプッシュ
- frontendのコンテナビルドとプッシュ
と2つの処理を書く必要がある場合にそれぞれの build_push_action とそれに付随する諸々の処理を書かずに
- コンテナのビルドとプッシュ、その他諸々の処理
- frontのビルド過程から呼び出し
- backendのビルド過程から呼び出し
と言った感じで書くことができる
secretsを渡す
これ自体は割と簡単で、
呼び出される側
reusable.yaml
on:
workflow_call:
secrets:
secret-name:
...
呼び出し側
action.yaml
jobs:
job:
uses: ./.github/workflows/reusable.yaml
secrets:
secret-name: ${{ secrets.secretname }}
...
これで行ける
または全部渡したい場合
呼び出し側
action.yaml
jobs:
job:
uses: ./.github/workflows/reusable.yaml
secrets: inherit
...
こうすると同一名のsecretをそのまま全て渡すことができる(この場合呼ばれる側は特に記述は不要)。APIトークンなどどうせ全部渡すし……と言った感じでだいたいは inherit
を指定することになると思う。どうせ自分で同一プロジェクトように書く場合がほとんどだったらこれの方が楽
一部だけ変えたい
たとえば上記の docker build の場合、 build-args だけは環境ごとに割り当てたい、でも一応は機密情報だから secrets に入れておきたい、と言った場合どうするか
理想
action.yaml
jobs:
job:
uses: ./.github/workflows/reusable.yaml
secrets:
- inherit
- build-args: ${{ secrets.build-args-a }}
...
まあできないのだが
泥臭い方法
action.yaml
jobs:
job:
uses: ./.github/workflows/reusable.yaml
secrets:
- secret1: ${{ secrets.secret1 }}
- secret2: ${{ secrets.secret2 }}
- secret3: ${{ secrets.secret3 }}
- secret4: ${{ secrets.secret4 }}
...
- build-args: ${{ secrets.build-args-a }}
...
もちろんこんなこともしたくない。 reusable.yaml の方も記述が大変なことになる
回答
StackOverflowにあった
回答が遅くなったけど、少なくない人がこの回答を欲してるだろう
全くもってはい
というわけでこうするといいそうだ。実際できた
呼び出される側
reusable.yaml
on:
workflow_call:
inputs:
secret-name:
type: string
...
jobs:
job:
name: job name
steps:
...
- name: build and push
...
with:
build-args: |
${{ secrets[inputs.secret-name] }}
...
呼び出す側
action.yaml
jobs:
job1:
uses: ./.github/workflows/reusable.yaml
with:
secret-name: build-args-job1
secrets:
- inherit
job2:
uses: ./.github/workflows/reusable.yaml
with:
secret-name: build-args-job2
secrets:
- inherit
...
こうすると、secret は全て引き継がれた上で動的に切り替えたい secret だけ切り替えることができる
secretsは key-value 的な呼び出しができるので、キーの方を切り替えるように設定してあげればいいということらしい。
日本語資料がどのくらいあるかわからなかったけど見つけたときちょっと感動したので残しておく
Discussion