Cách thêm bước thời gian chờ vào Jenkins Pipeline


91

Khi bạn đang sử dụng một dự án kiểu tự do, bạn có thể đặt rằng sau 20 phút, quá trình xây dựng sẽ bị hủy bỏ nếu chưa kết thúc. Làm thế nào điều này có thể thực hiện được với Dự án đường ống nhiều nhánh của Jenkins?

Câu trả lời:


187

Bạn có thể sử dụng bước thời gian chờ :

timeout(20) {
  node {
    sh 'foo'
  }
}

Nếu bạn cần một khác nhau TimeUnithơn BIÊN , bạn có thể cung cấp các unitluận cứ:

timeout(time: 20, unit: 'SECONDS') {

CHỈNH SỬA tháng 8 năm 2018: Ngày nay với các đường ống khai báo phổ biến hơn (dễ dàng nhận ra bởi pipelinecấu trúc cấp cao nhất ), thời gian chờ cũng có thể được chỉ định bằng cách sử dụng optionsở các cấp độ khác nhau (mỗi đường ống tổng thể hoặc mỗi giai đoạn):

pipeline {
  options {
      timeout(time: 1, unit: 'HOURS') 
  }
  stages { .. }
  // ..
}

Tuy nhiên, nếu bạn muốn áp dụng thời gian chờ cho một bước trong quy trình khai báo, nó có thể được sử dụng như mô tả ở trên.


6
Tham chiếu cũng có sẵn trong 1. Bảng điều khiển Jenkins<bất kỳ dự án đường ống nào> ▼ → Cú pháp đường ốngTham chiếu bước hoặc 2. JENKINS_URL/job/<any Pipeline project>/pipeline-syntax/Tham chiếu bước .
Gerold Broser,

2
Có thể chỉ hết thời gian chờ cho phần có được nút và không tính thời gian dành cho việc chạy nội dung không? Tức là: đôi khi các nút ngoại tuyến và tôi muốn một cách để công việc thất bại nếu nó không thể có được một nút kịp thời, thay vì hết thời gian chờ, nhưng không muốn công việc thất bại nếu nó đã có được nút và đang chạy ..
Jake

Nếu bạn chỉ muốn biết liệu nút có trực tuyến hay không, bạn có thể hỏi: def n=Jenkins.instance.getNode("ETService3") if (n!=null && n.computer && n.computer.online) { echo "Online" } else { echo "Offline" // wait a little bit and try again }Một cách khó khăn là bạn có được nút hai lần. Lần đầu tiên với thời gian chờ bên ngoài, lần thứ hai với thời gian chờ bên trong. Tôi cũng thiếu tính năng này.
elou

@Jake, đó phải là một câu hỏi!
charlie_pl

1
Làm thế nào để bạn đưa ra thông báo lỗi của riêng mình khi hết thời gian chờ?
red888

3

Đối với một Đường ống Khai báo, bạn nên sử dụng bước thời gian chờ trong phần tùy chọn .

Thực thi mã bên trong khối với giới hạn thời gian chờ xác định. Nếu đạt đến giới hạn thời gian, một ngoại lệ (org.jenkinsci.plugins.workflow.steps.FlowInterruptException) sẽ được ném ra, dẫn đến việc hủy bỏ bản dựng (trừ khi nó được bắt và xử lý bằng cách nào đó). Đơn vị là tùy chọn nhưng mặc định là phút.

Bước thời gian chờ có 3 thông số bạn có thể định cấu hình:

  • thời gian (bắt buộc, int)

    • Khoảng thời gian chờ, nếu không có đơn vị nào được nêu thời lượng tính bằng phút
  • hoạt động (tùy chọn, boolean)

    • Thời gian chờ sau khi không có hoạt động nào trong nhật ký cho khối này thay vì thời lượng tuyệt đối.
  • đơn vị (tùy chọn, giá trị: NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS)

    • Đơn vị thời gian , mặc định là MINUTES

Ví dụ:

timeout(time: 10) // would lead to a timeout of 10 minutes (MINUTES is default value)
timeout(time: 10, unit: 'SECONDS') // a 10 seconds timeout
timeout(time: 10, activity: false, unit: 'MILLISECONDS')

Các tài liệu chính thức Jenkins có một ví dụ rất tốt đẹp cho việc sử dụng một thời gian chờ:

pipeline {
    agent any
    options {
        timeout(time: 1, unit: 'HOURS') 
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

2
activitycó giá trị mặc định là false. Khi nào activitylà false - thời gian chờ cho toàn bộ công việc, truethời gian chờ cho hoạt động (để in bất kỳ thứ gì vào nhật ký).
Maxim Suslov

Tôi muốn thêm timeoutvào một giai đoạn cụ thể theo cách mà giai đoạn tiếp theo sẽ chạy một cách duyên dáng. Trong ví dụ trên, đường ống bị hủy bỏ sau khi hết thời gian chờ và các giai đoạn tiếp theo không được thực thi. Có cách nào để đạt được yêu cầu của tôi không? Mã mẫu cho thời gian chờ của một giai đoạn nhất định (từ Jenkins Doc chính thức):pipeline { agent any stages { stage('Example') { options { timeout(time: 1, unit: 'HOURS') } steps { echo 'Hello World' } } } }
Yash
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.