You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GitHub Actions中根据密钥名列表动态使用GitHub Secrets

GitHub Action动态遍历指定Secrets并输出值的解决方案

问题场景

仓库已配置SEC_1、SEC_2等Secrets,需求是触发GitHub Action时传入逗号分隔的密钥名列表,循环遍历这些名称并打印对应Secrets的值。最初尝试的代码中,直接指定密钥名能正常输出,但循环中无法获取密钥值,且由于密钥数量不固定,无法通过预定义环境变量的方式解决。

原代码问题分析

jobs:
  dev:
    name: dev
    runs-on: ubuntu-22.04
    env:
      ENVIRONMENT: DEV
    steps:
      - run: |
          # Define the secrets
          secrets="SEC_1,SEC_2"

          # Split the secrets string into an array
          IFS=',' read -ra secret_array <<< "$secrets"

          # Loop over the secret names and echo their values
          for secret_name in "${secret_array[@]}"; do
            echo ${{ format('{0}', '$secret_name') }}

            # This prints nothing!
            echo ${{ secrets[format('{0}', '$secret_name')] }} | sed 's/./& /g'
          done

        # This works perfectly
        echo ${{ secrets[format('{0}', 'SEC_1')] }} | sed 's/./& /g'
        echo ${{ secrets[format('{0}', 'SEC_2')] }} | sed 's/./& /g'

问题核心在于:GitHub Actions的表达式(如${{ secrets[...] }})是在工作流解析阶段执行的,而Shell循环中的$secret_name变量是在运行阶段才会被赋值。当解析${{ secrets[format('{0}', '$secret_name')] }}时,$secret_name还未被赋予实际的密钥名称,因此无法正确引用对应的Secrets值。

解决方案

通过将所有Secrets转换为JSON格式存入环境变量,在Shell脚本中使用jq工具动态根据传入的密钥名提取对应值,实现运行阶段的动态处理:

on:
  workflow_dispatch:
    inputs:
      my_secrets:
        description: "要获取的密钥列表(逗号分隔)"
        required: true

permissions:
  contents: read

jobs:
  dev:
    name: dev
    runs-on: ubuntu-22.04
    env:
      SECRETS: '${{ toJson(secrets) }}'
    steps:
      - run: |
          IFS=',' read -ra string_array <<< ${{ github.event.inputs.my_secrets }}

          for secret in "${string_array[@]}"; do
            value="$(jq -r --arg key "$secret" '.[$key]' <<< "$SECRETS" | sed 's|.|& |g')"
            echo "$secret: $value"
          done

关键说明

  1. Secrets转JSON:通过${{ toJson(secrets) }}将所有仓库Secrets序列化为JSON字符串,存入环境变量SECRETS中,这样就能在Shell运行阶段访问到完整的Secrets集合。
  2. 动态提取值:使用jq工具,通过传入的密钥名参数$secret从JSON中提取对应的值,实现循环内的动态引用。
  3. 触发方式:通过workflow_dispatch配置手动触发时的输入参数my_secrets,支持传入任意逗号分隔的密钥名列表,适配密钥数量不固定的场景。

内容的提问来源于stack exchange,提问作者ArielB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 01:12:09