2011-11-23 9 views
5

Chúng tôi gặp hai xây dựng MộtB, nơi Một là một ứng dụng mà phụ thuộc vào thư viện B. Cả hai đều là dự án Qt. Jenkins thăm dò ý kiến ​​SCM mỗi 15 phút một lần. Đôi khi điều đó xảy ra mà tôi cam kết AB nhưng bộ hẹn giờ A kết thúc trước bộ hẹn giờ B. Vì vậy, các ứng dụng được xây dựng với một thư viện cũ, gây ra việc xây dựng thất bại. Bây giờ tôi đang tìm cách nói với Jenkins rằng B phải được xây dựng trước khi xây dựng A bắt đầu. Tuy nhiên, chỉ có thể xây dựng một cái gì đó sau khi tạo thành công.Luôn xây dựng thư viện trước khi đăng ký trong Jenkins?

Có một giải pháp đơn giản nào hay chúng tôi đã làm hỏng quá trình xây dựng của chúng tôi?

+0

bạn quản lý sự phụ thuộc giữa A và B như thế nào? svn: externals, Maven, Ivy, bespoke? –

+0

@tom Cả hai dự án đều sống trong các repo git khác nhau. – atamanroman

+0

vì vậy khi A xây dựng, làm thế nào để có được thư viện B? –

Trả lời

0

Dưới Tùy chọn nâng cao trong công việc Cấu hình, chọn Tạo khối khi dự án ngược dòng đang xây dựng. Và thực hiện công việc A phụ thuộc vào công việc B.

+1

Điều này sẽ ngăn chặn A từ tòa nhà nếu B đang xây dựng, nhưng nó sẽ không giải quyết được vấn đề mà A được kích hoạt trước B. –

+0

Cảm ơn bạn đã làm rõ @Tom. Tôi đoán tôi giả định rằng vấn đề hẹn giờ có thể được giải quyết với một khoảng thời gian yên tĩnh cho A để đảm bảo rằng B được kích hoạt. –

2

Có một số lỗi mở trong Jenkins liên quan đến tham chiếu dự án và trật tự xây dựng sai lầm. Xem this bug (or this one). Xem nhận xét về cách giải quyết có thể có.

2

Nếu bạn chuyển sang Apache Ivy cho quản lý phụ thuộc của bạn, bạn có thể có một kích hoạt, bất cứ khi nào bạn xuất bản một phiên bản mới của B (sử dụng Jenkins Ivy Plugin), giả sử rằng A là tùy thuộc vào latest.integration (hoặc tương tự) phiên bản B.

Điều này sẽ không ngăn chặn A xây dựng dựa trên phiên bản cũ của B, nhưng ít nhất nó sẽ tự động xây dựng lại khi B kết thúc.

Ngoài ra, hãy xem xét các thiết lập lên post receive hooks-trigger Jenkins, và thêm một quiet period đến A. Sau đó, khi bạn đẩy những thay đổi đến A và B, cả A và B sẽ được kích hoạt ngay lập tức, nhưng A sẽ chờ đợi một thời gian ngắn trước khi xây dựng. Khi giai đoạn yên tĩnh của A hết hạn, tùy chọn Block build when upstream project is building có thể được sử dụng để buộc nó phải đợi cho đến khi B hoàn tất.

Cuối cùng, khi bạn đã sử dụng Ivy một thời gian, có thể bạn sẽ đến cùng một kết luận như nhiều người khác: bạn không muốn A tùy thuộc vào số latest.integration của B mà là phiên bản cụ thể thay thế. Nó cho phép xây dựng xác định và đơn giản hóa việc thiết lập công việc CI (chỉ xây dựng A khi mã của nó (bao gồm phiên bản B nó phụ thuộc vào) thay đổi), nhưng bạn cần tự mình thực hiện điều đó, theo thời gian của bạn.

BTW mặc dù Ivy rất tập trung vào Java, tôi đã sử dụng nó rất thành công trên các dự án không phải java; không được cất cánh.