Warunkowy krok / etap w potoku Jenkins

90

Jak uruchomić krok / etap kompilacji tylko w przypadku tworzenia określonej gałęzi?

Na przykład uruchom krok wdrażania tylko wtedy, gdy wywoływana jest gałąź deployment, pozostawiając wszystko inne bez zmian.

Devonte
źródło

Odpowiedzi:

180

Robiąc to samo w deklaratywnej składni potoku, poniżej znajduje się kilka przykładów:

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

Nadchodzą bardziej efektywne sposoby - https://issues.jenkins-ci.org/browse/JENKINS-41187 Zobacz
także - https://jenkins.io/doc/book/pipeline/syntax/#when


Dyrektywę beforeAgent truemożna ustawić, aby uniknąć uruchamiania agenta w celu uruchomienia warunku, jeśli warunek nie wymaga stanu git, aby zdecydować, czy uruchomić:

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

Opublikuj post i dokumenty


AKTUALIZACJA
Nowa klauzula
REF: https://jenkins.io/blog/2018/04/09/whats-in-declarative

równa się - porównuje dwie wartości - łańcuchy, zmienne, liczby, wartości logiczne - i zwraca prawdę, jeśli są równe. Szczerze mówiąc, nie jestem pewien, jak przegapiliśmy dodanie tego wcześniej! Możesz dokonywać porównań „nie równa się”, używając również kombinacji nie {equals ...}.

changeRequest - w najprostszej formie zwróci wartość true, jeśli ten potok buduje żądanie zmiany, takie jak żądanie ściągnięcia GitHub. Możesz również przeprowadzić bardziej szczegółowe sprawdzenia w odniesieniu do żądania zmiany, pozwalając zapytać „czy to jest żądanie zmiany dotyczące oddziału głównego?” i wiele więcej.

buildingTag - prosty warunek, który po prostu sprawdza, czy potok działa na tagu w SCM, a nie na gałęzi lub określonym odwołaniu do zatwierdzenia.

tag - bardziej szczegółowy odpowiednik buildingTag, umożliwiający sprawdzenie samej nazwy tagu.

Chandan Nayak
źródło
1
czy mogę tego użyć do działań po kompilacji?
Doug,
1
Uważam, że Jenkins obraca określonego agenta, nawet jeśli when{}warunek zostanie oceniony jako fałszywy. :(
Trejkaz
1
@Trejkaz, którego możesz teraz użyć, beforeAgent trueaby tego uniknąć
Nick Jones
1
@NickJones rzeczywiście beforeAgentjest teraz obejściem tego problemu.
Trejkaz
45

Po prostu użyj ifi env.BRANCH_NAME, na przykład:

    if (env.BRANCH_NAME == "deployment") {                                          
        ... do some build ...
    } else {                                   
        ... do something else ...
    }                                                                       
Krzysztof Krasoń
źródło
4
czy powinno być przed etapem czy po?
Jet
5
Przed etapem sceny mogą być w środku, jeśli rozgałęzienia
Krzysztof Krasoń
nie myśl, że miejsce docelowe faktycznie ma znaczenie
omu_negru
9
Nie mogę uzyskać tej pracy z deklaratywnym potokiem. Czy to działa w przypadku potoków deklaratywnych? WorkflowScript: 9: Oczekiwano etapu @ wiersz 9, kolumna 9. if (env.BRANCH_NAME == "wdrożenie") {WorkflowScript: 8: Nie określono etapów @ wiersz 8, kolumna 5. etapy {
pitchblack408

4
działa to tylko w potokach skryptowych. w przypadku potoków deklaratywnych powinieneś użyć skryptu {} wewnątrz kroku.
Pedro Henrique
1

Według innych odpowiedzi dodaję scenariusz równoległych etapów:

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
źródło