【问题标题】:Azure Pipelines Resource Pipeline should execute on build pipeline completion but executes on code change insteadAzure Pipelines 资源管道应在构建管道完成时执行,但在代码更改时执行
【发布时间】:2020-02-07 19:39:57
【问题描述】:

我正在尝试在构建管道完成后触发部署管道,以便我可以让管道的状态保持独立(当所有内容分阶段位于同一管道中时,当前 UI 会呈现令人困惑的状态值)。部署管道具有documentation 中概述的资源定义,它指的是构建管道。构建管道名为“BuildTheApp”,位于管道根文件夹中。

构建管道的资源依赖在部署管道中定义如下,没有定义其他触发器,管道定义中也没有对yaml触发器的覆盖:

resources:
  pipelines:
  - pipeline: BuildPipeline
    source: BuildTheApp
    trigger: true

pipeline: BuildPipeline 只是在部署管道中使用的名称。
source: BuildTheApp 指的是构建管道的名称。
我知道它正确地选择了构建管道的名称,因为当我在另一个文件夹中创建另一个名为 BuildTheApp 的管道时,部署管道给出了一个关于匹配多个潜在定义的错误。

在构建管道运行后,部署管道永远不会执行。构建管道是由于其分支更改触发器而执行还是手动执行都没有关系。 部署管道始终在分支更改时执行,与构建管道同时执行。 在部署管道中,echo 'Build reason $(Build.Reason)' 结果为Build reason IndividualCI,证明管道是通过 CI 触发器执行的。

我不知道为什么部署管道在没有任何触发器的情况下执行代码更改。默认行为应该是不执行。当然,它也不会在构建管道完成时执行。

在构建和部署管道中都使用模板文件来减少冗余代码。

【问题讨论】:

    标签: azure-pipelines


    【解决方案1】:

    Azure Pipelines 资源管道应在构建管道完成时执行,但在代码更改时执行

    这种行为是设计的,不是错误。目前没有办法修复。

    您可以从文档Pipeline triggers获取详细状态:

    当您同时指定 CI 触发器和管道触发器时,您可以 每次(a)对 存储库和(b)上游管道的运行完成。 考虑一个依赖于 A 的管道 B 的示例。让我们也 假设这两个管道都使用相同的存储库 源代码,并且它们都配置了 CI 触发器。 当您将更新推送到存储库时,则:

    • 开始新的 A 运行。

    • 同时,开始新的 B 运行。此运行将消耗 A 先前生成的工件。

    • A 完成后,将触发 B 的另一次运行。

    为防止在此示例中触发两次 B 运行,您必须删除 它的 CI 触发器或管道触发器。

    当我测试它时,它按预期工作。你得到Build reason的原因是IndividualCI

    如果您想在构建管道完成后触发部署管道,您可以使用dependsOn 将强制执行顺序作业构建:

    jobs:
    - job: Debug
      steps:
      - script: echo hello from the Debug build
    - job: Release
      dependsOn: Debug
      steps:
      - script: echo hello from the Release build
    

    查看官方文档Dependencies

    希望这会有所帮助。

    【讨论】:

    • 是的,我阅读了该文档,但它指出“如果您同时指定 CI 和管道触发器”。据我所知,我只指定了一个管道触发器,而不是 CI 触发器。 CI 正在触发,但管道未触发。我是否完全误解了管道触发器文档?您不使用管道资源导致一个管道在另一个管道完成后执行? “要在完成另一个管道时触发管道,请将后者指定为管道资源。” DependsOn 不是仅在 within 单个管道中使用吗? (感谢您回答问题,顺便说一句!)
    • @WilliamRandlett, That you do not use a pipeline resource to cause one pipeline to execute after another completes? 不,我对其进行了测试,它在我这边运行良好,因此,如果您手动或 CI 触发管道 BuildTheApp,则应该触发管道。如果它不适合你,你可以查看这张票以获取一些信息,如果你有同样的问题:github.com/MicrosoftDocs/vsts-docs/issues/6753
    • 是的 - github 问题准确地描述了我所看到的行为。谢谢!
    • 解决问题的方法是更改​​构建定义的默认分支,如 wolszakp 在github issue 上的 cmets 中所述:“您需要转到:编辑 -> 触发器(3 个点)在右上角)-> YAML -> 获取源 -> 手动和计划构建的默认分支在那里放置一个分支,您正在使用您的 yaml 管道。”
    • 此外,您必须“覆盖 YAML 持续集成触发器”和“禁用持续集成”。当分支更改时,这会阻止管道运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 2020-02-17
    • 2022-11-03
    • 2022-08-14
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多