Azure Developer CLI (azd) 支援在 Azure App 服務 上託管的應用程式使用 Azure App 服務 部署插槽。 你可以在基礎設施中定義插槽,將程式碼部署到特定插槽,並在準備好推廣版本時交換插槽。
此方法可用於佈署前測試、藍綠部署、煙霧測試及回復,無需新增自訂部署腳本。
先決條件
- 一個
azd將服務部署到 Azure App 服務 的專案。 - 定義 Bicep 中 App Service 資源的基礎架構即程式碼。
- 標準()等級或更高等級的 App Service 方案
S1。 免費、共享和基本層級不支援部署欄位。
在 Bicep 中定義部署插槽
像平常一樣定義你的生產地點,然後為每個你想Microsoft.Web/sites/slots鎖定的時段加入一個azd資源。
resource appServicePlan 'Microsoft.Web/serverfarms@2021-03-01' = {
name: 'my-appservice-plan'
location: resourceGroup().location
sku: {
name: 'S1'
tier: 'Standard'
}
}
resource webApp 'Microsoft.Web/sites@2021-03-01' = {
name: 'my-appservice'
location: resourceGroup().location
kind: 'app'
properties: {
serverFarmId: appServicePlan.id
}
}
resource stagingSlot 'Microsoft.Web/sites/slots@2021-03-01' = {
name: '${webApp.name}/staging'
location: webApp.location
properties: {}
}
如果你使用 Azure Verified Modules(AVM),請在同一部署中定義網頁應用程式和部署槽模組,並將應用程式名稱傳給槽位模組。
使用 azd 部署到插槽
依照往常執行azd up、azd provision和azd deploy。
azd up
第一次部署時,將 azd 部署到生產網站及基礎設施中定義的任何插槽。 這次首次部署是在主應用程式和每個插槽建立相同的基準。
第一次部署後,azd deploy 在有插槽時,會改變以選擇部署目標的方式。
azd 當有空位時,也不會直接部署到生產應用程式。 相反地,你先部署到某個時段,驗證發佈,然後再把它切換到生產環境。
azd 如何選擇部署目標
當 azd deploy 執行有部署時段的 App Service 時,會透過查看主應用程式的部署歷史,然後評估可用時段來選擇目標。
行為如下:
- 如果不存在先前部署,則
azd部署到主應用程式及所有部署插槽。 - 如果之前有部署且沒有部署位置,則
azd只會部署到主應用程式。 - 如果之前有部署且剛好有一個時段,則
azd只能部署到該時段。 - 如果之前有部署且有兩個或以上的欄位,
azd會使用環境變數指定的欄位,或提示你選擇一個。
Important
第一次部署後, azd 當有空位時,它不會直接部署到主 App Service 應用程式。 此行為是刻意設計,有助於防止意外直接部署至生產環境。 要更新生產環境,先部署到某個槽位,然後將該槽位切換到生產環境(@main)。
選擇一個帶有環境變數的槽位
當你的服務在第一次部署後有兩個或以上時段時,你可以透過設定想要部署的服務環境變數來跳過互動提示。
請使用下列格式:
AZD_DEPLOY_<SERVICE_NAME>_SLOT_NAME
從服務名稱 azure.yaml 中建立變數名稱,方法是使用大寫字母,並用底線替換連字號。
例如,如果你的服務名稱 my-api為 ,請使用 AZD_DEPLOY_MY_API_SLOT_NAME。
azd env set AZD_DEPLOY_MY_API_SLOT_NAME staging
azd deploy my-api
在執行azd之前,你可以使用azd env set將此值存儲在你的azd deploy環境中,或者在你的持續整合系統中直接定義。
如果你的服務只有一個插槽, azd 則忽略環境變數,因為只有一個可能的部署目標。
如果你的服務有兩個或以上時段,且環境變數未設定,系統 azd 會提示你選擇時段。
繞過插槽偵測並部署到主應用程式
在某些情況下,即使已有部署位置,你仍需要 azd 直接部署至主要 App Service 應用程式。 例如:
- 你的 CI 管線需要更新主要應用程式,同時讓現有的部署位置維持不變。
- 你正在從壞時段狀態恢復,想直接重新部署生產站點。
- 你是在設定新槽位前先重新設定主應用程式的基底。
要繞過時隙偵測,請為服務設定以下環境變數:
AZD_DEPLOY_<SERVICE_NAME>_IGNORE_SLOTS
從服務名稱 azure.yaml 中建立變數名稱,方法是使用大寫字母,並用底線替換連字號。 將值設為 true 跳過插槽偵測並部署到主應用程式。
例如,如果你的服務名稱 my-api為 ,請使用 AZD_DEPLOY_MY_API_IGNORE_SLOTS。
azd env set AZD_DEPLOY_MY_API_IGNORE_SLOTS true
azd deploy my-api
當 AZD_DEPLOY_<SERVICE_NAME>_IGNORE_SLOTS 設定為 true時, azd 會部署到主應用程式,並忽略同一服務的任何 AZD_DEPLOY_<SERVICE_NAME>_SLOT_NAME 值。 取消設定變數或設定為 , false 以回到預設的槽位感知行為。
CI 與非互動行為
當你從 CI 執行 azd deploy --no-prompt 或部署時,槽位選擇會根據可用槽位數量而有所不同:
| 老虎機 | 環境變數行為 | Result |
|---|---|---|
0 |
不適用。 |
azd 部署到主應用程式。 |
1 |
除非 AZD_DEPLOY_<SERVICE_NAME>_IGNORE_SLOTS 為 true,否則會被忽略。 |
azd 會部署到唯一插槽;若忽略插槽,則會部署到主應用程式。 |
2+ |
必須使用 AZD_DEPLOY_<SERVICE_NAME>_SLOT_NAME 以避免出現提示,除非 AZD_DEPLOY_<SERVICE_NAME>_IGNORE_SLOTS 是 true。 |
azd 會部署到指定的部署位置,在忽略部署位置時部署到主要應用程式,若無法選取目標則會失敗。 |
如果要自動化部署具有兩個或以上插槽的 App Service,請在執行 AZD_DEPLOY_<SERVICE_NAME>_SLOT_NAME 之前,先在 pipeline 環境中設定 azd deploy。 若有插槽,強制從 CI 直接部署到主線,請改設 AZD_DEPLOY_<SERVICE_NAME>_IGNORE_SLOTS 為 true 。
開關 Azure App 服務 部署插槽
驗證後用 azure.appservice 擴充功能交換槽位。 如果擴充功能還沒安裝 azd ,第一次執行指令時會提示你安裝。
執行互動體驗:
azd appservice swap
如果只有一個非製作欄位,則 azd 跳過提示,直接與製作部門交換。
在自動化過程中,請明確指定來源和目地欄位。 用 @main 來參考生產時段。
azd appservice swap --src staging --dst @main
azd appservice swap --src @main --dst staging
azd appservice swap --service myapi --src staging --dst @main
利用這些模式來支持常見的釋放流程:
- 將驗證過的暫存部署推廣至生產環境。
--src staging --dst @main - 回滾時,將生產線切換回預備槽
--src @main --dst staging。 - 鎖定在多服務
azd專案中的特定以 App Service 支援的服務,並使用--service。
配置好插槽後, 交換是用來更新生產環境的指定途徑。 用 azd deploy 來更新一個插槽,然後用 azd appservice swap 來提升該插槽進入生產環境。
建議的部署插槽工作流程
- 在你的 Bicep 範本中定義一個或多個 App Service 部署時段。
- 透過使用
azd provision或azd up來配置 App Service 資源。 - 讓第一次部署時,在主應用程式和每個時段建立基準。
- 透過設定
AZD_DEPLOY_<SERVICE_NAME>_SLOT_NAME,當你有兩個或以上的插槽時,或在提示時選擇該插槽,來將後續應用程式更新部署到暫存插槽。 若有插槽,強制從 CI 直接部署到主線,請改設AZD_DEPLOY_<SERVICE_NAME>_IGNORE_SLOTS為true。 - 驗證分階段部署。
- 執行
azd appservice swap --src <slot> --dst @main以促進這次發行。 - 如果需要,執行反向交換來還原。