共用方式為


教學課程:使用 GitHub Actions 部署至 App Service 自訂容器並連線到資料庫

本教學課程會逐步引導您設定 GitHub Actions 工作流程,以使用 Azure SQL Database 後端部署容器化 ASP.NET Core 應用程式。 完成時,您的 ASP.NET 應用程式就會在 Azure 中執行,並已連線到 SQL Database。 您必須先使用 ARM 範本 GitHub Actions 工作流程來建立 Azure 資源。

在本教學課程中,您會了解如何:

  • 使用 GitHub Actions 工作流程,透過 Azure Resource Manager 範本 (ARM 範本) 將資源新增至 Azure
  • 使用 GitHub Actions 工作流程來建置具有最新 Web 應用程式變更的容器

如果您沒有 Azure 訂閱,請在開始之前,先建立 Azure 免費帳戶

必要條件

若要完成此課程,您會需要:

  • 具有有效訂用帳戶的 Azure 帳戶。 免費建立帳戶
  • GitHub 帳戶。 如果您沒有 Microsoft 帳戶,請免費註冊
    • GitHub 存放庫,以儲存 Resource Manager 範本和工作流程檔案。 若要建立一個,請參閱建立新的存放庫 \(英文\)。

下載範例

在 Azure 範例存放庫中派生範例專案

https://github.com/Azure-Samples/dotnetcore-containerized-sqldb-ghactions/

建立資源群組

開啟位於 https://shell.azure.com 的 Azure Cloud Shell。 您也可以使用 Azure CLI (如果已安裝在本機)。 (如需 Cloud Shell 的詳細資訊,請參閱「Cloud Shell 概觀」。)

    az group create --name {resource-group-name} --location {resource-group-location}

產生部署認證

OpenID Connect 是使用短期權杖的驗證方法。 使用 GitHub Actions 設定 OpenID Connect 是更複雜的程序,可提供強化的安全性。

  1. 若您沒有現有的應用程式,請註冊可存取資源的新 Microsoft Entra ID 應用程式與服務主體

    az ad app create --display-name myApp
    

    此命令會使用作為您 client-idappId 來輸出 JSON。 idAPPLICATION-OBJECT-ID,而且會用來搭配圖形 API 呼叫建立同盟認證。 儲存值以稍後作為 AZURE_CLIENT_ID GitHub 秘密。

  2. 建立服務主體。 將 $appID 取代為您 JSON 輸出中的 appId。

    這個命令會使用服務主體 id 產生 JSON 輸出。 服務主體 id 是作為下一個步驟中 az role assignment create 命令中 --assignee-object-id 引數的值。

    從 JSON 輸出複製 appOwnerOrganizationId 以供稍後作為 AZURE_TENANT_ID 的 GitHub 祕密使用。

     az ad sp create --id $appId
    
  3. 為服務主體建立新的角色指派。 依預設,角色指派將會繫結至您的預設訂用帳戶。 以訂用帳戶識別碼取代 $subscriptionId,以資源群組名稱取代 $resourceGroupName,並以新建立的服務主體物件識別碼取代 $servicePrincipalId

    az role assignment create --role contributor --subscription $subscriptionId --assignee-object-id  $servicePrincipalId --assignee-principal-type ServicePrincipal --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroupName
    
  4. 執行下列命令,為您的 Microsoft Entra ID 應用程式建立新的同盟身分識別認證

    • 針對您的 Microsoft Entra ID 應用程式,以 objectId (建立應用程式時產生) 取代 APPLICATION-OBJECT-ID
    • CREDENTIAL-NAME 的值設定為稍後參考。
    • 設定 subject。 依據您的工作流程,GitHub 會定義此項目的值:
      • 您 GitHub Actions 環境中的工作:repo:< Organization/Repository >:environment:< Name >
      • 針對未繫結至環境的作業,請根據用來觸發工作流程的參考路徑,包含分支/標記的參考路徑:repo:< Organization/Repository >:ref:< ref path>。 例如,repo:n-username/ node_express:ref:refs/heads/my-branchrepo:n-username/ node_express:ref:refs/tags/my-tag
      • 針對由提取要求事件所觸發的工作流程:repo:< Organization/Repository >:pull_request
    az ad app federated-credential create --id <APPLICATION-OBJECT-ID> --parameters credential.json
    ("credential.json" contains the following content)
    {
        "name": "<CREDENTIAL-NAME>",
        "issuer": "https://token.actions.githubusercontent.com",
        "subject": "repo:octo-org/octo-repo:environment:Production",
        "description": "Testing",
        "audiences": [
            "api://AzureADTokenExchange"
        ]
    }
    

