32

我的團隊正在使用功能分支來實現新功能,並不斷將快照構建部署到遠程回購中供我們的用戶使用。因此'部署'實際上只意味着'分發到遠程Maven倉庫'。我們目前只爲master分支運行持續集成構建,而不是基於以下原因:我們使用Maven構建項目並將JavaDoc和源代碼與JAR一起分發。如何使用Maven連續構建和部署功能分支?

我的計劃是現在的分類添加到每個功能分支建立並期待一個創建和部署像這樣的文物時使用:

  • 科:主
  • 分類:無
  • 工件:foo-${version}的.jar,foo-${version}-sources的.jar,foo-${version}-javadoc.jar

  • 科:功能-X

  • 分類:我的功能
  • 文物:foo-${version}-feature.jarfoo-${version}-sources-feature.jarfoo-${version}-javadoc-feature.jar

我真的不關心的神器確切的命名,我只需要一個特性分支獨立的主,來源及文物的JavaDoc 。事實證明,JavaDoc插件和源代碼插件都不考慮配置的分類器,因此可以有效地覆蓋爲我的主版本創建的工件。

我真的不想改變artifactId,雖然這可能會解決問題。你如何處理特性分支並與Maven持續集成?

+0

topoc分支的靜態程度如何?你期望多久設定一份新工作,多久他們會被淘汰?你在CI服務器中用什麼來幫助你?這是阻止我思考這樣一個構建的事情之一。也許網守模型或開發人員本地CI服務器更適合。 – eckes 2012-07-10 12:52:32

+1

你不應該使用分類器來反映分支的差異,因爲你會對其他插件產生不好的副作用。 分類器應該是來源,javadocs等...... 爲了您的需要,您應該更改artifactId或版本。 – Farid 2012-07-10 12:54:54

+1

@eckes - 我們使用Bamboo,它支持根據分支名稱上的正則表達式自動觸發基於不同分支的構建作業。只要它檢測到與該表達式匹配的分支,如果通常指示這樣做,它幾乎可以克隆構建作業。 – 2012-07-10 14:06:06

回答

8

我會建議將branch-qualifier添加到版本組件中,因爲它與該部分更相關。這也允許您在主分支旁邊的這些版本的快照依賴關係。

+7

雖然這看起來是一種很好的方法,但在使用版本號範圍(f.e.用於持續集成)時會導致問題。看到我的答案。 – 2015-02-19 08:48:01

9

我會建議使用它代表了分支以及版本之類的適當的版本:

1.0.0快照對於主

1.0.0-F1-快照功能F1

這給予也是一個指標從1.0.0版本新特性分支已經取得進展。

+1

* 1.0.0 **相當於* - *。 * -SNAPSHOT *是Maven的一部分。此外還有什麼問題嗎?根本沒有。 – khmarbaise 2013-04-30 17:08:29

+2

如何指示mercurial或maven在合併回主人時不包含pom版本?我的意思是我不認爲你想在每次合併時手動解決這個問題,對吧? – Asgard 2014-03-08 22:11:14

+0

我們有一個功能分支設置腳本,只創建對版本號進行更改的第一次提交。在合併時,我們簡單地放下這個提交併壓縮併合並這個分支上的所有後續的(或者如果只有第二次提交,就簡單地選櫻桃)。 – 2014-05-09 09:25:06

6

使用版本號來存儲分支名稱,正如其他人所建議的那樣,這是一個快速獲勝,但是如果使用版本範圍會導致問題。版本號並不意味着要這樣使用。我們用它們在連續的一體化進程,使集成測試取決於測試的神器:

[1.8-SNAPSHOT,1.9-SNAPSHOT) 

版本號內的限定部分表示相同的代碼庫的不同的增量階段:

1.8-alpha1-SNAPSHOT 
1.8-alpha1-SNAPSHOT 
1.8-beta1-SNAPSHOT 

這就是爲什麼版本範圍之上將捕獲的上方,Maven會order them in this order

1.8-SNAPSHOT 
1.8-alpha1-SNAPSHOT 
1.8-alpha1-SNAPSHOT 
1.8-beta1-SNAPSHOT 

任何神器攜帶的特性分支版本號(1.8-featureA-SNAPSHOT)中的名稱將比無限定符的快照更新。但功能分支是一個「不同的」代碼庫,而不是相同代碼庫的更新代表。對於我們的集成測試場景,這導致無用的測試失敗。功能分支尚未準備好通過集成測試進行測試。

我們現在遵循這個規則:如果您必須改變某些東西,爲什麼不是神器ID?我們更改了功能分支的工件ID,它工作得很好。

+0

雖然功能分支是「不同的」代碼庫,但它仍然是與主版本相同的項目。似乎應該有一個解決方案,而不是修改工件ID。我沒有一個=(也許Maven版本要麼功能齊全(支持範圍),要麼太不靈活(只支持3個點陣版本abc作爲數字,並且默認爲abcd字符串) – 2015-06-16 20:34:23

+0

FWIW:我要完全功能分支上的不同版本在功能分支上具有'1','2','3','4' ...以及特徵分支上的'featureA-001','featureA-002',...考慮'featureA- SNAPSHOT'也是,但看起來像是一個更復雜的方法 – 2015-06-16 23:15:10

+1

這是事實 - 然而,使用Maven中的版本範圍無論如何都存在各種問題(例如需要堅持Maven的版本號格式),所以我不認爲它們是在實踐中使用很多,如果你從不使用版本範圍,這個問題不適用。 – sleske 2016-02-05 09:09:13

2

您可以使用maven-branch-extension爲每個功能分支有效地創建單獨的SNAPSHOT名稱空間,而不是更改工件的maven座標,而是使用maven-branch-extension。從項目頁面引用:

而不是在功能分支上更改版本號時,我們 更改存儲庫。每個功能都部署到一個子目錄中, 基於其分支名稱,位於僅用於 功能分支的遠程存儲庫中。沒有人工製品被覆蓋的風險。 版本號不會更改。分支和合並與Git保持簡單(就像它的意思!) !

該擴展插件獲取當前Git 分支並解析存儲庫的URL中的屬性,以便可以正確存儲和檢索 工件。它還管理 將工件緩存和提取到本地存儲庫,以便 工件從功能分支存儲庫(如果存在)獲取, 從功能分支工作時獲取。

這樣做的好處在於,SNAPSHOT依賴關係的外部用戶與主題分支的內部工作完全隔離。

相關問題