Azure DevOps プロジェクトを ASP.NET Core 2.1 へアップグレード（後編）

#はじめに
　[Azure DevOps プロジェクトを ASP.NET Core 2.1 へアップグレード（前編）](https://qiita.com/Aida1971/items/c57c4e61ba15e1d04043)に引き続き、今回は作成したプロジェクトを .NET Core 2.1 へアップグレードしていきたいと思います。


　Visual Studio 2017 をお持ちでない場合は Community Edition が[無償でダウンロード](https://visualstudio.microsoft.com/ja/free-developer-offers/)できます。こちらを事前にローカルの開発端末にインストールしておきます。

# Repos からソースコードのクローンを取得
1. [Azure Repos](https://azure.microsoft.com/ja-jp/services/devops/repos/) からローカル端末にプロジェクトのクローンを取得します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/4d4d1d63-d96e-f506-ec9a-e9298e28880e.png)
2. Visual Studio が起動してくるので、任意の場所に複製を取ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/1355c638-4b01-5584-cc14-28ee35c6ab6f.png)
3. ソリューションファイル(.sln)をダブルクリックして、ソリューションを開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/7fae5899-fbb1-3412-1380-00236792ae9d.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/6ba511bd-de97-80a6-1270-09d09211a6a9.png)


# ASP.NET Core 2.1 へアップグレード
1. [プロジェクト] のプロパティにて、ターゲットフレームワークを 2.1 に変更します。ソリューションには３つプロジェクトが含まれているので各プロジェクトで設定を変更します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/3e1ae97f-5d56-65a9-42e1-c69195f7817e.png)

2. [依存関係] を右クリックし、ショートカットメニューより [NuGet パッケージの管理] を起動します。更新プログラムをすべてのパッケージに対して更新します。こちらも３つのプロジェクトそれぞれに実施します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/c77ce431-52ab-4c31-fa8a-b722d2f8b5ef.png)

3. 下記のエラーが出力される場合には、[NuGet パッケージの管理] より Microsoft.NET.Sdk.Razor をインストールします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/a3b26a8f-d386-ae1e-8b2e-658126a5ecaa.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/27cbb612-592c-1490-ebc4-55d76d67a16d.png)

4. [ビルド] メニューから、ソリューションのリビルドを実行し、エラーなく完了できることを確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/7f652684-7776-91e6-6d05-8480c9213190.png)

　以上で .NET Core 2.1 でのビルドが正常に完了しました。デバッグ実行でローカルでのアプリケーション動作を確認します。
 
# 変更済みプロジェクトを Repos へ同期
1. [チーム エクスプローラー] タブに切り替え、[家マーク] のホームボタンをクリックし、[変更] を選択します。コメント欄に「Update to .NET Core 2.1」と入力し、[すべてをコミット] をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/165af07a-895e-8230-b054-5333431c6658.png)　![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/4bcddcbb-afeb-4ae6-e38f-948fbead2aa6.png)

2. [同期] をクリックし、遷移した次画面で、再度 [同期] をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/238789e5-9305-f10c-1184-be26447373f5.png)　![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/01774336-fa97-6609-e2de-31ecda5749b8.png)

　以上で、ローカルでの変更が Repos へ反映されました。

#ビルド Pipelines の確認
　ローカルの変更が Repos へ反映されると、それをトリガに Azure DevOps の Pipelines が自動的に実行されます。今回変更した「Update to .NET Core 2.1」はビルドが失敗していることがステータスからわかります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/811782ea-9bf1-3887-bf68-03a87e1433c7.png)

　「Update to .NET Core 2.1」をクリックして Build Job のどのタスクで失敗したかを確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/52096840-934a-cb7e-9ad9-27541c717fbc.png)

　更に「Restore」をクリックし、ログからエラーの要因を特定します。以下の画面では切れて見えていませんが、次のエラーが原因とわかります。

* error NU1003: PackageTargetFallback and AssetTargetFallback cannot be used together. Remove PackageTargetFallback(deprecated) references from the project environment.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/3e37791c-e76f-9c8b-dc04-a89f3fdf5a2b.png)

