如何将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
相关产品推荐
相关产品推荐

