Итак, ваш вопрос сводится к нескольким:
- Как запустить ночную сборку?
- Как остановить сборку, если за последние 24 не было выполнено никаких коммитов? часов?
- Как я могу запустить "длительный" этап, но не всегда?
Давайте обратимся к ним один за другим.
- Вы может иметь ночную сборку с помощью
cron
или parameterizedCron
, если вы установите плагин ParameterizedCron. Поскольку вы, кажется, хотите выполнить свою работу во всех филиалах, это может выглядеть, например, как
pipeline {
agent any
triggers {
// schedule a nightly build at random time after 0am on dev branch, 1am on master
cron(env.BRANCH_NAME == 'dev' ? '0 * * * *' : '')
cron(env.BRANCH_NAME == 'master' ? '1 * * * *' : '')
Для решения других вопросов вам нужно знать, почему ваша сборка работает. Это может быть вызвано человеком, или
cron
, или коммитом. Как только вы убедитесь, что
cron
запустил сборку, вы можете исследовать
git log
для времени последнего коммита.
def currentBuildReason() {
def timerCause = currentBuild.rawBuild.getCause(hudson.triggers.TimerTrigger.TimerTriggerCause)
if (timerCause) { echo "Build reason: Build was started by timer"; return "TIMER" }
timerCause = currentBuild.rawBuild.getCause(org.jenkinsci.plugins.parameterizedscheduler.ParameterizedTimerTriggerCause)
if (timerCause) { echo "Build reason: Build was started by parameterized timer"; return "TIMER" }
def userCause = currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause)
if (userCause) { echo "Build reason: Build was started by user"; return "USER" }
println "here are the causes"
echo "${currentBuild.buildCauses}"
return "UNKNOWN"
}
и позже:
if ( currentBuildReason() == "TIMER" and env.BRANCH == "master" ) {
def gitLog = sh script: "git log", returnStdout: true
// look for the date, and stop the build
Наконец, вы можете выполнить шаги при условии. Один из способов сделать это - определить параметр для вашей работы, указывающий, должны ли выполняться интеграционные тесты. Это позволит человеку запускать их, даже если не ночью, когда они выбирают поле. Например,
pipeline {
parameters {
booleanParam(name: 'RUN_LONG_TEST', defaultValue: false,
description: "Should long-running tests execute?")
}
и более поздние
stage('Integration tests') {
agent { node { label "integration_test_slave" }}
when {
beforeAgent true
expression {params.RUN_LONG_TEST}
}
steps {
// run integration test
}
}
Чтобы запланировать ночной режим с выбранным параметром, вам потребуется плагин параметризованного крона:
pipeline {
agent any
triggers {
// schedule a nightly build at random time after 0am on dev branch, 1am on master
parameterizedCron(env.BRANCH_NAME == 'dev' ? '0 * * * * % RUN_LONG_TEST=true' : '')
parameterizedCron(env.BRANCH_NAME == 'master' ? '1 * * * * % RUN_LONG_TEST=true'' : '')
В качестве альтернативы, Вы можете игнорировать параметр, если только ночные программы должны его использовать, и проанализировать значение currentBuildReason()
. Когда оно равно TIMER
, эти тесты должны выполняться.