【问题标题】:Triggering an Azure Devops pipeline from another pipeline从另一个管道触发 Azure Devops 管道
【发布时间】:2020-03-11 19:50:10
【问题描述】:

我在从 Azure DevOps 中的另一个管道触发管道时遇到问题。我有一个 CI 管道,我想在 CI 通过主分支时触发一个部署管道。这似乎技术上是可能的,但documentation 不清楚。

我看到以下内容:

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

但尚不清楚 a) 这是否进入触发管道(在我的情况下是 CI 管道)或触发管道(在我的情况下是部署管道)。

还不清楚pipelinesource 指的是什么,以及我如何找出这些变量?它们都是管道的名称吗?我尝试了各种不同的排列,但似乎没有任何效果。

【问题讨论】:

  • 我的回答对您有帮助吗?它确实回答了你所有的问题......如果是这样,请接受它:)
  • 如果您愿意为社区@Pezholio 做出贡献并将我的解决方案标记为有效,那将非常酷,因为它清楚地回答了您的查询。 SO不仅仅是提出问题并得到答案作为回报......

标签: azure azure-devops azure-pipelines


【解决方案1】:

编辑

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



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

此外,使用这些类型的触发器有很大的限制。需要将depends管道中的defaultBranch for manual and scheduled builds更改为工作分支。否则它不会在source 管道执行结束时启动。因此,假设您正在处理feature 分支,并且defaultBranch 设置为feature。你提交你的代码,一切都会按预期运行:source 管道启动,最后,depends 管道将被触发。都好!但是当你合并到master时,如果你不改变defaultBranchdepends管道不会在source管道结束时被触发。我在答案末尾解释了如何更改defaultBranch


如何设置管道触发器

我设法在一个简约的项目中启动并运行它。 Here 你可以在 Azure DevOps 上获得代码和 here 项目。我将尝试指导您了解我是如何做到的,并回答您在帖子中提出的问题。

我将触发管道称为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)

depends管道上(代码如下所示),我必须禁用CIPR触发器,否则当我提交到这个repo时,这个管道会被CI触发器触发,然后在source 管道执行结束时。这是由我的代码的前两行完成的。然后我希望名为source 的管道(这是下面YAML 中的source 属性),在名为Pipelining 的项目中(YAML 中的project 属性)将触发当前的(depends)管道当此更新 master 分支时。

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

以及 source 属性,同样在 YAML depends 管道代码中。


更改default 分支

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

【讨论】:

  • 对我来说,它甚至可以在不发布工件的情况下工作
  • 当我设置它时,如果没有这部分 @MarkusHartmair,它对我不起作用。也许微软改进了它:)
  • 当我调试一个类似的管道依赖触发链时,我得到的输出很少,因为被触发的管道在不同的分支(默认分支)上:/azure-pipelines.yml (Line: ...): Unexpected value 'trigger'/azure-pipelines.yml (Line: ...): Unexpected value 'variables'。没有日志没有调试跟踪。希望这对其他人有所帮助。
  • @ccoutinho:非常有帮助,谢谢。关于如何在依赖 yaml 中定义所有/多个源管道的任何想法?我们需要全部定义它们还是有办法定义任何管道?例如。拥有一个 java 默认管道,当任何 java 项目(repo)收到合并时,它会做一些 maven 事情。
  • @MyName 我以前没有这样做过,但我认为您需要将它们全部声明
【解决方案2】:

yaml 管道触发器以上应定义在触发管道(部署管道)中。

- pipeline: string这里的字符串是你给这个管道资源的标识符。它可以是任何字符串。

source: string这里的字符串是触发管道的定义名称(你的CI管道的名称)。

下面的yaml来自文档pipeline resource

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管道(部署管道)的编辑页面,点击3dots并选择Triggers

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

更新:

我看到 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"

【讨论】:

  • 谢谢,但这仍然对我不起作用(我宁愿不尝试 UI 选项,因为我宁愿通过代码记录所有内容)。我的 CI 管道称为DFE-Digital.dfe-teachers-payment-service,我的部署管道称为Deploy to Development,因此我将pipeline 变量设置为Deploy to Development,将source 变量设置为DFE-Digital.dfe-teachers-payment-service。我希望部署管道在 CI 完成后启动,但没有任何反应。
  • 无奈之下,我也试过UI选项,也不管用
  • repo 已经打开,所以你可以在这里查看我的 YAML github.com/DFE-Digital/dfe-teachers-payment-service/blob/…
  • 我看到您的 azure-deploy.yml 中的触发器元素存在缩进错误。请检查以上更新。
  • 您是否在 azure devops 管道中为 yaml azure-deploy.yml 创建了管道。它需要作为管道添加到 azure devops 管道中。
【解决方案3】:

我可能假设您没有在 master 分支上工作,对吧?我以前有同样的问题。但是在我阅读了MS's doc 触发器的默认分支部分之后。我明白为什么。默认情况下,触发器仅检查 master 分支的 yaml 文件。这意味着管道只会被 master 分支的 yaml 文件中的触发器定义触发。

因此,无论您在其他分支(非主分支)的 yaml 文件的 trigger 部分中添加什么分支,tirgger 都不会处于活动状态。您需要更改管道以查看当前分支中的 yaml 文件,而不是 master。只需按照文档的说明,更改默认触发器分支。你会得到它的工作。

将工作合并到 master 后,您可能需要将默认触发器分支更改回 master。

【讨论】:

    【解决方案4】:

    我发现了以下内容:

    • 在源管道中我不需要创建工件

    • 在依赖管道中,如果我想在对源分支的任何提交之后进行构建,我可以让它与这个一起工作:

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

    【讨论】:

      猜你喜欢
      • 2021-01-13
      • 2022-07-01
      • 1970-01-01
      • 2020-04-22
      • 2020-10-13
      • 1970-01-01
      • 2020-04-13
      • 2020-06-14
      • 1970-01-01
      相关资源
      最近更新 更多