✍️blog

技術系のこととか

GitBucketでプルリクのコメントデータを取得したい

仕事では顧客の環境に合わせてGitHub、Bitbucket、GitLabを使用することが多いのですが、

エンタープライズな世界ではクローズドな環境でソースを管理したいという顧客もそこそこいるわけで

そういった顧客の時にはGitBucketというオープンソースGitHubクローンをオンプレ環境に立てて使用しています。

gitbucket.github.io

コードレビューはプルリクエストの中で行うので、どれぐらいの指摘件数なのか、レビュー指摘がどんな内容だったかなどなど

分析のための情報を収集するためにはプルリクエストからコメントを抜き出す必要があります。

GitHubではAPIが用意されているのでそれを叩けばデータを取り出すことができます。

そして、GitBucketはGitHub互換のAPIを持っていますが、しかし...残念なことになっています。(v.4.38.4時点)

# プルリクの情報を取得
curl  -u root:root http://localhost:8080/api/v3/repos/Sample/gitbucket/pulls/1

{
    "number": 1,
    "state": "open",
...
    "commits_url": "http://localhost:8080/api/v3/repos/Sample/gitbucket/pulls/1/commits",
    "review_comments_url": "http://localhost:8080/api/v3/repos/Sample/gitbucket/pulls/1/comments",
    "review_comment_url": "http://localhost:8080/api/v3/repos/Sample/gitbucket/pulls/comments/{number}",
    "comments_url": "http://localhost:8080/api/v3/repos/Sample/gitbucket/issues/1/comments",
    "statuses_url": "http://localhost:8080/api/v3/repos/Sample/gitbucket/statuses/521404025752dd9b120e5e16a292015ff731e19e"
}

review_comments_urlがコメントを取得するためのエンドポイントです。

GitBucketのWikiには記載されていませんが、レビューコメントの一覧が取得できそうと思いきや...

curl  -u root:root http://localhost:8080/api/v3/repos/Sample/gitbucket/pulls/1/comments

{"message":"Not Found"}

はい、サポートしてないみたいです。。。

1. すべてのデータをエクスポートする

GitBucketのデータベースをMySQLにして利用している場合は、そのままデータベースの中身をdumpしてしまえばよいですが

GitBucketはデフォルトでH2をデータベースとして利用しているので、GitBucketが稼働した状態でデータを取り出すことはできません。(たぶん、H2は複数のクライアントから接続できないはず)

まあそもそも、H2のまま使うのは微妙でしょという話はありますけどね。。。

GitBucketにはデータをエクスポートする仕組みが備わっています。

Admin権限のユーザーでシステム設定を開くとこんな画面が表示され、ここからエクスポートが可能です。

大量のINSERT文が並んだSQLファイルがDLできます。

DDLなしでDumpしたような感じでしょうか。

2. 適当なDBに取り込む

エクスポートしたデータのままでは集計も分析もできないので、適当なDBに入れてSQLで取り出せるようにします。

Dockerを使うなり野良のDB?を見つけて来るなりしてDBを用意します。そのDBに接続した状態のGitBucketを新しく起動させます。

こうすることでDBにテーブル定義をGitBucketに作ってもらいます。

あとは先ほどエクスポートしたSQLをDBに流し込めば完了です。

あとはSQLを駆使してコメントデータを取りだせます。。

テーブル名からあたりをつけながらJSOINしていけばそれらしいデータが取得できます。

そもそも

端からH2じゃないDBを使うべきですね。

GitBucketのセットアップが簡単すぎて甘えてしまうんですよね。。。

それにH2だとしてもエクスポートとかする前にGitBucketが動いているサーバーに入り込んで、

H2のDBファイルをコピーすればよかっただけでは...気づかなかったことにしようw

via GIPHY