正在研究Azure Devops CI&CD。在这里,我的发行名称必须在使用标签的版本号中。通过在变量组上添加标签和值来获取此信息。对于每个版本(如1.1、1.2、1.3等),这里都获得了标签值(如静态值)的常量。
现在我试图为成功完成构建定义后触发的每个新发行版动态地增加/更新我的标签值,看起来像1.1、1.2、2.1、2.2、3.1、3.2等。在静态帮助下可以实现按变量组,但是我们需要手动对其进行更新。
是否可以通过“构建定义”任务或其他过程来增加/更新变量组中的标签值。如果可能,请建议我“如何进行?”
答案 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"}}}
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)
不要忘记设置这些设置:
在代理作业附加选项中需要“允许脚本访问OAuth令牌”
在变量组中将管理员角色设置为“ Project Collection Build Service”。
如果使用YAML管道
使用YAML管道时,会自动添加OAuth令牌(不需要上面的步骤1),但是需要一些工作才能使Powershell脚本可访问。使用the guidance here可以使用令牌。
答案 2 :(得分:0)
您可以将REST API与PowerShell任务一起使用以覆盖变量,而无需创建PAT。
$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)