【问题标题】:TFS API: Clone Build Definition EnvironmentTFS API:克隆构建定义环境
【发布时间】:2018-06-09 11:46:49
【问题描述】:

我想在构建定义中克隆现有环境。

这可以通过 TFS GUI 实现,但似乎 API 本身并不支持它。

到目前为止,我已经尝试了以下方法(在 PowerShell 中):

下载构建定义并反序列化

[void][System.Reflection.Assembly]::LoadFile("$pwd\Newtonsoft.Json.dll")

$TargetDefinitionName = "Name"

$TargetDefinitionID = ($DefinitionsOverview | Where-Object { $_.name -eq $TargetDefinitionName } | Select-Object -First 1).id

$TargetDefinitionURL = "$TfsUri/$TargetDefinitionID"

$TargetDefinitionJSON = Invoke-WebRequest -Uri "$TargetDefinitionURL" -UseDefaultCredentials

$DeserializedBuildDefinition = [Newtonsoft.Json.JsonConvert]::DeserializeObject($TargetDefinitionJSON.Content)

$DeserializedBuildDefinition.ToString()

代表环境的重复 JSON 块,更改唯一属性

$NewEnvironmentString = $DeserializedBuildDefinition.environments[4].ToString()

$DeserializedBuildDefinition.environments.Add(5)

$DeserializedBuildDefinition.environments[5] = $NewEnvironmentString 

$DeserializedBuildDefinition.environments[5].name.value = "NewEnvironment"

$DeserializedBuildDefinition.environments[5].rank.value = "6"

$DeserializedBuildDefinition.environments[5].id.value = "1665"

$DeserializedBuildDefinition.revision.value = "20"

序列化 JSON 并回传(使用新环境)

$SerializedBuildDefinition = [Newtonsoft.Json.JsonConvert]::SerializeObject($DeserializedBuildDefinition)

$PostData = [System.Text.Encoding]::UTF8.GetBytes($SerializedBuildDefinition)

$Headers = @{ "Accept" = "api-version=2.0-preview" }

$Response = Invoke-WebRequest -UseDefaultCredentials -Uri 
$TargetDefinitionURL -Headers $Headers `
          -Method Put -Body $PostData -ContentType "application/json"

$Response.StatusDescription

问题:$Response.StatusDescription 给出“OK”,但构建定义中没有出现新环境。

一个想法是,除了“名称”、“ID”和“排名”之外,我还缺少其他需要每个环境唯一的值。

我还尝试过手动克隆环境、保存定义的 JSON 表示、删除环境并返回 JSON。新环境仍未出现。

任何帮助将不胜感激。

【问题讨论】:

  • 请注意:您不需要导入 JSON 解析库。使用Invoke-RestMethod,生成的JSON会自动转换成PowerShell PSCustomObject
  • blogs.infosupport.com/… "虽然标准的 ConvertFrom-Json 和 ConvertTo-Json cmdlet 对于基本的 JSON 查询来说是很好的,但当用于将 JSON 构建定义转换为 PSCustomObject 然后再次转换回 JSON 字符串时, TFS2015 REST 端点不接受生成的 JSON 字符串——它可能与 UserVoice 上讨论的行为有关。因此,我们将使用广为人知的 Newtonsoft.Json 库来进行操作。使用从您的 Powershell 脚本中,执行以下操作:"
  • 您的意思是要从 release 定义中克隆环境吗?您使用的是哪个版本的 tfs?
  • 是的,从技术上讲,这是一个“发布”定义。这是 TFS 2015。

标签: powershell tfs tfsbuild azure-devops-rest-api


【解决方案1】:

未来:作为代码的基于 Yaml 的构建定义进展顺利,至少在 VSTS 方面如此。这无助于即时需求,但可能会提供更好、更轻量级的未来方法。

【讨论】:

    【解决方案2】:

    复制环境时,需要更改“id”、“name”和“rank”。 并且“id”需要改为“0”。另外,请尝试使用 api-version=2.3-preview.1

    然后使用api of update a release definition 更新定义:

    PUT http://tfs2015:8080/tfs/teamprojectcollection/teamProject/_apis/release/definitions?api-version=2.3-preview.1
    {
      ……
    }
    

    我已经使用 TFS 2015 Update 4 进行了测试。Api 可以成功克隆环境。

    【讨论】:

    • 谢谢Cece。我会在早上试一试。
    • 请在您测试后告诉我们它是否对您有帮助。
    • 将 ID 设置为 0 并使用 2.3-preview.1 版本的 API 允许克隆环境。但是,我假设构建步骤也会被克隆。如果我想将它们与环境一起克隆,是否需要将每个任务 ID 设置为 0?感谢您的帮助。
    • @blashmet 不行,需要将deployStep的ID改为0。"deployStep": { "tasks": [..],"id":0}
    • @blashmet 正如 Starian 所说,您还需要将 deployStep 的 ID 更改为 0。这样,您也可以克隆构建步骤。
    【解决方案3】:

    我创建了一个用于克隆 TFS 构建的工具,因为(至少在 TFS 2015 更新 1 中)网络“克隆”功能不会克隆“存储库”或“触发器”选项卡。我们的一些构建步骤有点复杂,所以我还编写了一些简单的转换来根据目标分支自动设置值。

    我使用Microsoft.TeamFoundation.Build2.WebApi 程序集中的BuildHttpClient 对象来获取原始构建定义(BuildDefinition 对象,使用GetDefinitionAsync() 方法),转换任何构建步骤值,然后在BuildHttpClient 上调用CreateDefinitionAsync() 到创建新版本。

    工作非常可靠,并且在后台似乎使用了 TFS REST API。

    如果有任何兴趣,我很乐意为此创建一个更深入的教程。

    【讨论】:

      猜你喜欢
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 2019-10-01
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多