使用工作流部署 Bicep 文件

已完成

你现在已经创建了一个基本工作流,可以设置工作流来部署 Bicep 文件。 在本单元中,你将了解如何从工作流部署 Bicep 代码,以及如何设置部署步骤。

注意

本单元中显示的命令用于说明概念。 请暂时不要运行这些命令。 稍后你将练习在此处学到的知识。

签出代码

Bicep 文件存储在 Git 存储库中。 在 GitHub Actions 中,需要明确告知工作流从 Git 存储库签出文件。 否则,工作流将无权访问文件。 此步骤通常是作业的第一步。

若要签出代码,可以使用 actions/checkout@v3 操作:

name: MyWorkflow

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
      with:
        path: repo

请注意,工作流包含 uses 关键字。 该关键字表示你需要使用名为 actions/checkout 的预定义操作。

与 Bicep 资源一样,操作始终受版本控制。 在本例中,工作流使用版本 3,因此 @v3 将追加到操作名称。

工作流包含此操作后,存储库的代码将签出到运行程序的文件系统中。 你需要使用 path 参数指定应存储文件的路径。

向 Azure 进行身份验证

从自己的计算机部署 Bicep 文件时,请使用 Azure CLI 或 Azure PowerShell。 你需要先登录到 Azure,然后才能部署你的代码。 通常,这些工具要求你在浏览器中输入登录信息。 验证凭据后,将确认你对部署资源的权限,你可以使用这些工具来部署 Bicep 文件。

提示

在本模块中,你将创建一个工作负载标识供工作流使用。 使用工作负载标识对 Azure 部署工作流进行身份验证模块提供了对工作负载标识的更详细说明,包括它们的工作方式,以及如何创建它们、为其分配角色和管理它们。

按工作流部署也需要身份验证。 由于工作流是在没有人工干预的情况下运行的,因此工作流使用工作负载标识向 Azure 进行身份验证。 GitHub 和 Microsoft Entra ID 协同工作,无需任何凭据即可安全地对工作流进行身份验证。

当工作流需要与 Azure 通信时,工作流步骤会使用工作负载标识登录到 Azure。 然后,在工作流中定义的步骤使用工作流的标识。

Diagram that shows a workflow that includes an Azure deployment step, which accesses a secret and then deploys to Azure.

你必须确保工作负载标识具有执行部署步骤所需的权限。 例如,你可能需要为工作负载标识分配部署资源的资源组的参与者角色。

警告

将用户登录信息存储在 YAML 文件中,然后使用 az login 命令登录似乎更容易。 在任何情况下,都不应使用此方法对工作流进行身份验证。 YAML 文件中的凭据以明文形式存储。 有权访问你的存储库的任何人都可以查看和使用凭据。 即使限制对 GitHub 存储库的访问,只要有人克隆你的存储库,保存凭据的 YAML 文件就会被克隆到此人的计算机上。

登录 Azure

在工作流可对 Azure 环境执行命令之前,首先需要登录。 有一个名为 azure/login 的操作,用于处理登录过程。 还需要授予工作流使用身份验证令牌的权限。

name: MyWorkflow

on: [workflow_dispatch]

permissions:
  id-token: write
  contents: read

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
      with:
        path: repo
    - uses: azure/login@v1
      with:
        client-id: ${{ secrets.AZURE_CLIENT_ID }}
        tenant-id: ${{ secrets.AZURE_TENANT_ID }}
        subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

azure/login 操作要求提供三条信息来使用工作负载标识:Microsoft Entra 应用程序 ID、Microsoft Entra 租户(目录)ID,以及要使用的 Azure 订阅 ID。

执行此操作后,将对运行程序进行身份验证,并能够针对 Azure 环境运行语句。

部署 Bicep 文件

工作流登录到 Azure 后,可以使用工作负载标识运行 Bicep 部署。 在 GitHub Actions 中,可以使用 azure/arm-deploy 操作来启动 Bicep 部署。

注意

还可以通过其他方式从 GitHub Actions 部署 Bicep 文件。 例如,可以使用 azure/CLI 操作,然后提供 Azure CLI 命令来运行部署。 但是,由于 azure/arm-deploy 任务是专门为部署而设计的,因此你将在本模块中使用该任务。

下面是如何配置步骤以使用 azure/arm-deploy 操作的示例:

