如何从TFS获取构建定义并将其传递给外部程序
这就是我们手动做的事情:
1)排队新建 2)一旦构建完成,请转到drop文件夹并获取exe名称 3)将此exe名称传递给测试自动化程序并运行它。
我想自动执行这3个步骤。 是否有可能以编程方式获取构建定义?
答案 0 :(得分:1)
创建自定义构建模板。使用默认的副本(或您现在使用的)作为起点。查看BuildDetail.CompilationStatus = BuildPhaseStatus.Succeeded的工作流程。然后,您将有机会调用另一个应用程序,它将是一个存根程序/ powershell脚本/任何其他可执行进程。您可以使用BuildDetail.DropLocation传递刚刚完成的构建的路径。
答案 1 :(得分:1)
假设你的第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);
}
}
}
}
通过上述内容,您可以检索位于团队项目*.exe
中的构建定义BuildDefinitionName
的最后一个构建版本的放置位置下的任何TeamProjectName
的路径。 br />
这种方法允许您将TFS-Build与测试执行完全分开。例如,您可以安排此控制台应用程序每晚执行并调用您的跑步者来操作最新的成功构建。
如果您希望构建和testrun在任何你应该按照@TimWagaman的建议,在构建过程中调用你的测试运行器。这种“耦合”可能包括:
在这种情况下,您的测试将在编译阶段不会中断的每个构建中执行。
答案 2 :(得分:0)
<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"" />
我们使用上面提取:build#,branch,revision# 来自生成的.txt文件。