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

如何在GitHub Workflow的${{ github.event.inputs }}中使用循环变量?

GitHub Workflow动态获取inputs变量失败的解决方法

问题原因

  1. 非标准JSON解析失败:${{ github.event.inputs }}直接渲染为字符串时,生成的是键名不带双引号的非标准JSON格式,导致jq无法正常解析,这是报错的核心原因。
  2. 数组变量名不一致:脚本中声明的数组是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 18:42:33