　これは以下の公式ドキュメントにも記載のある[「Package Target Fallback プロパティの名前変更」](https://docs.microsoft.com/ja-jp/aspnet/core/migration/1x-to-2x/?view=aspnetcore-2.1#rename-package-target-fallback-property)に該当しています。

**ASP.NET Core 1.x から 2.0 への移行**
https://docs.microsoft.com/ja-jp/aspnet/core/migration/1x-to-2x/?view=aspnetcore-2.1

# プロジェクトの修正
　ローカルの開発端末に戻り、Visual Studio でプロジェクトを右クリックし、ショートカットメニューより、プロジェクトの編集を選びます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/8be9086c-ae4a-0db0-6afa-4d89e59c2829.png)

　プロジェクトファイルの下記赤枠３か所に記載のある PackageTargetFallback を AssetTargetFallback に変更します。プロジェクトは３つあるので、それぞれで該当箇所がないか確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/4a890007-5261-e1cd-dbe4-6ea6e63fff88.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/beae4b94-6c9b-f4e1-7b1c-35e8f9ac25af.png)

# 修正プロジェクトを Repos へ再コミット
1. [チーム エクスプローラー] タブに切り替え、[家マーク] のホームボタンをクリックし、[変更] を選択します。コメント欄に「Modify PackageTargetFallback to AssetTargetFallback.」と入力し、[すべてをコミット] をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/165af07a-895e-8230-b054-5333431c6658.png)　![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/e9617192-cbf0-08dc-b49d-c599db747a59.png)

2. [同期] をクリックし、遷移した次画面で、再度 [同期] をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/c9a2f89b-03a0-5737-e433-57d1da32a2fb.png)　![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/e4fbe9fe-30f4-f54b-8f5c-ed0e2f14bce3.png)

#ビルド Pipelines の再確認
　今回はビルド Pipeline が正常に完了したことが示されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/5d19ea02-6160-1198-8f99-ebc97f1f740e.png)

　Azure ポータル上でも DevOps Projects の CI/CD プロセスがデプロイまで含め全て正常に完了しているのがわかります。Application endpoint をクリックして、デプロイ済みのアプリケーションにアクセスしてみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/3ccfe271-3977-3673-072d-7573e14fe646.png)

　**残念ながらうまく動作していないようです。**今回利用した [Linux Web Apps](https://docs.microsoft.com/ja-jp/azure/app-service/containers/app-service-linux-intro) へのデプロイでは、Pipelinse の Release プロセスで統合テストフェーズが入っていないため、CI/CD の段階で実行時エラーが検出されておりません。これに関しては、また[別の機会](https://qiita.com/Aida1971/items/cbc9b92d78e6755e5e1d)に詳細な解説をしたいと考えています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/bc8970ac-4c6f-4f92-7b2d-066a77df6bc2.png)

#実行時エラーの解決
1. 今回、実行環境として利用している App Service (Linux Web App) をクリックします。 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/ab36e669-8151-063c-a177-d2cda7e142e0.png)

2. アプリケーションの設定で、ランタイムを .NET Core 2.1 に変更して [保存] をします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/a0ea1276-d731-690f-2e8a-b495cee5bf2e.png)

3. 再度、アプリケーションにアクセスして、以下のように成功する事を確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/3697e1a1-bb54-4abf-1d78-f545b72757f4.png)

#Pipelines の Release 設定の変更
　上記はマニュアル操作で、App Services のランタイムスタックを変更しましたが、本質的には Azure DevOps の Release パイプラインの設定を変更します。

1. Releases の Edit をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/998fea68-4206-1e87-88f5-82a6936d45b7.png)

2. 赤枠の job/tasks をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/6001c32c-2b2b-b638-eac1-777a22901895.png)

3. Deploy Azure App Service の Runtime Stack で、.NET Core 2.1 を選択して [Save] します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/265d0c92-01aa-3fd8-025f-e4e64c310e4c.png)

　以上の変更により、これ以降の CI/CD プロセスでは、App Services のランタイムスタックが .NET Core 2.1 としてデプロイが実施されます。

　[次回](https://qiita.com/Aida1971/items/cbc9b92d78e6755e5e1d)は、Release フェーズで統合テストを実行することで、今回のような実行時エラーを CI/CD プロセスで事前検出する試しみを行いたいと思います。