Share via


在 Azure Container Apps 中設定 Python Web 應用程式的持續部署

本文是如何將 Python Web 應用程式容器化和部署至 Azure Container Apps 的教學課程的一部分。 Container Apps 可讓您部署容器化應用程式,而不需要管理複雜的基礎結構。

在本教學課程的這個部分中,您將瞭解如何設定容器應用程式的持續部署或傳遞(CD)。 CD 是持續整合/持續傳遞(CI/CD)的DevOps實務的一部分,這是應用程式開發工作流程的自動化。 具體而言,您會使用 GitHub Actions 進行持續部署。

此服務圖表會醒目提示本文所涵蓋的元件:CI/CD 的設定。

A screenshot of the services in the Tutorial - Deploy a Python App on Azure Container Apps. Sections highlighted are parts related to continuous integration - continuous delivery (CI/CD).

必要條件

若要設定持續部署,您需要:

  • 本教學課程系列前一篇文章建立的資源及其設定,其中包括 Azure Container Registry 和 Azure Container Apps 中的容器應用程式。

  • GitHub 帳戶,您可以在其中派生範例程式代碼 (DjangoFlask),而且您可以從 Azure Container Apps 連線到 。 (如果您已下載範例程序代碼,而不是分叉,請確定您將本機存放庫推送至 GitHub 帳戶。

  • 您可以選擇性 地在開發環境中安裝 Git ,以變更程式碼並推送至 GitHub 中的存放庫。 或者,您也可以直接在 GitHub 中進行變更。

設定容器的CD

在本教學課程的上一篇文章中,您已在 Azure Container Apps 中建立並設定容器應用程式。 組態的一部分是從 Azure Container Registry 提取 Docker 映射。 建立容器 修訂時,容器映像會從登錄提取,例如當您第一次設定容器應用程式時。

在本節中,您會使用 GitHub Actions 工作流程來設定持續部署。 透過持續部署,會根據觸發程式建立新的 Docker 映像和容器修訂。 本教學課程中的觸發程式是存放庫主要分支的任何變更,例如提取要求 (PR)。 觸發時,工作流程會建立新的 Docker 映像、將它推送至 Azure Container Registry,並使用新的映像將容器應用程式更新為新的修訂。

Azure CLI 命令可以在 Azure Cloud Shell 或已安裝 Azure CLI工作站上執行。

如果您在 Windows 電腦上的 Git Bash 殼層中執行命令,請在繼續之前輸入下列命令:

export MSYS_NO_PATHCONV=1

步驟 1: 使用 az ad sp create-for-rbac 命令建立服務主體。

az ad sp create-for-rbac \
--name <app-name> \
--role Contributor \
--scopes "/subscriptions/<subscription-ID>/resourceGroups/<resource-group-name>"

其中:

  • <app-name> 是服務主體的選擇性顯示名稱。 如果您離開 --name 選項,就會產生 GUID 做為顯示名稱。
  • <subscription-ID> 是 GUID,可唯一識別您在 Azure 中的訂用帳戶。 如果您不知道訂用帳戶標識碼,您可以執行 az account show 命令,並從輸出中的 屬性複製它 id
  • <resource-group-name> 是包含 Azure Container Apps 容器的資源群組名稱。 角色型訪問控制 (RBAC) 位於資源群組層級。 如果您遵循本教學課程中上一篇文章中的步驟,則資源組名為 pythoncontainer-rg

針對下一個步驟儲存此命令的輸出,特別是用戶端標識元(屬性)、客戶端密碼(appIdpassword屬性)和租使用者標識碼(屬性)。tenant

步驟 2。 使用 az containerapp github-action add 命令設定 GitHub Actions。

az containerapp github-action add \
--resource-group <resource-group-name> \
--name python-container-app \
--repo-url <https://github.com/userid/repo> \
--branch main \
--registry-url <registry-name>.azurecr.io \
--service-principal-client-id <client-id> \
--service-principal-tenant-id <tenant-id> \
--service-principal-client-secret <client-secret> \
--login-with-github

其中:

  • <resource-group-name> 是資源群組的名稱。 如果您遵循本教學課程,其為 “pythoncontainer-rg”。
  • <https://github.com/userid/repo> 是 GitHub 存放庫的 URL。 如果您遵循本教學課程中的步驟,它將會是 https://github.com/userid/msdocs-python-django-azure-container-appshttps://github.com/userid/msdocs-python-flask-azure-container-apps; 其中 userid 是您的 GitHub 用戶識別碼。
  • <registry-name> 是您在本教學課程中建立的現有 Container Registry,或是您可以使用的容器登錄。
  • <client-id> 是上一az ad sp create-for-rbac個命令中 appId 屬性的值。 標識符是格式為 000000000-0000-0000-0000-0000000000 的 GUID。
  • <tenant-id> 是上az ad sp create-for-rbac一個命令中 tenant 屬性的值。 標識碼也是類似於用戶端識別碼的 GUID。
  • <client-secret> 是上一az ad sp create-for-rbac個命令中 password 屬性的值。

在持續部署的設定中, 服務主體 可用來讓 GitHub Actions 存取和修改 Azure 資源。 資源存取受限於指派給服務主體的角色。 服務主體已在包含容器應用程式的資源群組上指派內 建參與者 角色。

如果您已遵循入口網站的步驟,系統會自動為您建立服務主體。 如果您已遵循 Azure CLI 的步驟,請先明確建立服務主體,再設定持續部署。

使用 GitHub Actions 重新部署 Web 應用程式

在本節中,您會變更範例存放庫分支複本,並確認變更會自動部署到網站。

如果您還沒有,請建立 範例存放庫的分支DjangoFlask)。 您可以直接從 GitHub 或在開發環境中,使用 Git 進行程式碼變更。

