首页 > 解决方案 > 如何在 azure DevOps YAML 管道中发送构建后消息?

问题描述

我正在尝试在 Azure DevOps YAML 管道中完成/失败后发送构建后 Slack 消息。但似乎我找不到合适的条件设置。

基本上,我有三个阶段:测试、构建和通知。

我最后尝试了以下,但dependencies.UnitTest.result返回null,所以没有给我SucceededFailed

我也尝试了很多不同的条件,但都没有奏效。例如,一个普通succeeded()failed()没有依赖关系的,或succeeded('Test')作为阶段级别或succeeded('UnitTest')作为作业级别。

在大多数情况下,即使在测试阶段失败,它们也会发送成功消息,或者作业名称作为参数的语法错误succeeded()failed()

像 Jenkins 这样发送构建后消息的适当条件是什么?

stages:
- stage: Test
  jobs:
  - job: UnitTest
    steps:
    - script: echo UnitTest
    - script: exit 1

- stage: Build
  jobs:
  - job: Build
    steps:
    - script: echo Build

- stage: Notify
  dependsOn:
  - Test
  - Build

  condition: succeededOrFailed()
  jobs:
  - job: Succeed
    condition: eq(dependencies.UnitTest.result, 'Succeeded')
    steps:
    - script: echo Succeed #(slack)

  - job: Fail
    condition: eq(dependencies.UnitTest.result, 'Failed')
    steps:
    - script: echo Fail #(slack)

--- 编辑 ---
MS 支持多阶段确认的作业不能支持 yaml 语法本身。

与预期的原始流程不同,但您可以将成功和失败分为不同的阶段,如下所示。(如果您想为每个作业提供不同的消息,它可能会增加相当多的阶段,只是为了通知..)

...

- stage: Notify_Succeeded
  condition: succeeded()

  jobs:
  - job: Succeed
    steps:
    - script: echo Succeed #(slack)

- stage: Notify_Fail
  condition: failed()
  jobs:
  - job: Fail
    steps:
    - script: echo Fail #(slack)

标签: azure-devopsazure-pipelines

解决方案


您可以指定每个阶段运行的条件。默认情况下,如果一个阶段不依赖于任何其他阶段,或者它所依赖的所有阶段都已完成并成功,则它会运行。

根据运行前一个阶段的状态运行阶段的示例:

stages:
- stage: A

# stage B runs if A fails
- stage: B
  condition: failed()

# stage C runs if B succeeds
- stage: C
  dependsOn:
  - A
  - B
  condition: succeeded('B')

使用自定义条件的示例:

stages:
- stage: A

- stage: B
  condition: and(succeeded(), eq(variables['build.sourceBranch'], 'refs/heads/master'))

注意:您当前无法指定基于前一阶段中设置的输出变量的值运行的阶段。

文档:

https://docs.microsoft.com/en-us/azure/devops/pipelines/process/stages?view=azure-devops&tabs=yaml#conditions


推荐阅读