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

时间:2020-11-11 16:11:41

标签: gitlab sonarqube gitlab-ci

最近,我们对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

1 个答案:

答案 0 :(得分:0)

您可以使用自定义脚本来实现此目的,并使用声纳Web 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中获得 ceTaskUrl ceTaskId 。现在,您可以使用该ceTaskUrl获取 analysisId

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

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