はじめに
チーム開発をしていて、レビュアーが足りなくて、レビュー待ちが発生することがあります。
そこで、レビュアーを増やすために、hubotにレビュアーを抽選&アサインさせてみようと思います。
せっかくなので、普通に動かすのではなくて、dockerでローカルでもクラウド(heroku
)でも同じように動かします。
今回は、ローカル編です。
さっさと動かしてみたい人は、こちらのリポジトリを参照ください。
https://github.com/imunew/hubot-github-reviewer-lotto
レビュアー抽選のアイデアは、下記のスライドが元ネタになっています。
- Hubotレビュアーおみくじ @ githubkaigi // Speaker Deck
- sakatam/hubot-reviewer-lotto: A reviewer lottery script for Hubot
事前準備
- docker community edition のインストール
セットアップ
Slackチームにhubotを導入
Hubot Integration を追加
- https://slack.com/apps/A0F7XDU93-hubot にアクセス
- 任意のチームにサインイン(URLのサブドメインを確認)
https://{your team}.slack.com
-
Add configuration
ボタンをクリック -
Username
にHubotの名前を入力 -
Add Hubot Integration
ボタンをクリック -
API Token
をコピーしておく(後で環境変数にセットする) -
Save Integration
ボタンをクリック
Hubot を任意のチャンネルに追加
imunew/hubot-github-reviewer-lotto を clone
$ git clone git@github.com:imunew/hubot-github-reviewer-lotto.git
環境変数をセット
$ cd /path/to/repository
$ cp hubot/.env.example hubot/.env
$ vi hubot/.env
github 関連
こちらを参考に、下記の環境変数をセットします。
- HUBOT_GITHUB_TOKEN
- HUBOT_GITHUB_ORG
- HUBOT_GITHUB_REVIEWER_TEAM
- HUBOT_GITHUB_WITH_AVATAR
Slack 関連
こちらを参考に、下記の環境変数をセットします。
- HUBOT_SLACK_TOKEN
前述のHubot Integration
を追加したときに、コピーしておいたAPI Token
をセットします。
Redis 関連
今回は、docker-composeでredisコンテナと連携する関係で、下記のとおり設定します。
REDIS_URL=redis://redis:6379
その他、詳細は、こちらを参照ください。
Dockerコンテナのビルドと起動
$ docker-compose build --no-cache
$ docker-compose up -d
レビュアーを抽選してみる
hubotを追加したSlackチャンネルにて、下記のようにコマンドを入力します。
{bot name} reviewer for {repository name} {PR Number}
コマンドを入力すると、
hubotから下記のように通知が返ってきます。
実際、githubで確認すると、Pull-Request
のReviewers
に通知されたユーザーが追加されています。
Docker化する上でハマったポイント
root
権限を持ったユーザーでyo hubot
するとエラーになる
Dockerはデフォルトだと、rootユーザーで操作しますが、rootユーザーだと、yo hubot
したときに、下記のようにエラーが発生します。
Error: EACCES, permission denied '/root/.config/configstore/insight-yo.json'
You don't have access to this file.
これは、既知の問題で、回避するには、一般ユーザーを作成、切り替えてから実行する方法が紹介されています。
https://github.com/yeoman/yo/issues/348
今回は、下記のようにして、ユーザーを切り替えるようにしました。
# hubot/Dockerfile
FROM node:4.8
RUN npm install -g yo generator-hubot
RUN npm install hubot-slack --save
RUN npm install underscore async github@8.2.1 weighted --save
RUN useradd hubot -m
USER hubot
WORKDIR /home/hubot
# Create hubot
RUN yo hubot --defaults --adapter slack
ADD ./external-scripts.json /home/hubot/external-scripts.json
ADD ./scripts/reviewer-lotto.coffee /home/hubot/scripts/reviewer-lotto.coffee
CMD bin/hubot --adapter slack
レビュアー抽選スクリプトを改造
前述しましたが、このスクリプトは元ネタがあって、はじめは、npm i --save hubot-reviewer-lotto
でインストールして終わりかなと思っていたのですが、Pull-Request
のReviewers
ではなく、Assignees
に追加されるので、そこだけ変更して、カスタムスクリプトとして、使うことにしました。
ちなみに、githubにReviewers
が追加されたのは、2016年の12月頃です。
Assignees
からReviewers
に変更したポイントについて、まとめます。
詳しくは、下記のPRを参照ください。
https://github.com/sakatam/hubot-reviewer-lotto/pull/16
node-github をアップグレード
githubのReview Requests APIを使うために、結果的にgithub@v8.2.1
までバージョンアップしました。
node-github の仕様変更に対応
github@v5.0.0
で、パラメータuser
がowner
に名前が変わったので、対応しました。
Assignees
からReviewers
に変更
issues.edit
をpullRequests.createReviewRequest
を使うように変更しました。
おわりに
Docker化してみて良かったと思うことは、ローカルで動かすだけでもいくつかありました。
- 環境ごとパッケージになっているので、それぞれで環境構築しないで済む
- 引き継ぎやすい?
-
yo hubot
で自動生成されたコードを管理しないで済んだ- 管理するのは、
scripts/
配下のファイルのみ
- 管理するのは、
せっかくDockerで作った環境をできれば、そのままコンテナとしてデプロイしたいがどうするか、ということでクラウド(heroku
)編に続きます。
ではでは。