90 votes

"Construire périodiquement" avec un pipeline multi-branches dans Jenkins

J'utilise Jenkins 2 avec le plugin Pipeline. J'ai configuré un projet Pipeline multi-branches où chaque branche (master, development, etc.) a un Jenkinsfile dans la racine. La mise en place a été simple. Cependant, je ne sais pas comment faire pour que chaque branche soit exécutée périodiquement (pas l'indexation des branches), même si le code ne change pas. Que dois-je mettre dans mon fichier Jenkins pour activer les constructions périodiques ?

77voto

Julian Veerkamp Points 527

Si vous utilisez un pipeline de style déclaratif et que vous voulez seulement déclencher la construction sur une branche spécifique, vous pouvez faire quelque chose comme ceci :

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

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

Trouvé sur Jenkins Jira

22 votes

Cela fonctionne, mais notez que le fait de commiter et de pousser le fichier Jenkins ne suffit pas pour que le déclencheur soit récupéré ; le travail doit également être exécuté une fois manuellement par la suite.

1 votes

La détente peut-elle être à l'intérieur d'un bloc de scène ? Par exemple, stage('Deploy to production') { triggers { cron(MASTER_TRIGGER) }

3 votes

Est-ce que cela fonctionnera dans un fichier Jenkins déclaratif ou seulement dans un fichier Jenkins scripté ?

46voto

teeks99 Points 1794

Si vous utilisez un fichier Jenkins de style déclaratif, vous utilisez l'attribut déclencheurs directive.

pipeline {
    agent any
    triggers {
        cron('H 4/* 0 0 1-5')
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

16 votes

Un moyen de faire en sorte que le cron ne se déclenche que sur master branche ? Pour donner un peu de contexte : lorsque les membres de l'équipe créent une nouvelle branche de fonctionnalité et y commettent le fichier Jenkins devrait toujours être déclenché (via poll ou push) mais ce que je ne veux pas, c'est que le déclencheur cron se déclenche sur ces branches de fonctionnalité.

0 votes

Utilisation : stage('Stage1') { when { branch "master" } steps { } } OR stage('Stage1 (Not master)') { when { not { branch 'master' } } steps { sh 'do-non-master.sh' }}

29voto

geowa4 Points 17712

J'ai pu trouver un exemple illustrant cette situation et l'élimination des anciennes constructions, ce qui est également quelque chose que je voulais.

Jenkinsfile dans jenkins-infra/jenkins.io :

properties(
    [
        [
            $class: 'BuildDiscarderProperty',
            strategy: [$class: 'LogRotator', numToKeepStr: '10']
        ],
        pipelineTriggers([cron('H/30 * * * *')]),
    ]
)

1 votes

BTW pour la première propriété, vous pouvez utiliser l'option buildDiscarder pour simplifier la syntaxe, comme Syntaxe des pipelines devrait montrer.

1 votes

Il ne fonctionne pas dans les pipelines scriptés sous jenkins 2.79 (java.lang.UnsupportedOperationException : Symbole indéfini 'pipelineTriggers')

2 votes

Eric, essayez juste avec ceci pour les pipelines scriptés : pipelineTriggers([[$class: "TimerTrigger", spec: "H 1 * * *"]])

24voto

Paweł Iwaneczko Points 319

Cela fonctionne pour moi :

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

Voir plus dans cette rubrique article

2voto

merlachandra Points 177

Pour les exécutions périodiques paramétrées ou les déclencheurs programmés, on pourrait utiliser comme suit.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X