在 Azure Container Apps 中設定 Python Web 應用程式的持續部署
本文是關於如何將 Python 網路應用程式容器化和部署至 Azure Container Apps的教學課程的一部分。 Container Apps 可讓您部署容器化應用程式,而不需要管理複雜的基礎結構。
在本教學課程的這個部分中,您將瞭解如何設定容器應用程式的持續部署或傳遞(CD)。 CD 是持續整合/持續傳遞(CI/CD)的DevOps實務的一部分,這是應用程式開發工作流程的自動化。 具體而言,您會使用 GitHub Actions 來進行持續部署。
此服務圖表會醒目提示本文所涵蓋的元件:CI/CD 的設定。
先決條件
若要設定持續部署,您需要:
在本教學課程系列的
前一篇文章 中建立的資源及其配置,包括 Azure Container Registry和 Azure Container Apps 中的容器應用程式。 GitHub 帳戶,可讓您分叉範例程式代碼(Django 或 Flask),而且您可以從 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
使用 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>"
哪裡:
-
<應用程式名稱> 是服務主體的選擇性顯示名稱。 如果您省略
--name
選項,就會產生 GUID 作為顯示名稱。 -
<訂用帳戶標識碼> 是可在 Azure 中唯一識別訂用帳戶的 GUID。 如果您不知道您的訂閱 ID,可以執行 az account show 命令,然後從輸出中的
id
屬性中進行複製。 -
<resource-group-name> 是包含 Azure Container Apps 容器的資源群組名稱。 角色型訪問控制 (RBAC) 位於資源群組層級。 如果您遵循本教學課程中上一篇文章中的步驟,資源組名會
pythoncontainer-rg
。
針對下一個步驟儲存此命令的輸出,特別是用戶端 ID(
appId
屬性)、客戶端密碼(password
屬性),以及租用者 ID(tenant
屬性)。-
<應用程式名稱> 是服務主體的選擇性顯示名稱。 如果您省略
使用 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-apps
或https://github.com/userid/msdocs-python-flask-azure-container-apps
,其中userid
是您的 GitHub 用戶識別碼。 - <登錄名稱> 是您在本教學課程中建立的現有 Container Registry,或是您可以使用的容器登錄。
-
<用戶端識別碼> 是上一個
az ad sp create-for-rbac
命令中appId
屬性的值。 標識符是格式為 00000000-0000-0000-0000-00000000 的GUID。 -
<tenant-id> 是上一個
az ad sp create-for-rbac
命令中tenant
屬性的值。 ID 也是類似於客戶端 ID 的 GUID。 -
<客戶端密碼> 是上一個
az ad sp create-for-rbac
命令中password
屬性的值。
在持續部署的設定中,會使用 服務主體,讓 GitHub Actions 存取和修改 Azure 資源。 資源存取受限於指派給服務主體的角色。 服務主體已獲指派在包含容器應用程式的資源群組上擔任內建於 的參與者 角色。
如果您已遵循入口網站的步驟,系統會自動為您建立服務主體。 如果您已遵循 Azure CLI 的步驟,請先明確建立服務主體,再設定持續部署。
使用 GitHub Actions 重新部署 Web 應用程式
在本節中,您將對範例資料庫的分支副本進行變更,並確認變更會自動部署到網站中。
如果您尚未建立範例存放庫的 分支(Django 或 Flask)。 您可以直接在 GitHub 上進行程式碼變更,或在命令列中使用 Git操作開發環境。
注意
我們展示了在 主要 分支上直接進行變更。 在典型的軟體工作流程中,您會在非 main 的分支中進行變更,然後建立 Pull Request(PR),將這些變更合併到 main。 PR 也會啟動工作流程。
關於 GitHub Actions
檢視工作流程歷程記錄
工作流程秘密
在已新增至存放庫的 .github/workflows/<工作流程名稱>.yml 工作流程檔案中,您會看到工作流程建置和容器應用程式更新作業所需的認證佔位符。 認證資訊會以加密方式儲存在存放庫中,設定安全性/秘密和變數/動作。
如果認證資訊變更,您可以在這裡更新它。 例如,如果重新產生 Azure Container Registry 密碼,您必須更新REGISTRY_PASSWORD值。 如需詳細資訊,請參閱 GitHub 文件中的 加密的憑證。
OAuth 授權的應用程式
當您設定持續部署時,您會將 Azure Container Apps 授權為 GitHub 帳戶的授權 OAuth 應用程式。 Container Apps 會使用授權的存取權,在 .github/workflows/
疑難解答秘訣
使用 Azure CLI az ad sp create-for-rba
命令設定服務主體時發生錯誤。
您收到錯誤訊息,其中包含「InvalidSchema:找不到連線配接器」。
- 檢查您正在執行的殼層。 如果使用 Bash 殼層,請設定MSYS_NO_PATHCONV變數,如下所示
export MSYS_NO_PATHCONV=1
。 如需詳細資訊,請參閱 GitHub 問題 無法從 git bash 殼層使用 Azure CLI 建立服務主體,找不到連線配接器。。
- 檢查您正在執行的殼層。 如果使用 Bash 殼層,請設定MSYS_NO_PATHCONV變數,如下所示
您收到包含「多個應用程式具有相同顯示名稱」的錯誤。
- 此錯誤表示服務主體的名稱已經被使用。 選擇另一個名稱或離開
--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 stderr 和 stdout 訊息。 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 容器登錄,以便新的容器修訂可以獲取最新的鏡像。
- 不會刪除建立及用於持續部署的服務主體。
後續步驟
如果您已完成本教學課程,且不想產生額外的成本,請移除所使用的資源。 拿掉資源群組會移除群組中的所有資源,而且是移除資源最快的方式。 如需如何移除資源群組的範例,請參閱 Containerize 教學課程清除。
如果您打算基於這個教學課程進行開發,以下是您可以採取的一些後續步驟。