如何在GitHub Workflow的${{ github.event.inputs }}中使用循环变量?
GitHub Workflow动态获取inputs变量失败的解决方法
问题原因
- 非标准JSON解析失败:
${{ github.event.inputs }}直接渲染为字符串时,生成的是键名不带双引号的非标准JSON格式,导致jq无法正常解析,这是报错的核心原因。 - 数组变量名不一致:脚本中声明的数组是
names,但添加元素时使用的是deployment_names,会触发变量未定义错误。
方案一:使用toJSON生成标准JSON配合jq解析
修正后的完整Workflow代码:
name: workflow on: workflow_dispatch: inputs: build_version: description : 'Build Version' required: true abc: type: boolean xyz: type: boolean jobs: getting_app_name: runs-on: ubuntu-latest steps: - name: step1 id: list_creation run: | # 正确声明数组变量 declare -a deployment_names=() # 用toJSON生成标准格式的JSON字符串 inputs_json='${{ toJSON(github.event.inputs) }}' for option in abc xyz; do echo "option: $option" # 通过--arg参数将shell变量传递给jq,避免引号转义问题 value=$(echo "$inputs_json" | jq -r --arg opt "$option" '.[$opt]') echo "value: $value" if [[ "$value" == "true" ]]; then deployment_names+=("$option") fi done echo "names: ${deployment_names[@]}" # 如需传递结果到后续步骤,可添加以下行 # echo "names=${deployment_names[*]}" >> "$GITHUB_OUTPUT"
关键说明
toJSON(github.event.inputs)会生成符合标准的JSON字符串,确保jq能正常解析。- 使用
jq --arg传递shell变量,避免直接拼接字符串导致的引号冲突问题。 - 统一数组变量名,解决未定义错误。
方案二:通过环境变量直接获取(无需jq)
这种方法跳过JSON解析,直接将inputs映射为环境变量,更简洁高效:
name: workflow on: workflow_dispatch: inputs: build_version: description : 'Build Version' required: true abc: type: boolean xyz: type: boolean jobs: getting_app_name: runs-on: ubuntu-latest # 将inputs映射为环境变量 env: INPUT_ABC: ${{ github.event.inputs.abc }} INPUT_XYZ: ${{ github.event.inputs.xyz }} steps: - name: step1 id: list_creation run: | declare -a deployment_names=() for option in abc xyz; do echo "option: $option" # 拼接环境变量名并通过间接引用获取值 var_name="INPUT_${option^^}" value="${!var_name}" echo "value: $value" if [[ "$value" == "true" ]]; then deployment_names+=("$option") fi done echo "names: ${deployment_names[@]}"
关键说明
- 在
env字段中预先将每个input项映射为大写前缀的环境变量,比如INPUT_ABC对应github.event.inputs.abc。 - 使用shell的间接变量引用
${!var_name}动态获取对应环境变量的值,无需依赖jq工具。
内容的提问来源于stack exchange,提问作者Abhishek Singh
相关产品推荐
相关产品推荐

