构建失败 - 在TFS2008上的VS2010解决方案

9
我已将一个VS2008 ASP.NET MVC解决方案迁移到了VS2010/MVC2/.NET 4.0。该解决方案在本地构建成功,并且所有单元测试都通过了。
我们的TFS服务器仍然是TFS2008,我在尝试使CI构建通过时遇到了问题。
所有项目都可以成功构建,所有单元测试都可以运行并通过,但“Running Tests”项失败了。
我按照这篇博客文章中的步骤进行了操作,现在已经接近成功了。
在查找失败原因的日志文件中,我发现了以下内容:
Test Run Completed.
Passed  1101
------------
Total   1101   
Results file:  C:\Documents and Settings\apptemetrybuild\Local Settings\Temp\Client Portal 3\CI\TestResults\apptemetrybuild_ATT15DEV01 2010-04-27 09_09_59_Any CPU_Release.trx
Test Settings: Default Test Settings
Waiting to publish...   
Publishing results of test run apptemetrybuild@ATT15DEV01 2010-04-27 09:09:59_Any CPU_Release to http://att15tfs01:8080/...
.....Publish completed successfully.   
Command:
D:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\MSTest.exe /nologo /searchpathroot:"C:\Documents and Settings\apptemetrybuild\Local Settings\Temp\Client Portal 3\CI\Binaries\Release" /resultsfileroot:"C:\Documents and Settings\apptemetrybuild\Local Settings\Temp\Client Portal 3\CI\TestResults" /testcontainer:"C:\Documents and Settings\apptemetrybuild\Local Settings\Temp\Client Portal 3\CI\Binaries\Release\\Attenda.Stargate.Security.Tests.dll" /publish:"http://att15tfs01:8080/" /publishbuild:"vstfs:///Build/Build/149" /teamproject:"Client Portal 3" /platform:"Any CPU" /flavor:"Release"
The "TestToolsTask" task is using "MSTest.exe" from "D:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\MSTest.exe".   
Loading C:\Documents and Settings\apptemetrybuild\Local Settings\Temp\Client Portal 3\CI\Binaries\Release\\Attenda.Stargate.Security.Tests.dll... 
C:\Documents and Settings\apptemetrybuild\Local Settings\Temp\Client Portal 3\CI\Binaries\Release\\Attenda.Stargate.Security.Tests.dll 
Could not load file or assembly 'file:///C:\Documents and Settings\apptemetrybuild\Local Settings\Temp\Client Portal 3\CI\Binaries\Release\Attenda.Stargate.Security.Tests.dll' or one of its dependencies. This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded. MSBUILD : warning MSB6006: "MSTest.exe" exited with code 1. [C:\Documents and Settings\apptemetrybuild\Local Settings\Temp\Client Portal 3\CI\BuildType\TFSBuild.proj]   
The previous error was converted to a warning because the task was called with ContinueOnError=true.   
Build continuing because "ContinueOnError" on the task "TestToolsTask" is set to "true". 
Done executing task "TestToolsTask" -- FAILED.

看起来它似乎在尝试使用2008 MSTest工具,即使我已经在tfsbuild.proj中指定了ToolsVersion="4.0"并在构建服务器上更改了TfsBuildService.exe.config中的MSBuildPath。

有人能指点我如何成功构建吗?

非常感谢, Nick

编辑:添加tfsbuild.proj文件

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="DesktopBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
  <!-- Do not edit this -->
  <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TeamBuild\Microsoft.TeamFoundation.Build.targets" />
  <ProjectExtensions>
    <!-- Team Foundation Build Version - DO NOT CHANGE -->
    <ProjectFileVersion>3</ProjectFileVersion>
    <Description></Description>
    <BuildMachine>ATT15DEV01</BuildMachine>
  </ProjectExtensions>

  <PropertyGroup>
    <TeamProject>Client Portal 3</TeamProject>
    <BuildDirectoryPath>C:\Documents and Settings\nfoster\Local Settings\Temp\Client Portal 3\CI</BuildDirectoryPath>
    <DropLocation>\\att15dev01\Builds\Client Portal 3</DropLocation>
    <RunTest>true</RunTest>
    <RunCodeAnalysis>Never</RunCodeAnalysis>
    <WorkItemType>Bug</WorkItemType>
    <WorkItemFieldValues>System.Description=Start the build using Team Build</WorkItemFieldValues>
    <WorkItemTitle>Build failure in build:</WorkItemTitle>
    <DescriptionText>This work item was created by Team Build on a build failure.</DescriptionText>
    <BuildlogText>The build log file is at:</BuildlogText>
    <ErrorWarningLogText>The errors/warnings log file is at:</ErrorWarningLogText>
    <UpdateAssociatedWorkItems>true</UpdateAssociatedWorkItems>
    <AdditionalVCOverrides></AdditionalVCOverrides>
    <CustomPropertiesForClean></CustomPropertiesForClean>
    <CustomPropertiesForBuild></CustomPropertiesForBuild>
  </PropertyGroup>

  <ItemGroup>
    <!--  SOLUTIONS  -->
    <SolutionToBuild Include="$(BuildProjectFolderPath)/../../Trunk/Client Portal 3 CI Build.sln">
        <Targets></Targets>
        <Properties></Properties>
    </SolutionToBuild>
  </ItemGroup>

  <ItemGroup>
    <!--  CONFIGURATIONS  -->
    <ConfigurationToBuild Include="Release|Any CPU">
        <FlavorToBuild>Release</FlavorToBuild>
        <PlatformToBuild>Any CPU</PlatformToBuild>
    </ConfigurationToBuild>
  </ItemGroup>

  <ItemGroup>
    <!--  TEST ARGUMENTS  -->
    <TestContainer Include="$(OutDir)\%2aTests.dll" />
  </ItemGroup>

  <PropertyGroup>
    <!-- TEST ARGUMENTS  -->
    <TestToolsTaskToolPath>C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe</TestToolsTaskToolPath>
  </PropertyGroup>

  <ItemGroup>
    <!--  ADDITIONAL REFERENCE PATH  -->
  </ItemGroup>

  <Target Name="AfterTest">
    <GetBuildProperties TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
                        BuildUri="$(BuildUri)"
                        Condition=" '$(IsDesktopBuild)' != 'true' ">
      <Output TaskParameter="TestSuccess" PropertyName="TestSuccess"/>
    </GetBuildProperties>
    <SetBuildProperties TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
                        BuildUri="$(BuildUri)"
                        CompilationStatus="Failed"
                        Condition=" '$(IsDesktopBuild)' != 'true' and '$(TestSuccess)' != 'true' ">
    </SetBuildProperties>
  </Target>

