教學課程:使用 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 是更複雜的程序,可提供強化的安全性。
若您沒有現有的應用程式,請註冊可存取資源的新 Microsoft Entra ID 應用程式與服務主體。
az ad app create --display-name myApp
此命令會使用作為您
client-id
的appId
來輸出 JSON。id
是APPLICATION-OBJECT-ID
,而且會用來搭配圖形 API 呼叫建立同盟認證。 儲存值以稍後作為AZURE_CLIENT_ID
GitHub 秘密。建立服務主體。 將
$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
為服務主體建立新的角色指派。 依預設,角色指派將會繫結至您的預設訂用帳戶。 以訂用帳戶識別碼取代
$subscriptionId
,以資源群組名稱取代$resourceGroupName
,並以新建立的服務主體物件識別碼取代$servicePrincipalId
。az role assignment create --role contributor --subscription $subscriptionId --assignee-object-id $servicePrincipalId --assignee-principal-type ServicePrincipal --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroupName
執行下列命令,為您的 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-branch
或repo:n-username/ node_express:ref:refs/tags/my-tag
。 - 針對由提取要求事件所觸發的工作流程:
repo:< Organization/Repository >:pull_request
。
- 您 GitHub Actions 環境中的工作:
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" ] }
- 針對您的 Microsoft Entra ID 應用程式,以 objectId (建立應用程式時產生) 取代
若要了解如何在 Azure 入口網站中建立 Active Directory 應用程式、服務主體與同盟認證,請參閱連線 GitHub 與 Azure。
設定用於驗證的 GitHub 祕密
您必須將應用程式的用戶端識別碼、租用戶識別碼和訂用帳戶識別碼提供給登入動作。 這些值可以直接在工作流程中提供,也可以儲存在 GitHub 的秘密中,並在您的工作流程中參考。 將值儲存為 GitHub 秘密是較安全的選擇。
在 GitHub (英文) 中,前往您的存放庫。
移至導覽功能表中的 [設定]。
選取 [安全性] > [祕密和變數] > [動作]。
選取 [新增存放庫祕密]。
建立
AZURE_CLIENT_ID
、AZURE_TENANT_ID
和AZURE_SUBSCRIPTION_ID
的秘密。 使用 Microsoft Entra 應用程式中的這些值來取得 GitHub 祕密:GitHub 祕密 Microsoft Entra 應用程式 AZURE_CLIENT_ID 應用程式 (用戶端) 識別碼 AZURE_TENANT_ID 目錄 (租用戶) 識別碼 AZURE_SUBSCRIPTION_ID 訂用帳戶識別碼 選取 [新增秘密] 以儲存每個秘密。
新增 SQL Server 祕密
在 SQL_SERVER_ADMIN_PASSWORD
的存放庫中建立新的祕密。 此祕密可以是任何符合 Azure 密碼安全性標準的密碼。 您無法再次存取此密碼,請另外儲存。
建立 Azure 資源
建立 Azure 資源工作流程會執行 ARM 範本,以將資源部署至 Azure。 工作流程:
- 使用簽出動作來簽出原始程式碼。
- 使用 Azure 登入動作來登入 Azure,並收集環境和 Azure 資源資訊。
- 使用 Azure Resource Manager 部署動作來部署資源。
若要執行建立 Azure 資源工作流程:
在存放庫的
.github/workflows
中開啟azuredeploy.yaml
檔案。將
AZURE_RESOURCE_GROUP
的值更新為您的資源群組名稱。將
WEB_APP_NAME
和SQL_SERVER_NAME
的值更新為 Web 應用程式名稱和 SQL 伺服器名稱。移至 [動作],然後選取 [執行工作流程]。
檢查 [動作] 頁面上的綠色核取記號,確認動作已成功執行。
新增容器登錄和 SQL 祕密
在 Azure 入口網站中,開啟資源群組中新建立的 Azure Container Registry。
移至 [存取金鑰],並複製使用者名稱和密碼值。
在存放庫中為
ACR_USERNAME
和ACR_PASSWORD
密碼建立新的 GitHub 祕密。在 Azure 入口網站中,開啟 Azure SQL 資料庫。 開啟 [連接字串] 並複製值。
為
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 資料庫,並將預備位置交換至生產環境。
若要執行建置、推送和部署工作流程:
在存放庫的
.github/workflows
中開啟build-deploy.yaml
檔案。確認
AZURE_RESOURCE_GROUP
和WEB_APP_NAME
的環境變數符合azuredeploy.yaml
中的環境變數。針對您的 Azure Container Registry 登入伺服器更新
ACR_LOGIN_SERVER
值。