从另一个Azure DevOps流水线触发流水线

29

我在Azure DevOps中遇到了从另一个管道触发管道的问题。我有一个CI管道,希望在主分支上CI通过后触发一个Deploy管道。这在技术上似乎是可能的,但文档不清楚。

我看到了以下内容:

# this is being defined in app-ci pipeline
resources:
  pipelines:
  - pipeline: securitylib
    source: security-lib-ci
    trigger: 
      branches:
      - releases/*
      - master

但不清楚是放在触发管道(在我的情况下是CI管道)还是触发的管道(在我的情况下是部署管道)。

而且不清楚pipelinesource是什么意思,以及我如何找到这些变量?它们都是管道名称吗?我尝试了各种排列组合,但似乎没有任何效果。


我的回答有帮到你吗?它是否回答了你的所有问题...如果是的话,请接受它 :) - ccoutinho
如果您能为社区做出贡献并将我的解决方案标记为有效,那就太棒了,@Pezholio。因为它明确回答了您的问题。SO不仅仅是提问和得到答案... - ccoutinho
4个回答

34

编辑2

微软最终改善了他们有关YAML中管道触发器的文档!这是链接

编辑

在撰写答案后,Microsoft提出了另一种解决方案,通过使用经典管道上的构建完成触发器来解决此问题。可以在此处找到其解决方案。



如果不从触发管道发布工件,则不会触发触发的管道。

此类触发器的使用存在非常大的限制。需要更改“depends”管道中的“defaultBranch for manual and scheduled builds”到工作分支。否则它不会在“source”管道执行结束时启动。所以,假设您正在“feature”分支上工作,并且“defaultBranch”设置为“feature”。您提交代码,一切都将按预期运行:源管道启动,并在其结束时触发“depends”管道。一切顺利!但是当您合并到“master”时,如果您不更改“defaultBranch”,则“depends”管道不会在“source”管道执行结束时启动。我将在答案结尾解释如何更改“defaultBranch”。


如何设置管道触发器

在一个最小化的项目上,我成功运行了此项操作。这里您可以找到代码,这里是Azure DevOps上的项目。我将尝试为您提供指南并回答您在帖子中提出的问题。

我将称触发管道为“depends”管道,称触发器管道为“source”管道。

在“source”管道上,除了发布工件外,不需要做任何事情。如果您不从“source”管道发布工件,则不会起作用。下面是我使用的虚拟“source”管道代码。我希望它在“master”分支上触发,并确保在结束时发布工件。

trigger:
  branches:
    include: # branch names which will trigger a build
    - master
pr: none

steps:
  # required to cause pipeline triggering downstream
  - task: CopyFiles@2
    inputs:
      contents: $(System.DefaultWorkingDirectory)/**/*.yml
      targetFolder: $(Build.ArtifactStagingDirectory)
  - task: PublishBuildArtifacts@1
    inputs:
      pathtoPublish: $(Build.ArtifactStagingDirectory)
      artifactName: dummy-$(Build.BuildId)
在下面的代码中,我必须禁用CI和PR触发器才能运行depends管道(代码如下)。否则,当我提交到这个仓库时,会触发CI触发器,然后在source管道执行结束之前会被触发。我的代码前两行实现了这一点。接下来,我想让名为source的管道(这是下面YAML中的source属性)在名为Pipelining的项目中(YAML中的project属性)更新master分支时触发当前(depends)管道。
trigger: none
pr: none
resources:
  pipelines:
    - pipeline: source
      project: Pipelining
      source: source
      trigger: 
        branches:
          include:
          - master
steps:
  - checkout: none
  - script: echo 'triggered depends'

是否合理?在Azure DevOps中,您的项目名称与YAML“depends”管道代码中的property匹配非常重要。对我来说,它是Pipelining

enter image description here

以及YAML“depends”管道代码中的source属性。

enter image description here


更改default分支

为了更改defaultBranch,因为上面提到的问题,您应该编辑管道(在本例中是depends管道),然后在右上角的三个点中选择Triggers。然后选择YAML选项卡,您将进入下面图片所示的屏幕,在那里您可以设置工作分支。

enter image description here


