diff --git a/README.md b/README.md index b2c0385..a2fe76e 100644 --- a/README.md +++ b/README.md @@ -143,5 +143,6 @@ pipeline1C() * Предполагается наличие единственной настройки `SonarQube installation` (`sonarqube` -> `sonarQubeInstallation`). * Используется `sonar-scanner` из переменной окружения `PATH` (`sonarqube` -> `useSonarScannerFromPath`). * Если использование `sonar-scanner` из переменной окружения `PATH` выключено, предполагается наличие настроенного глобального инструмента `SonarQube Scanner` с идентификатором инструмента `sonar-scanner` (`sonarqube` -> `sonarScannerToolName`). - * Версия из корня конфигурации передается утилите `sonar-scanner` как значение параметра `sonar.projectVersion=$configurationVersion`. + * Если разработка ведется с использованием подсистемы [БСП "Обновление версии ИБ"](https://its.1c.ru/db/bsp315doc#content:4:1:issogl1_обновление_версии_иб), то в значение параметра `sonar.projectVersion=$configurationVersion` утилиты `sonar-scanner` можно передавать версию из созданного общего модуля. + Для этого необходимо заполнить параметр (`sonarqube` -> `infoBaseUpdateModuleName`). Если параметр не заполнен, версия передается из корня конфигурации. * Если выполнялась валидация EDT, результаты валидации в формате `generic issues` передаются утилите `sonar-scanner` как значение параметра `sonar.externalIssuesReportPaths`. diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index fb4979a..7ed9f03 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -42,7 +42,8 @@ "sonarqube": { "sonarQubeInstallation": "", "useSonarScannerFromPath": true, - "sonarScannerToolName": "sonar-scanner" + "sonarScannerToolName": "sonar-scanner", + "infoBaseUpdateModuleName" : "" }, "syntaxCheck": { "groupErrorsByMetadata": true, diff --git a/resources/schema.json b/resources/schema.json index 7f5d9ab..5d2c076 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -169,6 +169,10 @@ "sonarScannerToolName" : { "type" : "string", "description" : "Имя настроенной утилиты sonar-scanner.\nПрименяется, если useSonarScannerFromPath установлено в false." + }, + "infoBaseUpdateModuleName" : { + "type" : "string", + "description" : "Имя общего модуля (например, ОбновлениеИнформационнойБазыXXX), в котором указана версия библиотеки.\n Версия должна задаваться в виде присвоения `Описание.Версия = \"ваш номер версии\";`\n " } } }, diff --git a/src/ru/pulsar/jenkins/library/configuration/SonarQubeOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/SonarQubeOptions.groovy index cb25672..dad4964 100644 --- a/src/ru/pulsar/jenkins/library/configuration/SonarQubeOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/SonarQubeOptions.groovy @@ -20,6 +20,11 @@ class SonarQubeOptions implements Serializable { ) String sonarScannerToolName + @JsonPropertyDescription("""Имя общего модуля (например, ОбновлениеИнформационнойБазыXXX), в котором указана версия библиотеки. + Версия должна задаваться в виде присвоения `Описание.Версия = "ваш номер версии";` + """) + String infoBaseUpdateModuleName + @Override @NonCPS String toString() { @@ -27,6 +32,7 @@ class SonarQubeOptions implements Serializable { "useSonarScannerFromPath=" + useSonarScannerFromPath + ", sonarScannerToolName='" + sonarScannerToolName + '\'' + ", sonarQubeInstallation='" + sonarQubeInstallation + '\'' + + ", infoBaseUpdateModuleName='" + infoBaseUpdateModuleName + '\'' + '}'; } } diff --git a/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy b/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy index bac8532..022e187 100644 --- a/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy +++ b/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy @@ -10,15 +10,9 @@ import ru.pulsar.jenkins.library.utils.VersionParser class SonarScanner implements Serializable { private final JobConfiguration config; - private final String rootFile SonarScanner(JobConfiguration config) { this.config = config - if (config.sourceFormat == SourceFormat.EDT){ - this.rootFile = "$config.srcDir/src/Configuration/Configuration.mdo" - } else { - this.rootFile = "$config.srcDir/Configuration.xml" - } } def run() { @@ -44,15 +38,9 @@ class SonarScanner implements Serializable { String sonarCommand = "$sonarScannerBinary -Dsonar.branch.name=$env.BRANCH_NAME" - String configurationVersion - if (config.sourceFormat == SourceFormat.EDT) { - configurationVersion = VersionParser.edt(rootFile) - } else { - configurationVersion = VersionParser.configuration(rootFile) - } - - if (configurationVersion) { - sonarCommand += " -Dsonar.projectVersion=$configurationVersion" + String projectVersion = computeProjectVersion() + if (projectVersion) { + sonarCommand += " -Dsonar.projectVersion=$projectVersion" } if (config.stageFlags.edtValidate) { @@ -69,4 +57,27 @@ class SonarScanner implements Serializable { steps.cmd(sonarCommand) } } + + private String computeProjectVersion() { + String projectVersion + String nameOfModule = config.sonarQubeOptions.infoBaseUpdateModuleName + + if (!nameOfModule.isEmpty()) { + String rootFile + if (config.sourceFormat == SourceFormat.EDT) { + rootFile = "$config.srcDir/src/CommonModules/$nameOfModule/Module.bsl" + } else { + rootFile = "$config.srcDir/CommonModules/$nameOfModule/Ext/Module.bsl" + } + projectVersion = VersionParser.ssl(rootFile) + } else if (config.sourceFormat == SourceFormat.EDT) { + String rootFile = "$config.srcDir/src/Configuration/Configuration.mdo" + projectVersion = VersionParser.edt(rootFile) + } else { + String rootFile = "$config.srcDir/Configuration.xml" + projectVersion = VersionParser.configuration(rootFile) + } + + return projectVersion + } } diff --git a/src/ru/pulsar/jenkins/library/utils/VersionParser.groovy b/src/ru/pulsar/jenkins/library/utils/VersionParser.groovy index 93c49da..4914cdf 100644 --- a/src/ru/pulsar/jenkins/library/utils/VersionParser.groovy +++ b/src/ru/pulsar/jenkins/library/utils/VersionParser.groovy @@ -8,6 +8,7 @@ import java.util.regex.Pattern class VersionParser implements Serializable { final static VERSION_REGEXP = ~/(?i)(.*)<\/version>/ + final static VERSION_REGEXP_SSL = ~/(?i)Описание.Версия = "(.*)";/ static String configuration(rootFile = 'src/cf/Configuration.xml') { return extractVersionFromFile(rootFile, VERSION_REGEXP) @@ -21,6 +22,10 @@ class VersionParser implements Serializable { return extractVersionFromFile(versionFile, VERSION_REGEXP) } + static String ssl(versionFile) { + return extractVersionFromFile(versionFile, VERSION_REGEXP_SSL) + } + private static String extractVersionFromFile(String filePath, Pattern regexp) { IStepExecutor steps = ContextRegistry.getContext().getStepExecutor()