2011-10-21 11 views
6

問題描述如何防止在Maven倉庫發佈的工件(非快照版本)的覆蓋哈德森

考慮這樣的情況行家被哈德森使用。

現在有人拿出了一個項目的結帳,修改了一些文件,但意外地使用了相同的工件ID和版本號(非快照)。

然後,他/她在哈德森上建立這個項目,並做了maven install.The修改後的工件現在在哈德森.m2。任何依賴它的其他項目都將使用修改後的工件進行構建。沒有人發現這一點,如果編譯沒有失敗。即使正確的工件駐留在中央存儲庫中,它也不會被使用,因爲在哈德森開始構建時,修改的工件是從.m2中拾取的。

所以我正在尋找一種方法來防止這種意外的人爲錯誤。

  1. 無論如何,撤銷在哈德遜的非快照版本(發佈的工件)上的Maven安裝權限?
  2. 任何方式比較hdson和遠程中央存儲庫中.m2的校驗和,以便校驗和失敗可以產生警告或失敗構建?

我已經檢查過無法強制更新中央存儲庫的非快照版本,因爲它們是不可變的。

清除中央存儲庫或爲哈德遜上的每個作業使用單獨的存儲庫將分別導致磁盤空間使用量增加構建時間&。

任何幫助,將不勝感激。

回答

1

有解決這個沒有直接的方法,但我們解決了這個inderctly寫它運行每隔五分鐘,並標記所有的一個cron作業只有在Hundson的本地存儲庫中才能讀取的不是SNAPSHOT的罐子。通過這種方式,當Hudson中的某個項目試圖覆蓋它時,我的mvn安裝或mvn部署會失敗,因爲它們是隻讀的。

任何新的文物都可以很容易地寫出來。一旦在接下來的五分鐘內寫入,腳本將它們標記爲只讀。

這裏是UNIX腳本代碼permission-handler.sh

#!/bin/bash 
cd ~/.m2 
date 2>&1>> permission-handler.out 
find . -name '*jar' -type f | grep -v 'SNAPSHOT' | xargs chmod -vc 444 2>&1>> permission-handler.out 
chmod 777 permission-handler.out 

記錄也被處理,看看哪些文物都已經被標記爲只發布。

1

我不認爲你會找到一種方法來停止安裝覆蓋工件。存儲庫服務器應該有一個設置,以防止部署更新的發行版工件。例如,請參閱Nexus的"How do I disable artifact redeployment"

+1

我已經在artifactory中處理了部署權限。但是這並沒有幫助,因爲如果.m2存儲庫中存在被覆蓋的工件,並且在hudson maven上構建了依賴項目,則始終會從.m2而不是存儲庫服務器中選擇工件。沒有辦法強制下載hudson中的工件或驗證天氣.m2工件與存儲庫服務器同步。 – Aman

1

這裏是我們如何管理我們的項目版本:

我們在SNAPSHOT版本。在Jenkins上,我們有一個Fast Build構建和測試此應用程序的作業,但如果版本爲而不是 a SNAPSHOT則失敗。這是通過custom enforcer(這與require release version enforcer相反)完成的。

當我們想發佈時,我們使用Jenkins作業。使用parameterized buildMaven release plugin,負責發佈的人員將僅指示版本的版本(穩定版本),下一個SNAPSHOT版本以及SCM標籤的名稱。因此,只有Jenkins會定義一個穩定版本,開發人員將始終使用SNAPSHOT代碼。

但是,當然,這並不妨礙開發人員在他的本地機器上製作他想要的東西。但我們總是考慮一個值得信賴的地方:詹金斯服務器。它的工作原理在我的機器是不是一個好答案的一個問題上; O)

0

這可以通過配置你的Maven倉庫(例如Nexus,Artifactory)來避免覆蓋發佈倉庫來解決。在Nexus中,我們有一個SNAPSHOT和一個用於發佈的回購。 SNAPSHOT repo允許覆蓋。但發佈回購不允許覆蓋。這僅僅是Nexus針對該回購的一個簡單的複選框功能。一旦發佈版本被放入回購,它不能被覆蓋。工作得很好。