将 yaml 构建和经典发布管道迁移到多阶段 yaml

Migrating yaml build and classic release pipelines to multi-stage yaml

我正在考虑将旧的 CI/ CD 管道迁移到新的 YAML 构建管道和基于 'classic' UI 的发布管道中多阶段、基于环境的 YAML 文件,但我正在努力寻找与我们当前正在做的事情相关的文档/示例。

通常有三种环境:TestUATProduction

它们都是基于 AKS 的,目前创建 docker 容器的构建将作为其输出的一部分存储一个 DeployService.yml 文件,供发布使用在 运行ning kubectl apply -f DeployService.yml.

之前更新每个环境的管道(通过修改图像标签和一些环境变量)

目前我有几个遵循这种模式的项目:

╔══════════════════════════╦══════════════════╦═══ ═══════════╦══════════════════════════════════════ ══════════════════════════════════════════════════ ══════════════════════════════════════════════════ ════════════╗
║ 名称 ║ 用途 ║ 类型 ║ 描述 ║
╠══════════════════════════╬══════════════════╬═══ ═══════════╬══════════════════════════════════════ ══════════════════════════════════════════════════ ══════════════════════════════════════════════════ ════════════╣
║ {project-name}.ci.yml ║ CI 构建 ║ 基于 YAML ║ 触发拉取请求。构建、运行 测试等。唯一的输出是 Azure DevOps 中的测试结果和成功/失败。 ║
║ {project-name}.cd.yml ║ CD 构建 ║ YAML-based ║ 将成功 PR 后的输出构建到 master 中。这通常是一个 docker 容器。 ║
║ {project-name} - 发布 ║ 发布管道 ║ 'Classic' UI ║ 发布管道,由 {project-name} 触发。cd.yml 成功并部署到测试环境中。从那里升级到 UAT 和生产。 ║
╚══════════════════════════╩══════════════════╩═══ ═══════════╩══════════════════════════════════════ ══════════════════════════════════════════════════ ══════════════════════════════════════════════════ ════════════╝

我想使用单个文件将它们全部移动到较新的多阶段 YAML 构建和发布管道。

就目前而言,我已经使用新的管道模板创建了一个新的 yaml 文件,然后复制并粘贴了我现有 CD 构建的位。

目前新版本可以:

作为其中的一部分,模板在包含 deployment.ymlservice.yml 的存储库中创建了一个 manifests 文件夹。它还创建了一个连接到我们的 Test AKS 集群的环境。

所以我的问题是:

  1. 鉴于 deployment.yml 需要包含特定于环境的变量(想想 ASPNETCORE_ENVIRONMENT),我如何为每个发布环境提供那些额外的特定于环境的变量?
  2. 我可以重新创建与使用经典 UI 版本时相同的促销式发布管道吗?
  3. CI 构建完全适合这个过程吗?或者我应该把它放在一个单独的文件中吗?
  4. 鉴于有很多项目都遵循这种模式,并且在大多数情况下它们都做同样的事情,只是构建项目特定的容器,repos 之间是否有任何可重用性?

1,为deployment.yml提供额外的环境特定变量。

您可以使用 Magic Chunks task in your pipeline to replace the variables in yaml files during the build process. You need to install Magic Chunks extension to your organization if it is not installed. Please check here for more information this task. You can also the check 作为示例。

2,您可以创建与经典UI中相同的促销样式。

您可以根据 运行 前一阶段的状态定义 dependenies and condtions 来控制阶段 运行。对于下面的例子。

stages:
- stage: A

# stage B runs if A fails
- stage: B
  condition: failed()

# stage C runs if B succeeds
- stage: C
  dependsOn:
  - A
  - B
  condition: succeeded('B')

您还可以为您的阶段添加批准和检查。请检查文档 Define approvals and checks

但是,Yaml 管道还不支持手动触发阶段。此功能在路线图上。请检查 this thread.

3,我建议您将 CI 构建留在单独的文件中。如果它在同一个 yaml 文件中,那么以下所有 CD 构建和阶段都将在拉取请求时触发。

4、模板将让您定义可重用的内容、逻辑和参数。您可以将许多项目使用的 tasks/jobs 放在模板 yaml 文件中。请检查 here 以获取有关 yaml 模板的更多信息。