gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:01:04 26 4
gpt4 key购买 nike

我正在使用 .NET Client Libraries为 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);

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

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

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

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

最后添加一个导入方法,更多细节请引用这个link

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);

关于c# - 使用 TFS 2015 .NET 客户端库从模板创建构建定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39134708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com