如何在发布任务中修改Azure DevOps发布定义变量?

7
什么是从AzureDevOps发布任务获取Azure存储帐户的密钥轮换的最简单方法?当前计划是在发布后重新生成旧密钥以使其无效,并获得可用于下一次部署的新密钥。但要使其工作,似乎我至少需要将要在发布变量中使用的密钥名称存储起来。
我查看了日志记录任务(https://github.com/Microsoft/azure-pipelines-tasks/blob/master/docs/authoring/commands.md),但那仅更改当前发布中的值,而不修改发布定义。

1
可以工作,但只有在发布管道中的所有阶段完成后才会生效。管道中的预部署脚本会获取定义变量的旧值。 - Chito
3个回答

27
您可以使用 REST API (定义 - 更新) 从发布任务中更新发布定义变量的值。

  1. 转到 代理阶段 并选择 允许脚本访问 OAuth Token。请参见 使用 OAuth 令牌访问 REST API
  2. 授予 项目集合构建服务 (xxx) 账户编辑发布管道权限。(选择发布管道 --> ... --> 安全性 --> 编辑发布定义 设置为 允许
  3. 在您的发布管道中添加 PowerShell 任务
  4. 运行内联脚本:(在下面的示例中更新变量 v1030 的值)

    $url = "$($env:SYSTEM_TEAMFOUNDATIONSERVERURI)$env:SYSTEM_TEAMPROJECTID/_apis/Release/definitions/$($env:RELEASE_DEFINITIONID)?api-version=5.0-preview.3"
    Write-Host "URL: $url"
    $pipeline = Invoke-RestMethod -Uri $url -Headers @{
        Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
    }
    Write-Host "Pipeline = $($pipeline | ConvertTo-Json -Depth 100)"
    
    # Update an existing variable named v1030 to its new value 1035
    $pipeline.variables.v1030.value = "1035"
    
    ####****************** update the modified object **************************
    $json = @($pipeline) | ConvertTo-Json -Depth 99
    
    
    $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 'v1030' is updated to" $updatedef.variables.v1030.value
    write-host "=========================================================="
    

在此输入图片描述


所有测试版本都运行得很好,但是在生产版本中进行PUT请求更新版本定义时,会抛出400错误请求。有什么建议可以解决这个问题或者如何找出问题所在?即使不修改原始响应,对于此版本定义,发布原始响应也会失败... - Oddleif
@Andy Li-MSFT,上述解决方案仅在阶段内所有任务完成时生效。我们是否有任何其他方法可以将值从一个代理传递到同一阶段的另一个代理? - sree1611
2
当我尝试使用这种方法时,出现了“##[error]The property 'value' cannot be found on this object. Verify that the property exists and can be set.”的错误。希望我们可以使用此脚本设置预定义变量。我在上面的脚本中使用了相同的变量“v1030”。不确定我错过了什么...! - Sreekanth Mohan

0

上面的答案讲述了如何更新发布管道。

如果您想要更新构建管道的变量,以下是操作步骤:

  • 编辑构建管道
    • 进入代理阶段并选择允许脚本访问OAuth令牌。请参见使用OAuth令牌访问REST API

    • 进入管理安全性 -> 用户 -> 选择项目集合构建服务(YOUR TEAM NAME HERE)

      • 将“编辑构建定义”更改为允许
    • 现在添加一个名为Update variables的powershell阶段-2.x-内联脚本。

内联脚本内容:

$api_version='5.0-preview.6'
$url = "$($env:SYSTEM_TEAMFOUNDATIONSERVERURI)$env:SYSTEM_TEAMPROJECTID/_apis/build/definitions/$(System.DefinitionId)?api-version=${api_version}"
Write-Host "URL: $url"
$pipeline = Invoke-RestMethod -Uri $url -Headers @{
    Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}
Write-Host "Pipeline = $($pipeline | ConvertTo-Json -Depth 100)"

# Update variables as desired here:
$pipeline.variables.mavenBuildVersionPatch.value = "2401"

####****************** update the modified object **************************
$json = @($pipeline) | ConvertTo-Json -Depth 99


$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 Variable mavenBuildVersionPatch is updated to" $updatedef.variables.mavenBuildVersionPatch.value
write-host "=========================================================="

请注意,此脚本中的API版本为5.0-preview.6。 如果您的Azure Devops版本较新,则可能需要在将来进行更新。
  • 保存构建流水线。

现在,当您运行作业时,在作业完成此PowerShell阶段后,该变量将被设置。

重要提示:如果您想要更新一个变量,并将更新过的变量用于其他流水线阶段,您可以使用以下内联脚本进行PowerShell阶段:

$mavenBuildVersionPatch = [int]"$(mavenBuildVersionPatch)"
$mavenBuildVersionPatch = $mavenBuildVersionPatch + 1
Write-Host "##vso[task.setvariable variable=mavenBuildVersionPatch;]$mavenBuildVersionPatch"

这个例子将会把我们现有的补丁号加1。

这并不会在任务结束时保存变量,如果需要的话,你仍然需要使用另一个PowerShell脚本来完成保存。


0

我认为OP是询问发布而不是构建管道,后者似乎不提供此支持。 - wolfyuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接