Bước / giai đoạn có điều kiện trong đường ống Jenkins


90

Làm thế nào để bạn chạy một bước / giai đoạn xây dựng chỉ khi xây dựng một nhánh cụ thể?

Ví dụ: chỉ chạy một bước triển khai khi nhánh được gọi deployment, để lại mọi thứ khác như cũ.

Câu trả lời:


181

Thực hiện tương tự trong cú pháp đường ống khai báo, dưới đây là một số ví dụ:

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

Sắp có những cách hiệu quả hơn - https://issues.jenkins-ci.org/browse/JENKINS-41187
Cũng xem tại - https://jenkins.io/doc/book/pipeline/syntax/#when


Chỉ thị beforeAgent truecó thể được đặt để tránh quay một tác nhân để chạy điều kiện, nếu điều kiện không yêu cầu trạng thái git để quyết định có chạy hay không:

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

Phát hành bài đăngtài liệu


CẬP NHẬT MỚI
KHI
ĐIỀU KHOẢN REF: https://jenkins.io/blog/2018/04/09/whats-in-decl Compare

bằng - So sánh hai giá trị - chuỗi, biến, số, boolean - và trả về true nếu chúng bằng nhau. Tôi thành thật không biết làm thế nào chúng tôi đã bỏ lỡ thêm điều này sớm hơn! Bạn cũng có thể thực hiện so sánh "không bằng" bằng cách sử dụng kết hợp not {bằng ...}.

changeRequest - Ở dạng đơn giản nhất, điều này sẽ trả về true nếu Pipeline này đang xây dựng một yêu cầu thay đổi, chẳng hạn như một yêu cầu kéo GitHub. Bạn cũng có thể kiểm tra chi tiết hơn đối với yêu cầu thay đổi, cho phép bạn hỏi "đây có phải là yêu cầu thay đổi đối với nhánh chính không?" và nhiều hơn nữa.

buildingTag - Một điều kiện đơn giản chỉ kiểm tra xem Pipeline có đang chạy với một thẻ trong SCM hay không, chứ không phải là một nhánh hoặc một tham chiếu cam kết cụ thể.

tag - Một tương đương chi tiết hơn của buildingTag, cho phép bạn kiểm tra chính tên thẻ.


1
tôi có thể sử dụng cái này cho các hành động xây dựng bài đăng không?
Doug

1
Tôi thấy Jenkins quay trở lại tác nhân được chỉ định ngay cả khi when{}điều kiện đánh giá là sai. :(
Trejkaz

1
@Trejkaz bây giờ bạn có thể sử dụng beforeAgent trueđể tránh điều đó
Nick Jones

1
@NickJones thực sự, beforeAgenthiện là một giải pháp thay thế cho điều đó.
Trejkaz

45

Chỉ cần sử dụng ifenv.BRANCH_NAME, ví dụ:

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

4
nếu nên được trước hoặc sau?
Máy bay phản lực

5
Trước sân khấu, các giai đoạn có thể ở bên trong nếu các chi nhánh
Krzysztof Krasoń

đừng nghĩ rằng vị trí thực sự quan trọng
omu_negru 19/09/18

9
Tôi không thể thực hiện công việc này với một đường dẫn khai báo. Điều này có hoạt động với các đường ống khai báo không? WorkflowScript: 9: Dự kiến ​​có giai đoạn @ dòng 9, cột 9. if (env.BRANCH_NAME == "deploy") {WorkflowScript: 8: Không có giai đoạn nào được chỉ định @ dòng 8, cột 5. giai đoạn {
pitchblack408

4
điều này chỉ hoạt động trong các đường ống có tập lệnh. đối với các đường ống khai báo, bạn nên sử dụng tập lệnh {} bên trong bước.
Pedro Henrique,

1

Theo các câu trả lời khác, tôi đang thêm kịch bản các giai đoạn song song:

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'
                    }
                }
            }
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.