我们能否告诉CruiseControl.NET忽略源代码控制超时错误?

10
我们已经设置了CruiseControl.NET来持续集成我们的许多项目。
我们正在使用<cb:define>块来确保所有的源代码控制操作都以相同的方式完成,并保持配置DRY。
我们偶尔会遇到一个问题,导致构建显示“异常”。消息如下:
ThoughtWorks.CruiseControl.Core.CruiseControlException: Source control operation has timed out. 
    at ThoughtWorks.CruiseControl.Core.Sourcecontrol.ProcessSourceControl.Execute(ProcessInfo processInfo) 
    at ThoughtWorks.CruiseControl.Core.Sourcecontrol.Svn.GetModifications(IIntegrationResult from, IIntegrationResult to) 
    at ThoughtWorks.CruiseControl.Core.Sourcecontrol.QuietPeriod.GetModifications(ISourceControl sourceControl, IIntegrationResult lastBuild, IIntegrationResult thisBuild) 
    at ThoughtWorks.CruiseControl.Core.IntegrationRunner.GetModifications(IIntegrationResult from, IIntegrationResult to) 
    at ThoughtWorks.CruiseControl.Core.IntegrationRunner.Integrate(IntegrationRequest request)

常见的配置部分如下所示:
<sourcecontrol type="svn">
    <trunkUrl>http://ourserver/svn/$(project-svn-path)/trunk/</trunkUrl>
    <executable>C:\Program Files\CollabNet Subversion Server\csvn.exe</executable>
    <username>user</username>
    <password>password<password>
    <revert>true</revert>
</sourcecontrol>

我希望你能忽略这个特定的错误,如果可能的话。你需要做哪些更改呢?

如果您忽略源代码控制超时,那么您就不能可靠地构建最新的修订版本,您的“持续集成”构建也就毫无意义了。 - David M
@David M:这通常发生在SLA窗口期间,当SVN服务器进行维护时会出现这种情况。这并不是一个特殊情况,所以如果问题持续时间不到几个小时,我希望可以忽略它。 - John Gietzen
我们有一个托管在互联网上的svn服务器和不稳定的互联网连接。每次连接中断时,我们都会得到一个失败的构建 - 这对我们来说毫无用处。所以感谢这个问题。 - Greg Woods
3个回答

16

这是我用来防止这些错误影响构建状态的代码块:

<maxSourceControlRetries>5</maxSourceControlRetries>
<stopProjectOnReachingMaxSourceControlRetries>true</stopProjectOnReachingMaxSourceControlRetries>
<sourceControlErrorHandling>ReportOnRetryAmount</sourceControlErrorHandling>
你需要把这些设置放在 <project> 标签的下面,而不是 <sourcecontrol> 的下面。虽然我不确定你是否能忽略 "timed out" 异常,但所有 SVN 异常都将被视为相同。
更新:你可以在CC.NET 文档中了解更多关于这些设置的信息,但让我把相关内容复制一下: maxSourceControlRetries: 在项目进入停止状态之前(当 stopProjectOnReachingMaxSourceControlRetries 设置为 true 时),允许出现的连续源代码控制异常的最大数量。 stopProjectOnReachingMaxSourceControlRetries: 在达到 maxSourceControlRetries 时停止项目或不停止项目。当设置为 true 时,当连续源代码控制错误的数量等于 maxSourceControlRetries 时,将停止项目。 sourceControlErrorHandling: 在出现源代码控制错误(在 GetModifications 过程中)时要采取的操作。以下是可能的值:
- ReportEveryFailure :每次出现错误时运行 publisher 部分。 - ReportOnRetryAmount :仅在达到 maxSourceControlRetries 时运行 publisher 部分,publisher 部分仅运行一次。 - ReportOnEveryRetryAmount :每当达到 maxSourceControlRetries 时运行 publisher 部分。当达到 maxSourceControlRetries 并且 publisher 部分已经运行时,计数器将重置为0。

我会将这个标记为已接受,尽管我没有必要测试它的方法。你能帮我解释一下每个条目吗? - John Gietzen
我已经更新了答案,并添加了一些CC.NET文档。可以这么说,我也曾遇到过SVN超时的问题(通常是在晚上),并且由于此原因,构建状态经常被标记为“异常”。在尝试了这些设置后,我最终选择了我在这里发布的设置,之后就再也没有遇到任何问题了。您可能想要自己尝试这些设置(例如通过增加重试次数)。 - Igor Brejc
我正在使用相同的配置 - 不幸的是,它并没有解决问题。我的网络管理员有一个坏习惯,在随机时间间隔内破坏网络,这会导致所有构建都变成红色,直到有人手动强制构建。 - skolima
2
那么问题不在于CC.NET或SVN...强制重建你的网络管理员 ;) - Igor Brejc

8
你能不能只增加“timeout”值?
<sourcecontrol>
   ...
   <timeout>60000</timeout> <!-- timeout in milliseconds -->
   ...
</sourcecontrol>

通常问题会在夜间发生,可能是服务器真的出了问题,或者像那样的其他原因。 - John Gietzen
4
谢谢。这帮助我解决了问题。虽然我们不得不使用<timeout units="hours">1</timeout>,但你引导我们朝着正确的方向前进。给你一个赞。 - David

0
除了被接受的答案之外,我发现使用URL触发器对我们非常有帮助。
<triggers>
  <urlTrigger url="http://url.to.your.svn.server" />
</triggers>

因此,如果服务器无法访问,CCNet将不会触发构建。这有效地降低了失败的几率。

URI触发器文档链接

更新:在上述措施实施近2个月后,我们从未因svn服务器连接问题而出现过一次错误的失败。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接