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

时间:2020-03-11 12:15:31

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

我正在考虑将旧的CI / CD管道(新的用于构建的YAML管道和基于“ UI”的“经典”管道)的混合物迁移到基于环境的多阶段YAML文件中,我正在努力寻找与我们目前正在做的事情相符的文档/示例。

通常存在三种环境:TestUATProduction

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

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

╔══════════════════════════╦══════════════════╦══════════════╦══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║           Name           ║     Purpose      ║     Type     ║                                                                     Description                                                                      ║
╠══════════════════════════╬══════════════════╬══════════════╬══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ {project-name}.ci.yml    ║ CI build         ║ YAML-based   ║ Triggered on pull-requests. Builds, run tests, etc. The only output is test results and success/ failure in Azure DevOps.                            ║
║ {project-name}.cd.yml    ║ CD build         ║ YAML-based   ║ Builds the output upon successful PR into master. This is more often than not a docker container.                                                    ║
║ {project-name} - Release ║ Release Pipeline ║ 'Classic' UI ║ Release pipeline, triggered by {project-name}.cd.yml success and deploys into the Test environment. From there it's promotion to UAT and Production. ║
╚══════════════════════════╩══════════════════╩══════════════╩══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝

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

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

目前,新版本可以:

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

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

所以我的问题是这些

  1. 鉴于deployment.yml需要包含特定于环境的变量(请考虑ASPNETCORE_ENVIRONMENT),如何为每个发行版环境提供那些附加的特定于环境的变量?
  2. 我可以重新创建与使用Classic UI版本相同的促销方式发布管道吗?
  3. 配置项构建是否完全适合此过程?还是应该将其放在单独的文件中?
  4. 鉴于许多项目都遵循这种模式,并且大多数情况下它们都做同样的事情,但构建特定于项目的容器,在回购协议之间是否存在可重用性?

1 个答案:

答案 0 :(得分:1)

1,为Deployment.yml提供其他特定于环境的变量。

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

2,您可以创建与经典用户界面相同的促销样式。

您可以定义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,模板可让您定义可重用的内容,逻辑和参数。您可以将许多项目所使用的任务/作业放在模板yaml文件中。请检查here以获得有关yaml模板的更多信息。