1
0
mirror of https://github.com/firstBitMarksistskaya/jenkins-lib.git synced 2025-08-25 20:09:25 +02:00

add coverage

This commit is contained in:
Dima
2023-06-03 08:24:19 +03:00
parent 7248c85531
commit 3d63e5706d
17 changed files with 207 additions and 2 deletions

View File

@@ -50,7 +50,8 @@
"bdd": {
"vrunnerSteps": [
"vanessa --settings ./tools/vrunner.json"
]
],
"coverage": false
},
"sonarqube": {
"sonarQubeInstallation": "",
@@ -83,7 +84,12 @@
"vrunnerSettings": "./tools/vrunner.json",
"xddConfigPath": "./tools/xUnitParams.json",
"publishToAllureReport": false,
"publishToJUnitReport": true
"publishToJUnitReport": true,
"coverage": false
},
"coverage": {
"dbgsPath": "/opt/1cv8/current/dbgs",
"coverage41CPath": "Coverage41C"
},
"yaxunit": {
"vrunnerSettings": "./tools/vrunner.json",

View File

@@ -81,6 +81,10 @@
"items" : {
"type" : "string"
}
},
"coverage" : {
"type" : "boolean",
"description" : "Выполнять замер покрытия"
}
}
}
@@ -231,6 +235,27 @@
"type" : "boolean",
"description" : "Выполнять публикацию результатов в отчет JUnit.\n По умолчанию включено.\n "
},
"coverage" : {
"type" : "boolean",
"description" : "Выполнять замер покрытия"
}
}
},
"coverage" : {
"type" : "object",
"id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:CoverageOptions",
"description" : "Настройки замеров покрытия",
"properties" : {
"dbgsPath" : {
"type" : "string",
"description" : "Путь к исполняемому файлу dbgs.\n По умолчанию равен /opt/1cv8/current/dbgs.\n "
},
"coverage41CPath" : {
"type" : "string",
"description" : "Путь к исполняемому файлу Coverage41C\n По умолчанию равен Coverage41C.\n "
}
}
},
"vrunnerSettings" : {
"type" : "string",
"description" : "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n "

View File

@@ -40,6 +40,8 @@ interface IStepExecutor {
def ringCommand(String script)
void start(String script, boolean returnStatus)
void tool(String toolName)
def withCredentials(List bindings, Closure body)

View File

@@ -72,6 +72,11 @@ class StepExecutor implements IStepExecutor {
return steps.ringCommand(script)
}
@Override
void start(String script, boolean returnStatus = false) {
steps.start(script, returnStatus)
}
@Override
void tool(String toolName) {
steps.tool toolName

View File

@@ -16,11 +16,15 @@ class BddOptions implements Serializable {
'vanessa --settings ./tools/vrunner.json'
]
@JsonPropertyDescription("Выполнять замер покрытия")
Boolean coverage = false
@Override
@NonCPS
String toString() {
return "BddOptions{" +
"vrunnerSteps=" + vrunnerSteps +
"coverage=" + coverage +
'}';
}
}

View File

@@ -65,6 +65,7 @@ class ConfigurationReader implements Serializable {
"bddOptions",
"sonarQubeOptions",
"smokeTestOptions",
"coverageOptions",
"yaxunitOptions",
"syntaxCheckOptions",
"resultsTransformOptions",
@@ -81,6 +82,7 @@ class ConfigurationReader implements Serializable {
mergeObjects(baseConfiguration, configurationToMerge, nonMergeableSettings)
mergeInitInfoBaseOptions(baseConfiguration.initInfoBaseOptions, configurationToMerge.initInfoBaseOptions)
mergeBddOptions(baseConfiguration.bddOptions, configurationToMerge.bddOptions)
mergeCoverageOptions(baseConfiguration.coverageOptions, configurationToMerge.coverageOptions)
mergeSyntaxCheckOptions(baseConfiguration.syntaxCheckOptions, configurationToMerge.syntaxCheckOptions)
mergeNotificationsOptions(baseConfiguration.notificationsOptions, configurationToMerge.notificationsOptions)
@@ -147,6 +149,22 @@ class ConfigurationReader implements Serializable {
baseObject.vrunnerSteps = objectToMerge.vrunnerSteps.clone()
}
@NonCPS
private static void mergeCoverageOptions(CoverageOptions baseObject, CoverageOptions objectToMerge) {
if (objectToMerge == null) {
return
}
if (objectToMerge.dbgsPath != null) {
baseObject.dbgsPath = objectToMerge.dbgsPath
}
if (objectToMerge.coverage41CPath != null) {
baseObject.coverage41CPath = objectToMerge.coverage41CPath
}
}
@NonCPS
private static void mergeSyntaxCheckOptions(SyntaxCheckOptions baseObject, SyntaxCheckOptions objectToMerge) {
if (objectToMerge == null || objectToMerge.checkModes == null) {

View File

@@ -0,0 +1,29 @@
package ru.pulsar.jenkins.library.configuration
import com.cloudbees.groovy.cps.NonCPS
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
import com.fasterxml.jackson.annotation.JsonPropertyDescription
@JsonIgnoreProperties(ignoreUnknown = true)
class CoverageOptions implements Serializable {
@JsonPropertyDescription('''Путь к исполняемому файлу dbgs.
По умолчанию равен /opt/1cv8/current/dbgs.
''')
String dbgsPath
@JsonPropertyDescription('''Путь к исполняемому файлу Coverage41C
По умолчанию равен Coverage41C.
''')
String coverage41CPath
@Override
@NonCPS
String toString() {
return "coverageOptions{" +
"dbgsPath=" + dbgsPath +
", coverage41CPath=" + coverage41CPath +
'}';
}
}

View File

@@ -56,6 +56,10 @@ class JobConfiguration implements Serializable {
@JsonPropertyDescription("Настройки дымового тестирования")
SmokeTestOptions smokeTestOptions
@JsonProperty("coverage")
@JsonPropertyDescription("Настройки замеров покрытия")
CoverageOptions coverageOptions;
@JsonProperty("yaxunit")
@JsonPropertyDescription("Настройки YAXUnit")
YaxunitOptions yaxunitOptions
@@ -89,6 +93,7 @@ class JobConfiguration implements Serializable {
", sonarQubeOptions=" + sonarQubeOptions +
", syntaxCheckOptions=" + syntaxCheckOptions +
", smokeTestOptions=" + smokeTestOptions +
", coverageOptions=" + coverageOptions +
", yaxunitOptions=" + yaxunitOptions +
", resultsTransformOptions=" + resultsTransformOptions +
", notificationOptions=" + notificationsOptions +

View File

@@ -27,6 +27,9 @@ class SmokeTestOptions implements Serializable {
""")
boolean publishToJUnitReport
@JsonPropertyDescription("Выполнять замер покрытия")
Boolean coverage = false
@Override
@NonCPS
String toString() {
@@ -35,6 +38,7 @@ class SmokeTestOptions implements Serializable {
", xddConfigPath='" + xddConfigPath + '\'' +
", publishToAllureReport=" + publishToAllureReport +
", publishToJUnitReport=" + publishToJUnitReport +
"coverage=" + coverage +
'}'
}
}

View File

@@ -24,11 +24,22 @@ class Bdd implements Serializable {
return
}
def env = steps.env();
def srcDir = config.srcDir
def projectDir = new File("$env.WORKSPACE").getCanonicalPath()
List<String> logosConfig = ["LOGOS_CONFIG=$config.logosConfig"]
steps.withEnv(logosConfig) {
steps.installLocalDependencies()
steps.createDir('build/out')
List<Integer> returnStatuses = []
def coverageOpts = config.coverageOptions;
if (options.coverage) {
steps.start("${coverageOpts.dbgsPath} --addr=127.0.0.1 --port=1550")
steps.start("${coverageOpts.coverage41CPath} start -i DefAlias -u http://127.0.0.1:1550 -P $projectDir -s $srcDir -o build/out/bdd-coverage.xml")
}
config.bddOptions.vrunnerSteps.each {
Logger.println("Шаг запуска сценариев командой ${it}")
String vrunnerPath = VRunner.getVRunnerPath()
@@ -43,9 +54,17 @@ class Bdd implements Serializable {
} else {
Logger.println("Тестирование сценариев завершилось успешно")
}
if (options.coverage) {
steps.cmd("${coverageOpts.coverage41CPath} stop -i DefAlias -u http://127.0.0.1:1550")
}
}
steps.stash('bdd-allure', '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)
}
}
}

View File

@@ -37,6 +37,9 @@ class SmokeTest implements Serializable {
def options = config.smokeTestOptions
def env = steps.env()
def srcDir = config.srcDir
def projectDir = new File("$env.WORKSPACE").getCanonicalPath()
String vrunnerPath = VRunner.getVRunnerPath()
String command = "$vrunnerPath xunit --ibconnection \"/F./build/ib\""
@@ -100,10 +103,20 @@ class SmokeTest implements Serializable {
command += " $testsPath"
}
def coverageOpts = config.coverageOptions;
if (options.coverage) {
steps.start("${coverageOpts.dbgsPath} --addr=127.0.0.1 --port=1550")
steps.start("${coverageOpts.coverage41CPath} start -i DefAlias -u http://127.0.0.1:1550 -P $projectDir -s $srcDir -o build/out/smoketest-coverage.xml")
}
steps.withEnv(logosConfig) {
VRunner.exec(command, true)
}
if (options.coverage) {
steps.cmd("${coverageOpts.coverage41CPath} stop -i DefAlias -u http://127.0.0.1:1550")
}
if (options.publishToAllureReport) {
steps.stash(SMOKE_ALLURE_STASH, "$allureReportDir/**", true)
steps.archiveArtifacts("$allureReportDir/**")
@@ -114,5 +127,9 @@ class SmokeTest implements Serializable {
steps.archiveArtifacts("$junitReportDir/**")
}
if (options.coverage) {
steps.stash('smoketest-coverage', 'build/out/smoketest-coverage.xml', true)
}
}
}

View File

@@ -7,6 +7,7 @@ import ru.pulsar.jenkins.library.configuration.ResultsTransformerType
import ru.pulsar.jenkins.library.configuration.SourceFormat
import ru.pulsar.jenkins.library.ioc.ContextRegistry
import ru.pulsar.jenkins.library.utils.Logger
import ru.pulsar.jenkins.library.utils.StringJoiner
import ru.pulsar.jenkins.library.utils.VersionParser
class SonarScanner implements Serializable {
@@ -68,6 +69,27 @@ class SonarScanner implements Serializable {
}
}
if (config.stageFlags.bdd && config.bddOptions.coverage
|| config.stageFlags.smoke && config.smokeTestOptions.coverage) {
StringJoiner coveragePathsConstructor = new StringJoiner(",")
if (config.stageFlags.bdd && config.bddOptions.coverage) {
steps.unstash("bdd-coverage")
coveragePathsConstructor.add("build/out/bdd-coverage.xml")
}
if (config.stageFlags.smoke && config.smokeTestOptions.coverage) {
steps.unstash("smoketest-coverage")
coveragePathsConstructor.add("build/out/smoketest-coverage.xml")
}
String coveragePaths = coveragePathsConstructor.toString()
sonarCommand += " -Dsonar.coverageReportPaths=${coveragePaths}"
}
if (config.sonarQubeOptions.waitForQualityGate) {
def timeoutInSeconds = config.timeoutOptions.sonarqube * 60
sonarCommand += ' -Dsonar.qualitygate.wait=true'

View File

@@ -0,0 +1,28 @@
package ru.pulsar.jenkins.library.steps
import ru.pulsar.jenkins.library.IStepExecutor
import ru.pulsar.jenkins.library.ioc.ContextRegistry
class Start implements Serializable {
private String script;
private boolean returnStatus
private String encoding = 'UTF-8'
Start(String script, boolean returnStatus = false) {
this.script = script
this.returnStatus = returnStatus
};
int run() {
IStepExecutor steps = ContextRegistry.getContext().getStepExecutor()
int returnValue
if (steps.isUnix()) {
returnValue = steps.sh("$script &", returnStatus, encoding)
} else {
returnValue = steps.bat("chcp 65001 > nul \nstart $script", returnStatus, encoding)
}
}
}

View File

@@ -74,5 +74,7 @@ class jobConfigurationTest {
rule.assertLogContains("v8version='8.3.12.1500'", run)
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("coverage41CPath=C:\\coverage\\Coverage41C.exe", run)
}
}

View File

@@ -9,5 +9,10 @@
}]
},
"yaxunit": {
"initMethod": "fromSource"
},
"coverage": {
"dbgsPath": "C:\\\\Program files\\\\1cv8\\\\8.3.12.1500\\\\bin\\\\dbgs.exe",
"coverage41CPath": "C:\\\\coverage\\\\Coverage41C.exe"
}
}

View File

@@ -41,6 +41,9 @@ class ConfigurationReaderTest {
assertThat(jobConfiguration.getSonarQubeOptions().getUseSonarScannerFromPath()).isTrue();
assertThat(jobConfiguration.getSonarQubeOptions().getBranchAnalysisConfiguration()).isEqualTo(AUTO);
assertThat(jobConfiguration.getCoverageOptions().getDbgsPath()).isEqualTo("/opt/1cv8/current/dbgs");
assertThat(jobConfiguration.getCoverageOptions().getCoverage41CPath()).isEqualTo("Coverage41C");
assertThat(jobConfiguration.getSecrets())
.hasFieldOrPropertyWithValue("storage", "1234")
.hasFieldOrPropertyWithValue("storagePath", "UNKNOWN_ID")
@@ -57,11 +60,13 @@ class ConfigurationReaderTest {
assertThat(jobConfiguration.getSmokeTestOptions().getVrunnerSettings()).contains("./tools/vrunner-smoke.json");
assertThat(jobConfiguration.getSmokeTestOptions().isPublishToAllureReport()).isFalse();
assertThat(jobConfiguration.getSmokeTestOptions().isPublishToJUnitReport()).isTrue();
assertThat(jobConfiguration.getSmokeTestOptions().getCoverage()).isFalse();
assertThat(jobConfiguration.getInitInfoBaseOptions().getRunMigration()).isFalse();
assertThat(jobConfiguration.getInitInfoBaseOptions().getAdditionalInitializationSteps()).contains("vanessa --settings ./tools/vrunner.first.json");
assertThat(jobConfiguration.getBddOptions().getVrunnerSteps()).contains("vanessa --settings ./tools/vrunner.json");
assertThat(jobConfiguration.getBddOptions().getCoverage()).isFalse();
assertThat(jobConfiguration.getLogosConfig()).isEqualTo("logger.rootLogger=DEBUG");

9
vars/start.groovy Normal file
View File

@@ -0,0 +1,9 @@
import ru.pulsar.jenkins.library.steps.Start
import ru.pulsar.jenkins.library.ioc.ContextRegistry
void call(String script, boolean returnStatus = false) {
ContextRegistry.registerDefaultContext(this)
Start start = new Start(script, returnStatus)
start.run()
}