2013-10-30 46 views
4

我有一個存儲在Git中的Maven 3多模塊項目(〜50個模塊)。多個開發人員正在研究這個代碼並構建它,而且我們也有自動構建機器,可以在每次推動時運行冷建模。在Maven中使用緩存的構件以避免重複構建?

大多數個人更新日誌會在很少的模塊中更改代碼,因此,每次更改都會重建整個源代碼樹,這是浪費時間。但是,我仍然希望運行父項目構建的最終結果與構建完整代碼庫的結果相同。我不想開始手動版本化模塊,因爲這將成爲交叉版本更新的惡夢。

我想要做的是添加一個攔截構建或安裝中的某個步驟的插件,並接受模塊內容(理想情況下從Git拉出)的散列,然後查看共享二進制存儲庫中存儲的工件那個散列。如果找到一個,它會使用該工件,甚至不執行完整的構建。如果它在緩存中找不到任何東西,它會像平常一樣執行構建,然後將其構件存儲在緩存中。重建任何具有依賴關係(直接或瞬態)的模塊本身也有一個緩存未命中的情況也是很好的。

有什麼東西可以做到這樣的事嗎?如果不是,將其添加到Maven的最簡潔的方法是什麼?看起來插件可能能夠完成它,但是對於一些作品我很難找到正確的方式來附加到Maven。特別是:

  1. 如何攔截「安裝」目標來檢查緩存,並且只調用緩存未命中模塊的「本機」安裝目標?
  2. 插件應該如何將狀態從一個模塊傳遞到另一個模塊,以瞭解哪些緩存未命中發生,以便強制重建依賴關係並進行更改?

我也接受完全不同的方式來達到同樣的最終結果(更少的冗餘構建),儘管解決方案越激進,對我來說近期價值就越低。

+1

你在使用詹金斯嗎?你可以將jenkins配置爲僅使用'mvn -am -amd -pl module clean install'使用本地存儲庫構建maven支持的已更改模塊(稱爲增量構建),這將顯着縮短構建時間。 – khmarbaise

+0

不幸的是沒有。我們使用的是Bamboo,我相信無論是它還是我們的腳本都會導致本地存儲庫對於每個構建都是空的。 – enroth

+0

如果您的腳本清理本地存儲庫,則必須使用完整的版本,否則您可能會更改該版本。根據文檔,竹不支持從UI等增量構建,但你可以在Maven的命令行和一些腳本上做到這一點。可能它已經足夠用一個乾淨的構建而不是每個構建'mvn -pl module -amd package'構建每晚。您當然可以使用存儲庫管理器來存儲這些工件,並讓maven完成工作。 – khmarbaise

回答

0

詹金斯插件允許你管理/最小化依賴建立

  • 每當快照依賴建(Maven的決定)
  • 後,其他項目都建(通過詹金斯作業手動)

如果您執行'mvn deploy'將構建內容保存到公司的Maven回購站中,那麼當構建在從屬Jenkins機器上運行時,您不必擔心依賴關係。其結果是,除非它或它的某個依賴關係發生了變化,否則不會構建任何模塊。

希望您可以將這些原則應用於Bamboo的解決方案。

1

我以前實現了一個更復雜的解決方案,將工件版本操作和部署到私有Maven存儲庫。不過,我認爲這將滿足您的需求更好,是較爲簡單:

  1. (使用maven -pl參數例如,每個模塊一個單一的編譯)劃分構建成多個版本。
  2. 設置這些構建之間的父子關係。 (Bamboo甚至有額外的支持來找出Maven依賴關係,但我不確定它是如何工作的。)
  3. 將Maven settings.xml配置爲使用不同的本地存儲庫位置 - 在構建工作目錄中指定一個新目錄。見文檔:https://maven.apache.org/guides/mini/guide-configuring-maven.html
  4. 使用mvn install目標是確保新建文物被添加到本地存儲庫
  5. 用竹神器共享揭露從本地存儲庫內置的文物 - 你應該過濾此只包括包()你」再有興趣在
  6. 設置相關的構建下載從父生成所有的文物,放到本地存儲庫中的適當的子目錄(定製有在工作目錄)

這甚至應該有工作的分支建立的感謝以竹處理親子關係的方式s分支構建。

請注意,這意味着Maven會重新下載所有其他依賴項,因此您應該在本地網絡上使用代理專用Maven存儲庫,如Artifactory或Nexus。

如果需要,我還可以描述我已經實現的更復雜的場景,包括修改工件版本和部署到專用Maven存儲庫。

相關問題