共用方式為


使用 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 網頁應用程式。

備註

如果您的應用程式使用 DjangoSQLite 資料庫,則不適用於這些程式。 在大多數雲端託管環境中,由於其本地文件式存儲的限制,不支援 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.9"
    
    • 請為 <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. 在命令輸出中,確認 repoUrlbranch 屬性的值。 這些值應該符合您使用 命令指定的 add 值。

檢查 GitHub 工作流程和動作

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

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

針對使用 Python 程式代碼設定的工作流程,以部署至 Azure App Service,工作流程具有下列動作:

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

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

工作流程會在推送事件發生於指定的分支時觸發。 事件和分支是在工作流程檔案的開頭定義。 例如,下列代碼段會顯示工作流程在推送事件至 主要 分支時觸發:

on:
  push:
    branches:
    - main

OAuth 授權的應用程式

當您設定持續部署時,您會將 Azure App Service 授權為 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 Service 作為 GitHub 帳戶的授權 Oauth 應用程式。