如何使用powershell更新VSTS发布作业代理池

如何使用powershell更新VSTS发布作业代理池,powershell,azure-devops,user-agent,Powershell,Azure Devops,User Agent,我正在尝试使用powershell更新VSTS发布定义代理池。能够获取代理id和发布定义详细信息 Powershell: $User = 'xxxx@software.com' $PersonalAccessToken = 'xxxx' $base64authinfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $User, $PersonalAccessToken))) $vstsAcco

我正在尝试使用powershell更新VSTS发布定义代理池。能够获取代理id和发布定义详细信息

Powershell:

$User = 'xxxx@software.com'
$PersonalAccessToken = 'xxxx'
$base64authinfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f  $User, $PersonalAccessToken)))
$vstsAccount = "software"
$resource = 'Enterprise'

#Get the Agent ID
$uri = "https://$vstsAccount.visualstudio.com/_apis/distributedtask/pools/"
$projects = Invoke-RestMethod -Method Get -ContentType application/json -Uri $uri -Headers @{Authorization=("Basic {0}" -f $base64authinfo)} | ConvertTo-Json
$projects = $projects | ConvertFrom-Json
Write-Host "Json Body :" $projects
$id = $projects.value | ? name -eq 'Hosted VS2017'
Write-Host "Agent Pool Id :" $id.id


#Get release definition details
$uri2 = "https://vsrm.dev.azure.com/$vstsAccount/$resource/_apis/release/definitions/860?api-version=5.0"
$projects2 = Invoke-RestMethod -Method Get -ContentType application/json -Uri $uri2 -Headers @{Authorization=("Basic {0}" -f $base64authinfo)} | ConvertTo-Json
$projects2 = $projects2 | ConvertFrom-Json
Write-Host "Json Body :" $projects2
答复:

@{
source=userInterface; 
revision=84; 
description=; 
createdBy=; 
createdOn=2019-02-15T07:27:04.357Z; 
modifiedBy=; 
modifiedOn=2019-04-04T17:27:30.487Z; 
isDeleted=False; 
variables=; 
variableGroups=System.Object[]; 
environments=System.Object[]; 
artifacts=System.Object[]; 
triggers=System.Object[]; 
releaseNameFormat=Release-$(rev:r); 
tags=System.Object[]; 
pipelineProcess=; 
properties=; 
id=860; 
name=JMeterReleaseJob; 
path=\; 
projectReference=; 
url=https://vsrm.dev.azure.com/software/18979a9c-xxxx-xxxx-xxxx-f3fa4a82df3c/_apis/Release/definitions/860; _links=
}
代理ID json:

"value":  [
                  {
                      "createdOn":  "2016-03-23T12:04:35.723Z",
                      "autoProvision":  true,
                      "autoSize":  true,
                      "targetSize":  null,
                      "agentCloudId":  null,
                      "createdBy":  null,
                      "owner":  null,
                      "id":  2,
                      "scope":  "3e93f9e6-xxxx-xxxx-xxxx-994d196e1121",
                      "name":  "Hosted",
                      "isHosted":  true,
                      "poolType":  "automation",
                      "size":  10
                  },
                  {
                      "createdOn":  "2017-03-21T00:40:47.527Z",
                      "autoProvision":  true,
                      "autoSize":  true,
                      "targetSize":  null,
                      "agentCloudId":  null,
                      "createdBy":  null,
                      "owner":  null,
                      "id":  4,
                      "scope":  "3e93f9e6-xxxx-xxxx-xxxx-994d196e1121",
                      "name":  "Hosted VS2017",
                      "isHosted":  true,
                      "poolType":  "automation",
                      "size":  10
                  },
                  {
                      "createdOn":  "2018-05-04T10:20:59.69Z",
                      "autoProvision":  false,
                      "autoSize":  true,
                      "targetSize":  null,
                      "agentCloudId":  null,
                      "createdBy":  "@{displayName=Kabir Sharan; url=https://spsprodweu3.vssps.visualstudio.com/A3e42757e-xxxx-xxxx-xxxx-ee414eb0f5b1/_apis/Identities/8fe521c4-xxxx-xxxx-xxxx-6ca5f1b30c10; _links=; 
id=8fe521c4-xxxx-xxxx-xxxx-6ca5f1b30c10; uniqueName=Kabir@software.com; imageUrl=https://condecosoftware.visualstudio.com/_apis/GraphProfile/MemberAvatars/aad.OGZlNTIjhhLWFlZTgtNmNhNWYxY
jMwYzEw; descriptor=aad.OGZlNTIxYzQtYmQwNygtNmNhNWYxYjMwYzEw}",
                      "owner":  "@{displayName=Kabir Sharan; url=https://spsprodweu3.vssps.visualstudio.com/A3e42757e-xxxx-xxxx-xxxx-ee414eb0f5b1/_apis/Identities/8fe521c4-xxxx-xxxx-xxxx-6ca5f1b30c10; _links=; id=8
fe521c4-xxxx-xxxx-xxxx-6ca5f1b30c10; uniqueName=Kabir@software.com; imageUrl=https://condecosoftware.visualstudio.com/_apis/GraphProfile/MemberAvatars/aad.OGZlNLWFlZTgtNmNhNWYxYjMwY
zEw; descriptor=aad.OGZlNTIxYzQtYmQwNy03MNmNhNWYxYjMwYzEw}",
                      "id":  10,
                      "scope":  "3e93f9e6-xxxx-xxxx-xxxx-994d196e1121",
                      "name":  "PaasAgent1",
                      "isHosted":  false,
                      "poolType":  "automation",
                      "size":  0
                  }]
