﻿# 部署 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](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/593af053c0fc108ffb64-a4abeda6-83d3-408c-ac77-c4571b3f1650.webp)

> 今天介紹的這種部署方法可以從官方文件 [Deploy files to App Service](https://learn.microsoft.com/en-us/azure/app-service/deploy-zip) 找到相關說明。

由於部署 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 壓縮檔進行部署

基本上只有兩個步驟：

1.  準備一個 ZIP 壓縮檔，該壓縮檔中第一層檔案必須就是網站根目錄中要部署的檔案。
    
    若是在 Linux 環境下，可以用以下 `zip` 命令快速壓縮檔案：
    
    ```bash
    zip -r <file-name>.zip .
    ```
    
    若是在 Windows 環境下，可以用 PowerShell 的 `Compress-Archive` 命令快速壓縮檔案：
    
    ```bash
    Compress-Archive -Path * -DestinationPath <file-name>.zip
    ```
    
2.  使用 cURL 快速上傳檔案
    
    上傳檔案非常簡單，只要一個 `curl` 命令就可以上傳檔案
    
    ```bash
    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 快速部署檔案
    
    ```bash
    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 專案
    
    ```bash
    dotnet new mvc -n mvc1
    cd mvc1
    ```
    
2.  發行網站到 `dist` 資料夾下
    
    ```bash
    dotnet publish -c Release -o dist
    ```
    
3.  壓縮要部署的檔案
    
    ```powershell
    Compress-Archive -Path dist/* -DestinationPath publish.zip
    ```
    
4.  部署網站
    
    假設我的 Azure App Service 網站名稱是 `zipdeploy123`，而且已經下載發行設定檔如下：
    
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/074cf17cb8ac8d02de9f-1fa68dc3-31f4-432c-b826-b2dc2477e7f0.webp)
    
    那麼你的部署命令就會是：
    
    ```powershell
    curl -X POST -u '$zipdeploy123:YldsJdFZitxbzReH1vRX9BMRR6MzPAH3Ap5Pl4aPTbvZhWr0ygrE4zuRWKGs' -T 'publish.zip' -f https://zipdeploy123.scm.azurewebsites.net/api/zipdeploy
    ```
    
    如果我的 `publish.zip` 先上傳到 Dropbox 的話，你也可以用以下命令部署網站：
    
    ```powershell
    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` 會被自動解析成變數！
    

### 相關連結

-   [Deploying from a zip file or url](https://github.com/projectkudu/kudu/wiki/Deploying-from-a-zip-file-or-url)
-   [Deploy files to App Service - Azure App Service | Microsoft Learn](https://learn.microsoft.com/en-us/azure/app-service/deploy-zip?WT.mc_id=DT-MVP-4015686&tabs=cli)
