通过 REST 创建 Azure Devops/Pipeline 版本,包括所有元数据,如 buildNumber

Create Azure Devops/Pipeline release including all meta data like buildNumber via REST

我知道 https://docs.microsoft.com/en-us/rest/api/azure/devops/release/releases/create?view=azure-devops-rest-6.0#uri-parameters 并且我可以通过 REST 创建版本,但是...

问题: 这些版本的问题是,通过 REST 触发的版本缺少一些预定义变量,例如 Build.BuildNumber - 或者至少,它们并非在所有范围内都可用。

似乎 Build.BuildNumberpipeline stage 中可用,但在计算 发布名称格式 时丢失了。这意味着,发布名称格式 Release-$(Build.BuildNumber)($(Release.ReleaseId)) 在使用下面的有效负载创建时将以空白 Build.BuildNumber 结尾。

详情:

我的 json 负载

{
  "definitionId": 9,
  "description": "Test Release",
  "artifacts": [
    {
      "alias": "My Build Artifact",
      "instanceReference": {
        "id": "6989",
        "name": null
      }
    }
  ],
  "isDraft": false,
  "reason": "none",
  "manualEnvironments": null
}

虽然 artifacts.instanceReference.id 引用了一个有效的版本(当然有一个 buildNumber)- 所以在发布阶段 Build.BuildNumber 被正确填充。

我通过

发送有效载荷
curl -X POST -u username:redactedPAT -H "Content-Type: application/json" -d @payload.json https://vsrm.dev.azure.com/redactedCompany/redactedProjectId/_apis/release/releases\?api-version\=6.0

问题: 创建一个版本的正确方法是什么,就好像它是通过包含所有元数据的 GUI 创建的一样? 我是否想念以某种方式使用 API 或我是否需要手动设置环境变量才能使其工作(或者甚至通过 variables 以某种方式)。 由于 buildNumber 在舞台上可用,那会不会是 rather/even 一个错误?

发布名称是在编译时评估的,这意味着它是在管道任务执行之前填充的。您可以查看以下解决方法来填充版本名称。

1、您在发布名称格式中定义的$(Build.BuildNumber)变量将检索您传递给artifactsinstanceReference中的name属性请求正文。所以可以将BuildNumber值传给请求体中instanceReference下的name属性。参见 here

{
  ...
  "artifacts": [
    {
      "alias": "My Build Artifact",
      "instanceReference": {
        "id": "6989",
        "name": BuildNumber #set the buildNumber here.
      }
    }
  ],
  ...
}

2,另一种解决方法是使用 logging commands 在脚本任务中更新版本名称。

您可以在发布管道阶段添加脚本任务。并且 运行 下面的日志记录命令在发布管道执行期间更新发布名称。

echo "##vso[release.updatereleasename]Release-$(Build.BuildNumber)($(Release.ReleaseId))"

见下例:

任务执行时。它将使用您想要的格式更新版本名称。