如何在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
关键说明
- Secrets转JSON:通过
${{ toJson(secrets) }}将所有仓库Secrets序列化为JSON字符串,存入环境变量SECRETS中,这样就能在Shell运行阶段访问到完整的Secrets集合。 - 动态提取值:使用
jq工具,通过传入的密钥名参数$secret从JSON中提取对应的值,实现循环内的动态引用。 - 触发方式:通过
workflow_dispatch配置手动触发时的输入参数my_secrets,支持传入任意逗号分隔的密钥名列表,适配密钥数量不固定的场景。
内容的提问来源于stack exchange,提问作者ArielB
相关产品推荐
相关产品推荐

