繁体   English   中英

使用 YAML 管道和 gitflow 时,如何仅更新 Azure Devops 中的管道?

[英]How to update only the pipeline in Azure Devops when using YAML pipelines and gitflow?

我们目前使用的是经典 Azure 管道(构建和发布管道)。 它们运行良好,因为如果我们需要对管道进行更改,只需修改管道并从 UI 安排构建就很容易了。

现在微软正在推动 YAML 管道和基础设施即代码,因此我们计划在我们的下一个项目中使用 YAML 和多阶段管道。

当配置在源代码控制中时,我现在还没有找到只更新管道的方法。 例如,假设测试环境的管道由于某种原因中断,我需要通过仅更改 YAML 配置来修复它。 我是否只对Release分支进行更改,然后将其合并回develop分支?

我们曾经在经典模式下有专用的构建管道和专用的发布管道,因此构建管道将创建一个 package,而不管它是在哪个分支上触发的。 然后发布管道将被触发,它将检查构建工件来自的分支并使用相应的配置部署 package。

发布管道(经典)

这给了我们很大的灵活性,以便我们可以随时随地自动和手动部署版本。 我没有看到从 YAML 管道中获得任何好处。

例如,我们可以进行生产构建( master分支)并在测试环境中使用该构建来尝试重现错误。

当我不能只修改管道而是必须接受来自开发分支的所有更改时,这将如何与 YAML 管道一起工作? 仅使用 YAML 构建管道并使用经典发布管道是否可能(或可行)?

我们为我们的应用程序使用部署环,我们有一个单一的构建管道,它利用条件逻辑根据源分支包含或排除特定任务。 如果您绝对必须拥有不同的管道,我建议将模板文件用于常见步骤(非常类似于经典管道中的任务组)。 使用 YAML,您可以制作阶段、作业或步骤模板,因此这些 go 超出了任务组的能力。 我实施的解决方案如下所示:

  • 构建回购
    • 模板
      • 阶段
        • 并行单元测试.yml
        • 构建工件.yml
        • 发布-artifacts.yml
        • 部署.yml
        • pre-build.yml
        • 构建.yml
        • 构建后.yml
        • 单元测试.yml
        • 下载-artifacts.yml
        • 发布-artifacts.yml
        • 部署.yml
  • 应用程序仓库
    • 管道
      • 主发布.yml
      • 环部署.yml
    • [项目文件]

构建存储库中的所有模板都被编码为尽可能与服务无关。 可以更改/将要更改的所有内容都已参数化。 我们甚至使用 YAML 逻辑表达式${[ if eq(parameters.shouldRun, true) }}:打开或关闭仅适用于特定环境/环的步骤。 我建议阅读这些文档:

模板

YAML 表达式

首先,如果您没有看到任何特定原因(例如基于 YAML 的管道中可用的功能),请不要这样做。 它们不是 1 对 1 的,并且经典版本中有一些功能在 YAML 中不可用。 未来有可能缩小差距,但这还没有完成。

如果您想使用 yaml 管道进行构建并保留经典方法进行发布,这是完全可行的。 您使用工件的方式与使用经典版本中发布的工件相同。 如果您决定进行更改,这非常容易,因为您可以预览 YAML 以了解经典管道中的步骤。

在此处输入图像描述

但是,如果您想要多阶段方法并将您的发布集成为部署,您应该熟悉两个关键事项:

使用 YAML 模板,您可以将发布阶段的所有 5 个任务放在一个单元中,稍后您将用作单独的部署阶段。 您将在此处创建参数而不是硬编码值,因此在邮件级别您将定义部署工件的确切位置。

并且有条件,您将控制将触发哪个阶段。 作为一个简单的示例,您可以从文档中检查此 YAML(您在上面有一个链接):

variables:
  isMain: $[eq(variables['Build.SourceBranch'], 'refs/heads/master')]

stages:
- stage: A
  jobs:
  - job: A1
    steps:
      - script: echo Hello Stage A!

- stage: B
  condition: and(succeeded(), eq(variables.isMain, true))
  jobs:
  - job: B1
    steps:
      - script: echo Hello Stage B!
      - script: echo $(isMain)

但请注意,使用 YAML 您不能只触发特定作业。 因此,这意味着您无法将实例部署运行到DEV env。 如果你想这样做,你必须运行整个管道(如果我记得的话,它可能会在未来发生变化,因为 Azure DevOps 团队正在研究这个)。

对于经典发布管道中的初学者,我们正在讨论类似于工件过滤器的功能。 单击阶段的部署前条件,然后单击工件过滤器下的添加 Select 您的工件并指定阶段应触发的分支。 在这里,我们可以指定仅当工件是从某个分支构建时才触发舞台。

在此处输入图像描述

Azure 管道中的 YAML CD 没有类似名称的功能。 我们可以使用此处描述的阶段条件来实现类似的效果。 从那些链接的文档中,我们可以看到一个例子;

variables:
  isMain: $[eq(variables['Build.SourceBranch'], 'refs/heads/master')]

stages:
- stage: A
  jobs:
  - job: A1
    steps:
      - script: echo Hello Stage A!

- stage: B
  condition: and(succeeded(), eq(variables.isMain, true))
  jobs:
  - job: B1
    steps:
      - script: echo Hello Stage B!
      - script: echo $(isMain)

在示例中,阶段 A 将始终运行,但阶段 B 仅在 SourceBranch 为master时才会运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM