Etapa / estágio condicional no pipeline do Jenkins

96

Como você executa uma etapa / estágio de construção apenas se estiver construindo um branch específico?

Por exemplo, execute uma etapa de implantação apenas se o branch for chamado deployment, deixando todo o resto igual.

Devonte
fonte

Respostas:

188

Fazendo o mesmo na sintaxe de pipeline declarativa, abaixo estão alguns exemplos:

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

Formas mais eficazes surgindo - https://issues.jenkins-ci.org/browse/JENKINS-41187 Veja
também - https://jenkins.io/doc/book/pipeline/syntax/#when


A diretiva beforeAgent truepode ser definida para evitar a rotação de um agente para executar o condicional, se o condicional não exigir o estado git para decidir se deve ser executado:

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

Publicar postagem e documentos


ATUALIZAÇÃO
Nova cláusula WHEN
REF: https://jenkins.io/blog/2018/04/09/whats-in-declarative

igual a - compara dois valores - strings, variáveis, números, booleanos - e retorna verdadeiro se eles forem iguais. Sinceramente, não tenho certeza de como deixamos de adicionar isso antes! Você pode fazer comparações "não iguais" usando a combinação não {igual a ...} também.

changeRequest - Em sua forma mais simples, retornará true se este Pipeline estiver construindo uma solicitação de mudança, como uma solicitação pull do GitHub. Você também pode fazer verificações mais detalhadas na solicitação de mudança, permitindo que você pergunte "esta é uma solicitação de mudança em relação ao branch master?" e muito mais.

buildingTag - Uma condição simples que apenas verifica se o Pipeline está sendo executado em uma tag no SCM, ao invés de um branch ou uma referência de commit específica.

tag - um equivalente mais detalhado de buildingTag, permitindo que você verifique o próprio nome da tag.

Chandan Nayak
fonte
1
posso usar isso para as ações de pós-construção?
Doug
1
Acho que Jenkins aumenta o agente especificado, mesmo se a when{}condição for avaliada como falsa. :(
Trejkaz
1
@Trejkaz agora você pode usar beforeAgent truepara evitar isso
Nick Jones
1
@NickJones na verdade, beforeAgentagora é uma solução alternativa para isso.
Trejkaz de
47

Basta usar ife env.BRANCH_NAME, exemplo:

    if (env.BRANCH_NAME == "deployment") {                                          
        ... do some build ...
    } else {                                   
        ... do something else ...
    }                                                                       
Krzysztof Krasoń
fonte
4
se deve ser antes ou depois do estágio?
Jet
5
Antes do estágio, os estágios podem estar dentro de ramificações
Krzysztof Krasoń
não acho que a colocação realmente importa
omu_negru
9
Não consigo fazer este trabalho com um pipeline declarativo. Isso funciona com pipelines declarativos? WorkflowScript: 9: Esperado um estágio @ linha 9, coluna 9. if (env.BRANCH_NAME == "deployment") {WorkflowScript: 8: Nenhum estágio especificado @ linha 8, coluna 5. estágios {
pitchblack408

4
isso só funciona em pipelines com script. para pipelines declarativos, você deve usar o script {} dentro da etapa.
Pedro Henrique
1

De acordo com outras respostas, estou adicionando o cenário de estágios paralelos:

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
fonte