bitbucket で hook の response body で返ってくるJSON形成で嵌った。
自分だけ再現するなら致し方無い。
他の人もこれで嵌っていたなら参考にどうぞ
はじめに
個人でPrivateで使っているbitbucketで、意味は無いがcommitしたらircにlogを流すようにしたかった。
設定
⇒ フック
⇒ POST
から POSTしたいURLを入力する
自分は個人VPSにpostsるようにした
ex) http://bitbucket-hooks.localhost.com
こんな感じ。
nginx
個人のVPSのWebサーバーにnginx
を使用してるので下記のように設定した。
upstream bitbucket-hooks { server localhost:4567; } server { listen 80; server_name bitbucket-hooks.localhost.com; access_log /var/log/nginx/bitbucket-hooks.access.log; error_log /var/log/nginx/bitbucket-hooks.error.log; root /var/www/html; location ~ .*\.(gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|ico|ICO|html) { satisfy any; index index.html break; } location / { proxy_pass http://bitbucket-hooks; break; } }
sinatra
こんな感じでresponaseが返ってくるみたいなので、
適当に sinatra
で Appサーバーを立ててみた
require 'sinatra' require 'json' post '/' do puts JSON.parse(request.body.read) end
responseのbodyをparseするのにも嵌りつつ こんな感じで立ててみたが 上手くparseできない。
嵌った
?? ってなりながら
resposen body を見てみると
payload=%7B%22repository%22%3A+%7B%22website%22%3A+%22%22%2C+%22fork%22%3A+false%2C+%22name%22%3A+%22test-hooks%22%2C+%22scm%22%3A+%22git%22%2C+%22owner%22%3A+%22Konboi%22%2C+%22absolute_url%22%3A+%22%2FKonboi%2Ftest-hooks%2F%22%2C+%22slug%22%3A+%22test-hooks%22%2C+%22is_private%22%3A+false%7D%2C+%22truncated%22%3A+false%2C+%22commits%22%3A+%5B%7B%22node%22%3A+%22784e5c9f97d6%22%2C+%22files%22%3A+%5B%7B%22type%22%3A+%22modified%22%2C+%22file%22%3A+%22app.rb%22%7D%5D%2C+%22raw_author%22%3A+%22Konboi+%3Cryosuke.yabuki%40gmail.com%3E%22%2C+%22utctimestamp%22%3A+%222014-06-08+12%3A56%3A17%2B00%3A00%22%2C+%22author%22%3A+%22Konboi%22%2C+%22timestamp%22%3A+%222014-06-08+14%3A56%3A17%22%2C+%22raw_node%22%3A+%22784e5c9f97d66a88366d45e04d46978202c2c0be%22%2C+%22parents%22%3A+%5B%22010fa6278de4%22%5D%2C+%22branch%22%3A+%22master%22%2C+%22message%22%3A+%22test+code%5Cn%22%2C+%22revision%22%3A+null%2C+%22size%22%3A+-1%7D%5D%2C+%22canon_url%22%3A+%22https%3A%2F%2Fbitbucket.org%22%2C+%22user%22%3A+%22Konboi%22%7D
どうやらURIエスケープされているらしいことがわかった。
puts URI.unescape(body)
URI unescapseしてみると…
payload={"repository":+{"website":+"",+"fork":+false,+"name":+"test-hooks",+"scm":+"git",+"owner":+"Konboi",+"absolute_url":+"/Konboi/test-hooks/",+"slug":+"test-hooks",+"is_private":+false},+"truncated":+false,+"commits":+[{"node":+"784e5c9f97d6",+"files":+[{"type":+"modified",+"file":+"app.rb"}],+"raw_author":+"Konboi+<ryosuke.yabuki@gmail.com>",+"utctimestamp":+"2014-06-08+12:56:17+00:00",+"author":+"Konboi",+"timestamp":+"2014-06-08+14:56:17",+"raw_node":+"784e5c9f97d66a88366d45e04d46978202c2c0be",+"parents":+["010fa6278de4"],+"branch":+"master",+"message":+"test+code\n",+"revision":+null,+"size":+-1}],+"canon_url":+"https://bitbucket.org",+"user":+"Konboi"}
JSONっぽいけど +
が入ってて上手くparseできないし、 payload=
とかついてそもそもJSON??って感じでどうしようかなと思いつつ
とりあえず エイって
body = URI.unescape(body).delete("+").gsub("payload=","")
ってしてみた。
そしてparseしてみると
body = URI.unescape(body).delete("+").gsub("payload=","") puts body
{"repository":{"website":"","fork":false,"name":"test-hooks","scm":"git","owner":"Konboi","absolute_url":"/Konboi/test-hooks/","slug":"test-hooks","is_private":false},"truncated":false,"commits":[{"node":"784e5c9f97d6","files":[{"type":"modified","file":"app.rb"}],"raw_aut hor":"Konboi<ryosuke.yabuki@gmail.com>","utctimestamp":"2014-06-0812:56:1700:00","author":"Konboi","timestamp":"2014-06-0814:56:17","raw_node":"784e5c9f97d66a88366d45e04d46978202c2c0be","parents":["010fa6278de4"],"branch":"master","message":"testcode\n","revision":null,"si ze":-1}],"canon_url":"https://bitbucket.org","user":"Konboi"}
puts json["user"]
Konboi
やっと使えそう。 ただ、timestampの+
も消えちゃってる。
しかも
- ユーザー名
- レポジトリ
- コメント
とかに +
が入ってたらそれも消えてしまうので、いい感じに取り除きたい。
まとめ
- 嵌った
- もう少し上手く整形したい
- とりあえずdocumentと違うのでissueだしておこう。
- 作者: 松下雅和,船ヶ山慶,平木聡,土橋林太郎,三上丈晴
- 出版社/メーカー: シーアンドアール研究所
- 発売日: 2014/04/09
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (4件) を見る