2016-08-24 116 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