若要了解如何在 Azure 入口網站中建立 Active Directory 應用程式、服務主體與同盟認證,請參閱連線 GitHub 與 Azure

設定用於驗證的 GitHub 祕密

您必須將應用程式的用戶端識別碼租用戶識別碼訂用帳戶識別碼提供給登入動作。 這些值可以直接在工作流程中提供,也可以儲存在 GitHub 的秘密中,並在您的工作流程中參考。 將值儲存為 GitHub 秘密是較安全的選擇。

  1. GitHub (英文) 中,前往您的存放庫。

  2. 移至導覽功能表中的 [設定]

  3. 選取 [安全性] > [祕密和變數] > [動作]。

    新增祕密的螢幕擷取畫面

  4. 選取 [新增存放庫祕密]。

  5. 建立 AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_SUBSCRIPTION_ID 的秘密。 使用 Microsoft Entra 應用程式中的這些值來取得 GitHub 祕密:

    GitHub 祕密 Microsoft Entra 應用程式
    AZURE_CLIENT_ID 應用程式 (用戶端) 識別碼
    AZURE_TENANT_ID 目錄 (租用戶) 識別碼
    AZURE_SUBSCRIPTION_ID 訂用帳戶識別碼
  6. 選取 [新增秘密] 以儲存每個秘密。

新增 SQL Server 祕密

SQL_SERVER_ADMIN_PASSWORD 的存放庫中建立新的祕密。 此祕密可以是任何符合 Azure 密碼安全性標準的密碼。 您無法再次存取此密碼,請另外儲存。

建立 Azure 資源

建立 Azure 資源工作流程會執行 ARM 範本,以將資源部署至 Azure。 工作流程:

若要執行建立 Azure 資源工作流程:

  1. 在存放庫的 .github/workflows 中開啟 azuredeploy.yaml 檔案。

  2. AZURE_RESOURCE_GROUP 的值更新為您的資源群組名稱。

  3. WEB_APP_NAMESQL_SERVER_NAME 的值更新為 Web 應用程式名稱和 SQL 伺服器名稱。

  4. 移至 [動作],然後選取 [執行工作流程]

    執行 GitHub Actions 工作流程以新增資源。

  5. 檢查 [動作] 頁面上的綠色核取記號,確認動作已成功執行。

    建立資源成功執行。

新增容器登錄和 SQL 祕密

  1. 在 Azure 入口網站中,開啟資源群組中新建立的 Azure Container Registry。

  2. 移至 [存取金鑰],並複製使用者名稱和密碼值。

  3. 在存放庫中為 ACR_USERNAMEACR_PASSWORD 密碼建立新的 GitHub 祕密。

  4. 在 Azure 入口網站中,開啟 Azure SQL 資料庫。 開啟 [連接字串] 並複製值。

  5. SQL_CONNECTION_STRING 建立新的祕密。 請將 {your_password} 取代為您自己的 SQL_SERVER_ADMIN_PASSWORD

建置、推送和部署映像

建置、推送和部署工作流程會建置具有最新應用程式變更的容器、將容器推送至 Azure Container Registry,以及更新 Web 應用程式預備位置以指向推送的最新容器。 工作流程包含建置和部署作業:

  • 建置作業會使用簽出動作來簽出原始程式碼。 作業接著會使用 Docker 登入動作和自訂指令碼來驗證 Azure Container Registry、建置容器映像,並將其部署至 Azure Container Registry。
  • 部署作業會使用 Azure 登入動作來登入 Azure,並收集環境和 Azure 資源資訊。 作業接著會使用 Azure App Service Settings 動作來更新 Web 應用程式設定,並使用 Azure Web Deploy 動作部署到 App Service 預備位置。 最後,作業會執行自訂指令碼來更新 SQL 資料庫,並將預備位置交換至生產環境。

若要執行建置、推送和部署工作流程:

  1. 在存放庫的 .github/workflows 中開啟 build-deploy.yaml 檔案。

  2. 確認 AZURE_RESOURCE_GROUPWEB_APP_NAME 的環境變數符合 azuredeploy.yaml 中的環境變數。

  3. 針對您的 Azure Container Registry 登入伺服器更新 ACR_LOGIN_SERVER 值。

下一步