使用工作流部署 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。 然后,工作流中定义的步骤使用工作流的 标识

此图显示了包含 Azure 部署步骤的工作流,该步骤访问机密,然后部署到 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 的信息:微软 Entra 订阅和租户 ID,以及工作负荷标识的应用程序注册 ID。