使用 GitHub Actions 將 Python Web 應用程式部署至 App Service (Linux)

本文說明如何使用 GitHub Actions 中的持續整合和持續傳遞 (CI/CD) 平臺,將 Python Web 應用程式部署至 Linux 上的 Azure App Service。 您的 GitHub Actions 工作流程會在存放庫認可時,自動建置程式代碼,並將其部署至 App Service 實例。 您可以在 GitHub Actions 工作流程中新增其他自動化,例如測試腳本、安全性檢查和多階段部署。

建立應用程式程式代碼的存放庫

若要完成本文中的程序,您需要一個提交至 GitHub 存放庫的 Python 網頁應用程式。

備註

如果您的應用程式使用 Django 和 SQLite 資料庫,則不適用於這些程式。 由於其本地檔案儲存的限制,SQLite 在大多數雲端環境中不被支援。 請考慮切換至雲端相容的資料庫,例如 PostgreSQL 或 Azure Cosmos DB。 如需詳細資訊,請參閱本文稍後的 檢視 Django 注意事項。

建立目標 App Service 實例

建立 App Service 實例的最快方式是透過互動式 Azure Cloud Shell 使用 Azure 命令行介面 (CLI)。 Cloud Shell 包含 Git 和 Azure CLI。 在下列程式中,您會使用 az webapp up 命令來建立 App Service 實例,並執行應用程式的初始部署。

  1. 在 https://portal.azure.com登入 Azure 入口網站。

  2. 選取入口網站工具列上的 Cloud Shell 選項,以開啟 Azure CLI:

    顯示如何使用 Azure 入口網站工具列上的圖示動作開啟 Azure Cloud Shell 的螢幕快照。

  3. 在 Cloud Shell 中,從下拉功能表中選取 Bash 選項:

    顯示如何在 Cloud Shell 中選取 Bash 選項的螢幕快照。

  4. 在 Cloud Shell 中,使用 git clone 命令複製您的存放庫。

    小提示

    若要將命令或文字貼到 Cloud Shell 中,請使用 Ctrl+Shift+V 鍵盤快捷方式,或以滑鼠右鍵按下並選取作功能表中的 [ 貼上 ]。

    • 針對 Flask 範例應用程式,您可以使用下列命令。 將 <github-user> 部分替換為您在 GitHub 上派生此存放庫的帳戶名稱。

      git clone https://github.com/<github-user>/python-sample-vscode-flask-tutorial.git
      
    • 如果您的應用程式位於不同的存放庫,請設定特定存放庫的 GitHub Actions。 將<github-user>部分替換為您分支存放庫的 GitHub 帳戶名稱,並在<repo-name>占位符中提供實際的存放庫名稱:

      git clone https://github.com/<github-user>/<repo-name>.git
      

    備註

    Cloud Shell 是由名為 cloud-shell-storage-your-region<> 的資源群組中的 Azure 記憶體帳戶所支援。 該儲存帳戶包含 Cloud Shell 檔案系統的映像檔,並儲存複製的存放庫。 此記憶體的成本很小。 完成本文之後,您可以刪除記憶體帳戶,以及您建立的其他資源。

  5. 在 Cloud Shell 中,將目錄變更為 Python 應用程式的存放庫資料夾,因此 az webapp up 命令會將應用程式辨識為 Python。 針對 Flask 範例應用程式,您可以使用下列命令:

    cd python-sample-vscode-flask-tutorial
    
  6. 在 Cloud Shell 中,使用 az webapp up 命令來建立 App Service 實例,併為您的應用程式執行初始部署:

    az webapp up --name <app-service-name> --runtime "PYTHON:3.12"
    
    • 請為 <app-service-name> 這個佔位元指定在 Azure 中具有唯一性的 App Service 名稱。 名稱長度必須為 3-60 個字元,且只能包含字母、數位和連字元。 名稱開頭必須為字母,且結尾必須為字母或數字。

    • 如需系統上可用運行時間的清單,請使用 az webapp list-runtimes 命令。

    • 當您在命令中輸入運行時間值時,請使用 PYTHON:X.Y 格式,其中 X.Y 是 Python 主要和次要版本。

    • 您也可以使用 --location 參數來指定 App Service 實例的區域位置。 如需可用位置的清單,請使用 az account list-locations --output table 命令。

  7. 如果您的應用程式有自定義啟動文本,請使用 az webapp config 命令來起始腳本。

    • 如果您的應用程式沒有自定義啟動文本,請繼續進行下一個步驟。

    • 針對 Flask 範例應用程式,您必須執行下列命令,以存取 startup.txt 檔案中的啟動腳本:

      az webapp config set \
         --resource-group <resource-group-name> \
         --name <app-service-name> \
         --startup-file startup.txt
      

      在 <resource-group-name> 和 <app-service-name> 佔位符中提供資源組名和 App Service 實例名稱。 若要尋找資源組名,請檢查上一個 az webapp up 命令的輸出。 資源組名包含 Azure 帳戶名稱,後面接著 _rg 後綴,如 <azure-account-name>_rg_。

  8. 若要檢視執行中的應用程式,請開啟瀏覽器並移至 App Service 實例的部署端點。 在下列 URL 中,將 <app-service-name> 佔位元替換為您的 App Service 實例名稱:

    http://<app-service-name>.azurewebsites.net
    

    如果您看到一般頁面,請稍候幾秒鐘,App Service 實例才能啟動,然後重新整理頁面。

    • 如果您繼續看到泛型頁面,請確認您已從正確的資料夾部署。
    • 針對 Flask 範例應用程式,請確認您已從 python-sample-vscode-flask-tutorial 資料夾部署。 也請檢查您是否已正確設定啟動命令。

