練習 - 使用 GitHub Actions 在 CI/CD 工作中部署 ARM 範本

已完成

在本練習中,您會從 GitHub Actions 工作流程部署 Azure Resource Manager (ARM) 範本。

重要

本練習是在 Microsoft Learn 環境外執行。 您必須有自己的 Azure 訂用帳戶才能執行本練習,可能會產生費用。 這是必要,因為您必須建立服務主體,但這在沙箱訂用帳戶中「不」支援。 如果您還沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

建立 GitHub 帳戶與存放庫

首先,如果您沒有 GitHub 帳戶,可立即到 GitHub 帳戶建立頁面建立帳戶。 (免費。)

顯示 GitHub 帳戶建立頁面的螢幕擷取畫面。

取得帳戶之後,請登入並建立新的存放庫,在此您即可將範本保留在基礎結構即程式碼 (IaC) 模型中。 若要建立存放庫(在業界通常稱為 repo),請遵循下列步驟:

  1. 在 GitHub 網站上任何頁面的右上角,使用 + 下拉式功能表並選取 [新增存放庫]。 或者,選取綠色的 [建立存放庫] 按鈕 (如有)。

    此螢幕擷取畫面顯示建立 GitHub 存放庫時可用的選項。

  2. 輸入簡短易記的存放庫名稱。 例如,使用 Deploy-ARM-Template。 (選擇性) 新增存放庫描述。 例如,輸入使用 GitHub Actions 部署我的第一個 ARM 範本

  3. 選擇存放庫可見度設定。 公用存放庫可供網際網路上的所有人存取。 私人存放庫僅限您和您明確分享存取權的人才能存取。 (兩者皆適用於本練習。)

  4. 在 [使用下列項目初始化此存放庫] 底下,選取 [新增讀我檔案]。

  5. 選取 [建立存放庫]

    顯示建立新存放庫詳細資料的螢幕擷取畫面。

您已建立存放庫,並使用讀我檔案進行初始化。 現在可將範本和範本參數檔案認可至存放庫。

注意

讀我檔案中很適合更詳細描述專案,或新增一些文件,像是如何安裝或使用專案。 讀我檔案的內容自動出現在存放庫的首頁。

將 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 訂用帳戶之間設定驗證

您必須建立 Azure 服務主體,並給予權限來建立範本中定義的資源,才能使用 GitHub Actions 將任何資源部署至 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 圖示以開啟頁面底部的殼層。

顯示開啟 Cloud Shell 的動畫。

在此殼層中,使用上述程式碼來建立服務主體。 您會得到下列結果。 請複製結果的 JSON 部分 (下列螢幕擷取畫面中紅色方塊的內容),因為在 GitHub 中設定祕密時需要用到。

此螢幕擷取畫面顯示在 Azure 中建立服務主體的結果。

在 GitHub 中執行下列步驟,以複製 JSON 輸出並將其儲存為 GitHub 存放庫中的 GitHub 秘密:從您的 GitHub 存放庫,選取 [設定] 索引標籤。從左側功能表中,選取 [秘密] 下拉式清單,然後選取 [GitHub Codespaces]

輸入下列值,然後選取 [新增祕密]

  • 名稱:輸入 AZURE_CREDENTIALS
  • 祕密:貼上稍早複製的 JSON 輸出。

此螢幕擷取畫面顯示將服務主體秘密資訊新增至 GitHub 祕密。

您需要此資訊,才能在工作流程中指定驗證。

建立工作流程

工作流程檔案必須儲存於存放庫根目錄的 .github/workflow 資料夾中。 工作流程副檔名可以是 .yml 或 .yaml。

您可以建立工作流程檔案,然後將檔案推送/上傳至存放庫。 或者,您可以使用下列程序,在 GitHub 介面中建立此檔案:

  1. 從 GitHub 存放庫選取頂端功能表中的 [動作],然後選取 [自行設定工作流程]

    此螢幕擷取畫面顯示設定工作流程時可用的選項。

  2. 如果偏好使用 main.yml 以外的名稱,請重新命名工作流程檔案。 例如,使用 deployARMTemplate.yml

  3. 使用下列列程式碼取代 .yml 檔案的內容。

    注意

    GitHub Marketplace 包含一些自訂的建置動作,其可供用來部署 ARM 範本。 本課程模組會使用稱為部署 Azure Resource Manager (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 }} 中的祕密名稱,符合您儲存至存放庫設定的祕密名稱。 也請確認 Deploy ARM Template 步驟 template: $GITHUB_WORKSPACE/azuredeploy.json 中的 ARM 範本名稱,符合您稍早儲存在存放庫中的名稱。

    注意

    如果您在設定部署認證時使用上述 Azure CLI 程式碼,則資源群組名稱應該為 GitHubActionExercise-rg。 產生的資源群組名稱是專案名稱加上 rg

  4. 選取 [開始認可]。 視需要新增註解與描述。

  5. 請確定已選取 [直接認可至主分支],然後選取 [認可新檔案] (或 [認可變更])。

    顯示將工作流程認可至主分支的螢幕擷取畫面。

    建立工作流程檔案並認可至存放庫的主分支之後,工作流程就會自動啟動,因為工作流程中的觸發程序會認可/推送至主分支。

    on:
      push:
        branches:
          - main
    
  6. 請前往存放庫並檢查工作流程的狀態。

    顯示工作流程狀態的螢幕擷取畫面。

檢查您的部署

當工作流程完成時,請前往 Azure 入口網站檢查部署狀態。

在左窗格中,選取 [資源群組]>[GitHubActionExercise-rg]。 在 [部署] 窗格中,驗證部署已成功。

顯示部署狀態的螢幕擷取畫面。