Azure devops 如何在发布管道中使用build pipeline中的自定义变量
问题: 是否有任何方法可以在azure devops中的构建管道中定义自定义变量,然后以任何方式在发布管道中使用/公开该变量 场景: 我们没有使用变量组,因为我们需要在构建管道中动态设置变量,然后在发布管道中使用它-它不是静态超全局变量 检查了和的文档,但找不到任何帮助信息或提示,这是可能的 我尝试的Azure devops 如何在发布管道中使用build pipeline中的自定义变量,azure-devops,azure-pipelines,Azure Devops,Azure Pipelines,问题: 是否有任何方法可以在azure devops中的构建管道中定义自定义变量,然后以任何方式在发布管道中使用/公开该变量 场景: 我们没有使用变量组,因为我们需要在构建管道中动态设置变量,然后在发布管道中使用它-它不是静态超全局变量 检查了和的文档,但找不到任何帮助信息或提示,这是可能的 我尝试的 在变量中定义变量(在构建管道中),并尝试使用$(名称)在发布管道中访问它,或者检查它是否在环境中 Extras-激励 这背后的动机是 阅读构建管道步骤中使用的最新git标记,并将其公开到管道变量V
变量
中定义变量
(在构建管道中),并尝试使用$(名称)
在发布管道中访问它,或者检查它是否在环境中
VERSION
(实际上,我们在该过程中会碰到补丁)版本
作为标记,并使用该版本打包/发布工件默认情况下这是不可能的,但您可以使用市场上的2个扩展: 1) -创建一个变量组,并在生成期间在此任务中动态更新变量。您也可以使用脚本执行此操作,请参阅答案 2) -在生成期间,将变量保存到与生成资产一起存储的json文件中。在发布期间,加载保存的变量并在发布定义中使用它们 如何在发布管道中使用build pipeline中的自定义变量 您可以尝试使用RESTAPI更新发布管道中的默认变量,以使用构建管道中定义的值
PUT https://vsrm.dev.azure.com/{organization}/{project}/_apis/release/definitions?api-version=5.1
详情:
在构建管道中定义一个自定义变量,如TestValue
,值为123
:
还可以使用默认值123
在发布管道中定义相同的自定义变量:
然后添加内联powershell脚本以调用REST API定义-Update
以更新发布管道中的默认值:
$url = "https://vsrm.dev.azure.com/<OrganizationName>/<ProjectName>/_apis/release/definitions/<DefinitionId>?api-version=5.1"
Write-Host "URL: $url"
$pipeline = Invoke-RestMethod -Uri $url -Method Get -Headers @{
Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}
Write-Host "Pipeline = $($pipeline | ConvertTo-Json -Depth 100)"
# Update an existing variable named TestValue to its new value 987
$pipeline.variables.TestValue.value = "$(TestValue)"
####****************** update the modified object **************************
$json = @($pipeline) | ConvertTo-Json -Depth 99
Write-Host "URL: $json "
$updatedef = Invoke-RestMethod -Uri $url -Method Put -Body $json -ContentType "application/json" -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"}
write-host "=========================================================="
Write-host "The value of Varialbe 'TestValue' is updated to" $updatedef.variables.TestValue.value
$url=”https://vsrm.dev.azure.com///_apis/release/definitions/?api-版本=5.1“
写入主机“URL:$URL”
$pipeline=Invoke RestMethod-Uri$url-Method Get-Headers@{
Authorization=“Bearer$env:SYSTEM\u ACCESSTOKEN”
}
写入主机“Pipeline=$($Pipeline | converttojson-Depth 100)”
#将名为TestValue的现有变量更新为其新值987
$pipeline.variables.TestValue.value=“$(TestValue)”
####******************更新修改的对象**************************
$json=@($pipeline)|转换为json-深度99
写入主机“URL:$json”
$updatedef=Invoke RestMethod-Uri$url-Method Put-Body$json-ContentType“application/json”-Headers@{Authorization=“Bearer$env:SYSTEM_ACCESSTOKEN”}
写入主机“=============================================================================================================”
写入主机“Varialbe'TestValue'的值更新为“$updatedef.variables.TestValue.value
在这种情况下,我们可以在对构建管道排队时动态设置变量,该值将覆盖发布管道中的默认值,以便我们可以使用它发布管道
PUT https://vsrm.dev.azure.com/{organization}/{project}/_apis/release/definitions?api-version=5.1
希望这有帮助。这两种情况似乎都有问题,如果您有buildRun1,然后是buildRun2,然后发布buildRun1,那么AFAIU.1)是有问题的-变量的值应该是buildRun2,因为变量组是超全局的,而不是“管道运行”“scoped,right2)是有问题的,因为我们需要变量来扩展发布步骤中的管道变量,它的标志设置为“在发布步骤中可设置”-我们基本上从构建中“预填充”变量,但我们需要它在以后的UI中“可更改”。这意味着,这是“发布管道中的第一个任务”,我们无法真正读取json文件。还有别的办法吗?提示:我更新了我在问题中的动机,以便您了解我们实际上要做的事情1)您是对的,但是如果在发行版中设置一个常规构建变量,您仍然会遇到这个问题,不是吗?我认为管道变量是实例变量,对管道的“运行”有效,并且预期“实例”转入实际排放管道。除此之外,是否可以使用变量组设置“release pipeline variable”,比如将值设置为
$(mygroup.var)
?这听起来很有希望,只是一个需要一般理解的问题。以这种方式设置TestValue——这基本上意味着“下一个版本管道实例化”——不管是哪个版本,对吗?它将基本上更改发布管道变量的全局定义(永远和所有未来版本)。在这种情况下,这是正确的理解吗?尽管这种方法可能有副作用,因为它不尊重可能同时发布的多个版本的可用性(可能有不同的版本上下文),但我认为这仍然是可行的,因为最新的生成将设置最新版本+1,即使我们发布了.an older.job,这也是正确的,它在生成期间保存了“older version”。非常感谢。