了解 Azure Pipelines

已完成

通过使用管道,可以自动执行部署过程中的步骤。 每次对代码进行更改并将更改提交到 Git 存储库时,管道都会运行预定义的过程。 管道可以验证 Bicep 代码是否符合质量标准,然后自动执行将资源部署到 Azure 的步骤。 该过程在你创建的管道定义中定义。

Azure Pipelines 是 Azure DevOps 服务的一项功能。 Azure DevOps 还包括 Azure Repos,后者托管用于存储代码和将代码与协作者共享的 Git 存储库。 在 Git 中存储 Bicep 代码后,Azure Pipelines 便可以访问代码,自动执行部署过程。 在本单元中,你将了解 Azure Pipelines。

什么是管道?

管道是一个可重复的过程,用于测试和部署在配置文件中定义的代码。 管道包括要执行的所有步骤以及执行顺序。

使用 Azure Pipelines 时,可以使用 YAML 文件来描述管道。 YAML 文件是结构化文本文件,类似于 Bicep(结构化文本文件)。 可以使用任何文本编辑器创建和编辑 YAML 文件。 在本模块中,我们将使用 Visual Studio Code。 Visual Studio Code 提供了一个扩展,可用于更轻松地编辑 Azure DevOps YAML 管道文件。 Azure DevOps Web 界面还提供了一些工具,可用于查看和编辑管道 YAML 文件。

备注

Azure Pipelines 还包括经典管道,这是旧版管道功能。 基于 YAML 的管道已替换经典管道。 在此模块中,我们仅讨论 YAML 管道。 建议使用 YAML 管道。

由于管道 YAML 文件是代码文件,因此该文件与 Bicep 代码一起存储在 Git 存储库中。 使用 Git 功能可协作完成管道定义。 你可以使用提交和分支管理不同版本的管道文件。 在以后的模块中,你还将了解管道的其他高级功能,例如模板。 使用模板可以轻松重复使用管道定义。

代理和池

到目前为止,你已经从本地计算机部署了 Bicep 文件。 编写 Bicep 模板后,可以使用 Azure CLI 或 Azure PowerShell 将其部署到 Azure。 这些工具使用计算机的资源将模板提交到 Azure。 他们使用你的个人标识向 Azure 进行身份验证,并验证你是否有权部署资源。

管道还需要访问计算机才能执行部署步骤。 Azure Pipelines 使用称为代理的计算机。 代理是配置为运行管道部署步骤的计算机。 每个代理都已拥有你在之前模块中使用的 Bicep 和 Azure 工具,因此可以执行你在自己计算机上执行的操作。 Azure Pipelines 服务指示代理运行你在 YAML 文件中定义的步骤,而无需人工执行命令。

Azure Pipelines 提供为不同操作系统(如 Ubuntu 或 Windows)提供多种类型的代理,以及不同工具集。 Microsoft 会运行这些代理,你无需为代理维护任何计算基础结构。 它们有时被称为 Microsoft 托管代理或托管代理,因为是代表你来托管这些代理的。 管道运行时,将自动创建托管代理。 管道运行完毕后,会自动删除托管代理。 无法直接访问托管代理,因此管道必须包含部署解决方案所需的所有步骤。

代理池包含多个相同类型的代理。 在创建管道时,要告知 Azure Pipelines 使用哪个代理池来执行每一组步骤。 管道运行时,它会等待池中的代理变为可用,然后指示代理运行部署步骤。 可能会分配池中的任何代理来运行管道。

Diagram that shows a pipeline that runs on an agent within an agent pool.

注意

你可以选择创建称为“自托管代理”的自定义代理。 如果需要将特定软件作为管道的一部分运行,或者需要精确控制代理的配置方式,则可以创建自托管代理。 本模块中不讨论自托管代理,但在摘要中提供了相关详细信息的链接。

触发器

若要指示 Azure Pipelines 何时运行管道,需要创建触发器。 可以在多种类型的触发器中进行选择。 当前使用手动触发器。 你将手动告知 Azure Pipelines 何时开始运行管道。 本模块的稍后部分将介绍其他类型的触发器。

