Travis CI + Zapierでbuild結果をTwitterに投稿しようとしたけど失敗した話

# TL;DR
TravisCIの結果をTwitterに投げるなら自分でherokuにwebappを立てるのが早い



# はじめに
Travis CIはbuild結果を色々なものに対して通知することが出来ます。

[Configuring Build Notifications](http://docs.travis-ci.com/user/notifications/)
- メール
- IRC
- Slack
などなど....

しかし、build結果をTwitterアカウントを使って投稿するというものはありません。
必要かどうか、というのは置いといて試してみたくなったのでやってみます。

# Webhookを使用する
上記のリストにない場合の通知にはwebhookを利用することが出来ます。

[Webhook notification](http://docs.travis-ci.com/user/notifications/#Webhook-notification)

.travis.ymlに

```

notifications:
  webhooks: http://your-domain.com/notifications

```
というように、webhookのurlを書くことで、build終了時にこのurlを叩いてくれます。
複数のURLを定義することも可能ですし、成功時のみとか失敗時のみ、buildのスタート時など結構柔軟に設定できます。
これを利用して、自分でwebhook先にアプリを置いて、叩かれたらTwitterに投稿するというものを作れば良さそうです。


# Zapier
が、これだけのためにわざわざwebアプリを作るのも面倒です。
そこでwebhookをtriggerにして、Twitterに投稿してくれるサービスを利用します。
それがZapierです。

https://zapier.com/

ZapierはIFTTTのようなもので、色々なwebサービスなどを組み合わせて一つのジョブ（タスク）を作ること出来ます。
無料アカウントではタスクの数が結構厳しかったりするのが難点ですがとりあえず試してみます。

まず、Webhookを作成し、向き先にTwitterを選択します。
![スクリーンショット 2015-01-05 0.16.29.png](https://qiita-image-store.s3.amazonaws.com/0/2341/6410a263-0849-f538-959a-a228d9af2e3a.png)


ZaiperからwebhookのURLが与えられるので、これをコピーしておきます。

https://zapier.com/hooks/catch/ほげほげ/

次に一度travisにwebhook urlを叩いてもらって、送られてくるpayloadをzaiperが利用出来るようにします。
.travis.ymlに


```

notifications:
  webhooks: https://zapier.com/hooks/catch/ほげほげ/

```
と書いて、一度Pushしてbuildしてもらっておきます。



次に投稿するTwitterアカウントを設定します。
何かTravis用の適当なサブアカウントを利用するほうがいいかもしれません。

![スクリーンショット 2015-01-05 0.18.07.png](https://qiita-image-store.s3.amazonaws.com/0/2341/b5a06911-4988-5a6e-d58e-7263a0a2a877.png)


`Filter  Web Hook triggers` は使わないのでデフォルトのまま。


`Match up  Web Hook Hook to  Twitter Tweet `ではTwitterに投稿する文言を設定します。
先ほど一度travisがwebhookを叩いてるので、Zapierがpayloadの中身を利用することが出来るようになっているはずです。

送られてくるpayloadは以下のような形式なのでこれらを利用して自分がわかりやすいようなtweetにします。

https://gist.github.com/roidrage/9272064#file-gistfile1-json

![スクリーンショット 2015-01-05 0.23.45.png](https://qiita-image-store.s3.amazonaws.com/0/2341/d7a85e35-0c33-efa4-51f5-14ac74b51409.png)

```

@dmnlk  gomadare #21 build result is Passed  see zpr.io/qQ4P

```

みたいな文言がサブ垢から投げられるようになりますね。


あとは適当にtestをして、名前をつけて保存するだけです。
これからはbuild毎に結果をTweetで知らせてくれます。
無料アカウントではタスクの制限があるので、失敗時、復帰時のみくらいにしておくのがベターだとは思います。



# WebhookURLを暗号化→失敗
しかしここで問題があります。
Webhook URLをtravis.ymlに書いてしまっているので、誰にでもURLが見られてしまいます。
ZapierのWebhookURLは認証というものがないのでイタズラでURLを直叩きすればTwitterに投稿できてしまいます。（実際はpayloadで利用している中身がなくてduplicateになったりする）

travisにはベタ書きしたくない文字列を暗号化してくれる機能があるのでそれを利用します。
コンソール上で
`travis encrypt WEBHOOK_URL=https://zapier.com/hooks/catch/ほげほげ/ `
と打って標準出力にでた文字列をtravis.ymlに書いてあげます。

```yaml:.travis.yml
〜省略〜
notifications:
  webhooks: $WEBHOOK_URL
env:
  global:
    secure: "r1fabKVgw5Ln/WSmA9L+iMdF1FKxB4sRU//EC+LuFRkj/oHVHRT1vsGAHi8S0AyjPLaz8qp7LYZ7Xg1GpeHuOdMRl+6yWdpkJafKP3GVGvS/F2Fm8u4k3JJ4Kc5dnaxdyV6xI3MnbJIdf9wYaFhd5YzpYFN+jQTrnyDE="

```


これでいいはずなのですが...........

travisがwebhookを叩いてくれないという現象に見舞われてしまい頓挫しました。
実際に文字列を復号化してechoしてみると、きちんとwebhookのURLが取り出せているのですが、どうもそれを使ってもnotificationでは叩いてくれないようです。


# おとなしく自分で立てましょう

結局自分でherokuあたりに立てるのがお勧めです。きちんと認証プロセスもありますし。
以下のリポジトリをherokuにたてて環境変数にTwitterのアクセストークンなどなど設定すれば勝手にうまいことやってくれそうです。
https://github.com/arukoh/Hooker