2016-08-24 86 views
2

对于VSTS/TFS 2015,我使用.NET Client Libraries以编程方式创建基于我在另一个团队项目中抓取的模板的构建定义。使用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客户端库吗?还是有更简单的方法,我可能错过了?

+0

什么是你想创建构建定义的构建的类型? vNext或XAML? –

+1

vNext。我认为帕特里克(下图)能够提供解决方案,但挑战肯定是对旧团队项目的引用,它会导致问题创建构建定义,但这对于将来的REST API肯定会是一个惊人的补充。 – Sachi

回答

2

没有办法将模板作为构建定义的属性传递。但是,还有另一种实现方法。您可以通过.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 retreive从源项目的生成定义对象。

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

下一步是将构建定义导出到一个文件,以便我们可以导入它。通过使用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); 
+0

感谢解决方法,帕特里克,工作正常! – Sachi