如何从 TFS 获取构建定义并将其传递给外部程序
这是我们手动执行的操作:
1)排队新构建 2)一旦构建完成,转到放置文件夹并获取 exe 名称 3)将此 exe 名称传递给测试自动化程序并运行它。
我想自动化这三个步骤。是否可以以编程方式获取构建定义?
如何从 TFS 获取构建定义并将其传递给外部程序
这是我们手动执行的操作:
1)排队新构建 2)一旦构建完成,转到放置文件夹并获取 exe 名称 3)将此 exe 名称传递给测试自动化程序并运行它。
我想自动化这三个步骤。是否可以以编程方式获取构建定义?
假设您的第 1 步已执行,则此最新(成功!)构建可作为lastKnownGoodBuild
特定构建定义的 。
考虑到这一点,您可以使用基于以下内容的控制台应用程序:
using System;
using System.IO;
using Microsoft.TeamFoundation.Build.Client;
using Microsoft.TeamFoundation.Client;
namespace BuildDropLocation
{
class Program
{
static void Main()
{
TfsTeamProjectCollection teamProjectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("http://yourTFSServerUri"));
var buildService = (IBuildServer)teamProjectCollection.GetService(typeof(IBuildServer));
IBuildDefinition myBuildDefinition = buildService.GetBuildDefinition("TeamProjectName", "BuildDefinitionName");
Uri lastKnownGoodBuild = myBuildDefinition.LastGoodBuildUri;
IBuildDetail myBuildDetail = buildService.GetBuild(lastKnownGoodBuild);
string[] myExeFiles = Directory.GetFiles(myBuildDetail.DropLocation, "*.exe",SearchOption.AllDirectories);
foreach (var exeFile in myExeFiles)
{
Console.WriteLine(myExeFile);
}
}
}
}
使用上述内容,您可以检索到位于 Team Project*.exe
中的最后一个构建定义的放置位置下的任何路径。这种方法允许您将 TFS-Build 与测试的执行完全分开。例如,您可以安排此控制台应用程序每晚执行并调用您的运行器以对最新的成功构建进行操作。如果您希望构建和测试运行以任何方式耦合,您应该按照@TimWagaman 的建议在构建期间调用您的测试运行程序。这种“耦合”可能包括:BuildDefinitionName
TeamProjectName
在这种情况下,您的测试将在编译阶段不会中断的每个构建中执行。
创建自定义构建模板。使用默认(或您现在使用的任何内容)的副本作为您的起点。查看 BuildDetail.CompilationStatus = BuildPhaseStatus.Succeeded 的工作流程。然后,您将有机会调用另一个应用程序,它将是一个存根程序/powershell 脚本/任何其他可执行进程。您可以使用 BuildDetail.DropLocation 传递刚刚完成的构建路径。
<MakeDir Directories="$(TemporaryFolder)" />
<Exec Condition=" '$(IsInTeamBuild)'=='True'" Command=""$(TfsTask)" history ../ /r /noprompt /stopafter:1 /version:W > "$(TemporaryFolder)\grab-changeset.txt"" />
<Exec Condition=" '$(IsInTeamBuild)'=='True'" Command=""$(TfsTask)" properties "$(MyMSBuildStartupDirectory)\all-companies-run-after-update.js" > "$(TemporaryFolder)\grab-properties.txt"" />
我们使用上面的内容从生成的 .txt 文件中提取:build#、branch、revision#。