1

Sonarqube (バージョン 5.4) を評価して、
次のように機能する別の監査ツールを使用して現在のワークフローを移行したいと考えています。

本番環境で実行されている現在のバージョンは、参照バージョンです。
新しい開発バージョンが GIT からチェックアウトされ、差分プロセスが新しいファイルと変更されたファイルと参照バージョンを計算し、これらのファイルの監査を開始します。
レガシ コード (2012 年に既に存在していたコンポーネント) と新しいコンポーネント (2012 年以降) の処理も若干異なります。

次の場合、ビルドが中断します。

従来のコンポーネントからの変更されたファイル (2012 年に既に存在するファイル) のブロッカーの問題 古いコンポーネント
と新しいコンポーネントからの新しいファイル (2012 年以降に作成されたファイル) のブロッカーまたは重大な問題

Sonarqube でそれを実装する方法は?

すでに2つのことを試しました:

1.) sonar.timemachine.period1Sonar タスクを開始する前に、Ant スクリプトでプロパティをプロダクション/リファレンス バージョンに設定します => 機能しませんでした。常に「以前のバージョンから」です。

2.) Sonarqube で 2 つの異なるプロジェクトを定義します。1 つは製品バージョン用、もう 1 つは新しい開発バージョン用です。次に、Sonarqube Web UI More / Compare Projects から知られている機能をプログラムで使用し、Blocker および Critcal の問題の差分を取得します。

問題 : プロダクション リファレンスに既に存在する 200 個の重大な問題を修正したが、開発バージョンに 200 個の新しい問題が導入された場合、重大な問題の差分が得られません。
プロジェクトの比較機能には、新しい問題または古い問題のメトリックはありません。比較されたプロジェクトの問題をカウントするだけです。

4

1 に答える 1

3

プロパティは、 Sonar タスクを呼び出す前に、 sonar.timemachine.period1REST 呼び出し (ドキュメントはこちら) を介して設定する必要があります。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サーバーWeb UI/管理/一般設定/差分ビューでsonar.timemachine.period1が表示されることを期待していましたが、そうではありません。 注 => forを使用する代わりに、単純に usertoken atを作成して usertoken: を使用します。代わりに - セパレーター ':' と空白のパスワードを持つユーザー ID としての usertoken を意味します。

username:passwordBasicAuth
http://sonarhost/account/security

于 2016-06-10T08:50:48.147 に答える