练习 - 通过 GitHub Actions 在 CI/CD 工作中部署 ARM 模板
在本练习中,你将从 GitHub Actions 工作流部署 Azure 资源管理器 (ARM) 模板。
重要
本练习在 Microsoft Learn 环境的外部执行。 本练习需要使用自己的 Azure 订阅,这可能会产生费用。 这是必需的,因为你将需要创建沙盒订阅中不支持的服务主体。 如果还没有 Azure 订阅,请在开始前创建一个免费帐户。
创建 GitHub 帐户和存储库
首先,如果你没有 GitHub 帐户,请立即在 GitHub 帐户创建页上创建一个。 (创建帐户是免费的。)
拥有帐户后,登录并创建新的存储库,从中可将模板保留为基础结构即代码 (IaC) 模型的一部分。 若要创建存储库(行业中通常称为 repo),请按照以下步骤进行操作:
在 GitHub 站点中任何页面的右上角,使用“+”下拉菜单,然后选择“新建存储库”。 或者选择绿色的“创建存储库”按钮(如果有)。
为存储库输入简短、便于记忆的名称。 例如,使用“Deploy-ARM-Template”。 可以选择性地添加存储库的说明。 例如,使用“通过 GitHub Actions 部署首个 ARM 模板”。
选择存储库可见性设置。 互联网上的所有人都可以访问公共存储库。 只有你以及你明确与之共享了访问权限的人可以访问专用存储库。 (二者均可用于本练习。)
在“使用以下方式初始化此存储库:”下,选择“添加 README 文件”。
选择“创建存储库”。
你已创建了存储库,并使用 README 文件对其进行了初始化。 现在可以将模板和模板参数文件提交到存储库。
注意
README 文件用于更详细地描述项目,或添加一些指南性文档(例如如何安装或使用项目)。 README 文件的内容会自动显示在存储库的首页上。
将 ARM 模板文件提交到存储库
在 GitHub 上,转到存储库的主页。
在文件列表上方的“添加文件”下拉列表中,选择“创建新文件”。
在“文件名”字段中,输入模板的名称和扩展名。 在本练习中,请使用名称 azuredeploy.json。 将以下模板复制并粘贴到新的 GitHub 文件中。
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "VnetName": { "type": "string", "defaultValue": "VNet-001", "metadata": { "description": "Virtual Network Name" } }, "CostCenterIO": { "type": "string", "defaultValue": "12345", "metadata": { "description": "Cost Center IO number for cross billing" } }, "OwnerName": { "type": "string", "defaultValue": "John Smith", "metadata": { "description": "Name of the stakeholder responsible for this resource" } } }, "variables": {}, "resources": [ { "apiVersion": "2018-10-01", "type": "Microsoft.Network/virtualNetworks", "name": "[parameters('VnetName')]", "location": "[resourceGroup().location]", "tags": { "CostCenter": "[parameters('CostCenterIO')]", "Owner": "[parameters('OwnerName')]" }, "properties": { "addressSpace": { "addressPrefixes": [ "10.0.0.0/16" ] }, "enableVmProtection": false, "enableDdosProtection": false, "subnets": [ { "name": "subnet001", "properties": { "addressPrefix": "10.0.0.0/24" } }, { "name": "subnet002", "properties": { "addressPrefix": "10.0.1.0/24" } } ] } } ] }
在“提交新文件”部分中添加说明,并选择“提交新文件”以将其保存到存储库。
在 GitHub Actions 和你的 Azure 订阅之间配置身份验证
若要使用 GitHub Actions 将任何资源部署到 Azure,需要创建一个 Azure 服务主体,并为其授予创建模板中定义的资源的权限。 登录到订阅后,你将在 Azure 门户的“Azure Cloud Shell”部分中执行该步骤。
创建服务主体
若 GitHub Actions 工作流的主体要部署 Azure 资源,则需要正确的内置参与者。
以下 Azure CLI 脚本显示了如何在 Azure 资源组中生成具有参与者权限的 Azure 服务主体。 该工作流会在此资源组中部署 ARM 模板中定义的资源。
projectName="GitHubActionExercise"
location="eastus"
resourceGroupName="${projectName}-rg"
appName="http://${projectName}"
# Create the resource group
az group create --name $resourceGroupName --location $location
# Store the resource group ID in a variable
scope=$(az group list --query "[?contains(name, '$resourceGroupName')].id" -o tsv)
# Create the service principal with contributor rights to the resource group we just created
az ad sp create-for-rbac --name $appName --role Contributor --scopes $scope --sdk-auth
在门户中,当你登录订阅时,请选择“Cloud Shell”图标以在页面底部打开 shell。
在 shell 中,使用上面的代码创建服务主体。 你将获得以下结果。 复制结果的 JSON 部分(下面的屏幕截图中红色框内的内容),因为在 GitHub 中配置机密时需要该内容。
复制 JSON 输出,并将其作为 GitHub 机密存储在 GitHub 存储库中,方法是在 GitHub 中执行以下步骤:在 GitHub 存储库中,选择“设置”选项卡。从左侧菜单中选择“机密”下拉列表,然后选择“Codespaces”。
输入以下值,然后选择“添加机密”:
- 名称:输入 AZURE_CREDENTIALS。
- 机密:粘贴之前复制的 JSON 输出。
在工作流中指定身份验证需要此信息。
创建工作流
工作流文件必须存储在存储库根目录的“.github/workflow”文件夹中。 工作流文件扩展名可以是“.yml”或“.yaml”。
你可以创建一个工作流文件,然后将该文件推送/上传到存储库。 或者,你可以使用以下过程在 GitHub 接口中创建它:
在 GitHub 存储库中,从顶部菜单中选择“操作”,然后选择“自行设置工作流”。
如果希望使用不同的名称(而不是 main.yml),请重命名工作流文件。 例如,使用 deployARMTemplate.yml。
将 .yml 文件的内容替换为以下代码。
注意
GitHub 市场具有一些自定义内置操作,你可以利用这些操作来部署 ARM 模板。 本模块使用名为部署 Azure 资源管理器 (ARM) 模板的市场提供程序。
name: Deploy ARM Template on: push: branches: - main env: AZURE_SUBSCRIPTION_ID: << Subscription Id >> # set this to your Azure Subscription Id AZURE_RESOURCE_GROUP: GitHubActionExercise-rg # set this to your target resource group jobs: deploy-virtual-network-template: runs-on: ubuntu-latest steps: - name: Checkout source code uses: actions/checkout@main - name: Login to Azure uses: azure/login@v1 with: creds: ${{ secrets.AZURE_CREDENTIALS }} - name: Deploy ARM Template uses: azure/arm-deploy@v1 with: scope: resourcegroup subscriptionId: ${{ env.AZURE_SUBSCRIPTION_ID }} resourceGroupName: ${{ env.AZURE_RESOURCE_GROUP }} template: ./azuredeploy.json
工作流文件包含三个部分。
name
:工作流的名称。on
:触发工作流的 GitHub 事件的名称。 当主分支上产生推送事件时,将触发工作流,并会修改主分支上的至少一个文件。jobs
:包含一个或多个作业的工作流运行。 只有一个作业的名称为deploy-virtual-network-template
。 此作业有三个步骤。- 签出源代码。
- 登录 Azure。
- 部署 ARM 模板。
重要
验证表达式
creds: ${{ secrets.AZURE_CREDENTIALS }}
中的机密名称是否与保存到存储库设置中的机密名称相匹配。 另外,请验证Deploy ARM Template
步骤template: $GITHUB_WORKSPACE/azuredeploy.json
中的 ARM 模板名称是否与之前保存在存储库中的名称相匹配。注意
如果在配置部署凭据时使用之前的 Azure CLI 代码,则资源组名称应为
GitHubActionExercise-rg
。 生成的资源组名称是项目名称,后接rg
。选择“开始提交”。 如果需要,请添加注释和说明。
请确保选择“直接提交到主分支”,然后选择“提交新文件”(或“提交更改”)。
创建工作流文件并将其提交到存储库的主分支后,工作流将自动启动,因为工作流中的触发器将提交/推送到主分支。
on: push: branches: - main
转到存储库,并检查工作流的状态。
检查你的部署
工作流完成后,转到 Azure 门户检查部署状态。
在左窗格中,选择“资源组”>“GitHubActionExercise-rg”。 在“部署”窗格中,验证部署是否已成功。