Paso / etapa condicional en la tubería de Jenkins

90

¿Cómo se ejecuta un paso / etapa de compilación solo si se crea una rama específica?

Por ejemplo, ejecute un paso de implementación solo si se llama a la rama deployment, dejando todo lo demás igual.

Devonte
fuente

Respuestas:

180

Haciendo lo mismo en la sintaxis de canalización declarativa, a continuación se muestran algunos ejemplos:

stage('master-branch-stuff'){
  agent any
  when{
    branch 'master'
  }
  steps {
    echo 'run this stage - ony if the branch = master branch'
  }
}

<b

stage('feature-branch-stuff') {
    agent label:'test-node'
    when { branch "feature/*" }
    steps {
        echo 'run this stage - only if the branch name started with feature/'
    }
}

<b

stage('expression-branch') {
    agent label:'some-node'
    when {
    expression {
        return env.BRANCH_NAME != 'master';
        }
    }
    steps {
        echo 'run this stage - when branch is not equal to master'
    }
}

<b

stage('env-specific-stuff') {
    agent label:'test-node'
    when { 
      environment name: 'NAME', value: 'this' 
    }
    steps {
        echo 'run this stage - only if the env name and value matches'
    }
}

Surgen formas más efectivas: https://issues.jenkins-ci.org/browse/JENKINS-41187
También consulte: https://jenkins.io/doc/book/pipeline/syntax/#when


La directiva beforeAgent truese puede configurar para evitar que un agente ejecute el condicional, si el condicional no requiere que el estado de git decida si ejecutar:

when { beforeAgent true; expression { return isStageConfigured(config) } }

Publicar publicación y documentos


ACTUALIZAR
Nueva cláusula WHEN
REF: https://jenkins.io/blog/2018/04/09/whats-in-declarative

es igual a: compara dos valores (cadenas, variables, números, valores booleanos) y devuelve verdadero si son iguales. ¡Honestamente, no estoy seguro de cómo nos perdimos de agregar esto antes! También puede hacer comparaciones "no es igual a" utilizando la combinación no {igual a ...}.

changeRequest: en su forma más simple, esto devolverá verdadero si esta canalización está creando una solicitud de cambio, como una solicitud de extracción de GitHub. También puede realizar comprobaciones más detalladas de la solicitud de cambio, lo que le permite preguntar "¿Es esta una solicitud de cambio contra la rama principal?" y mucho más.

buildingTag: una condición simple que simplemente verifica si el Pipeline se está ejecutando en una etiqueta en SCM, en lugar de una rama o una referencia de compromiso específica.

tag: un equivalente más detallado de buildingTag, que le permite verificar el nombre de la etiqueta.

Chandan Nayak
fuente
1
¿Puedo usar esto para las acciones posteriores a la compilación?
Doug
1
Encuentro que Jenkins activa el agente especificado incluso si la when{}condición se evalúa como falsa. :(
Trejkaz
1
@Trejkaz ahora puedes usar beforeAgent truepara evitar eso
Nick Jones
1
@NickJones de hecho, beforeAgentahora es una solución para eso.
Trejkaz
45

Solo usa ify env.BRANCH_NAME, ejemplo:

    if (env.BRANCH_NAME == "deployment") {                                          
        ... do some build ...
    } else {                                   
        ... do something else ...
    }                                                                       
Krzysztof Krasoń
fuente
4
si debe ser antes o después de la etapa?
Jet
5
Antes de la etapa, las etapas pueden estar adentro si hay bifurcaciones
Krzysztof Krasoń
no creo que la ubicación realmente importe
omu_negru
9
No puedo hacer que esto funcione con una canalización declarativa. ¿Funciona esto con canalizaciones declarativas? WorkflowScript: 9: Se esperaba una etapa en la línea 9, columna 9. if (env.BRANCH_NAME == "deployment") {WorkflowScript: 8: No se especificaron etapas en la línea 8, columna 5. etapas {
pitchblack408

4
esto solo funciona en pipelines con script. para canalizaciones declarativas, debe usar script {} dentro del paso.
Pedro Henrique
1

Según otras respuestas, estoy agregando el escenario de etapas paralelas:

pipeline {
    agent any
    stages {
        stage('some parallel stage') {
            parallel {
                stage('parallel stage 1') {
                    when {
                      expression { ENV == "something" }
                    }
                    steps {
                        echo 'something'
                    }
                }
                stage('parallel stage 2') {
                    steps {
                        echo 'something'
                    }
                }
            }
        }
    }
}
Yakir GIladi Edry
fuente