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

如何将jq处理的PR编号存入GitHub CLI环境变量并正确格式化

问题

处理JSON文件中的PR数据时,筛选出更新超过1小时且审核状态为APPROVED的PR编号,存入GitHub Actions环境变量后出现换行和多余逗号(如3307, 3176,),无法被后续步骤正常解析,需要得到无换行的逗号分隔列表(如3307,3306)或可循环数组,以便为对应PR添加标签。

原处理步骤代码:

- name: Process Pull Requests
        id: process-prs
        run: |
          CURRENT_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
          echo "Current Time: $CURRENT_TIME"
          
          # Process each PR
          READY_FOR_RELEASE_PRs=$( 
            jq -c '.' pr_list.json | while read -r pr; do
              PR_NUMBER=$(echo "$pr" | jq -r '.number')
              UPDATED_AT=$(echo "$pr" | jq -r '.updatedAt')
  
              # Check if the PR was updated more than an hour ago
              UPDATED_AT_TIMESTAMP=$(date -d "$UPDATED_AT" +%s)
              CURRENT_TIMESTAMP=$(date -u +%s)
              DIFF_IN_SECS=$((CURRENT_TIMESTAMP - UPDATED_AT_TIMESTAMP))
  
              if [ "$DIFF_IN_SECS" -lt 3600 ]; then
                continue
              fi
            
              # Get our merge state status so we know if we can apply tags to it.
              REVIEW_DECISION=$(gh pr view "$PR_NUMBER" --json reviewDecision --jq .reviewDecision)
              # echo "Review Decision: $REVIEW_DECISION"
            
              # Check to make sure that the PR isn't blocked from being merged.
              if [ "$REVIEW_DECISION" = "APPROVED" ]; then
                # echo "PR #$PR_NUMBER meets criteria for 'Ready for Release'."
                # prs+=("$PR_NUMBER")
                # echo "Ready for Release PRs Array: ${prs[@]}"
                # echo "READY_PRS=${READY_PRS}${READY_PRS:+,}$PR_NUMBER" >> $GITHUB_ENV
                echo "$PR_NUMBER,"
              fi
            done
          )

          # Output the list of PRs ready for release
          echo "Ready for Release PRs: $READY_FOR_RELEASE_PRs"
          echo "ready_prs=${READY_FOR_RELEASE_PRs[@]}" >> $GITHUB_ENV

后续标签添加步骤代码:

- name: Add "Ready for Release" Label
        if: ${{ env.ready_prs != '' }}
        run: |
          echo "Ready for Release PRs: ${{ env.ready_prs }}"
          for PR_NUMBER in ${{ env.ready_prs }}; do
            echo "Adding 'Ready for Release' label to PR #$PR_NUMBER"
          done

报错信息:

Ready for Release PRs: 3307,
3176,
Error: Unable to process file command 'env' successfully.
Error: Invalid format '3176,'

解决方案1:字符串累加生成规范列表

修改Process Pull Requests步骤,通过变量累加构建无多余逗号和换行的字符串:

- name: Process Pull Requests
        id: process-prs
        run: |
          CURRENT_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
          echo "Current Time: $CURRENT_TIME"
          
          # 初始化空字符串存储符合条件的PR编号
          READY_FOR_RELEASE_PRs=""
          
          jq -c '.' pr_list.json | while read -r pr; do
            PR_NUMBER=$(echo "$pr" | jq -r '.number')
            UPDATED_AT=$(echo "$pr" | jq -r '.updatedAt')

            # 检查PR更新时间是否超过1小时
            UPDATED_AT_TIMESTAMP=$(date -d "$UPDATED_AT" +%s)
            CURRENT_TIMESTAMP=$(date -u +%s)
            DIFF_IN_SECS=$((CURRENT_TIMESTAMP - UPDATED_AT_TIMESTAMP))

            if [ "$DIFF_IN_SECS" -lt 3600 ]; then
              continue
            fi
          
            # 获取审核状态
            REVIEW_DECISION=$(gh pr view "$PR_NUMBER" --json reviewDecision --jq .reviewDecision)
          
            if [ "$REVIEW_DECISION" = "APPROVED" ]; then
              # 已有内容则加逗号分隔,否则直接赋值
              if [ -n "$READY_FOR_RELEASE_PRs" ]; then
                READY_FOR_RELEASE_PRs="$READY_FOR_RELEASE_PRs,$PR_NUMBER"
              else
                READY_FOR_RELEASE_PRs="$PR_NUMBER"
              fi
            fi
          done

          # 输出并写入环境变量
          echo "Ready for Release PRs: $READY_FOR_RELEASE_PRs"
          echo "ready_prs=$READY_FOR_RELEASE_PRs" >> $GITHUB_ENV

后续步骤按逗号分割循环:

- name: Add "Ready for Release" Label
        if: ${{ env.ready_prs != '' }}
        run: |
          echo "Ready for Release PRs: ${{ env.ready_prs }}"
          # 按逗号分割为数组后循环处理
          IFS=',' read -ra PR_NUMBERS <<< "${{ env.ready_prs }}"
          for PR_NUMBER in "${PR_NUMBERS[@]}"; do
            echo "Adding 'Ready for Release' label to PR #$PR_NUMBER"
            gh pr edit "$PR_NUMBER" --add-label "Ready for Release"
          done

解决方案2:数组转单行字符串

用Bash数组存储PR编号,最后转换为无换行的逗号分隔字符串:

- name: Process Pull Requests
        id: process-prs
        run: |
          CURRENT_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
          echo "Current Time: $CURRENT_TIME"
          
          # 初始化空数组
          declare -a PR_ARRAY=()
          
          jq -c '.' pr_list.json | while read -r pr; do
            PR_NUMBER=$(echo "$pr" | jq -r '.number')
            UPDATED_AT=$(echo "$pr" | jq -r '.updatedAt')

            UPDATED_AT_TIMESTAMP=$(date -d "$UPDATED_AT" +%s)
            CURRENT_TIMESTAMP=$(date -u +%s)
            DIFF_IN_SECS=$((CURRENT_TIMESTAMP - UPDATED_AT_TIMESTAMP))

            if [ "$DIFF_IN_SECS" -lt 3600 ]; then
              continue
            fi
          
            REVIEW_DECISION=$(gh pr view "$PR_NUMBER" --json reviewDecision --jq .reviewDecision)
          
            if [ "$REVIEW_DECISION" = "APPROVED" ]; then
              PR_ARRAY+=("$PR_NUMBER")
            fi
          done

          # 将数组转为逗号分隔的单行字符串
          READY_FOR_RELEASE_PRs=$(IFS=','; echo "${PR_ARRAY[*]}")
          
          echo "Ready for Release PRs: $READY_FOR_RELEASE_PRs"
          echo "ready_prs=$READY_FOR_RELEASE_PRs" >> $GITHUB_ENV

后续步骤的循环逻辑与方案1一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 23:32:03