I am trying to update VSTS release definition agent pool using powershell. Able to get the agent id and release definition details.
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
Response :
@{
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=
}
Agent 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
}]
Now i want to update agent pool in release definition.
Reference : In VSTS, can I bulk change the agent queue?
You'll need to modify the object returned when you invoke $uri2 then use the PUT HTTP method to update the release definition in Azure DevOps.
Converting $projects2 to and from JSON is unnecessary, the objects can be manipulated directly. Remove | ConvertTo-Json
from the end of the Invoke-RestMethod that sets $project2 and also the line $projects2 = $projects2 | ConvertFrom-Json
.
To change the change the Agent Pool you'll need to update the queueId property of the relevant deploy phase in the relevant environment. If you had 1 environment with 1 deploy phase this would by done by
$projects2.environments[0].deployPhases[0].deploymentInput.queueId = $id.id
If you have multiple environments and/or deploy phases you'll need to change the array keys on those properties accordingly. Then convert the $projects2 object to JSON before sending the HTTP PUT request:
$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