2012-08-22 22 views
11

Chúng tôi sẽ sử dụng Ivy với Ant, và chúng tôi sẽ có Jenkins làm các bản dựng của chúng tôi. Ban đầu tôi nghĩ rằng có Jenkins làm một <ivy:cleancache/> trước khi chạy một xây dựng sẽ là một ý tưởng tốt. (Nó sẽ là một phần của mục tiêu "sạch" bắt buộc).Ivy, Ant, Jenkins - Có phải là một ý tưởng hay đối với <ivy: cleancache> trên Jenkins không?

Tuy nhiên, bây giờ tôi thấy rằng <ivy:cleancache> không chỉ đơn giản là xóa nội dung từ <ivy:cachepath>, nhưng thực sự xóa toàn bộ thư mục $HOME/.ivy/cache.

Mối quan tâm của tôi là nếu Jenkins thực hiện <ivy:cleancache> trên tất cả các bản dựng trước khi chúng bắt đầu, nó sẽ can thiệp vào các bản dựng khác mà Jenkins có thể thực thi.

Làm một ý tưởng hay, đặc biệt nếu một người dùng có thể đang thực hiện nhiều bản dựng cùng một lúc?

Thực tế, điều gì sẽ xảy ra khi bạn thực hiện <ivy:cachepath pathid="compile.path"/> trong nhiều dự án? Điều này cũng ảnh hưởng đến một cái gì đó như Jenkins? Liệu Jenkins có bị lẫn lộn nếu nhiều bản dựng đang xây dựng compile.cachepath cùng một lúc không?

Trả lời

7

Theo quan điểm của tôi, việc chạy ivy cleancache với mọi công trình là quá mức cần thiết và không sử dụng một trong những lợi ích chính của việc sử dụng ivy, tải xuống phụ thuộc của bên thứ ba thông minh.

Có nói rằng như đã nêu trong liên quan câu hỏi Maven sau, tất cả các bộ nhớ đệm có thể bị bẩn và cần được thanh lọc định kỳ:

When is it safe to delete the local Maven repository?

Couple các khuyến nghị:

Sử dụng chuyên dụng Jenkins công việc (s) để tẩy bộ nhớ cache ivy

Đề xuất đầu tiên của tôi là tạo một công việc Jenkins định kỳ gọi các mục tiêu sạch sau đây trong tòa nhà của bạn:

<target name="clean-all" depends="clean"> 
    <ivy:cleancache/> 
</target> 

này đảm bảo rằng Jenkins quyết định khi bộ nhớ cache được thanh lọc và bạn có thể lên lịch nó xảy ra ngoài việc xây dựng lần bình thường (ví dụ 02:00 vào ngày 1 hàng tháng)

Cô lập từng dự án bằng cách sử dụng nhiều bộ nhớ đệm

Đề xuất thứ hai của tôi làm tăng sự cách ly giữa các dự án của bạn. Định cấu hình từng dự án để có bộ nhớ cache riêng tư, sử dụng chỉ thị caches. trong tập tin cài đặt ivy.

+0

Cảm ơn. Làm sạch bộ nhớ cache chỉ thêm khoảng 90 giây để xây dựng (chúng tôi có kho lưu trữ Maven của công ty địa phương). Nó không ảnh hưởng đến khái niệm _CI_, vì vậy nó sẽ không thực sự gây tổn thương cho Jenkins để bắt đầu mỗi build w/một cache sạch. Các nhà phát triển có thể tắt bằng cách thiết lập ivy.cleancache thành false. Trớ trêu thay, bộ nhớ cache làm sạch kích thích các nhà phát triển bởi vì nó kéo dài việc xây dựng, nhưng nó không ảnh hưởng đến chúng. Jenkins không quan tâm, nhưng nếu Jenkins đang chạy nhiều công việc, nó có thể là một vấn đề. –

3

Đây là những gì tôi đã quyết định làm:

Tôi đã sửa đổi tập tin ivysettings.xml tôi để có những điều sau đây:

<ivysettings> 
    <properties environment="env." override="false"/> 
    <caches 
     defaultCacheDir="${ivy.default.ivy.user.dir}/cache-${env.EXECUTOR_NUMBER}" 
     resolutionCacheDir="${ivy.dir}/../target/ivy.cache"/> 
    <settings defaultResolver="default"/> 
    <include file="${ivy.dir}/ivysettings-public.xml"/> 
    <include url="${ivy.default.settings.dir}/ivysettings-shared.xml"/> 
    <include url="${ivy.default.settings.dir}/ivysettings-local.xml"/> 
    <include url="${ivy.default.settings.dir}/ivysettings-main-chain.xml"/> 
    <include url="${ivy.default.settings.dir}/ivysettings-default-chain.xml"/> 
</ivysettings> 

