了解管道阶段
使用 Pipelines 可以自动化部署过程中的步骤。 该过程可能包含要运行的作业的多个逻辑组。 在本单元中,你将了解管道阶段以及如何使用它们向 Bicep 部署添加质量控制过程。
什么是管道阶段?
阶段有助于将管道划分为多个逻辑块。 每个阶段可以包含一个或多个作业。 作业包含应完成的步骤的有序列表,例如运行命令行脚本。
可以在管道中使用阶段来标记分离关注点。 例如,使用 Bicep 代码时,验证代码与部署 Bicep 文件是单独的关注点。 使用自动化管道时,生成和测试代码的过程通常称为持续集成 (CI)。 在自动化管道中部署代码通常称为持续部署 (CD)。
在 CI 阶段,将检查对代码所做更改的有效性。 CI 阶段提供质量保证。 它们可在不影响实时生产环境的情况下运行。
在许多编程语言中,需要先生成代码,然后才能运行代码。 部署 Bicep 文件后,该文件会从 Bicep 转换或转译为 JSON。 工具会自动执行此过程。 在大多数情况下,无需手动将 Bicep 代码生成到管道中的 JSON 模板。 但当谈论 Bicep 代码时,我们仍使用术语“持续集成”,因为 CI 的其他部分仍然适用,例如验证代码。
CI 阶段成功运行后,你应更加确信你所做的更改也将成功部署。 在 CD 阶段,将代码部署到每个环境。 通常从测试和其他非生产环境开始,然后转到生产环境。 在本模块中,我们将部署到单个环境。 在后面的模块中,你将了解如何扩展部署管道以部署到多个环境,例如非生产环境和生产环境。
阶段按顺序运行。 可以控制每个阶段的运行方式和时间。 例如,可以将 CD 阶段配置为仅在 CI 阶段成功运行后运行。 或者,可以包含多个需要按顺序运行的 CI 阶段,例如先生成代码然后对其进行测试。 还可以包含一个回退阶段,该阶段仅在之前的部署阶段失败时运行。
左移
通过使用阶段,可以在部署代码之前验证代码的质量。 这些阶段有时称为“左移”。
细想一下在编写代码时执行活动的时间线。 时间线从规划和设计阶段开始。 然后,它进入“生成”和“测试”阶段。 最后,你进行部署,然后必须支持你的解决方案。
软件开发中的一条浅显易懂的规则是,在开发过程中越早发现错误(越靠近时间线的左侧),修复起来就越容易、越快、越便宜。 在流程中发现错误的时间越晚,修复起来就越困难。
因此,目标是将问题的发现时间向上图的左侧移动。 在本模块中,你将了解如何在管道进行过程中向其添加更多验证和测试。
甚至可以在部署开始之前添加验证。 使用 Azure DevOps 等工具时,拉取请求通常代表团队中的某人想要对主分支上的代码所做的更改。 可以创建另一个管道,使其在拉取请求评审过程中自动运行 CI 步骤。 这种方法有助于验证即使进行了建议的更改,代码是否仍然有效。 如果验证成功,那么当你将更改合并到主分支时,你就会更加确信此操作不会引起问题。 如果检查失败,则表示拉取请求尚未准备就绪,无法进行合并。
重要
自动化验证和测试与编写的测试一样有效。 你要考虑需要测试的内容和需要执行的步骤,以确保部署正常,这一点很重要。
定义管道阶段
每个管道至少包含一个阶段。 如果管道只有一个阶段,则无需显式定义它。 Azure Pipelines 会自动进行定义。 如果管道中有多个阶段,则需要定义每个阶段。 阶段按指定的序列运行。
假设你生成了一个需要部署两次的 Bicep 文件:一次是部署到美国的基础结构,另一次是部署到欧洲的基础结构。 在部署之前,需要验证 Bicep 代码。 下面是定义此过程的多阶段管道的插图:
请注意,此示例有 3 个阶段。 “验证”阶段类似于 CI 阶段。 然后,会运行“DeployUS”和“DeployEurope”阶段。 每个作业都将代码部署到其中一个环境中。
以下是如何在管道 YAML 文件中定义这些阶段的方式:
stages:
- stage: Test
jobs:
- job: Test
- stage: DeployUS
jobs:
- job: DeployUS
- stage: DeployEurope
jobs:
- job: DeployEurope
控制阶段的顺序
默认情况下,阶段按定义的顺序运行。 仅当上一阶段运行成功后,才会运行当前阶段。 可在阶段之间添加依赖项以更改顺序。
继续上面的示例,假设你想要并行运行两个部署,如下所示:
可以使用 dependsOn
关键字指定阶段之间的依赖关系:
stages:
- stage: Test
jobs:
- job: Test
- stage: DeployUS
dependsOn: Test
jobs:
- job: DeployUS
- stage: DeployEurope
dependsOn: Test
jobs:
- job: DeployEurope
使用 dependsOn
关键字时,Azure Pipelines 会等待依赖阶段成功完成,然后再开始下一阶段。 如果 Azure Pipelines 检测到多个阶段的所有依赖项都已满足,则可并行运行这些阶段。
注意
实际上,仅当有足够的代理可以同时运行多个作业时,阶段和作业才能并行运行。 使用 Microsoft 托管代理时,可能需要购买额外的并行作业来实现此目的。
有时,你想要在上一阶段失败的情况下运行某个阶段。 例如,下面是一个不同的管道。 如果部署失败,则随后会立即运行名为“回退”的阶段:
可使用 condition
关键字指定在某阶段运行之前应满足的条件:
stages:
- stage: Test
jobs:
- job: Test
- stage: Deploy
dependsOn: Test
jobs:
- job: Deploy
- stage: Rollback
condition: failed('Deploy')
jobs:
- job: Rollback
在上一示例中,如果一切顺利,Azure Pipelines 首先运行“验证”阶段,然后运行“部署”阶段。 它会跳过“回退”阶段。 但是,如果“部署”阶段失败,Azure Pipelines 将运行“回退”阶段。 本模块稍后会详细介绍回退。
每个作业都在新代理上执行。 这意味着每个作业都将从干净的环境开始,因此在每项作业中,通常需要先签出源代码。
Bicep 部署阶段
典型的 Bicep 部署管道包含多个阶段。 随着管道运行各个阶段,目标是越来越相信后期阶段会成功。 下面是 Bicep 部署管道的常见阶段:
- Lint 分析:使用 Bicep Linter 验证 Bicep 文件格式是否正确并且不包含任何明显的错误。
- 验证:使用 Azure 资源管理器预检验证过程检查部署时可能会发生的问题。
- 预览:使用 What-if 命令验证将应用于 Azure 环境的更改列表。 要求人工手动审阅 What-if 结果并批准管道继续运行。
- 部署:将部署提交到资源管理器并等待部署完成。
- 冒烟测试:对已部署的一些重要资源运行基本的部署后检查。 这些评审称为“基础结构冒烟测试”。
你的组织可能具有不同的阶段序列,或者可能需要将 Bicep 部署集成到部署其他组件的管道中。 了解了这些阶段的工作原理后,可以设计一个管道来满足你的需求。
在本模块中,你将了解此处所列阶段的详细信息,并逐步生成包含每个阶段的管道。 你还将了解:
- 如果在之前的任何阶段中发生任何意外情况,管道如何停止部署过程。
- 如何配置管道,使其在你手动验证上一阶段中发生的情况之前都暂停。