開発者ブログ by playground

playgroundの技術系ブログ

GithubのIssue、PRを快適にするgemを作りました!

自己紹介

初めまして、playgroundエンジニアの海老沼です。

サーバーサイド(主にRails)やiOSアプリ開発に興味があり、大学に通いながら4ヶ月ほど前からplaygroundで働かせていただいてます。

趣味はテニスと映画鑑賞です。最近はWALKING DEAD観てます。

github.com


gemを作りました!

概要

railsに組み込んでサーバーにあげると、githubのwebhookを受け取って色々処理してくれるgemです。

ベースとなるpghub-baseと、機能別にpghub-lgtmpghub-issue_titleを作りました。

pghub-base

webhookで送られてきたデータを元にapiを叩いたりするなど、共通の処理を記述してあります。

pghub-lgtm

PRをreviewするとき最後にLGTM画像を貼っているのですが、いちいち画像を探して貼り付けるのめんどくさいなーと思っていました。

そこで、自動化してみました。コメントにLGTMという文字があれば、ランダムでLGTM画像を探してきて投稿してくれます!

こんな感じ。

f:id:playground-live:20171016153412p:plain

完全にランダムなので結構面白いです。 たまによくわからないのもありますが

pghub-issue_title

開発のタスク管理にGithubのissueを使っているのですが、issueにref issue(PR)のURLみたいな感じで参照したいissueとかPRのURLを貼ることが結構あります。

でもこれって、URLを貼っただけじゃそのURLに飛んだ先がどんな内容かわからないですよね。

なのでこれも自動化してみました。

ref URLと書くだけで自動でそのissueやPRのタイトルを投稿してくれるように!

こんな感じ。

f:id:playground-live:20171016155917p:plain

同じリポジトリのissue/PRだと#4とかになってしまいますが、それにも対応しています

f:id:playground-live:20171016155953p:plain

簡単に概要を確認できるので便利ですね。

導入方法

めっちゃ簡単です。

1. gemを入れる

rails new 適当な名前して、Gemfileに使いたいgemを書く

# LGTM機能を使いたい場合
gem "pghub-lgtm", "~> 1.0.0"

# Issueのタイトル投稿機能を使いたい場合
gem "pghub-issue_title", "~> 1.0.0"

# 両方
gem "pghub-lgtm", "~> 1.0.0"
gem "pghub-issue_title", "~> 1.0.0"

bundleする

2. ルーティングに追加する

routes.rbにマウントする

Rails.application.routes.draw do
  .
  .
  .
  # パスの部分に適当なパスを指定
  # (例) /github_webhooks とか
  # 既に追加されてるルーティングと違うパスになるように指定してください

  mount Pghub::Base::Engine => 'パス'
end

railsエンジンを使ってマウントする方法についてはrailsガイドで詳しく説明されています。

railsguides.jp

3. 投稿するユーザーのaccess tokenを取得する

Github を開いて、SettingsDeveloper settingsPersonal Access TokensGenerate new token

以下のように設定してトークン作成

f:id:playground-live:20171016152058p:plain

作成できたトークンをメモしておく

4. railsの設定

config/initializers以下にpghub.rbを作成する

以下のように、org名とトークンを指定する

Pghub.configure do |config|
  config.github_organization = "Githubのorganization(or user)名"
  config.github_access_token = "2で作成したトークン"
end
注意

githubにコードをアップする場合は、dotenv-railsとかを使ってアクセストークンを公開しないようにしてください。

5. 作ったrailsアプリをサーバーに上げる

herokuでもAWSでもなんでもOKです

herokuならこのあたりのサイトを参考にするといいと思います

6. github側でwebhookを設定する

issueかPRのメニュー右端のsettingswebhookAdd webhook

アドレスとか色々指定してwebhookを追加する

f:id:playground-live:20171016155135p:plain

7. 完了!

機能を試してみてください!


仕様について

  • pghub-baseというgemがあり、pghub-baseかpghub-issue_titleをインストールすると依存してインストールされるようになっています。
  • 基本的にuserもしくはorganizationでの利用を想定しているので、それ以外のリポジトリの情報を取得、投稿することはできません。
  • Railsエンジンを利用して組み込むので、Rails以外(sinatraとか)では使えません。

pghub-base

faradayGithubAPIを叩いています

github.com

pghub-lgtm

LGTM.in というサイトからLGTM画像を取っています

LGTM.in » Home

https://lgtm.in/g にアクセスするとランダム画像を表示してくれるので、そこからスクレイピングで取ってきています。

このサイトを利用したもので、LGTMのリンクを生成してくれるChrome拡張とかもありますが、やっぱり自動化の方が楽ですよね。

スクレイピングにはmechanizeを利用しました。

github.com

バグとか改善案とかあれば、こちらからissue作成をお願いします!


今回初めてgemを作ったのですが、結構簡単にリリースまで行けてびっくりしました。特異メソッドとかrubyディレクトリ構造とか知識でしか知らなかった部分を実際に実装したので凄く良い勉強になりました。

rubyの知識を深めたい人は、一度gemを作ってみるといいと思います!

最後まで読んでいただきありがとうございました!