3.チーム開発におけるGitHub Flow遵守状況可視化手法の提案
本章では,GitHub Flowを題材とし,リポジトリ及びホスティングサービスから取得できる開発履歴をもとに,GitHub Flowのルールをどの程度遵守できているかを可視化する手法について提案する.図3-1は本システムの概要である.Python3を用いて開発履歴を収集及び加工してMySQL4に格納し,その結果をWebアプリで可視化する.Webアプリでは,サーバサイドにJava5,フロントエンドにJavaScript6,HTML7及びCSS8を使用した.開発者は,Webアプリを閲覧することで,GitHub Flowの遵守状態を確認することが出来る.
図3-1 提案するシステムの概要
遵守状況の判定にはポジトリ及びホスティングサービスから取得できる開発履歴を使用する.しかし,GitHub Flowのルールの一部には,収集した開発履歴のみで遵守しているかどうかを自動的に判定することが困難なものも存在する.そのため,ルールの改定を行った.以降では改定内容とルール違反の検出手法について順に述べる.
3.1 GitHub Flowの改定
以下に改定したルールの一覧を示す.
- R1’:初期コミット以外にmasterブランチに直接コミットしてはいけない
- R2’:すべてのブランチがmasterブランチから作られている
- R3’:ローカルリポジトリ上に作成したブランチに対するコミットをリモートリポジトリに定期的にプッシュする
- R4’:masterブランチにマージを行う際には必ずプルリクエストを作成する
- R5’:プルリクエストの内容をmasterブランチにマージする際には必ず第3者によるレビューを受ける
GtHub FlowにおけるオリジナルのR1はmasterブランチがデプロイ可能であることを求めている.しかしながら,デプロイ可能であるかを評価するためには外部のビルド・デプロイ環境などとの連携が必要となるため,本研究では対象としない.我々はR1の主旨を,第3者にレビューされ,確認されたもののみがmasterブランチにコミットされるべきであると解釈した.すなわち,初期コミット以降はブランチを作成してから開発を進めて,レビューが適切に行われたもののみがマージされるべきであるということを示す.ここでブランチの作成やレビューについては他のルールで対応しているため,masterブランチへの直接コミット(すなわちレビュー等が行われていない可能性がある)の禁止をR1’とした.R2’は,R2にあった説明的で分かりやすいブランチ名を付与しているかという部分を排除し,すべてのブランチがmasterから作られているかどうかのみを対象とするように変更した.R3’はほぼR3のままであるが,“定期的にプッシュする”という部分について,一定の基準を開発者チームで事前に決定するものとしている.R4’及びR5’については,masterブランチへのマージは第3者によるレビューを経た(R5’)プルリクエスト経由の場合のみ認める(R4’)ものとして設定した.なお,オリジナルのGitHub FlowではR6が存在するが,外部の仕組みを利用したデプロイ作業を伴うルールであるため,本研究では対象としないものとする.
以降ではこれらの改定されたルールにおける違反行動の検出例について詳述する.
3.2 ルール違反の検出
本章では,改定後のGitHub Flowにおけるルール違反の検出について詳述する.
3.2.1 前提条件
我々はルール違反の検出に際し,以下に示す2つの条件が満たされていることを前提とする.
- C1:ブランチが削除されない
- C2:マージは原則としてno fast forwardで行われる
C1については,主にR2’に関する違反を特定する際に,ブランチが削除されていると検出が困難になるためである.
マージについては2.1節でも述べたように,fast forwardなマージが行われると,マージ先のブランチが示すポインタが移動するだけでマージを行ったという記録が残らない.そのため,マージコミットが生成されるno fast forwardなマージが行われることを前提とする.なお,リモートリポジトリの更新をローカルリポジトリに適用する(プル)際にもマージが行われるが,こちらについては余分なマージコミットが生成されてしまうため,fast forwardなマージが行われることを前提とする.
3.2.2 R1’:初期コミット以外にmasterブランチに直接コミットしてはいけない
R1’は初期コミット及びマージコミットを除くコミットがmasterにあるかどうかで違反の判定を行う.すなわち,masterブランチへのコミットはブランチで開発をした後のマージによるもののみを認め,それ以外は認めない.R1’の違反率は,マージコミット及び初期コミットを除く全コミット数のうち,違反しているコミットの割合として計測する.
図3.3.2-1に違反検出例を示す.
図3.2.2-1 R1'についての違反率検出例
まず,△印のものが対象外のコミットである.これは,親コミットを持たない初期コミットとマージコミット(図中のM印のコミット)が該当する.次に,○印のものは,masterに直接コミットしていないコミットを示す.そして最後に,×印ものが,masterに直接コミットしている違反コミットを示す.
3.2.3 R2’:すべてのブランチがmasterブランチから作られている
ブランチ作成後に開発を進めると,共通の親コミットを持つコミットがブランチごとに生じる.我々はこの共通の親コミットのことをブランチ作成元コミットと呼び,ブランチ作成元コミットがmasterブランチにあるかどうかによって,R2’に違反しているかどうかを判定する.R2’の違反率としては,masterブランチ以外のブランチを作成した総回数のうち,ブランチ作成元コミットがmasterブランチにないようなブランチが作成された回数の割合として計測する.
具体例を図3.2.3-1に示す.
図3.2.3-1 R2'についての違反率検出例
まず,○印のfix_MainPageLinkブランチはmasterブランチから作成されたものである.したがって,ルールを遵守しているブランチとなる.そして,☓印のfix_Bugブランチは,master以外のfix_MainPageLinkブランチから作成されたもののため,ルールを違反していると検出される.
3.2.4 R3’:ローカルリポジトリ上に作成したブランチに対するコミットをリモートリポジトリに定期的にプッシュする
R3’はローカルリポジトリにコミットした後,時間をおかずにリモートリポジトリにその内容をプッシュすることを求めている.そこで,リモートリポジトリを一定期間ごとにチェックし,チェック日時と新規にリポジトリに登録,プッシュされたコミットのコミット日時を比較し,指定した時間内に収まっているかどうかによって違反しているかどうかを判断する.このようなアルゴリズムのため,最大約チェック周期1回分の誤差が発生する.したがって,チェック周期を短くし,プッシュするまでの期間を長くすることが理想である.違反率は総コミット数のうち,違反しているコミットの数が占める割合として計測する.
具体例を図3.2.4-1に示す.
図3.2.4-1 R3'についての違反率検出例
前提として,チェックを1時間毎に行い,コミットから24時間以内にプッシュするものとしてR3’が運用されているものとする.まず,左側の吹き出しのコミットは,コミット時間と取得した時間の差が24時間以内となっているため,ルールを遵守していると判定される.そして,右側の吹き出しのコミットは,コミット時間と取得した時間の差が24時間以内となっていないため,違反と判定される.このような判定を全てのコミットについて行った結果,図3.2.4-1のように判定された.
3.2.5 R4’:masterブランチにマージを行う際には必ずプルリクエストを作成する
別のブランチで開発した後にmaster ブランチへとその内容をマージする際,GitHubのようなホスティングサービスのWebUI上でプルリクエストを発行してマージするか,ローカルリポジトリ上で git merge
コマンドによってマージするかの2種類の方法がある.R4’では,masterブランチへのマージの際にプルリクエストを発行しているかどうかで判定を行う.違反率はmasterブランチに存在する総マージコミット数のうち,プルリクエストを発行していないマージコミットの割合として計測する.
3.2.6 R5’:プルリクエストの内容をmasterブランチにマージする際には必ず第3者によるレビューを受ける
このルールを遵守しているかどうかは,masterに対してのマージを目的としたあるプルリクエストに対して,プルリクエストを出した人以外のレビューがマージの前に存在しているかどうかで判定する.存在していれば遵守しており,存在していなければ違反とする.違反率はmasterに対するマージの総プルリクエスト数のうち,マージ前にマージ者以外の人によるレビューコメントが投稿されていないプルリクエストの割合で算出する.
3. Welcome to Python.org, https://www.python.org/ ↩
4. MySQL, https://www.mysql.com/jp/ ↩
5. java.com, https://www.java.com/ja/ ↩
6. JavaScript | MDN, https://developer.mozilla.org/ja/docs/Web/JavaScript ↩
7. HTML | MDN, https://developer.mozilla.org/ja/docs/Web/HTML ↩
8. CSS | MDN, https://developer.mozilla.org/ja/docs/Web/CSS ↩