如何使用 Azure DevOps Service Hooks 收到有关在 YAML 管道中完成的部署的通知?

时间:2021-02-08 20:02:29

标签: azure-devops yaml azure-pipelines azure-devops-rest-api azure-pipelines-yaml

我发布这个问题是为了分享我对此问题的调查,并寻求帮助,以防有人发现有趣的事情。

背景

出于各种目的,我们将 Service Hooks 与经典发布管道一起使用。我们在事件发布部署完成时使用服务挂钩触发器。设置非常简单。

当由 Azure DevOps 触发时,这些事件会存储起来以供外部系统使用。在这个外部系统中,我们使用 Azure DevOps REST API 来检索我们需要的所有信息。

问题

由于 YAML 管道在 GA 中发布,它们正在慢慢取代我们的经典发布管道,我们注意到现有的服务挂钩不再为 YAML 管道触发。

经过一些调查,我发现这些 YAML 管道不会触发现有的发布部署完成事件。 相反,有一个名为 pipelines 的新 publisher,其中包含为 YAML 管道触发的新事件。

您可以使用 REST API 来获取所有这些事件:

GET https://dev.azure.com/{{organization}}/_apis/hooks/publishers/pipelines?api-version=6.1-preview.1

这里只有 2 个事件看起来很有希望满足我们的需求:

  • 运行阶段状态已更改:新阶段已开始,或阶段已转换为取消、取消、失败、部分成功或成功
  • 运行状态已更改:新运行已开始,或运行已转换为取消、取消、失败、部分成功或成功

这些事件针对所有管道触发:YAML、经典构建和发布。

调查这些新事件

现在我发现了一些有趣的事件,我们需要找到一种方法来检测在 YAML 管道(去年于 deployment job 发布)中使用 GA 完成的部署。 我正在挖掘以发现我可以从他们那里得到什么。第一步是使用这些新事件设置新的服务挂钩,运行管道并在事件触发时发送有效负载。

这是来自事件 stage-state-changed-event 的示例负载:

{
    "id": "37f42f2c-3061-4c0a-a0ff-e67d235ecfec",
    "eventType": "ms.vss-pipelines.stage-state-changed-event",
    "publisherId": "pipelines",
    "message": {
        "text": "Run 1.21.027.2 stage DeployStage running.",
        "html": "Run 1.21.027.2 stage <a href=\"https://dev.azure.com/yourorganizationhere/19d42179-19ab-4242-aa1c-3f8e533daaaa/_build/results?buildId=248532\">DeployStage</a> running.",
        "markdown": "Run 1.21.027.2 stage [DeployStage](https://dev.azure.com/yourorganizationhere/19d42179-19ab-4242-aa1c-3f8e533daaaa/_build/results?buildId=248532) running."
    },
    "detailedMessage": {
        "text": "Run 1.21.027.2 stage DeployStage running.",
        "html": "Run 1.21.027.2 stage <a href=\"https://dev.azure.com/yourorganizationhere/19d42179-19ab-4242-aa1c-3f8e533daaaa/_build/results?buildId=248532\">DeployStage</a> running.",
        "markdown": "Run 1.21.027.2 stage [DeployStage](https://dev.azure.com/yourorganizationhere/19d42179-19ab-4242-aa1c-3f8e533daaaa/_build/results?buildId=248532) running."
    },
    "resource": {
        "stage": {
            "_links": {
                "web": {
                    "href": "https://dev.azure.com/yourorganizationhere/19d42179-19ab-4242-aa1c-3f8e533daaaa/_build/results?buildId=248532"
                },
                "pipeline.web": {
                    "href": "https://dev.azure.com/yourorganizationhere/19d42179-19ab-4242-aa1c-3f8e533daaaa/_build/definition?definitionId=1545"
                }
            },
            "id": "6884a131-87da-5381-61f3-d7acc3b91d76",
            "name": "DeployStage",
            "displayName": "DeployStage stage",
            "state": "running"
        },
        "run": {
            "id": 248532,
            "name": "1.21.027.2"
        },
        "pipeline": {
            "url": "https://dev.azure.com/yourorganizationhere/19d42179-19ab-4242-aa1c-3f8e533daaaa/_apis/pipelines/1545?revision=9",
            "id": 1545,
            "revision": 9,
            "name": "Pipeline Definition Name Here",
            "folder": "\\"
        },
        "runId": 248532,
        "stageName": "DeployStage",
        "runUrl": "https://dev.azure.com/yourorganizationhere/19d42179-19ab-4242-aa1c-3f8e533daaaa/_apis/pipelines/1545/runs/248532"
    },
    "resourceVersion": "5.1-preview.1",
    "createdDate": "2021-01-27T09:40:51.0986307Z"
}

如您所见,此有效负载仅包含通用信息。您有阶段名称以及管道 ID 和名称。

下一步,尝试查询 REST API 以获取有关管道、运行或阶段的更多信息。
一个阶段可以包含多个作业,我们对特定类型的作业感兴趣:deployment job

管道端点

Pipelines REST API 端点仍处于预览阶段,您需要使用 6.1-preview.1 版本。

我试图从这些端点获取一些信息:

GET https://dev.azure.com/{organization}/{project}/_apis/pipelines/{pipelineId}?api-version=6.1-preview.1
GET https://dev.azure.com/{organization}/{project}/_apis/pipelines/{pipelineId}/runs/{runId}?api-version=6.1-preview.1
GET https://dev.azure.com/{organization}/{project}/_apis/pipelines/{pipelineId}/runs/{runId}/logs?api-version=6.1-preview.1

我在返回的数据中没有发现任何有用的信息。无法检测触发的事件是否与使用 YAML 管道完成的部署作业相关。

总结

在使用经典管道时,可以很容易地检测到使用 Service Hooks 已完成部署。我没有找到 YAML 管道的等效项。

我错过了什么吗?
或者这是 YAML 管道尚不可用的另一个功能?
知道如何跟踪使用 YAML 管道完成的部署吗?

感谢任何帮助?
感谢您抽出宝贵时间。

1 个答案:

答案 0 :(得分:0)

您是正确的,管道的可用事件类型如下:

  • 运行状态已更改
  • 运行阶段状态已更改
  • 运行阶段等待批准
  • 运行阶段批准已完成

默认情况下,您只能在 YAML 管道中使用服务挂钩检测更改的阶段状态。您可以在部署后添加脚本任务,部署成功后通过脚本中的 API 将消息发送到服务。