我正在开发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
您可以通过使用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)
| 归档时间: |
|
| 查看次数: |
4178 次 |
| 最近记录: |