Fase / fase condizionale nella pipeline di Jenkins


96

Come si esegue un passaggio / fase di compilazione solo se si crea un ramo specifico?

Ad esempio, eseguire un passaggio di distribuzione solo se viene chiamato il ramo deployment, lasciando tutto il resto uguale.

Risposte:


188

Facendo lo stesso nella sintassi dichiarativa della pipeline, di seguito sono riportati alcuni esempi:

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

Modi più efficaci in arrivo: https://issues.jenkins-ci.org/browse/JENKINS-41187
Guarda anche - https://jenkins.io/doc/book/pipeline/syntax/#when


La direttiva beforeAgent truepuò essere impostata per evitare di avviare un agente per eseguire il condizionale, se il condizionale non richiede che git state decida se eseguire:

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

Pubblicazione di post e documenti


AGGIORNAMENTO
Nuova clausola WHEN
REF: https://jenkins.io/blog/2018/04/09/whats-in-declarative

è uguale a - Confronta due valori - stringhe, variabili, numeri, valori booleani - e restituisce vero se sono uguali. Onestamente non sono sicuro di come ci siamo persi aggiungendo questo prima! Puoi fare confronti "non uguale a" usando anche la combinazione non {uguale a ...}.

changeRequest: nella sua forma più semplice, restituirà true se questa pipeline sta creando una richiesta di modifica, come una richiesta pull di GitHub. Puoi anche fare controlli più dettagliati rispetto alla richiesta di modifica, permettendoti di chiedere "questa è una richiesta di modifica contro il ramo master?" e altro ancora.

buildingTag: una condizione semplice che controlla solo se la pipeline è in esecuzione rispetto a un tag in SCM, piuttosto che un ramo o un riferimento di commit specifico.

tag - Un equivalente più dettagliato di buildingTag, che consente di confrontare il nome del tag stesso.


1
posso usarlo per le azioni di post build?
Doug

1
Trovo che Jenkins faccia girare l'agente specificato anche se la when{}condizione risulta falsa. :(
Trejkaz

1
@Trejkaz ora puoi usare beforeAgent trueper evitarlo
Nick Jones

1
@NickJones in effetti, beforeAgentora è una soluzione alternativa.
Trejkaz

47

Usa ife env.BRANCH_NAME, esempio:

    if (env.BRANCH_NAME == "deployment") {                                          
        ... do some build ...
    } else {                                   
        ... do something else ...
    }                                                                       

4
se dovrebbe essere prima o dopo?
Jet

5
Prima della tappa, le tappe possono essere all'interno se si
succedono

non credo che il posizionamento sia davvero importante
omu_negru

9
Non riesco a ottenere questo lavoro con una pipeline dichiarativa. Funziona con pipeline dichiarative? WorkflowScript: 9: Previsto uno stage @ riga 9, colonna 9. if (env.BRANCH_NAME == "deployment") {WorkflowScript: 8: Nessuno stage specificato @ riga 8, colonna 5. stages {
pitchblack408

4
funziona solo in pipeline con script. per le pipeline dichiarative, dovresti utilizzare lo script {} all'interno del passaggio.
Pedro Henrique

1

Secondo altre risposte aggiungo lo scenario delle fasi parallele:

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'
                    }
                }
            }
        }
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.