使用管道部署 Bicep 文件
现已创建一个基本管道,可以将管道设置为部署 Bicep 文件。 在本单元中,你将了解如何从管道部署 Bicep 代码,以及如何设置部署步骤。
注意
本单元中显示的命令用于说明概念。 请暂时不要运行这些命令。 稍后你将练习在此处学到的知识。
服务连接
从自己的计算机部署 Bicep 文件时,请使用 Azure CLI 或 Azure PowerShell。 在可以部署代码之前,请先登录到 Azure。 通常,这些工具会要求你在浏览器中输入电子邮件地址和密码。 验证凭据后,将确认你的部署资源的权限,你可以使用这些工具来部署你的 Bicep 文件。
按管道部署也需要身份验证。 由于管道是在没有人干预的情况下运行的,因此管道使用服务主体向 Azure 进行身份验证。 服务主体的凭据由应用程序 ID 和机密组成,机密通常是密钥或证书。 在 Azure Pipelines 中,可以使用服务连接来安全存储这些凭据,以便管道可以使用它们。 服务连接还包括一些其他信息,可帮助管道识别要部署到的 Azure 环境。
提示
在本模块中,你将使用 Azure DevOps 在创建服务连接时自动创建服务主体。 使用服务主体对 Azure 部署管道进行身份验证模块提供了对服务主体的更详细说明,包括它们的工作方式,以及如何创建它们、为其分配角色和管理它们。
创建服务连接时,需要为连接命名。 步骤使用此名称引用服务连接,因此管道 YAML 代码不需要包含机密信息。
管道启动后,运行部署步骤的代理便可以访问服务连接,包括其凭据。 管道步骤使用凭据登录到 Azure,如同你自己登录一样。 然后,在步骤中定义的操作使用服务主体的标识。
你必须确保服务主体具有执行部署步骤所需的权限。 例如,你可能需要为服务主体分配将资源部署到的资源组的参与者角色。
警告
将服务主体的凭据存储在 YAML 文件中,然后使用 az login
命令登录似乎更容易。 在任何情况下,都不应使用此方法对服务主体进行身份验证。 YAML 文件中的凭据以明文形式存储。 有权访问你的存储库的任何人都可以查看和使用凭据。 即使限制对 Azure DevOps 组织和项目的访问,只要有人克隆你的存储库,保存凭据的 YAML 文件就会被克隆到此人的计算机上。 无论何时从管道使用 Azure,都必须使用服务连接。 服务连接还提供额外的安全和访问控制功能。
服务连接是在 Azure DevOps 项目中创建的。 单个服务连接可以由多个管道共享。 但是,通常最好为每个管道和部署到的每个环境设置服务连接和相应的服务主体。 此实践有助于增加管道的安全性,并降低将资源意外部署到非预期环境中或在其中配置资源的可能性。
还可以设置服务连接,以便只能在特定管道中使用。 例如,创建部署到网站生产环境的服务连接时,最好确保只有网站的管道才能使用此服务连接。 将服务连接限于特定管道,可防止其他人意外将该服务连接用于其他项目,导致生产网站出现故障。
使用 Azure 资源组部署任务部署 Bicep 文件
需要从管道部署 Bicep 文件时,可以使用 Azure 资源组部署任务。 下面的示例介绍了如何配置步骤以使用该任务:
- task: AzureResourceManagerTemplateDeployment@3
inputs:
connectedServiceName: 'MyServiceConnection'
location: 'westus3'
resourceGroupName: Example
csmFile: deploy/main.bicep
overrideParameters: >
-parameterName parameterValue
第一行指定 AzureResourceManagerTemplateDeployment@3
。 这会告知 Azure Pipelines 用于此步骤的任务名称为 AzureResourceManagerTemplateDeployment
,并且要使用该任务的版本 3
。
使用 Azure 资源组部署任务时,可以指定输入来指示要执行的操作。 下面是在使用任务时可能指定的一些输入:
connectedServiceName
,指定要使用的服务连接的名称。- 需要指定
location
,即使可能不使用它的值。 Azure 资源组部署任务还可以为你创建资源组,如果这样做,它需要知道在其中创建资源组的 Azure 区域。 在本模块中,你将指定location
输入值,但不使用它的值。 resourceGroupName
指定 Bicep 文件应部署到的资源组的名称。overrideParameters
包含要在部署时传入 Bicep 文件的任何参数值。
任务开始后,使用服务连接登录到 Azure。 当任务运行指定的部署时,该任务已经过身份验证。 无需运行 az login
。
运行 Azure CLI 和 Azure PowerShell 命令
Azure Pipelines 中两个最有用的内置任务是 Azure CLI 和 Azure PowerShell 任务。 可以使用这些任务来执行一个或多个 Azure CLI 或 PowerShell 命令。
在将来的 Microsoft Learn 模块中,你将了解 Azure CLI 命令如何帮助你从管道自动执行部署过程的更多部分。
变量
通常,管道包含要与 YAML 文件分开的值。 例如,将 Bicep 文件部署到资源组时,请指定资源组的名称。 部署到不同环境时,资源组名称可能不同。 此外,你可能需要为 Bicep 文件提供参数,包括数据库服务器密码等机密。 请勿将这些值存储在管道 YAML 文件中或 Git 存储库中的任何其他位置。 相反,若要提高安全性和使管道定义可重用,请使用“变量”。
创建变量
Azure Pipelines Web 界面提供了一个编辑器,可用于为管道创建变量:
可以将一个 Azure Pipelines 变量值设置为机密。 如果将变量值设置为机密,则设置后无法查看该值。 Azure Pipelines 设计用于不在管道日志中显示机密值。
警告
默认情况下,Azure Pipelines 将对管道日志中的机密变量值进行模糊处理,但你需要遵循良好的做法。 管道步骤可以访问所有变量值,包括机密。 如果管道包含以不安全方式处理安全变量的步骤,则有可能在管道日志中显示机密变量。
还可以让用户在手动运行管道时重写变量值。 用户提供的值仅用于该特定管道运行。 在测试管道时,变量重写会很有用。
在管道中使用变量
创建变量后,将使用特定语法来引用管道 YAML 文件中的变量:
- task: AzureResourceManagerTemplateDeployment@3
inputs:
connectedServiceName: $(ServiceConnectionName)
location: $(DeploymentDefaultLocation)
resourceGroupName: $(ResourceGroupName)
csmFile: deploy/main.bicep
overrideParameters: >
-environmentType $(EnvironmentType)
管道定义文件格式包括特殊的 $(VariableName)
语法。 可以使用此方法(无论是否为机密)来引用任何变量。
提示
在前面的示例中,请注意 Bicep 文件名不会存储在变量中。 就像 Bicep 参数一样,无需为所有内容创建变量。 最好为在不同环境中可能会有所不同的任何内容和任何机密创建变量。 由于管道将始终使用同一模板文件,因此无需为路径创建变量。
系统变量
Azure Pipelines 还使用系统变量。 系统变量包含你可能想要在管道中使用的预定义信息。 下面是可以在管道中使用的一些系统变量:
Build.BuildNumber
,是管道运行的唯一标识符。 不管名称如何,Build.BuildNumber
值通常都是字符串而不是数字。 可以使用此变量来命名 Azure 部署,以便可以跟踪部署,了解触发它的特定管道运行。Agent.BuildDirectory
,这是代理计算机的文件系统上存储管道运行文件的路径。 当你想要在生成代理上引用文件时,这会很有用。
在管道的 YAML 文件中创建变量
除了使用 Azure Pipelines Web 接口创建变量外,还可以在管道的 YAML 文件中设置变量值。 在你有非机密值、将此值存储在存储库中、将变量值保存在文件中的同一个位置以便可以在整个管道定义中引用它们时,你可以使用此选项。 这种方法还允许你跟踪版本控制系统中变量的更改。
若要在 YAML 文件中设置变量,请添加 variables
部分:
trigger: none
pool:
vmImage: ubuntu-latest
variables:
ServiceConnectionName: 'MyServiceConnection'
EnvironmentType: 'Test'
ResourceGroupName: 'MyResourceGroup'
DeploymentDefaultLocation: 'westus3'
jobs:
- job:
steps:
- task: AzureResourceManagerTemplateDeployment@3
inputs:
connectedServiceName: $(ServiceConnectionName)
location: $(DeploymentDefaultLocation)
resourceGroupName: $(ResourceGroupName)
csmFile: deploy/main.bicep
overrideParameters: >
-environmentType $(EnvironmentType)
此管道示例定义了四个变量:ServiceConnectionName
、EnvironmentType
、ResourceGroupName
和 DeploymentDefaultLocation
。
在本模块的后面部分,你将了解如何将在不同位置定义的变量混合在一个管道中。