„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?

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


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'
            }
        }
    }
}

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 * * * *')]),
    ]
)

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


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''' : ""
}

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.