【问题标题】:CC.NET: Multiple MSBuild-Tasks within a single projectCC.NET:单个项目中的多个 MSBuild 任务
【发布时间】:2015-03-04 07:26:44
【问题描述】:

在 CruiseControl.NET 1.8.4 中,我正在运行具有多个 MsBuild 任务的单个项目。项目配置的简短摘录,由 CCValidator 解析和验证:

<tasks>
  <msbuild>
    <buildArgs>msbuild-base.xml /m /p:BuildInParallel="true";Configuration="Release";Platform="Any CPU";nr="false";ccversionbase=15.1.0;NuGetProjectDir=D:\REPO\Repo-Base /verbosity:minimal /nologo /target:PreBuild</buildArgs>
    <dynamicValues />
    <environment />
    <executable>C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe</executable>
    <logger>"C:\Program Files (x86)\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MSBuild.dll"</logger>
    <loggerParameters />
    <priority>Normal</priority>
    <timeout>120</timeout>
    <workingDirectory>D:\BaseLibraries</workingDirectory>
  </msbuild>
  <msbuild>
    <buildArgs>msbuild-other.xml /m /p:BuildInParallel="true";Configuration="Release";Platform="Any CPU";nr="false";ccversionbase=15.1.0;revfile=D:\REPO\Repo-Base\ci-revision.xml /verbosity:minimal /nologo /target:CIFull</buildArgs>
    <dynamicValues />
    <environment />
    <executable>C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe</executable>
    <logger>"C:\Program Files (x86)\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MSBuild.dll"</logger>
    <loggerParameters />
    <priority>Normal</priority>
    <timeout>120</timeout>
    <workingDirectory>D:\BaseLibraries</workingDirectory>
  </msbuild>
</tasks>

还有很多任务,但这应该足以解释问题。所有任务都有不同的 msbuild 文件,并且不是同一文件中的目标。

要成功运行项目,前几个任务必须成功完成。因此,当任务失败时,CC.NET 停止构建是完美的。但是如果后面的某个任务失败了,我想让 CC.NET 继续下一个任务,而不是停止整个构建。

如何配置 CC.NET 以忽略失败的任务并继续下一个任务?

