在CruiseControl.NET中构建具有项目依赖性的顺序

Jac*_*cob 5 .net cruisecontrol.net continuous-integration

在我们的.NET软件开发商店中,我们设置了CruiseControl.NET来构建28个项目,其中一些是相互依赖的.每个项目大致代表一个Visual Studio项目或Flex库与单元测试配对.我很恼火的是,我没有找到一个好的方法来确保项目按照表示依赖关系的顺序构建.

这就是我在做的事情:

  1. 一切都在同一个构建队列中.我这样做是为了按顺序完成构建,因此我可以避免需要多个工作目录.
  2. 我在项目上设置了队列优先级,我认为这会影响他们的构建顺序.但是在仔细阅读文档之后,我发现它只是在队列中有多个构建请求时控制优先级.
  3. 除了使用区间触发器启动构建之外,我还使用项目触发器,以便在依赖项成功构建时,它们的依赖项也会构建.

在某种程度上,此设置有效.主要问题是如果某人对项目A和项目B中的代码进行了更改,其中项目B依赖于项目A.有时,项目B将在项目A之前构建.因为项目A尚未构建,所以可以有时导致项目B破裂.这是暂时的,因为间隔触发器会导致项目A稍后构建,并且其成功构建会触发项目B重建并得到修复.我想要避免的是在项目A之前建造项目B,以便不会发生中间破坏.

您使用哪些实践来正确管理CruiseControl.NET服务器上的相互依赖性?此时,我不愿意改为像TeamCity这样的非自由持续集成包.

The*_*att 8

不要将依赖项放在CC.NET项目设置中.您需要通过NAnt脚本控制项目构建顺序.您不必在解决方案级别上构建,您可以在单个项目级别上构建.

<target name="Project1" depends="Projects2" description="Builds project 1">
     <msbuild>
        <executable>C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe</executable>
        <workingDirectory>C:\dev\ccnet</workingDirectory>
        <projectFile>CCNet.sln</projectFile>
        <buildArgs>/noconsolelogger /p:Configuration=Debug /v:diag</buildArgs>
        <targets>Build;Test</targets>
        <timeout>900</timeout>
        <logger>C:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
     </msbuild>
</target>

<target name="Project2" depends="Projects3" description="Builds project 2">
     <msbuild>
        <executable>C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe</executable>
        <workingDirectory>C:\dev\ccnet</workingDirectory>
        <projectFile>CCNet.sln</projectFile>
        <buildArgs>/noconsolelogger /p:Configuration=Debug /v:diag</buildArgs>
        <targets>Build;Test</targets>
        <timeout>900</timeout>
        <logger>C:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
     </msbuild>
</target>

<target name="Project3" description="Builds Project 3">
     <msbuild>
            <executable>C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe</executable>
            <workingDirectory>C:\dev\ccnet</workingDirectory>
            <projectFile>CCNet.sln</projectFile>
            <buildArgs>/noconsolelogger /p:Configuration=Debug /v:diag</buildArgs>
            <targets>Build;Test</targets>
            <timeout>900</timeout>
            <logger>C:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
     </msbuild>
</target>
Run Code Online (Sandbox Code Playgroud)

您可以在单个项目级别上运行单元测试,因此您不需要在多个项目上进行重复运行.