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

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

在本教學課程中,您會:

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

持續部署與 DevOps 中的持續整合與持續交付(CI/CD)實務相關,後者是自動化您的應用程式開發工作流程。

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

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

先決條件

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

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

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

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

設定容器的持續部署

在上一個教學課程中,您已在 Azure 容器應用程式 中建立並設定容器應用程式。 組態的一部分是從 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 容器應用程式 容器的資源群組名稱。 角色型訪問控制 (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/<workflow-name>.yml 工作流程檔案,包含該工作流程中的建置作業和容器應用程式更新作業所需憑證的預留位置。 將加密的憑證資訊儲存在儲存庫的 設定 區,位於 安全>秘密與變數>操作中。

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

如果憑證資訊有變動,請在此更新。 例如,如果 Azure Container Registry 密碼被重新生成,請更新該REGISTRY_PASSWORD值。 如需詳細資訊,請參閱 GitHub 文件中的 加密的憑證

OAuth 授權的應用程式

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

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

疑難排解

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

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

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

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

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

GitHub Actions 工作流程失敗

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

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

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

在 GitHub 中:

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

在 Azure 入口網站中:

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

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

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

在 Azure CLI 中:

您要停止持續部署

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

在 Azure 入口網站中:

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

在 Azure CLI 中:

中斷連線之後:

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

移除資源

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

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

如果你打算在此教學基礎上繼續發展,請考慮以下步驟: