使用工作流部署 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。 然后,工作流中定义的步骤使用工作流的 标识。
你必须确保工作负载标识具有执行部署步骤所需的权限。 例如,你可能需要为工作负载标识分配部署资源的资源组的参与者角色。
警告
在 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。