新しいプルリクが上がったらGoogle Homeが教えてくれるやつ


この記事は[PORT Advent Calendar](https://qiita.com/advent-calendar/2017/port)16日目の記事です。

先日Google Homeをもらったので、何か画期的な事がしたかったのですが、なかなか思いつきません。大抵やり尽くされてるので・・・
なので今回は軽い内容でお茶を濁します。

# 概要

Github上で新しいPull Requestが上がったらGoogle Homeが喋って教えてくれる感じのやつ。
今回は簡易的にPull Requestだけを扱いますが、同様の方法でコメントやMergeの通知も可能です。

# 必要なもの

動かすためには最低限以下のものが必要です。適宜導入して下さい。

- 5.0以上のRails
- ngrok
- node.js

# APIサーバーの作成

Githubのイベントを受け取って処理するためのサーバーを作成します。今回はRailsのAPIモードで作成しました。

```
rails new github_google_home --api
```

適当にルーティング切ります

```rb:config/routes.rb
Rails.application.routes.draw do
  post 'events' => 'events#receive'
end
```

とりあえず空でいいので、ルーティングに対応したコントローラーとアクションも作っときます。

```rb:app/controllers/events_controller.rb
class EventsController < ApplicationController
  def receive
  end
end
```

ひとまずローカルでサーバーを起動させます。

```
rails s
```

また、ローカルホストだとGithubのhookイベントを受け取る事ができないので、ngrokを使ってネットワーク上に公開します。今回は本番環境を準備するのが面倒だったのでngrokを使いました。

```
ngrok http 3000
```

すると、以下のようなログが出力されるので、httpsの方のURLをメモっときます。

```
Forwarding                    http://80270e0f.ngrok.io -> localhost:3000
Forwarding                    https://80270e0f.ngrok.io -> localhost:3000
```

# Github側の準備

任意のリポジトリから、`Settings` -> `Webhooks`と遷移して、`Add Webhook`からWebhookを作成します。
`Payload URL`に先ほどメモったURLに`/events`を付与したURLを入力します。`Content type`をapplication/jsonにします。最後に、`Let me select individual events`から`Pull request`を選択して登録完了します。

![スクリーンショット 2017-12-17 20.44.16.png](https://qiita-image-store.s3.amazonaws.com/0/79302/b9cb83af-cd0f-b15d-c625-d819b53d0480.png)


# Google Homeに喋らせる設定

[google-home-notifier](https://github.com/noelportugal/google-home-notifier)を使います。以下のページを参考にさせてもらいました。

https://qiita.com/azipinsyan/items/db4606aaa51426ac8dac

`google-home-notifier`をリポジトリからクローンし、初期化します。

```
git clone https://github.com/noelportugal/google-home-notifier.git

cd google-home-notifier

npm i
```

`google-home-notifier/example.js`を編集します。
まず、Google HomeのIPアドレスを指定する必要があります。Google HomeのIPアドレスは、アプリの設定画面最下部からチェックする事ができます。

`example.js`の9行目でipにIPアドレスを指定します。

```js:example.js
var ip = 'ここにIPアドレス'; // default IP
```

日本語に対応させるための設定を行います。`var language = 'pl'`とある箇所を、`var language = 'ja'`に変更し、`googlehome.ip(ip, language);`の行の下に`googlehome.device(deviceName,language)`を追加します。二か所ずつあります。

```js:example.js
var language = 'ja'; // default language code
if (req.query.language) {
  language;
}

googlehome.ip(ip, language);
googlehome.device(deviceName,language)
```

上記の編集が終わったら、`google-home-notifier`を起動します。

```
node example.js
```

すると、以下のようなログな表示されるので、`https://5e2de285.ngrok.io/google-home-notifier`の部分をメモります。このURLがgoogle-home-notifierのエンドポイントになります。

```
Endpoints:
    http://192.168.0.3:8091/google-home-notifier
    https://5e2de285.ngrok.io/google-home-notifier
```

最後に、先ほど作成したRailsサーバーのアクションを編集します。5行目の`URI.parse`に渡してるURLに先ほどメモったgoogle-home-notifierのエンドポイントを指定します。

```rb:app/controllers/events_controller.rb
require 'net/http'
class EventsController < ApplicationController
  def receive
    if params['pull_request']['state'] == 'open'
      res = Net::HTTP.post_form(URI.parse('https://5e2de285.ngrok.io/google-home-notifier'), {'text' => '新しいプルリクエストが作成されました'})
    end
  end
end
```

# 動作検証・まとめ

後はプルリクを作れば、Google Homeが喋って知らせてくれます。

今回は本番環境を準備するのが面倒だったのでngrokを使いましたが、実際に運用させる場合はheroku等で簡易的な本番環境作れば良さそうです。
slackとかメールとかの通知だと見落とす事もあるので、意外と実用性あるかもしれません。あと職場で使えば和むかも(Google Homeである必要性ないですが・・・)。


最後になりますが、PORT株式会社では[自社サービスを支えてくれる優秀なRubyエンジニアを募集しています](https://www.wantedly.com/companies/port/projects)(Rubyエンジニア以外も)。
もくもく会も行なっていますので、ぜひ一緒にもくもくしましょう！
[PORTもくもく会](https://freestyle-mokumoku.connpass.com/)