Azure DevOps 管道存储库触发器不会触发

时间:2021-07-17 16:01:46

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

上下文

我正在为具有此存储库配置的应用程序创建 CI/CD 配置(同一组织和项目中的每个存储库):

  • 前端存储库 (r1)
  • API 服务存储库 (r2)
  • 基础设施即代码存储库 (r3)

在存储库 r3 中有解决方案的 Azure DevOps Pipelines,每个管道都已针对 develop 分支上的手动和计划触发器进行配置:

  1. 前端 CI 管道 p1
  2. 后端 CI 管道 p2
  3. 部署管道p3

我想要的行为是

  1. Git 在 r1 存储库上提交
  2. repo r3 上的管道 p1 已触发(这将创建工件、应用标记并通知)
  3. 管道 p3 由 p1 完成触发(这将部署工件)

管道 p1 如下所示

trigger: none

resources:
  containers:
    - container: running-image
      image: ubuntu:latest
      options: "-v /usr/bin/sudo:/usr/bin/sudo -v /usr/lib/sudo/libsudo_util.so.0:/usr/lib/sudo/libsudo_util.so.0 -v /usr/lib/sudo/sudoers.so:/usr/lib/sudo/sudoers.so -v /etc/sudoers:/etc/sudoers"
  repositories:
    - repository: frontend
      name: r1
      type: git
      ref: develop
      trigger:
        branches:
          include:
            - develop
          exclude:
            - main

name: $(SourceBranchName)_$(date:yyyyMMdd)$(rev:.r) - Frontend App [CI]

variables:
  - name: imageName
    value: fronted-app
  - name: containerRegistryConnection
    value: apps-registry-connection

pool:
  vmImage: "ubuntu-latest"

stages:
  - stage: Build
    displayName: Build and push
    jobs:
      - job: JobBuild
        displayName: Build job
        container: running-image
        steps:
          - checkout: frontend
            displayName: Checkout Frontend repository
            path: fe
            persistCredentials: true

...

管道p3如下所示

name: $(SourceBranchName)_$(date:yyyyMMdd)$(rev:.r) - App [CD]
trigger: none

resources:
  containers:
    - container: running-image
      image: ubuntu:latest
      options: "-v /usr/bin/sudo:/usr/bin/sudo -v /usr/lib/sudo/libsudo_util.so.0:/usr/lib/sudo/libsudo_util.so.0 -v /usr/lib/sudo/sudoers.so:/usr/lib/sudo/sudoers.so -v /etc/sudoers:/etc/sudoers"
  pipelines:
    - pipeline: app-fe-delivery
      source: "p1"
      trigger:
        stages:
          - Build
        branches:
          include:
            - develop


pool:
  vmImage: "ubuntu-latest"
stages:
  - stage: Delivery
    jobs:
      - job: JobDevelopment
        steps:
          - template: ../templates/template-setup.yaml # Template reference
            parameters:
              serviceDisplayName: ${{ variables.serviceDisplayName }}
              serviceName: ${{ variables.serviceName }}
...

问题

即使按照官方文档中公开的所有规则一步一步来:

  • 管道 p1 永远不会被 r1 存储库中 develop 分支的任何提交触发
  • 即使手动运行流水线p1,流水线p3也不会被触发

备注

  • pipelines YAML reference中所述,触发器默认启用
  • 在同一文档中,如果没有表示branch include filter,则触发器将在所有分支上发生
  • triggers for Checkout Multiple repositories in pipelines 中所述,触发器仅适用于 Azure DevOps 存储库中的存储库
  • 是否可以禁用管道 CI 触发器 (trigger: none) 并让资源的存储库触发器发生
  • 构建代理用户已被授权访问和排队新构建

1 个答案:

答案 0 :(得分:0)

几种可能的解决方案。

首先相信您的问题在于:

trigger: none

这意味着管道只能手动工作。在您引用的文档中:

<块引用>

触发器在所有资源上默认启用。但是,您可以选择覆盖/禁用每个资源的触发器。

The way this is configured all push triggers are disabled

我认为实现您正在尝试的一种可能方法是从 p1p3

中删除 trigger:none

如果我正确阅读了您的问题,您正在尝试在存储库上进行 CI/CD 构建部署。如果是这样,我是否可以建议该场景是否合适(即构建将始终触发部署),然后将这些管道合并为一个,并在部署阶段放置一个 if 语句,类似于:

  - ${{ if eq(variables['Build.SourceBranch'], 'refs/heads/master')}}:

此外,如果部署到多个环境,可以在一行中缩进一个循环:

  - ${{ each environmentNames in parameters.environmentNames }}:

我注意到您已经在使用模板,因此这只是将模板调用从作业移到舞台并使其充当包装器。随时提供反馈。如果这个答案不合适,我可以相应地更新它。