代码之家  ›  专栏  ›  技术社区  ›  Jacob

在CruiseControl.NET中使用项目依赖项生成订单

  •  5
  • Jacob  · 技术社区  · 15 年前

    以下是我正在做的:

    1. 所有内容都在同一生成队列中。我这样做是为了按顺序完成构建,从而避免需要多个工作目录。
    2. 我为项目设置了队列优先级,我认为这会影响它们的构建顺序。但是在更仔细地阅读文档之后,我发现当队列中有多个构建请求时,它只控制优先级。

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

    您使用哪些实践来正确管理CruiseControl.NET服务器上的相互依赖关系?在这一点上,我不愿意改为像TeamCity这样的非免费持续集成包。

    3 回复  |  直到 15 年前
        1
  •  9
  •   The Matt    15 年前

    <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>
    

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

        2
  •  2
  •   Andrew Siemer    15 年前

    我建议您不要将CruiseControl项目的概念与VisualStudio项目混为一谈!我通常会建立一个包含一系列工作的CC项目。对我来说,这意味着CC项目将运行NAnt脚本。NAnt脚本对我做什么和什么时候做有非常细粒度的控制。这意味着我可以构建我的解决方案(它知道首先构建哪个项目!),运行我的单元测试,重置数据库,部署一些代码,发送一些电子邮件,进行一些代码分析(NDepend和NCover都很好!),等等。这意味着我在CCTray中显示了一个项目,这使事情更加真实。然后,我可以在CC中创建一个新项目来控制何时从开发人员推送到暂存,以及从暂存推到产品,这样我们就可以“按下”这个任务。但这只产生了3个巡航控制项目,而且更加方便用户。

        3
  •  2
  •   Igor Brejc    15 年前

    虽然您已经接受了一个答案,但我建议您做一些其他的事情:您不应该在两个项目之间有直接的依赖关系。我所说的“直接”是指每当项目A中的二进制文件发生更改时,这并不意味着您自动使用它们来构建项目B。

    更新这些引用的过程应该(由您)控制,否则您将不可避免地导致项目B的大量构建失败。

    解放党 源代码管理下的目录(和子目录),并仅在我决定这样做时更新它们。“外部”指的是第三方库和我公司其他项目的库(例如: http://code.google.com/p/projectpilot/source/browse/#svn/trunk/lib )