VSTF Build Workflow(4)创建你自己的Build Activity

也许你还对上一节中我天马行空的介绍带有疑惑,比如说,上个Demo我只使用到了string类型,对于集合啦、自定义实体来并没有触及——我准备在另外的文章中再cover这些细节。还有,很多文章都会述及那个神奇的Metadata,可我却只字未提,因为这个Argument还有很多细节需要细细介绍,

除此之外,我想读者更好奇的莫过于VSTF Team为我们提供的那些用于Build的Activity了。

image

上一个Demo中,我们使用到了Team Foundation Build Activites中的WriteBuildMessage,这个Activity用于在Build Log中输出一些信息。

image

其余还有40个Activity,各有各的用途,像我们目前在使用的Template这个xaml,就是由这些Activity和一些WF 4.0自带的Activity组成的。我会在之后研究DefaultTemplate.xaml的文章中介绍到这些Activity。

那我们能否写一些自定义逻辑的Build Activity并在Template这个XAML中使用呢?

Yes, you can, but 非常麻烦。

基本思路是:

1.自定义一些CodeActivity,它们都派生于某个Workflow基类,只有这样,才能在Build Template中显示我们定义的Argument,执行自定义的逻辑、

2.把这些CodeActivity打包到一个dll中,我们要把这个dll放到VSTF知道的位置上。

目标:

写一个Activity,它能简单地处理数据,给输入的每个人名加上“Hello,”的前缀。

理清思路,确定目标后,我们就要开始动手实践了。

1.创建一个sln项目并Check in到VSTF,它包括两个Class library:

image

如图所示,BuildEngine用来放置所有自定义的Activity;而BuildTemplate用来放置所有的Template。

2.添加引用

添加VSTF Team为我们提供的那些用于Build Workflow的dll,参照下图,缺哪个补哪个:

image

你可能找不到那几个带有Workflow的dll所在的位置,请到这两个目录下找一找:

C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0\

c:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\

对于Microsoft.TeamFoundation.TestImpact.Client.dll,你可能找不到这个dll,请点击这里下载,并将其check in到你的VSTF上,因为以后我们要一直使用它。

image

同时,在BuildTemplate项目中添加对BuildEngine项目的引用,因为我们要在Template中添加自定义的Activity。

3.开始写第一个Activity

首先,在VSTF中添加一个新的Code Activity,命名为MessageHandler,对,我们就是要模拟上个Demo中使用到的VSTF Team提供给我们的WriteBuildMessage这个Activity。

image

VSTF会为我们自动生成一些code,我们保留其骨架,稍微修改如下:

 image

我们从代码自带的comments就能看到,它有一个Text属性,如果我们把MessageHandler这个Activity拖动到Workflow中,那么Text就会暴露在属性面板中,我们可以对其进行设置。

此外,我们还要为MessageHandler添加一个Attribute,才能为VSTF所识别:

image

4.将最原始的DefaultTemplate.xaml(VSTF自带的,没有做过任何改动)copy到BuildTemplate项目,并重命名为CustomTemplate1.xaml,同时,将它的Build Action修改为XamlAppDef

image

image 

编译BuildEngine这个项目,当你切换到BuildTemplate项目,就可以在可视化页面CustomTemplate1.xaml的Toolbox中可以看到新生成的MessageHandler。

友情提示:请保存好最原始的DefaultTemplate.xaml,我们宁肯每次copy一个副本、重命名,然后在上面做改动,也不会去直接修改原始文件。

5.打开CustomTemplate1.xaml,创建一个名为MessageA的Argument:

image

6.从Toolbox中拖动MessageHandler到下图中的位置,也就是Get the Build这个Activity之后,同时在MessageHandler的属性面板中将Text设置为MyMessage:

image 

image 

7.从Toolbox中拖动一个WriteBuildMessage到MessageHandler之后,同时,在WriteBuildMessage的属性面板中将Message设置为MyMessage:

image

image

8.将修改后的CustomTemplate1.xaml文件check in到VSTF中。

至此,我们完成了一个自定义的Build Activity的编码工作。

接下来有很多事情要做。首当其冲的是,如何在Build时知道CustomTemplate1.xaml在什么位置呢?

为此,我们打开Build面板,在Process这个Tab下,可以看到右上角就是让我们选择Dafault Template的,接下来的操作步骤是:

image

1)点击New按钮,会打开New Build Process Template面板

2)在新弹出的面板中,我们可以copy一个现有的Template到目标位置;也可以直接选择VSTF某个位置上的Template。这里我们使用后者,于是点击Browse按钮。

3)于是弹出Browse对话框,让我们找出CustomTemplate1.xaml在VSTF上的位置。

4)一路选择“确定”,得到如下画面:

image

等一下,还没完。如果你迫不及待的立刻执行Build,就会得到如下错误日志:

image

究其原因,是VSTF并不知道我们编写的MessageHandler及其所在的dll——BuildEngine.dll在什么地方,所以在执行这个Activity时,解析不出来这是神马。

也许你立刻会想到,把BuildEngine.dll放到GAC就万事大吉了。但,这不是一个完美的solution,因为每当你新安装一台build machine,都需要把相关的dll安装到GAC中,不胜其烦。

另一种solution是,把BuildEngine.dll放到VSTF上,让VSTF知道这个dll所在的位置。同时,每次编译BuildEngine项目成功后,都会更新这个dll,详细步骤如下:

1.把BuildEngine.dll放到VSTF上

image

2.让VSTF知道这个dll所在的位置,为此,右击Builds,在菜单中选择Manage Build Controllers

image

选择你使用的Agent所在的Controller,点击Properties按钮:

image

在弹出的对话框中,我们终于找到了可以选择自定义Build Activity路径的地方,将其指定为BuildEngine.dll所在的目录:

image

以后,只要我们使用这个Controller下的Agent执行Build,就会检查$BaobaoAgile/BuildAssemblies目录的dll并试着加载。

最后,我们要在每次编译成功之后自动更新VSTF上的这个文件,右击BuildEngine项目打开Property窗体,转到Build Events,在Post-Build窗口中输入以下script:

image

第一行脚本将VSTF上的BuildEngine.dll这个文件checkout到本地路径

第二行脚本将新生成的BuildEngine.dll复制到VSTF对应的本地路径下;注意这里的第2个参数,也就是源文件的位置,请确保这个路径是正确的。

最后一行脚本checkin这个文件

以下是运行时的实际路径:

image

你可以观察VSTF上的BuildEngine.dll,每次编译BuildEngine这个项目时,BuildEngine.dll的更新时间都会Update

现在我们可以放心大胆地执行Build了,在执行前请先在Build面板中将MessageA属性设置为Baobao:

image

执行Build,我们看到,Build Log中成功打印出hello, Baobao

image 

本文代码下载:WFBuildSolution

原文地址:https://www.cnblogs.com/Jax/p/1950609.html