"Regelmäßig erstellen" mit einer Pipeline mit mehreren Zweigen in Jenkins

80

Ich verwende Jenkins 2 mit dem Pipeline-Plugin. Ich habe ein Pipeline-Projekt mit mehreren Zweigen eingerichtet, bei dem jeder Zweig (Master, Entwicklung usw.) eine Jenkins-Datei im Stammverzeichnis hat. Das Einrichten war einfach. Ich weiß jedoch nicht, wie jeder Zweig regelmäßig ausgeführt werden soll (nicht die Zweigindizierung), selbst wenn sich der Code nicht ändert. Was muss ich in meine Jenkins-Datei einfügen, um regelmäßige Builds zu ermöglichen?

geowa4
quelle

Antworten:

67

Wenn Sie eine Pipeline im deklarativen Stil verwenden und den Build nur für einen bestimmten Zweig auslösen möchten, können Sie Folgendes tun:

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

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

Gefunden auf Jenkins Jira

Julian Veerkamp
quelle
14
Dies funktioniert, aber beachten Sie, dass das Festschreiben und Drücken der Jenkins-Datei nicht ausreicht, um den Auslöser zu betätigen. Der Job muss danach auch einmal manuell ausgeführt werden.
Cameron
1
Kann sich der Trigger innerhalb eines Bühnenblocks befinden? Dh Stufe ('In Produktion bereitstellen') {Trigger {cron (MASTER_TRIGGER)}
Lernender
2
Funktioniert dies in einer deklarativen Jenkins-Datei oder nur in einer Skript-Jenkins-Datei?
Lerner
Sollte mit einer deklarativen Jenkins-Datei arbeiten. Der Trigger funktioniert nur innerhalb des Options-Tags iirc. Wenn Sie nur den Hauptzweig bereitstellen möchten, können Sie ein Skript {if (BRANCH_NAME == „Master“) {// deploy}} in den Bereitstellungsblock einfügen. (Ich bin derzeit auf dem Handy, so dass die Syntax möglicherweise falsch ist)
Julian Veerkamp
@Learner "wenn Sie eine Pipeline im deklarativen Stil verwenden"
OrangeDog
43

Wenn Sie eine deklarative Jenkins-Datei verwenden, verwenden Sie die Trigger- Direktive.

pipeline {
    agent any
    triggers {
        cron('H 4/* 0 0 1-5')
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}
teeks99
quelle
14
Gibt es eine Möglichkeit, Cron nur am masterZweig auszulösen ? Um einen gewissen Kontext zu geben: Wenn Teamkollegen einen neuen Feature-Zweig erstellen und dort festschreiben, sollte die Jenkins-Datei weiterhin ausgelöst werden (per Umfrage oder Push), aber ich möchte nicht, dass das Cron-Trigger-Feuer auf diesen Feature-Zweigen ausgelöst wird.
Foobarto
Verwenden Sie: stage ('Stage1') {when {branch "master"} Schritte {}} OR stage ('Stage1 (Not master)') {when {not {branch 'master'}} Schritte {sh 'do-non- master.sh '}}
tr53
29

Ich konnte ein Beispiel finden, das dies veranschaulicht und alte Builds verwirft, was ich auch wollte.

Jenkinsfile in jenkins-infra / jenkins.io:

properties(
    [
        [
            $class: 'BuildDiscarderProperty',
            strategy: [$class: 'LogRotator', numToKeepStr: '10']
        ],
        pipelineTriggers([cron('H/30 * * * *')]),
    ]
)
geowa4
quelle
1
Übrigens können Sie für die erste Eigenschaft das buildDiscarderSymbol verwenden, um die Syntax zu vereinfachen, wie die Pipeline-Syntax zeigen sollte.
Jesse Glick
1
Es funktioniert nicht in Skript-Pipelines unter Jenkins 2.79 (java.lang.UnsupportedOperationException: Undefiniertes Symbol 'PipelineTriggers')
Gileri
2
Eric, versuchen Sie es einfach für geskriptete Pipelines: pipelineTriggers([[$class: "TimerTrigger", spec: "H 1 * * *"]])
Nradev
17

Das funktioniert bei mir:

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

Weitere Informationen finden Sie in diesem Artikel

Paweł Iwaneczko
quelle
2

Für parametrisierte periodische Läufe oder geplante Trigger kann Folgendes verwendet werden.

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
quelle