【问题标题】:Using commit triggers to trigger Azure Devops Pipeline in the YAML File在 YAML 文件中使用提交触发器触发 Azure Devops Pipeline
【发布时间】:2021-04-26 14:17:19
【问题描述】:

我对 Devops 中的 Pipline 触发器有疑问。 我和我的团队正在使用 Azure Devops 开发软件。 我们使用分支特定触发器,仅在主分支中启动管道。 YAML 文件中的其他分支将被忽略。

我的问题的第一部分是,我们不知道如何通过 Git 工具中的提交消息触发管道。 例如:“我们在与 Master 分支不同的分支中工作 --> 没有管道正在运行。但我们只想触发此分支中的管道进行特定测试。我们的方法是在其中插入特定命令触发管道的提交文本。”

我的第二个问题是,是否可以在一个 YAML 文件的不同分支中运行不同阶段。 这里再举一个例子:“在我们不同的分支中,我们只想在每次推送时运行我们的单元测试。在我们的主分支中,我们想要运行我们的单元测试,然后,我们想要构建我们的应用程序。

到目前为止,我们在每次推送时都启动了管道,并且每次都构建了一个新映像。但我们不希望这样,因为有些推送不起作用,我们只是推送它。我们想决定管道何时运行以及哪个阶段正在运行。

我希望你能理解我的问题。如有其他问题,请在此处发表评论。 谢谢

【问题讨论】:

标签: azure azure-devops yaml azure-pipelines


【解决方案1】:

问题一:

您可以考虑使用tag triggers 来执行此操作。这是一个例子:

trigger:
  branches:
    include:
    - master
  tags:
    include:
    - test.*

那么当在master分支上工作或者commit标签为test.*时会触发管道。

问题 2:

您可以使用条件。这是一个例子:

condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master'))

将条件添加到您的阶段,然后阶段将仅由master 分支触发。

问题 3:

到目前为止,我们在每次推送时都启动了管道,并且每次都构建了一个新映像。但我们不希望这样,因为有些推送不起作用,我们只是推送它。

你可以skip CI for individual commits

只需在提交消息或描述中包含[skip ci] HEAD 提交和 Azure Pipelines 将跳过运行 CI。

更新 1:

对于问题1,test.*表示以test.开头的标签,如test.1test.0.1等。您可以将test.* 更改为您想要的任何内容。

关于你遇到的问题,你不能直接创建一个名为test.*的标签,因为标签名称不能包含*

为避免混淆,需要为提交创建一个标签来触发标签CI,而不是直接写在提交文本中。

想法

在提交文本中插入特定命令以触发管道。

我认为目前不支持,标签触发器是一种替代方法。

点击this document了解git标签的详细信息。

更新 2:

通过master 分支或1620-to-PipelineTrigger 分支触发舞台:

condition: or(eq(variables['Build.SourceBranch'], 'refs/heads/main'), eq(variables['Build.SourceBranch'], 'refs/heads/1620-to-PipelineTrigger'))

您可以为每个阶段设置一个条件,但您可以使用andor() 创建更复杂的条件。

点击this document获取更多详细信息和条件示例。

【讨论】:

  • 谢谢,标签触发器现在工作正常!对于条件,我有另一个问题:我使用您的评论条件:and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master')) 在除 master 之外的每个分支中跳过此阶段分支。现在我的例子:我的分支被命名为 1620-to-PipelineTrigger 现在我想在一个阶段中包含这个分支。如何更改条件以适合我的特定分支名称?
  • @luismauriz1 请检查我的更新 2! :)
  • 嗨,有更新!它现在可以正常工作了,很抱歉我迟到的答案。我还有一个关于标签触发的小问题:有没有办法在条件中实现标签触发?我现在有两个分支的两个条件,该阶段应该在哪里工作。但是当我想在另一个分支中运行阶段时,在我想将评论作为标签或作为提交实现的条件下,whitch 不是其中之一。有没有可能的方法来做到这一点?也许我应该创建一个条件为(1/2)的不同阶段
  • "如果它不是我的两个分支之一(master、stable、..),则变量应设置为 true。这是真的,我可以稍后检查。我希望的阶段是我们的构建脚本。在主/稳定阶段应该始终构建,在我的其他分支(不是那两个)应该有一个选择模式。通常没有构建,但是当我激活它时,然后构建。
  • 这是我的意图:'condition: or(eq(variables['Build.SourceBranch'], 'refs/remotes/origin/master'), eq(variables['Build.SourceBranch'] , 'refs/remotes/origin/stable'), eq(startsWith(variables['build.sourceBranch'], 'refs/tags/BuildAndInstall'))' 所以我有两个分支条件,第三个触发器是我的标签触发器在这里。在这种情况下,我的触发器被称为“BuildAndInstall”。你知道这是否有效吗?:)
猜你喜欢
  • 2019-12-15
  • 1970-01-01
  • 2022-11-11
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 2020-04-24
  • 1970-01-01
相关资源
最近更新 更多