【问题标题】:CruiseControl.NET 1.8.5 - Not creating msbuild-results xml fileCruiseControl.NET 1.8.5 - 不创建 msbuild-results xml 文件
【发布时间】:2015-03-24 09:15:34
【问题描述】:

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

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

每当构建完成时,都会在消息中报告以下内容(在 ViewFarmReport.aspx 中):“Failing Tasks : XmlLogPublisher”

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

2015-03-24 08:36:52,987 [Initech.SuperCrm-DEV] 错误 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>

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

【问题讨论】:

    标签: msbuild nunit cruisecontrol.net specflow


    【解决方案1】:

    经过长时间的头撞墙,我似乎终于找到了解决方案(很好的解决方案)。

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

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

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

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

    可能有一种更简洁的方法来处理这个问题,但目前我只是在进行概念验证。

    【讨论】:

    • 我鼓励你把 CC.NET 想象成一个“超级花哨的 msbuild.exe 执行器”…………写一个 mysolution.proj 文件,然后把 msbuild 代码放进去文件…………把这个文件和你的 .sln 文件放在同一个目录下。让 CC.NET 拉取这个文件(使用您的源代码控制任务进行选择)......然后运行 ​​msbuild.exe “mysolution.proj”......这样......你正在最大限度地减少 cc.net 的数量您使用的专有任务。
    猜你喜欢
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    相关资源
    最近更新 更多