Langkah / tahapan bersyarat dalam pipeline Jenkins

90

Bagaimana Anda menjalankan langkah / tahapan pembangunan hanya jika membangun cabang tertentu?

Misalnya, jalankan langkah penerapan hanya jika cabang dipanggil deployment, biarkan yang lainnya tetap sama.

Devonte
sumber

Jawaban:

181

Melakukan hal yang sama dalam sintaks pipeline deklaratif, berikut adalah beberapa contohnya:

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

Cara yang lebih efektif muncul - https://issues.jenkins-ci.org/browse/JENKINS-41187
Juga lihat - https://jenkins.io/doc/book/pipeline/syntax/#when


Direktif beforeAgent truedapat disetel untuk menghindari memutar agen untuk menjalankan kondisional, jika kondisional tidak memerlukan status git untuk memutuskan apakah akan dijalankan:

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

Rilis postingan dan dokumen


UPDATE
Baru KETIKA Klausa
REF: https://jenkins.io/blog/2018/04/09/whats-in-declarative

sama dengan - Membandingkan dua nilai - string, variabel, angka, boolean - dan mengembalikan nilai benar jika sama. Sejujurnya saya tidak yakin bagaimana kami melewatkan menambahkan ini sebelumnya! Anda juga dapat melakukan perbandingan "tidak sama dengan" menggunakan kombinasi bukan {sama dengan ...}.

changeRequest - Dalam bentuk yang paling sederhana, ini akan mengembalikan nilai true jika Pipeline ini membuat permintaan perubahan, seperti pull request GitHub. Anda juga dapat melakukan pemeriksaan lebih rinci terhadap permintaan perubahan, memungkinkan Anda untuk bertanya "apakah ini permintaan perubahan terhadap cabang master?" dan banyak lagi.

buildingTag - Kondisi sederhana yang hanya memeriksa apakah Pipeline dijalankan terhadap tag di SCM, bukan cabang atau referensi komit tertentu.

tag - Persamaan yang lebih mendetail dari buildingTag, memungkinkan Anda memeriksa dengan nama tag itu sendiri.

Chandan Nayak
sumber
1
dapatkah saya menggunakan ini untuk tindakan pasca membangun?
Doug
1
Saya menemukan Jenkins memutar agen yang ditentukan meskipun when{}kondisinya bernilai false. :(
Trejkaz
1
@Trejkaz sekarang dapat Anda gunakan beforeAgent trueuntuk menghindari itu
Nick Jones
1
@NickJones memang, beforeAgentsekarang adalah solusi untuk itu.
Trejkaz
45

Cukup gunakan ifdan env.BRANCH_NAME, contoh:

    if (env.BRANCH_NAME == "deployment") {                                          
        ... do some build ...
    } else {                                   
        ... do something else ...
    }                                                                       
Krzysztof Krasoń
sumber
4
apakah harus sebelum tahap atau sesudah?
Jet
5
Sebelum tahap, tahapan dapat di dalam jika cabang
Krzysztof Krasoń
tidak berpikir penempatan itu penting
omu_negru
9
Saya tidak bisa mendapatkan pekerjaan ini dengan pipa deklaratif. Apakah ini berfungsi dengan pipeline deklaratif? WorkflowScript: 9: Diharapkan tahap @ baris 9, kolom 9. if (env.BRANCH_NAME == "deployment") {WorkflowScript: 8: Tidak ada tahapan yang ditentukan @ baris 8, kolom 5. tahapan {
pitchblack408

4
ini hanya berfungsi di pipeline dengan skrip. untuk pipeline deklaratif, Anda harus menggunakan skrip {} di dalam langkah.
Pedro Henrique
1

Menurut jawaban lain saya menambahkan skenario tahapan paralel:

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
sumber