AzureDevOpsで.Net WebAppをWindowsServer IISへリリースするpipelineを作成する

#目的
AzureDevOpsで.Net＋IISなプロジェクトのCI/CDしたい

# 前提・対象者
- IIS上のサイト設定済、設定出来る
- VisualStudioの発行でも何でも良いのでサイトが動作するのは確認してる
- AzureDevOps内にプロジェクトがある、gitも設定済
- あとはpiplineの設定だけしたい！という状態

## 動作確認環境
AzureVM WindowsServer2016
IIS10.0
.NetCore2.2（Frameworkでも良いよ）

# 実際の手順
###参考　というかぶっちゃけほぼこれ
https://docs.microsoft.com/en-us/azure/devops/pipelines/apps/cd/deploy-webdeploy-iis-deploygroups?view=azure-devops

## WindowsServerをdeployグループに登録
DevOpsから配置先を操作できるようにエージェント登録してやる必要があります

AzureDevOpsからPipelines>Deployment groups
「＋New」をクリックし適当な名前を入力して「Create」  
![Items.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403152/7df902eb-59d3-f93e-075d-12b88d3b6ecc.png)


右にパワーシェル用のいろいろが表示されるのでまずはType of target to registerがWindowsな事を確認
そんで右下の「Use a personal access token ~」にチェックしコピーします
![Items (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403152/5f438c8e-caf9-7994-efea-1059bc9b97fe.png)

WindowsServerにログインし、管理者権限でパワーシェルを開きコピーしたシェルを実行
途中、エージェントタグの構成、アカウントの入力を求められますが何も押さずEnter

実行完了したら「C:\azagent\A1」みたいなフォルダが出来ます、だから管理者権限で実行する必要があったんですね
AzureDevOpsのDeployment groupsに戻ると「TargetStatus」がOnlineになってちゃんと見えてる事が確認できます
![Items (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403152/aa6c9543-6510-f41e-77b6-b247ca2204e9.png)


groupsという名前が示す通り複数登録して一斉配信するような使い方が出来ます、が今回はとりあえず一台で

**未検証**
ホワイトリストなセキュリティを設定してて繋がんねぇってなるときは以下を参考にすると良いのかな
https://docs.microsoft.com/ja-jp/azure/devops/organizations/security/faq-network-connections?view=azure-devops
「Azure DevOps IP check page. 」なんてのも紹介されてたので使うと良いかも
https://devblogs.microsoft.com/devops/new-ip-firewall-rules-for-azure-devops/

## ビルドpipelineを作る
AzureDevOpsからPipelines>Builds
「＋New」>NewBuildPipelineをして対象のgit,repositoryと選択
Configureで.NetCoreを選びます
yamlが自動生成されます
![Items (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403152/ad2e4f5b-a134-2c68-af23-149b791ece49.png)


pool:vmimageがビルド環境です.NetFrameworkの場合windowsの環境が選べるので選びましょう
以下のように色々選べます
https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops#use-a-microsoft-hosted-agent

triggerはトリガーです
タグ名とか細かく指定できますが、そこは運用に応じて各々で調べてもらって…今回はブランチだけ

SaveしてRunしてみましょう
ちゃんと成功すればおっけーです

## リリースPipelinesを作る…前に
ビルドしただけではまだ不十分

Artifactsという資材として利用可能な状態へ発行してやる必要があります
Buildに戻り先ほど作ったyamlを以下のようにします（vmimageは任意で）

``` azue-pipelines.yaml
trigger:
- master

pool:
  vmImage: 'vs2017-win2016'

variables:
  buildConfiguration: 'Release'

steps:
- script: dotnet build --output $(System.DefaultWorkingDirectory)/publishWork
  displayName: 'dotnet build $(buildConfiguration)'

- publish: $(System.DefaultWorkingDirectory)/publishWork
  artifact: drop
```


publish artifactというステップを追加しました
この作業によりビルド結果を利用可能な状態にします。

同時に`dotnet build` にoutputの追加してartifactには同ディレクトリを指定してますが
このパスは僕がデフォルトのビルド先の「bin/~」フォルダ指定するの嫌なのでこうしただけです

ちなみに2019年6月の更新でYAMLキーワードが新しくなってるようです
Publishing artifacts　のYAML（Task）で紹介してる記事も多いですが内容は同じです
https://docs.microsoft.com/en-us/azure/devops/pipelines/artifacts/pipeline-artifacts?view=azure-devops&tabs=yaml

追加したらもう一回Runしておきましょう

ビルド結果からArtifactsが見えるようになってます
![Items (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403152/55dc2761-9997-1747-5798-30aca74d7071.png)

ここからArtifactsのダウンロードも出来るのであの時のリリースの結果を開発環境で再現したい！とかの要求も満たせますね

## Pipelinesの作成
最後にリリースpipelineを作成します
AzureDevOpsからPipelines>Releases
「＋New」>NewReleasePipeline、テンプレート選択が開くので「IIS website deployment」を選択
![Items (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403152/8d129396-5e4a-c9a3-7332-5ba9d2af57d5.png)

雛形が出来るのでまずは元となるArtifactの選択
Build > 作成したBuildPipeline
![Items (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403152/f16046b6-3560-e64e-ad28-b4efaea2bc56.png)

他はそのままでAdd
リリースPipelines自体のトリガーを設定するために⚡から指定branchのビルドをトリガーするように設定
（正直この画面はどこ押したら良いのかわかんない箇所が多い気がする）
![Items (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403152/cd93461c-35e2-02c4-909e-b36e0d67a009.png)
![Items (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403152/b434b6d5-47e8-79b2-b92f-e841032af3e5.png)


次にIIS側の設定です
tasksから設定開く
（また設定開く場所がわかりづらくない？）
![Items (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403152/790228c8-1147-b886-d35e-5070c067d7c1.png)

WebSitenName,Physical pathなどいつものIISの設定（省略）
deploy groupsを選択
![Items (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403152/820b13c4-698d-6c08-82c6-caf33fc3368b.png)


Package or Folderで発行したartifactを選択します
![Items (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403152/bc4c1829-f906-68e6-4dbe-befc4b55a9d9.png)
![Items (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403152/a4d20574-e9ff-018b-aeb5-c3e546eb5413.png)


dropはyamlで指定した名前ですね
ちなみにビルドだけした場合ワークディレクトリだけ見えて中身は何も見えません
![Items (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403152/48ddc26e-9b57-06c9-1d11-4713d068d3a9.png)



ビルドはさっきしたので今度はリリースだけやってみましょう
リリース完了後、IISのフォルダを確認するなりサイトを開くなりして発行されてる事を確認しましょう。

## 変更をトリガー
最後にちゃんとブランチに変更加えた時にトリガーされるか確認しておきましょう。

以上
お疲れさまでした

# まとめ
例に挙げるために.Net & IISを使用したけどまとめると「Artifactを作る、Artifactを投げる」ってだけな感じになった
静的コンテンツだけとかならビルド無くても良いし、なんなら.netじゃなくても良いので
あとAzureDevopsの持つディレクトリ構造はリファレンスを参照して、何がどこに出てどこをyamlで呼べるか把握しとくと良いんじゃないでしょうか
https://docs.microsoft.com/ja-jp/azure/devops/pipelines/build/variables?view=azure-devops&viewFallbackFrom=azdevops&tabs=yaml  

まだまだ頻繁に更新されてて、buildだけとかreleaseだけとか情報はあるけど繋げて見るとなんかわからんな？ってなるのが多かったので通しで設定出来て良かった
.NetのためだけにJenkins on Windows環境抱えてる事もあったけどもう全部AzureDevOpsでやろうぜ！って感じで。おすすめです。