Diagram that shows a trigger initiating a pipeline.

步骤

步骤表示管道将执行的单个操作。 步骤类似于在 Bash 或 PowerShell 中运行的单个命令。 在大多数部署中,将按顺序执行多个步骤。 可以在管道 YAML 文件中定义步骤的顺序以及每个步骤的所有详细信息。

Azure Pipelines 提供了两种类型的步骤:

  • 脚本。 使用脚本步骤在 Bash、PowerShell 或 Windows 命令行界面中运行单个命令或命令序列。
  • 任务。 任务是访问许多不同的功能而无需编写脚本语句的简便方法。 例如,一个内置任务可以运行 Azure CLI 和 Azure PowerShell cmdlet,以测试代码或将文件上传到 FTP 服务器。 任何人都可以编写任务,并在 Visual Studio Marketplace 中发布任务,将其与其他用户分享。 提供了大量商业和开源任务。

有些人更喜欢使用脚本语句而不是内置任务,因为对所执行任务的控制权更大。 另一些人喜欢使用任务,这样他们不需要编写和管理脚本。 在本模块中,我们将混合使用这两种方法。

作业

在 Azure Pipelines 中,作业表示一组有序的步骤。 管道中始终至少有一项作业,并且在创建复杂部署时,存在多个作业是很常见的。

备注

可以将每个作业设置为在不同的代理池上运行。 在构建和部署需要在作业管道的不同部分使用不同的操作系统的解决方案时,在不同代理池上运行作业非常有用。

例如,假设要构建一个 iOS 应用及应用后端服务。 你可能有一个为生成 iOS 应用在 macOS 代理池上运行的作业,以及另一个为生成后端在 Ubuntu 或 Windows 代理池上运行的作业。 甚至可以告知管道同时运行两个作业,这样可以加快管道的执行速度。

在此模块中,我们在管道定义文件的根声明代理池,因此管道中的所有作业使用相同的代理池。

Diagram that shows a pipeline with two steps, both within one job.

注意

还可在 Azure Pipelines 中使用“阶段”的概念,这样可以将管道划分为多个逻辑阶段,并在管道执行中的各个节点添加手动检查。 你将在将来的模块中详细了解阶段。

基本管道示例

了解 Azure Pipelines 中的基本概念后,让我们看一下 YAML 中的简单管道定义:

trigger: none

pool:
  vmImage: ubuntu-latest

jobs:
- job:
  steps:
  - script: echo Hello, world!
    displayName: 'Run a one-line script'
  
  - script: |
      echo We'll add more steps soon.
      echo For example, we'll add our Bicep deployment step.
    displayName: 'Run a multi-line script'

让我们仔细看看每个部分:

  • trigger 告知管道何时执行。 在本例中,trigger: none 告知 Azure Pipelines 你想要手动触发管道。
  • pool 指示管道在运行管道步骤时使用哪个代理池。 在本例中,管道将在一个运行 Ubuntu 操作系统的代理上运行,该代理是 Microsoft 托管的代理池中的代理。
  • jobs 组将管道中的所有作业汇集在一起。
  • job 告知管道你只有一项作业。

    提示

    如果管道中只有一个作业,则可以省略 jobsjob 关键字。 本文包含了 job,以便明确如何在管道中将概念结合使用。

  • steps 列出了要在作业中运行的操作顺序。 示例 YAML 包括两个步骤。 这两个步骤都运行一个简单的脚本以回显一些文本。 每个步骤都有一个 displayName 值,这是该步骤的人工可读名称。 查看管道日志时,便会看到显示名称。 若要创建多行脚本步骤,请使用管道字符 (|),如示例中所示。 执行步骤后,将在管道日志中看到输出。

重要

在 YAML 文件中,缩进非常重要。 请查看示例 YAML。 YAML 中的某些行缩进两个或四个空格。 使用的空格数非常重要。 如果未正确缩进文件,Azure Pipelines 将无法解释它。 Visual Studio Code 可帮助查找和修复 YAML 文件缩进中的错误。