</Project>
2个回答

2

您需要打开位于"C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\TeamBuild\Microsoft.TeamFoundation.Build.targets"的配置文件,

然后删除以下两个条目:

<UsingTask TaskName="Microsoft.TeamFoundation.Build.Tasks.TestToolsTask"...

并且

<UsingTaskTaskName="TestToolsTask"...

并添加以下条目(将替换以前的条目并强制使用MSTest v10.0):

<UsingTaskTaskName="Microsoft.TeamFoundation.Build.Tasks.TestToolsTask"
       AssemblyFile="C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\Microsoft.TeamFoundation.Build.ProcessComponents.dll"
        Condition=" '$(ProjectFileVersion)' == '2' />

这对我很有帮助。
谢谢。

固定条目应该如下所示:<UsingTask TaskName="Microsoft.TeamFoundation.Build.Tasks.TestToolsTask" AssemblyFile="C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\Microsoft.TeamFoundation.Build.ProcessComponents.dll" Condition="'$(ProjectFileVersion)' == '2'" /> - isNaN1247
这似乎是错误,但有没有更好的修复方法?这看起来有点极端。 - paulio

1

我认为您需要在CI服务器上安装正确版本的MSTest才能使其正常工作。

如果您已经安装了正确版本的MSTest,请确保测试项目引用了 Microsoft.VisualStudio.QualityTools.UnitTestFramework v10.0.0.0

要确定MSTest路径,TestToolsTask任务:

  • 检查测试项目引用的Microsoft.VisualStudio.QualityTools.UnitTestFramework程序集的版本
  • 通过在HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\$(VERSION).0注册表中查找匹配版本的Visual Studio的InstallDir。如果该键不存在,则会使用默认版本(tfs2008的9.0)的路径。

因此,如果您的测试项目引用版本10,并安装了Visual Studio 2010,则应自动调用MSTest。


如果您已经安装了TeamBuild 3版(文件路径为C:\Program Files\MSBuild\Microsoft\VisualStudio\TeamBuild\Microsoft.TeamFoundation.Build.targets,属性为TeamBuildVersion设置为3),那么您可以覆盖任务TestToolsTask的MSBuild属性TestToolsTaskToolPath到新版本的MSTest。
<PropertyGroup>
  <TestToolsTaskToolPath>C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe</TestToolsTaskToolPath>
</PropertyGroup>

您还需要检查您的 tfsbuild.proj 文件中的 ProjectFileVersion 属性是否大于 2。

<ProjectExtensions>
  ...
  <ProjectFileVersion>3</ProjectFileVersion>
  ...
</ProjectExtensions>

好的,这个要添加到哪个项目文件中呢?大部分谷歌搜索结果都是中文 :( 我已经更新了我的问题,并附上了我的tfsbuild.proj文件内容...非常感谢你迄今为止的帮助。 - Nick
只需在您的tfsbuild.proj文件中添加我回答中定义的PropertyGroup即可。(http://msdn.microsoft.com/en-us/library/aa337598%28v=VS.80%29.aspx) - Julien Hoarau
好的,这次我想我明白了。您还需要修改tfsbuild.proj中定义的ProjectFileVersion为3。 - Julien Hoarau
抱歉回复晚了,昨天我不在办公室。所有项目引用和 web.config 引用都指向单元测试框架的 v10 版本。我真的不太了解 msbuild,无法弄清为什么它仍然尝试使用 v9 :( - Nick
只是一个想法,这些引用应该是GAC中的程序集吗?开发机是x64但构建服务器只有x86,这会有什么影响吗?程序集的路径将不同(“c:\program files (x86)"而不是只有“c:\program files”)。 - Nick
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接