name: MyWorkflow

on: [workflow_dispatch]

permissions:
  id-token: write
  contents: read

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
      with:
        path: repo
    - uses: azure/login@v1
      with:
        client-id: ${{ secrets.AZURE_CLIENT_ID }}
        tenant-id: ${{ secrets.AZURE_TENANT_ID }}
        subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    - uses: azure/arm-deploy@v1
      with:
        resourceGroupName: ${{ env.AZURE_RESOURCEGROUP_NAME }}
        template: ./deploy/main.bicep
        parameters: environmentType=Test

azure/arm-deploy 操作接受几个参数,其中包括:

  • resourceGroupName:要在其中部署资源(在 Bicep 文件中定义)的资源组的名称。
  • template:存储库中 Bicep 文件的路径。 此路径是相对于存储库根路径的。
  • parameters:表示你在部署时提供的所有参数值。 在本示例中,我们为 environmentType 参数提供了一个值。

由于上一个 azure/login 操作已将工作流登录到 Azure,因此会对经过身份验证的运行程序执行 azure/arm-deploy 步骤。

变量

通常,工作流包含要在工作流文件的多个位置重用的值。 你可能还需要将这些值存储在工作流文件的顶部以便于引用,并且能够轻松地更改值。 在工作流中,你定义的变量将显示为环境变量。 若要定义可重用值,请使用变量。

创建变量

可以在工作流文件中以不同级别创建变量。 但是,如果你需要让它们可用于整个工作流文件,则可以在该文件的顶部附近定义它们,就像在 on 语句下一样。 若要定义变量,请使用 env 参数:

env:
    AZURE_RESOURCEGROUP_NAME: gh-actions
    AZURE_WEBAPP_NAME: webapp-gh-actions

在前面的示例中,我们指定了两个环境变量。

在工作流中使用变量

创建变量后,可以使用特殊语法在工作流的 YAML 文件中引用它,如下所示:

${{ env.AZURE_RESOURCEGROUP_NAME }}

默认环境变量

GitHub Actions 还使用默认环境变量。 默认环境变量包含你可能想要在工作流中使用的预定义信息。 下面是可以在工作流中使用的一些默认环境变量:

  • github.sha:触发了要执行的工作流的 Git 提交的标识符。
  • github.run_number:存储库中特定工作流的每次运行的唯一编号。 工作流首次运行时,此编号从 1 开始,并随着每次新的运行而递增。 可以使用此变量来命名 Azure 部署,以便跟踪部署,了解是哪个具体工作流运行触发了它。

    注意

    在 GitHub Actions 中,可以重新执行工作流运行。 执行此操作时,运行次数不会更改,因此不应使用 github.run_number 变量来计算工作流已执行的次数。

机密

有时,需要存储工作流要使用的机密信息,例如数据库密码或 API 密钥。 使用 GitHub 机密安全地存储包含凭据或敏感信息在内的信息。 工作流可以访问机密的值。

机密是在 GitHub 存储库设置中创建的。 机密可用于存储库中的所有工作流。 在后面的模块中,你将了解环境,它让你可以限制使用机密来部署到特定环境。

警告

默认情况下,GitHub Actions 将对工作流日志中的机密变量值进行模糊处理,但你需要遵循良好的做法。 工作流步骤可以访问机密的值。 如果工作流包含以不安全方式处理机密的步骤,则有可能在工作流日志中显示机密值。 应始终仔细审查对工作流定义文件所做的任何更改,确认不会错误地处理机密。

你可以通过使用 GitHub Web 界面来创建机密。 若要在工作流中引用机密值,请使用以下语法:

${{ secrets.NAME_OF_THE_SECRET }}

工作流启动后,运行部署步骤的运行程序便可以访问解密的 GitHub 机密值。 GitHub Actions 设计用于不在工作流日志中显示机密值。

提示

就像 Bicep 参数一样,无需为所有内容创建变量。 最好为在不同环境中可能会有所不同的任何内容创建变量,并为任何机密创建 GitHub 机密。 由于工作流将始终使用同一 Bicep 文件,因此无需为路径创建变量。

在本模块中,你将使用 GitHub 机密来存储 azure/login 任务登录到 Azure 所需的信息:Microsoft Entra 订阅和租户 ID 以及工作负载标识的应用程序注册 ID。