gpt4 book ai didi

Mercurial:自动标记构建

转载 作者:行者123 更新时间:2023-12-02 03:49:41 24 4
gpt4 key购买 nike

在 mercurial 设置中,我想根据持续集成脚本自动标记某些构建。例如,每当部署分支构建时,诸如 branchName-buildId 之类的标记,或者每当构建通过所有集成测试时,latest-stable

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

  • 一些标签可能是重复的 - 即 latest-stable。在这种情况下,我真的不在乎哪个构建被标记,但我不希望出现任何冲突,因为脚本无法解决这些冲突。
  • 标签导致提交。然而,这意味着这些提交需要被推送,并且它们需要在面对人类和其他脚本的并发推送时保持健壮。特别是自动推送会产生额外的头,这是不好的。但是当检测到额外的头时(在推送时)本地标签提交已经发生,即使新的头很可能是微不足道的 merge ,有时标签会导致冲突。

我怎样才能让 CI 服务器自动标记一个构建?在这里更重要的是最终结果是一致的(即它不会弄乱 CI 服务器或 repo),并且在面对重复或冲突时可靠地应用标签不太重要(无论如何这应该不太可能).

最佳答案

我认为你保持谨慎是对的。机器人并不总是最好的公民,而且经常会做一些愚蠢的事情。

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

Some tags may be duplicate - i.e. latest-stable. I don't really care which build gets tagged in this situation, but I don't want any conflicts because a script can't resolve those.

如果已经定义了一个标签,并且您再次调用 hg tag,除非您强制执行它,否则它将失败,但这样做的目的是添加一个更新的、稍后对同一标签的定义,并且最新的获胜。一方面这很好,因为 merge 很简单,但考虑一下您这样做的情况:

hg update -r latest-stable
hg update -r latest-stable
hg update -r latest-stable
hg update -r 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

Tags cause commits. However, this means that those commits need to be pushed and they need to be robust in the face of concurrent pushes by humans and other scripts. In particular, the automatic push can create additional heads, which is Not Good. But by the time the additional head is detected (at push) the local tag commit has already happened, and even though the new heads are likely trivially mergeable, sometimes tags cause conflicts.

CI 机器人应该标签;拉; merge (如有必要);推。如果 merge 失败,不要推送,发出警报。如果推送失败(即 merge 所需的时间内有更多变更集),请再次拉取并 merge 。我只是确保您的脚本非常明确地说明了它正在 merge 的修订。这个过程应该不会让你有多余的头脑。

我相信 Mercurial 以不同的方式处理 .hgtags 文件以进行 merge ,因为它知道内容,所以冲突应该很少见。此外,标记提交通常很容易 merge ,因为所有更改都是 .hgtags,因此来自 CI 头的 merge 永远不会冲突。唯一可能的原因是因为其他人正在使用与 CI 服务器相同的标签名称,如果他们这样做,那么他们需要在键盘上浇上蜂蜜,这样他们才能造成更多的破坏。

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

希望其中的一些内容对您有所帮助。

关于Mercurial:自动标记构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14937799/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com