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

时间:2018-09-19 05:58:17

标签: 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等。在静态帮助下可以实现按变量组,但是我们需要手动对其进行更新。

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

4 个答案:

答案 0 :(得分:5)

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

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

要动态增加值,您需要使用令牌$(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"}}}

enter image description here


UPDATE2:

您可以编写PowerShell脚本以调用REST API,然后添加PowerShell任务以在构建管道中运行脚本:(Use the OAuth token to access the 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

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 

答案 1 :(得分:2)

我使用此任务来更新组中变量的值。

Shared variable updater (preview)

不要忘记设置这些设置:

  1. 在代理作业附加选项中需要“允许脚本访问OAuth令牌”

  2. 在变量组中将管理员角色设置为“ Project Collection Build Service”。

如果使用YAML管道

使用YAML管道时,会自动添加OAuth令牌(不需要上面的步骤1),但是需要一些工作才能使Powershell脚本可访问。使用the guidance here可以使用令牌。

答案 2 :(得分:0)

您可以将REST API与PowerShell任务一起使用以覆盖变量,而无需创建PAT。

  1. 您首先需要进入代理作业并设置“允许脚本访问OAuth令牌”。
  2. 您还需要转到变量组,并将“ Project Collection Build Service”添加为管理员。
  3. 现在,您可以使用OAuth Bearer令牌调用Rest API。参考代码:
$id = <variable group id>

# This is using some environment variables provided by the pipeline to build the URL
$url = ("$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/distributedtask/variablegroups/{0}?api-version=5.0-preview" -f $id)

# You might find it useful to us a GET method to grab the variable group, update it and then convert it to this json string rather than doing this here
$json = '{"id":$id,"type":"Vsts","name":"<Variable Group Name>","<Variable Name":{"ThisIsMyVariable":{"isSecret":false,"value":"20"}}}'

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

答案 3 :(得分:0)

我做了这个任务来管理来自流水线的变量组: ManageVariableGroupTask

使用它您可以创建/更新/删除变量组并对其中包含的变量执行相同的操作。

希望能帮到你!