如何使用JQ优化Shell脚本输出格式并实现状态判断
解决SonarQube API数据处理的输出格式与状态判断问题
1. 优化JQ输出为指定的键值对文本格式
问题原因
你之前用JQ构造对象{Status:.status, ...}会输出JSON结构,而非目标的纯文本键值对格式。需要改用JQ的字符串插值功能拼接成所需格式。
修正代码
# 先修正curl命令(原命令多余的--data-urlencode参数会导致请求异常) projectStatusUrl='url/api/qualitygates/project_status?projectKey=app' project_status="$(curl -s -u token: "${projectStatusUrl}")" # 用JQ字符串插值生成目标格式,每个条件后添加空行分隔 code_T=$(jq -r '.projectStatus.conditions[] | select(.status=="ERROR") | "Status: \(.status)\nMetricKey: \(.metricKey)\nComparator: \(.comparator)\n"' <<< "$project_status") echo "$code_T"
输出效果
Status: ERROR MetricKey: new_coverage Comparator: LT Status: ERROR MetricKey: new_duplicated_lines_density Comparator: GT
2. 修复状态判断失效问题
问题原因
你之前的code_T变量存储的是所有匹配条件的结构化内容(多行文本或JSON),直接与"OK"/"WARN"/"ERROR"字符串对比永远无法匹配。正确做法是提取项目整体状态,或检查条件中是否存在对应状态值。
方案1:基于SonarQube返回的整体状态判断(推荐)
SonarQube API的.projectStatus.overallStatus字段直接给出项目最终的质量门状态,无需遍历单个条件:
# 获取项目整体状态 overall_status=$(jq -r '.projectStatus.overallStatus' <<< "$project_status") # 状态判断逻辑 if [[ "$overall_status" == "OK" ]]; then echo '::set-output name=quality-status::PASSED' elif [[ "$overall_status" == "WARN" ]]; then echo '::set-output name=quality-status::WARN' elif [[ "$overall_status" == "ERROR" ]]; then echo '::set-output name=quality-status::ERROR' else echo '::set-output name=quality-status::UNKNOWN' fi
方案2:基于单个条件的状态判断(自定义逻辑)
如果需要根据单个条件的状态(比如只要存在一个ERROR就判定失败),可以用以下方式:
# 检查是否存在ERROR状态的条件 has_error=$(jq -r '.projectStatus.conditions[] | .status' <<< "$project_status" | grep -q "ERROR" && echo "true" || echo "false") # 检查是否存在WARN状态的条件(且无ERROR) has_warn=$(jq -r '.projectStatus.conditions[] | .status' <<< "$project_status" | grep -q "WARN" && echo "true" || echo "false") if [[ "$has_error" == "true" ]]; then echo '::set-output name=quality-status::ERROR' elif [[ "$has_warn" == "true" ]]; then echo '::set-output name=quality-status::WARN' else echo '::set-output name=quality-status::PASSED' fi
内容的提问来源于stack exchange,提问作者CamposTI
相关产品推荐
相关产品推荐

