Sonarqube установить период утечки для конкретной версии, отличной от предыдущей версии
Оценивая Sonarqube (версия 5.4), мы хотим перенести наш текущий рабочий процесс
используя другой инструмент аудита, который работает так:
Текущая версия, которая работает в производстве, является нашей справочной версией.
Новая версия для разработки извлекается из GIT, процесс сравнения вычисляет новые и измененные файлы по сравнению с эталонной версией и запускает аудит этих файлов.
Также немного отличается обработка устаревшего кода (компонентов, которые уже существовали в 2012 году) и новых компонентов (после 2012 года).
Сборка ломается, если:
Проблемы с блокировкой в измененных файлах (файлах, уже существующих в 2012 году) из устаревших компонентов
Блокировка или критические проблемы в новых файлах (файлы, созданные после 2012 года) из устаревших и новых компонентов
Как реализовать это в Sonarqube?
Пробовал уже две вещи:
1.) Установить свойство sonar.timemachine.period1
до рабочей / справочной версии в скрипте Ant перед запуском задачи Sonar => не работало, это всегда "с предыдущей версии"
2.) Определите два разных проекта в Sonarqube, один для рабочих версий и один для новых версий разработчика. Затем программно используйте функцию, известную из проектов Sonarqube Web UI More / Compare, и получите различий для проблем Blocker и Critcal.
Проблема: например, я не получу различий по критическим проблемам, если исправлю 200 критических проблем, которые уже существовали в моей производственной ссылке, но добавили 200 новых проблем в версию для разработчиков.
Функция сравнения проектов не имеет метрики для новых или старых проблем, она просто считает проблемы для сравниваемых проектов.
1 ответ
sonar.timemachine.period1
свойство должно быть установлено с помощью вызова REST (документация здесь) перед вызовом задачи Sonar - если оно определено с помощью задачи свойства 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>
Каким-то образом я ожидал увидеть sonar.timemachine.period1 в
Sonarqube Server Web UI / Администрирование / Общие настройки / Дифференциальные представления
после вызова REST, но это не так.
Примечание => Вместо использования username:password
за BasicAuth
просто создайте пользовательский токен наhttp://sonarhost/account/security
и использовать usertoken: вместо - означает usertoken в качестве идентификатора пользователя с разделителем ':' и пустым паролем.