1
对我来说,即使不发布构件,它也可以正常工作。 - Markus Hartmair
1
@MyName 我以前没有做过这个,但我认为你需要声明它们全部。 - ccoutinho
1
我fork了你的repo,并使用现有的Azure DevOps YAML文件创建了两个流水线,一个用于源代码,另一个用于依赖项,并确保默认分支设置为master。然后手动运行了源代码流水线,但它没有触发依赖项。如果您能提供其他人如何在自己的环境中重现此问题的步骤,那将非常有用。 对我来说,如果不添加构建完成触发器(通过转到触发器,而不是在YAML文件中),这是无法正常工作的。 - masih
但是我无法仅通过依赖yaml文件来触发依赖项完成源代码的操作,正如Microsoft在此处所述:https://learn.microsoft.com/en-us/azure/devops/pipelines/process/pipeline-triggers?view=azure-devops。对我来说,这个Microsoft提供的功能似乎只适用于过滤传入的触发器(在这种情况下,将通过UI而不是yaml文件设置构建完成触发器)。 - masih
嗨@masih!我认为微软可能引入了一个错误,所以我在我的演示存储库中尝试了一下,没有任何更改,一切都像魅力一样工作。我建议你从头开始重新做一遍,你可能错过了什么!请查看Azure DevOps项目以确认:https://dev.azure.com/Coutinhos/Pipelining手动触发源管道和提交新更改到主分支都会触发依赖管道。 - ccoutinho
显示剩余8条评论

2
我找到了以下内容:
  • 在源流水线中,我不需要创建工件

  • 在依赖流水线中,如果我想在源分支的任何提交后构建,我可以使用以下方法使其工作:

    trigger: none
    pr: none
    resources:
          pipelines:
          - pipeline: 'depends'
            source: 'common-gulp-trigger'
            trigger: true

2
上述的yaml管道触发器应该在被触发的管道(部署管道)中定义。 - pipeline: string 这里的字符串是您为此管道资源指定的标识符。它可以是任何字符串。 source: string 这里的字符串是触发管道(您的CI管道)的定义名称。
下面的yaml来自管道资源文档。
resources:
  pipelines:
  - pipeline: string  # identifier for the pipeline resource
    project:  string # project for the build pipeline; optional input for current project
    source: string  # source pipeline definition name
    branch: string  # branch to pick the artifact, optional; defaults to all branches
    version: string # pipeline run number to pick artifact, optional; defaults to last successfully completed run
    trigger:     # optional; triggers are not enabled by default.
      branches:
        include: [string] # branches to consider the trigger events, optional; defaults to all branches.
        exclude: [string] # branches to discard the trigger events, optional; defaults to none.
选项:您还可以从Ui页面设置管道触发器。进入触发的yaml管道(部署管道)的编辑页面,单击3个点并选择触发器

enter image description here

转到触发器-->构建完成并点击添加-->选择您的触发管道(CI管道)

enter image description here

更新:

我看到azure-deploy.yml中的管道资源定义如下。

resources:
  pipelines:
  - pipeline: 'Deploy to Development'
    source: 'DFE-Digital.dfe-teachers-payment-service'
  trigger:
    branches:
      include:
      - "master"
      - "release-stuff"

请尝试将触发器(trigger)元素的缩进方式与源(source)元素相同。请参考以下示例:

    resources:
      pipelines:
      - pipeline: 'Deploy to Development'
        source: 'DFE-Digital.dfe-teachers-payment-service'
        trigger:
          branches:
            include:
            - "master"
            - "release-stuff"

1
谢谢,但这对我仍然没有用(我宁愿不尝试UI选项,因为我更喜欢通过代码记录所有内容)。我的CI管道名为DFE-Digital.dfe-teachers-payment-service,我的部署管道名为Deploy to Development,因此我将pipeline变量设置为Deploy to Development,将source变量设置为DFE-Digital.dfe-teachers-payment-service。我期望当CI完成时,部署管道会启动,但是什么也没有发生。 - Pezholio
我看到你的 azure-deploy.yml 文件中触发器元素存在缩进错误,请检查上面的更新。 - Levi Lu-MSFT
你是否在 Azure DevOps 中创建了一个 YAML azure-deploy.yml 的管道?它需要被添加为 Azure DevOps 管道中的一个管道。 - Levi Lu-MSFT
我复制了azure-deploy.yml中的内容并创建了一个测试管道。它没有重现上述错误。您能分享一下您在Azure DevOps上创建的管道吗? - Levi Lu-MSFT
这是一个私有管道,所以恐怕我不能这样做。 - Pezholio
显示剩余3条评论

2

我猜你现在不是在主分支上工作,对吧?我之前也遇到过同样的问题。但是在阅读了MS文档中的触发器默认分支部分后,我明白了原因。默认情况下,触发器只会检查主分支的yaml文件。这意味着流水线只会由主分支yaml文件中触发器定义触发。

因此,在其他分支(非主分支)的yaml文件的触发器部分添加任何分支都不会激活触发器。您需要更改流水线以查看当前分支的yaml文件,而不是主分支。只需按照文档的说明更改默认触发器分支即可使其正常工作。

一旦将您的工作合并到主分支中,您可能需要将默认触发器分支更改回主分支。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接