Azure DevOps PipelinesのBuildsとReleases（リリースパイプライン）を使ってみる

# 前提条件
今回はAzureのFunctions(Function App)を利用しますので、AzureのSubscriptionを保持しており、すでにFunction Appを１つ新規作成してある状態を前提としています。

# はじめに
Pipelinesは、開発効率を圧倒的に高める上で大切なサービスです。
超概要につきましては、[Azure DevOps Pipelines(パイプライン)の超概要](https://qiita.com/mstakaha1113/items/f9fad71b8bd33e77d9ce)をご覧ください。
Builds(ビルドパイプライン)単体につきましては、[Azure DevOps PipelinesのBuilds（ビルドパイプライン）を使ってみる](https://qiita.com/mstakaha1113/items/c2816c06e38cc3101cca)をご覧ください。
今回は、"Builds"からの"Releases"(リリースパイプライン)を実施したいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/5e19c4ef-5b26-7c75-6b71-2426435d9af0.png)
こちらのCIとCDになります。

今回は、Azure FunctionsというAzureのサービスを使って説明したいと思います。
Functionsに関するマイクロソフト公式ドキュメントは[こちら](https://azure.microsoft.com/ja-jp/services/functions/)をご確認ください。

# FunctionsやWebAppsは独自にデプロイパイプラインを持てる（先に脱線した話題）
今回は"Builds"と"Releases"を使いますが、とりあえず自動デプロイしたいというだけであれば、特に"Releases"を使わなくてもリリースは可能です。
各々のサービスの中で設定する項目がありまして、リポジトリやブランチを指定してあげれば自ら変更をフックしてデプロイしてくれます。
本番環境への適用につきましては慎重にご検討いただきたいですが、ご参考まで。
[Azure Functions の継続的なデプロイ](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-continuous-deployment)
[Azure App Service への継続的デプロイ](https://docs.microsoft.com/ja-jp/azure/app-service/deploy-continuous-deployment)

# Functionsのチュートリアルをベースに実践
今回はチュートリアルをベースに、ビルドと開発環境へのリリースを実践してみます。
チュートリアルはこちらになります。
[Azure DevOps を使用した継続的デリバリー](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-how-to-azure-devops)

## アプリケーションの作成
VisualStudioを使用して、HTTPトリガーで稼働するデフォルトのFunctionsアプリケーションを作成、メソッド１つとMSTestを追加しました。
Functionsの中に、このようなメソッドを１つ作って
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/73bdb1d3-e4da-e81a-e7d8-1845949e2223.png)
MSTestを同一ソリューション内に新規作成して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/abf3aa08-9d69-3793-58fa-2bf37334daee.png)
テストを1行記載してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/d75d2206-65c0-140b-6b67-3ac3bddf4571.png)

今回も完成品をこちらのReposに置きました。
[リポジトリ](https://dev.azure.com/mstakaha1113-kanrisya/qiitamstakaha/_git/builds-releases-function-sample001)
MSTestについてちょっと知りたいという方は、とりあえずこちらをご確認ください。
[単体テストの概要](https://docs.microsoft.com/ja-jp/visualstudio/test/getting-started-with-unit-testing)

## "Builds"（ビルドパイプライン）の作成
### 1.リポジトリを作成
[Azure DevOps PipelinesのBuilds（ビルドパイプライン）を使ってみる - Reposへ登録](https://qiita.com/mstakaha1113/items/c2816c06e38cc3101cca#repos%E3%81%B8%E7%99%BB%E9%8C%B2)を参考にして、ご自身のReposに上記リポジトリをコピーしてください。
### 2.ビルドパイプラインを作成
今回もクラシックでいきます。
"Builds"画面で"New"します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/8bcbeb46-2e22-71cd-5df5-0e3fb5ac1f97.png)

"Use the classic editor"をクリックしてください。
先ほどコピーしたリポジトリを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/cc1a9f0c-fe93-9be9-7908-d36618bdd018.png)
テンプレートでは"Azure Functions for .NET"を"Apply"します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/ae91d0a3-aad5-8978-c61e-edef159e100a.png)
このままビルドしても良いのですが、せっかくなので単体テストも実施してみます。
"Agent job 1"と記載されている右側の "＋" をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/010722f7-4459-9a55-3bd1-f12483c99523.png)
"MSTest"と入力し検索すると(しなくてもいいのですが)、"Visual Studio Test"が出てきますので"Add"します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/f6293fe8-3301-9e8e-e78e-77c759ad2e1a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/f117277a-db64-0e36-6d46-f99ee83466b7.png)
エージェントは、上から順番に仕事をします。
Add直後の状態だとArtifact（この作業の最終生成物）を発行した後でテストをしてしまいますので、"VsTest"をドラッグして"Build project"の直後に持っていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/085f3c8e-f4b4-1a06-cfd2-0c33a730cc44.png)
これで、

