zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    《Spring_Four》第二次作业 基于Jsoup的大学生考试信息展示系统开题报告
    《Spring_Four》第一次作业:团队亮相
    4.11jsp
    4.7jsp
    3.17jsp
    3.24jsp
    3.10jsp
    3.4软件测试
    回文串
    博客园第二次作业
  • 原文地址:https://www.cnblogs.com/Jax/p/1950609.html
Copyright © 2011-2022 走看看