CodePipeline运行时buildspec.yml用jq处理JSON报错 关联SonarQube质量门禁校验
问题根因
报错的核心是shell命令逻辑写法错误:
- AWS CodeBuild的
$CODEBUILD_BUILD_SUCCEEDING是只读的状态标识变量,默认值为1,你直接在条件分支内写$CODEBUILD_BUILD_SUCCEEDING -eq 0等价于执行1 -eq 0,shell会把1当做命令去查找,自然会抛出1: not found的报错。 - 你原本想实现的「标记构建失败、终止流程」逻辑,不能通过修改该变量实现,需要直接返回非0退出码触发CodeBuild的失败机制。
修复方案
直接替换build段里的条件判断行即可,优化后的逻辑还会额外处理接口请求失败、result.json格式异常的场景,避免漏判:
pre_build: commands: - echo Logging in to Amazon ECR... - $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION) build: commands: - wget # 此处补充你原本的sonar-scanner安装包下载地址 - apt-get update && apt-get install -y lcov jq - unzip sonar-scanner-4.6.2.2472-linux-caratlane.zip - export PATH=$PATH:./sonar-scanner-4.6.2.2472-linux/bin/ - sonar-scanner -Dsonar.projectKey=<proj_key> -Dsonar.sources=. -Dsonar.host.url=<你的SonarQube服务地址> - sleep 10 - curl <sonarqube_api_to_get_quality_gate_check> > result.json - cat result.json # 替换原有判断行为以下两行逻辑 - QUALITY_GATE_STATUS=$(jq -r '.projectStatus.status' result.json) - if [ "$QUALITY_GATE_STATUS" = "ERROR" ] || [ "$QUALITY_GATE_STATUS" = "null" ]; then exit 1; fi - echo Build started on `date` - echo Building the Docker image...
优化说明
- 先把jq的解析结果存入变量,避免重复执行jq
- 给比较的字符串加双引号,避免jq返回空值时出现shell语法错误
- 新增
$QUALITY_GATE_STATUS = "null"的判断:如果SonarQube接口请求失败、result.json格式异常,jq会返回null,此时也直接终止构建,避免质量门禁校验被绕过 - 直接用
exit 1返回非0退出码,CodeBuild会自动识别为构建失败,终止后续流程
内容的提问来源于stack exchange,提问作者Mangayarkarasi J
相关产品推荐
相关产品推荐

