Azure App Service に .NET Core Web アプリと WebJob を Azure DevOps (Azure Pipelines) でデプロイする

## やること

Webアプリケーション＋WebJob なアプリケーションを Azure App Service に自動デプロイしたい！

ソースコードと App Service は↓な感じのものを想定する。

<!--
|プロジェクト|中身|
|:--|:--|
|WebAppJobs.JobA|WebJob その１|
|WebAppJobs.JobB|WebJob その２|
|WebAppJobs.Web|Web アプリ|
-->

![2019-11-09-00-18-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/9f4d28ff-2e2f-f7b6-043c-5b1c738a9c25.png)

<!--
|項目|設定値|
|:--|:--|
|publish|Code|
|Runtime stack|.NET Core 3.0|
|Operating System|Windows|
|App Service Plan|Freeでも試せる！|
-->

![2019-11-09-00-34-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/47000934-f004-505d-a4da-aa597e1221fe.png)

## パイプラインを作る手順

まず全体像から。

基本的な考え方は、publish するときに App Service と WebJob(Kudu) のファイル・フォルダ構成に合わせて出力して、そのまま App Service にデプロイする、というもの。

![2019-11-09-00-15-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/9d6d52f2-c8c6-739c-679e-fe8fe18ca21b.png)

### テンプレートから作成する

Pipelines -> Builds -> New -> New build pipeline

![2019-11-09-00-39-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/3954bca4-f588-65dd-730e-50852e0e9559.png)


Use the classic editor

![2019-11-09-00-39-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/fc6928bb-5a17-6548-7a7a-8b4aac4ad1c0.png)


リポジトリを選択

![2019-11-09-00-40-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/b1a00027-4818-646b-3f60-fe021bc190c2.png)


ASP.NET Core テンプレートを選択

![2019-11-09-00-41-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/3ac5cf69-6fa1-db7b-e5c1-9be49d35b8f9.png)

![2019-11-09-00-42-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/3b78566c-020c-dfa8-89e6-8358f8fbb0cf.png)


これをベースにパイプラインを作る。

### dotnet restore/build/test

特に変えなくてよい。

### dotnet publish

WebJob と Web アプリケーション毎に publish のタスクを作る。

#### Job の publish

|変更する箇所|変更内容|
|:--|:--|
|Publish Web Projects|チェックを外す|
|Zip Published Projects|チェックを外す|
|Add project name to publish path|チェックを外す|
|Path to project(s)|.csproj ファイルを明示的に設定するように変更する|
|Arguments|outputパラメータを下記のように変更する|

`--configuration $(BuildConfiguration) --output $(build.artifactstagingdirectory)/App_Data/jobs/triggered/{ジョブ名}`

JobA 用のタスク

![2019-11-09-00-16-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/e5fc0269-9578-5bfa-84fd-7816f3e6a878.png)

JobB 用のタスク

![2019-11-09-00-16-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/20a8e5ba-4b67-78c0-4df3-0f2852541430.png)


#### Web アプリの publish

|変更する箇所|変更内容|
|:--|:--|
|Zip Published Projects|チェックを外す|
|Add project name to publish path|チェックを外す|

![2019-11-09-00-16-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/ef19112a-9de7-987d-da73-1d0cdd021e89.png)


### run.cmd と settings.job の作成

Powershell タスクを追加し、各ジョブの run.cmd と settings.job を作成するスクリプトを記述する。
※run.cmd と settings.job は、あらかじめ WebJob のプロジェクト直下に置いておいてもよい。その場合、この手順はスキップする。

![2019-11-09-09-10-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/c3b623c0-b1ce-3603-2236-fa1e804e994e.png)


![2019-11-09-09-11-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/10b7d5cc-02f8-1289-518a-f270563c2878.png)


|変更する箇所|変更内容|
|:--|:--|
|Type|Inlineに変更する|
|Script|スクリプトを書く（サンプルとスクリーンショット参照）|
|Advanced -> Working Directory|`$(Build.ArtifactStagingDirectory)`|

下記は１分毎に実行されるジョブの run.cmd と settings.job を生成するスクリプトのサンプル

```powershell
"dotnet {モジュール名}.dll" | out-file App_Data/jobs/triggered/{ジョブ名}/run.cmd -Encoding ASCII; 
"{`"schedule`": `"0 * * * * *`"}" | out-file App_Data/jobs/triggered/{ジョブ名}/settings.job -Encoding ASCII; 
```

![2019-11-09-00-17-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/2ce649ae-567d-ce8f-b227-b1a359a0edc4.png)


### App Service のデプロイ

Azure App Service Deploy タスクを追加し、サブスクリプションや App Service 名等、必要な設定を入れる。
![2019-11-09-09-13-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/e3fc5840-77b1-323c-2c00-5fc30860ce87.png)

![2019-11-09-09-14-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/ff8637ec-1e89-3998-87f7-86911587efb3.png)

|変更する箇所|変更内容|
|:--|:--|
|Package or folder|`$(Build.ArtifactStagingDirectory)`|
|Additional Deployment Options|Deployment method を Zip Deploy に設定|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/5dc7fe8d-641f-961c-7b2e-fcca437b1cb4.png)


### Publish Artifact

そのままでよい。

### テスト実行

Save & queue するとパイプラインを実行できる。

![2019-11-09-01-17-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/11041290-208c-2a0e-33f5-13b22193d206.png)

![2019-11-09-01-09-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/bd3edf87-3fad-5fbc-6f0f-ce9ac7635340.png)



Enable system diagnostics にチェックを入れるとログ出力が詳細になる。もし実行に失敗した場合はログを見て原因を特定する。

![2019-11-09-09-17-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/02ae6795-66bb-0d70-e3bf-7cfd35866604.png)


### 実行結果を確認

AzureポータルとWebサイトを見て、動いてることが確認できた！

![2019-11-09-01-11-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/62ba99e1-cddc-3541-89d9-1c4407192f01.png)

![2019-11-09-01-13-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/9ae31f8b-c9a0-a199-e59a-e9736a263857.png)


おわり。

## 参考

https://github.com/projectkudu/kudu/wiki/WebJobs