này hai điều:

  • Nó định nghĩa các Bộ nhớ cache cục bộ của Ivy là $HOME/.ivy/cache-$EXECUTOR_NUMBER trong đó $EXECUTOR_NUMBER là trình xử lý Jenkins. Điều này có nghĩa là mỗi người thực thi đều có bộ nhớ cache Ivy của riêng họ. Vì vậy, nếu Jenkins đang thực hiện nhiều hơn một công việc tại một thời điểm, mỗi công việc sẽ được chọn với một người thi hành khác, vì vậy nó sẽ có bộ nhớ cache riêng của nó. Nếu một công việc muốn làm sạch bộ nhớ cache, nó có thể đi ngay phía trước.
  • Tôi đã xác định bộ nhớ cache giải quyết thành ${basedir}/target/ivy.cache. Điều này mang lại cho mỗi công việc bộ đệm giải quyết riêng của nó khá nhỏ. Tuy nhiên, cách giải quyết ivy này không can thiệp vào các công việc khác nếu Jenkins đang xây dựng nhiều bản sửa đổi của cùng một dự án Ivy.

Hạn chế duy nhất là thư mục bộ nhớ cache mặc định của người dùng được gọi là $HOME/.ivy/cache-$env.EXECUTOR_NUMBER không phải là trang web đẹp. Tôi muốn làm cho nó hợp lý hơn $HOME/.ivy/cache-0, nhưng tôi đã không tìm ra điều đó. Tuy nhiên, nó không thực sự ảnh hưởng đến bất cứ điều gì vào thời điểm này.

Bây giờ, một nhà phát triển có một bộ nhớ cache Ivy đơn chứa tất cả các lọ họ đã tải xuống. Bằng cách này, các lọ có thể được chia sẻ giữa các dự án giúp tăng tốc độ cho các nhà phát triển.

Trong khi đó, Jenkins có thể xóa bộ đệm Ivy thường xuyên như được cấu hình. Điều này có thể được thực hiện cho mỗi công việc, hoặc một lần mỗi ngày, hoặc mỗi tháng. Tuy nhiên, vì bộ nhớ đệm được thực hiện cho mỗi người thực hiện, tôi sẽ không có vấn đề về bộ đệm được làm sạch trong khi một công việc khác (đang chạy trên một trình thực thi khác) phụ thuộc vào bộ đệm đó.

Điều này sẽ giải quyết tất cả các vấn đề cụ thể. Điều duy nhất tôi muốn làm là tìm ra cách đặt biến EXECUTOR_NUMBER mặc định nếu biến chưa được đặt. Tôi đã thử những thứ khác nhau như thế này:

<ivysettings> 
    <property name="env.EXECUTOR_NUMBER" value="0" override="false"/> 
    <properties environment="env." override="false"/> 
    <caches 
     defaultCacheDir="${ivy.default.ivy.user.dir}/cache-${env.EXECUTOR_NUMBER}" 
     resolutionCacheDir="${ivy.dir}/../target/ivy.cache"/> 
    <settings defaultResolver="default"/> 
    <include file="${ivy.dir}/ivysettings-public.xml"/> 
    <include url="${ivy.default.settings.dir}/ivysettings-shared.xml"/> 
    <include url="${ivy.default.settings.dir}/ivysettings-local.xml"/> 
    <include url="${ivy.default.settings.dir}/ivysettings-main-chain.xml"/> 
    <include url="${ivy.default.settings.dir}/ivysettings-default-chain.xml"/> 
</ivysettings> 

Nhưng, vô ích. Tôi đã trued thay đổi các thông số override trên cả hai <property><properties> tập tin tất cả các cách khác nhau, nhưng nó không hoàn toàn làm những gì tôi muốn.

2

Chỉ là điều tôi đã làm rất nhiều để giải quyết vấn đề cuối cùng mà bạn có.

Bạn có thể thêm video này vào các thuộc tính của Jenkins Ant Build bước

another.less.obtrusive.name=${EXECUTOR_NUMBER} 

và thêm vào ivysettings.xml.

Vì vậy, nó sẽ là "0" cho tất cả mọi người, ngoại trừ Jenkins vì nó sẽ tiêm thuộc tính này vào ANT.

Có gì đó trên câu hỏi chính: Trên Jenkins, tôi luôn bắt đầu mới. CI xây dựng nên được mạnh mẽ, kỹ lưỡng. Nhanh là sản phẩm phụ được chào đón, nhưng không phải là động lực.

+1

Ý tưởng hay. Những gì tôi đã làm là đặt nó trong 'ivy.tasks.xml' mà mọi người đều phải nhập. Tôi làm một ' sau đó ngay sau đó' . Sau đó, tôi làm nhiệm vụ ''. Tuy nhiên, chúng tôi phải nhập môi trường vì tôi yêu cầu các nhà phát triển của chúng tôi nhúng thông tin xây dựng Jenkins vào các lọ, chiến tranh và tai. –

+0

Mất nhiều thời gian hơn tôi quan tâm - tên biến 'EXECUTOR' được liệt kê trong câu trả lời này là sai chính tả. Phải là $ {EXECUTOR_NUMBER} –

Các vấn đề liên quan