CruiseControl.NET 1.8.5 - 不创建msbuild-results xml文件

时间:2015-03-24 09:15:35

标签: msbuild nunit cruisecontrol.net specflow

我很擅长构建服务器,但我的雇主已要求我做一些测试(因为F5不是构建过程,因为Jeff Atwood的优秀文章说)。在这个阶段,我正在努力在CruiseControl.NET服务器上启动并运行一些示例构建和测试报告。到目前为止,我已经进行了构建和运行(配置文件需要在添加新的构建/项目之前进行一些整理,但概念验证存在)但是报告引起了一些令人头疼的问题。

我正在寻找的主要报告是针对NUnit测试和SpecFlow集成测试。测试运行正常(因为我正在生成一个看起来很合理的xml文件),我希望将其合并到主构建结果中,以便我可以显示NUnit / SpecFlowtests的结果。

每当构建完成时,消息中会报告以下内容(在ViewFarmReport.aspx中):"失败的任务:XmlLogPublisher"

这与Windows应用程序日志(source - CC.Net)中报告的以下错误相结合

  

2015-03-24 08:36:52,987 [Initech.SuperCrm-DEV] ERROR CruiseControl.NET [(null)] - 发布者抛出异常:ThoughtWorks.CruiseControl.Core.CruiseControlException:无法读取文件内容:C:\ CCNet \ BuildArtifacts \ Initech.SuperCrm-DEV \ msbuild-results-7c657954-2c3e-405f-b0f1-7da1299788fd.xml ---> System.IO.FileNotFoundException:找不到文件' C:\ CCNet \ BuildArtifacts \ Initech.SuperCrm-DEV \ msbuild-results-7c657954-2c3e-405f-b0f1-7da1299788fd.xml'。

(公司/申请名称"审查")

这让我怀疑在msbuild结果中合并失败(我相信CruiseControl.NET自版本1.5或1.6后自动擦除?)阻止了NUnit结果的合并。

BuildArtifacts文件夹中没有msbuild-results文件,这并不让我感到惊讶,因为我不相信我当前的msbuild配置允许基于xml的日志记录,因为我正在使用ThoughtWorks.CruiseControl.MsBuild.dll记录器。

根据CruiseControl.NET的在线文档,有支持XML的自定义记录器:ThoughtWorks.CruiseControl.MsBuild.XmlLogger可以使用,但是此记录器的下载位置:here

似乎不再存在。

任何人都可以说我是否正在思考这里的正确路线以及我的选择是什么?

供参考,这是我的完整配置:

<cruisecontrol xmlns:cb="urn:ccnet.config.builder">

    <cb:define MSBuildPath="C:\Windows\Microsoft.NET\Framework\v4.0.30319" />
    <cb:define WorkingBaseDir="C:\CCNet\Builds" />
    <cb:define ArtifactBaseDir="C:\CCNet\BuildArtifacts" />
    <cb:define MSBuildLogger="C:\Program Files (x86)\CruiseControl.NET\server

\ThoughtWorks.CruiseControl.MsBuild.dll" />
    <cb:define NUnitExe="C:\Jenkins\Nunit\nunit-console.exe" />

    <cb:define name="vsts_ci">
        <executable>C:\Jenkins\tf.exe</executable>
        <server>http://tfs-srv:8080/tfs/LEEDS/</server>
        <domain>CONTOSO</domain>
        <autoGetSource>true</autoGetSource>
        <cleanCopy>true</cleanCopy>
        <force>true</force>
        <deleteWorkspace>true</deleteWorkspace>
    </cb:define>



    <project name="Initech.Libraries" description="Shared libraries used in all Initech projects" 

queue="Q1">
        <state type="state" directory="C:\CCNet\State"/>
        <artifactDirectory>$(ArtifactBaseDir)\Initech.Libraries</artifactDirectory>
        <workingDirectory>$(WorkingBaseDir)\Initech.Libraries</workingDirectory>

        <triggers>
        <intervalTrigger
            name="continuous"
            seconds="30"
            buildCondition="IfModificationExists"
            initialSeconds="5"/>
        </triggers>

        <sourcecontrol type="vsts">
            <cb:vsts_ci/>
            <workspace>CCNET_Initech.Libraries</workspace>
            <project>$/InitechLibraries/Initech.Libraries</project>
        </sourcecontrol>
    </project>

  <project name="Initech.SuperCrm-DEV" description="Initech.SuperCrm Application, Development 

