sonar.Qualitygate 在 Sonar Qube 5.3 中已弃用。有什么选择?

sonar.Qualitygate is Deprecated in Sonar Qube 5.3. What is the alternative?

上下文:在 Sonar Qube 中,存在一个名为 say abcd 的自定义质量门。这不是默认的质量门。在 Jenkins 中,我通过使用参数为一组 API 配置了这个 SonarQube Quality Gate -Dsonar.QualityGate=abcd 并且运行良好。

最近Sonar Qube升级到5.3版本。从那时起,abcd 质量门不起作用,默认质量门开始发挥作用,而不是所有 API 的 abcd 质量门。

经过分析,我了解到 sonar.QualityGate 在 5.3 版本中已被弃用。

问题:你能告诉我有什么选择吗?我如何确保这些 API 集将 abcd 作为质量门而不是默认质量门?

我更喜欢这样的解决方案,这样我可以在 Jenkins 上配置一些东西,因为我可以访问 Jenkins 但不能访问 Sonar Qube 配置。

在运行分析时,确实无法使用参数设置项目的质量门。 只能从 UI/WS 开始,您可以在其中指定哪个 Quality Gate 应该用于哪个项目。

有关详细信息,请参阅文档:http://docs.sonarqube.org/display/SONAR/Quality+Gates

您仍然可以动态创建关联门 - 通过 Sonarqube Web 项目 API。

从您的 Sonarqube 实例,转到其 /web_api URL(例如 http://my-sonarqube/web_api)并检查可用操作列表。

web_api/api/qualitygates是与质量关卡相关的操作集。 web_api/api/qualitygates/select 是您需要将门关联到项目的操作。

因此,作为已弃用的 sonar.qualitygate 的替代品,您可以使用通过网络的手动关联 UI 或通过网络的动态(和自动)关联 API,推荐.后一种情况是持续集成作业(正如您在本文中提到的 Jenkins)需要动态创建 link(对分支机构管理特别有用)的方法。

作为此操作生效的必经步骤,您需要通过一些权限,例如用户令牌,作为 official Sonarqube documentation on Web API.

推荐的方法

CI 步骤在调用 sonar:sonar 步骤之前的示例:

curl -u ${sonar.password.token}: ${sonar.setqualitygate.url} \
-d "gateId=${sonar.gate.id}&projectKey=${sonar.project.key}:${planRepository.branch}"

其中:

  • sonar.password.token 是您需要从 Sonarqube 用户管理页面生成的令牌,用于技术用户(例如,用于在组件之间建立连接的 Jenkins 用户)
  • sonar.setqualitygate.url REST API 端点的 URL(例如 http://your.sonarqube.domain/api/qualitygates/select
  • sonar.gate.id是门的id,你可以在相关门的URL上很容易找到它(例如http://your.sonarqube.domain/quality_gates/show/<id>
  • sonar.project.keyplanRepository.branch 在这里我们也为某个分支动态构建项目的名称,如果你不想动态处理分支(例如在 Bamboo 中很容易做到,在 Jenkins 中有点棘手)

使用 A_Di-Matteo 建议的方法,我遇到了一个问题:当尝试 select 全新功能分支的门时,声纳抛出一个错误说该项目不存在。因此只有在创建项目后才能分配门。 在这种情况下,我使用 hack:在分配门之前使用 Sonar Web API 手动创建项目,然后才执行 mvn sonar:sonar 步骤。 这是虚拟新项目的创建:

def createNewProject(def config, def branch) {
    String projectName = new XmlSlurper().parseText(readFile('pom.xml')).name as String
    def url = "${config.sonarHost}/api/projects/create"
    sh "curl -u ${config.sonarToken}: ${url} -d 'name=${projectName}&project=${projectKey()}&branch=${branch}'"
}

下一步是为这个虚拟项目分配一个门:

def setSonarQualityGate(def config, def projectFullName, def gateId) {
    def url = "${config.sonarHost}/api/qualitygates/select"
    sh "curl -u ${config.sonarToken}: ${url} -d 'gateId=${gateId}&projectKey=${projectFullName}'"
}

然后我才自己执行分析:

def runSonarAnalysis(def config, def branch) {
    echo "Run Sonar analysis"
    sh "mvn sonar:sonar -Dsonar.host.url=${config.sonarHost} -Dsonar.branch=${branch}"
}