From 93703a5bcf3ceeab14c512c132f36c9756bc540a Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Fri, 20 May 2022 20:02:28 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20enum=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20=D1=81?= =?UTF-8?q?=D0=BF=D0=BE=D1=81=D0=BE=D0=B1=D0=B0=20=D0=BA=D0=BE=D0=BD=D1=84?= =?UTF-8?q?=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + resources/globalConfiguration.json | 2 +- resources/schema.json | 7 ++++--- .../BranchAnalysisConfiguration.groovy | 17 +++++++++++++++++ .../configuration/SonarQubeOptions.groovy | 10 +++++++--- .../jenkins/library/steps/SonarScanner.groovy | 6 +++++- .../configuration/ConfigurationReaderTest.java | 2 ++ test/unit/resources/jobConfiguration.json | 3 ++- 8 files changed, 39 insertions(+), 9 deletions(-) create mode 100644 src/ru/pulsar/jenkins/library/configuration/BranchAnalysisConfiguration.groovy diff --git a/README.md b/README.md index 7bad7e5..22069ab 100644 --- a/README.md +++ b/README.md @@ -145,6 +145,7 @@ pipeline1C() * Предполагается наличие единственной настройки `SonarQube installation` (`sonarqube` -> `sonarQubeInstallation`). * Используется `sonar-scanner` из переменной окружения `PATH` (`sonarqube` -> `useSonarScannerFromPath`). * Если использование `sonar-scanner` из переменной окружения `PATH` выключено, предполагается наличие настроенного глобального инструмента `SonarQube Scanner` с идентификатором инструмента `sonar-scanner` (`sonarqube` -> `sonarScannerToolName`). + * Применяется расчет аргументов командной строки для работы [`branch plugin`](https://github.com/mc1arke/sonarqube-community-branch-plugin) или коммерческих версий SonarQube (`sonarqube` -> `branchAnalysisConfiguration`). * Если разработка ведется с использованием подсистемы [БСП "Обновление версии ИБ"](https://its.1c.ru/db/bsp315doc#content:4:1:issogl1_обновление_версии_иб), то в значение параметра `sonar.projectVersion=$configurationVersion` утилиты `sonar-scanner` можно передавать версию из созданного общего модуля. * Шаг анализа не дожидается окончания фонового задания на сервере SonarQube и не анализирует результат прохождения Порога качества (`sonarqube` -> `waitForQualityGate`). Для этого необходимо заполнить параметр (`sonarqube` -> `infoBaseUpdateModuleName`). Если параметр не заполнен, версия передается из корня конфигурации. diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index ec1e12c..e770b9c 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -45,7 +45,7 @@ "useSonarScannerFromPath": true, "sonarScannerToolName": "sonar-scanner", "infoBaseUpdateModuleName" : "", - "useBranchPlugin" : true, + "branchAnalysisConfiguration": "fromEnv", "waitForQualityGate": false }, "syntaxCheck": { diff --git a/resources/schema.json b/resources/schema.json index 28a0526..9c5b6ec 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -178,9 +178,10 @@ "type" : "string", "description" : "Имя общего модуля (например, ОбновлениеИнформационнойБазыXXX), в котором указана версия библиотеки.\n Версия должна задаваться в виде присвоения `Описание.Версия = \"ваш номер версии\";`\n " }, - "useBranchPlugin" : { - "type" : "boolean", - "description" : "Используется ли Branch-plugin в SonarQube" + "branchAnalysisConfiguration" : { + "type" : "string", + "description" : "Вариант конфигурации branch plugin.\n Поддерживаемые варианты:\n * auto - применяется автоконфигурация sonar-scanner силами branchplugin. Так же может применяться для отключения конфигурирования, если branch plugin отсутствует;\n * fromEnv - применяется ручная конфигурация sonar-scanner на основе переменных среды.\n Значение по умолчанию: fromEnv.", + "enum" : [ "auto", "fromEnv" ] }, "waitForQualityGate" : { "type" : "boolean", diff --git a/src/ru/pulsar/jenkins/library/configuration/BranchAnalysisConfiguration.groovy b/src/ru/pulsar/jenkins/library/configuration/BranchAnalysisConfiguration.groovy new file mode 100644 index 0000000..39ef5e0 --- /dev/null +++ b/src/ru/pulsar/jenkins/library/configuration/BranchAnalysisConfiguration.groovy @@ -0,0 +1,17 @@ +package ru.pulsar.jenkins.library.configuration + +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.annotation.JsonPropertyDescription + +enum BranchAnalysisConfiguration { + @JsonPropertyDescription( + """Применяется автоконфигурация sonar-scanner силами branchplugin. + Так же может применяться для отключения конфигурирования, если branch plugin отсутствует""" + ) + @JsonProperty("auto") + AUTO, + + @JsonPropertyDescription("Применяется ручная конфигурация sonar-scanner на основе переменных среды") + @JsonProperty("fromEnv") + FROM_ENV +} diff --git a/src/ru/pulsar/jenkins/library/configuration/SonarQubeOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/SonarQubeOptions.groovy index ba80574..efa3da7 100644 --- a/src/ru/pulsar/jenkins/library/configuration/SonarQubeOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/SonarQubeOptions.groovy @@ -25,8 +25,12 @@ class SonarQubeOptions implements Serializable { """) String infoBaseUpdateModuleName - @JsonPropertyDescription("Используется ли Branch-plugin в SonarQube") - Boolean useBranchPlugin + @JsonPropertyDescription("""Вариант конфигурации branch plugin. + Поддерживаемые варианты: + * auto - применяется автоконфигурация sonar-scanner силами branchplugin. Так же может применяться для отключения конфигурирования, если branch plugin отсутствует; + * fromEnv - применяется ручная конфигурация sonar-scanner на основе переменных среды. + Значение по умолчанию: fromEnv.""") + BranchAnalysisConfiguration branchAnalysisConfiguration @JsonPropertyDescription("""Ожидать состояние Quality Gate от SonarQube после загрузки анализа. По умолчанию `false`. Таймаут ожидания состояния равен таймауту шага. @@ -41,7 +45,7 @@ class SonarQubeOptions implements Serializable { ", sonarScannerToolName='" + sonarScannerToolName + '\'' + ", sonarQubeInstallation='" + sonarQubeInstallation + '\'' + ", infoBaseUpdateModuleName='" + infoBaseUpdateModuleName + '\'' + - ", useBranchPlugin='" + useBranchPlugin + '\'' + + ", branchAnalysisConfiguration='" + branchAnalysisConfiguration + '\'' + ", waitForQualityGate='" + waitForQualityGate + '\'' + '}'; } diff --git a/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy b/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy index 481f5ed..23b5538 100644 --- a/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy +++ b/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy @@ -1,6 +1,7 @@ package ru.pulsar.jenkins.library.steps import ru.pulsar.jenkins.library.IStepExecutor +import ru.pulsar.jenkins.library.configuration.BranchAnalysisConfiguration import ru.pulsar.jenkins.library.configuration.JobConfiguration import ru.pulsar.jenkins.library.configuration.SourceFormat import ru.pulsar.jenkins.library.ioc.ContextRegistry @@ -38,7 +39,8 @@ class SonarScanner implements Serializable { String sonarCommand = "$sonarScannerBinary" - if (config.sonarQubeOptions.useBranchPlugin) { + def branchAnalysisConfiguration = config.sonarQubeOptions.branchAnalysisConfiguration + if (branchAnalysisConfiguration == BranchAnalysisConfiguration.FROM_ENV) { if (env.CHANGE_ID){ sonarCommand += " -Dsonar.pullrequest.key=$env.CHANGE_ID" sonarCommand += " -Dsonar.pullrequest.branch=$env.CHANGE_BRANCH" @@ -46,6 +48,8 @@ class SonarScanner implements Serializable { } else { sonarCommand += " -Dsonar.branch.name=$env.BRANCH_NAME" } + } else (branchAnalysisConfiguration == BranchAnalysisConfiguration.AUTO) { + // no-op } String projectVersion = computeProjectVersion() diff --git a/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java b/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java index a8b81f0..6434e26 100644 --- a/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java +++ b/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java @@ -10,6 +10,7 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import static org.assertj.core.api.Assertions.assertThat; +import static ru.pulsar.jenkins.library.configuration.BranchAnalysisConfiguration.AUTO; class ConfigurationReaderTest { @@ -37,6 +38,7 @@ class ConfigurationReaderTest { assertThat(jobConfiguration.getSonarQubeOptions().getSonarScannerToolName()).isEqualTo("sonar-scanner"); assertThat(jobConfiguration.getSonarQubeOptions().getSonarQubeInstallation()).isEqualTo("qa"); assertThat(jobConfiguration.getSonarQubeOptions().getUseSonarScannerFromPath()).isTrue(); + assertThat(jobConfiguration.getSonarQubeOptions().getBranchAnalysisConfiguration()).isEqualTo(AUTO); assertThat(jobConfiguration.getSecrets()) .hasFieldOrPropertyWithValue("storage", "1234") diff --git a/test/unit/resources/jobConfiguration.json b/test/unit/resources/jobConfiguration.json index 5a57c44..ba6c526 100644 --- a/test/unit/resources/jobConfiguration.json +++ b/test/unit/resources/jobConfiguration.json @@ -17,7 +17,8 @@ ] }, "sonarqube": { - "sonarQubeInstallation": "qa" + "sonarQubeInstallation": "qa", + "branchAnalysisConfiguration": "auto" }, "syntaxCheck": { "checkModes": ["-ThinClient"]