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

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


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

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

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


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''' : ""
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.