在一个多变的设置中,我想基于持续集成脚本自动标记某些构建。例如,只要部署了分支的构建,就会有branchName-buildId
之类的标记,或者只要构建通过所有集成测试,就可能latest-stable
。
但是,我担心简单地调用hg tag
的简单方法会导致问题:
latest-stable
。在这种情况下,我并不关心哪个版本被标记,但我不想要任何冲突,因为脚本无法解决这些问题。如何自动让CI服务器标记构建?更重要的是,最终结果是一致的(即它不会弄乱CI服务器或repo),并且在重复或冲突面前可靠地应用标签并不重要(无论如何这应该是非常不可能的) )。
答案 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
是非常强大的查询语言,应该有所帮助。