.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 日のうちに完了するでしょう。
I just published a new UI for https://t.co/kQorMCviOP, where you can watch as @dotnet core 3.0 rolls worldwide. thanks to @isaac2004 for his inspiration with the new map view. pic.twitter.com/MhVQcueeMr
— Brady Gaster (@bradygaster) 2019年10月8日
ちょっと前に Re-image も行われて最新の ASP.NET Core Module もインストールされているので、ASP.NET Core 3.0 のアプリケーションを動かす環境は整っています。
Azure Pipelines などでビルドしたものをデプロイする場合には問題なりませんが、今の App Service には 3.0 向けの SDK がインストールされていないので、GitHub や LocalGit から Kudu でビルドしているケースでは 3.0 向けだとエラーになります。
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 つでした。
何故か macOS には 3.0 が入っていなかったので、今回の対応はかなりイレギュラーなものだと思います。
他にも .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 でデプロイしていますが、問題なく動作しています。
起動時のパフォーマンス改善は規模が小さいアプリケーションなので計測が難しいです。
ReadyToRun 向けにビルドをすると、外部アセンブリも同時に R2R Image になるので、依存パッケージが多い場合などで効いてくるかもしれません。
この辺りはちゃんと計測したいところですが、ReadyToRun にするデメリットはビルド時間が少し長くなるのと、アセンブリサイズが少し大きくなるぐらいの認識なので、有効化しておいて損はないと思います。
*1:Docker を使っている場合は問題なく .NET Core 3.0 が使えます