【发布时间】: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会自动转换成PowerShellPSCustomObject -
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