练习 - 使用 GitHub Actions 将 ARM 模板部署为 CI/CD 工作的一部分

已完成

在这里,从 GitHub Actions 工作流部署 Azure 资源管理器 (ARM) 模板。

重要

在 Microsoft Learn 环境之外执行此练习。 本练习要求你拥有自己的 Azure 订阅,并且可能会产生费用。 这是必需的,因为你将需要创建沙盒订阅中不支持的服务主体。 如果还没有 Azure 订阅,请在开始之前创建 一个免费帐户

创建 GitHub 帐户和存储库

首先,如果没有 GitHub 帐户,请在 GitHub 帐户创建页上立即创建一个。 (这是免费的。

显示 GitHub 帐户创建页的屏幕截图。

拥有帐户后,登录并创建一个新存储库,可以在其中将模板保留为基础结构即代码(IaC)模型的一部分。 若要创建存储库(通常称为行业中的 存储库 ),请执行以下步骤:

  1. 在 GitHub 站点上任何页面的右上角,使用 + 下拉菜单并选择“ 新建存储库”。 或者,选择绿色的 “创建存储库 ”按钮(如果存在)。

    用于创建 GitHub 存储库的选项的屏幕截图。

  2. 输入存储库的简短、难忘的名称。 例如,使用 Deploy-ARM-Template。 可以选择性地添加存储库的说明。 例如,使用 通过 GitHub Actions 部署我的第一个 ARM 模板

  3. 选择存储库可见性设置。 互联网上的所有人都可以访问公共存储库。 专用存储库仅可供你和显式共享访问权限的人员访问。 (两者均适用于这项练习。)

  4. “使用:初始化此存储库”下,选择 “添加自述文件”。

  5. 选择“创建存储库”。

    显示创建新存储库详细信息的屏幕截图。

你创建了存储库,并使用自述文件对其进行初始化。 是时候将模板和模板参数文件提交到存储库了。

注释

自述文件是更详细地描述项目或添加一些文档(例如如何安装或使用项目)的绝佳位置。 README 文件的内容会自动显示在存储库的首页上。

将 ARM 模板文件提交到存储库

  1. 在 GitHub 上,转到存储库的主页。

  2. 在文件列表上方的 “添加文件 ”下拉列表中,选择“ 创建新文件”。

    显示将模板添加到存储库的选择的屏幕截图。

  3. 在文件名字段中,输入模板的名称和扩展名。 在我们的练习中,请使用名称 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"
                            }
                        }
                    ]
                }
            }
        ]
    }
    
  4. “提交新文件 ”部分添加说明,然后选择 “提交新文件 ”以将其保存到存储库。

    显示将新模板保存到存储库的屏幕截图。

在 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。

显示打开 Cloud Shell 时的动画。

在 shell 中,使用前面的代码创建服务主体。 你将获得以下结果。 复制结果的 JSON 部分(以下屏幕截图中的红色框中的内容),因为在 GitHub 中配置机密时需要它。

显示在 Azure 中创建服务主体的结果的屏幕截图。

通过执行 GitHub 中的以下步骤,复制 JSON 输出并将其存储为 GitHub 存储库中的 GitHub 机密:在 GitHub 存储库中,选择 “设置” 选项卡。在左侧菜单中,选择“ 机密 ”下拉列表,然后选择 “Codespaces”。

输入以下值,然后选择 “添加机密

  • 名称:输入 AZURE_CREDENTIALS
  • 机密:粘贴之前复制的 JSON 输出。

显示将新服务主体机密信息添加到 GitHub 机密的屏幕截图。

需要此信息才能在工作流中指定身份验证。

创建工作流

工作流文件必须存储在存储库根目录的 .github/workflows 文件夹中。 工作流文件扩展名可以是.yml或 .yaml。

可以创建工作流文件,然后将文件推送/上传到存储库。 或者,可以使用以下过程在 GitHub 界面中创建它:

  1. 从你的 GitHub 存储库顶部菜单中选择 “操作”,然后选择 “自行设置工作流”

    显示用于设置工作流的选择的屏幕截图。

  2. 如果更喜欢其他名称而不是main.yml,请重命名工作流文件。 例如,使用 deployARMTemplate.yml

  3. 将.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。 此作业有三个步骤。

      1. 查看源代码。
      2. 登录到 Azure。
      3. 部署 ARM 模板。

    重要

    验证表达式 creds: ${{ secrets.AZURE_CREDENTIALS }} 中的机密名称是否与保存到存储库设置的机密的名称匹配。 此外,请验证步骤template: $GITHUB_WORKSPACE/azuredeploy.json中的 Deploy ARM Template ARM 模板名称是否与之前保存在存储库中的 ARM 模板名称匹配。

    注释

    配置部署凭据时,资源组名称应为 GitHubActionExercise-rg,如果你使用了上述 Azure CLI 代码。 生成的资源组名称是项目名称加上 rg

  4. 选择“开始提交”。 根据需要添加注释和说明。

  5. 确保选择 “直接提交到主分支 ”,然后选择“ 提交新文件 ”(或 提交更改)。

    显示将工作流提交到主分支的屏幕截图。

    创建工作流文件并将其提交到存储库的主分支后,工作流将自动启动,因为工作流中的触发器是提交/推送到主分支。

    on:
      push:
        branches:
          - main
    
  6. 转到存储库并检查工作流的状态。

    显示工作流状态的屏幕截图。

检查你的部署

工作流完成后,转到 Azure 门户以检查部署状态。

在左窗格中,选择 资源组>GitHubActionExercise-rg。 在 “部署 ”窗格中,验证部署是否成功。

显示部署状态的屏幕截图。