この記事はPORT Advent Calendar16日目の記事です。

先日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

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

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

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

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

Google Homeに喋らせる設定

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アドレスを指定します。

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

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

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のエンドポイントを指定します。

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エンジニアを募集しています(Rubyエンジニア以外も)。
もくもく会も行なっていますので、ぜひ一緒にもくもくしましょう!
PORTもくもく会