- ソースコードを取得する
- ビルドする
- テストする
- 成果物をzipにする
- 最終成果物として発行する（後続のReleasesで利用できるようにする）

という一連の流れが出来上がりました。
ここからはエージェント実行時エラー対策です。
今回必要な、とりあえずの設定を記載していきます。
実際のプロジェクトではトライ＆エラーを繰り返すこととなりますので、最初は少し忍耐が必要です。
まずはテストが実行できない（実行ファイルが探せなくてエラーになる）ので探せるようにします。
VsTestの設定"Test files"の項に"test.dll"というのがありますので、"Test.dll"と変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/901d2fad-c6be-347b-1fb7-b5a77a6a8e5a.png)
続きまして、アーカイブ対象となるファイルが探せないというエラーが出ますので、探せるようにします。
Archive files の設定"Root folder or file to archive"の項に"FunctionApp1/"を追記します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/5d884713-988c-ae68-e30b-cb1b593b4e18.png)

画面上部中央"Save & queue"をクリックしてビルドします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/4b4e7158-3a2a-d1ac-1b64-da9744a45ad8.png)

# リリースパイプラインの作成（やっと本題）
ジョブが終わりましたら、画面右上の"Release"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/e45c827f-9988-22c9-0bb1-38411057245a.png)
ビルドパイプライン同様、こちらでもリリースパイプラインのテンプレートの選択画面となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/6f56b1b0-65d0-2e85-07b3-67b655e305b1.png)
今回は Functions ですので、"Deploy a function app to Azure Functions"をApplyします。
画面中央の "Stage 1"が選択されて、そこの設定ペインが出ている状態になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/93d619d9-028b-f66a-6032-aec28de8830d.png)
とりあえず何も考えずに画面中央の"Stage 1"内、アラートアイコンが出ている"1 job, 1 task"というリンクをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/13370fc7-ae5b-28bf-6b19-b4f76a8f8767.png)
ここは、このStage 1という作業の内容について設定を行うリンクです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/e380014c-866a-a2f2-6bfb-36d2b25b25bc.png)
リンク先はタスクの設定となっています。
今回の場合、Azure Functions Appを扱うことは理解してくれていますが、実際どこにデプロイするのかは指定されていません。
これがアラート表示の原因です。
こちらも、１つ１つ設定していきます。すでに作成済のFunctionsおよびそのFunctionsを作成したSubscriptionを設定ください。
終わりましたら、画面上部の"Save"ボタンをクリックします。
その後、左側の"Pipeline"タブをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/aa3a6062-42e4-91c4-f350-3e5fb1cbccff.png)
これで先ほどのリリースパイプラインの画面に戻りました。

ここまでの作業で、リリースパイプラインの作成が終わりました。

# リリースパイプラインの実行

"Save"ボタンの右側にあった"Create release"ボタンをクリックしてみましょう。
何やら聞いてきますが"Create"ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/b946853d-899f-d908-b7be-9fd239864d2e.png)
このような表示が出たら成功です。
青い文字のリンクになっている部分（今回だと"Release-1"）をクリックします。
うまくデプロイが完了した場合、画面中央のStageに"Succeeded"の文字が見えると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/849efd47-dbe4-0a09-24e1-9ff6ff137d56.png)

# まとめ
今回は、"Builds（ビルドパイプライン）"からの"Releases（リリースパイプライン）"の流れを実践してみました。
リリースパイプラインの基本は

- ビルドパイプラインにて生成された物を使う
- "リリース先を指定して生成物を配備する"という一連の流れ（パイプライン）を作成する
- パイプラインを何度も実行する

という動作です。
ローカルPCや人間に依存しないことは多くのメリットを生みます。
ローカルPC環境の保全を考えなくて良いですし、誰かがいないとリリースできないという状況もなくなります。
パスワード等をローカルで管理する物理も含めたリスクも回避できます。
作業履歴の管理も勝手に行われます。

BuildsもReleasesもコツは、生成物が小さいうちから実践することです。
また安定するまでは焦らないで１つ１つエラーを解消することです。
小さく生んで大きく育てる意識でご利用いただけたらと思います。