我們在設定 CD 持續部署的時候,有好多種方法可以部署檔案到 Azure App Service,早期比較常用的是部署 ARM 部署,但部署經常會遇到 Azure AD 設定 Service Principal 等權限問題。後來我們大多改用 Web Deploy 來部署,只要有發行設定檔(Publish Profile)就可以輕鬆部署,不過 .NET Core 的 DLL 經常會被鎖定而無法更新的問題也很討厭。近期我們都開始改用 ZIP 或 URL 部署,其部署方法不但簡單,而且部署速度快,部署時更不會遇到檔案鎖定等問題,實在非常不錯。這篇文章我就來介紹這個部署方法。
今天介紹的這種部署方法可以從官方文件 Deploy files to App Service 找到相關說明。
由於部署 Azure App Service 有許多方法,有許多部署方法都可以在部署時在 SCM 網站進行一些建置作業,例如幫你執行 npm install
或 dotnet build
之類的動作。但這種直接部署 ZIP 或 URL 的方法有一個限制條件,就是「預設」不會執行任何建置作業,他會原封不動的把壓縮檔中的檔案解壓縮,並完整的部署到 Azure App Service 網站中 (例如: D:\home\site\wwwroot
for Windows, /home/site/wwwroot
for Linux)!
使用 cURL 上傳 ZIP 壓縮檔進行部署
基本上只有兩個步驟:
-
準備一個 ZIP 壓縮檔,該壓縮檔中第一層檔案必須就是網站根目錄中要部署的檔案。
若是在 Linux 環境下,可以用以下 zip
命令快速壓縮檔案:
zip -r <file-name>.zip .
若是在 Windows 環境下,可以用 PowerShell 的 Compress-Archive
命令快速壓縮檔案:
Compress-Archive -Path * -DestinationPath <file-name>.zip
-
使用 cURL 快速上傳檔案
上傳檔案非常簡單,只要一個 curl
命令就可以上傳檔案
curl -X POST -u '<user>' -T '<file-name>.zip' -f https://{sitename}.scm.azurewebsites.net/api/zipdeploy
這裡的 -u
格式為 使用者帳號:密碼
,而 -T
後面直接指定要部署的 ZIP 檔案路徑,最重要的 -f
則是當上傳失敗時回傳非 0 的回傳碼(return code)。
使用 cURL 搭配一個公開的 URL 進行部署
基本上只有兩個步驟:
-
先準備好 ZIP 並上傳到 Azure Storage 或任何可公開下載檔案的平台
你可以上傳到 Azure Storage Blob 的 Private Container,檔案可以透過 SAS Token 下載,這樣就可以兼顧檔案存取的安全性。
-
使用 cURL 快速部署檔案
curl -X PUT -u '<user>' -H 'Content-Type: application/json' -d "{'packageUri':'<zipUrl>'}" -f https://{sitename}.scm.azurewebsites.net/api/zipdeploy
其中 <zipUrl>
放上 ZIP 檔案的網址即可!
快速實作範例
-
建立 ASP.NET Core 7 的 MVC 專案
dotnet new mvc -n mvc1
cd mvc1
-
發行網站到 dist
資料夾下
dotnet publish -c Release -o dist
-
壓縮要部署的檔案
Compress-Archive -Path dist/* -DestinationPath publish.zip
-
部署網站
假設我的 Azure App Service 網站名稱是 zipdeploy123
,而且已經下載發行設定檔如下:
那麼你的部署命令就會是:
curl -X POST -u '$zipdeploy123:YldsJdFZitxbzReH1vRX9BMRR6MzPAH3Ap5Pl4aPTbvZhWr0ygrE4zuRWKGs' -T 'publish.zip' -f https://zipdeploy123.scm.azurewebsites.net/api/zipdeploy
如果我的 publish.zip
先上傳到 Dropbox 的話,你也可以用以下命令部署網站:
curl -X PUT -u '$zipdeploy123:YldsJdFZitxbzReH1vRX9BMRR6MzPAH3Ap5Pl4aPTbvZhWr0ygrE4zuRWKGs' -H 'Content-Type: application/json' -d "{'packageUri':'https://www.dropbox.com/s/ndclfc2lpsgxcq4/publish.zip?dl=1'}" -f https://zipdeploy123.scm.azurewebsites.net/api/zipdeploy
注意: 由於 App Service 的 userName
包含了 $
符號,請務必在 Shell 環境下使用「單引號」將帳號密碼框起來,否則 $zipdeploy123
會被自動解析成變數!
相關連結