diff --git a/README.md b/README.md index 7026298e..ec238285 100644 --- a/README.md +++ b/README.md @@ -23,24 +23,24 @@ 1. Для запуска шага анализа SonarQube требуется агент с меткой `sonar`. 1. Для запуска шагов, работающих с EDT (валидация, трансформация формата исходников) требуется агент с меткой `edt` (если используется несколько версий EDT необходимо к метке добавить версию, например `edt@2021.3.4:x86_64`) и агент с меткой `oscript`, на котором глобально установлена библиотека [stebi](https://github.com/Stepa86/stebi) версии 1.9.1 или новее. 1. Для запуска шагов, работающих с 1С (подготовка, синтаксический контроль и т.д.) требуется агент с меткой, совпадающей со значением в поле `v8version` файла конфигурации. -1. В качестве ИБ используется файловая база, создаваемая в каталоге `./build/ib`. При необходимости вы можете создать пользователей на фазе инициализации ИБ. ## Возможности 1. Все шаги можно запустить на базе docker-образов из https://github.com/firstBitSemenovskaya/onec-docker. См. [памятку по слоям и последовательности сборки](https://github.com/firstBitSemenovskaya/onec-docker/blob/feature/first-bit/Layers.md). -1. Поддержка как формата выгрузки из Конфигуратора, так и формата EDT. -1. Подготовка информационной базы по версии из хранилища конфигурации, из исходных файлов конфигурации, комбинированный режим (основная ветка - из хранилища, остальные - из исходников). -1. Запуск ИБ в режиме выполнения обработчиков обновления БСП. -1. Дополнительные шаги инициализации данных в ИБ. -1. Трансформация кода из формата конфигуратора в формат EDT. -1. Трансформация кода из формата EDT в формат конфигуратора. -1. Запуск BDD сценариев с сохранением результатов в формате Allure. -1. Запуск синтаксического контроля средствами конфигуратора и сохранение результатов в виде отчета jUnit. -1. Запуск валидации проекта средствами EDT и конвертация отчета в формате generic issues. -1. Запуск статического анализа для SonarQube. -1. Публикация результатов junit и Allure в интерфейс Jenkins. -1. Рассылка результатов сборки на почту и в Telegram. -1. Конфигурирование логгера запускаемых oscript-приложений. +2. Поддержка как формата выгрузки из Конфигуратора, так и формата EDT. +3. Подготовка информационной базы по версии из хранилища конфигурации, из исходных файлов конфигурации, комбинированный режим (основная ветка - из хранилища, остальные - из исходников). +Загрузка из файла *.dt с последующим обновлением из исходных файлов конфигурации или хранилища. Использование готовой базы. +4. Запуск ИБ в режиме выполнения обработчиков обновления БСП. +5. Дополнительные шаги инициализации данных в ИБ. +6. Трансформация кода из формата конфигуратора в формат EDT. +7. Трансформация кода из формата EDT в формат конфигуратора. +8. Запуск BDD сценариев с сохранением результатов в формате Allure. +9. Запуск синтаксического контроля средствами конфигуратора и сохранение результатов в виде отчета jUnit. +10. Запуск валидации проекта средствами EDT и конвертация отчета в формате generic issues. +11. Запуск статического анализа для SonarQube. +12. Публикация результатов junit и Allure в интерфейс Jenkins. +13. Рассылка результатов сборки на почту и в Telegram. +14. Конфигурирование логгера запускаемых oscript-приложений. ## Подключение diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index 5fcd3eb7..f317f5af 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -3,6 +3,7 @@ "v8version": "8.3", "edtVersion": "", "srcDir": "src/cf", + "basePath": "", "sourceFormat": "designer", "defaultBranch": "main", "secrets": { @@ -37,7 +38,8 @@ "initInfobase": { "initMethod": "fromStorage", "runMigration": true, - "additionalInitializationSteps": [] + "additionalInitializationSteps": [], + "vrunnerSettings": "./tools/vrunner.json" }, "bdd": { "vrunnerSteps": [ diff --git a/resources/schema.json b/resources/schema.json index fbeb0dd8..cdc40ab2 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -14,6 +14,10 @@ "type" : "string", "description" : "Путь к корневому каталогу с исходниками конфигурации, в случае хранения исходников в формате EDT, необходимо указать путь к проекту" }, + "basePath" : { + "type" : "string", + "description" : "Путь к базе для выполнения тестов" + }, "sourceFormat" : { "type" : "string", "description" : "Формат исходников конфигурации", @@ -156,6 +160,10 @@ "items" : { "type" : "string" } + }, + "vrunnerSettings" : { + "type" : "string", + "description" : "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n " } } }, diff --git a/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseMethod.groovy b/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseMethod.groovy index 30986ad8..fcc1ce7f 100644 --- a/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseMethod.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseMethod.groovy @@ -10,6 +10,12 @@ enum InitInfoBaseMethod { @JsonProperty("fromSource") FROM_SOURCE, + @JsonProperty("fromDT") + FROM_DT, + + @JsonProperty("notInit") + NOT_INIT, + @JsonProperty("defaultBranchFromStorage") DEFAULT_BRANCH_FROM_STORAGE diff --git a/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy index f0874a60..0a7f9d9d 100644 --- a/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy @@ -25,6 +25,11 @@ class InitInfoBaseOptions implements Serializable { """) String[] additionalInitializationSteps + @JsonPropertyDescription("""Путь к конфигурационному файлу vanessa-runner. + По умолчанию содержит значение "./tools/vrunner.json". + """) + String vrunnerSettings + @Override @NonCPS String toString() { @@ -32,6 +37,7 @@ class InitInfoBaseOptions implements Serializable { "initMethod=" + initMethod + ", runMigration=" + runMigration + ", additionalInitializationSteps=" + additionalInitializationSteps + + ", vrunnerSettings=" + vrunnerSettings + '}'; } } diff --git a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy index 75932fd9..21d86c75 100644 --- a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy @@ -18,6 +18,9 @@ class JobConfiguration implements Serializable { @JsonPropertyDescription("Путь к корневому каталогу с исходниками конфигурации, в случае хранения исходников в формате EDT, необходимо указать путь к проекту") String srcDir + @JsonPropertyDescription("Путь к базе для выполнения тестов") + String basePath + @JsonPropertyDescription("Формат исходников конфигурации") SourceFormat sourceFormat; @@ -74,6 +77,7 @@ class JobConfiguration implements Serializable { "v8version='" + v8version + '\'' + ", edtVersion='" + edtVersion + '\'' + ", srcDir='" + srcDir + '\'' + + ", basePath='" + basePath + '\'' + ", sourceFormat=" + sourceFormat + ", stageFlags=" + stageFlags + ", timeoutOptions=" + timeoutOptions + @@ -111,4 +115,13 @@ class JobConfiguration implements Serializable { } return edtVersionForRing } + + String baseName(){ + String base = basePath + if (basePath == '') { + base = "/F./build.ib" + } + + return base + } } \ No newline at end of file diff --git a/src/ru/pulsar/jenkins/library/steps/Bdd.groovy b/src/ru/pulsar/jenkins/library/steps/Bdd.groovy index 454b4c4c..a442e33b 100644 --- a/src/ru/pulsar/jenkins/library/steps/Bdd.groovy +++ b/src/ru/pulsar/jenkins/library/steps/Bdd.groovy @@ -34,7 +34,8 @@ class Bdd implements Serializable { config.bddOptions.vrunnerSteps.each { Logger.println("Шаг запуска сценариев командой ${it}") String vrunnerPath = VRunner.getVRunnerPath(); - VRunner.exec("$vrunnerPath ${it} --ibconnection \"/F./build/ib\"") + String base = config.baseName() + VRunner.exec("$vrunnerPath ${it} --ibconnection \"$base\"") } } } diff --git a/src/ru/pulsar/jenkins/library/steps/DesignerToEdtFormatTransformation.groovy b/src/ru/pulsar/jenkins/library/steps/DesignerToEdtFormatTransformation.groovy index 7ae969df..7a902e20 100644 --- a/src/ru/pulsar/jenkins/library/steps/DesignerToEdtFormatTransformation.groovy +++ b/src/ru/pulsar/jenkins/library/steps/DesignerToEdtFormatTransformation.groovy @@ -34,7 +34,7 @@ class DesignerToEdtFormatTransformation implements Serializable { def env = steps.env(); def workspaceDir = "$env.WORKSPACE/$WORKSPACE" - def configurationRoot = new File(env.WORKSPACE, config.srcDir).getAbsolutePath() + def configurationRoot = "$env.WORKSPACE/$config.srcDir" def edtVersionForRing = EDT.ringModule(config) steps.deleteDir(workspaceDir) diff --git a/src/ru/pulsar/jenkins/library/steps/EdtValidate.groovy b/src/ru/pulsar/jenkins/library/steps/EdtValidate.groovy index 98c8f6d8..612adbb7 100644 --- a/src/ru/pulsar/jenkins/library/steps/EdtValidate.groovy +++ b/src/ru/pulsar/jenkins/library/steps/EdtValidate.groovy @@ -60,5 +60,9 @@ class EdtValidate implements Serializable { steps.archiveArtifacts("$DesignerToEdtFormatTransformation.WORKSPACE/.metadata/.log") steps.archiveArtifacts(RESULT_FILE) steps.stash(RESULT_STASH, RESULT_FILE) + boolean succsessfullDeleted = new File(RESULT_FILE).delete() + if (succsessfullDeleted){ + Logger.println("$RESULT_FILE успешно удален") + } } } diff --git a/src/ru/pulsar/jenkins/library/steps/InitFromFiles.groovy b/src/ru/pulsar/jenkins/library/steps/InitFromFiles.groovy index e08fa32a..912f5d3b 100644 --- a/src/ru/pulsar/jenkins/library/steps/InitFromFiles.groovy +++ b/src/ru/pulsar/jenkins/library/steps/InitFromFiles.groovy @@ -43,7 +43,13 @@ class InitFromFiles implements Serializable { Logger.println("Выполнение загрузки конфигурации из файлов") String vrunnerPath = VRunner.getVRunnerPath(); - def initCommand = "$vrunnerPath init-dev --src $srcDir --ibconnection \"/F./build/ib\"" + String base = config.baseName() + def initCommand = "$vrunnerPath init-dev --src $srcDir --ibconnection \"$base\"" + + String vrunnerSettings = config.initInfoBaseOptions.vrunnerSettings + if (steps.fileExists(vrunnerSettings) && config.basePath != '') { + initCommand += " --settings $vrunnerSettings" + } VRunner.exec(initCommand) } } diff --git a/src/ru/pulsar/jenkins/library/steps/InitFromStorage.groovy b/src/ru/pulsar/jenkins/library/steps/InitFromStorage.groovy index 888dde1f..aa78f256 100644 --- a/src/ru/pulsar/jenkins/library/steps/InitFromStorage.groovy +++ b/src/ru/pulsar/jenkins/library/steps/InitFromStorage.groovy @@ -55,7 +55,8 @@ class InitFromStorage implements Serializable { ) ]) { String vrunnerPath = VRunner.getVRunnerPath() - VRunner.exec "$vrunnerPath init-dev --storage $storageVersionParameter --ibconnection \"/F./build/ib\"" + String base = config.baseName() + VRunner.exec "$vrunnerPath init-dev --storage $storageVersionParameter --ibconnection \"$base\"" } } diff --git a/src/ru/pulsar/jenkins/library/steps/InitInfoBase.groovy b/src/ru/pulsar/jenkins/library/steps/InitInfoBase.groovy index 981e52e4..ee3f2cfe 100644 --- a/src/ru/pulsar/jenkins/library/steps/InitInfoBase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/InitInfoBase.groovy @@ -41,13 +41,14 @@ class InitInfoBase implements Serializable { executeParameter = '\\' + executeParameter } command += executeParameter; - command += ' --ibconnection "/F./build/ib"' + String base = config.baseName() + command += ' --ibconnection "$base"' // Запуск миграции steps.catchError { VRunner.exec(command) } - } else { + } else {F Logger.println("Шаг миграции ИБ выключен") } @@ -57,12 +58,12 @@ class InitInfoBase implements Serializable { files = files.sort new OrderBy( { it.name }) files.each { Logger.println("Первичная инициализация файлом ${it.path}") - VRunner.exec("$vrunnerPath vanessa --settings ${it.path} --ibconnection \"/F./build/ib\"") + VRunner.exec("$vrunnerPath vanessa --settings ${it.path} --ibconnection \"${base}\"") } } else { config.initInfoBaseOptions.additionalInitializationSteps.each { Logger.println("Первичная инициализация командой ${it}") - VRunner.exec("$vrunnerPath ${it} --ibconnection \"/F./build/ib\"") + VRunner.exec("$vrunnerPath ${it} --ibconnection \"${base}\"") } } } diff --git a/src/ru/pulsar/jenkins/library/steps/SmokeTest.groovy b/src/ru/pulsar/jenkins/library/steps/SmokeTest.groovy index 00998e4c..1c18ef49 100644 --- a/src/ru/pulsar/jenkins/library/steps/SmokeTest.groovy +++ b/src/ru/pulsar/jenkins/library/steps/SmokeTest.groovy @@ -38,7 +38,8 @@ class SmokeTest implements Serializable { def env = steps.env() String vrunnerPath = VRunner.getVRunnerPath() - String command = "$vrunnerPath xunit --ibconnection \"/F./build/ib\"" + String base = config.baseName() + String command = "$vrunnerPath xunit --ibconnection \"$base\"" String vrunnerSettings = options.vrunnerSettings if (steps.fileExists(vrunnerSettings)) { 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 35fd8219..024838d2 100644 --- a/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java +++ b/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java @@ -34,6 +34,7 @@ void testCreateJobConfigurationObject() throws IOException { // then assertThat(jobConfiguration.getV8version()).isEqualTo("8.3.14.1944"); assertThat(jobConfiguration.getEdtVersion()).isEqualTo("2021.3.4:x86_64"); + assertThat(jobConfiguration.getBasePath()).isEqualTo("/sserver\\base"); assertThat(jobConfiguration.getSonarQubeOptions().getSonarScannerToolName()).isEqualTo("sonar-scanner"); assertThat(jobConfiguration.getSonarQubeOptions().getSonarQubeInstallation()).isEqualTo("qa"); @@ -109,6 +110,22 @@ void testEdtAgentLabel() throws IOException { assertThat(jobConfiguration.edtAgentLabel()).isEqualTo("edt@2021.3.4:x86_64"); } + @Test + void testbaseName() throws IOException { + // given + String config = IOUtils.resourceToString( + "jobConfiguration.json", + StandardCharsets.UTF_8, + this.getClass().getClassLoader() + ); + + // when + JobConfiguration jobConfiguration = ConfigurationReader.create(config); + + // then + assertThat(jobConfiguration.baseName()).isEqualTo("/sserver\\base"); + } + @Disabled void testInfoBaseFromFiles() throws IOException { // given diff --git a/test/unit/resources/jobConfiguration.json b/test/unit/resources/jobConfiguration.json index fbf6f883..a9d70b58 100644 --- a/test/unit/resources/jobConfiguration.json +++ b/test/unit/resources/jobConfiguration.json @@ -1,6 +1,7 @@ { "v8version": "8.3.14.1944", "edtVersion": "2021.3.4:x86_64", + "basePath" : "/sserver\\base", "secrets": { "storage": "1234" }, diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 89faa801..4b8541c8 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -1,5 +1,6 @@ /* groovylint-disable NestedBlockDepth */ import groovy.transform.Field +import ru.pulsar.jenkins.library.configuration.InitInfoBaseMethod import ru.pulsar.jenkins.library.configuration.JobConfiguration import ru.pulsar.jenkins.library.configuration.SourceFormat import ru.pulsar.jenkins.library.utils.RepoUtils @@ -51,7 +52,7 @@ void call() { stage('Подготовка 1C базы') { when { beforeAgent true - expression { config.stageFlags.needInfoBase() } + expression { config.stageFlags.needInfoBase() && config.initInfoBaseOptions.initMethod != InitInfoBaseMethod.NOT_INIT} } stages { @@ -108,6 +109,10 @@ void call() { } stage('Архивация ИБ') { + when { + beforeAgent true + expression { config.basePath == '' } + } steps { timeout(time: config.timeoutOptions.zipInfoBase, unit: TimeUnit.MINUTES) { printLocation() @@ -181,9 +186,13 @@ void call() { } steps { timeout(time: config.timeoutOptions.bdd, unit: TimeUnit.MINUTES) { - unzipInfobase() + script { + if (config.basePath == '') { + unzipInfobase() + } - bdd config + bdd config + } } } } @@ -213,9 +222,13 @@ void call() { } steps { timeout(time: config.timeoutOptions.smoke, unit: TimeUnit.MINUTES) { - unzipInfobase() + script { + if (config.basePath == '') { + unzipInfobase() + } - smoke config + smoke config + } } } } diff --git a/vars/syntaxCheck.groovy b/vars/syntaxCheck.groovy index b879fdb4..d81cacba 100644 --- a/vars/syntaxCheck.groovy +++ b/vars/syntaxCheck.groovy @@ -29,7 +29,8 @@ def call(JobConfiguration config) { createDir(outPath) String vrunnerPath = VRunner.getVRunnerPath(); - String command = "$vrunnerPath syntax-check --ibconnection \"/F./build/ib\"" + String base = config.baseName() + String command = "$vrunnerPath syntax-check --ibconnection \"$base\"" // Временно убрал передачу параметра. // См. https://github.com/vanessa-opensource/vanessa-runner/issues/361