Cách sạch nhất để sớm thoát khỏi công việc Jenkins Pipeline là thành công?


55

Tôi có một công việc sẽ tạo các tệp, trừ khi một trong các giá trị được cung cấp cho nó phù hợp với giá trị cũ hơn. Cách sạch nhất trong Jenkins để hủy bỏ hoặc thoát khỏi công việc, mà không phải là nó FAILED? Nó thoát là hành vi chính xác vì vậy tôi muốn bản dựng được đánh dấu SUCCESS.

Nó sẽ kết thúc bằng một câu lệnh if như vậy;

stage ('Check value') {

     if( $VALUE1 == $VALUE2 ) {
       //if they do match exit as a success, else continue with the rest of the job 
    }

}

Tôi không muốn ném mã lỗi trừ khi bằng cách nào đó có thể chuyển thành mã được đánh dấu là bản dựng thành công.


1
Chỉ cần exit 0...
Tensibai

Tôi nghĩ rằng đánh dấu công việc là một thất bại? Nếu tôi sai và bạn có thể hiển thị tài liệu, tôi rất vui lòng chấp nhận đó là câu trả lời
Alex

Chà, chỉ cần bash script, thoát 0 có nghĩa là thành công, thoát không bằng 0 có nghĩa là thất bại ...
Tensibai

Đây không phải là một tập lệnh bash, đây là công việc chính, vì vậy Groovy. Điều đó có thay đổi mọi thứ không?
Alex

Trong Groovy tôi chỉ cần thử một return 0, tất cả trong tất cả các đầu của mã Groovy không có ngoại lệ nên tôi nghĩ. Tôi sẽ để ai đó có thêm thông tin về jenkins 2 xác nhận hoặc xác nhận
Tensibai

Câu trả lời:


46

Tìm ra. Bên ngoài bất kỳ giai đoạn nào (nếu không điều này sẽ chỉ kết thúc giai đoạn cụ thể là thành công), hãy làm như sau;

if( $VALUE1 == $VALUE2 ) {
   currentBuild.result = 'SUCCESS'
   return
}

return sẽ dừng giai đoạn hoặc nút mà bạn đang chạy , đó là lý do tại sao việc chạy bên ngoài giai đoạn là quan trọng, trong khi cài đặt currentBuild.resultngăn không cho nó bị lỗi.


chỉ quay trở lại nên để lại bản dựng với trạng thái chuyển sang màu xám và không có kết quả ... vì vậy không hoàn toàn giống với bản dựng bị lỗi.
thu hút

1
Làm thế nào để bạn trở lại và bỏ qua tất cả các giai đoạn còn lại?
Jess Bowers

1
@JessBowers đó là tất cả về nơi bạn đặt đoạn trích. Nếu bạn thực hiện ở cấp nút thay vì cấp giai đoạn, nó sẽ hoàn thành toàn bộ công việc.
Alex

4
Xin lưu ý rằng nó chỉ hoạt động cho đường ống theo kịch bản, không phải cho khai báo
kagarlickij

@kagarlickij - Chính xác, các đường ống khai báo đã không tồn tại khi câu trả lời này được viết!
Alex

10

Bạn cũng có thể sử dụng lỗi để thoát khỏi giai đoạn hiện tại, sau đó bạn không phải xem xét phân cấp giai đoạn hiện tại và các công cụ tương tự:

def autoCancelled = false

try {
  stage('checkout') {
    ...
    if (your condition) {
      autoCancelled = true
      error('Aborting the build.')
    }
  }
} catch (e) {
  if (autoCancelled) {
    currentBuild.result = 'SUCCESS'
    // return here instead of throwing error to keep the build "green"
    return
  }
  // normal error handling
  throw e
}

Nhưng điều này sẽ dẫn đến một giai đoạn màu đỏ, nếu lỗi xảy ra trong một giai đoạn.

nhập mô tả hình ảnh ở đây

Nó phụ thuộc vào yêu cầu của bạn, cách bạn muốn sử dụng.


Nếu bạn định làm theo cách này, hãy tạo một lớp con mới RuntimeExceptionđể ném thay vì cần phải bắt tất cả các ngoại lệ và kiểm tra cờ
Michael Mrozek

1

Thành thật mà nói bạn không cần phải sử dụng lệnh exit một cách cụ thể, nhưng có một Plugin BuildStep có điều kiện có thể đạt được kết quả cuối cùng (mã không chạy).

Tôi chưa nghĩ ra điều này, vì vậy chưa sử dụng plugin.

Ngoài ra còn có các điều kiện như được tìm thấy trong bài đăng Stack Overflow trước này trên Jenkins: Jenkins Pipeline Bước / Giai đoạn có điều kiện


1
Mặc dù câu trả lời của bạn có vẻ hợp lệ (chưa kiểm tra trực tiếp kể từ khi tôi tìm thấy cách giải quyết khác), tôi không nghĩ "Thành thật mà nói bạn không nên thoát" là một cách tốt để bắt đầu nó; rõ ràng sự tồn tại của các phương thức này có nghĩa là đôi khi cần phải thoát ra.
Alex

Bạn muốn đề nghị gì? Chuyển đến một tuyên bố kết thúc? Thêm vòng loại "nói chung"? Bạn đã cung cấp "thông tin phản hồi" nhưng tôi không dễ để nói ra ý định hay hành động đó, xin vui lòng bớt ngắn gọn hơn.
MrMesees

Đợi một chút. Có phải đó là câu hỏi của bạn? Nếu đúng như vậy, TBH bạn sẽ không muốn nghe bạn không nên thoát, nhưng cả phương pháp tôi đã đề xuất đều cung cấp lối thoát, họ tránh né mã đang chạy ... Hỗ trợ trực tiếp vị trí của tôi.
MrMesees

1
À tôi hiểu rồi, tôi nghĩ rằng tôi đã hiểu sai câu nói của bạn là "làm gì đó để kết thúc công việc là xấu" thay vì "bạn không nên sử dụng exitmệnh lệnh" - nếu vậy tôi xin lỗi, đó là sự hiểu lầm của tôi.
Alex

3
Tôi đã cố gắng làm cho nó rõ ràng hơn, không cần phải xin lỗi chút nào, ngôn ngữ là một con thú hay thay đổi, đặc biệt là trên internet :)
MrMesees

0

Các Executor.interrupt(Result)phương pháp là, hầu hết các con đường trực tiếp sạch nhất tôi có thể tìm để ngăn chặn một xây dựng sớm đánh dấu nó như là một thành công.

script {
    currentBuild.getRawBuild().getExecutor().interrupt(Result.SUCCESS)
}

Ưu điểm :

  • Hoạt động trong một đường ống khai báo cũng như một kịch bản.
  • Không thử / bắt hoặc ngoại lệ để xử lý.
  • Đánh dấu giai đoạn gọi và bất kỳ giai đoạn kế tiếp nào là màu xanh lá cây / chuyển qua trong giao diện người dùng.

Nhược điểm :

  • Yêu cầu một số phê duyệt kịch bản trong quá trình, bao gồm một phê duyệt được coi là không an toàn . Phê duyệt và sử dụng một cách thận trọng.

Đối với tôi nó không hoạt động - các giai đoạn liên tiếp đang được thực hiện.
Łukasz K
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.