tekitoumemo’s diary

思ったことを書くだけ。長文版Twitter

.NET CoreアプリをGitHub ActionsでAzureにデプロイした

mygkrnk.com

個人サービスをkuduデプロイからGitHub Actionsへ、.NET Core2.2から3.1に上げた。
NET Coreバージョンアップは別の記事で書く。

kuduとは

Azure Webサイトで利用されているGitデプロイエンジン。要はオープンソースのCIなのだが、非常に使い勝手が悪い、というか結局シェルスクリプトゴリゴリなのであまり恩恵がない上、github上で連携出来ないのでAzure portalを見に行かなければならず非常に不便だった。さらに.NET Coreを使う上で大きな問題がある

github.com

.NET Coreを使う上でのkuduの問題点

kuduはホスティング上でビルドするのでホスティング環境が整ってないとビルドが出来ないことがある。AppServiceではnodeは8(記憶上だと)と古く、.NET Coreで言えばビルドするために必要なdotnet cliが使えない(厳密には使えるが最新のバージョンをサポートしてない)。dotnet cliSDKに含まれてるのでAzureのサービス上でビルド出来ないのだ。AppServiceなど3.1のruntimeはあるのにビルド出来ずにバージョンが上げれず、いつSDKがリリースされるのか告知も無い。そのようなことがあり継続的なバージョンアップが出来ないと判断し、GitHub Actionsに移行した。あと、MSがgithubを買収したところからkudu廃止してGitHub Actionsに移行する方向で進んでそう。

GitHub Actionsを選んだ理由

無料枠多すぎ、Microsoftひいきしすぎ(ドキュメント豊富)、期待感すごい。

ワークフローを作る

[new workflow]から.NET Coreを選択。
f:id:tekitoumemo:20200416232820p:plain

[set up this workflow]をクリックするとテンプレートが表示される。2020/4時点はこれ↓

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を使ってるリポジトリだったのでcheckout@v1を選択。submodulesをv2で実現するのはちょっと面倒なので。

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

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

[submodule "library/DapperSlackOff"]
 path = library/DapperSlackOff
+ url = https://github.com/ikuosaito1989/DapperSlackOff.git
- url = git@github.com:ikuosaito1989/DapperSlackOff.git
setup-dotnet
    - 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というフォーマッタがある。prittierとか使ってるとちょっとしょぼいように感じるが、無いよりましなので追加する。
github.com

導入は下記参照。
.NET ローカル ツールの使い方 - Qiita

マニフェストファイルがないとdotnet toolコマンドが有効にならないので注意

    - name: Restore Tool
      run: dotnet tool restore
    - name: Check code format 
      run: dotnet format --check --dry-run

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

webapps-deploy

Azureにデプロイするためのworkflows。

デプロイするための認証情報を取得する必要があるので[発行プロファイルの取得]を押下。githubのSecretにてダウンロードしたファイルを以下で貼り付け。packageはdotnet publishで出力したディレクトリを指定する。
f:id:tekitoumemo:20200417120113p:plain

- uses: azure/webapps-deploy@v1
   with:
     publish-profile: ${{ secrets.publish_profile }}
     package: './hoge' 
masterにpushされたら自動デプロイする
push:
    branches: [ master ]

f:id:tekitoumemo:20200417120808p:plain

AppServiceの設定

AzureのUIが違うかもしれないが、、
[デプロイセンター]からgithubを押下
f:id:tekitoumemo:20200417121303p:plain

github actionsを選択
f:id:tekitoumemo:20200417121350p:plain

リポジトリをよしなに入力。ワークフローはさっきつくったので[既存のワークフロー定義を使用して構成する]を選択。新規で作ると勝手にコミットされるので、僕は嫌いです。
f:id:tekitoumemo:20200417122057p:plain

完了したらあとはpushしてワークフロー流したらデプロイ完了。ちなみにたまにコンフリクト起こしてデプロイ失敗するので、リトライすれば大体成功する。