„Buduj okresowo” z wielooddziałowym potokiem w Jenkins

80

Używam Jenkinsa 2 z wtyczką Pipeline. Skonfigurowałem projekt Multi-branch Pipeline, w którym każda gałąź (główna, programistyczna itp.) Ma plik Jenkinsfile w katalogu głównym. Konfiguracja była prosta. Brakuje mi jednak sposobu, aby każda gałąź była uruchamiana okresowo (nie indeksowanie gałęzi), nawet jeśli kod się nie zmienia. Co muszę umieścić w moim pliku Jenkins, aby umożliwić okresowe kompilacje?

geowa4
źródło

Odpowiedzi:

68

Jeśli używasz deklaratywnego stylu Pipeline i chcesz wyzwolić kompilację tylko w określonej gałęzi, możesz zrobić coś takiego:

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

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

Znalezione w Jenkins Jira

Julian Veerkamp
źródło
15
To działa, ale pamiętaj, że zatwierdzenie i wypchnięcie pliku Jenkinsa nie wystarczy do podniesienia wyzwalacza; zadanie należy również wykonać raz ręcznie później.
Cameron
1
Czy wyzwalacz może znajdować się wewnątrz bloku sceny? To znaczy etap („Wdrożenie do produkcji”) {triggers {cron (MASTER_TRIGGER)}
Learner
2
Czy to zadziała w deklaratywnym pliku Jenkinsa, czy tylko w pliku skryptowym Jenkins?
Learner
Powinien działać z deklaratywnym plikiem Jenkins. Wyzwalacz działa tylko wewnątrz tagu opcji iirc. Jeśli chcesz wdrożyć tylko gałąź główną, możesz umieścić skrypt {if (BRANCH_NAME == „Master”) {// deploy}} wewnątrz bloku wdrażania. (Obecnie korzystam z telefonu komórkowego, więc składnia może być nieprawidłowa)
Julian Veerkamp,
@Learner „if you use a declarative style Pipeline”
OrangeDog
43

Jeśli używasz deklaratywnego stylu Jenkinsfile, użyj dyrektywy triggers .

pipeline {
    agent any
    triggers {
        cron('H 4/* 0 0 1-5')
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}
teeks99
źródło
14
Czy jest jakiś sposób, aby wywołać crona tylko w mastergałęzi? Aby dać trochę kontekstu: kiedy koledzy z zespołu tworzą nową gałąź funkcji i zatwierdzają ją, plik Jenkinsa powinien nadal być wyzwalany (przez ankietę lub wypychanie), ale nie chcę, aby wyzwalacz cron był uruchamiany na tych gałęziach funkcji.
foobarto
Użyj: stage ('Stage1') {when {branch "master"} steps {}} OR stage ('Stage1 (Not master)') {when {not {branch 'master'}} steps {sh 'do-non- master.sh '}}
tr53
29

Udało mi się znaleźć przykład ilustrujący to, odrzucanie starych kompilacji, co również jest czymś, czego chciałem.

Jenkinsfile w jenkins-infra / jenkins.io:

properties(
    [
        [
            $class: 'BuildDiscarderProperty',
            strategy: [$class: 'LogRotator', numToKeepStr: '10']
        ],
        pipelineTriggers([cron('H/30 * * * *')]),
    ]
)
geowa4
źródło
1
Przy okazji, dla pierwszej właściwości możesz użyć buildDiscardersymbolu, aby uprościć składnię, tak jak powinna pokazać składnia potoku .
Jesse Glick
1
Nie działa w skryptowych potokach pod Jenkinsem 2.79 (java.lang.UnsupportedOperationException: Undefined symbol 'pipelineTriggers')
gileri
2
Eric, po prostu spróbuj z tym dla potoków skryptowych: pipelineTriggers([[$class: "TimerTrigger", spec: "H 1 * * *"]])
nradev
18

To działa dla mnie:

  triggers {
    cron(env.BRANCH_NAME == 'development' ? 'H */12 * * *' : '')
  }

Zobacz więcej w tym artykule

Paweł Iwaneczko
źródło
2

W przypadku okresowych uruchomień Paramertized lub zaplanowanych wyzwalaczy można użyć w następujący sposób.

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''' : ""
}
merlachandra
źródło
0

Trafiłem na problemy z powyższymi rozwiązaniami.
Nie jestem kreatorem Jenkinsa, więc nie jestem pewien, czy używam starego formatu / składni, czy coś w tym stylu, ale działa dla mnie poniższe rozwiązanie.

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

Określono z: https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/triggers/TimerTrigger.java

Adam
źródło