2013-02-18 71 views
3

在設置好的mercurial中,我想根據持續集成腳本自動標記某些構建。例如,無論何時構建分支構建,都可以使用branchName-buildId等標記,或者只要構建通過所有集成測試,就可以使用latest-stableMercurial:自動標記構建

但是,我擔心的只是調用hg tag的直接的方法可能會有問題:

  • 有些標籤可能是重複的 - 即latest-stable。我並不關心在這種情況下哪個構建被標記,但我不想要任何衝突,因爲腳本無法解決這些問題。
  • 標籤導致提交。然而,這意味着這些提交需要被推送,並且他們需要在面對人類和其他腳本的同時推送時保持健壯。特別是,自動推動可以創建額外的頭,這是不好的。但是,當檢測到額外的頭部(在推送處)時,本地標籤提交已經發生,並且即使新的頭部可能可以輕易合併,但有時標籤會引起衝突。

我怎樣才能自動讓CI服務器標籤構建穩健?在這裏,最終結果是一致的(即它不會混淆CI服務器或回購)更爲重要,並且重要的是標籤在面對重複或衝突時可靠地應用(這應該不太可能以任何方式)。

回答

1

我認爲你是對的要謹慎。機器人並不總是最好的公民,而且往往可以做一些愚蠢的事情。

你最終做取決於你所看到的正在使用的標籤。例如,如果你只看到CI系統使用它們,那麼我建議讓它們保持本地化。根本沒有拉/推/合併問題。

有些標籤可能是重複的 - 即最新的穩定。我並不關心在這種情況下哪個構建被標記,但我不想要任何衝突,因爲腳本無法解決這些問題。

如果標籤已經被定義了,你再打電話hg tag,它將除非你強迫它失敗了,但這樣做是添加相同標籤的更新,之後的定義,以及最新的1個勝場。一方面,這是好的,因爲合併是簡單的,但想想的情況下,當你做:

hg update -r latest-stable 
hg update -r latest-stable 
hg update -r latest-stable 
hg update -r latest-stable 

每次都會更新到版本標籤製作前,你會得到一個版本(正常),並在該版本latest-stable將指向前latest-stable。結果是,這個命令序列會讓你回到過去。

因此,我認爲最好是在兩次提交中擁有唯一標籤(即stable-2013-02-18)或標籤;一個刪除舊標籤,另一個添加新標籤。

hg update -r latest-stable # You're now at the commit that removed the tag. 
hg update -r latest-stable # This one will error because tag doesn't exist 

標籤原因提交。然而,這意味着這些提交需要被推送,並且他們需要在面對人類和其他腳本的同時推送時保持健壯。特別是,自動推動可以創建額外的頭,這是不好的。但是,當檢測到額外的頭部(在推送處)時,本地標籤提交已經發生,並且即使新的頭部可能可以輕易合併,但有時標籤會引起衝突。

CI機器人應該tag; pull; merge (if necessary); push。如果合併失敗,請不要按下,發出警報。如果推送失敗(即合併花費的時間有更多變更集),請再次進行提取和合並。我只是確保你的腳本對它正在合併的修訂非常明確。這個過程應該讓你沒有額外的頭。

我相信水銀對待.hgtags文件不同的合併,因爲它知道的內容,這樣的衝突應該是非常罕見的。此外,標籤提交通常很容易合併,因爲所有更改都是.hgtags,所以CI頭的合併不應該發生衝突。唯一的原因是因爲其他人使用與CI服務器相同的標籤名稱,如果他們這樣做,那麼他們需要在他們的鍵盤上澆注蜂蜜,以便他們可以做更多的損害。

我可以看到導致問題的情況是,如果你在同一個標​​簽名多頭做CI標記。例如開發和發佈分支都在它們上面運行CI,兩者都分配了tests-clean標籤,但對於不同的修訂版本,稍後進行合併。解決方案是,不要這樣做。

希望其中的一些是有幫助的。

+0

我不能很好地讓他們當地的CI在執行許多建立在並行 - 即有許多CI回購。我想我可以有一箇中間的「緩衝」回購,但這使得推/拉的故事變得更加複雜(例如,他們仍然需要相互合併)。另外,開發人員很清楚哪些變更集是在哪裏生存的 - 而且花費所有這些努力讓基礎架構運行並將其全部納入保護範圍是一件恥辱,但不要走到最後一公里並實際傳達此信息。 – 2013-02-19 10:15:17

+0

當你去'hg update latest-stable'時,mercurial不會看*工作拷貝*標籤,而是看所有頭部標籤的聯合。因此,迭代'hg update latest-stable'命令沒有問題 - 工作正常。 – 2013-02-19 10:57:37

+0

至於合併:.hgtags只是追加,這意味着_every_標籤更改衝突 - 不僅僅是對同一個標籤的更改!所以各種CI建設者會相互衝突;並且如果其他人添加了一個不相關的標籤也會發生衝突。實際上,這意味着每個標籤編輯都需要可序列化,並且全局原子*可以讓微不足道的自動更新工作。 – 2013-02-19 11:09:27

0

如果你關心的建立則只需考慮構建過程創建一個名爲分支歷史。在Mercurial中,所有分支中的所有標籤在整個存儲庫中都可見。

如果你不關心歷史bookmarks應該做的伎倆。生成過程可以在運行測試後設置書籤latest-stable,然後執行hg push --bookmark latest-stable將書籤推送到服務器。

在這兩種方式帶你必須要小心,你不上孩子已經經過了測試版本運行測試。 Mercurial revsets是非常強大的查詢語言,應該有所幫助。

+0

是的,我看了書籤,他們看起來非常有吸引力,除了事實上它們默認是有效的。因此,如果我更新到'latest-stable'並作出提交,我會隱式地移動書籤!這是不好的。我找不到一種方法來禁用這種行爲(除非每次都明確禁用它並說服所有開發人員這樣做,並且從長遠來看,這兩種情況聽起來都不太可行)。 – 2013-02-19 10:51:41

+0

我已經有了用於構建過程的命名分支,這就是CI服務器知道如何部署的地方以及如何測試(例如)的方式。但是關於部署的最終選擇是人爲的,所以並不是每個分支的變更集都會導致部署,只有通過手動驗證的那些部分纔會導致部署,還有那些*我想標記(或書籤或其他)。 – 2013-02-19 10:53:32