«Периодическая сборка» с помощью многоотводного конвейера в Jenkins


80

Я запускаю Jenkins 2 с плагином Pipeline. Я установил проект Multi-branch Pipeline, в котором каждая ветка (главная, разработка и т.д.) имеет файл Jenkins в корне. Настроить это было просто. Однако я не понимаю, как периодически запускать каждую ветвь (а не индексацию веток), даже если код не меняется. Что мне нужно поместить в мой Jenkinsfile, чтобы включить периодические сборки?

Ответы:


68

Если вы используете конвейер декларативного стиля и хотите запускать сборку только в определенной ветке, вы можете сделать что-то вроде этого:

String cron_string = BRANCH_NAME == "master" ? "@hourly" : ""

pipeline {
  agent none
  triggers { cron(cron_string) }
  stages {
    // do something
  }
}

Найдено на Jenkins Jira


15
Это работает, но учтите, что фиксации и отправки файла Jenkins недостаточно для срабатывания триггера; после этого задание также нужно запустить один раз вручную.
Кэмерон

1
Может ли триггер находиться внутри сценического блока? Т.е. этап ( 'Развертывание производства') {спусковые {хрон (MASTER_TRIGGER)}
Ученика

2
Будет ли это работать в декларативном файле jenkins или только в файле jenkins со сценарием?
Ученик

Должен работать с декларативным файлом Jenkins. Триггер работает только внутри тега параметров iirc. Если вы хотите развернуть только основную ветку, вы можете поместить скрипт {if (BRANCH_NAME == «Master») {// deploy}} в блок развертывания. (Сейчас я использую мобильный телефон, поэтому синтаксис может быть неправильным)
Джулиан Виркамп

@Learner «если вы используете конвейер декларативного стиля»
OrangeDog

43

Если вы используете Jenkinsfile в декларативном стиле, используйте директиву триггеров .

pipeline {
    agent any
    triggers {
        cron('H 4/* 0 0 1-5')
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

14
Есть ли способ сделать запуск cron только по masterветке? Чтобы дать некоторый контекст: когда товарищи по команде создают новую ветку функции и фиксируют ее, файл Jenkins все равно должен запускаться (через опрос или push), но я не хочу, чтобы срабатывал триггер cron в этих ветках функций.
foobarto 09

Используйте: stage ('Stage1') {when {branch "master"} steps {}} OR stage ('Stage1 (Not master)') {when {not {branch 'master'}} steps {sh 'do-non- master.sh '}}
tr53

29

Мне удалось найти пример, иллюстрирующий это - отказ от старых сборок, чего я тоже хотел.

Jenkinsfile в jenkins-infra / jenkins.io:

properties(
    [
        [
            $class: 'BuildDiscarderProperty',
            strategy: [$class: 'LogRotator', numToKeepStr: '10']
        ],
        pipelineTriggers([cron('H/30 * * * *')]),
    ]
)

1
Кстати, для первого свойства вы можете использовать buildDiscarderсимвол для упрощения синтаксиса, как должен показывать синтаксис конвейера .
Джесси Глик

1
Он не работает в скриптовых конвейерах под jenkins 2.79 (java.lang.UnsupportedOperationException: Undefined symbol 'pipelineTriggers')
gileri

2
Эрик, просто попробуй вот это для конвейеров со сценариями: pipelineTriggers([[$class: "TimerTrigger", spec: "H 1 * * *"]])
nradev


2

Для параметризованных периодических запусков или запланированных триггеров можно использовать следующее.

triggers{
    parameterizedCron env.BRANCH_NAME == "develop" ? '''H 03 * * * % buildSlave=vm1;testSlave=vm2;HYPERVISOR=vbox;VERSION=10.5.0.0
H 03 * * * % buildSlave=vm1;testSlave=vm2;HYPERVISOR=workstation;VERSION=10.5.0.0''' : ""
}

0

Я столкнулся с проблемами с вышеуказанными решениями.
Я не мастер Jenkins, поэтому не уверен, использую ли я старый формат / синтаксис или что-то в этом роде, но у меня работает следующее.

#!/usr/bin/env groovy
properties(
    [
        pipelineTriggers([
                [
                    $class: 'TimerTrigger',
                    spec: 'H 7,19 * * *'
                ]
         ])
    ]
)

Определено из: https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/triggers/TimerTrigger.java.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.