The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

部署 Azure App Service 最簡單的方法:使用 cURL 直接部署 ZIP 或 URL

我們在設定 CD 持續部署的時候,有好多種方法可以部署檔案到 Azure App Service,早期比較常用的是部署 ARM 部署,但部署經常會遇到 Azure AD 設定 Service Principal 等權限問題。後來我們大多改用 Web Deploy 來部署,只要有發行設定檔(Publish Profile)就可以輕鬆部署,不過 .NET Core 的 DLL 經常會被鎖定而無法更新的問題也很討厭。近期我們都開始改用 ZIP 或 URL 部署,其部署方法不但簡單,而且部署速度快,部署時更不會遇到檔案鎖定等問題,實在非常不錯。這篇文章我就來介紹這個部署方法。

neon-cloud-computing-technology-concept-illustration-generative-ai

今天介紹的這種部署方法可以從官方文件 Deploy files to App Service 找到相關說明。

由於部署 Azure App Service 有許多方法,有許多部署方法都可以在部署時在 SCM 網站進行一些建置作業,例如幫你執行 npm installdotnet build 之類的動作。但這種直接部署 ZIP 或 URL 的方法有一個限制條件,就是「預設」不會執行任何建置作業,他會原封不動的把壓縮檔中的檔案解壓縮,並完整的部署到 Azure App Service 網站中 (例如: D:\home\site\wwwroot for Windows, /home/site/wwwroot for Linux)!

使用 cURL 上傳 ZIP 壓縮檔進行部署

基本上只有兩個步驟:

  1. 準備一個 ZIP 壓縮檔,該壓縮檔中第一層檔案必須就是網站根目錄中要部署的檔案。

    若是在 Linux 環境下,可以用以下 zip 命令快速壓縮檔案:

    zip -r <file-name>.zip .
    

    若是在 Windows 環境下,可以用 PowerShell 的 Compress-Archive 命令快速壓縮檔案:

    Compress-Archive -Path * -DestinationPath <file-name>.zip
    
  2. 使用 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 進行部署

基本上只有兩個步驟:

  1. 先準備好 ZIP 並上傳到 Azure Storage 或任何可公開下載檔案的平台

    你可以上傳到 Azure Storage Blob 的 Private Container,檔案可以透過 SAS Token 下載,這樣就可以兼顧檔案存取的安全性。

  2. 使用 cURL 快速部署檔案

    curl -X PUT -u '<user>' -H 'Content-Type: application/json' -d "{'packageUri':'<zipUrl>'}" -f https://{sitename}.scm.azurewebsites.net/api/zipdeploy
    

    其中 <zipUrl> 放上 ZIP 檔案的網址即可!

快速實作範例

  1. 建立 ASP.NET Core 7 的 MVC 專案

    dotnet new mvc -n mvc1
    cd mvc1
    
  2. 發行網站到 dist 資料夾下

    dotnet publish -c Release -o dist
    
  3. 壓縮要部署的檔案

    Compress-Archive -Path dist/* -DestinationPath publish.zip
    
  4. 部署網站

    假設我的 Azure App Service 網站名稱是 zipdeploy123,而且已經下載發行設定檔如下:

    image

    那麼你的部署命令就會是:

    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 會被自動解析成變數!

相關連結

留言評論