使用TFS 2015 . net客户端库从模板创建构建定义
本文关键字:创建 构建 定义 TFS 2015 net 客户端 使用 | 更新日期: 2023-09-27 18:04:03
我正在使用VSTS/TFS 2015的。net客户端库以编程方式创建基于我在另一个团队项目中抓取的模板的构建定义。
我可以得到一个构建定义模板(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);
从上面的代码中,您可以对团队服务器进行身份验证,并通过提供的项目名称和构建定义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<BuildDefinition>(File.ReadAllText(filePath));
buildDef.Name = newBuildName;
await buildClient.CreateDefinitionAsync(buildDef, project);