Mercurial:自动标记构建

时间:2013-02-18 13:44:56

标签: mercurial continuous-integration tagging

在一个多变的设置中,我想基于持续集成脚本自动标记某些构建。例如,只要部署了分支的构建,就会有branchName-buildId之类的标记,或者只要构建通过所有集成测试,就可能latest-stable

但是,我担心简单地调用hg tag的简单方法会导致问题:

  • 某些标签可能重复 - 即latest-stable。在这种情况下,我并不关心哪个版本被标记,但我不想要任何冲突,因为脚本无法解决这些问题。
  • 标签导致提交。但是,这意味着需要推送这些提交,并且在面对人和其他脚本的并发推送时,它们需要是健壮的。特别是,自动推动可以创建额外的头,这是不好的。但是当检测到附加磁头时(推送时),本地标签提交已经发生,即使新磁头可能很容易合并,有时标签也会引起冲突。

如何自动让CI服务器标记构建?更重要的是,最终结果是一致的(即它不会弄乱CI服务器或repo),并且在重复或冲突面前可靠地应用标签并不重要(无论如何这应该是非常不可能的) )。

2 个答案:

答案 0 :(得分:1)

我认为你保持谨慎是正确的。机器人并不总是最好的公民,而且经常做傻事。

您最终要做的事情取决于您所看到的标签的用途。例如,如果您只看到使用它们的CI系统,那么我建议将它们保留在本地。根本没有拉/推/合并问题。

  

某些标签可能重复 - 即最新稳定。在这种情况下,我并不关心哪个版本被标记,但我不想要任何冲突,因为脚本无法解决这些问题。

如果已经定义了一个标记,并且再次调用hg tag,它将失败,除非你强制它,但它的作用是添加一个更新的,稍后定义相同的标记,并且最新的一个获胜。一方面这很好,因为合并很简单,但在你做的时候考虑一​​下这个案例:

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。如果合并失败,请不要按,发出警报。如果推送失败(即合并所花费的时间更多),请再次拉动并合并。我只是确保你的脚本非常清楚它正在合并的修订。这个过程应该让你没有额外的头脑。

我相信Mercurial以不同的方式对待.hgtags文件进行合并,因为它知道内容,因此冲突应该非常少见。此外,标记提交通常很容易合并,因为所有更改都是.hgtags,因此来自CI头的合并不应该发生冲突。唯一的原因是因为其他人使用与CI服务器相同的标签名称,如果他们这样做,那么他们需要将蜂蜜倒在键盘上,这样他们就可以造成更多的伤害。

我可以看到导致问题的情况是,如果您在具有相同标签名称的多个头上进行CI标记。例如开发和发布分支都有CI运行,两者都分配了tests-clean个标签,但是对于不同的修订,然后合并。解决方案是,不要这样做。

希望其中一些有用。

答案 1 :(得分:0)

如果您关心构建历史,那么请考虑为构建过程创建一个命名分支。在Mercurial中,所有分支中的所有标记都在整个存储库中可见。

如果你不关心历史bookmarks应该做的伎俩。构建过程可以在运行测试后设置书签latest-stable,然后执行hg push --bookmark latest-stable将该书签推送到服务器。

无论哪种方式,您都必须注意不要对已经测试过的孩子的修订版进行测试。 Mercurial revsets是非常强大的查询语言,应该有所帮助。