“Будуйте періодично” за допомогою багатогалузевого трубопроводу в Дженкінсі


80

Я запускаю Jenkins 2 з плагіном Pipeline. Я налаштував проект багатогалузевого конвеєру, де кожна гілка (майстер, розробляти тощо) має файл Jenkins у корені. Налаштувати це було просто. Однак я не знаю, як періодично запускати кожну гілку (а не індексацію гілок), навіть коли код не змінюється. Що потрібно вкласти у свій файл Jenkins, щоб увімкнути періодичні збірки?

Відповіді:


68

Якщо ви використовуєте декларативний стиль Pipeline і хочете ініціювати побудову лише на певній гілці, ви можете зробити щось подібне:

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

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

Знайдено на Дженкінс Джира


15
Це працює, але зауважте, що фіксації та натискання файлу Дженкінса недостатньо, щоб тригер був взятий; після цього завдання також потрібно запустити один раз вручну.
Камерон,

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

2
Це буде працювати в декларативному файлі jenkins або лише у файлі jenkins із сценарієм?
Учень

Повинна працювати з декларативним файлом Jenkins. Тригер працює лише всередині тегу параметрів iirc. Якщо ви хочете лише розгорнути головну гілку, ви можете помістити сценарій {if (BRANCH_NAME == „Master“) {// розгорнути}} всередину блоку розгортання. (Зараз я на мобільному, тому синтаксис може бути неправильним)
Джуліан Віркамп,

@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гілці? Щоб дати деякий контекст: коли товариші по команді створюють нову гілку функцій і фіксують там файл Дженкінса все одно повинен запускатись (через опитування або натискання), але я не хочу, це пожежний тригер cron на цих гілках функцій.
foobarto

Використовувати: stage ('Stage1') {when {branch "master"} кроки {}} OR stage ('Stage1 (Not master)') {when {not {branch 'master'}} кроки {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: невизначений символ '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

Я зазнав проблем із наведеними вище рішеннями.
Я не майстер Дженкінса, тому не впевнений, чи використовую старий формат / синтаксис чи щось інше, але наступне працює для мене.

#!/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.