LoginSignup
4
7

More than 5 years have passed since last update.

hubotをdockerで動かしてみる(ローカル編)

Posted at

はじめに

チーム開発をしていて、レビュアーが足りなくて、レビュー待ちが発生することがあります。
そこで、レビュアーを増やすために、hubotにレビュアーを抽選&アサインさせてみようと思います。
せっかくなので、普通に動かすのではなくて、dockerでローカルでもクラウド(heroku)でも同じように動かします。
今回は、ローカル編です。

さっさと動かしてみたい人は、こちらのリポジトリを参照ください。
https://github.com/imunew/hubot-github-reviewer-lotto

レビュアー抽選のアイデアは、下記のスライドが元ネタになっています。

事前準備

セットアップ

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 を任意のチャンネルに追加

追加されると、こんな感じで通知されます。
join_bot.png

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}

コマンドを入力すると、

request_reviewer.png

hubotから下記のように通知が返ってきます。

reviewer_lotto.png

実際、githubで確認すると、Pull-RequestReviewersに通知されたユーザーが追加されています。

github_reviewers.png

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-RequestReviewersではなく、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で、パラメータuserownerに名前が変わったので、対応しました。

AssigneesからReviewersに変更

issues.editpullRequests.createReviewRequestを使うように変更しました。

おわりに

Docker化してみて良かったと思うことは、ローカルで動かすだけでもいくつかありました。

  • 環境ごとパッケージになっているので、それぞれで環境構築しないで済む
    • 引き継ぎやすい?
  • yo hubotで自動生成されたコードを管理しないで済んだ
    • 管理するのは、scripts/配下のファイルのみ

せっかくDockerで作った環境をできれば、そのままコンテナとしてデプロイしたいがどうするか、ということでクラウド(heroku)編に続きます。

ではでは。

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7