如何覆盖 GitHub 可重用操作中继承的机密?

cav*_*olp 5 github github-actions

我有工作流程 A 和 B,它们都调用工作流程 C。git 存储库中设置了许多秘密。工作流程 C 使用 100 个秘密。我需要以与工作流程 A 和 B 相同的方式传递其中的 99 个。但其中一个是不同的。我可以让工作流 C 继承所有秘密并仅覆盖其中之一吗?类似于: A:

name: Reusable workflow
on:
  workflow_call:
    inputs:
    ...
env:
  SECRET_1: ${{ secrets.SECRET_1 }}
  SECRET_2: ${{ secrets.SECRET_2 }}
  ...
  SECRET_100: ${{ secrets.SECRET_100 }}
jobs:
   ...
Run Code Online (Sandbox Code Playgroud)

A:

name: Workflow A
on: ["workflow_dispatch"]

jobs:
  C:
    uses: ./.github/workflows/C.yaml
  secrets: 
    - inherit
    - SECRET_100: ${{ secrets.SECRET_100_FOR_A }}
jobs:
   ...
Run Code Online (Sandbox Code Playgroud)

乙:

name: Workflow B
on: ["workflow_dispatch"]

jobs:
  C:
    uses: ./.github/workflows/C.yaml
  secrets: 
    - inherit
    - SECRET_100: ${{ secrets.SECRET_100_FOR_B }}
jobs:
   ...
Run Code Online (Sandbox Code Playgroud)

我尝试阅读文档和谷歌搜索,并尝试在没有inherit关键字的情况下显式传递每个秘密 - 但它的可扩展性不是很好。

Ale*_*lex 0

迟到的回答,但也许会对某人有所帮助。这假设秘密值是在存储库中静态设置的,而不是动态生成的。

您可以将密钥名称作为可重用工作流程的输入传递,然后使用secrets上下文和方括号中的密钥名称访问该密钥[]- ${{ secrets[inputs.secret-name-input] }}。这也可以保证秘密的安全,因为您只是以秘密的名义传递。

因此,在您的情况下,工作流程将像这样更新:

C:

name: Reusable workflow
on:
  workflow_call:
    inputs:
      secret-100-name:
        type: string

env:
  SECRET_1: ${{ secrets.SECRET_1 }}
  SECRET_2: ${{ secrets.SECRET_2 }}
  ...
  SECRET_100: ${{ secrets[inputs.secret-100-name] }}
jobs:
   ...
Run Code Online (Sandbox Code Playgroud)

A:

name: Workflow A
on: ["workflow_dispatch"]

jobs:
  C:
    uses: ./.github/workflows/C.yaml
    with:
      secret-100-name: SECRET_100_FOR_A # DEFINE A SECRET IN THIS REPO NAMED `SECRET_100_FOR_A`
    secrets: inherit
    
jobs:
   ...
Run Code Online (Sandbox Code Playgroud)

乙:

name: Workflow B
on: ["workflow_dispatch"]

jobs:
  C:
    uses: ./.github/workflows/C.yaml
    with:
      secret-100-name: SECRET_100_FOR_B # DEFINE A SECRET IN THIS REPO NAMED `SECRET_100_FOR_B`
    secrets: inherit

jobs:
   ...
Run Code Online (Sandbox Code Playgroud)