diff --git a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy index 3691b78..d706d6b 100644 --- a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy @@ -48,9 +48,9 @@ interface IStepExecutor { def catchError(Closure body) - def httpRequest(String url, String outputFile) - def httpRequest(String url, String outputFile, String responseHandle, boolean wrapAsMultipart) def error(String errorMessage) + + def allure(List results) } \ No newline at end of file diff --git a/src/ru/pulsar/jenkins/library/StepExecutor.groovy b/src/ru/pulsar/jenkins/library/StepExecutor.groovy index 17a7aca..0745577 100644 --- a/src/ru/pulsar/jenkins/library/StepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/StepExecutor.groovy @@ -113,4 +113,16 @@ class StepExecutor implements IStepExecutor { def error(String errorMessage) { steps.error errorMessage } + + @Override + def allure(List results) { + steps.allure([ + commandline: 'allure', + includeProperties: false, + jdk: '', + properties: [], + reportBuildPolicy: 'ALWAYS', + results: results + ]) + } } diff --git a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy index 0dabc30..8e65587 100644 --- a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy @@ -29,7 +29,9 @@ class InitInfobase implements Serializable { Logger.println("Запуск миграции ИБ") // Запуск миграции - steps.cmd('oscript_modules/bin/vrunner run --command "ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы;" --execute \\$runnerRoot/epf/ЗакрытьПредприятие.epf --ibconnection "/F./build/ib"') + steps.catchError { + steps.cmd('oscript_modules/bin/vrunner run --command "ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы;" --execute \\$runnerRoot/epf/ЗакрытьПредприятие.epf --ibconnection "/F./build/ib"') + } } else { Logger.println("Шаг миграции ИБ выключен") } @@ -40,9 +42,11 @@ class InitInfobase implements Serializable { 'oscript_modules/vanessa-automation-single/vanessa-automation-single.epf' ) - config.initInfobaseOptions.additionalMigrationSteps.each { - Logger.println("Первичная инициализация командой ${it}") - steps.cmd("oscript_modules/bin/vrunner ${it} --ibconnection \"/F./build/ib\"") + steps.catchError { + config.initInfobaseOptions.additionalMigrationSteps.each { + Logger.println("Первичная инициализация командой ${it}") + steps.cmd("oscript_modules/bin/vrunner ${it} --ibconnection \"/F./build/ib\"") + } } steps.stash('init-allure', 'build/out/allure/*', true) diff --git a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy new file mode 100644 index 0000000..5375e81 --- /dev/null +++ b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy @@ -0,0 +1,45 @@ +package ru.pulsar.jenkins.library.steps + +import hudson.FilePath +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 + +class PublishAllure implements Serializable { + + private final JobConfiguration config; + + PublishAllure(JobConfiguration config) { + this.config = config + } + + def run() { + IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + + Logger.printLocation() + + steps.unstash('init-allure') + + FilePath allurePath = FileUtils.getFilePath('build/out/allure') + if (!allurePath.exists()) { + Logger.println("Отсутствуют результаты allure для публикации") + } + + List results = new ArrayList<>(); + + def allureSubDirs = allurePath.listDirectories() + if (allureSubDirs.size() > 0) { + allureSubDirs.forEach({ filePath -> results.add(getPath(filePath)) }) + } else { + results.add(getPath(allurePath)) + } + + steps.allure(results) + } + + private static String getPath(FilePath filePath) { + filePath.getBaseName() + File.separator + filePath.getName() + } +} diff --git a/src/ru/pulsar/jenkins/library/utils/FileUtils.groovy b/src/ru/pulsar/jenkins/library/utils/FileUtils.groovy new file mode 100644 index 0000000..eadf463 --- /dev/null +++ b/src/ru/pulsar/jenkins/library/utils/FileUtils.groovy @@ -0,0 +1,27 @@ +package ru.pulsar.jenkins.library.utils + +import hudson.FilePath +import jenkins.model.Jenkins +import ru.pulsar.jenkins.library.IStepExecutor +import ru.pulsar.jenkins.library.ioc.ContextRegistry + +class FileUtils { + + static FilePath getFilePath(String path) { + + IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + + def env = steps.env(); + + String nodeName = env.NODE_NAME; + if (nodeName == null) { + steps.error 'Переменная среды NODE_NAME не задана. Запуск вне node или без agent?' + } + + if (nodeName == "master") { + return new FilePath(new File(path)); + } else { + return new FilePath(Jenkins.getInstanceOrNull().getComputer(nodeName).getChannel(), path); + } + } +} diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index d9a1363..ae8652e 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -66,8 +66,6 @@ void call() { expression { config.stageFlags.initSteps } } steps { - printLocation() - // Инициализация и первичная миграция initInfobase config } @@ -169,6 +167,14 @@ void call() { } } } + + post('post-stage') { + always { + node('agent') { + saveResults config + } + } + } } } diff --git a/vars/saveResults.groovy b/vars/saveResults.groovy new file mode 100644 index 0000000..c142b28 --- /dev/null +++ b/vars/saveResults.groovy @@ -0,0 +1,32 @@ +import ru.pulsar.jenkins.library.configuration.JobConfiguration +import ru.pulsar.jenkins.library.ioc.ContextRegistry +import ru.pulsar.jenkins.library.steps.PublishAllure + +def call(JobConfiguration config) { + ContextRegistry.registerDefaultContext(this) + + def publishAllure = new PublishAllure(config) + publishAllure.run() + +// step([ +// $class: 'CucumberReportPublisher', +// fileIncludePattern: '*.json', +// jsonReportDirectory: 'build/out/cucumber' +// ]) +// +// step([ +// $class: 'CukedoctorPublisher', +// featuresDir: 'build/out/cucumber', +// format: 'HTML', +// hideFeaturesSection: false, +// hideScenarioKeyword: false, +// hideStepTime: false, +// hideSummary: false, +// hideTags: false, +// numbered: true, +// sectAnchors: true, +// title: 'Living Documentation', +// toc: 'LEFT' +// ]) + +} \ No newline at end of file