自定义 Lab Management 工作流
发布时间: 2016年7月
你可在实验室环境下使用实验室默认模板 (LabDefaultTemplate) 以自动生成你的应用程序,将新的生成部署到实验室环境中并在新的生成上运行测试。 有关如何使用实验室默认模板的信息,请参阅为 SCVMM 环境创建“生成-部署-测试”工作流和为标准环境创建“生成-部署-测试”工作流。 但是,每个生成、部署和测试过程都可能因要求不同而略为不同。 例如,某个工作流可能要求从常规生成位置复制测试二进制文件,而另一个工作流要求从临时位置复制测试二进制文件。 或者,某个工作流可能要求将实验室环境存储在 SCVMM 库中,以便测试人员能部署该环节,而另一个工作流根本不保存实验室环境。 由于实验室默认模板是基于 Windows Workflow 4.0 的,因此它是完全可扩展和自定义的,使你能够自定义 LabDefaultTemplate 以满足你的特定要求。 本主题介绍了用于自定义实验室默认模板的一般步骤。
要求
- Visual Studio Enterprise、Visual Studio 专业测试工具版
在以下方案中,自定义实验室默认模板会很有用:
用于指定不同于生成放置位置的测试二进制文件位置的自定义
用于支持需要在部署后重新启动计算机的应用程序安装程序的自定义
用于读取源代码管理文件的自定义
用于使用生成代理帐户访问生成放置位置的自定义
用于使用实验室服务帐户访问其他位置的自定义
工作流自定义的基本概念
工作流自定义中涉及三个关键概念:
模板 模板可定义作为工作流一部分的活动或步骤的序列。 模板基于 Windows Workflow Foundation 4.0,且在源代码管理中作为 .xaml 文件存储。 若要将模板加载到工作流编辑器中,请双击相应的 .xaml 文件。 在编辑器中,你将能看到确定工作流的各种活动和序列。 然后,你可以使用具有不同应用范围的变量、条件逻辑、循环等对模板进行编程,就像使用任何其他编程语言一样。 利用 Windows Workflow Foundation,你可以自定义实验室默认模板以符合你的需求。
活动 活动是工作流的构建基块,实验室默认模板使用了很多活动。 你可以在**“Team Foundation Lab Management 活动”标题下的“工具箱”**中查找更多活动。 若要在工作流中使用活动,请将该活动从工具箱中拖动到 Visual Studio 工作流编辑器中的模板中的适当位置。 你可以通过查看活动的属性来确定输入参数和输出参数。 有关每个实验室管理工具版活动的详细信息,请参阅 实验室管理工具版工作流活动。 如果产品附带的活动不足以满足你的要求,则可以添加新活动。
参数 可以为你需要从用户获得的输入创建新的输入参数,并将这些值传递给活动。 选择“工作流编辑器”窗口底部的**“参数”选项卡可查看现有参数。 如果创建了新参数,则这些参数会显示在生成定义中的“过程”选项卡的“生成过程参数”**部分。
查看以下两个需要自定义的示例时请考虑这些概念。 第一个示例讨论如何更改模板中的现有活动的输入参数,第二个示例讨论如何从工具箱添加新活动。 这些示例应为你提供充分的上下文以根据你自己的要求自定义实验室默认模板。
开始自定义之前
开始自定义实验室默认模板之前,你必须先完成一些常规步骤。 下图演示了这些步骤。
准备进行自定义
在团队资源管理器中,双击团队项目的**“源代码管理”**节点。
在**“源代码管理资源管理器”中,展开“源代码管理”树并查找“$/<Project_Name>/BuildProcessTemplates”**文件夹。
将此文件夹映射到本地文件夹,例如 C:\Sources。
右键单击 LabDefaultTemplate.11.xaml 文件,然后选择**“获取最新版本”**。
创建 LabDefaultTemplate.11.xaml 文件的副本并为它指定新名称,例如,LabDefaultTemplate_customize.11.xaml
将此新文件添加到源代码管理。
双击此新文件。 该文件将在**“Visual Studio 工作流编辑器”**中打开。
接下来,你将自定义刚为实验室默认模板创建的副本。
用于指定不同于生成放置位置的测试二进制文件位置的自定义
默认工作流模板 LabDefaultTemplate 假定测试二进制文件的位置与生成的放置位置相同。 但是,在你所处的情况下,测试代码可能不会随产品代码一起生成。 当出现这种情况时,你可能希望自定义该模板,以便从不同的位置选取测试二进制文件。 此自定义涉及三个步骤,如下图中所示。
定义工作流的输入参数以指定测试二进制文件路径
定义输入参数
在“工作流编辑器”窗口顶部,单击**“参数”**选项卡。
选择**“创建参数”。 在文本框中,键入参数的名称,例如 TestBinariesLocation。 在“方向”下拉列表中,选择“输入”。 在“参数类型”下拉列表中,选择“字符串”**。
向 ExecuteRemoteTestRun 活动传递参数值
此活动将创建一个远程测试运行,并一直等到该测试运行完成,然后使用测试运行统计信息更新生成信息。
传递参数值
在工作流编辑器中,滚动到**“运行测试”活动。 尽管该活动的显示名称为“运行测试”,但活动类型为“ExecuteRemoteTestRun”**。
右键单击该活动,然后选择**“属性”**。 **“属性”**窗口将在右下角打开并显示此活动的输入和输出参数。 此活动的输入参数之一是 TestDirectory,可用于设置测试二进制文件位置的路径。
在**“属性”窗口中单击“TestDirectory”**。 在行末尾处单击省略号 (…)。
在**“表达式编辑器”中,键入“TestBinariesLocation”,然后选择“确定”**。
在**“文件”菜单上,选择“保存 LabDefaultTemplate_customize.11.xaml”**
在“源代码管理资源管理器”菜单栏上,选择**“签入”**图标。
你现在可以使用 customized .xaml 文件来创建新的生成定义。 新的输入参数 TestBinariesLocation 将显示在生成定义中的**“过程”选项卡的“杂项”**部分,你可以在此处分配一个值。
用于支持需要在部署后重新启动计算机的应用程序安装程序的自定义
在部署应用程序后,实验室默认模板不会重新启动实验室环境。 你可能希望自定义模板以支持在部署后可能需要重新启动的应用程序。 如果你在实验室环境中手动部署应用程序,则只会重新启动安装了该应用程序的计算机。 Visual Studio 实验室管理工具版不支持对环境中的虚拟机进行操作。 因此,若要重新启动一台计算机,则需要重新启动实验室环境中的所有计算机。
警告
请确保部署脚本绝不会重新启动计算机。如果出现这种情况,运行部署脚本的生成代理将会失去与生成控制器的连接,而工作流也可能会停止。
若要在部署新的生成后重新启动虚拟机,需要向 LabDefaultTemplate 添加三个活动:
停止环境
启动环境
继续执行剩余工作流之前等待虚拟机启动
停止环境
你可以通过将**“StopLabEnvironment”活动从“工具箱”**拖动到工作流模板并初始化该活动的变量,向默认工作流模板添加停止环境活动。
停止环境
在工作流编辑器中,滚动到显示名称为**“应用程序部署成功”**的活动。
在**“视图”菜单上,选择“工具箱”。 工具箱将在左侧打开,并显示“Team Foundation Build 活动”列表。 在活动列表中滚动,直到看到“Team Foundation Lab Management 活动”**列表。
在工具箱中,选择**“StopLabEnvironment”活动。 将该活动拖动到工作流编辑器中,并将其放在“应用程序部署成功”**活动之前。
右击该活动,然后单击**“属性”。 “属性”窗口将显示此活动的输入和输出属性。 请注意,工作流已具有一个名为“LabEnvironmentUri”**的变量,该变量引用环境 URI。
选择**“变量”**选项卡。 将显示变量列表。
在**“LabEnvironmentUri”行中的“默认”列下,双击“输入 VB 表达式”**。 在文本框中,键入 LabEnvironmentUri。 编辑器将显示使用的任何现有参数,你可以从该列表中选择值,而不用键入值。
启动环境
你可以通过将**“StartLabEnvironment”活动从“工具箱”**拖动到工作流模板并初始化该活动变量,来向实验室默认模板添加启动环境活动。
启动环境
在工具箱中,选择**“StartLabEnvironment”活动。 将该活动拖动到工作流编辑器中,并将它放在“应用程序部署成功”活动之前但在“StopLabEnvironment”**活动之后。
右击该活动,然后单击**“属性”。 “属性”窗口将显示此活动的输入和输出属性。 同样,工作流已具有一个名为“LabEnvironmentUri”**的变量,该变量引用环境 URI。
选择**“变量”**选项卡。 将显示变量列表。
在**“LabEnvironmentUri”行中的“默认”列下,双击“输入 VB 表达式”**。 在文本框中,键入 LabEnvironmentUri。 编辑器将显示使用的任何现有参数,你可以从该列表中选择值,而不用键入值。
在继续执行剩余工作流之前,等待计算机重新启动。
你可以通过将**“延迟”活动从“工具箱”拖动到工作流模板中并初始化该活动的变量,添加等待虚拟机启动的时间。 此活动位于“工具箱”的“基元”**选项卡中。
等待虚拟机启动
在工具箱中,选择**“基元”**选项卡。
单击**“延迟”活动。 将该活动拖动到工作流编辑器中,并将它放在“应用程序部署成功”活动之前但在“StartLabEnvironment”**活动之后。
右击该活动,然后单击**“属性”。 “属性”窗口将显示此活动的输入和输出属性。 请注意,工作流已具有一个名为“Duration”**的变量,该变量引用等待时间。
在**“属性”窗口中,选择“持续时间”**,然后选择省略号 (…)。
在**“表达式编辑器”**中,按照 TimeSpan.FromMinutes(10) 格式键入等待时间(例如,10 分钟)。
修改此模板后,将它签入到源代码管理中,并使用它创建新的生成定义以部署需要在安装后重新启动的应用程序。
用于读取源代码管理文件的自定义
如果你创建自定义活动,然后在工作流模板中使用它们,则应确保使用实验室服务帐户进行通信的生成代理可访问这些活动。 因为这些活动必须作为自定义程序集签入到源代码管理系统,所以必须确保该实验室服务帐户有权读取自定义程序集签入的路径。 有关实验室服务帐户的详细信息,请参阅如何:配置实验室服务帐户。你可以使用 tf permissions 命令为实验室服务帐户授予权限。 例如,若要为路径 $/MyProject/CustomAssemblies 上的实验室服务帐户 mydomain\labAccount 授予读取权限,则应执行与下面类似的命令:C:\Program Files\Microsoft Visual Studio 12.0\Common7\IDE>tf permission /user:mydomain\labAccount /collection:http://aseemb-tfs11:8080/tfs/Collection0 /allow:read $/MyProject/CustomAssemblies
用于使用生成代理帐户访问生成放置位置的自定义
执行工作流的生成代理使用实验室服务帐户访问生成放置位置。 如果你希望生成代理改用生成代理帐户,则可以自定义实验室默认模板。 在模板中查找执行部署脚本的**“RunDeploymentScript”活动。 此活动将公开“SharedLocationForNetUse”**属性,该属性可用于定义应使用实验室服务帐户访问的位置。 <mtlwa:RunDeploymentScript DisplayName="Running Deployment Script" ScriptDetails="[scriptDetails]" ThrowOnError="True" SharedLocationForNetUse="[BuildLocation]" />若要使用生成代理帐户(而不是实验室服务服务帐户)访问放置位置,请从模板中删除此属性或将此属性的值设置为 ({x:Null}),如此示例中所示:mtlwa:RunDeploymentScript DisplayName="Running Deployment Script" ScriptDetails="[scriptDetails]" ThrowOnError="True" SharedLocationForNetUse="{x:Null}" />
用于使用实验室服务帐户访问其他位置的自定义
如果使用实验室服务帐户运行的生成代理需要读取生成放置位置以外的位置,则可以将**“SharedLocationForNetUse”属性的值从默认值“[BuildLocation]”**更改为所需位置。 例如,若要让使用实验室服务帐户运行的生成代理访问 \\contoso\scripts 目录,应使用:<mtlwa:RunDeploymentScript DisplayName="Running Deployment Script" ScriptDetails="[scriptDetails]" ThrowOnError="True" SharedLocationForNetUse="\\contoso\scripts" />
请参阅
实验室管理工具版工作流活动
在应用程序生命周期内使用实验室环境
定义生成过程
创建或编辑生成定义
面向开发人员的 .NET 4 中 Windows Workflow Foundation (WF) 的简介