本文說明如何使用 GitHub Actions 中的持續整合和持續傳遞 (CI/CD) 平臺,將 Python Web 應用程式部署至 Linux 上的 Azure App Service。 您的 GitHub Actions 工作流程會在存放庫認可時,自動建置程式代碼,並將其部署至 App Service 實例。 您可以在 GitHub Actions 工作流程中新增其他自動化,例如測試腳本、安全性檢查和多階段部署。
建立應用程式程式代碼的存放庫
若要完成本文中的程序,您需要一個提交至 GitHub 存放庫的 Python 網頁應用程式。
現有的應用程式:若要使用現有的 Python Web 應用程式,請確定應用程式已認可至 GitHub 存放庫。
新應用程式:如果您需要新的 Python Web 應用程式,您可以派生並複製 GitHub 存放 https://github.com/Microsoft/python-sample-vscode-flask-tutorial 庫。 範例程式代碼支援 Visual Studio Code 中的 Flask 教學課程,並提供正常運作的 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 實例,並執行應用程式的初始部署。
在 https://portal.azure.com登入 Azure 入口網站。
選取入口網站工具列上的 Cloud Shell 選項,以開啟 Azure CLI:
在 Cloud Shell 中,從下拉功能表中選取 Bash 選項:
在 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 檔案系統的映像檔,並儲存複製的存放庫。 此記憶體的成本很小。 完成本文之後,您可以刪除記憶體帳戶,以及您建立的其他資源。
在 Cloud Shell 中,將目錄變更為 Python 應用程式的存放庫資料夾,因此 az webapp up 命令會將應用程式辨識為 Python。 針對 Flask 範例應用程式,您可以使用下列命令:
cd python-sample-vscode-flask-tutorial在 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命令。
如果您的應用程式有自定義啟動文本,請使用 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_。
若要檢視執行中的應用程式,請開啟瀏覽器並移至 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)。
在 Cloud Shell 中,確認您位於系統 (
~) 的根目錄中,而不是位於應用程式子資料夾中,例如 python-sample-vscode-flask-tutorial。使用 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_開頭。 此秘密會在工作流程檔案中參考。
使用 az webapp deployment source show 命令取得原始檔控制部署組態的詳細數據。 以您的特定值取代佔位參數:
az webapp deployment source show \ --name <app-service-name> \ --resource-group <resource-group-name>在命令輸出中,確認
repoUrl和branch屬性的值。 這些值應該符合您使用 命令指定的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/workflows/<workflow-name>.yml 工作流程檔案中,有一個用於部署作業的發佈配置文件憑證的佔位符。 發佈設定檔資訊會以加密方式儲存在存放庫中。
若要檢視秘密,請移至 [ 設定>安全性>秘密] 和 [變數>動作]:
在這篇文章中,GitHub Action 會使用發佈設定檔的憑證進行驗證。 還有其他方式可以進行身份驗證,例如使用服務主體或「OpenID Connect」。 如需詳細資訊,請參閱 使用 GitHub Actions 部署至 App Service。
執行和測試工作流程
最後一個步驟是藉由對存放庫進行變更來測試工作流程。
在瀏覽器中,移至範例存放庫的分支(或您所使用的存放庫),然後選取您設定為觸發程式一部分的分支:
對 Python Web 應用程式進行小變更。
針對 Flask 教學課程,以下是簡單的變更:
- 移至觸發程式分支的 /hello-app/templates/home.html 檔案。
- 選取 [編輯 ] (鉛筆)。
- 在編輯器中,找出 print
<p>語句,並新增文字 “Redeployed!”
將變更直接提交到您工作的分支中。
- 在編輯器中,選取右上方的 提交變更。 提交變更 視窗開啟。
- 在 [ 認可變更 ] 視窗中,視需要修改認可訊息,然後選取 [ 認可變更]。
提交過程會觸發 GitHub Actions 工作流程。
您也可以手動觸發工作流程:
移至為進行持續部署而設定的存放庫中的 [Actions] 索引標籤。
在工作流程清單中選取工作流程,然後選取 [ 執行工作流程]。
針對失敗的工作流程進行疑難解答
您可以在應用程式存放庫的 [ 動作 ] 索引標籤上檢查工作流程的狀態。 當您檢查本文中建立的工作流程檔案時,您會看到兩個作業: 建 置和 部署。 提醒您,工作流程是以 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 應用程式。