用MSBuild和Jenkins搭建持续集成环境(3)

发表于:2012-11-21来源:InfoQ作者:Mustafa Saeed Haji A点击数: 标签:持续集成
Configuration 构建(调试、发布等)时要使用的配置 Platform 编译所用的平台(x86、x64等) 给上面这三个Property赋值用的就是先前定义的Item和Property。OutDir Property用

  Configuration

  构建(调试、发布等)时要使用的配置

  Platform

  编译所用的平台(x86、x64等)

  给上面这三个Property赋值用的就是先前定义的Item和Property。OutDir Property用的是BuildArtifacts目录的全路径。这里用了%(Item.MetaData) 语法。这个语法应该看起来很眼熟吧?就跟访问C#对象属性的语法一样。MSBuild创建出来的任何Item,都提供了某些元数据以供访问,例如FullPath和ModifiedTime。但这些元数据有时候也没啥大用,因为Item不一定是文件。

  Configuration和Platform用到了先前定义好的Property,语法格式是$(PropertyName)。在这里可以看到系统保留的一些属性名,用户不能更改。定义Property的时候请不要用它们。

  这里还有些东西值得提一下。用了Property以后,我们可以在不更改构建脚本的情况下使用不同的Configuration或者BuildPlatform,只要在运行的时候用 /property 传值进去就行。所以“msbuild HelloCI.msbuild /t:Compile /p:Configuration:Debug”这个命令会用Debug配置构建项目,而“msbuild HelloCI.msbuild /t:Compile /p:Configuration:Test;BuildPlatform:x86”会在x86平台下使用Test配置。

  现在运行Compile,就可以编译solution下的两个项目,把编译结果放到BuildArtifacts目录下。在完成构建脚本之前,只剩下最后一个Target了:

  

  

  

  

  

  

  

  

  

  

  ItemGroup里现在又多了三个Item:NUnitConsole指向NUnit控制台运行器(console runner);UnitTestDLL指向单元测试项目生成的DLL文件;TestResultsPath是要传给NUnit的,这样测试结果就会放到BuildArtifacts目录下。

  RunUnitTests Target用到了Exec Task。如果有一个测试运行失败,NUnit控制台运行器会返回一个非0的结果。这个返回值会告诉MSBuild有个地方出错了,于是整个构建的状态就是失败。

  现在这个脚本比较完善了,用一个命令就可以删除旧的构建产物、编译、运行单元测试:

  C:\HelloCI\> msbuild HelloCI.msbuild /t:RunUnitTests

  我们还可以给脚本设一个默认Target,就省得某次都要指定了。在Project元素上加一个DefaultTargets属性,让RunUnitTests成为默认Target。

  

  DefaultTargets="RunUnitTests">

  你还可以创建自己的Task。这里有个例子,AsyncExec,它允许人们以异步的方式执行命令。比如有个Target用来启动Web服务器,要是用Exec命令的话,整个构建都会停住,直到服务器关闭。用AsyncExec这个命令可以让构建继续执行,不用等待命令执行结束。

  本文的完整脚本可以在这里下载。

  在接下来的文章中,我会讲述如何配置Jenkins。我们不再需要手动运行命令来构建整个项目,Jenkins会检测代码库,一旦有更新就会自动触发构建。

原文转自:http://www.ltesting.net