Share via


搭配 GitHub Actions 使用 CI/CD,將 Python Web 應用程式部署至 Linux 上的 Azure App 服務

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

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

如果您已經有要使用的 Python Web 應用程式,請確定它已認可至 GitHub 存放庫。

如果您需要使用應用程式,您可以在 分支和複製存放 https://github.com/Microsoft/python-sample-vscode-flask-tutorial庫。 程式代碼來自 Visual Studio Code 中的 Flask 教學課程

注意

如果您的應用程式使用 Django 和 SQLite 資料庫,本教學課程將無法運作。 如果您的 Django 應用程式使用不同的資料庫,例如 PostgreSQL,您可以搭配本教學課程使用。 如需 Django 的詳細資訊,請參閱 本文稍後的 Django 考慮。

建立目標 Azure App 服務

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

步驟 1: 登入 Azure 入口網站:https://portal.azure.com

步驟 2。 選取入口網站工具列上的 Cloud Shell 圖示,以開啟 Azure CLI。

Screenshot showing how to open Azure Cloud Shell in Azure portal.

步驟 3。 在 Cloud Shell 中,從下拉式清單中選取 [Bash]。

Screenshot showing an Azure Cloud Shell Bash shell in Azure portal.

步驟 4. 在 Cloud Shell 中,使用 Git 複製來複製您的存放庫。 例如,如果您使用 Flask 範例應用程式,則命令為:

git clone https://github.com/<github-user>/python-sample-vscode-flask-tutorial.git

將 github-user> 取代<為您派生存放庫的 GitHub 帳戶名稱。 如果您使用不同的應用程式存放庫,此存放庫就是您將設定 GitHub Actions 的位置。

注意

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

提示

若要貼到 Cloud Shell 中,請使用 Ctrl+Shift+V,或以滑鼠右鍵單擊並選取操作功能表中的 [貼上]。

步驟 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"

指定 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 使用該命令。 如果您的應用程式沒有自定義啟動命令,請略過此步驟。

例如, python-sample-vscode-flask-tutorial 應用程式包含名為 startup.txt 的檔案,其中包含您可以使用的啟動命令,如下所示:

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

您可以從上 az webapp up 一個命令的輸出中找到資源群組名稱。 資源組名會以 <azure-account-name>_rg_開頭。

步驟 8。 若要查看執行中的應用程式,請開啟瀏覽器並移至 http:// app-service-name.azurewebsites.net>。<

如果您看到一般頁面,請等候幾秒鐘,讓 App Service 開始,然後重新整理頁面。 如果您繼續看到泛型頁面,請檢查您是否已從正確的資料夾部署。 例如,如果您使用 Flask 範例應用程式,資料夾是 python-sample-vscode-flask-tutorial。 此外,針對 Flask 範例應用程式,請檢查您是否已正確設定啟動命令。

在 App Service 中設定持續部署

在下列步驟中,您將設定持續部署 (CD),這表示觸發工作流程時會發生新的程式碼部署。 本教學課程中的觸發程式是存放庫主要分支的任何變更,例如提取要求 (PR)。

步驟 1: 使用 az webapp deployment github-actions add 命令新增 GitHub Action。

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使用 參數來覆寫而不詢問。

新增命令的功能:

  • 在存放庫中建立新的工作流程檔案:.github/workflows/<workflow-name.yml>;文件名將包含 App Service 的名稱。
  • 擷取具有 App Service 秘密的發行配置檔,並將其新增為 GitHub 動作秘密。 秘密的名稱會以AZUREAPPSERVICE_PUBLISHPROFILE_開頭。 此秘密會在工作流程檔案中參考。

步驟 2。 使用 az webapp deployment source show 命令取得原始檔控制部署組態的詳細數據。

az webapp deployment source show \
  --name <app-service-name> \
  --resource-group <resource-group-name>

在命令的輸出中,確認和 branch 屬性的值repoUrl。 這些值應該符合您在上一個步驟中指定的值。

說明的 GitHub 工作流程和動作

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

每個工作流程是由一或多個作業所組成。 每個作業接著都是一組步驟。 最後,每個步驟都是殼層腳本或動作。

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

動作 描述
結帳 查看執行器上的存放庫、GitHub Actions 代理程式。
setup-python 在執行器上安裝 Python。
appservice-build 建置 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 動作 YML 檔案。 您可以在 [整合/應用程式] 底下查看您的授權應用程式,並撤銷 GitHub 帳戶 設定 的許可權。

Screenshot showing how to view authorized OAuth Apps for a GitHub account.

工作流程發佈配置檔秘密

在新增至存放庫的 .github/workflows/<workflow-name.yml> 工作流程檔案中,您會看到發佈工作流程部署作業所需的配置文件認證佔位符。 發行設定文件資訊會以加密方式儲存在存放庫 設定 的 [安全性/動作] 底下

Screenshot showing how to view action secrets in GitHub.

在本文中,GitHub 動作會使用發行配置文件認證進行驗證。 還有其他方式可以驗證,例如使用服務主體或OpenID連線。 如需詳細資訊,請參閱 使用 GitHub Actions 部署至 App Service。

執行工作流程

現在您將藉由對存放庫進行變更來測試工作流程。

步驟 1: 移至範例存放庫的分支(或您使用的存放庫),然後選取您設定為觸發程式的一部分分支。

Screenshot showing how to go to the repo and branch where the GitHub Actions workflow is defined.

步驟 2。 進行小變更。

例如,如果您使用 VS Code Flask 教學課程,您可以

  • 移至 觸發程式分支的 /hello-app/templates/home.html 檔案。
  • 選取 [ 編輯 ],然後新增文字 「已重新部署!」。

步驟 3。 將變更直接認可到您正在使用的分支。

  • 在您要編輯的頁面右上方,選取 [ 認可變更... ] 按鈕。 [認可 變更 ] 視窗隨即開啟。 在 [ 認可變更 ] 視窗中,視需要修改認可訊息,然後選取 [ 認可變更 ] 按鈕。
  • 認可會啟動 GitHub Actions 工作流程。

您也可以手動啟動工作流程。

步驟 1: 移至為 持續部署設定之存放庫的 [動作] 索引標籤。

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

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

若要檢查工作流程的狀態,請移至存放庫的 [動作] 索引標籤。 當您鑽研本教學課程中建立的工作流程檔案時,您會看到兩個作業「建置」和「部署」。 針對失敗的作業,請查看作業工作的輸出,以取得失敗的指示。 以下為一些常見問題:

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

  • 如果您透過入口網站布建應用程式服務,可能尚未設定建置動作SCM_DO_BUILD_DURING_DEPLOYMENT設定。 設定設定必須設定為 true。 命令 az webapp up 會自動設定建置動作。

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

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

執行部署後腳本

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

若要避免工作流程 YML 檔案中的硬式編碼變數值,您可以在 GitHub Web 介面中改用變數值,然後在腳本中參考變數名稱。 您可以為存放庫或環境(帳戶存放庫)建立加密的秘密。 如需詳細資訊,請參閱 GitHub Docs 中的加密秘密。

Django 的考慮

如本文稍早所述,如果您使用個別的資料庫,您可以使用 GitHub Actions 將 Django 應用程式部署至 Linux 上的 Azure App 服務。 您無法使用 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-user>/<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- 開頭的資源群組。 如果您是群組的唯一使用者,則刪除資源群組是安全的。 如果有其他使用者,您可以刪除資源群組中的記憶體帳戶。

如果您已刪除 Azure 資源群組,請考慮對已連線以進行持續部署的 GitHub 帳戶和存放庫進行下列修改:

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