From a527a241735687f31ed3355736c130527b9929a2 Mon Sep 17 00:00:00 2001 From: Dima Date: Mon, 17 Jul 2023 18:04:16 +0300 Subject: [PATCH] finalize --- README.md | 3 +- resources/schema.json | 12 ++++-- .../library/configuration/BddOptions.groovy | 6 ++- .../configuration/CoverageOptions.groovy | 6 --- .../configuration/SmokeTestOptions.groovy | 6 ++- .../pulsar/jenkins/library/steps/Bdd.groovy | 21 +++++----- .../library/steps/PublishAllure.groovy | 4 +- .../jenkins/library/steps/SmokeTest.groovy | 38 +++++++++++-------- .../jenkins/library/steps/SonarScanner.groovy | 8 ++-- .../groovy/jobConfigurationTest.groovy | 1 - .../resources/jobConfiguration.json | 1 - 11 files changed, 60 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index ddf9fef..c5cff35 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,8 @@ 1. При использовании EDT версии 2024.1.0 и выше вместо ring используется 1cedtcli, который должен быть прописан в PATH на агенте. 1. Для запуска шагов, работающих с 1С (подготовка, синтаксический контроль и т.д.) требуется агент с меткой, совпадающей со значением в поле `v8version` файла конфигурации. 1. В качестве ИБ используется файловая база, создаваемая в каталоге `./build/ib`. При необходимости вы можете создать пользователей на фазе инициализации ИБ. -1. Для замеров покрытия на агентах должны быть установлены [Coverage41C](https://github.com/1c-syntax/Coverage41C), EDT и сервер отладки dbgs. +1. Для замеров покрытия на агентах должны быть установлены [Coverage41C](https://github.com/1c-syntax/Coverage41C), EDT и сервер отладки dbgs. Вместо установки EDT целиком можно использовать только отдельные ее компоненты, см. [Coverage41C/README.md](https://github.com/1c-syntax/Coverage41C). +1. Для параллельного выполнения шагов `bdd` и `smoke` с включенными замерами покрытия на одной ноде необходимо, чтобы в `jobConfiguration.json` были указаны **разные** порты сервера отладки для каждого шага. Параллельные билды с замерами покрытия на одной ноде не поддерживаются. ## Возможности diff --git a/resources/schema.json b/resources/schema.json index acada36..ee65310 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -85,6 +85,10 @@ "coverage" : { "type" : "boolean", "description" : "Выполнять замер покрытия" + }, + "dbgsPort" : { + "type" : "boolean", + "description" : "Порт, на котором будет запущен сервер отладки для замера покрытия" } } } @@ -238,6 +242,10 @@ "coverage" : { "type" : "boolean", "description" : "Выполнять замер покрытия" + }, + "dbgsPort" : { + "type" : "boolean", + "description" : "Порт, на котором будет запущен сервер отладки для замера покрытия" } } }, @@ -250,10 +258,6 @@ "type" : "string", "description" : "Путь к исполняемому файлу dbgs.\n По умолчанию равен /opt/1cv8/current/dbgs.\n " }, - "dbgsPort" : { - "type" : "integer", - "description" : "Порт сервера отладки.\n По умолчанию равен 1550.\n " - }, "coverage41CPath" : { "type" : "string", "description" : "Путь к исполняемому файлу Coverage41C\n По умолчанию равен Coverage41C.\n " diff --git a/src/ru/pulsar/jenkins/library/configuration/BddOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/BddOptions.groovy index 3cab346..d86bdb4 100644 --- a/src/ru/pulsar/jenkins/library/configuration/BddOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/BddOptions.groovy @@ -19,12 +19,16 @@ class BddOptions implements Serializable { @JsonPropertyDescription("Выполнять замер покрытия") Boolean coverage = false + @JsonPropertyDescription("Порт, на котором будет запущен сервер отладки для замера покрытия") + Boolean dbgsPort = 1550 + @Override @NonCPS String toString() { return "BddOptions{" + "vrunnerSteps=" + vrunnerSteps + "coverage=" + coverage + - '}'; + "dbgsPort=" + dbgsPort + + '}' } } diff --git a/src/ru/pulsar/jenkins/library/configuration/CoverageOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/CoverageOptions.groovy index dbb677c..665f3dc 100644 --- a/src/ru/pulsar/jenkins/library/configuration/CoverageOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/CoverageOptions.groovy @@ -12,11 +12,6 @@ class CoverageOptions implements Serializable { ''') String dbgsPath - @JsonPropertyDescription('''Порт сервера отладки. - По умолчанию равен 1550. - ''') - int dbgsPort = 1550 - @JsonPropertyDescription('''Путь к исполняемому файлу Coverage41C По умолчанию равен Coverage41C. ''') @@ -27,7 +22,6 @@ class CoverageOptions implements Serializable { String toString() { return "coverageOptions{" + "dbgsPath=" + dbgsPath + - "dbgsPort=" + dbgsPort + ", coverage41CPath=" + coverage41CPath + '}' } diff --git a/src/ru/pulsar/jenkins/library/configuration/SmokeTestOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/SmokeTestOptions.groovy index 78fca0f..a9ca372 100644 --- a/src/ru/pulsar/jenkins/library/configuration/SmokeTestOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/SmokeTestOptions.groovy @@ -15,7 +15,7 @@ class SmokeTestOptions implements Serializable { @JsonPropertyDescription("""Путь к конфигурационному файлу для xddTestRunner. По умолчанию содержит значение "./tools/xUnitParams.json". """) - String xddConfigPath; + String xddConfigPath @JsonPropertyDescription("""Выполнять публикацию результатов в отчет Allure. По умолчанию выключено. @@ -30,6 +30,9 @@ class SmokeTestOptions implements Serializable { @JsonPropertyDescription("Выполнять замер покрытия") Boolean coverage = false + @JsonPropertyDescription("Порт, на котором будет запущен сервер отладки для замера покрытия") + Boolean dbgsPort = 1650 + @Override @NonCPS String toString() { @@ -39,6 +42,7 @@ class SmokeTestOptions implements Serializable { ", publishToAllureReport=" + publishToAllureReport + ", publishToJUnitReport=" + publishToJUnitReport + ", coverage=" + coverage + + ", dbgsPort=" + dbgsPort + '}' } } diff --git a/src/ru/pulsar/jenkins/library/steps/Bdd.groovy b/src/ru/pulsar/jenkins/library/steps/Bdd.groovy index 780be88..c365a75 100644 --- a/src/ru/pulsar/jenkins/library/steps/Bdd.groovy +++ b/src/ru/pulsar/jenkins/library/steps/Bdd.groovy @@ -12,6 +12,10 @@ class Bdd implements Serializable { private final JobConfiguration config + public static final String ALLURE_STASH = 'bdd-allure' + public static final String COVERAGE_STASH_NAME = 'bdd-coverage' + public static final String COVERAGE_STASH_PATH = 'build/out/bdd-coverage.xml' + Bdd(JobConfiguration config) { this.config = config } @@ -38,17 +42,17 @@ class Bdd implements Serializable { List returnStatuses = [] def coverageOpts = config.coverageOptions - def port = coverageOpts.dbgsPort - def lockable_resource = RandomStringUtils.random(9, true, false) + def port = options.dbgsPort + def lockableResource = RandomStringUtils.random(9, true, false) if (options.coverage) { - lockable_resource = "${env.NODE_NAME}_$port" + lockableResource = "${env.NODE_NAME}_$port" } - steps.lock(null, 1, lockable_resource) { + steps.lock(null, 1, lockableResource) { if (options.coverage) { steps.start("${coverageOpts.dbgsPath} --addr=127.0.0.1 --port=$port") - steps.start("${coverageOpts.coverage41CPath} start -i DefAlias -u http://127.0.0.1:$port -P $workspaceDir -s $srcDir -o build/out/bdd-coverage.xml") + steps.start("${coverageOpts.coverage41CPath} start -i DefAlias -u http://127.0.0.1:$port -P $workspaceDir -s $srcDir -o $COVERAGE_STASH_PATH") steps.cmd("${coverageOpts.coverage41CPath} check -i DefAlias -u http://127.0.0.1:$port") } @@ -70,16 +74,13 @@ class Bdd implements Serializable { if (options.coverage) { steps.cmd("${coverageOpts.coverage41CPath} stop -i DefAlias -u http://127.0.0.1:$port") } - - return 0 - } } - steps.stash('bdd-allure', 'build/out/allure/**', true) + steps.stash(ALLURE_STASH, 'build/out/allure/**', true) steps.stash('bdd-cucumber', 'build/out/cucumber/**', true) if (options.coverage) { - steps.stash('bdd-coverage', 'build/out/bdd-coverage.xml', true) + steps.stash(COVERAGE_STASH_NAME, COVERAGE_STASH_PATH, true) } } diff --git a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy index f3fb372..40a58d6 100644 --- a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy +++ b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy @@ -31,13 +31,13 @@ class PublishAllure implements Serializable { safeUnstash('init-allure') } if (config.stageFlags.bdd) { - safeUnstash('bdd-allure') + safeUnstash(Bdd.ALLURE_STASH) } if (config.stageFlags.yaxunit && config.yaxunitOptions.publishToAllureReport) { safeUnstash(Yaxunit.YAXUNIT_ALLURE_STASH) } if (config.stageFlags.smoke && config.smokeTestOptions.publishToAllureReport) { - safeUnstash(SmokeTest.SMOKE_ALLURE_STASH) + safeUnstash(SmokeTest.ALLURE_STASH) } def env = steps.env() diff --git a/src/ru/pulsar/jenkins/library/steps/SmokeTest.groovy b/src/ru/pulsar/jenkins/library/steps/SmokeTest.groovy index 5a1d6fd..24571f2 100644 --- a/src/ru/pulsar/jenkins/library/steps/SmokeTest.groovy +++ b/src/ru/pulsar/jenkins/library/steps/SmokeTest.groovy @@ -1,18 +1,20 @@ package ru.pulsar.jenkins.library.steps import hudson.FilePath +import org.apache.commons.lang.RandomStringUtils import ru.pulsar.jenkins.library.IStepExecutor import ru.pulsar.jenkins.library.configuration.JobConfiguration import ru.pulsar.jenkins.library.ioc.ContextRegistry import ru.pulsar.jenkins.library.utils.FileUtils import ru.pulsar.jenkins.library.utils.Logger -import ru.pulsar.jenkins.library.utils.PortPicker import ru.pulsar.jenkins.library.utils.StringJoiner import ru.pulsar.jenkins.library.utils.VRunner class SmokeTest implements Serializable { - public static final String SMOKE_ALLURE_STASH = 'smoke-allure' + public static final String ALLURE_STASH = 'smoke-allure' + public static final String COVERAGE_STASH_NAME = 'smoke-coverage' + public static final String COVERAGE_STASH_PATH = 'build/out/smoke-coverage.xml' private final JobConfiguration config @@ -104,25 +106,31 @@ class SmokeTest implements Serializable { command += " $testsPath" } - def coverageOpts = config.coverageOptions; - def port = PortPicker.getPort(); - port = 1550; + def coverageOpts = config.coverageOptions + def port = options.dbgsPort + def lockableResource = RandomStringUtils.random(9, true, false) if (options.coverage) { - steps.start("${coverageOpts.dbgsPath} --addr=127.0.0.1 --port=$port") - steps.start("${coverageOpts.coverage41CPath} start -i DefAlias -u http://127.0.0.1:$port -P $workspaceDir -s $srcDir -o build/out/smoketest-coverage.xml") - steps.cmd("${coverageOpts.coverage41CPath} check -i DefAlias -u http://127.0.0.1:$port") + lockableResource = "${env.NODE_NAME}_$port" } - steps.withEnv(logosConfig) { - VRunner.exec(command, true) - } + steps.lock(null, 1, lockableResource) { + if (options.coverage) { + steps.start("${coverageOpts.dbgsPath} --addr=127.0.0.1 --port=$port") + steps.start("${coverageOpts.coverage41CPath} start -i DefAlias -u http://127.0.0.1:$port -P $workspaceDir -s $srcDir -o $COVERAGE_STASH_PATH") + steps.cmd("${coverageOpts.coverage41CPath} check -i DefAlias -u http://127.0.0.1:$port") + } - if (options.coverage) { - steps.cmd("${coverageOpts.coverage41CPath} stop -i DefAlias -u http://127.0.0.1:$port") + steps.withEnv(logosConfig) { + VRunner.exec(command, true) + } + + if (options.coverage) { + steps.cmd("${coverageOpts.coverage41CPath} stop -i DefAlias -u http://127.0.0.1:$port") + } } if (options.publishToAllureReport) { - steps.stash(SMOKE_ALLURE_STASH, "$allureReportDir/**", true) + steps.stash(ALLURE_STASH, "$allureReportDir/**", true) steps.archiveArtifacts("$allureReportDir/**") } @@ -132,7 +140,7 @@ class SmokeTest implements Serializable { } if (options.coverage) { - steps.stash('smoketest-coverage', 'build/out/smoketest-coverage.xml', true) + steps.stash(COVERAGE_STASH_NAME, COVERAGE_STASH_PATH, true) } } diff --git a/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy b/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy index a83ad68..84f64e6 100644 --- a/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy +++ b/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy @@ -75,13 +75,13 @@ class SonarScanner implements Serializable { StringJoiner coveragePathsConstructor = new StringJoiner(",") if (config.stageFlags.bdd && config.bddOptions.coverage) { - steps.unstash("bdd-coverage") - coveragePathsConstructor.add("build/out/bdd-coverage.xml") + steps.unstash(Bdd.COVERAGE_STASH_NAME) + coveragePathsConstructor.add(Bdd.COVERAGE_STASH_PATH) } if (config.stageFlags.smoke && config.smokeTestOptions.coverage) { - steps.unstash("smoketest-coverage") - coveragePathsConstructor.add("build/out/smoketest-coverage.xml") + steps.unstash(SmokeTest.COVERAGE_STASH_NAME) + coveragePathsConstructor.add(SmokeTest.COVERAGE_STASH_PATH) } String coveragePaths = coveragePathsConstructor.toString() diff --git a/test/integration/groovy/jobConfigurationTest.groovy b/test/integration/groovy/jobConfigurationTest.groovy index b1788e3..c77feec 100644 --- a/test/integration/groovy/jobConfigurationTest.groovy +++ b/test/integration/groovy/jobConfigurationTest.groovy @@ -75,7 +75,6 @@ class jobConfigurationTest { rule.assertLogContains("sonarScannerToolName='sonar-scanner'", run) rule.assertLogContains("initMethod=FROM_SOURCE", run) rule.assertLogContains("dbgsPath=C:\\Program files\\1cv8\\8.3.12.1500\\bin\\dbgs.exe", run) - rule.assertLogContains("dbgsPort=4543", run) rule.assertLogContains("coverage41CPath=C:\\coverage\\Coverage41C.exe", run) } } \ No newline at end of file diff --git a/test/integration/resources/jobConfiguration.json b/test/integration/resources/jobConfiguration.json index 82c836c..ebd5e6f 100644 --- a/test/integration/resources/jobConfiguration.json +++ b/test/integration/resources/jobConfiguration.json @@ -13,7 +13,6 @@ }, "coverage": { "dbgsPath": "C:\\\\Program files\\\\1cv8\\\\8.3.12.1500\\\\bin\\\\dbgs.exe", - "dbgsPort": 4543, "coverage41CPath": "C:\\\\coverage\\\\Coverage41C.exe" } } \ No newline at end of file