diff --git a/README.md b/README.md index 91b789b..b2c0385 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,7 @@ pipeline1C() * Если в корне репозитория существует файл `packagedef`, то в шагах, работающих с информационной базой, будет выполнена попытка установки локальных зависимостей средствами `opm`. * Если после установки локальных зависимостей в каталоге `oscript_modules/bin` существует файл `vrunner`, то для выполнения команд работы с информационной базой будет использоваться он, а не глобально установленный `vrunner` из `PATH`. * Результаты в формате `allure` ожидаются в каталоге `build/out/allure` или его подкаталогах. + * Каждый шаг имеет свой таймаут в минутах (от 10 до 240 в зависимости от "тяжёлости" шага сборки), но может быть переопределен в секции настроек `timeout`. * Инициализация: * Информационная база инициализируется только в том случае, если в сборочной линии включены шаги, работающие с базой (например, `bdd` или `syntaxCheck`). * Информационная база инициализируется конфигурацией из хранилища конфигурации (`initInfobase` -> `initMethod`). diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index ebdbfe9..fb4979a 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -16,6 +16,19 @@ "edtValidate": false, "smoke": false }, + "timeout": { + "smoke": 240, + "bdd": 120, + "createInfoBase": 60, + "designerToEdtFormatTransformation": 60, + "edtToDesignerFormatTransformation": 60, + "edtValidate": 240, + "initInfoBase": 60, + "resultTransformation": 10, + "sonarqube": 90, + "syntaxCheck": 240, + "zipInfoBase": 60 + }, "initInfobase": { "initMethod": "fromStorage", "runMigration": true, diff --git a/resources/schema.json b/resources/schema.json index f009b5f..7f5d9ab 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -65,6 +65,57 @@ } } }, + "timeout" : { + "type" : "object", + "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:TimeoutOptions", + "description" : "Настройка таймаутов для шагов", + "properties" : { + "edtToDesignerFormatTransformation" : { + "type" : "integer", + "description" : "Таймаут шага трансформации исходников из формата EDT в формат Конфигуратора, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "createInfoBase" : { + "type" : "integer", + "description" : "Таймаут шага создания информационной базы, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "initInfoBase" : { + "type" : "integer", + "description" : "Таймаут шага инициализации информационной базы, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "zipInfoBase" : { + "type" : "integer", + "description" : "Таймаут шага архивирования информационной базы, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "designerToEdtFormatTransformation" : { + "type" : "integer", + "description" : "Таймаут шага трансформации исходников из формата Конфигуратора в формат EDT, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "edtValidate" : { + "type" : "integer", + "description" : "Таймаут шага валидации EDT, в минутах.\n По умолчанию содержит значение 240.\n " + }, + "resultTransformation" : { + "type" : "integer", + "description" : "Таймаут шага трансформации результатов EDT, в минутах.\n По умолчанию содержит значение 10.\n " + }, + "bdd" : { + "type" : "integer", + "description" : "Таймаут шага проверки сценариев поведения, в минутах.\n По умолчанию содержит значение 120.\n " + }, + "syntaxCheck" : { + "type" : "integer", + "description" : "Таймаут шага синтаксического контроля, в минутах.\n По умолчанию содержит значение 240.\n " + }, + "smoke" : { + "type" : "integer", + "description" : "Таймаут шага дымовых тестов, в минутах.\n По умолчанию содержит значение 240.\n " + }, + "sonarqube" : { + "type" : "integer", + "description" : "Таймаут шага статического анализа SonarQube, в минутах.\n По умолчанию содержит значение 90.\n " + } + } + }, "initInfobase" : { "type" : "object", "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:InitInfobaseOptions", diff --git a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy index a737a64..82c743e 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy @@ -56,6 +56,7 @@ class ConfigurationReader implements Serializable { def nonMergeableSettings = Arrays.asList( "secrets", "stageFlags", + "timeoutOptions", "initInfobaseOptions", "bddOptions", "sonarQubeOptions", diff --git a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy index 34c06c2..b93d4f1 100644 --- a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy @@ -22,6 +22,10 @@ class JobConfiguration implements Serializable { @JsonPropertyDescription("Включение этапов сборок") StageFlags stageFlags; + @JsonProperty("timeout") + @JsonPropertyDescription("Настройка таймаутов для шагов") + TimeoutOptions timeoutOptions; + @JsonPropertyDescription("Имя ветки по умолчанию. Значение по умолчанию - main.") String defaultBranch @@ -63,8 +67,9 @@ class JobConfiguration implements Serializable { "v8version='" + v8version + '\'' + ", srcDir='" + srcDir + '\'' + ", sourceFormat=" + sourceFormat + - ", defaultBranch=" + defaultBranch + ", stageFlags=" + stageFlags + + ", timeoutOptions=" + timeoutOptions + + ", defaultBranch='" + defaultBranch + '\'' + ", secrets=" + secrets + ", initInfobaseOptions=" + initInfobaseOptions + ", bddOptions=" + bddOptions + @@ -72,11 +77,11 @@ class JobConfiguration implements Serializable { ", syntaxCheckOptions=" + syntaxCheckOptions + ", smokeTestOptions=" + smokeTestOptions + ", resultsTransformOptions=" + resultsTransformOptions + - ", logosConfig=" + logosConfig + + ", logosConfig='" + logosConfig + '\'' + '}'; } - boolean infobaseFromFiles(){ + boolean infobaseFromFiles() { IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() def env = steps.env(); String branchName = env.BRANCH_NAME; diff --git a/src/ru/pulsar/jenkins/library/configuration/TimeoutOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/TimeoutOptions.groovy new file mode 100644 index 0000000..4def6ec --- /dev/null +++ b/src/ru/pulsar/jenkins/library/configuration/TimeoutOptions.groovy @@ -0,0 +1,63 @@ +package ru.pulsar.jenkins.library.configuration + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties +import com.fasterxml.jackson.annotation.JsonPropertyDescription + +@JsonIgnoreProperties(ignoreUnknown = true) +class TimeoutOptions implements Serializable { + + @JsonPropertyDescription('''Таймаут шага трансформации исходников из формата EDT в формат Конфигуратора, в минутах. + По умолчанию содержит значение 60. + ''') + Integer edtToDesignerFormatTransformation + + @JsonPropertyDescription('''Таймаут шага создания информационной базы, в минутах. + По умолчанию содержит значение 60. + ''') + Integer createInfoBase + + @JsonPropertyDescription('''Таймаут шага инициализации информационной базы, в минутах. + По умолчанию содержит значение 60. + ''') + Integer initInfoBase + + @JsonPropertyDescription('''Таймаут шага архивирования информационной базы, в минутах. + По умолчанию содержит значение 60. + ''') + Integer zipInfoBase + + @JsonPropertyDescription('''Таймаут шага трансформации исходников из формата Конфигуратора в формат EDT, в минутах. + По умолчанию содержит значение 60. + ''') + Integer designerToEdtFormatTransformation + + @JsonPropertyDescription('''Таймаут шага валидации EDT, в минутах. + По умолчанию содержит значение 240. + ''') + Integer edtValidate + + @JsonPropertyDescription('''Таймаут шага трансформации результатов EDT, в минутах. + По умолчанию содержит значение 10. + ''') + Integer resultTransformation + + @JsonPropertyDescription('''Таймаут шага проверки сценариев поведения, в минутах. + По умолчанию содержит значение 120. + ''') + Integer bdd + + @JsonPropertyDescription('''Таймаут шага синтаксического контроля, в минутах. + По умолчанию содержит значение 240. + ''') + Integer syntaxCheck + + @JsonPropertyDescription('''Таймаут шага дымовых тестов, в минутах. + По умолчанию содержит значение 240. + ''') + Integer smoke + + @JsonPropertyDescription('''Таймаут шага статического анализа SonarQube, в минутах. + По умолчанию содержит значение 90. + ''') + Integer sonarqube +} 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 8d5292b..ca4484b 100644 --- a/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java +++ b/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java @@ -54,6 +54,9 @@ class ConfigurationReaderTest { assertThat(jobConfiguration.getBddOptions().getVrunnerSteps()).contains("vanessa --settings ./tools/vrunner.json"); assertThat(jobConfiguration.getLogosConfig()).isEqualTo("logger.rootLogger=DEBUG"); + + assertThat(jobConfiguration.getTimeoutOptions().getBdd()).isEqualTo(120); + assertThat(jobConfiguration.getTimeoutOptions().getZipInfoBase()).isEqualTo(123); } } \ No newline at end of file diff --git a/test/unit/resources/jobConfiguration.json b/test/unit/resources/jobConfiguration.json index f9b28a0..e49e884 100644 --- a/test/unit/resources/jobConfiguration.json +++ b/test/unit/resources/jobConfiguration.json @@ -6,6 +6,9 @@ "stages": { "syntaxCheck": true }, + "timeout": { + "zipInfoBase": 123 + }, "initInfobase": { "runMigration": false, "additionalInitializationSteps": [ diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 2314045..03a9111 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -19,7 +19,6 @@ void call() { options { buildDiscarder(logRotator(numToKeepStr: '30')) - timeout(time: 2, unit: TimeUnit.HOURS) timestamps() } @@ -29,6 +28,9 @@ void call() { agent { label 'agent' } + options { + timeout(time: 1, unit: TimeUnit.HOURS) + } steps { script { @@ -59,22 +61,25 @@ void call() { expression { config.stageFlags.needInfobase() && config.infobaseFromFiles() && config.sourceFormat == SourceFormat.EDT } } steps { - edtToDesignerFormatTransformation config + timeout(time: config.timeoutOptions.edtToDesignerFormatTransformation, unit: TimeUnit.MINUTES) { + edtToDesignerFormatTransformation config + } } } stage('Создание ИБ') { steps { - createDir('build/out') + timeout(time: config.timeoutOptions.createInfoBase, unit: TimeUnit.MINUTES) { + createDir('build/out') - script { - if (config.infobaseFromFiles()){ - // Создание базы загрузкой из файлов - initFromFiles config - } - else{ - // Создание базы загрузкой конфигурации из хранилища - initFromStorage config + script { + if (config.infobaseFromFiles()) { + // Создание базы загрузкой из файлов + initFromFiles config + } else { + // Создание базы загрузкой конфигурации из хранилища + initFromStorage config + } } } } @@ -86,16 +91,20 @@ void call() { expression { config.stageFlags.initSteps } } steps { - // Инициализация и первичная миграция - initInfobase config + timeout(time: config.timeoutOptions.initInfoBase, unit: TimeUnit.MINUTES) { + // Инициализация и первичная миграция + initInfobase config + } } } stage('Архивация ИБ') { steps { - printLocation() + timeout(time: config.timeoutOptions.zipInfoBase, unit: TimeUnit.MINUTES) { + printLocation() - zipInfobase() + zipInfobase() + } } } @@ -109,10 +118,12 @@ void call() { } when { beforeAgent true - expression { config.sourceFormat == SourceFormat.DESIGNER && config.stageFlags.edtValidate} + expression { config.sourceFormat == SourceFormat.DESIGNER && config.stageFlags.edtValidate } } steps { - designerToEdtFormatTransformation config + timeout(time: config.timeoutOptions.designerToEdtFormatTransformation, unit: TimeUnit.MINUTES) { + designerToEdtFormatTransformation config + } } } } @@ -131,7 +142,9 @@ void call() { label 'edt' } steps { - edtValidate config + timeout(time: config.timeoutOptions.edtValidate, unit: TimeUnit.MINUTES) { + edtValidate config + } } } @@ -140,7 +153,9 @@ void call() { label 'oscript' } steps { - transform config + timeout(time: config.timeoutOptions.resultTransformation, unit: TimeUnit.MINUTES) { + transform config + } } } } @@ -155,9 +170,11 @@ void call() { expression { config.stageFlags.bdd } } steps { - unzipInfobase() - - bdd config + timeout(time: config.timeoutOptions.bdd, unit: TimeUnit.MINUTES) { + unzipInfobase() + + bdd config + } } } @@ -170,7 +187,9 @@ void call() { expression { config.stageFlags.syntaxCheck } } steps { - syntaxCheck config + timeout(time: config.timeoutOptions.syntaxCheck, unit: TimeUnit.MINUTES) { + syntaxCheck config + } } } @@ -183,9 +202,11 @@ void call() { expression { config.stageFlags.smoke } } steps { - unzipInfobase() + timeout(time: config.timeoutOptions.smoke, unit: TimeUnit.MINUTES) { + unzipInfobase() - smoke config + smoke config + } } } } @@ -200,7 +221,9 @@ void call() { expression { config.stageFlags.sonarqube } } steps { - sonarScanner config + timeout(time: config.timeoutOptions.sonarqube, unit: TimeUnit.MINUTES) { + sonarScanner config + } } } }