【问题标题】:Create Build Definition from Template with TFS 2015 .NET Client Libraries使用 TFS 2015 .NET 客户端库从模板创建构建定义
【发布时间】:2017-01-01 06:16:59
【问题描述】:

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

我可以通过以下方式获得构建定义模板(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 客户端库可以做到这一点吗?或者有没有我可能错过的更简单的方法?

【问题讨论】:

  • 您要创建构建定义的构建类型是什么? vNext 还是 XAML?
  • vNext.我认为 Patrick(下)能够给出一个变通解决方案,挑战肯定是对旧团队项目的引用,这会导致创建构建定义出现问题,尽管这肯定会在未来成为 REST API 的一个惊人的补充.

标签: c# tfs azure-devops


【解决方案1】:

没有办法将模板作为构建定义的属性传递。但是,还有另一种方法可以实现它。您可以通过 .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);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 2010-10-10
  • 1970-01-01
  • 2015-12-26
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多