现在我想更新发布定义中的代理池

参考:

您需要修改调用$uri2时返回的对象,然后使用PUT HTTP方法更新Azure DevOps中的发布定义

不需要将$projects2转换为JSON或从JSON转换为$projects2,可以直接操作对象。从设置$project2的Invoke rest方法的末尾删除
|ConvertTo Json
,并删除行
$projects2=$projects2 | ConvertFrom Json

要更改代理池,需要在相关环境中更新相关部署阶段的queueId属性。如果您有一个具有一个部署阶段的环境,那么这将由

$projects2.environments[0].deployPhases[0].deploymentInput.queueId = $id.id
如果有多个环境和/或部署阶段,则需要相应地更改这些属性上的阵列键。然后在发送HTTP PUT请求之前,将$projects2对象转换为JSON:

$body = $projects2 | ConvertTo-Json -Depth 10
$uri3 = "https://vsrm.dev.azure.com/$vstsAccount/$resource/_apis/release/definitions?api-version=5.0"
Invoke-RestMethod -Method Put -Uri $uri3 -Headers @{Authorization=("Basic {0}" -f $base64authinfo)} -Body $body -ContentType application/json

您需要修改调用$uri2时返回的对象,然后使用PUT HTTP方法更新Azure DevOps中的发布定义

不需要将$projects2转换为JSON或从JSON转换为$projects2,可以直接操作对象。从设置$project2的Invoke rest方法的末尾删除
|ConvertTo Json
,并删除行
$projects2=$projects2 | ConvertFrom Json

要更改代理池,需要在相关环境中更新相关部署阶段的queueId属性。如果您有一个具有一个部署阶段的环境,那么这将由

$projects2.environments[0].deployPhases[0].deploymentInput.queueId = $id.id
如果有多个环境和/或部署阶段,则需要相应地更改这些属性上的阵列键。然后在发送HTTP PUT请求之前,将$projects2对象转换为JSON:

$body = $projects2 | ConvertTo-Json -Depth 10
$uri3 = "https://vsrm.dev.azure.com/$vstsAccount/$resource/_apis/release/definitions?api-version=5.0"
Invoke-RestMethod -Method Put -Uri $uri3 -Headers @{Authorization=("Basic {0}" -f $base64authinfo)} -Body $body -ContentType application/json

在此对象上找不到属性“queueId”。验证属性是否存在并且可以设置。响应中不存在queueid。我更新了question.Invoke-RestMethod:{“$id”:“1”,“innerException”:null,“message”:VS402982:未为阶段“阶段1”设置保留策略。不推荐使用版本管道级别的保留策略。请在阶段级别使用保留策略。如果使用浏览器访问服务,请按Ctrl-F5刷新浏览器缓存,然后重试。“,“typeName”:Microsoft.VisualStudio.Services.ReleaseManagement.Data.Exceptions.InvalidRequestException,Microsoft.VisualStudio.Services.ReleaseManagement2.Data,“类型键”:“InvalidRequestException”,“错误代码”:0,“事件ID”:3000}queueId是environments属性的子属性。如果$body未正确转换为JSON,则会发生上述错误。在脚本中,您正在转换来自
Invoke RestMethod-Method Get-ContentType application/JSON-Uri$uri2-Headers@{Authorization=(“基本{0}”-f$base64authinfo)}的输出
转换为JSON,然后从JSON返回。正如我在回答中提到的,这是不必要的。您只需要调用ConvertToJSON一次,并且在更改$projects2中queueId的值后就应该这样做。Invoke-RestMethod:{“$id”:“1”,“innerException”:null,“message:“找不到标识符为4的代理池”。,“typeName:”Microsoft.TeamFoundation.DistributedTask.WebApi.TaskAgentQueueNotFoundException,Microsoft.TeamFoundation.DistributedTask.WebApi,“类型键”:“TaskAgentQueueNotFoundException”,“错误代码”:0,“事件ID”:3000}在此对象上找不到属性“queueId”。请验证该属性存在并且可以设置。响应中不存在queueId。我更新了问题。Invoke-RestMethod:{“$id”:“1”,“innerException”:null,“message”:VS402982:未为阶段“阶段1”设置保留策略。不推荐使用版本管道级别的保留策略。请在阶段级别使用保留策略。如果您使用浏览器访问服务,请按Ctrl-F5刷新浏览器缓存,然后重试。“,“typeName”:”Microsoft.VisualStudio.Services.ReleaseManagement.Data.Exceptions.InvalidRequestException,Microsoft.VisualStudio.Services.ReleaseManagement2.Data,“类型键”:“InvalidRequestException”,“错误代码”:0,“事件ID”:3000}queueId是environments属性的子属性。如果$body未正确转换为JSON,则会发生上述错误。在脚本中,您正在转换来自
Invoke RestMethod-Method Get-ContentType application/JSON-Uri$uri2-Headers@{Authorization=(“基本{0}”-f$base64authinfo)}的输出
转换为JSON,然后从JSON返回。正如我在回答中提到的,这是不必要的。您只需要调用ConvertToJSON一次,并且在更改$projects2中queueId的值后就应该这样做。Invoke-RestMethod:{“$id”:“1”,“innerException”:null,“message:“找不到标识符为4的代理池”。,“typeName:”Microsoft.TeamFoundation.DistributedTask.WebApi.TaskAgentQueueNotFoundException,Microsoft.TeamFoundation.DistributedTask.WebApi,“类型键”:“TaskAgentQueueNotFoundException”,“错误代码”:0,“事件ID”:3000}