GitHub Actionsで.NET CoreアプリをAzureにデプロイする

# はじめに
GitHub Actionsで.NET CoreアプリをAzure App Serviceにデプロイするまでを書きます。

# ワークフローを作る

**[new workflow]から.NET Coreを選択**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496802/36297189-89f3-0f67-e438-dcc9f2f93f35.png" width="300">

**[set up this workflow]をクリックするとテンプレートが表示される。**

```yaml
name: .NET Core

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Setup .NET Core
      uses: actions/setup-dotnet@v1
      with:
        dotnet-version: 3.1.101
    - name: Install dependencies
      run: dotnet restore
    - name: Build
      run: dotnet build --configuration Release --no-restore
    - name: Test
      run: dotnet test --no-restore --verbosity normal
```

このテンプレートに沿って変更します。

# checkout
`git submodules`を使ってるリポジトリで`v2`では`submodules: true`がサポートされてなかったので仕方なく`v1`を利用しました。

```diff
+    - uses: actions/checkout@v1
+      with:
+        submodules: true
-    - uses: actions/checkout@v2
```

submodulesでsshだと取得出来ないのでhttpsに変更。

```diff:.gitmodules
[submodule "..."]
　path = repo
+　url = https://github.com/repo.git
-　url = git@github.com:repo.git
```

# setup-dotnet

```yaml
- name: Setup .NET Core
    uses: actions/setup-dotnet@v1
    with:
    dotnet-version: 3.1.100
- name: Install dependencies
    run: dotnet restore
- name: Build
    run: dotnet publish "{path}" --configuration Release -o hoge
```

## コードフォーマッター
.NET Coreではdotnet formatというフォーマッタがある。

[dotnet format](https://github.com/dotnet/format)

```yaml
- name: Restore Tool
    run: dotnet tool restore
- name: Check code format 
    run: dotnet format --check --dry-run
```
※マニフェストファイルがないとdotnet toolコマンドが有効にならないので注意。導入はこちら[こちら](https://qiita.com/nogic1008/items/ce2dec260aa31bf205d8#%E3%83%9E%E3%83%8B%E3%83%95%E3%82%A7%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)が参考になると思います。

### オプション
`--check` : フォーマットせずチェックする
`--dry-run` : 失敗したときに0以外の終了コードを返す

# webapps-deploy
Azureにデプロイするためのワークフロー。デプロイするための認証情報を取得する必要があるので[発行プロファイルの取得]を押下。githubのSecretにて`publish_profile`の名前（名前はなんでもよい）でダウンロードしたファイルを以下で貼り付け。packageはdotnet publishで出力したディレクトリを指定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496802/01f14e76-7013-3dad-172e-ff647467d7c4.png)

Secretで登録したkeyを`publish-profile`に指定する。

```yaml
- uses: azure/webapps-deploy@v1
   with:
     publish-profile: ${{ secrets.publish_profile }}
     package: './hoge' 
```

# masterにpushされたら自動デプロイする
```yaml
push:
    branches: [ master ]
```

こんな感じでワークフローが実行されると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496802/e6797e77-7bf3-af4d-a23f-a42ec6106978.png)

# AppServiceの設定

**[デプロイセンター]からgithubを押下**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496802/6557769d-1745-b84c-315f-d8facf8c6442.png)

**github actionsを選択**
まだプレビューですorz
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496802/65951c03-4828-8024-5ae5-e194f9c772a6.png)

デプロイするリポジトリを入力。ワークフローはさっきつくったので[既存のワークフロー定義を使用して構成する]を選択。新規で作るとサンプルを勝手にコミットされるのでやめましょう（MSはいらないお節介が多い気が..）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496802/3e00b4a1-e5ec-0c40-74aa-858597dc02a2.png)
完了したらあとはpushしてワークフロー流したらデプロイ完了。


Azureではkuduというデプロイエンジンが使われていましたがようやくまともなCIがサポートされて使い勝手がよくなりました。

AppSercve on LinuxのB1インスタンスを利用してるのですが、masterにマージされると高確率で失敗する。。リトライすればデプロイ出来るのだが、、

# 参考
[Deploy .NET Core web application using GitHub Actions](https://rajbos.github.io/blog/2019/10/26/Deploy-dotnetcore-webapp-with-GitHub-Actions)