前言
在 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。
![](https://dotblogsfile.blob.core.windows.net/user/anyun/87b37696-8f3d-457c-8f61-1021f892d373/1653127903.png.png)
我習慣還是用傳統編輯器來編輯。
![](https://dotblogsfile.blob.core.windows.net/user/anyun/87b37696-8f3d-457c-8f61-1021f892d373/1653127996.png.png)
選擇存放 WebJob 程式碼的 Repository。
![](https://dotblogsfile.blob.core.windows.net/user/anyun/87b37696-8f3d-457c-8f61-1021f892d373/1653128045.png.png)
選擇 ASP.NET Core 範本。
![](https://dotblogsfile.blob.core.windows.net/user/anyun/87b37696-8f3d-457c-8f61-1021f892d373/1653128117.png.png)
比較需要注意的就是特別要修改 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
![](https://dotblogsfile.blob.core.windows.net/user/anyun/87b37696-8f3d-457c-8f61-1021f892d373/1653128921.png.png)
再來新增 Archive files
的 Job。
![](https://dotblogsfile.blob.core.windows.net/user/anyun/87b37696-8f3d-457c-8f61-1021f892d373/1653129082.png.png)
注意加入後的位置順序是在 Publish 之後,然後設定跟目錄是我們前面設定的輸出位置 $(Build.BinariesDirectory)/publish_output
,也把 Prepend root folder name to archive paths
取消勾選。
![](https://dotblogsfile.blob.core.windows.net/user/anyun/87b37696-8f3d-457c-8f61-1021f892d373/1653129319.png.png)
接下來記得把 CI 打開才可以再我們 Code commit 之後觸發,到這邊就可以存檔了。
![](https://dotblogsfile.blob.core.windows.net/user/anyun/87b37696-8f3d-457c-8f61-1021f892d373/1653129416.png.png)
再來就是 CD 的設定了,到 Release 新增一個新的 Pipeline,並選擇 Azure App Service deployment 這一個範本。
![](https://dotblogsfile.blob.core.windows.net/user/anyun/87b37696-8f3d-457c-8f61-1021f892d373/1653129618.png.png)
![](https://dotblogsfile.blob.core.windows.net/user/anyun/87b37696-8f3d-457c-8f61-1021f892d373/1653129674.png.png)
設定 CI 發佈的 artifact 和開啟 CD 觸發。
![](https://dotblogsfile.blob.core.windows.net/user/anyun/87b37696-8f3d-457c-8f61-1021f892d373/1653129776.png.png)
![](https://dotblogsfile.blob.core.windows.net/user/anyun/87b37696-8f3d-457c-8f61-1021f892d373/1653129858.png.png)
Job 特別要設定的是要打開 Additional Deployment Options 選項,確保用 Web Deploy 方式,不然會判斷成 Run from package,就會導致 App Service 變成唯讀模式,這樣就沒辦法部署多個 Job ,會只看部署當下的 zip 包含哪些程式,除非確定只會放一個 WebJob 且不會跑網站程式,不然建議還是手動設定確保部署方式,到這邊就可以儲存並確認執行結果了。
![](https://dotblogsfile.blob.core.windows.net/user/anyun/87b37696-8f3d-457c-8f61-1021f892d373/1653129997.png.png)
部署之後就可以在 WebJob 看到了,另外也可以透過 Kudo 去確認檔案是否有正確部署到我們要的路徑,並且執行看看。
![](https://dotblogsfile.blob.core.windows.net/user/anyun/87b37696-8f3d-457c-8f61-1021f892d373/1653130403.png.png)
![](https://dotblogsfile.blob.core.windows.net/user/anyun/87b37696-8f3d-457c-8f61-1021f892d373/1653130330.png.png)
確保有正常執行並輸出 Hello world 了。
![](https://dotblogsfile.blob.core.windows.net/user/anyun/87b37696-8f3d-457c-8f61-1021f892d373/1653130457.png.png)
結論
這次針對部署到 WebJob 多了一些細節需要注意跟設定,主要是透過建立出 WebJob 的目錄結構,再把程式部署上去,這樣 App Service 就可以認得 WebJob 了。