步驟 1: 移至範例存放庫的分支,然後在主要分支中啟動。

Screenshot showing a fork of the sample repo and starting in the main branch.

步驟 2。 進行變更。

  • 移至 /templates/base.html 檔案。 (對於 Django,路徑是: restaurant_review/templates/restaurant_review/base.html
  • 選取 [編輯 ],並將片語 [Azure 餐廳評論] 變更為 [Azure 餐廳評論 - 重新部署]。

Screenshot showing how to make a change in a template file in the fork of the sample repo.

步驟 3。 直接將變更認可至 主要 分支。

  • 在您編輯的頁面底部,選取 [ 認可 ] 按鈕。
  • 認可會啟動 GitHub Actions 工作流程。

Screenshot showing how to commit a change in a template file in the fork of the sample repo.

注意

我們顯示直接在main分支中進行變更。 在一般軟體工作流程中,您將變更main以外的分支,然後建立提取要求 (PR),將這些變更合併為main。 PR也會啟動工作流程。

關於 GitHub Actions

檢視工作流程歷程記錄

步驟 1:GitHub 上,移至範例存放庫的分支,然後開啟 [ 動作] 索引卷標。

Screenshot showing how to view GitHub Actions for a repo and look at workflows.

工作流程密碼

.github/workflows/<workflow-name>.yml 新增至存放庫的工作流程檔案中,您會看到工作流程建置和容器應用程式更新作業所需的認證佔位符。 認證資訊會加密儲存在存放庫中,設定 [安全性/秘密] 和 [變數/動作] 底下。

Screenshot showing how to see where GitHub Actions secrets are stored in GitHub.

如果認證資訊變更,您可以在這裡更新它。 例如,如果重新產生 Azure Container Registry 密碼,您必須更新REGISTRY_PASSWORD值。 如需詳細資訊,請參閱 GitHub 檔中的加密密碼

OAuth 授權的應用程式

當您設定持續部署時,您會將 Azure Container Apps 授權為 GitHub 帳戶的授權 OAuth 應用程式。 Container Apps 會使用授權的存取權,在 .github/workflows/<workflow-name> 中建立 GitHub Actions YML 檔案.yml。 您可以在帳戶的 Integrations/Applications 底下查看您的授權應用程式並撤銷許可權。

Screenshot showing how to see the authorized apps for a user in GitHub.

疑難排解秘訣

使用 Azure CLI az ad sp create-for-rba 命令設定服務主體時發生錯誤。

  • 您收到包含「InvalidSchema:找不到連線配接器」的錯誤。

  • 您收到包含「多個應用程式具有相同顯示名稱」的錯誤。

    • 此錯誤表示服務主體的名稱已採用。 選擇另一個名稱或離開自變數, --name GUID 將會自動產生為顯示名稱。

GitHub Actions 工作流程失敗。

  • 若要檢查工作流程的狀態,請移至 存放庫的 [動作] 索引標籤。
  • 如果有失敗的工作流程,請鑽研其工作流程檔案。 應該有兩個作業「建置」和「部署」。 針對失敗的工作,請查看作業工作的輸出以尋找問題。
  • 如果您看到具有「TLS 交握逾時」的錯誤訊息,請選取存放庫 [動作] 索引標籤下的 [觸發自動部署] 來手動執行工作流程,以查看逾時是否為暫時性問題。
  • 如果您如本教學課程所示設定容器應用程式的持續部署,系統會自動為您建立工作流程檔案 (.github/workflows/workflow-name<>.yml)。 您不應該為此教學課程修改此檔案。 如果您這麼做,請還原您的變更,並嘗試工作流程。

網站不會顯示您在主要分支中合併的變更。

  • 在 GitHub 中:檢查 GitHub Actions 工作流程是否已執行,而且您已將變更簽入觸發工作流程的分支。
  • 在 Azure 入口網站:檢查 Azure Container Registry,以查看變更分支之後是否已使用時間戳建立新的 Docker 映射。
  • 在 Azure 入口網站:檢查容器應用程式的記錄。 如果有程式設計錯誤,您將在這裡看到錯誤。
    • 移至容器應用程式 |修訂管理 | <使用中容器> |修訂詳細數據 |主控台記錄
    • 選擇要顯示「產生時間」、「Stream_s」和「Log_s」的數據行順序。 先依最新的記錄排序,並在 「Stream_s」 資料行中尋找 Python stderrstdout 訊息。 Python 'print' 輸出將會是 stdout 訊息。
  • 使用 Azure CLI 時,請使用 az containerapp logs show 命令。

當我中斷持續部署的連線時,會發生什麼事?

  • 停止持續部署表示中斷容器應用程式與存放庫的連線。 若要中斷連線:

    • 在 Azure 入口網站 中,移至容器應用程式,選取 [持續部署資源],然後選取 [中斷連線]。
    • 使用 Azure CLI 時,請使用 az container app github-action remove 命令。
  • 中斷連線之後,請在 GitHub 存放庫中:

    • . github/workflows/<workflow-name>.yml 檔案會從您的存放庫中移除。
    • 不會移除秘密金鑰。
    • Azure Container Apps 會維持為 GitHub 帳戶的授權 OAuth 應用程式。
  • 中斷連線之後,在 Azure 中:

    • 容器會保留最後一個已部署的容器。 您可以重新連接容器應用程式與 Azure Container Registry,讓新的容器修訂挑選最新的映像。
    • 不會刪除建立及用於持續部署的服務主體。

下一步

如果您已完成本教學課程,且不想產生額外的成本,請移除所使用的資源。 拿掉資源群組會移除群組中的所有資源,而且是移除資源最快的方式。 如需如何移除資源群組的範例,請參閱 容器化教學課程清除

如果您打算在本教學課程上建置,以下是您可以採取的一些後續步驟。