【问题标题】:Azure devops pipeline - trigger only on another pipeline, NOT commitAzure devops 管道 - 仅在另一个管道上触发,不提交
【发布时间】:2020-04-22 06:50:13
【问题描述】:

要求

因此,Azure DevOps 中有一些新功能允许管道触发其他管道,并在此处记录:https://docs.microsoft.com/en-us/azure/devops/pipelines/build/triggers?view=azure-devops&tabs=yaml#pipeline-triggers-1 听起来不错,但我无法获得所需的行为。我想在同一个存储库中有 2 个管道:

  • 流水线 A:仅由其自身 repo 之外的多个其他流水线触发,但在同一个项目中。由于被触发,它会更改自己的 repo,从而触发管道 B。
  • 管道 B:仅由对其自己的存储库的更改触发,并且在触发时继续执行它需要做的任何事情

流水线 A 语法

resources:
    pipelines:
    - pipeline: database
      source: database
      trigger:
        branches:
        - develop
        - release/*
        # The stages filter should work, according to: https://docs.microsoft.com/en-us/azure/devops/pipelines/build/triggers?view=azure-devops&tabs=yaml
        # However, this error occurs when specifying: /azure-pipelines.yml (Line: 8, Col: 15): Stage filters in pipeline resource database is not supported.
        #stages:
        #- Build
    - pipeline: auth
      source: auth
      trigger:
        branches:
        - develop
        - release/*
    - pipeline: api
      source: api
      trigger:
        branches:
        - develop
        - release/*
    - pipeline: web
      source: web
      trigger:
        branches:
        - develop
        - release/*
  ... multiple triggers - 9 in total
stages:
  ...

当前行为

管道 A 不会由任何其他管道触发,而只会在其自己的存储库发生更改时触发。由于它无论如何都会对自己的 repo 进行更改,因此它会在无限循环中触发自己。

问题/意见

  • 管道 A 的语法是否正确?
  • 来自文档:“但是,如果两个管道使用不同的存储库,则触发的管道将使用其默认分支中最新版本的代码。”我假设这意味着来自默认分支的 yaml 管道将被激活。我们真的有那么一点点控制权吗?在管道声明中指定目标分支会更好。
  • 是否有可能以某种方式获取触发管道的源分支?
  • 为什么阶段过滤器不按文档说明工作?
  • 在管道 A 中,为了停止循环,我尝试使用 $(Build.TriggeredBy.DefinitionId) 检查它是否与 $(System.DefinitionId) 相同,如果是则跳过构建步骤,但 $(Build. TriggeredBy.DefinitionId) 没有值
  • 如果我不能让它工作,我倾向于让其他管道触发管道 A。

发现

  • trigger: none 添加到管道 A 的顶部会阻止它在对其存储库进行提交时运行,它目前根本不运行!
  • 在单独帐户中的简化管道场景中,我设法使触发的构建工作,在同一个 repo 中有 2 个管道,并发现:
    • 执行的 yaml 管道文件与触发管道上的提交位于同一分支
    • 检出的代码也来自与触发管道上的提交相同的分支
    • 从 GUI 手动执行管道不会触发相关管道
    • 从属管道在第一次启动时立即被触发并排队
    • 我无法让分支排除工作:无论排除条款如何,都会触发管道
  • 在单独的帐户中运行简化的管道场景,在仓库 C 中使用管道 A,在仓库 D 中使用依赖管道 B(同一项目),我无法让管道 A 触发管道 B,所以远(我原来的场景)
  • 非常高兴 :-) 有一个 azure devops 命令行扩展,它获得了管道支持并允许您触发管道:

【问题讨论】:

  • 6 个问题合二为一,哇。我看不出你的语法有什么问题。管道名称错误?不知道
  • @vipes 感谢分享。我正在为类似的事情苦苦挣扎。你做了什么: - 当其他管道完成时只运行管道 A 一次?
  • 抱歉@wolszakp - 我没有收到您的评论通知。根据我在下面的回答,我创建了一个可重用的 yaml 模板,该模板使用 Azure CLI 触发管道 A,并在处理结束时由许多其他管道调用。一旦管道 A 被触发,它就会更新它所包含的 repo,因为提交而触发管道 B。

标签: azure-devops azure-pipelines build-triggers


【解决方案1】:

工作解决方案

因为我的所有构建都集中在一个管道模板中,所以我更改了此模板以在成功发布工件时触发我的管道 A。这是管道触发代码,除了最后几个步骤之外,几乎是逐字逐句地来自 (https://docs.microsoft.com/en-us/azure/devops/cli/azure-devops-cli-in-yaml?view=azure-devops):

# Updating the python version available on the linux agent
    - task: UsePythonVersion@0
      displayName: Upgrade build agent Python version
      inputs:
        versionSpec: '3.x'
        architecture: 'x64'

    # Updating pip to latest
    - script: python -m pip install --upgrade pip
      displayName: 'Upgrade pip'

    # Updating to latest Azure CLI version.
    - script: pip install --pre azure-cli --extra-index-url https://azurecliprod.blob.core.windows.net/edge
      displayName: 'Upgrade azure cli'

    - script: az --version
      displayName: 'Show Azure CLI version'

    - script: az extension add -n azure-devops
      displayName: 'Install Azure DevOps Extension'

    - script: echo ${AZURE_DEVOPS_CLI_PAT} | az devops login
      env:
        AZURE_DEVOPS_CLI_PAT: $(System.AccessToken)
      displayName: 'Login Azure DevOps Extension'

    - script: az devops configure --defaults organization=$(System.TeamFoundationCollectionUri) project="$(System.TeamProject)" --use-git-aliases true
      displayName: 'Set default Azure DevOps organization and project'

    - script: |
        set -euo pipefail
        if [[ "$(Build.SourceBranch)" == *"/release/"* ]]; then
          branchName="master"
        else
          branchName="develop"
        fi
        commandLine="--branch $branchName --name <YourPipelineName>"
        echo "Triggering release creation with: az pipelines run $commandLine"
        az pipelines run $commandLine
      displayName: Trigger release build for internal (develop) and external (release) builds

注意事项

  • 酌情更改&lt;YourPipelineName&gt;,您的分支名称处理将与我的不同
  • Azure CLI 升级需要 1.5 分钟,因此如果您想显着加快升级速度,只需删除前 3 个步骤
  • 我宁愿触发管道声明自己的触发器,因为如果您能看到导致它触发的原因,维护起来会更容易,但是嘿嘿

【讨论】:

  • 非常感谢您在此处分享的解决方案。您可以接受您的答案,然后其他人可以直接知道这是一个工作答案。
  • 谢谢梅林,会的。是否有任何理由不能由其自己的回购之外的其他管道触发管道 - 这是一个错误还是我错过了什么?另外,舞台过滤器不起作用怎么办?
  • 我们最近没有收到任何错误报告,我可以很好地工作。将触发另一个管道的先前管道是否具有生成工件的步骤?如果否,则管道触发器将不可用。
【解决方案2】:

我遇到了同样的问题。 我在这里找到了解决方案: https://developercommunity.visualstudio.com/content/problem/864701/pipeline-trigger-not-working-as-expressed-in-docum.html?childToView=897210#comment-897210

在快捷方式中,当我将依赖管道中的 defaultBranch 更改为我的工作分支时 触发开始工作。: 你需要去:

Edit -&gt; Triggers (3 dots in right upper corner) -&gt; YAML -&gt; Get sources -&gt; Default branch for manual and scheduled builds

在那里放置一个您的 yaml 管道所在的分支。

【讨论】:

  • 这对我有用...所以,我可以永远尝试 YAML 文件中的所有可能组合,因为我在那里选择的默认分支是master,所以它永远不会工作,而我显然不要在master 工作!这是否意味着这仅适用于一个分支而无需“人工干预”?
  • 我已经在master 进行了测试,但它不起作用......难以置信!你如何克服这个问题?
【解决方案3】:

如果您没有从触发管道发布工件,则它不会触发已触发的管道。我已经创建了一个可行的最小产品,并且我已经在answer 中解释了这个过程。

【讨论】:

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