0

在我們的開發過程中存在一個「問題」(實際上是一種麻煩,但是一個主要問題)。防止VCS分支之間的版本合併

我們已經建立了一個良好的持續集成 - 部署 - 交付管道;基本上,我們的流程是這樣的:

新開發發生在默認分支(我們使用Mercurial,但git會有同樣的問題);通常我們在那裏只發展一個小小的改進;

一旦提高準備和測試(的東西,通常發生兩次或每週三次,我們的週期是很短),它合併到釋放分支(這實際上代表候選版本),它是在類似生產的環境中再次進行測試,如果它通過了我們所有的測試,它就會被推送到生產環境中。

如果我們需要進行bug修復,我們會在發佈分支上進行修改,我們會對其進行測試,然後將其推送到生產環境。

從每個分支構建一個工件(通常是一個RPM包)當生產中有一個版本時,發佈分支中的非常神器會被提升到我們的公共存儲庫。生產環境沒有分支,因爲我們通常不需要它(當它在發佈分支上的時間很短時,但它不在生產中;代碼不會在無人看管的情況下逗留)。

在這種情況下,對我們來說存在一個小問題。

爲了區分包,我們通常在版本分支上將版本設置爲1,對默認分支上的包設置2。然後我們的CI系統增加了它的內部版本號,所以我們有我們的軟件-1.0-build37 for release和ouroftware-1.0-build902作爲默認。這樣的版本是寫在我們的.spec文件或我們的pom.xml文件(或其他文件的不同軟件,如.gemspec或simila)

每當我們想把某些東西放入候選版本,我們合併默認分支到發佈分支。

那裏會發生什麼? 版本也合併爲。因此,在每次合併之後,我們需要返回包含版本的文件並將舊版本放入其中。我們應該只需要做一次(Mercurial不會嘗試重新合併已經合併的東西),但是每當我們需要從默認的發佈中進行合併時(例如,爲了將在發佈時完成的修復合併到開發分支)問題再次出現。

我想就如何完全防止這個問題提出一些建議; 如何在我的分支機構外設置版本?我有時實際上需要更改它們(例如,我想在發佈時將其從1更改爲2,並且默認情況下從2更改爲3),並且我不想在我們的CI系統中對它們進行硬編碼,我希望某些系統「分支」的範圍之外,這對存儲庫來說是「全局」的。或者我需要像「忽略修改某些文件」。

在許多情況下,我確實需要在我的文件中使用版本;例如,我不能從Maven pom.xml文件或.gemspec中省略版本信息,否則在開發時無法使用。

感謝,

回答

0

嗯,我看到 很多可能的解決方案,或多或少的 「原生」(隨機順序沒有優先級和自己的個人喜好)

  • 除了「Monolitic $ DEVEL分支」,您可以使用「分支每任務」:在這種情況下,帶有(硬編碼)版本信息的文件不會顯示爲可合併文件(TBT!)
  • 分支機構特定版本更改可以b e從分支的(永久)變更集轉移到MQ補丁(因爲結果 - 版本/和文件/跨分支是相同的,因此應用補丁時必須出現永久默認更改)
  • 版本信息的文件不包含硬編碼版本,它們比「數據」更「模板」,實際數據是在構建過程中進行一些預處理的結果(您知道轉換規則並可對其進行編碼)
  • 您可以在開發|部署過程和如果版本信息文件獨特的內部存儲庫,您可以使用招,類似於merging hgtags(特別合併工具僅在回購一些文件 - 在你的情況下,必須internal:local特殊的合併工具)
  • 也許只使用上合併模式將是確定你的,詳細情況請參考Mercurial - Exceptions to internal:local merge-patterns?Default to trunk version for Mercurial merges?和一些額外的注意事項+發現
相關問題