使用TFS 2015 .NET客户端库从模板创建构建定义

我正在使用.NET Client Client for VSTS / TFS 2015以编程方式创建基于我在另一个团队项目中获取的模板的构建定义。

我可以使用以下命令获取构建定义模板(2.0):

BuildDefinitionTemplate builddeftemplate = buildHttpClient.GetTemplateAsync(teamProject, templateId).Result; 

我可以使用以下方法创建构建定义:

 BuildDefinition builddef = new BuildDefinition(); builddef.Project = newTeamProject; 

但是看起来不像是将模板作为构建定义的属性传递,也不是从模板创建构建定义。

在查看REST API的文档时,GET请求实际上看起来像返回了很多JSON:

 { "id": "vsBuild", "name": "Visual Studio", "canDelete": false, "category": "Build", "iconTaskId": "71a9a2d3-a98a-4caa-96ab-affca411ecda", "description": "Build and run tests using Visual Studio. This template requires that Visual Studio be installed on the build agent.", "template": { "build": [ { "enabled": true, "continueOnError": false, "alwaysRun": false, "task": { "id": "71a9a2d3-a98a-4caa-96ab-affca411ecda", "versionSpec": "*" }, "inputs": { "solution": "**\\*.sln", "msbuildLocation": "", "vsLocation": "", "msbuildArgs": "", "platform": "$(BuildPlatform)", "configuration": "$(BuildConfiguration)", "clean": "false" } }, ... 

所以我认为有可能只将部分返回的模板作为JSON对象获取并通过这些部分传递构建定义的POST,但似乎只需要REST API路由。

这可以通过.NET客户端库实现吗? 还是有一种我可能错过的更容易的方式?

没有办法将模板作为构建定义的属性传递。 但是,还有另一种方法可以实现它。 您可以通过.net库在团队项目之间克隆/导入/导出构建定义。

  var cred = new VssCredentials(new WindowsCredential(new NetworkCredential(username, password))); var buildClient = new BuildHttpClient(new Uri(collectionURL, UriKind.Absolute), cred); var buildDef = (await buildClient.GetDefinitionAsync(sourceProj, buildDefId)) as BuildDefinition; buildDef.Project = null; buildDef.Name += "_clone"; await buildClient.CreateDefinitionAsync(buildDef, targetProj); 

从上面的代码中,您可以向团队服务器进行身份validation,并通过提供项目名称和构建定义ID从源项目中检索构建定义对象。

然后你需要删除对项目的引用。 由于构建定义包含对项目的引用,因此无法将其导入到其他项目中。 最后在目标项目中创建一个新的构建定义,提供从先前项目中检索的定义目标。

下一步是将构建定义导出到文件中,以便后者可以导入它。 通过使用json序列化程序序列化构建定义并将其保存到文件。

  var buildDef = (await buildClient.GetDefinitionAsync(project, buildDefId)) as BuildDefinition; buildDef.Project = null; File.WriteAllText(filePath, JsonConvert.SerializeObject(buildDef)); 

最后添加一个导入方法,更多细节请参考此链接

 if (!File.Exists(filePath)) throw new FileNotFoundException("File does not exist!", filePath); Console.WriteLine($"Importing build definition from file '{filePath}' to '{project}' project."); var buildDef = JsonConvert.DeserializeObject(File.ReadAllText(filePath)); buildDef.Name = newBuildName; await buildClient.CreateDefinitionAsync(buildDef, project);