読者です 読者をやめる 読者になる 読者になる

@Konboi memo

主に技術に関してつらつらと。

bitbucket で hook の response body で返ってくるJSON形成で嵌った。

git sinatra bitbucket

自分だけ再現するなら致し方無い。

他の人もこれで嵌っていたなら参考にどうぞ

はじめに

個人でPrivateで使っているbitbucketで、意味は無いがcommitしたらircにlogを流すようにしたかった。

設定フックPOST から POSTしたいURLを入力する

post

自分は個人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だしておこう。

開発効率をUPする Git逆引き入門

開発効率をUPする Git逆引き入門

  • 作者: 松下雅和,船ヶ山慶,平木聡,土橋林太郎,三上丈晴
  • 出版社/メーカー: シーアンドアール研究所
  • 発売日: 2014/04/09
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (4件) を見る