1

评估 Sonarqube(版本 5.4),我们希望
使用另一个审计工具迁移我们当前的工作流程,其工作方式如下:

在生产中运行的当前版本是我们的参考版本。
从 GIT 签出一个新的开发版本,一个 diff 过程计算新的和修改的文件与参考版本,并开始对这些文件进行审计。
遗留代码(2012 年已经存在的组件)和新组件(2012 年之后)的处理也略有不同。

如果出现以下情况,则构建中断:

来自旧组件的更改文件(2012 年已经存在的文件)中的阻止程序问题 来自旧组件
和新组件的新文件(2012 年之后创建的文件)中的阻止程序或关键问题

如何在 Sonarqube 中实现它?

已经尝试了两件事:

1.)sonar.timemachine.period1在启动 Sonar 任务之前将属性设置为 Ant 脚本中的生产/参考版本 => 不起作用,它总是“从以前的版本开始”

2.) 在 Sonarqube 中定义两个不同的项目,一个用于生产版本,一个用于新的开发版本。然后以编程方式使用 Sonarqube Web UI 更多/比较项目中已知的功能,并获取 Blocker 和 Critcal 问题的差异。

问题:如果我修复了生产参考中已经存在的 200 个关键问题,但在开发版本中引入了 200 个新问题,我将不会获得关键问题的差异。
比较项目功能没有衡量新问题或旧问题的指标,它只是计算比较项目的问题。

4

1 回答 1

3

在调用 Sonar 任务之前sonar.timemachine.period1,必须通过 REST 调用(此处的文档)设置属性 - 如果使用 Ant 属性任务定义,它不会传输到 Sonarqube 服务器。像这样工作,创建了一个用于重用的宏定义:

<project xmlns:sonar="antlib:org.sonar.ant">

  <!-- Import Groovy -->
  <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy"/>
  <!-- Import Sonar -->
  <taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml"/>

  <property name="sonar.language" value="java" />
  <property name="sonar.host.url" value="http://localhost:9000" />
  <property name="sonar.projectKey" value="com.whatever:foobar" />
  <property name="sonar.projectName" value="foobar" />
  <property name="sonar.projectVersion" value="v_1_2_3_xy" />
  <property name="sonar.scm.provider" value="git" />
  <property name="sonar.sources" value="src"/>
  <property name="sonar.java.binaries" value="bin"/>
  <property name="sonar.java.libraries" value=" ... " />

  <macrodef name="sonarsetproperty">
    <attribute name="host" default="${sonar.host.url}"/>
    <attribute name="property" />
    <attribute name="projectid" default="${sonar.projectKey}"/>
    <attribute name="value"/>
    <attribute name="usertoken" default="6e44ba2b9c0f47118d502fbf1d6d36fcfd5f7eb2"/>
    <attribute name="verbose" default="false"/>

    <sequential>
      <groovy>
      <![CDATA[
        println """
        ================ Sonar SetProperty ================
         SonarHost      => @{host}
         SonarProperty  => @{property}
         Value          => @{value}
        ================ Sonar SetProperty ================
        """
        s = '@{host}/api/properties?id=@{property}&value=@{value}&resource=@{projectid}'

        raw = '@{usertoken}:'
        bauth = 'Basic ' + javax.xml.bind.DatatypeConverter.printBase64Binary(raw.getBytes())
        url = new URL(s)

        HttpURLConnection conn = url.openConnection()
        conn.setRequestMethod('POST')
        conn.setRequestProperty("Authorization", bauth)
        conn.connect()

        if(conn.responseCode == 200 || conn.responseCode == 201) {
          response = conn.content.text
          if(@{verbose}) println '=== Response ===\n' + response + '\n=== Response ==='
        } else {
            ant.fail(message: "Error Connecting to ${url}, Errorcode ${conn.responseCode}")
        }
      ]]>
      </groovy>
    </sequential>
  </macrodef>

  <!-- user needs to be admin -->
  <sonarsetproperty property="sonar.timemachine.period1" value="v_1_0_0_xy"/>

  <!-- Execute Sonar -->
  <sonar:sonar />

</project>

不知何故,我希望在 REST 调用之后在
Sonarqube Server Web UI / Administration /General Settings /Differential Views中看到 sonar.timemachine.period1,
但事实并非如此。
注意 => 而不是使用username:passwordfor BasicAuth,只需创建一个 usertoken
http://sonarhost/account/security并使用 usertoken: 代替 - 表示 usertoken 作为用户 ID,带有分隔符 ':' 和空白密码。

于 2016-06-10T08:50:48.147 回答