共用方式為


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

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

在本教學課程中,您會:

  • 使用 GitHub Actions 工作流程,為容器應用程式設定持續部署。
  • 變更範例存放庫的複本,以觸發 GitHub Actions 工作流程。
  • 針對設定持續部署時可能會遇到的問題進行疑難解答。
  • 完成教學課程系列時,請移除您不需要的資源。

持續部署與持續整合和持續傳遞的 DevOps 做法相關,這是應用程式開發工作流程的自動化。

下圖醒目提示本教學課程中的工作。

Azure Container Apps 上部署 Python 應用程式的相關服務圖表,其中已醒目提示關於持續部署的部分。

先決條件

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

  • 您在上一個教學課程中建立的資源(及其組態),其中包含 azure Container Registry 實例,以及 Azure Container Apps中的容器應用程式 實例。

  • GitHub 帳戶,可讓您分叉範例程式代碼(DjangoFlask),而且您可以從 Azure Container Apps 連線到該帳戶。 (如果您下載了範例程式碼而不是分叉,請務必將本機存放庫推送至您的 GitHub 帳戶。)

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

設定容器的持續部署

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

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

您可以在 Azure Cloud Shell 或在安裝 Azure CLI 的 工作站上執行 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>"
    

    在命令中:

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

    儲存此命令的輸出以供下一個步驟使用。 特別是,儲存用戶端識別碼(appId 屬性)、客戶端密碼(password 屬性),以及租用戶標識碼(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。 在這些 URL 中,userid 是您 GitHub 用戶識別碼。
    • <登錄名稱> 是您在上一個教學課程中建立的現有 Azure Container Registry 實例,或是您可以使用的實例。
    • <用戶端識別碼> 是上一個 appId 命令中 az ad sp create-for-rbac 屬性的值。 識別碼是格式為 00000000-0000-0000-0000-00000000的 GUID。
    • <tenant-id> 是上一個 tenant 命令中 az ad sp create-for-rbac 屬性的值。 ID 也是一個類似客戶端 ID 的 GUID。
    • <客戶端密碼> 是上一個 password 命令中 az ad sp create-for-rbac 屬性的值。

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

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

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

在本節中,您會在您衍生的範例資料庫中進行變更。 之後,您可以確認變更會自動部署到網站。

如果您尚未建立範例存放庫的 分支DjangoFlask)。 您可以直接在 GitHub 上進行程式碼變更,或在命令列中使用 Git操作開發環境。

  1. 移至您範例存放庫的分支,並在 主分支 中開始。

    顯示範例存放庫分支中主要分支的螢幕快照。

  2. 做出改變:

    1. 移至 /templates/base.html 檔案。 (對於 Django,路徑為 restaurant_review/templates/restaurant_review/base.html
    2. 選取 編輯,並將片語 Azure Restaurant Review 變更為 Azure Restaurant Review - Redeployed

    顯示如何在範例存放庫的分支中對範本檔案進行變更的螢幕截圖。

  3. 在您正在編輯的頁面底部,請確保已選取[直接提交至主要分支]。 然後選擇 [提交變更] 按鈕。

    一個顯示如何在範例存放庫的分叉中提交範本檔案變更選項的螢幕快照。

認可會啟動 GitHub Actions 工作流程。

注意

本教學課程示範直接在 主要分支 上進行變更。 在典型的軟體工作流程中,您會在 main 以外的分支中進行變更,然後建立拉取請求,以將變更合併至 main。 Pull request 也會啟動工作流程。

瞭解 GitHub Actions

檢視工作流程歷程記錄

如果您需要檢視工作流程歷程記錄,請使用下列其中一個程式。

GitHub上,移至範例存放庫的分支,然後開啟 [Actions] 索引標籤。

顯示在存放庫「動作」標籤中的工作流程的螢幕截圖。

工作流程秘密

.github/workflows/<工作流程名稱>.yml 工作流程文件已新增至存放庫,其中包含工作流程的建置與容器應用程式更新任務所需證書的佔位符。 認證資訊會以加密方式儲存在存放庫的 [設定] 區域中,[安全性>秘密和變數] 底下,>Actions

顯示 GitHub Actions 憑證作為秘密的螢幕截圖。

如果認證資訊變更,您可以在這裡更新它。 例如,如果重新生成 Azure 容器登錄檔的密碼,您必須更新 REGISTRY_PASSWORD 的值。 如需詳細資訊,請參閱 GitHub 文件中的 加密的憑證

OAuth 授權的應用程式

當您設定持續部署時,會將 Azure Container Apps 指定為 GitHub 帳戶的授權 OAuth 應用程式。 Container Apps 會使用授權的存取權,在 .github/workflows/<工作流程名稱 >.yml中建立 GitHub Actions YAML 檔案。 您可以在 Integrations>Applications底下檢視授權的應用程式,以及撤銷帳戶中的許可權。

顯示 GitHub 中使用者授權應用程式位置的螢幕快照。

疑難排解

透過 Azure CLI 設定服務主體時,您會遇到錯誤

本節可協助您使用 Azure CLI az ad sp create-for-rba 命令,針對設定服務主體時取得的錯誤進行疑難解答。

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

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

  • 服務主體的名稱已經採用。 選擇其他名稱,或離開 --name 自變數。 GUID 會自動產生為顯示名稱。

GitHub Actions 工作流程失敗

若要檢查工作流程的狀態,請移至儲存庫的 [Actions] 標籤:

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

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

在 GitHub 中:

  • 檢查 GitHub Actions 工作流程是否已執行完畢,並確認您已將變更提交至觸發工作流程的分支。

在 Azure 入口網站中:

  • 檢查 Azure 容器登錄實例,以查看在變更分支後是否已使用時間戳記建立新的 Docker 映像。

  • 檢查容器應用程式的記錄,以查看是否有程式設計錯誤:

    1. 移至容器應用程式,然後移至 修訂管理><使用中容器>>修訂詳細資訊>主控台記錄
    2. 選擇欄位的顯示順序:產生時間Stream_sLog_s
    3. 依最新記錄排序,並尋找 Stream_s 數據行中的 Python stderrstdout 訊息。 Python print 輸出是 stdout 訊息。

在 Azure CLI 中:

您要停止持續部署

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

在 Azure 入口網站中:

  • 移至容器應用程式。 在服務功能表上,選取 [持續部署],然後選取 [中斷連線]。

在 Azure CLI 中:

中斷連線之後:

  • .github/workflows/<workflow-name>.yml 檔案會從存放庫移除。
  • 秘密金鑰不會從存放庫移除。
  • Azure Container Apps 仍然是您 GitHub 帳戶的授權 OAuth 應用程式。
  • 在 Azure 中,容器會保留最後一個已部署的容器。 您可以將容器應用程式重新連接到 Azure Container Registry 實例,以便新的容器修訂可以使用最新的映像。
  • 在 Azure 中,不會刪除您建立並用於持續部署的服務主體。

移除資源

如果您已完成教學課程系列,且不想產生額外的成本,請移除您使用的資源。

拿掉資源群組會移除群組中的所有資源,而且是移除資源最快的方式。 如需如何移除資源群組的範例,請參閱 Containerize 教學課程清除

如果您打算在本教學課程上進一步發展,以下是您可以採取的一些後續步驟: