【问题标题】:How to update current stage release variable in Azure DevOps Server 2019 using the REST API?如何使用 REST API 更新 Azure DevOps Server 2019 中的当前阶段发布变量?
【发布时间】:2021-02-15 20:22:24
【问题描述】:

我想在阶段运行时更新发布(不是发布定义)范围变量的值,但每次我尝试都会收到以下错误消息。

请问我该怎么做?

##[error]Invoke-RestMethod : {"$id":"1","innerException":null,"message":"VS402898: Stage 'dev' cannot be modified as it is 
in-progress or completed. Changes were detected in the following properties: 
'Variables'","typeName":"Microsoft.VisualStudio.Services.ReleaseManagement.Data.Exceptions.InvalidRequestException, Mic
rosoft.VisualStudio.Services.ReleaseManagement2.Data","typeKey":"InvalidRequestException","errorCode":0,"eventId":3000}
At line:263 char:5

+     Invoke-RestMethod -Uri $url -Method Put -ContentType "application ...

+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebExc 

   eption

    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
2020-11-03T06:45:48.2096034Z ##[error]PowerShell exited with code '1'.

示例脚本:

$url = "{0}{1}/_apis/Release/releases/{2}?api-version=5.0" -f $env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI, $env:SYSTEM_TEAMPROJECTID, $env:RELEASE_RELEASEID

$pipeline = Invoke-RestMethod -Uri $url -Method Get -Headers @{
    Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}

# Update an existing scoped variable named TestVar
# Just for StackOverflow we assume that the currently running stage in Azure DevOps Server
# matches this environment[0] below
$pipeline.environments[0].variables.TestVar.value = "NewValue"

$body = $pipeline | ConvertTo-Json -Depth 99

Invoke-RestMethod -Uri $url -Method Put -Body $body-ContentType "application/json" -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"}

以防万一还有另一种解决方案...我想要实现的是稍后在单独的“替代文件”JSON 转换步骤中使用 PowerShell 脚本的变量输出来填充其中的值Web 应用程序的 appsettings.json 文件。问题是该变量是在一项作业中创建的,并且没有被 Substitute Files 步骤使用,因为我认为它需要是一个发布变量,而不仅仅是任务变量。

【问题讨论】:

    标签: azure-devops azure-pipelines azure-devops-rest-api azure-devops-server-2019


    【解决方案1】:

    根据错误信息VS402898: Stage 'dev' cannot be modified as it is in-progress or completed 和文档描述,您似乎正在使用this REST API。我们只能用它来更新完整版本。

    作为一种解决方法,我们可以在创建发布时更改变量值。

    我的测试步骤:创建一个发布变量->将其命名为测试并将值设置为55->启用选项发布时可设置->添加任务power shell以打印变量test价值

    然后调用其余API创建发布和更新运行时发布变量。

    注意:不会改变发布定义变量。

    API:

    POST https://{instance}/{collection}/{project}/_apis/release/releases?api-version=5.0
    

    请求正文:

    {
      "definitionId": {Release definition ID},
      "artifacts": [
      ],
      "variables": {
        "test": {
          "value": "99"
        }
      }
    }
    

    结果:

    更新1

    您似乎想在代理作业之间传递变量,我们不能在经典模式下这样做,我们可以在 YAML 模式下使用输出变量,请参阅 doc 和 blog 了解更多详细信息。

    示例代码。

    jobs:
    - job: A
      steps:
      - task: MyTask@1  # this step generates the output variable
        name: ProduceVar  # because we're going to depend on it, we need to name the step
    - job: B
      dependsOn: A
      variables:
        # map the output variable from A into this job
        varFromA: $[ dependencies.A.outputs['ProduceVar.MyVar'] ]
      steps:
      - script: echo $(varFromA) # this step uses the mapped-in variable
    

    【讨论】:

    • 不幸的是,设置变量的值并通过 REST API 触发发布在这里不是一个选项。该值是作为其中一个发布步骤的一部分生成的,然后必须在以后的作业中使用。通过额外的测试,我发现如果我添加或更新一个发布范围的变量而不是一个范围变量,它实际上确实让我更新了发布。我现在想知道为什么您不能修改当前正在运行的阶段变量...一种可能的解决方法可能是将变量添加为 Release 变量并使用它来代替...
    • 嗨@Benjamin,您的意思是您将发布变量范围更改为发布而不是阶段,然后您可以在发布运行时更新发布变量并在此发布中使用它?你改剧本了吗?我试过了,但不能和你得到同样的结果。
    • 是的。如果我在 Release 范围内添加一个新变量,它可以让我添加它。现在的问题是,即使我可以在版本中看到新变量,它也没有被工作中的后续步骤使用。我认为这是因为该阶段在启动时对发布阶段的状态进行了快照,并使用了存在的任何值。如果您以任何方式对其进行修改,它在下一阶段/发布之前不会使用这些更改。这对我的用例来说是个问题。
    • 也许我可能需要问一个不同的问题才能以不同的方式解决根本问题......我真正的问题是 Substitute Variables 步骤没有使用更新我的 appsettings.json 文件中的值从以前的作业动态创建的变量。
    • 嗨@Benjamin,是的,我们可以使用 YAML 模式创建发布定义,只需将阶段定义为发布,然后在 yaml 文件中定义发布定义。您可以参考此blog 了解更多详情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多