【问题讨论】:

    标签: msbuild cruisecontrol.net


    【解决方案1】:

    如果您将可能始终运行的任务放在发布者部分, 无论失败与否,它们都会被运行。

    如果订单类似于: MayNotFail, MayFail, MayFail, MayNotFail

    对于那种情况,我无法立即想到解决方案

    【讨论】:

    • 基本上,这会有所帮助 - 如果订单不是问题。我找到了使用附加 MsBuild-Script 的解决方案。我只是在这里记录解决方案。
    【解决方案2】:

    CruiseControl.NET 在其中一项任务失败时让构建停止并失败。我希望在触发所有任务的情况下完成构建,即使一项任务失败。奖励:如果一个失败,我希望构建状态为“失败”,但不会在第一个失败事件时停止。

    所以我将所有非关键(“可选”)任务放入一个额外的 MsBuild-Script 中:

    <Project DefaultTargets="CIFull" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    
        <PropertyGroup>
            <MsBuildAgent>"C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe"</MsBuildAgent>
            <MsBuildArguments>msbuild.xml /m /p:BuildInParallel="true";Configuration="Release";Platform="Any CPU";nr="false";ccversionbase=$(ccversionbase);revfile=$(revfile);buildplans=$(buildplans) /verbosity:minimal /nologo /target:CIFull /nr:false</MsBuildArguments>
        </PropertyGroup>
    
        <Target Name="Libraries">
            <Exec Command="$(MsBuildAgent) $(MsBuildArguments)" WorkingDirectory="$(buildplans)\MyLibraryOne" IgnoreExitCode="false" ContinueOnError="true">
                <Output TaskParameter="ExitCode" PropertyName="LibExitCode01" />
            </Exec>
            <Exec Command="$(MsBuildAgent) $(MsBuildArguments)" WorkingDirectory="$(buildplans)\MyLibraryTwo" IgnoreExitCode="false" ContinueOnError="true">
                <Output TaskParameter="ExitCode" PropertyName="LibExitCode02" />
            </Exec>
            <Exec Command="$(MsBuildAgent) $(MsBuildArguments)" WorkingDirectory="$(buildplans)\MyLibraryThree" IgnoreExitCode="false" ContinueOnError="true">
                <Output TaskParameter="ExitCode" PropertyName="LibExitCode03" />
            </Exec>
        </Target>
    
        <Target Name="Applications">
            <Exec Command="$(MsBuildAgent) $(MsBuildArguments)" WorkingDirectory="$(buildplans)\ApplicationOne" IgnoreExitCode="false" ContinueOnError="true">
                <Output TaskParameter="ExitCode" PropertyName="AppExitCode01" />
            </Exec>
            <Exec Command="$(MsBuildAgent) $(MsBuildArguments)" WorkingDirectory="$(buildplans)\ApplicationTwo" IgnoreExitCode="false" ContinueOnError="true">
                <Output TaskParameter="ExitCode" PropertyName="AppExitCode02" />
            </Exec>
            <Exec Command="$(MsBuildAgent) $(MsBuildArguments)" WorkingDirectory="$(buildplans)\ApplicationThree" IgnoreExitCode="false" ContinueOnError="true">
                <Output TaskParameter="ExitCode" PropertyName="AppExitCode03" />
            </Exec>
        </Target>
    
        <Target Name="ValidateExitCodes">
            <ItemGroup>
                <Failed Condition="$(LibExitCode01) != 0" Include="MyLibraryOne" />
                <Failed Condition="$(LibExitCode02) != 0" Include="MyLibraryTwo" />
                <Failed Condition="$(LibExitCode03) != 0" Include="MyLibraryThree" />
                <Failed Condition="$(AppExitCode01) != 0" Include="ApplicationOne" />
                <Failed Condition="$(AppExitCode02) != 0" Include="ApplicationTwo" />
                <Failed Condition="$(AppExitCode03) != 0" Include="ApplicationThree" />
            </ItemGroup>
            <ItemGroup>
                <Success Condition="$(LibExitCode01) == 0" Include="MyLibraryOne" />
                <Success Condition="$(LibExitCode02) == 0" Include="MyLibraryTwo" />
                <Success Condition="$(LibExitCode03) == 0" Include="MyLibraryThree" />
                <Success Condition="$(AppExitCode01) == 0" Include="ApplicationOne" />
                <Success Condition="$(AppExitCode02) == 0" Include="ApplicationTwo" />
                <Success Condition="$(AppExitCode03) == 0" Include="ApplicationThree" />
            </ItemGroup>
            <Message Importance="High" Text="*** Success: @(Success->Count()) (@(Success, ' '))" />
            <Message Importance="High" Text="*** Failed:  @(Failed->Count()) (@(Failed, ' '))" />
            <Error Text="*** FAILED: @(Failed, ' ') ***" Condition="'@(Failed->Count())' > 0" />
        </Target>
    
        <Target Name="CIFull" DependsOnTargets="Libraries;Applications;ValidateExitCodes" />
    
    </Project>
    

    现在不是将每个“可选”库和应用程序作为任务添加到 CC.NET 项目中,而是在上面的 MsBuild 文件中列出。 CC.NET配置修改如下:

    <tasks>
      <msbuild>
        <!-- When this task fails, the build shall stop and fail -->
        <buildArgs>msbuild-base.xml /m /p:BuildInParallel="true";Configuration="Release";Platform="Any CPU";nr="false";ccversionbase=15.1.0;NuGetProjectDir=D:\REPO\Repo-Base /verbosity:minimal /nologo /target:PreBuild</buildArgs>
        <dynamicValues />
        <environment />
        <executable>C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe</executable>
        <logger>"C:\Program Files (x86)\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MSBuild.dll"</logger>
        <loggerParameters />
        <priority>Normal</priority>
        <timeout>120</timeout>
        <workingDirectory>D:\BaseLibraries</workingDirectory>
      </msbuild>
      <msbuild>
        <!-- This task is the new build file from above. -->
        <buildArgs>msbuild-new.xml /m /p:BuildInParallel="true";Configuration="Release";Platform="Any CPU";nr="false";ccversionbase=15.1.0;revfile=D:\REPO\Repo-Base\ci-revision.xml;buildplans=D:\Meta\BuildPlans /verbosity:minimal /nologo /target:CIFull</buildArgs>
        <dynamicValues />
        <environment />
        <executable>C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe</executable>
        <logger>"C:\Program Files (x86)\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MSBuild.dll"</logger>
        <loggerParameters />
        <priority>Normal</priority>
        <timeout>120</timeout>
        <workingDirectory>D:\Meta</workingDirectory>
      </msbuild>
    </tasks>
    

    CC.NET 首先执行第一个任务。如果失败,则不执行其他任务并报告错误。可以吗,CC.NET 继续第二个任务。

    现在,所有库和应用程序都在构建 - 忽略(但保存)返回值(目标 LibrariesApplications)。目标ValidateExitCodes 现在创建一个成功和失败任务的列表 - 在所有任务都运行之后。如果失败任务列表包含一个元素,则会向 CC.NET 返回错误。 CC.NET 会将构建状态设置为错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 2017-09-15
      相关资源
      最近更新 更多