在 App Service 中設定持續部署

在下一個程式中,您會設定持續傳遞 (CD),這表示每當工作流程觸發時,就會進行新的程式碼部署。 文章範例中的觸發條件是儲存庫 主要 分支的任何變更,例如使用提取要求(PR)。

  1. 在 Cloud Shell 中,確認您位於系統 (~) 的根目錄中,而不是位於應用程式子資料夾中,例如 python-sample-vscode-flask-tutorial。

  2. 使用 az webapp deployment github-actions add 命令來新增 GitHub Actions。 請將任何佔位符替換為您的特定值:

    az webapp deployment github-actions add \
      --repo "<github-user>/<github-repo>" \
      --resource-group <resource-group-name> \
      --branch <branch-name> \
      --name <app-service-name> \
      --login-with-github
    
    • 參數 --login-with-github 會使用互動式方法來擷取個人存取令牌。 遵循提示並完成驗證。

    • 如果系統遇到具有相同 App Service 實例名稱的現有工作流程檔案,請依照提示選擇是否覆寫工作流程。 您可以使用 --force 參數搭配 命令來自動覆寫任何衝突的工作流程。

    此指令 add 會完成下列工作:

    • 在存放庫中的 .github/workflows/workflow-name<>.yml 路徑上建立新的工作流程檔案。 檔名包含App Service 實例的名稱。
    • 擷取包含機密資訊的 App Service 實例的發佈設定檔,並將其新增為 GitHub Actions 機密資訊。 秘密的名稱以 AZUREAPPSERVICE_PUBLISHPROFILE_開頭。 此秘密會在工作流程檔案中參考。
  3. 使用 az webapp deployment source show 命令取得原始檔控制部署組態的詳細數據。 以您的特定值取代佔位參數:

    az webapp deployment source show \
      --name <app-service-name> \
      --resource-group <resource-group-name>
    
  4. 在命令輸出中,確認 repoUrl 和 branch 屬性的值。 這些值應該符合您使用 命令指定的 add 值。

檢查 GitHub 工作流程和動作

你可以在倉庫的 /.github/workflows/ 路徑中,用 YAML (.yml) 檔案指定工作流程定義。 此 YAML 檔案包含組成工作流程的各種步驟和參數,這是與 GitHub 存放庫相關聯的自動化程式。 您可以使用工作流程,在 GitHub 上建置、測試、封裝、發行及部署任何專案。

每個工作流程包含一個或多個工作,每個工作都是一組步驟。 每個步驟都是 Shell 腳本或動作。 每個作業在工作流程檔案中都有 一個 Action 區段。

