CC.NET:单个项目中有多个MSBuild任务

CC.NET:单个项目中有多个MSBuild任务,msbuild,cruisecontrol.net,Msbuild,Cruisecontrol.net,在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

在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-base.xml/m/p:BuildInParallel=“true”;Configuration=“Release”;平台=“任何CPU”;nr=“假”;ccversionbase=15.1.0;NuGetProjectDir=D:\REPO\REPO Base/verbosity:minimal/nologo/target:PreBuild
C:\ProgramFiles(x86)\MSBuild\12.0\Bin\MSBuild.exe
“C:\ProgramFiles(x86)\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MSBuild.dll”
正常的
120
D:\BaseLibraries
msbuild-other.xml/m/p:BuildInParallel=“true”;Configuration=“Release”;平台=“任何CPU”;nr=“假”;ccversionbase=15.1.0;revfile=D:\REPO\REPO Base\ci-revision.xml/verbosity:minimal/nologo/target:CIFull
C:\ProgramFiles(x86)\MSBuild\12.0\Bin\MSBuild.exe
“C:\ProgramFiles(x86)\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MSBuild.dll”
正常的
120
D:\BaseLibraries
还有很多任务,但这足以解释问题。所有任务都具有不同的msbuild文件,并且不是同一文件中的目标

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


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

如果您将可能始终运行的任务放在“发布者”部分, 不管它们是否失败,它们都将被运行

如果顺序类似于: 可能不会失败,可能会失败,可能会失败,可能不会失败


对于这种情况,我无法立即想到解决方案,让我们停止构建并在其中一个任务失败时失败。我希望在触发所有任务的情况下完成构建,即使一个任务失败。奖励:如果一个失败了,我希望构建状态为“失败”,但在第一次失败事件时不停止

因此,我将所有非关键(“可选”)任务放在一个额外的MsBuild脚本中:

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

“C:\ProgramFiles(x86)\MSBuild\12.0\Bin\MSBuild.exe”
msbuild.xml/m/p:BuildInParallel=“true”;Configuration=“Release”;平台=“任何CPU”;nr=“假”;ccversionbase=$(ccversionbase);revfile=$(revfile);buildplans=$(buildplans)/详细程度:最小/nologo/target:CIFull/nr:false
不再将每个“可选”库和应用程序作为任务添加到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>

msbuild-base.xml/m/p:BuildInParallel=“true”;Configuration=“Release”;平台=“任何CPU”;nr=“假”;ccversionbase=15.1.0;NuGetProjectDir=D:\REPO\REPO Base/verbosity:minimal/nologo/target:PreBuild
C:\ProgramFiles(x86)\MSBuild\12.0\Bin\MSBuild.exe
“C:\ProgramFiles(x86)\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MSBuild.dll”
正常的
120
D:\BaseLibraries
msbuild-new.xml/m/p:BuildInParallel=“true”;Configuration=“Release”;平台=“任何CPU”;nr=“假”;ccversionbase=15.1.0;revfile=D:\REPO\REPO Base\ci-revision.xml;buildplans=D:\Meta\buildplans/verbosity:minimal/nologo/target:CIFull
C:\ProgramFiles(x86)\MSBuild\12.0\Bin\MSBuild.exe
“C:\ProgramFiles(x86)\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MSBuild.dll”
正常的
120
D:\Meta
CC.NET首先执行第一项任务。如果失败,则不会执行其他任务并报告错误。如果可以,CC.NET继续执行第二项任务


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

基本上,如果顺序没有问题,这会有所帮助。我找到了一个使用附加MsBuild脚本的解决方案。我将在这里记录解决方案。