You've already forked jenkins-lib
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:
@@ -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",
|
||||
|
@@ -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 "
|
||||
|
@@ -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)
|
||||
|
@@ -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
|
||||
|
@@ -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 +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
@@ -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) {
|
||||
|
@@ -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 +
|
||||
'}';
|
||||
}
|
||||
|
||||
}
|
@@ -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 +
|
||||
|
@@ -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 +
|
||||
'}'
|
||||
}
|
||||
}
|
||||
|
@@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@@ -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'
|
||||
|
28
src/ru/pulsar/jenkins/library/steps/Start.groovy
Normal file
28
src/ru/pulsar/jenkins/library/steps/Start.groovy
Normal 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)
|
||||
}
|
||||
}
|
||||
}
|
@@ -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)
|
||||
}
|
||||
}
|
@@ -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"
|
||||
}
|
||||
}
|
@@ -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
9
vars/start.groovy
Normal 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()
|
||||
}
|
Reference in New Issue
Block a user