Version" queue="Q1">

    <cb:define ArtifactDirectory="$(ArtifactBaseDir)\Initech.SuperCrm-DEV" />
    <cb:define WorkingDirectory="$(WorkingBaseDir)\Initech.SuperCrm-DEV" />
    <cb:define OutputDirectory="$(WorkingDirectory)\Initech.SuperCrm\bin\Debug" />
    <cb:define ProjectFile="Initech.SuperCrm.sln" />
    <cb:define NUnitLog="$(WorkingDirectory)\NunitResults.xml" />

    <state type="state" directory="C:\CCNet\State"/>
    <artifactDirectory>$(ArtifactDirectory)</artifactDirectory>
    <workingDirectory>$(WorkingDirectory)</workingDirectory>

    <triggers>
      <!-- check the source control every X time for changes, 
         and run the tasks if changes are found -->
      <intervalTrigger
               name="continuous"
               seconds="30"
               buildCondition="IfModificationExists"
               initialSeconds="5"/>
    </triggers>

    <sourcecontrol type="vsts">
        <cb:vsts_ci/>
        <workspace>CCNET_Initech.SuperCrm-DEV</workspace>
        <project>$/InitechSuperCrm/SuperCrm/Initech.SuperCrm-DEV</project>
    </sourcecontrol>

    <tasks>
        <exec>
            <executable>C:\Program Files (x86)\DXperience 12.1\Tools\DXperience

\ProjectConverter-console.exe</executable>
            <buildArgs>$(WorkingDirectory)</buildArgs>
        </exec>

        <msbuild>           
            <executable>$(MSBuildPath)\MSBuild.exe</executable>
            <workingDirectory>$(WorkingDirectory)</workingDirectory>
            <projectFile>$(ProjectFile)</projectFile>   
            <timeout>900</timeout>
            <logger>$(MSBuildLogger)</logger>
        </msbuild>

        <exec>
            <executable>$(NUnitExe)</executable>
            <buildArgs>/xml=$(NUnitLog) /nologo $(WorkingDirectory)\$(ProjectFile)

</buildArgs>
        </exec>
    </tasks>

    <publishers>
        <buildpublisher>
            <sourceDir>$(OutputDirectory)</sourceDir>
            <useLabelSubDirectory>true</useLabelSubDirectory>
            <alwaysPublish>false</alwaysPublish>
            <cleanPublishDirPriorToCopy>true</cleanPublishDirPriorToCopy>
        </buildpublisher>

        <merge>
            <files>
              <file>$(NUnitLog)</file>
            </files>
        </merge>

      <xmllogger logDir="C:\CCNet\BuildArtifacts\Initech.SuperCrm-DEV\buildlogs" />

      <artifactcleanup cleanUpMethod="KeepLastXBuilds"
                       cleanUpValue="50" />
    </publishers>

  </project>

</cruisecontrol>

我在试图解决这个问题时一直在撕扯我的头发,而且我没有多少开始,所以任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

经过长时间的撞击墙壁后,我似乎终于找到了解决方案(井解决方案)。

1)Kobush.Build.dll(https://www.nuget.org/packages/Kobush.Build/)可以用作MSBuild的记录器。查看CruiseControl.NET文档中的属性,它似乎是由同一个开发人员编写的(但已扩展)。

2)由于msbuild-report输出的默认位置,需要进行一些调整。因为,默认情况下,它被转储到buildartifacts文件夹,因此很容易被过早删除。

我不再在复制之前(在buildpublisher中)清理发布目录,并在清除工件之前执行发布者的merge和xmllogger部分。

因此,我现在将msbuild和nunit输出/结果集成到主构建日志中,这些可以通过CruiseControl.NET仪表板使用。

可能有一种更整洁的处理方法,但目前我只是在进行概念验证。