Microsoft Flowを使ってSlackからVisual Studio Team Servicesのビルドを実行する



#　概要
* SlackからVSTSのビルドをトリガーできるようにします
* Slack、VSTSの連携にMicrosoft Flowを使用します
* ビルド実行結果の通知はSlackとVSTSを直接連携します
* こんなイメージ

<img width="442" alt="chatops.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/6b7f8e1d-7a2a-d524-000b-19d0491e245f.png">

# 事前準備
* VSTSでビルドしたいもの
  * 今回はこれを使います[Visual Studio Team ServicesでASP.NET Coreプロジェクトのビルドを設定する](http://qiita.com/toshi0607/items/3557ebd8e8ec1fcd7be6)
* VSTSのアカウント
* やり取りするSlack
* Microsoft Flowのアカウント

# 本題
## VSTSのビルド完了通知をSlackに
こちらの記事の `Slackにチェックインを通知する` の項目がまさしくなので省略します。
[誰でもできる!VSTSとSlackの超簡単な連携方法](http://qiita.com/KeisukeKudo/items/257e6132d872b9069e33)

## Slack、VSTS、Flow連携設定
1. Slack上で「Apps & Integrations」をクリックします。
<img width="579" alt="スクリーンショット 2017-07-23 21.32.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/d83dbd92-c3b7-b437-d7ba-a1ebfb8b2ac5.png">

2. （ブラウザに飛んで）「Outgoing WebHook」を検索して選択します。
<img width="1356" alt="スクリーンショット 2017-07-23 21.51.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/43e23f26-d3c5-4f7e-0719-763f277e2db6.png">

3. 「Add Configuration」をクリックします。 
<img width="1372" alt="スクリーンショット 2017-07-23 21.55.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/b563f9d5-c3d0-5199-d66c-fee16b28db34.png">

4. 「Add Outgoing WebHook integration」をクリックします。
<img width="1369" alt="スクリーンショット 2017-07-23 21.55.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/d27ba51b-7b09-2021-1293-b7186a38bfc9.png">

5. Integration Settingsで「Channel」に通知対象の部屋を、「Trigger Words」にWebHookの起点となるフレーズを登録ます。
<img width="987" alt="スクリーンショット 2017-07-23 21.55.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/b7c4d1ce-c290-6d9a-16a3-57cf13de7481.png">

6. Micorosoft Flowのマイフローページに移動し、「一から作成」をクリックします。
<img width="1403" alt="スクリーンショット 2017-07-23 22.09.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/59b4e222-beff-e327-503b-010c5407a579.png">

7. トリガーの追加で「要求と応答 - 要求」を選択します。「要求本文の JSON スキーマ」は現状「サンプルのペイロードを使用してスキーマを生成する」に{ "sample": "test"} と入力して設定されるものでかまいません。
<img width="1312" alt="スクリーンショット 2017-07-23 22.12.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/226ca1ca-0303-e530-c1e9-eaf8df17af69.png">

8. アクションとして「Visual Studio Team Services - Queue a new build」を設定します。初回設定時には認証を求められます。
<img width="1195" alt="スクリーンショット 2017-07-23 22.16.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/7b8f027e-18bf-9cad-d9ea-391d7e493d54.png">

9. 「Account Name」、「Project Name」、「Build Definition Id」をドロップダウンから選択します。
<img width="1312" alt="スクリーンショット 2017-07-23 22.17.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/0f13de25-0b4d-cf94-e867-bbc83a26a5c0.png">

10. アクションとして「Slack - 投稿メッセージ」を選択します。
<img width="1184" alt="スクリーンショット 2017-07-23 22.36.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/e1549a47-6b07-157c-54ef-6931e44bf3ff.png">

11. サインインしてAuthorizeしてください。
<img width="637" alt="スクリーンショット 2017-07-23 22.36.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/ed21f4db-5e0a-7ec0-8a79-721cb7d7a837.png">

12. VSTSでのビルド開始後にSlackに通知するときの「チャネル名」、「メッセージテキスト」を選択します。メッセージには「動的なコンテンツ」として別のアクションからの出力を埋め込むことができます。ビルド完了後の通知はVSTSとSlackを直接連携させているのでこの設定とは別です。
<img width="1411" alt="スクリーンショット 2017-07-23 22.37.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/c31260f7-9a34-da15-f112-13610e862b02.png">

13. 「フローの更新」で一旦保存します。

14. 「要求」を開き、URLをコピーします。
<img width="1269" alt="url.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/e61a857f-8724-dd1d-5533-8ba779d48830.png">

15. SlackのIntegration Settingsに戻り、URL(s)に14でコピーしたURLをペーストします。
<img width="987" alt="slackurl.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/2fedd63b-5e8c-3bd4-3e87-8238e2d78d44.png">

以上で設定完了です。Slackに戻って設定したフレーズを投稿して動作確認してみましょう。

サービス連携時に次のような投稿もされているはずなので、念のため合わせて確認してみてください。

<img width="513" alt="スクリーンショット 2017-07-23 22.59.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/77c1c809-64dd-ef2d-5805-4dd192782b26.png">


# FAQ
## なんでMicrosoft Flow使うん？Logic Apps使えばいいんちゃうん？

<img width="912" alt="FlowとLogic Apps.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/1e8dac51-f827-5968-79b9-7b7dc01e8295.png">
[Flow、Logic Apps、Functions、WebJobs の比較](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-compare-logic-apps-ms-flow-webjobs)より

とのことで、最初Logic Appsで構築しようとしました。

が、今VSTSとの接続に問題があり、連携できずになんとかMS Flowで間に合わせたという事情があります。

[Logic AppsでVisual Studio Team Servicesへの接続認証を保存できません。回避策はありますか？](https://social.msdn.microsoft.com/Forums/en-US/4e2d41f8-80c6-429c-9124-1991ae0c535a/logic-appsvisual-studio-team-services?forum=windowsazureja)

## なんでSlackのWebHook無条件に受けて入れてるん？条件で絞るべきちゃうん？
「想定するtokenのときだけビルドする」みたいな条件で絞るべきだと思います。

ただ、現状SlackのWebHookで送信されるのはこういうもので「要求」で受け取れるjsonではありません。

```
token=bJ21uDt3aR4OITjUSeYuldZ2
team_id=T0001
team_domain=example
channel_id=C2147483705
channel_name=test
timestamp=1355517523.000005
user_id=U2147483697
user_name=Steve
text=googlebot: What is the air-speed velocity of an unladen swallow?
trigger_word=googlebot:
```

リクエストのBodyに上記相当のパラメタは入っているのでMicrosoroft Flowで使用できるフィルターや条件でマッチさせる、ということも考えられますが

「Body」 に 「xxxxx」 の値を含む

みたいな条件を足しても動かなかったのでとりあえず上記のような形で置くことにしました。僕のやり方が間違ってる可能性もだいぶあるので、うまくいった方教えてくださいm(_ _)m

今回のような専用のコネクタを使わずにがんばれば実現できる方法はあるようですが、専用のコネクタの「プレビュー」がとれたら実現できると信じつつ待ちます！