Holmesでエンジニアをしている山本です。
gilot
(ジロー)の紹介記事を見て、複数チーム・複数Gitリポジトリ で開発している弊社ではどのような結果が得られるかと思い、試してみました。
qiita.com
実行環境
参考
Qiitaの記事 、gilotのGitHubリポジトリ 、また以下の記事を参考にしました。
解析対象
解析対象とするリポジトリ について
現在、弊社では、複数のGitリポジトリ に対して複数チームが開発を行っています。
今回は、Java によるバックエンド、Vue.jsによるフロントエンドを対象とし、それぞれ名前を backend, frontend とします。対象とするブランチは、いずれもmasterです。
以下のディレクト リ構造にて、 root
ディレクト リをカレントディレクト リとしてコマンドを実行していきます。
root/
├ backend/
└ frontend/
hotspotやhotgraphで対象とするファイルパスについて
hotspotやhotgraphでは、ユニットテスト などのファイルを含めると結果が正しく取れないため、対象とするファイルパスを指定します。
backendは、プロジェクト管理ツールとしてGradleを使用したSpring Bootアプリケーションのため、解析時には --allow-files 'src/main/*'
を指定します。
frontendは、複数パッケージを packages/*
配下で管理しており、その中にStorybookやJestのテストファイルが含まれるため、解析時には --allow-files 'packages/*' --ignore-files '*/__tests__/*' '*.spec.ts' '*.stories.js'
を指定します。
gilotによる解析
インストール
GitとPython3はインストール済みのため、 pip install gilot
でインストールできました。
gilotのインストールに成功すると、バージョンが表示されます。実行環境にも記載しましたが、記事作成時点でのバージョンは0.2.4です。
Installing collected packages: gilot
Successfully installed gilot-0.2.4
また、 author
コマンドによるグラフ描画に使用されるということで、IPA ゴシックフォントをインストールしておきます。
IPAフォントのダウンロード
log
まずはログの取得を行います。 hotspot
や hotgraph
では --full
オプションをつけて出力しておく必要があります。
後の解析コマンドにファイルを渡しやすいよう、出力ファイルにはプレフィックス として log-
を付与しておきます。また、frontendの開発が始まったのが2020年6月のため、 --since 2020-06-01
で開始日を指定します。
gilot log --full -b master -o log-backend.csv --since 2020-06-01 --full backend/
gilot log --full -b master -o log-frontend.csv --since 2020-06-01 --full frontend/
backendは約1,300行の出力に1分ほど、frontendは約2,100行の出力に2分ほどかかりました。
出力にはマージコミットも含まれますが、除外せずそのまま解析を行います。
plot
plot
コマンドにて、グラフ生成を行います。
開発手法としてスクラム を採用しており、スプリント期間は各チーム1週間となっているため、解析時のタイムスロットを -t 1w
で1週間とします。
backendとfrontend、両方合わせたものと個別で3種類出力してみます。
gilot plot -i log-*.csv -t 1w -o plot-all.png
gilot plot -i log-backend.csv -t 1w -o plot-backend.png
gilot plot -i log-frontend.csv -t 1w -o plot-frontend.png
それぞれの結果は、以下のようになりました。
plot-all
plot-backend
plot-frontend
frontendは6月から開発を開始したため、環境構築時のコミット行数が多く、かなり上振れしたグラフになっておりました。出力期間の変更が必要そうです。
アウトプットの落ち込みがある部分は、お盆休みの週となります。
hotspot
hotspot
コマンドにて、変更頻度の高いファイルのランキングを出力します。ユニットテスト 関連ファイルなどを除外するため、--allow-files
および --ignore-files
を指定しております。
gilot hotspot -i log-backend.csv \
--allow-files ' src/main/* '
gilot hotspot -i log-frontend.csv \
--allow-files ' packages/* ' \
--ignore-files ' */__tests__/* ' ' *.spec.ts ' ' *.stories.js '
------------------------------------------------------------
gilot hotspot ( https://github.com/hirokidaichi/gilot )
------------------------------------------------------------
hotspot commits authors file_name
19 .57 57 5 src/main/java/< path_to_file>
17 .71 67 5 src/main/java/< path_to_file>
また、 --csv -o 出力先ファイルパス
でCSV 出力が可能です。この場合、除外していないすべてのファイルについて、解析結果が出力されます。
gilot hotspot -i log-backend.csv --csv -o hotspot-backend.csv \
--allow-files ' src/main/* '
gilot hotspot -i log-frontend.csv --csv -o hotspot-frontend.csv \
--allow-files ' packages/* ' \
--ignore-files ' */__tests__/* ' ' *.spec.ts ' ' *.stories.js '
以下のようなCSV が出力されました。--csv
を付与せず実行した場合より、項目が増えています。
file_name,hotspot,commits,authors,edit_rate,lines
src/main/java/<path_to_file>,19.56934308077001,57,5,0.7472647702407003,1828
src/main/java/<path_to_file>,17.703904086980828,67,5,0.6457142857142857,1050
hotgraph
hotgraph
コマンドにて、同時に変更されやすいファイルのネットワーク図を出力します。こちらも hotspot
と同様、ユニットテスト 関連ファイルなどを除外するため、--allow-files
および --ignore-files
を指定しております。
また、Windows 環境では --stop-retry
を付与しないとエラーが発生するため、オプションを付与しております。
gilot hotgraph -i log-backend.csv --stop-retry -o hotgraph-backend.png \
--allow-files ' src/main/* '
gilot hotgraph -i log-frontend.csv --stop-retry -o hotgraph-frontend.png \
--allow-files ' packages/* ' \
--ignore-files ' */__tests__/* ' ' *.spec.ts ' ' *.stories.js '
それぞれの結果は、以下のようになりました。(ファイル名が含まれるため、ぼかしをかけています)
hotgraph-backend
hotgraph-frontend
同時に変更されやすいファイルが、同じ色の円で表示されます。
author
author
コマンドにて、コミットした人ごとのコミット数や、割合を出力します。
デフォルトではトップ10人が出力され、それ以外の人は「Others」としてまとめられます。人数は -t 人数
で指定可能です。
-n 名前
で、出力画像右上にタイトルを追加できます。
plot
と同様、backendとfrontend、両方合わせたものの3種類を出力してみます。
gilot author -i log-*.csv -o author-all.png -n all
gilot author -i log-backend.csv -o author-backend.png -n backend
gilot author -i log-frontend.csv -o author-frontend.png -n frontend
それぞれの結果は、以下のようになりました。(個人名が含まれるため、私とOthers以外はぼかしをかけています)
author-all
author-backend
author-frontend
info
info
コマンドにて、各コマンドの解析元となる情報を、JSON で出力できます。
plot
と同様、 -t
オプションを指定できますが、gilot v0.2.4 では無視されてデフォルトの2週間で出力されるようです。
-o
オプションは指定できないため、ファイル出力する場合はリダイレクトします。
gilot info -i log-*.csv -t 1w > info-all.json
gilot info -i log-backend.csv -t 1w > info-backend.json
gilot info -i log-frontend.csv -t 1w > info-frontend.json
以下のJSON が出力されます。タイムスロットが2週間になっています。
{
"gini ": 0.23784183100679956 ,
"output ": {
"lines ": 236045 ,
"added ": 62121 ,
"refactor ": 0.7368256052871274
} ,
"since ": "2020-06-02T09:01:06.000000000 ",
"until ": "2020-09-03T17:01:01.000000000 ",
"timeslot ": "2 Weeks ",
// 以下省略
振り返り
それぞれの解析処理を実行してみました。いずれの解析も、 gilot log
でログ出力しておけば後から実行できるため、CIと連携させて出力するのは難しくないと思います。
以下所感です。
plot
スポットで出力するだけでは、あまりメリットを感じませんでした。
1か月などの期間で定期的に出力し、大きな変化があれば原因を特定、必要があれば改善するなど、実際のプロダクト開発に利用することで意味が出てくるのではないかと思います。
(根本的なところを言うと、それぞれのグラフの意味をきちんと把握していないので、まずはそこから学習しないとです...)
hotspot, hotgraph
これらはファイル間の関連性、依存性を確認することができるので、スポットでも有用だと思います。
静的解析ツールなどによる複雑性の確認と組み合わせることで、リファクタリング の優先度が高いファイルの発見に使えそうだと思いました。
author
これはそのままコミット数になります。
見ていると面白いですが、同じチーム内でも各人のコミット粒度が同じとなることはなかなかないと思うので、単体では何かの指標として使いにくいかと思います。
info
それぞれの解析結果の元となる情報のため、より高度な利用方法になるかと思います。
ツールの習熟が進み、いずれかの指標を画像ではなくデータとして扱いたいときに、こうしたコマンドがあるのはありがたいと思います。
期間指定変更後の再plot
frontendから抽出する期間を2020/6/15以降に変更して plot
してみたところ、コミット行数の上振れが解消されました。
backendも合わせて期間を変更してみます。
gilot log --full -b master -o log-backend.csv --since 2020-06-15 --full backend/
gilot log --full -b master -o log-frontend.csv --since 2020-06-15 --full frontend/
gilot plot -i log-*.csv -t 1w -o plot-all.png
gilot plot -i log-backend.csv -t 1w -o plot-backend.png
gilot plot -i log-frontend.csv -t 1w -o plot-frontend.png
結果は以下のようになりました。コミット行数の上振れがなくなり、グラフの上限値が適切な値になっています。
plot-all(期間変更後)
plot-backend(期間変更後)
plot-frontend(期間変更後)
最後に
Holmesではエンジニア・デザイナーを募集しております。ご興味がある方はこちらからご連絡ください。
lab.holmescloud.com
lab.holmescloud.com