GitHubのWikiの変更をHubot経由でSlackに通知

Pocket
LINEで送る

シェル芸勉強会の次の日でかなり疲れているのですが、「GitHubのWikiを複数人で編集し、その変更をSlackに飛ばしたい」というニッチな需要ができたので工作活動してました。Slackの標準の機能には、GitHubのWikiの更新を受け取る手段が2016年2月14日現在、無いようです。(あったらすぐ教えてください!30分くらい探してSlack側に受け口が見つからなくてキレてやっちまいました。)issueやpullリクエストの通知機能はあるんですが・・・。

ということで、HubotにGitHubからJSONを飛ばして、Hubotで解釈してSlackに飛ばすことにしました。Hubotについては、次のサイトを参考にインストールを行いました。環境はVPSのUbuntu 14.04上です。

チャットボットでチーム開発効率化入門(1):GitHub製フレームワークHubotの概要とインストール、チャットアプリと連携する基本的な使い方 (1/2) – @IT チャットボットでチーム開発効率化入門(1):GitHub製フレームワークHubotの概要とインストール、チャットアプリと連携する基本的な使い方 (1/2) - @IT
CentOSにHubotを導入してSlackと連携させる – Qiita CentOSにHubotを導入してSlackと連携させる - Qiita

また、CoffeeScriptを書いた時はHubot経由でGitHubのイベントを通知する | SPACEMARKET BLOGを参考にさせていただきました。掲載されているコード(GitHubのissue等をTwitterに飛ばすもの)を、GitHubのwikiをslackに飛ばすように改造しました。

以下はちょっと端折ってますが手順です。

Hubotを召喚する

必要なものを上のサイトを参考にインストール後、適当なディレクトリ(自分の場合は~/HUBOT/GITHUB)を作り、その下で次のコマンドを打ちます。

yo hubot

すると、こんな感じで根掘り葉掘り聞かれます。AAがアホっぽいです。いや、なんでもありません。

$ yo hubot
                     _____________________________  
                    /                             \ 
   //\              |      Extracting input for    |
  ////\    _____    |   self-replication process   |
 //////\  /_____\   \                             / 
 ======= |[^_/\_]|   /----------------------------  
  |   | _|___@@__|__                                
  +===+/  ///     \_\                               
   | |_\ /// HUBOT/\\                             
   |___/\//      /  \\                            
         \      /   +---+                            
          \____/    |   |                            
           | //|    +===+                            
            \//      |xx|                            

? Owner Ryuichi UEDA <aho@gmail.com>
? Bot name github
? Description A simple notifier for GitHub wiki
? Bot adapter (campfire) slack

間違えてはいけないのは

? Bot adapter (campfire) slack

の一箇所です。

hubotの起動スクリプトを作る

ディレクトリの下のbin/hubotがHubotの起動シェルスクリプトです。これを次のように書き換えます。PORTは、HubotがGitHubからデータを受け取るときに使うポート番号です。

このスクリプトは最後のforeverでサーバに常駐化します。常駐化するとデバッグで止めたり動かしたりするのが面倒なので、
デバッグの時はコメントアウトしている#exec…を使うと良いでしょう。こっちを使うとCtrl+cで止まります。

各種設定

上のスクリプトで次のようになっているところは、自分の環境に合わせて書き換える必要があります。

export HUBOT_SLACK_TOKEN=xxxxxx
export HUBOT_GITHUB_SECRET=yyyyyyy

HUBOT_SLACK_TOKENはSlackのHubotの設定ページに、次のようにトークンが表示されているはずなので、これをコピペして使います。

1455450034

HUBOT_GITHUB_SECRETは、GitHubの連携したいリポジトリのWebhookの設定で、「Add webhook」を押すと、次のように表示されるので、ここの「Secret」に適当なトークンを入れて使います。

1455450001

私は次のような感じで作りました。

$ cat /etc/* | md5sum 2> /dev/null
b720a34fb302c401e5146cefe1ae656d  -

Secretの二つ上にある「Payload URL」は、http://:<ポート番号>/github/webhookにしておきます。このURLの「github」というのはHubotの名前です。

また、リポジトリのどんな変化に対して通知を受け取るかは、「Which events would you like to trigger this webhook?」という項でいじります。「Gollum」というのがWiki関係の通知に相当します。

Hubotスクリプト

こんな風に書きました。Hubotのディレクトリ下のscriptsディレクトリに<なんとかかんとか>.coffeeという名前で置いておくと、bin/hubotを実行すると動き出します。isCorrectSignatureの部分は上に挙げた3番目のブログのコードを整形して使い回しています。

次の部分(19行目)がSlackにデータを投げている部分です。「lab-github」というのは、Slackのチャンネルですので、用途に合わせて変更しましょう。毎度ハードコーティングで申し訳なく・・・

robot.messageRoom 'lab-github', message

スクリプト自体はパースされたJSONのデータを切った貼ったしているだけなので、なんとなく分かる人なら、どんどんいじっていけると思います。GitHubが送ってくるJSONの実物は、さっきのGitHubのリポジトリwebhook設定ページにあります。

Slackには、次のように通知が入ります。(ちょっとデバッグ中のメッセージもありますが。)

スクリーンショット 2016-02-14 21.44.46

表示される情報がURLだけで味気ないので、もうちょっと改良の余地あり。いや、これくらいの方がかえっていいのかも・・・。

寝る。

Pocket
LINEで送る