🚗

Github Actionsでワークフローを再利用するときに一部だけ違うsecretsを渡す

2024/06/26に公開

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にあった

https://stackoverflow.com/questions/75084821/how-to-override-inherited-secrets-in-github-reusable-actions

回答が遅くなったけど、少なくない人がこの回答を欲してるだろう

全くもってはい

というわけでこうするといいそうだ。実際できた

呼び出される側

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