実施したこと
構造解析ツール「Understand」の差分機能を利用して、マージリクエストが作成された時に各ツールで得られるグラフィカルビューやメトリクスの差分を表示してみました。
レビューコメントとして以下の差分情報を出力します。
- 出力内容
- 変更された関数・クラス
- Percent Changed (どのくらいの割合で変更差分があるか)
- 定義ファイル
- 差分メトリクス
- 変更差分のある関数・クラスの差分Control Flowグラフ
Understand
Understandで実施していることは以下になります。
- 差分プロジェクトの解析
- 差分メトリクス出力
- Understand Python APIを利用した差分グラフィカルビューの出力
全体の流れ
今回のGitLabパイプラインの処理は以下の図のようなイメージになります。

前提
今回構築したCI環境には、動作の前提となる条件があります。
- Understand with APIライセンス
今回のCIパイプラインでは、Understandでプロジェクト差分を出力し、差分のあった関数やクラスなどの情報をグラフィカルビューで出力するという処理をおこないます。Understandでプロジェクトの差分を出力することはAPIなしライセンスでも可能ですが、グラフィカルビューを出力する際にAPIライセンスが必要になります。
ymlファイルのダウンロード
今回、ご紹介するGitLabのymlファイルは、以下からダウンロードいただけます。
このGitLabの実行環境はAWSのS3環境にデータを格納することを前提として作成しています。
なお、ymlファイルで実行されるスクリプトに関しては、有償サービスでの提供となりますこと、あらかじめご了承ください。
ymlファイルの解説
このGitLab環境は、主に3つのジョブで構成されGitLab上で可視化する情報として、Understandのソースコード差分情報を表示します。
- analysis-job
- review-job
- clean-job
タグは、今回、[Understand]で統一しており、ランナーがこのタグに一致する場合に、上記のジョブが実行されます。
コードコミット時には、analysis-jobが実行され、マージリクエストが発行されると、review-jobが実行されます。
analysis-job
ここでは、analysis-jobと呼ばれるジョブの設定について説明します。
このジョブは、コードの分析を実行し、その結果をAmazon S3にアップロードします。
analysis-job:
tags:
- Understand
stage: test
rules:
- if: $CI_PIPELINE_SOURCE == "push"
variables:
script:
- chmod +x ./understand/analyze.sh
- chmod +x ./understand/storage/aws-s3.sh
- ./understand/analyze.sh --upload
rulesセクションでは、このジョブが実行される条件を定義しています。
この場合、$CI_PIPELINE_SOURCEがpushのときに実行されます。
つまり、コードがリポジトリにプッシュされたときにこのジョブがトリガーされます。
このジョブは、コードがコミットされたタイミングで、Understandの解析をおこなうシェルスクリプトを動作させ、プロジェクトを作成し、作成したプロジェクトをAmazon S3ストレージにアップロードするジョブです。
review-job
ここでは、review-jobと呼ばれるジョブの設定について説明します。
このジョブは、マージリクエストが作成されたタイミングで、Understandの差分比較をおこない、
差分メトリクスやグラフィカルビューを表示するジョブです。
review-job:
tags:
- Understand
stage: test
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
script:
- chmod +x ./understand/analyze.sh
- chmod +x ./understand/generate-graphs.sh
- chmod +x ./understand/review-pr.sh
- chmod +x ./understand/storage/aws-s3.sh
- ./understand/analyze.sh
- ./understand/generate-graphs.sh > review-comment.txt
- ./understand/review-pr.sh review-comment.txt
このジョブでは、review-comment.txtファイルの内容を元にレビューコメントを生成します。このジョブを設定することで、マージリクエストが発生するたびに差分比較がおこなわれ、関数やクラスの差分グラフィカルビューとメトリクスの差分が、レビューコメントとしてアップロードされます。



clean-job
このジョブは、analysys-jobやreview-jobで利用したディレクトリを初期化するためのジョブです。
clean-job:
tags:
- Understand
stage: .post
rules:
- when: always
script:
- chmod +x ./understand/clean.sh
- ./understand/clean.sh
最後に
弊社では、このようなCI環境を構築する有償サービスなどもおこなっております。
自動化にご興味がありましたら、Scitools 製品カスタマーセンター までお気軽にお問合せください。