2

我正在考虑将我的旧 CI/CD 管道迁移到一个多阶段、基于环境的 YAML 文件中,这些管道混合了用于构建的新 YAML 管道和“经典”基于 UI 的发布管道,但我正在苦苦挣扎找到我们目前正在做的事情的文档/示例。

通常有三种环境TestUATProduction

它们都是基于 AKS 的,目前创建 docker 容器的构建将作为其输出的一部分,存储DeployService.yml发布管道用于更新每个环境的文件(通过修改图像标签和一些环境变量)在运行之前kubectl apply -f DeployService.yml

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

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

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

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

目前,新版本可以:

  • 执行创建和推送 docker 容器的构建。
  • 触发推送到Test环境中的发布。

作为其中的一部分,模板manifests在 repo 中创建了一个文件夹,其中包含 adeployment.yml和 a service.yml。它还创造了一个连接到我们的环境TestAKS 集群的环境。

所以我的问题是:

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

1 回答 1

1

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

您可以在管道中使用Magic Chunks任务在构建过程中替换 yaml 文件中的变量。如果未安装,您需要将 Magic Chunks 扩展安装到您的组织。请在此处查看此任务的更多信息。您也可以检查此线程以获取示例。

2,您可以创建与Classic UI相同的促销风格。

您可以定义依赖项和条件来根据运行前一个阶段的状态来控制阶段运行。对于下面的例子。

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')

您还可以为您的阶段添加批准和检查。请检查文档定义批准和检查

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

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

4、模板可以让你定义可重用的内容、逻辑和参数。您可以将许多项目使用的任务/作业放在模板 yaml 文件中。请在此处查看有关 yaml 模板的更多信息。

于 2020-03-12T09:58:58.953 回答