Если вы хотите запускать эти длинные тесты только ночью - я считаю, что проще всего просто продублировать задание и изменить его так, чтобы оно срабатывало ночью и добавлялись дополнительные проверки после обычного задания, т. Е. Задания после фиксациипросто сделайте короткий тест, ночной триггер сначала сделает короткий, а затем (если не будет ошибок) длинный.
Я считаю, что гораздо легче справиться, чем сложность цепочки заданий в некоторых условиях, например, оценкавремя дня, чтобы пропустить некоторые тесты.
Пример 1-го задания, которое запускается после каждого коммита
node() {
stage('Build') {
// Build
}
stage('Short Test') {
// Short Test
}
}
2-го задания, которое запускается ночью
node() {
stage('Build') {
// Build
}
stage('Short Test') {
// Short Test, fail the build here when not successful
}
stage('Long Tests')
// Long Test, runs only when short test successful
}
}
Редактировать
Решение, в котором все это реализовано за одно задание, однако оно добавляет много сложности и усложняет интеграцию некоторых последующих вариантов использования, то есть различных уведомлений для ветви тестирования интеграции, отслеживания продолжительности сборки и т. Д. Я все еще нахожу его более управляемымчтобы разделить его на 2 задания.
Следующее задание должно быть настроено так, чтобы оно запускалось с помощью ловушки после фиксации и ночной таймер.Длинный тест запускается, когда
- последняя сборка моложе установленной (вы не хотите, чтобы она запускалась с последней ночи),
- последний запуск был успешным (не хочу запускатьсядлительный тест на сломанную сборку), и
- был вызван указанным таймером (не требуется запускать при регистрации).
def runLongTestMaxDiffMillis = 20000
def lastRunDiff = (currentBuild.getStartTimeInMillis().toInteger() - currentBuild.getPreviousBuild().getStartTimeInMillis().toInteger())
def lastBuildTooOld = (lastRunDiff > runLongTestMaxDiffMillis)
def isTriggeredByTimer = currentBuild.getBuildCauses('hudson.triggers.TimerTrigger$TimerTriggerCause')
def lastBuildSuccessful = (currentBuild.getPreviousBuild().getResult() == 'SUCCESS')
def runLongTest = (!lastBuildTooOld && isTriggeredByTimer && lastBuildSuccessful)
node() {
if (runLongTest) {
println 'Running long test'
} else {
println 'Skipping long test'
}
}