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

Posted

技术标签:

【中文标题】如何从发布任务修改 Azure DevOps 发布定义变量?【英文标题】:How to modify Azure DevOps release definition variable from a release task? 【发布时间】:2019-04-02 05:08:13 【问题描述】:

从 AzureDevOps 发布任务让密钥轮换以适用于 azure 存储帐户的最简单方法是什么?目前的计划是在发布后重新生成旧密钥以使其失效,并拥有一个可用于下一次部署的新密钥。但要让它发挥作用,似乎我至少需要将要使用的密钥名称存储在发布变量中。

我查看了他的日志记录任务 (https://github.com/Microsoft/azure-pipelines-tasks/blob/master/docs/authoring/commands.md),但这只会更改当前版本中的值,不会修改版本定义。

【问题讨论】:

有效,但只有在发布管道中的所有阶段都完成后才会生效。管道中的预部署脚本获取定义变量的旧值。 【参考方案1】:

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

    转到Agent Phase 并选择Allow Scripts to Access OAuth Token。见Use the OAuth token to access the REST API 授予Project Collection Build Service (xxx)帐号编辑权限 释放管道权限。 (选择发布管道-->...-->Security-->Edit release definition设置为Allow) 在发布管道中添加 PowerShell 任务

    运行内联脚本:(更新下面示例中变量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 错误请求。关于这里可能有什么问题或如何找出问题的任何建议?对于此版本定义,即使发布原始响应而不修改它也会失败... @Andy Li-MSFT,上述解决方案在所有任务都在阶段完成时的效果。我们有没有其他方法可以在同一阶段将值从一个代理传递给另一个代理? 当我尝试这种方法时,我收到错误“##[error]在此对象上找不到属性'值'。验证该属性是否存在并且可以设置。”。我希望我们可以使用这个脚本设置预定义的变量。我在上面的脚本中使用了相同的变量“v1030”。不知道我错过了什么......!【参考方案2】:

这是一个更清洁、更好的解决方案,它还允许同时触发多个构建。 https://tsuyoshiushio.medium.com/how-to-pass-variables-with-pipeline-trigger-in-azure-pipeline-5771c5f18f91

基本上,您的触发构建会产生工件,您的触发构建会读取这些工件并转换为变量。

仍然不是很好,但总比没有好,比设置静态全局变量组的 REST 调用要好。

【讨论】:

以上是关于如何从发布任务修改 Azure DevOps 发布定义变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Azure DevOps DACPAC 部署中获取漂移报告?

如何在 Azure DevOps 中导入任务组

如何从 Azure DevOps 中的文件夹(不是 zip)部署 WebApp

具有代码质量的 Azure Devops 拉取请求修饰

如何在 Azure DevOps 中重命名任务组

如何从 azure devops 上的图表 yaml 文件中获取 appVersion?