しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure App Service / Azure Pipelines で .NET Core 3.0 が利用可能になっています

.NET Core 3.0 が GA してから 3 週間近く経ちましたが、ぼちぼち App Service と Azure Pipelines で .NET Core 3.0 が利用可能になってきました。App Service は今のところ Windows のみ対応しています。*1

両方のサービスに SDK がインストールされて終わりなら良かったのですが、現時点では注意点がいくつかあるので軽くまとめておきます。

Azure App Service

元々 App Service は US 時間 10/11 に .NET Core 3.0 のデプロイが完了する予定でしたが、今日の時点でほぼ全てのリージョンに 3.0 のデプロイが行われているようです。

手持ちの Japan East / West にデプロイ済みの App Service にも 3.0 が入っていることを確認しました。

あと MS の人が作ったサービスでも、載っているリージョンには 3.0 が展開されていることが確認できます。全ての Scale unit に展開済みというわけでは無さそうですが、ここ 1,2 日のうちに完了するでしょう。

ちょっと前に Re-image も行われて最新の ASP.NET Core Module もインストールされているので、ASP.NET Core 3.0 のアプリケーションを動かす環境は整っています。

Azure Pipelines などでビルドしたものをデプロイする場合には問題なりませんが、今の App Service には 3.0 向けの SDK がインストールされていないので、GitHub や LocalGit から Kudu でビルドしているケースでは 3.0 向けだとエラーになります。

f:id:shiba-yan:20191010175229p:plain

dotnet --info を叩いた結果ですが、Runtime は 3.0 が入っていますが SDK は 2.2 のままです。最新の MSBuild も入っていないので C# 8.0 を使ったコードはビルドが通らないはずです。

この場合はこれまで通り TFM を netcoreapp2.2 にして App Service 側の対応を待つか、他の CI サービスでビルドさせるかのどちらかになります。

Azure Pipelines

ビルド側の Azure Pipelines は Release Note には書いてませんでしたが、一部の Hosted Agent に .NET Core 3.0 SDK がインストールされていました。

GitHub を見てる感じではイレギュラーな対応っぽいので、暫くすると新しいイメージがデプロイされる気がします。2.2.x の SDK も新しいものが入っていなかったので。

今日の時点で .NET Core 3.0 が入っていたのは Ubuntu / Windows の 2 つでした。

f:id:shiba-yan:20191010175418p:plain

f:id:shiba-yan:20191010175426p:plain

何故か macOS には 3.0 が入っていなかったので、今回の対応はかなりイレギュラーなものだと思います。

f:id:shiba-yan:20191010175509p:plain

他にも .NET Core インストール後の初回起動時に行われるキャッシュの展開が未実行だったり、いろいろと問題のあるイメージがデプロイされていますが、手動でインストールと変わらないので今は目を瞑ります。

アプリケーション側の対応

既に ASP.NET Core 3.0 への移行を終わらせていれば、そのままデプロイすれば Windows の App Service でも .NET Core 3.0 のランタイム上で動きます。

せっかくの .NET Core 3.0 対応なので、Azure Pipelines で ReadyToRun 向けにビルドするようにしました。GA ちょっと前のタイミングで Framework Dependent でも R2R 向けにビルド出来るようになっています。

既に App Service に Self-contained + ReadyToRun でデプロイしていた場合は、false を指定して Framework Dependent にするだけで対応完了です。

実際に App Service に Framework Dependent + ReadyToRun でビルドしたものを Run From Package でデプロイしていますが、問題なく動作しています。

起動時のパフォーマンス改善は規模が小さいアプリケーションなので計測が難しいです。

f:id:shiba-yan:20191010181908p:plain

ReadyToRun 向けにビルドをすると、外部アセンブリも同時に R2R Image になるので、依存パッケージが多い場合などで効いてくるかもしれません。

この辺りはちゃんと計測したいところですが、ReadyToRun にするデメリットはビルド時間が少し長くなるのと、アセンブリサイズが少し大きくなるぐらいの認識なので、有効化しておいて損はないと思います。

*1:Docker を使っている場合は問題なく .NET Core 3.0 が使えます