針對你用 Python 程式碼設定的工作流程,準備部署到 Azure App 服務,工作流程包含以下操作:

行動 說明
結帳 查看由 GitHub Actions 代理程式執行的執行個體上的存放庫。
setup-python 在執行器上安裝 Python。
應用服務建置 建置 Web 應用程式。
webapps-deploy 使用發佈設定檔案的憑證來驗證並在 Azure 中部署 Web 應用程式。 認證會儲存在 GitHub 秘密中。

用來建立工作流程的工作流程範本是 Azure/actions-workflow-samples。

工作流程會在推送事件到指定分支時觸發。 你可以在工作流程檔案的開頭定義事件和分支。 例如,以下程式碼片段展示了推送事件到 主 分支時的工作流程觸發條件:

on:
  push:
    branches:
    - main

OAuth 授權的應用程式

當您設定持續部署時,您會將 Azure App 服務 授權為 GitHub 帳戶的授權 OAuth 應用程式。 App Service 會使用授權的存取權,在存放庫中的 .github/workflows/workflow-name<>.yml 路徑上建立 GitHub 動作 YAML 檔案。

若要查看您的授權應用程式並撤銷 GitHub 帳戶下的許可權,請移至 [設定>整合/應用程式]:

顯示如何檢視 GitHub 帳戶授權 OAuth Apps 的螢幕快照。

工作流程發佈設定檔機密資訊

在你新增到存放庫的 .github/workflows/<workflow-name>.yml 工作流程檔案中,有一個供工作流程中部署作業使用的發佈設定檔憑證預留位置。 該資料庫儲存的發佈檔案資訊是加密的。

若要檢視秘密,請移至 [ 設定>安全性>秘密] 和 [變數>動作]:

顯示如何在 GitHub 中檢視存放庫動作秘密的螢幕快照。

在本文中,GitHub Action 使用發佈設定檔認證來進行驗證。 其他驗證方式包括使用服務主體或 OpenID Connect。 如需詳細資訊,請參閱 使用 GitHub Actions 部署至 App Service。

執行和測試工作流程

最後一個步驟是藉由對存放庫進行變更來測試工作流程。

  1. 在瀏覽器中,移至範例存放庫的分支(或您所使用的存放庫),然後選取您設定為觸發程式一部分的分支:

    顯示如何移至 GitHub Actions 工作流程定義所在存放庫和分支的螢幕快照。

  2. 對 Python Web 應用程式進行小變更。

    針對 Flask 教學課程,以下是簡單的變更:

    1. 移至觸發程式分支的 /hello-app/templates/home.html 檔案。
    2. 選取 [編輯 ] (鉛筆)。
    3. 在編輯器中,找出 print <p> 語句,並新增文字 “Redeployed!”
  3. 將變更直接提交到您工作的分支中。

    1. 在編輯器中,選取右上方的 提交變更。 提交變更 視窗開啟。
    2. 在 [ 認可變更 ] 視窗中,視需要修改認可訊息,然後選取 [ 認可變更]。

    提交過程會觸發 GitHub Actions 工作流程。

您也可以手動觸發工作流程:

  1. 移至為進行持續部署而設定的存放庫中的 [Actions] 索引標籤。

  2. 在工作流程清單中選取工作流程,然後選取 [ 執行工作流程]。

針對失敗的工作流程進行疑難解答

您可以在應用程式存放庫的 [ 動作 ] 索引標籤上檢查工作流程的狀態。 當您檢查本文中建立的工作流程檔案時,您會看到兩個作業: 建 置和 部署。 提醒您,工作流程是以 Azure/actions-workflow-samples 範本為基礎。

針對失敗的作業,請查看任務的輸出,以瞭解失敗的原因。

