How to Increase/Update Variable Group value using Azure Devops Build Definition?

You can simply update any number of variables in an Azure Devops variable group using its built-in az pipelines variable-group variable update command. You can use this command in a script task in the pipeline definition as shown below.

ps: Replace all the upper case values with corresponding values except the SYSTEM_ACCESSTOKEN.

variables:
- group: VARIABLE_GROUP_NAME

jobs:
- job: UpdateVarGroup
  steps:
  - script: |
      newValue="This is the updated value"

      echo $SYSTEM_ACCESSTOKEN | az devops login
      az pipelines variable-group variable update --group-id $(group_id) \
        --name NAME_OF_THE_VARIABLE \
        --value "${newValue}" \
        --org https://dev.azure.com/YOUR_ORGANIZATION_NAME \
        --project AZURE_DEVOPS_PROJECT
    displayName: 'Update variable inside a variable group'
    env:
      SYSTEM_ACCESSTOKEN: $(System.AccessToken)

In order for this example to work, you need to have a variable inside your variable group called group_id. The value of that needs to be set to the group id of the variable group, which can be obtained by simply looking at the url of your variable group. (The group id is the value for variableGroupId in the url of your browser when you are inside the variable group)

System.AccessToken is required for az devops login


I used this task to update the value of my variables inside my group.

Shared variable updater (preview)

Dont forget to set those settings :

  1. Requires 'Allow scripts to access the OAuth token' in agent job additional options

  2. Set administrator role to 'Project Collection Build Service' in the variable group.

In case of using a YAML pipeline

When using a YAML pipeline, the OAuth token is automatically added (no need for step 1 above), but requires a bit of work to make accessible for the powershell script. Use the guidance here to be able to use the token.


You can overwrite/update the value of the variables by using the logging command to set the variables again in Azure Devops Build pipleline:

Write-Host "##vso[task.setvariable variable=testvar;]testvalue"

To increase the value dynamically, you need to use the token $(Rev:.r). You can custom the variables based on the $(Build.BuildNumber) or $(Release.ReleaseName)as they will increase the value dynamically...

Just reference this thread to custom the variables:https://github.com/MicrosoftDocs/vsts-docs/issues/666#issuecomment-386769445


UPDATE:

If you just want to update the value of the variables which defined in a specific Variable Group, then you can call REST API in build pipeline to achieve that:

PUT https://{account}.visualstudio.com/{ProjectName or ID}/_apis/distributedtask/variablegroups/{Variable Group ID}?api-version=5.0-preview.1

Content-Type: application/json

Request Body:

{"id":2,"type":"Vsts","name":"VG0926","variables":{"TEST0926":{"isSecret":false,"value":"0930"}}}

enter image description here


UPDATE2:

You can write a PowerShell script to call the REST API, then add a PowerShell task to run the script in your build pipeline: (Use the OAuth token to access the REST API)

Below sample for your reference:

$url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/distributedtask/variablegroups/{Variable Group ID}?api-version=5.0-preview.1"
Write-Host $url

function CreateJsonBody
{

    $value = @"

{"id":2,"type":"Vsts","name":"VG0926","variables":{"TEST0926":{"isSecret":false,"value":"0930"}}}

"@

 return $value
}

$json = CreateJsonBody


$pipeline = Invoke-RestMethod -Uri $url -Method Put -Body $json -ContentType "application/json" -Headers @{
    Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}

Write-Host "New Variable Value:" $pipeline.variables.TEST0926.value

UPDATE3:

Well, tested again, below scripts works for me as well. You can try it, just replace the parameters accordingly:

# Base64-encodes the Personal Access Token (PAT) appropriately
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f "","PAT here")))
$url = "https://dev.azure.com/xxx/Test0924/_apis/distributedtask/variablegroups/1?api-version=5.0-preview.1"

$json = '{"id":1,"type":"Vsts","name":"VG0928","variables":{"TEST0928":{"isSecret":false,"value":"0931"}}}'
$pipeline = Invoke-RestMethod -Uri $url -Method Put -Body $json -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
Write-Host "New Variable Value:" $pipeline.variables.TEST0928.value 

If you want to update a variable group's value, use the REST.API methods. Rather than constructing the PUT request body manually, use a GET first to get the original JSON, update only what you need, then replay it as a PUT. I used to keep the variable group id also as a variable in that group to avoid hard-coding.

variables:
  - group: MyVarGroup

- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |
      $url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/distributedtask/variablegroups/$(VariableGroupId)?api-version=6.0-preview.1"
      $header = @{
        "Authorization" = "Bearer $(System.AccessToken)"
      }
      $def = Invoke-RestMethod -Uri $url -Headers $header

      $def.variables.MyTestVar.value = "NewValue"
      $body = @($def) | ConvertTo-Json -Depth 100 -Compress
      $def = Invoke-RestMethod -Method 'Put' -Uri $url -ContentType 'application/json' -Headers $header -Body $body