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

3
我会使用.NET客户端库来针对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客户端库是否可能?还是有更简单的方法我可能错过了吗?


您想创建哪种构建定义的类型?vNext 还是 XAML? - Eddie Chen - MSFT
1
vNext。我认为Patrick(下面)能够提供解决方法,挑战绝对是参考旧团队项目会导致创建生成定义出现问题,虽然这肯定将来将是REST API的一个惊人补充。 - m00nbeam360.0
1个回答

3

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

@PatrickLu-MSFT,你能看一下这个问题吗:https://dev59.com/uK_la4cB1Zd3GeqPpjhZ 我正在按照你上面说的做,但新创建的定义中没有包含任何构建任务? - gperrego

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接