OpenWhiskでGitHubのイベントをCloudantに保存する 

この記事は，[Bluemix(SoftLayer) Advent Calendar 2016](http://qiita.com/advent-calendar/2016/bluemix)の16日目の記事です.

OpenWhiskでGitHubのトリガーを使ってみました．
GitHubのWebhooksなら何でも（？）トリガーとなるようなので使い道は広そうです．

2016/12/13にBetaからGAとして正式にリリースされました！めでたい！
それに合わせてUIなど変わったところがあるので，その辺りも紹介していきます．

# OpenWhiskとは
オープンソースのイベント駆動型サービスです．
Function as a Service　として話題になっていますね．
(基本的なところは他の方が説明されていると思うので，そちらをご覧ください．)

もちろんBluemixで提供されています！

## GAで変わったこと
* UI
* 料金体系
* その他

このくらいですかね．
（他にある場合は教えて下さい！）

### UI
全体的に黒っぽいデザインから青っぽいデザインになりました．

スタート画面はこうなりました．
<img width="1280" alt="openwhisk_console.png" src="https://qiita-image-store.s3.amazonaws.com/0/149028/f1840fe1-4308-cc2c-7a57-b998fffe03c4.png">

アクションの一覧を管理できるようになりました．
名前，バージョン，メモリ，タイムアウトが表で見られるようになっています．
メモリは金額に関係するのでこうやって見られるのは嬉しいですね．
この画面からアクションの新規作成もできます．（New Actionボタン）
<img width="1280" alt="openwhisk_console_manage.png" src="https://qiita-image-store.s3.amazonaws.com/0/149028/ed3c29d2-f0d5-d3cb-1859-3a626b0cf662.png">

元々DevelopとMonitorは，別ウィンドウで開いていましたが，GAからは別ウインドウは開かなくなるようになりました．
機能的な部分は特に変わらず，色合いが変わっただけのようです．

### 料金体系
GB-sで計算します．
料金表は以下です．
<img width="847" alt="openwhisk_pricing.png" src="https://qiita-image-store.s3.amazonaws.com/0/149028/9d1cf402-a182-39d8-3bcf-778336ff44a4.png">

実行時間0.5秒，メモリ128MBのアクションなら月で5,000,000回まで無料になります．
この表を見る限り，実行時間が長くなると金額は上がるようです．（その分，実行回数は増えますが！）
他のサービスをうまく使って，実行時間とメモリを抑える工夫が必要になってきますね．

### その他
言語の削除（主に複数バージョンあったもの）やパッケージに関する細かいことは[Bluemix Blog](https://www.ibm.com/blogs/bluemix/2016/12/openwhisk-beta-general-availability-ga/)に書いてありますのでご参照ください．

ここはタイミングがちょうど同じになっただけかもしれませんが...
トリガーにMessage Hubが追加されました．
更なる連携が期待できそうでなので，すごくわくわくします．

## GA移行でやっておいたほうがいいこと
### 費用
Betaでは無料で使えていましたが，GAでは費用は発生します．
そのため，ルールを作って実行させている場合（特に定期実行など）は気が付かない間に費用が発生する可能性があります．
（無料枠の幅が広いので問題ないとは思いますが...）
一度，ルールの見直しをすることをお勧めします．

### API key
API keyの更新が必要です．
[こちらの記事](http://niccloud.niandc.ne.jp/?p=3066)に詳しく書かれていますので，こちらをご覧ください．

# GitHubとの連携
さて，ようやく本題です．
OpenWhiskにはGitHubのトリガーがあり，[Webhooks](https://developer.github.com/webhooks/#events)のイベントをトリガーとすることができます．
それを試して他のサービスと繋げてみたいと思います．

## 準備
OpenWhiskへのアクセスは省略します．

GitHubのトリガーを使うには，Personal access tokensを発行する必要があります．
OpenWhiskからGitHubのトリガーを新規作成します．
新規作成の画面のaccessToken部分の「詳細はこちらから」でGitHubのページにジャンプします．
<img width="980" alt="github_trigger.png" src="https://qiita-image-store.s3.amazonaws.com/0/149028/05a0419b-1ae7-4029-4e4c-01d7f37fc8f5.png">

・Token descriptionを入力（分かりやすくOpenWhiskとかにしました）
・admin:repo_hook にチェックを入れる
<img width="1280" alt="github_token.png" src="https://qiita-image-store.s3.amazonaws.com/0/149028/8f45a354-a804-e371-8c4e-d90bd98d34d7.png">



Generate tokenでトークンが作成されると思うので，コピーしておきます．
これで準備は完了です．
（適当なGitHubのリポジトリがない場合は作っておいてください）

## push
リポジトリへのpushをトリガーにしてみます．

GitHubのトリガー作成画面にて，
・トリガー名
・username
・repository
・accessToken
・events
を入力します．
先ほど作成したトークンをaccessTokenに入れると，usernameとrepositoryが勝手に補完されます．（便利です）
適当なrepositoryを選択し，eventsには「push」と入力して，構成の保存でトリガーを作成します．
<img width="1005" alt="trigger_push.png" src="https://qiita-image-store.s3.amazonaws.com/0/149028/5e249f7c-88dd-a8a6-80ed-5c8726ce6954.png">

  
pushのトリガーからは，大まかに以下の情報が取得できます．
（各情報，さらに細かい情報まで取得できます）

* repository
* before
* pusher
* ref
* commits
* after
* base_ref
* forced
* sender
* head_commit
* compare
* deleted
* created

この情報をCloudantに書き込んでみます．
CloudantにDatabase，Documentを作成しておきます．
（Cloudantの準備は[ここ](http://blog.souya.biz/pinevillage/20160930/%e3%80%90bluemix%e3%80%91openwhisk%e3%81%a7cloudant%ef%bc%88%e3%82%a8%e3%83%87%e3%82%a3%e3%82%bf%e7%b7%a8%ef%bc%89-%e5%89%8d%e7%b7%a8/)を参考にしてみてください）

アクションは以下です．
_revは更新するDocumentの_rev，dbNameは更新するDatabaseの名前になります．

<pre><code>function main(params) {
	params._rev = "1-967a00dff5e02add41819138abb3284d"
	var message = {
					"dbName" : "openwhisk",
					"doc" : params
					}
	return message;
}
</code></pre>

これをCloudantのupdate documentアクションと繋げてシーケンスにします．
<img width="1034" alt="document_update.png" src="https://qiita-image-store.s3.amazonaws.com/0/149028/cd3afde5-95cb-ba06-41d1-5e8d37622805.png">

さらに先ほど作成したGitHubのpushのトリガーを繋げてルールにします．
<img width="331" alt="rule.png" src="https://qiita-image-store.s3.amazonaws.com/0/149028/8cc18cf6-8684-b1c8-9836-02fb41e14b25.png">

あとはリポジトリにpushするだけです．
<pre><code>$ vim test.txt
(適当に編集)
$ git add test.txt
$ git commit -a
$ git push origin master
</code></pre>

CloudantのDocumentを見てみると...
<img width="1280" alt="cloudant.png" src="https://qiita-image-store.s3.amazonaws.com/0/149028/1b9b37b4-0204-b5b5-d7c9-c30c79ae6f02.png">

<img width="1280" alt="cloudant2.png" src="https://qiita-image-store.s3.amazonaws.com/0/149028/21354a32-2662-7f09-9cde-a3807c008022.png">

ちゃんと更新されていますね！
pushの情報はGitHubも保持していると思いますが，こういった情報を統計解析だったりディープラーニングなどに応用できると良いです．

## issue_comment
今度はissue_commentをトリガーにしてみます．

基本的には先ほどと一緒で，eventsだけissue_commentに変えるだけです．
<img width="1007" alt="trigger_issue_comment.png" src="https://qiita-image-store.s3.amazonaws.com/0/149028/3228986b-3bdc-954b-3532-dd88c4d1ef98.png">

ルールの構成も先ほどと同じです〜
<img width="338" alt="rule2.png" src="https://qiita-image-store.s3.amazonaws.com/0/149028/05c4b54f-1f80-1b50-fca9-3289f520ab0f.png">

issueを適当に作ったり更新したりして，CloudantのDocumentを見てみると...
<img width="1280" alt="cloudant3.png" src="https://qiita-image-store.s3.amazonaws.com/0/149028/4e00d703-29e4-0c07-9d14-332a42a27ead.png">

<img width="1280" alt="cloudant4.png" src="https://qiita-image-store.s3.amazonaws.com/0/149028/683bca82-6cad-924e-de2d-808e9814d9a2.png">

issuenの内容が保存されています〜

# まとめ
GAになって変更になった点とGitHubとの連携について（やや手抜きで）書きました．

GitHubとの連携はSlackをうまく使えばより実用的になりますね．（issueのcommentをSlackに投げるなど）
また，今回はeventsを1種類しか指定せずにトリガーを作成しましたが，複数種類のeventsのトリガーも作成することができるので試してみてください．

OpenWhiskはこれからも連携できるサービスは増えると思うので楽しみですね！
快適なサーバーレス生活を送りましょう〜