DUICUO

Gitbase: SQL を使用して Git リポジトリを探索する

Gitはコードバージョン管理の事実上の標準となっています。Gitは非常に普及していますが、ソースコードリポジトリの履歴と内容を詳細に分析するためにGitを使用するのは、依然として複雑な作業です。

一方、SQL は大規模なコードベースのクエリに適した実績のある言語であり、Spark や BigQuery などのプロジェクトではクエリ言語として SQL が使用されています。

そのため、source{d} では、これら 2 つのテクノロジを自然に組み合わせて、SQL を使用して Git リポジトリの大規模な分析を実行する「コードとしてのデータ」ソリューションである Gitbase を作成しました。

Gitbaseは、巨人たちの支援によって開発が実現した完全なオープンソースプロジェクトです。この記事では、その基盤となる主要なコンポーネントに焦点を当てます。

Gitbase Testbed は、 Gitbase を視覚的に使用するための方法を提供します。

Vitess による SQL の解析

GitbaseはユーザーインターフェースとしてSQLを使用しています。つまり、MySQLプロトコルを介して送信されるSQLリクエストを解析して理解する必要があります。幸いなことに、YouTubeの仲間たちと彼らのVitessプロジェクトは既にこれを実装しています。Vitessは、MySQLの水平スケーリングのためのデータベースクラスタリングシステムです。

いくつかのキーとなるコードスニペットを抽出し、オープンソースプロジェクトとして公開しました。このプロジェクトでは、誰でも数分でMySQLサーバーを構築できます(justforfuncの特集記事「CSVQL - SQLによるCSV処理」で実演しました)。

go-git で Git リポジトリを読み取る

リクエストの解析に成功したら、データセット内のGitリポジトリを読み取って、どのように応答するかを判断する必要があります。このため、source{d}で最も成功したリポジトリであるgo-gitを統合しました。go-gitは、非常にスケーラブルで純粋なGo Git実装です。

これにより、ディスク上に siva ファイル形式で保存されたソース コード リポジトリ (siva も source{d} のオープン ソース プロジェクトです)、または​git clone​を使用して直接クローンされたリポジトリを簡単に分析できます。

Enry を使用してプログラミング言語を検出し、Babelfish を使用してファイルを解析します。

Gitbase の分析機能は Git の履歴だけにとどまりません。オープンソースプロジェクト Enry を利用した(そしておそらく Enry も利用していると思われる)言語検出機能も統合し、コードファイルを汎用抽象構文木 (UAST) に変換する汎用ソースコード解析用のセルフホストサーバーである Babelfish を用いたプログラム解析も実装しています。

これら2つの関数は、Gitbaseではユーザー関数​LANGUAGE​​UAST​として表されます。これら2つの関数を併用することで、「先月最も頻繁に変更された関数の名前を検索する」といった多くのクエリリクエストが可能になります。

早く実行させる

Gitbaseは、GitHubの3TBのソースコードを含む公開Gitアーカイブなど、非常に大規模なデータセットを頻繁に分析します(発表内容をご覧ください)。これを実行するには、CPUユニットごとの処理能力が不可欠です。

そのため、Rubex と Pilosa という 2 つのプロジェクトをさらに統合しました。

RubexとOnigurumaを使って正規表現を高速化する

Rubexは、Goの​regexp​標準ライブラリパッケージのほぼ代替品です。`regexp.Regexp`型に​LiteralPrefix​メソッドが実装されていないため、まだ完全な​regexp.Regexp​品とは言えませんが、私自身はこのメソッドについて最近初めて知りました。

Rubex の高いパフォーマンスは、ライブラリの呼び出しに cgo を使用する、高度に最適化された C ライブラリ Oniguruma のおかげです。

クエリを高速化するには、Pilosa インデックスを使用します。

インデックスはほとんどすべてのリレーショナル データベースでよく知られた機能ですが、Vitess では実際には必要ないためインデックスを実装していません。

ありがたいことに、オープンソースのPilosaが再び私たちを救ってくれました。これはGo言語で実装された分散ビットマップインデックスで、Gitbaseを大規模データセットで使用できるようになります。Pilosaはオープンソースであり、複数の大規模データセットに対するクエリを大幅に高速化します。

要約

このブログ投稿を通して、誰も予想していなかった短期間でGitbaseを構築することを可能にしてくれたオープンソースコミュニティの皆様に、心から感謝申し上げます。source{d}はオープンソースを強く信じており、 ​github.com/src-d​ (OKRや投資家委員会を含む)のコード一行一行がそれを証明しています。

Gitbaseを試してみませんか?最も速くて簡単な方法は、source{d}エンジンを使うことです。sourced.tech ​sourced.tech/engine​からダウンロードすれば、たった1つのコマンドでGitbaseを起動できます。

もっと詳しく知りたいですか?Go SFミートアップでの私のプレゼンテーションの録画をご覧ください。