Cruise Control可以在完全下载svn提交之前尝试启动构建

时间:2010-01-27 15:08:27

标签: svn cruisecontrol.net

我有一个应用程序和共享库,带有单独的CC构建触发器(成功的库构建也将触发应用程序的构建),并设置一个队列以确保CC不会尝试构建应用程序,直到图书馆已经完成。

今天早上发生了一件奇怪的事。我正在研究一个缓慢的VPN,并对我的应用程序和共享库进行了一系列更改(这些都是作为单个提交完成的)。 CC首先构建了我的应用程序,但由于无法在共享库中找到两个新类,因此失败了。在此之后,共享库成功构建,然后成功构建了我的应用程序。

在将应用程序的更改下载到构建服务器之后,但在对库的更改到达之前,CC似乎尝试构建。这是可能的,还是我需要到别处寻找原因是什么?

这是我在应用程序的构建日志中遇到的错误:

<error code="CS0246" file="SomeClass.cs" line="###" column="###"><![CDATA[The type or namespace name 'ClassAddedToSharedLibraryInThisCommit' could not be found (are you missing a using directive or an assembly reference?)]]></error>

我的CCnet.config文件的摘录如下:

 <project name="App1" queue="hourly" queuePriority="2">
    <triggers>
      <multiTrigger operator="Or">
        <triggers>
          <projectTrigger project="sharedLib">
            <triggerStatus>Success</triggerStatus>
            <innerTrigger type="intervalTrigger" seconds="30" buildCondition="ForceBuild"/>
          </projectTrigger>
          <filterTrigger startTime="16:00" endTime="7:00">
            <trigger type="intervalTrigger" seconds ="625" />
          </filterTrigger>
        </triggers>
      </multiTrigger>
    </triggers>
   <sourcecontrol type="svn">
      <tagOnSuccess>false</tagOnSuccess>
      <tagBaseUrl>https://servername/...</tagBaseUrl>
      <autoGetSource>true</autoGetSource>
      <executable>c:\program files\subversion\bin\svn.exe</executable>
      <trunkUrl>https://servername/.../App1/...</trunkUrl>
      <workingDirectory>C:\svn\...\App1\...</workingDirectory>
    </sourcecontrol>
    <tasks>
      <msbuild>
        <executable>C:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild.exe</executable>
        <workingDirectory>C:\svn\...\App1\...</workingDirectory>
        <projectFile>App1.sln</projectFile>
        <buildArgs>/p:Configuration=Debug /v:m /m</buildArgs>
        <logger>C:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
        <timeout>1000000</timeout>
      </msbuild>
    </tasks>
  </project>
 <project name="sharedLib" queue="hourly" queuePriority="1">
    <triggers>
      <filterTrigger startTime="16:00" endTime="7:00">
        <trigger type="intervalTrigger" seconds ="350" />
      </filterTrigger>
    </triggers>
    <sourcecontrol type="svn">
      <tagOnSuccess>false</tagOnSuccess>
      <tagBaseUrl>https://servername/...</tagBaseUrl>
      <autoGetSource>true</autoGetSource>
      <executable>c:\program files\subversion\bin\svn.exe</executable>
      <trunkUrl>https://https://servername/.../SharedLib/...</trunkUrl>
      <workingDirectory>C:\svn\...\sharedLib\...</workingDirectory>
    </sourcecontrol>
    <tasks>
      <msbuild>
        <executable>C:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild.exe</executable>
        <workingDirectory>C:\svn\...\sharedLib\...</workingDirectory>
        <projectFile>sharedLib.csproj</projectFile>
        <buildArgs>/p:Configuration=Debug /v:m /m</buildArgs>
        <logger>C:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
        <timeout>1000000</timeout>
      </msbuild>
    </tasks>
  </project>

4 个答案:

答案 0 :(得分:1)

Subversion提交是atomic,所以这不应该是可能的。在签入完成之前,巡航控制不应该看到任何新文件。你必须把责任推到别处。

除非您实际使用两个单独的subversion存储库(可能使用svn:external?)

答案 1 :(得分:0)

我在CC.Net上遇到了类似的问题,但在SVN上却没有。我不熟悉他们的提交工作方式。但是在我的SCM上,CC.Net在服务器中检查了签入过程中的更改并启动了构建,即使其他文件已经签入。

就个人而言,我并不担心,因为这是一场完美的风暴,CC.Net触发器恰好在办理登机手续时被解雇了。在我使用CC.Net近3年的时间里,我说这发生了两次。

答案 2 :(得分:0)

SVN提交是原子的。在全部发布到服务器之前,没有任何东西可以获取您的提交。我认为你看到的是CC.NET中的默认非排队行为。

要防止这种情况,您需要在项目元素上设置queue属性:

<project name="build_shared_library" queue="my-lock-value">...
<project name="build_app" queue="my-lock-value">...

库和应用程序在队列属性中都应具有相同的值。

答案 3 :(得分:0)

我想你在问题中说了这一切:

  

CC首先构建了我的应用程序,但由于无法在共享库中找到两个新类,因此失败了。在此之后,共享库成功构建,然后成功构建了我的应用程序。

CC.NET无法知道您的应用程序的更改取决于对库的更改。您的配置并未说明在构建“App1”项目之前必须构建“sharedLib”项目,它只是说如果它们同时在队列中,则“sharedLib”首先出现。

您可能需要考虑让“sharedLib”项目触发“App1”项目的构建。