【问题标题】:Trigger a YAML pipeline in Azure Devop在 Azure Devop 中触发 YAML 管道
【发布时间】:2020-08-15 21:33:15
【问题描述】:

我是 Azure Devops 中 YAML 构建管道的新手,我正试图围绕触发器功能展开思考。困扰我的是,我想在不同的分支上使用不同的触发器,但我想使用相同的管道。

假设我想要

  1. 在 master 分支上的所有签入上构建,这应该部署到服务器上
  2. 每天晚上我都想构建开发分支并将其部署到另一台服务器

我很困惑,因为 yaml 文件也被签入了 Git。我读到如果你已经安排了触发器,你也不能有 CI 触发器。

我需要有两个 .yml 文件吗?一个定义每个?重复所有步骤似乎并不酷

或者我应该在每个分支中使用不同版本的同一文件?这不会在某个时候合并吗?

额外问题:如果您在 Developemt 分支上推送构建管道并在 master 上触发会怎样? (哎呀我头晕了)

【问题讨论】:

  • 这个问题怎么样?下面的答案是否解决了您的问题,如果没有,请告诉我有关此问题的最新信息吗?
  • 我的额外问题更像是:您是否想在不同的分支中保留不同版本的构建管道?我的意思是,如果我想在每次推送开发时构建开发分支,是否可以在 yaml 文件的主分支版本中定义此触发器?
  • 这个问题有什么更新吗?你解决了这个问题吗?如果没有,请告诉我有关此问题的最新信息吗?

标签: azure-devops azure-pipelines azure-pipelines-release-pipeline


【解决方案1】:

您告诉您不能有计划的触发器和 CI 触发器,但事实并非如此。请查看文档here

如果您只想使用计划的触发器来运行您的管道,您可以 必须通过指定 pr 来禁用 PR 和持续集成触发器: none 和 trigger: none 在您的 YAML 文件中。如果你使用的是 Azure Repos Git、PR 构建是使用分支策略配置的,必须禁用 在那里。

所以你有两个选择:

  1. 将所有内容保存在一个 YAML 文件中,并检查哪个分支或构建是如何触发条件以将部署到适当的服务器
  2. 您可以有两个构建,但为了避免重复,您可以将常用内容提取到模板并在构建定义中重复使用(因此实际上在这种情况下,您将拥有 3 个 yaml 文件)。

几个例子:

  • 您只想为 master 分支运行作业:
jobs:
- job: A
  steps:
  - script: echo hello

- job: B
  dependsOn: A
  condition: and(succeeded(), eq(variables['build.sourceBranch'], 'refs/heads/master'))
  steps:
  - script: echo this only runs for master
  • 您想要提取常用步骤并在构建定义中重复使用它们

常用步骤:

# File: simple-param.yml
parameters:
- name: yesNo # name of the parameter; required
  type: boolean # data type of the parameter; required
  default: false

steps:
- script: echo ${{ parameters.yesNo }}

构建定义:

# File: azure-pipelines.yml
trigger:
- master

extends:
  template: simple-param.yml
  parameters:
      yesNo: false # set to a non-boolean value to have the build fail

您可以阅读the documentation 中的模板或查看我的blog post 中的示例。

如果您想拥有经典的发布管道,您需要定义两个发布管道并触发特定分支。

总而言之:您可以做自己想做的事,而且实现这一目标的方法不止一种。我个人的建议是使用带有模板的单独管道,因为它使构建定义比条件更清晰,以检查哪个分支或如何触发构建。

在这个变量Build.Reason 中,你可以检查你的分支是如何被触发的:

  • 手动:用户手动将构建排队。
  • IndividualCI:由 Git 推送或 TFVC 签入触发的持续集成 (CI)。
  • BatchedCI:由 Git 推送或 TFVC 签入触发的持续集成 (CI),并且选择了批量更改。
  • 计划:计划的触发器。 ValidateShelveset:用户手动将 构建特定的 TFVC 搁置集。
  • CheckInShelveset:门控签入触发器。
  • PullRequest:构建是由需要构建的 Git 分支策略触发的。
  • BuildCompletion:构建由另一个构建触发。
  • ResourceTrigger:构建是由资源触发器触发的。

然后您可以在条件中使用此变量。欲了解更多信息,请转至here

关闭这个,请注意有一种特殊的job 称为deployment 用于部署。如果您打算使用 yaml 管道部署应用程序,请考虑使用它。

对于您的额外问题:您可以覆盖您构建的设置。我的意思是你可以有 master 和只有 master 分支的触发器。但是您仍然可以为其他分支(例如开发分支)运行构建(例如通过手动运行)。那会发生什么?构建将为新定义的分支运行。最后,这是构建定义,触发器只是控制自动构建执行。

【讨论】:

  • 我想我在你的回答 no1 中找到了我的方式。在构建管道中,我将在开发和主提交上触发新构建。然后我有 2 个发布管道。一个用于开发,每晚按计划触发。每次有新版本时都会触发第二台服务器的广告。希望这有效
【解决方案2】:

我需要有两个 .yml 文件吗?一个定义每个?重复所有步骤似乎并不酷

经过一段时间的研究,我个人建议你最好使用两个不同构建管道的.yml文件。

直接的问题是master分支和development分支上的代码没有实时同步。当两个分支上的代码不同时,构建的结果是不同的。如果它们在同一个管道中,我们需要手动检查构建失败时错误来自哪个分支。这是一件很痛苦的事情。

另一个深层问题是我们可以在一个yaml文件中定义CI triggerScheduled trigger,比如:

trigger: 
 branches:
    include:
      - master


schedules:
- cron: "* 10 * * *"
  always: true
  displayName: Daily midnight build (UTC 22:00)
  branches:
    include:
     - Development

要实现这一点,我们需要在 Development 分支上设置这个 yaml。如果我们更改 master 分支中的任何代码,它将触发此管道。 但是,它只在Development 分支上构建代码,它不包含主控中更改的代码。所以这个 CI 触发器将毫无意义。

我应该在每个分支中使用不同版本的同一文件吗?惯于 这会在某个时候合并吗?

个人建议你最好使用不同名称的不同yaml文件。就像你说的,相同的文件在以后的分支合并中容易出现不必要的风险。

我的额外问题更像是:你是否应该保持不同 不同分支中构建管道的版本?我的意思是如果我想要 每次我推动开发时都建立开发分支可以触发吗 在主分支版本的yaml文件中定义?

答案是肯定的。您可以在 yaml 文件的 ma​​ster 分支版本中使用简单的语法设置 CI 触发器:

trigger: 
 branches:
    include:
      - master
      - Development

有了这个设置,每次推送到develop分支都会触发一个定义在主分支版本的yaml文件中的构建。

注意:对于你的额外问题,如果我们在上面设置 CI 触发器,管道将由于在 dev 分支上的持续提交而触发构建。有时我们只是修改一个自述文件,我们不希望这样的修改触发不必要的构建,解决此类问题的最佳方法是使用PR trigger

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    相关资源
    最近更新 更多