使 SonarQube 外部作业有条件地使管道失败

问题描述 投票:0回答:2

最近我们的 SonarQube 服务器升级了,让我们有机会将它与 GitLab 集成,基于这里提到的配置:

https://docs.sonarqube.org/latest/analysis/gitlab-cicd/

现在我们遇到的问题是

external
声纳作业在未达到质量门的情况下无法通过管道。

虽然这是正确的和预期的行为,但我想知道是否有任何一种配置不会使整个管道失败,即使没有达到质量门。

我担心的是,我们针对许多项目进行了开发,其中一些项目相当陈旧(遗留代码),可能并不总是达到为它们定义的质量门槛。我知道我的要求不是最优的——即应该始终达到质量门槛——但鉴于我工作场所的当前情况,没有其他选择。

参考我的

sonar
CI 工作如下:

sonar:
  stage: analysis
  variables:
    SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar"
    GIT_DEPTH: "0"
  script: ./gradlew sonarqube -Dsonar.qualitygate.wait=true -Dsonar.projectKey=${CI_PROJECT_ID} ${ADDITIONAL_SONAR_OPTIONS}
  allow_failure: true
  rules:
    - if: $CI_COMMIT_BRANCH == "master"
    - if: $CI_COMMIT_BRANCH =~ /^support\/\d+[.]\d+$/ || $CI_COMMIT_BRANCH =~ /^support\/\d+$/
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    - if: $CI_PIPELINE_SOURCE == "schedule" || $CI_PIPELINE_SOURCE == "api"
      when: never

作业已设置

allow_failure: true
但反过来
external
作业总是失败。我阅读了文档,将其设置为
false
应该会使管道不会失败,但事实并非如此。

有什么办法可以做到这一点?我的 SonarQube 版本是

8.1.0

gitlab sonarqube gitlab-ci
2个回答
1
投票

您可以使用自定义脚本实现此目的,使用声纳网络 API 获取 QualityGate 状态,并将作业设置为失败和成功。

当您运行

./gradlew sonarqube -Dsonar.projectKey=${CI_PROJECT_ID} ${ADDITIONAL_SONAR_OPTIONS}
(删除
-Dsonar.qualitygate.wait=true
)时,将在工作区文件夹中创建report-task.txt

注意:文件 report-task.txt 的位置取决于用于生成它的工具(在您的情况下是 gradle)。例如。像“mvn sonar:sonar”任务默认为“target/sonar”。此位置由“sonar.scanner.metadataFilePath”属性控制

您将在 report-task.txt 中获得 ceTaskUrlceTaskId。现在,您可以使用该 ceTaskUrl 获取analysisId

您可以使用下面的 web api 通过 analysisId 获取质量门状态。

https://localhost:9000/sonarqube/api/qualitygates/project_status?analysisId=$ANALYSIS_ID"


0
投票

使用

allow_failure: true
作业仍然会失败(橙色 !-符号)但管道不应失败。

您可以使用

设置允许的退出代码
  allow_failure:
    exit_codes:
      - 101
      - 110

在这种情况下,只有当脚本退出并返回 101 或 110 以外的任何其他代码时,管道才会失败。您可以列出未达到质量门时脚本返回的退出代码。

© www.soinside.com 2019 - 2024. All rights reserved.