Запускать конвейер Jenkins каждую ночь и после каждого коммита - PullRequest
0 голосов
/ 11 марта 2020

Мы хотели бы запустить конвейер Jenkins:

  • по ночам, но только если в выбранных ветвях (dev или master) был какой-либо коммит
  • и после каждого коммита

С оговоркой, что ночная сборка также должна привести к дополнительному шагу (длительные интеграционные тесты).

Возможно ли это? Как мы можем настроить это в Jenkinsfile?

1 Ответ

1 голос
/ 12 марта 2020

Итак, ваш вопрос сводится к нескольким:

  1. Как запустить ночную сборку?
  2. Как остановить сборку, если за последние 24 не было выполнено никаких коммитов? часов?
  3. Как я могу запустить "длительный" этап, но не всегда?

Давайте обратимся к ним один за другим.

  1. Вы может иметь ночную сборку с помощью 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, эти тесты должны выполняться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...