以下是一些要調查的常見問題:

  • 如果應用程式因為缺少相依而失敗,部署過程沒有處理你的 requirements.txt 檔案。 如果您直接在入口網站上建立 Web 應用程式,而不是使用如本文所示的命令, az webapp up 就會發生此行為。

  • 如果您透過入口網站布建 App Service,可能不會設定建置動作 SCM_DO_BUILD_DURING_DEPLOYMENT 設定。 設定設定必須設定為 true。 命令 az webapp up 會自動設定建置動作。

  • 如果您看到有關「TLS 交握逾時」的錯誤訊息,請選取應用程式存放庫的 [動作] 索引標籤下的 [觸發自動部署],手動執行工作流程。 您可以判斷逾時是否為暫時性問題。

  • 如果您如本文所示設定容器應用程式的持續部署,系統會自動為您建立初始工作流程檔案 .github/workflows/<workflow-name>.yml 。 如果您修改了檔案,請移除修改,以查看它們是否導致失敗。

執行部署後腳本

部署後腳本可以完成數項工作,例如定義應用程式程式代碼預期的環境變數。 您會將文稿新增為應用程式程式代碼的一部分,並使用啟動命令執行腳本。

若要避免工作流程 YAML 檔案中的硬式編碼變數值,請考慮在 GitHub 中設定變數,並參考腳本中的變數名稱。 您可以為存放庫或環境(帳戶存放庫)建立加密的秘密。 如需詳細資訊,請參閱 在 GitHub Actions 中使用秘密。

檢視 Django 注意事項

如本文稍早所述,如果您使用個別資料庫,您可以使用 GitHub Actions 將 Django 應用程式部署至 Linux 上的 Azure App Service。 您無法使用 SQLite 資料庫,因為 App Service 會鎖定 db.sqlite3 檔案,這可防止讀取和寫入。 此行為不會影響外部資料庫。

在 App Service 上設定 Python 應用程式 - 容器啟動程式文章說明 App Service 如何在您的應用程式程式碼中自動尋找 wsgi.py 檔案,其中通常包含應用程式物件。 當您使用 webapp config set 命令來設定啟動命令時,您使用 --startup-file 參數來指定包含應用程式物件的檔案。 命令 webapp config set 無法在 webapps-deploy 動作中使用。 相反地,您可以使用 startup-command 參數來指定啟動命令。 例如,下列程式代碼示範如何在工作流程檔案中指定啟動命令:

startup-command: startup.txt

當您使用 Django 時,通常想要在部署應用程式程式代碼之後使用 python manage.py migrate 命令來移轉數據模型。 您可以在部署後文稿中執行 migrate 命令。

中斷 GitHub Actions 的連線

中斷 GitHub Actions 與 App Service 實例的連線,可讓您重新設定應用程式部署。 您可以在中斷連線之後,選擇工作流程檔案會發生什麼情況,以及是否要儲存或刪除檔案。

使用下列 Azure CLI az webapp deployment github-actions remove 命令中斷 GitHub Actions 的連線。 請將任何佔位符替換為您的特定值:

az webapp deployment github-actions remove \
  --repo "<github-username>/<github-repo>" \
  --resource-group <resource-group-name> \
  --branch <branch-name> \
  --name <app-service-name> \
  --login-with-github

清理資源

若要避免對本文中建立的 Azure 資源產生費用,請刪除包含 App Service 實例和 App Service 方案的資源群組。

安裝 Azure CLI 的任何位置,包括 Azure Cloud Shell,您可以使用 az group delete 命令來刪除資源群組:

az group delete --name <resource-group-name>

刪除記憶體帳戶

若要刪除維護 Cloud Shell 檔系統的記憶體帳戶,這會產生少量的每月費用,請刪除以 cloud-shell-storage- 開頭的資源群組。 如果您是群組的唯一使用者,則刪除資源群組是安全的。 如果有其他使用者,您可以刪除資源群組中的記憶體帳戶。

更新 GitHub 帳戶和存放庫

如果你刪除了 Azure 資源群組,請考慮對你連接的 GitHub 帳號和儲存庫做以下修改,以便持續部署:

  • 在應用程式存放庫中,移除 .github/workflows/<workflow-name>.yml 檔案。
  • 在應用程式存放庫設定中,移除為工作流程建立 的AZUREAPPSERVICE_PUBLISHPROFILE_ 秘密密鑰。
  • 在 GitHub 帳戶設定中,移除 Azure App 服務 作為 GitHub 帳戶的授權 Oauth 應用程式。