"Construya periódicamente" con una canalización de varias ramas en Jenkins


80

Estoy ejecutando Jenkins 2 con el complemento Pipeline. He configurado un proyecto de canalización de múltiples ramas donde cada rama (maestra, desarrollo, etc.) tiene un archivo Jenkins en la raíz. Configurar esto fue simple. Sin embargo, no sé cómo hacer que cada rama se ejecute periódicamente (no la indexación de la rama), incluso cuando el código no cambia. ¿Qué necesito poner en mi archivo Jenkins para habilitar compilaciones periódicas?

Respuestas:


68

Si usa un Pipeline de estilo declarativo y solo desea activar la compilación en una rama específica, puede hacer algo como esto:

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

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

Encontrado en Jenkins Jira


15
Esto funciona, pero tenga en cuenta que confirmar y presionar el archivo Jenkins no es suficiente para que se detecte el disparador; el trabajo también debe ejecutarse una vez manualmente.
Cameron

1
¿Puede el gatillo estar dentro de un bloque de escenario? Es decir, etapa ('Implementar en producción') {triggers {cron (MASTER_TRIGGER)}
Estudiante

2
¿Funcionará esto en un archivo jenkins declarativo o solo en un archivo jenkins con script?
Estudiante

Debería funcionar con un Jenkinsfile declarativo. El disparador solo funciona dentro de la etiqueta de opciones iirc. Si solo desea implementar la rama maestra, puede poner un script {if (BRANCH_NAME == „Master“) {// deploy}} dentro del bloque de implementación. (Actualmente estoy en un dispositivo móvil, por lo que la sintaxis podría ser incorrecta)
Julian Veerkamp

@Learner "si usa un Pipeline de estilo declarativo"
OrangeDog

43

Si está utilizando un Jenkinsfile de estilo declarativo, utilice la directiva triggers .

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

14
¿Alguna forma de hacer que cron se active solo en la masterrama? Para dar un poco de contexto: cuando los compañeros de equipo crean una nueva rama de funciones y se comprometen allí, el archivo Jenkins aún debería activarse (a través de una encuesta o empujar), pero lo que no quiero es el disparo cron en estas ramas de funciones.
foobarto

Use: stage ('Stage1') {cuando {branch "master"} pasos {}} O stage ('Stage1 (Not master)') {when {not {branch 'master'}} steps {sh 'do-non- master.sh '}}
tr53

29

Pude encontrar un ejemplo que ilustra esto y descartar compilaciones antiguas, que también es algo que quería.

Jenkinsfile en jenkins-infra / jenkins.io:

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

1
Por cierto, para la primera propiedad, puede usar el buildDiscardersímbolo para simplificar la sintaxis, como debería mostrar Pipeline Syntax .
Jesse Glick

1
No funciona en canalizaciones con secuencias de comandos bajo jenkins 2.79 (java.lang.UnsupportedOperationException: símbolo no
definido

2
Eric, intente con esto para pipelines con pipelineTriggers([[$class: "TimerTrigger", spec: "H 1 * * *"]])
script


2

Para ejecuciones periódicas paramertizadas o desencadenantes programados, se podría utilizar lo siguiente.

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.