【问题标题】:How do I automatically svn merge when automated tests pass?自动化测试通过后如何自动 svn merge?
【发布时间】:2011-01-06 19:34:35
【问题描述】:

每次提交到“主干”后,我们会自动针对主干运行一系列测试。当这些测试通过时,我希望自动合并到一个名为“测试通过”的分支中。当测试失败时,不应该发生合并,但是一旦问题在下一次或以后的提交时在“主干”上得到修复,所有的更改都应该被合并。

关键是要有一个与trunk具有相同内容的分支,但这比'trunk'更理智一点,因为至少自动化测试已经通过了。

我有一个脚本尝试手动执行此操作,但它是使用自定义属性的 hack,它并不总是正常工作 - 正如我刚刚发现的那样。我怎样才能最好地让 Subversion 做到这一点?

【问题讨论】:

  • 您打算如何处理合并冲突?
  • 我认为不应该有任何合并冲突:'tests-passed' 总是与 'trunk' 具有相同的内容,除非'trunk' 上的 HEAD 没有通过测试,其中如果它与上次测试通过时的“主干”内容相同。

标签: svn testing build merge


【解决方案1】:

只要您确定新的主干修订版<somerev> 已通过测试,就在测试通过的工作副本的根目录下运行这些命令:

svn update
svn merge http://example.com/svn/myproject/trunk -r 0:<somerev>
svn commit -m "merged trunk revisions up to <somerev> into tests-passed"

每当您使用合并命令时,SVN 都会将合并记录在svn:mergeinfo 属性中。所以上面的命令应该自动确定0:&lt;somerev&gt;范围内的哪些修订符合合并条件,不包括任何已经完成的合并。

正如您在评论中所说,预计不会发生冲突。但有时我看到在合并一系列包含重命名的 SVN 修订时会发生意外冲突。要消除这些冲突,您可以在合并命令中使用--accept theirs-full 选项来始终接受主干状态。

【讨论】:

  • 啊,“自动确定哪些修订......符合条件”很酷,我不知道。我想我必须以某种方式自己解析出来,这听起来很难看。你建议我如何找到?我试过'svnversion trunk',还是需要+1?
  • @Johannes:不需要 +1。例如,如果最新的成功构建是针对修订版 100,您可以合并 -r 0:100
【解决方案2】:

您可以为此使用持续集成工具。一个很受欢迎的:哈德逊

http://hudson-ci.org/

您可以在那里编写这种行为的脚本。

【讨论】:

  • 再次,我的问题是关于它的 svn 部分,而不是调度或脚本部分。除非 Hudson 有一些我不知道的 svn 魔法? (我们这里的设置确实使用 Hudson 来运行构建和测试以响应“主干”上的签入)
【解决方案3】:

我会想象使用测试套件来做到这一点。

根据我的经验,我会运行一个 ANT 脚本来测试我的代码,如果测试成功,我会使用最终条件来执行分支。

【讨论】:

  • 我们确实使用 ant 运行测试,并且正如您所说,我们有一个最终条件。问题是:如何让 svn 根据该条件进行正确的合并?
  • 你们是否在每个新代码中都遵循 Name_spacing。 (code_ versioning) 在这种情况下可能会有所帮助。
  • 我需要进一步研究 ANT 脚本,但解决方法可能是设置一个 ant 脚本来定期分支你的代码,比如每 2、5 或 30 分钟一次,前提是它通过你所有的测试。缺点是不是立即整合,而是 2、5 或 30 分钟整合。也许重新评估您的要求并开发替代解决方案?
  • 我不想在“主干”上的每次提交时都创建一个新分支。这对那些“测试通过”的开发人员来说是非常具有破坏性的。相反,我希望有一个分支发生合并,但只有在测试通过时。
猜你喜欢
  • 2014-07-18
  • 2015-03-30
  • 1970-01-01
  • 2020-10-19
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
相关资源
最近更新 更多