使用 Azure DevOps 部署到 App Service WebJob

前言

在 Azure 上面執行排程程式除了 Azure Function、Logic App 等服務以外,最方便的方式還是使用 App Service 裡面的 WebJob,它可以執行很多種類型的程式,所以我們可以簡單的開發一個 Console 程式去執行我們的排程程式,而當然也要讓它可以自動化部署,在設定上會有一些細節需要注意,所以特別針對一些設定和參數來記錄一下部署的流程。

實做

我的測試程式很單純的開一個 .NET Core Console 專案範本,沒特別修改任何程式碼,就是維持 Hello World 輸出,就不特別說明了。

using System;

namespace AnYunWebJob
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

回到 Azure DevOps 來新增一個 Pipeline。

我習慣還是用傳統編輯器來編輯。

選擇存放 WebJob 程式碼的 Repository。

選擇 ASP.NET Core 範本。

比較需要注意的就是特別要修改 Publish 這一個 Job,需要把 Publish web projects 選項取消勾選,不然會當作是 Web 的專案就會導致錯誤,另外輸出的參數特別調整輸出的目錄結構,其中 App_Data/jobs/triggered 則是為了配合 App Service 的 WebJob 目錄結構,也把 Zip published projects 取消勾選,因為後面我們要自己打包,才可以維持我們要的目錄結構。

如果是觸發類型的 WebJob 則為 App_Data/jobs/triggered,連續型的則為 App_Data/jobs/continuous,但是主要還是看目錄底下有沒有 Settings.job 設定執行的頻率。
--configuration $(BuildConfiguration) --output $(Build.BinariesDirectory)/publish_output/App_Data/jobs/triggered

再來新增 Archive files 的 Job。

注意加入後的位置順序是在 Publish 之後,然後設定跟目錄是我們前面設定的輸出位置 $(Build.BinariesDirectory)/publish_output,也把 Prepend root folder name to archive paths 取消勾選。

接下來記得把 CI 打開才可以再我們 Code commit 之後觸發,到這邊就可以存檔了。

再來就是 CD 的設定了,到 Release 新增一個新的 Pipeline,並選擇 Azure App Service deployment 這一個範本。

設定 CI 發佈的 artifact 和開啟 CD 觸發。

Job 特別要設定的是要打開 Additional Deployment Options 選項,確保用 Web Deploy 方式,不然會判斷成 Run from package,就會導致 App Service 變成唯讀模式,這樣就沒辦法部署多個 Job ,會只看部署當下的 zip 包含哪些程式,除非確定只會放一個 WebJob 且不會跑網站程式,不然建議還是手動設定確保部署方式,到這邊就可以儲存並確認執行結果了。

部署之後就可以在 WebJob 看到了,另外也可以透過 Kudo 去確認檔案是否有正確部署到我們要的路徑,並且執行看看。

確保有正常執行並輸出 Hello world 了。

結論

這次針對部署到 WebJob 多了一些細節需要注意跟設定,主要是透過建立出 WebJob 的目錄結構,再把程式部署上去,這樣 App Service 就可以認得 WebJob 了。

參考資料