如何使用Azure Devops构建定义增加/更新变量组值?

Man*_*ani 5 tags azure-devops

我正在开发Azure Devops CI&CD。在这里,我的发行名称必须在使用标签的版本号中。通过在变量组上添加标签和值来获取此信息。在这里,对于每个版本(例如1.1、1.2、1.3等),都将标签值作为常量(如静态值)获取。

现在我试图为成功完成构建定义后触发的每个新发行版动态地增加/更新我的标签值,看起来像1.1、1.2、2.1、2.2、3.1、3.2等。通过变量组静态地可以实现,但我们需要手动对其进行更新。

是否可以通过“构建定义”任务或其他过程来增加/更新变量组中的标签值。如果可能,请建议我“如何完成此工作?”

小智 9

您可以使用其内置az pipelines variable-group variable update命令简单地更新 Azure Devops 变量组中任意数量的变量。您可以在script管道定义的任务中使用此命令,如下所示。

ps:将所有大写值替换为除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)
Run Code Online (Sandbox Code Playgroud)

为了使该示例正常工作,您的变量组中需要有一个名为 的变量group_id。其值需要设置为变量组的组id,只需查看变量组的url即可获取该值。variableGroupId(组 id 是当您位于变量组内时浏览器 url 中的值)

需要 System.AccessTokenaz devops login


And*_*SFT 6

您可以通过使用logging命令在Azure Devops Build pipleline中再次设置变量来覆盖/更新变量的值:

Write-Host "##vso[task.setvariable variable=testvar;]testvalue"
Run Code Online (Sandbox Code Playgroud)

要动态增加值,您需要使用token $(Rev:.r)。您可以基于$(Build.BuildNumber)或定制变量,$(Release.ReleaseName)因为它们会动态增加值。

只需引用此线程即可自定义变量:https : //github.com/MicrosoftDocs/vsts-docs/issues/666#issuecomment-386769445


更新:

如果只想更新在特定变量组中定义的变量的值,则可以在构建管道中调用REST API来实现:

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"}}}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


UPDATE2:

您可以编写PowerShell脚本以调用REST API,然后添加PowerShell任务以在构建管道中运行脚本:(使用OAuth令牌访问REST API

以下示例供您参考:

$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
Run Code Online (Sandbox Code Playgroud)

UPDATE3:

好吧,再次测试,以下脚本也对我有用。您可以尝试一下,只需相应地替换参数即可:

# 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 
Run Code Online (Sandbox Code Playgroud)