Jenkins & Bitbucket; hủy bản dựng trước nếu cam kết mới được thực hiện cho cùng chi nhánh?


7

Chúng tôi có Jenkins chạy thử nghiệm đơn vị khi các cam kết được thực hiện cho repo của chúng tôi trong Bitbucket. Điều này được kiểm soát bởi Plugin Bitbucket, tức là thông qua một webhook Bitbucket.

Hiện tại, nếu một cam kết được thực hiện cho Chi nhánh A, một bài kiểm tra đơn vị sẽ bắt đầu. Nếu trong khi công việc đó đang chạy một cam kết thứ hai được thực hiện cho Chi nhánh A, một thử nghiệm đơn vị thứ hai sẽ bắt đầu, thì hiện tại có hai thử nghiệm đơn vị trên cùng một nhánh nhưng với mã hơi khác nhau.

Hành vi ưa thích của chúng tôi là thử nghiệm của cam kết đầu tiên sẽ bị hủy bỏ khi thử nghiệm thứ hai bắt đầu, do đó chỉ có thử nghiệm đơn vị gần đây nhất đang được chạy. Điều này có thể đạt được?

Làm rõ; Chúng tôi có nhiều chi nhánh vì vậy chúng tôi không thể chỉ ngăn chặn các bản dựng đồng thời, hủy bỏ lần cuối ngay khi bắt đầu tiếp theo, v.v. Dù sử dụng phương pháp nào cũng phải kiểm tra cụ thể xem chi nhánh đã có công việc chưa chạy chưa, nếu công việc nói chung đã đang chạy.

Tôi đã thấy một số điều khiển kích hoạt cho Git, nhưng không phải Bitbucket. Tôi cũng tìm thấy một tập lệnh để kiểm tra xem công việc đã chạy chưa và hủy nó nếu có, nhưng như đã đề cập trước đó không phù hợp với trường hợp sử dụng của chúng tôi. Tui bỏ lỡ điều gì vậy?


Điều này trở nên dễ dàng hơn rất nhiều nếu bạn sử dụng plugin Bitbucket Branch Source, vì mọi chi nhánh và PR của một repo trong dự án Bitbucket sẽ có công việc Jenkins của riêng mình và từ đó dễ dàng kiểm tra xem một công việc có bản dựng gần đây đang chạy không và bỏ thai nếu vậy.
jayhendren

Bạn đã tìm thấy giải pháp nào chưa? Đặc biệt là đối với bitbucket?
user43968

Câu trả lời:


3

Lưu ý: câu trả lời này xuất phát từ nền tảng của tôi về việc xây dựng các giải pháp tùy chỉnh, nó không phải là một cấu hình - chỉ có một cấu hình, mà nếu có, rõ ràng sẽ thích hợp hơn. Nhưng nó có thể là một cái gì đó để xem xét khác.

Bạn có thể dạy tập lệnh thực thi công việc kiểm tra đơn vị để duy trì trạng thái thực thi trên mỗi nhánh.

Khi tập lệnh được khởi chạy, nó sẽ cần lấy tên nhánh từ các tham số gọi của nó. Sau đó nó sẽ có được trạng thái bền bỉ cho chi nhánh.

Nếu trạng thái bị thiếu hoặc not runningnó sẽ được đặt thành running + job ID, hãy thực hiện kiểm tra đơn vị và sau đó đặt trạng thái thành not running(hoặc xóa nó).

Nếu trạng thái là running + job IDnó có nghĩa là một bài kiểm tra đơn vị khác đang chạy và bạn có ID công việc tương ứng. Tập lệnh sau đó có thể (duyên dáng?) Chấm dứt công việc đã chạy bằng ID của nó và thực hiện nó, cập nhật trạng thái running + new job ID.

Nhưng IMHO chấm dứt một công việc đang tiến triển (có thể rất gần hoàn thành) không phải là lý tưởng - nó sẽ nhường chỗ cho việc giết người liên tục và tung ra những tin tức chỉ đến lượt mình, bị giết bởi những công việc tiếp theo - tất cả mà không thực sự hoàn thành của họ.

Thay vào đó, tôi sửa đổi logic thành:

  • để lại công việc đang tiến hành một mình và thay vào đó chỉ ghi lại ở trạng thái bền vững a pending job ID(có thể là một giá trị duy nhất, được ghi đè để phản ánh công việc đang chờ xử lý gần đây nhất được gửi hoặc danh sách tất cả các công việc đang chờ xử lý, được sắp xếp theo thời gian gửi)
  • khi công việc đang thực hiện hoàn thành, nó sẽ kiểm tra các pending job IDgiá trị và, nếu có, sẽ khởi chạy cái gần đây nhất (hoặc cái cũ nhất, hoặc thậm chí theo một số logic lựa chọn khác, nếu sử dụng danh sách)

Cách tiếp cận này tránh lãng phí tài nguyên kiểm tra đơn vị và có thể dễ dàng điều chỉnh ngay cả đối với nhiều hơn một nhưng tài nguyên vẫn còn hạn chế.

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.