ただの適当な開発記

会社勤めしつつUnityでアプリ作ってる人の雑記

Sinatra+Herokuでgithubのwebhookレシーバをつくる

久しぶりにunity以外の内容です
githubでプルリクエストをマージした際にそのイベントを取得してどうこうやりたかったので、書いてみた
一番最初はgoogle app scriptのdoPostをつかってレシーバにしようと思ったけど、これがどうにもうまくいかない..
しょうがないのでherokuサーバーを立ててそこで取得することに

今回は簡易的なものでいいやということでRuby on RailsではなくSinatraで書くことにしました

Heroku上でRubyを動かす手順は公式ページ通りにやればOK

devcenter.heroku.com

Deploy your application to Heroku

ここの手順までやればOK

上記ページ通りにやると次のようなコードを書いてあると思いますが、これを書き換えます

require 'sinatra'

get '/' do
  "Hello, world"
end

今回はただgetで叩くだけではなく、post通信で送られてきた情報をつかってどうこうしたいので、

require 'sinatra'

get '/' do
  "Hello, world"
end

post '/notify_merged' do
  #何かする
  "post result"
end

こんな感じでpostの受け口を書く。

受け口が出来たらgithubのwebhookに登録する。

githubでsettings -> Webhooks -> Add webhookを選ぶ

f:id:cocokyoro:20161123180633p:plain

PayloadURLには「herokuのurl+postのパス」を記載
上の例でいうと https://それぞれで違う.herokuapp.com/notify_merged
という感じ

次はwebhookのトリガーの設定。
今回はプルリクエストに関するイベントだけを受け取りたいので次のように設定

f:id:cocokyoro:20161123181344p:plain

これでプルリクエストに関連する動作があるたびにイベントが送られます。

では先程のコードの方に戻ってプルリクのイベントを受け取ったあとの処理を書きます。

プルリクエストのタイミングでgithubからは以下のような情報が送られてきます。
Event Types & Payloads | GitHub Developer Guide

今回はマージリクエストのタイトルとコメントをとってきたいので、こんな感じ

require 'sinatra'

get '/' do
  "Hello, world"
end

post '/notify_merged' do
    body = request.body.read
 
   if body == ''
      status 400
    else
      parsed = JSON.parse(body)
      merge_info = parsed['pull_request']
      action = parsed['action']
      merged = merge_info['merged']
      #今回はクローズしてかつmergeされたプルリクの情報を拾う
      if(action == 'closed' && merged)
        title = merge_info['title']
        comment = merge_info['body']
        var response = "タイトル:"+title +"/コメント:" + comment
        #responseを使って何かするときはここで
        response
      end
    end
  end

これをherokuにpushしたあとに実際にプルリク投げて取り込んでみると..

f:id:cocokyoro:20161123221407p:plain

こんな感じでレスポンス返ってきます

以上!

広告を非表示にする