巡航控制在检查SVN修改时卡住了。

5
自从将Cruisecontrol构建服务器迁移到新机器后,它在构建周期的“modificationset”阶段(配置为每15分钟检查修改)有时会挂起。Cruisecontrol本身保持响应,只是构建没有进展。
当发生这种情况时,CPU上没有显着的负载,并且我见过它在这种状态下停留了一个小时或更长时间,尽管它最终似乎会退出这种状态。没有模式表明它发生在哪些项目中。硬件是全新的,我已经运行了memtest,没有问题。
以下是系统配置:
- Ubuntu 9.04服务器,amd64,完全升级 - svn版本1.5.4(r33841)- apt-get将安装最新版本 - Sun JRE 64位构建1.6.0_16-b01-同样是最新版本 - CruiseControl 2.7.3(不是最新版本)
以下是我的modificationsets的样子
<modificationset quietperiod="10">
    <veto><!-- there are several of these -->
        <triggers>
            <svn LocalWorkingCopy="${checkout_dir}/base" />
        </triggers>
        <buildstatus logdir="${log_dir}/base" />
    </veto>
    <timebuild time="2330" />
    <svn LocalWorkingCopy="${checkout_dir}/${project.name}" />
</modificationset>

那么在这里可以做什么呢?

编辑:这是来自cruisecontrol日志文件的一段摘录,显示projectA在16:07挂起(现在仍然挂起在17:48)。

2009-10-27 16:07:55,096 [Thread-38860] INFO  Project          - Project projectA:  bootstrapping
2009-10-27 16:07:55,096 [Thread-38860] INFO  ProjectController - projectA Controller: build progress event: bootstrapping
2009-10-27 16:07:55,262 [Thread-38862] INFO  ScriptRunner     - Buildfile: work/build-cruisecontrol.xml
2009-10-27 16:07:59,230 [Thread-38860] INFO  AntBootstrapper  - Bootstrap successful.
2009-10-27 16:07:59,230 [Thread-38860] INFO  Project          - Project projectA:  checking for modifications
2009-10-27 16:07:59,230 [Thread-38860] INFO  ProjectController - projectA Controller: build progress event: checking for modifications
2009-10-27 16:11:14,954 [Project projectB thread] INFO  Project          - Project projectB:  in build queue
3个回答

2

另一个想法。您可以始终以调试模式启动CruiseControl JVM。每当它挂起时,使用某些IDE(例如Eclipse)连接到它。然后,您可以查看CC应用程序的所有线程,并暂停其中一些线程以查看它们正在忙于什么。


好主意,一定会尝试的。 - Michael Borgwardt

1
你尝试过从命令行手动执行相同的SVN命令吗?那时它会挂起吗?

它在CruiseControl中也不会一再挂起,只是有时候,并且不总是相同的项目。 - Michael Borgwardt
无论如何,您是否在手动运行时遇到了相同的问题?即使只有一次?如果是这样,那么CruiseControl在这里不是问题。否则,可能与SvnModificationSet(或类似的类)有关。 - Grzegorz Oledzki
@GrzegorzOledzki:尝试手动方法的加一。是排除故障的好的起点。 - Critical Skill
问题是:由于问题偶尔发生,当它在命令行中没有发生时,它告诉我“没有任何信息” - 可能只是巧合。此外,我不知道确切的命令行等效物是什么。“svn log”,我猜测。我刚刚尝试了大约50次,没有出现问题。 - Michael Borgwardt
看起来像是带有一些参数的“svn log”。您可以通过捕获以下日志行来跟踪正在发出的确切命令:http://cruisecontrol.svn.sourceforge.net/viewvc/cruisecontrol/trunk/cruisecontrol/main/src/net/sourceforge/cruisecontrol/sourcecontrols/SVN.java?view=markup#l_294(在SVN.class中的LOG.error(“执行svn log命令时出错”+ command,e);) - Grzegorz Oledzki
检查CC实际运行的命令最简单的方法是窥视/proc/$PID/cmdline - Grzegorz Oledzki

1

以下是一些指针:

  1. 它是否在某个特定时间挂起?还是真的很随机?有没有新的备份放置,关闭了备份服务?

  2. 您是否将新的巡航服务器的config.xml与旧的进行了比较(假设两者的巡航版本相同,它们是否具有完全相同的任务或是否有某些可能会减慢modificationset任务的内容)?

  3. 旧机器和新机器是否与您的子版本库位于同一网络上(或者至少在访问所有项目存储库时是否具有类似的响应时间?)鉴于巡航服务器本身仍然响应,可能正在接近挂起的时间点访问的特定项目存储库太大、太慢或存储库中有太多的操作?

这些只是故障排除的指针 - 因此它们绝不是您问题的实际答案。这也许是我解决问题的方法(除了像GrzegorzOledzki的回答那样手动运行命令)。


似乎没有发生在特定的时间。巡航控制版本和配置完全相同,新机器与旧机器在同一网络上,但不同于仓库(由不同部门集中管理)。 - Michael Borgwardt
更新:我现在成功地在CC挂起的项目中运行了一个命令行svn查询,所以这绝对不是服务器上的一个经常性问题。 - Michael Borgwardt
也许你需要针对项目依赖项而不是项目工作区本身运行它(因为你使用了<veto>插件)。由于<veto>会立即中止/继续构建,如果触发器的反馈可用于任何一种方式,也许可以合理地怀疑它正在等待来自项目依赖项的反馈? - Critical Skill

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