ソースコード差分情報をマージリクエストで可視化するCI環境を構築してみた

Understand

実施したこと

構造解析ツール「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 製品カスタマーセンター までお気軽にお問合せください。

タイトルとURLをコピーしました
Close Bitnami banner
Bitnami