Zenn
👏

【SonarQube×GitLab CI/CD】静的コード解析のJaCoCo、Checkstyle、PMD、SpotBugsのレポートを出す

に公開

【SonarQube×GitLab CI/CD】静的コード解析のJaCoCoCheckstylePMDSpotBugsのレポートを出させるには

はじめに

本ブログでは、SonarQubeとGitLab CI/CDを連携させて、静的コード解析ツールであるJaCoCo、Checkstyle、PMD、SpotBugsのレポートを生成する方法について説明します。SonarQubeの導入により、コード品質の向上と継続的なコードレビューが可能となります。

背景

ソフトウェア開発において、コードの品質を維持することは非常に重要です。静的コード解析ツールを使用することで、コードのバグやスタイルの問題、セキュリティの脆弱性を早期に発見し、修正することができます。SonarQubeは、これらの静的コード解析ツールを統合し、包括的なコード品質管理を提供するプラットフォームです。

目的

本ブログの目的は、以下の手順に従ってSonarQubeとGitLab CI/CDを設定し、静的コード解析のレポートを自動的に生成する方法を学ぶことです。

前提条件

このガイドを進めるにあたり、以下の前提条件を満たしていることを確認してください。

  • SonarQubeがインストールされていること
  • GitLabのプロジェクトが作成されていること
  • Mavenを使用してプロジェクトをビルドしていること

概要

本ガイドは、以下のステップに分かれています。

step0:SonarQubeの立ち上げ
step1:SonarQubeサイトで自分のプロジェクトを作る→「Create project」→URLとtokenがもらえる
step2:urlとtokenをGitLabでCICD変数として保存
step3:pom.xmlの修正
step4:.gitlab-ci.ymlの修正

各ステップの詳細な手順については、以下のセクションで説明します。これらの手順に従うことで、静的コード解析のレポートを自動的に生成し、コード品質を継続的に監視することができます。

操作手順

step0:SonarQubeの立ち上げ

  1. SonarQubeをインストールし、起動します。
  2. ブラウザでSonarQubeのURLにアクセスし、ログインします。

step1:SonarQubeサイトで自分のプロジェクトを作る

「create project」→urlとtokenがもらえる

  1. 各開発プロジェクトの管理者ロールを持つユーザはプロジェクト作成権限が付与されるので、画面右上のメニューからプロジェクトを作成できます。

  2. プロジェクト作成メニューから「Manually」を選択

  3. 以下の画面が表示、表示される「プロジェクト名」と「プロジェクトキー」を入力

  4. 「Main branch name」は、デフォルトの設定で構いません

  5. 「set up」を押すとあなたのプロジェクトが作成されます

step2:urlとtokenをGitLabでCICD変数として保存

  1. 作成したSonarQubeプロジェクトを開くと、以下のような画面になります

  2. 「With GitLab CI」のアイコンを押す

  3. pom.xmlの設定は後でしますので、「Continue」を押してください

  4. 「Generate a token」のボタンを押し、Tokenを作成

  5. GitLabのサイトにて、自分のprojectの下に入って、
       設定(Setting)→CI/CDをクリックし、
    上記のページで出力された情報を元にToken情報とURL情報を設定します。

  6. 右側の「変数」→「変数を追加」を押して、

  7. 新しく設定したいCICD変数の「キー」に「SONAR_TOKEN」、「値」に先ほどSonarQubeサイトで作成したTokenを設定

  8. 「変数を保護」のチェックを外して、「変数をマスク」をチェック

  9. 新しく設定したいCICD変数の「キー」に「SONAR_HOST_URL」、「値」に先ほどSonarQubeサイトでコピーしたURLを設定

  10. 「変数を保護」のチェックを外して、「変数をマスク」のチェックを外す

step3:pom.xmlの修正

step3.1:<properties>に追加

<properties>
   ....
  <sonar.qualitygate.wait>true</sonar.qualitygate.wait>
  <sonar.projectKey>{SonarQubeで定義した自分のprojectKey}</sonar.projectKey>
</properties>

step3.2:<build>に追加

<phase>verify</phase> にご注目!!!

	<build>
		<plugins>
			<plugin>
                .....(自分のbuildで使うplugin)
			</plugin>
            ......
			<!-- CheckStyle -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-checkstyle-plugin</artifactId>
				<version>3.6.0</version>
				<executions>
					<execution>
						<phase>verify</phase>
						<goals>
							<goal>checkstyle</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<configLocation>rules/google_checks.xml</configLocation>
					<outputFile>${project.build.directory}/checkstyle-result.xml</outputFile>
					<linkXRef>false</linkXRef>
				</configuration>
			</plugin>
			<!-- PMD -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-pmd-plugin</artifactId>
				<version>3.26.0</version>
				<executions>
					<execution>
						<phase>verify</phase>
						<goals>
							<goal>cpd</goal>
							<goal>pmd</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<format>xml</format>
					<linkXRef>false</linkXRef>
					<targetDirectory>${project.build.directory}</targetDirectory>
					<targetJdk>${java.version}</targetJdk>
					<sourceEncoding>UTF-8</sourceEncoding>
				</configuration>
			</plugin>
			<!-- SpotBugs -->
			<plugin>
				<groupId>com.github.spotbugs</groupId>
				<artifactId>spotbugs-maven-plugin</artifactId>
				<version>4.8.6.6</version>
				<executions>
					<execution>
						<phase>verify</phase>
						<goals>
							<goal>spotbugs</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<xmlOutput>true</xmlOutput>
					<xmlOutputDirectory>${project.build.directory}/spotbugs</xmlOutputDirectory>
				</configuration>
			</plugin>
			<!-- JaCoCo -->
			<plugin>
				<groupId>org.jacoco</groupId>
				<artifactId>jacoco-maven-plugin</artifactId>
				<version>0.8.12</version>
				<executions>
					<execution>
						<id>prepare-agent</id>
						<goals>
							<goal>prepare-agent</goal>
						</goals>
					</execution>
					<execution>
						<id>report</id>
						<phase>verify</phase>
						<goals>
							<goal>report</goal>
						</goals>
						<configuration>
							<excludes>
								<exclude>**/*</exclude>
							</excludes>
						</configuration>
					</execution>
				</executions>
				<configuration>
					<outputDirectory>${project.build.directory}/jacoco</outputDirectory>
					<dataFile>${project.build.directory}/jacoco.exec</dataFile>
				</configuration>
			</plugin>
		</plugins>
	</build>

step4:.gitlab-ci.ymlの修正

.gitlab-ci.yamlに以下のコードを追加
sonar:sonar -Dsonar.projectKey=の後ろにstep1のプロジェクトを作る時に設定した「project key」を入力

variables:
  MAVEN_IMAGE: maven:3.8.3-openjdk-17

sonarqube-check:
  stage: test
  image: $MAVEN_IMAGE
  variables:
    SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar"  # Defines the location of the analysis task cache
    GIT_DEPTH: "0"  # Tells git to fetch all the branches of the project, required by the analysis task
  cache:
    key: "${CI_JOB_NAME}"
    paths:
      - .sonar/cache
  script: 
    - mvn verify sonar:sonar -Dsonar.projectKey={プロジェクトを作る時に設定した「project key」}
  allow_failure: true

ここがPoint::
静的コード解析のJaCoCoCheckstylePMDSpotBugsの実行は、
verifyにまとめられていますので、上のscript:の部分で実行されます。

     script: 
       - mvn verify sonar:sonar -Dsonar.projectKey={プロジェクトを作る時に設定した「project key」}

SonarQubeサイトで出力するレポート

SonarQubeサイトでは、コードスメルレポート、バグレポートや脆弱性レポートなど、さまざまなレポートが生成されます。その中でも、プロジェクトのコード品質を一目で把握できるように設計されているSonarQubeダッシュボードは、状況把握に非常におすすめです。
以下に、SonarQubeダッシュボードの主要な画面要素とその内容について、上から順に解説します

1. Quality Gate Status(品質ゲートステータス)

品質ゲートステータスは、プロジェクトが設定された品質基準を満たしているかどうかを示します。品質ゲートは、プロジェクトのリリース前に品質を確保するための重要な指標です。ステータスは「Passed(合格)」または「Failed(不合格)」として表示されます。

  • Passed: すべての条件が満たされていること
  • Failed: いずれかの条件が満たされていないこと

2. Measures(メジャー)

メジャーセクションでは、プロジェクトの新しいコードと全体のコードに関するさまざまなメトリクスが表示されます。これには、バグ、脆弱性、セキュリティホットスポット、技術的負債、コードスメル、カバレッジ、重複コードなどが含まれます。

  • New Bugs: 新しく発見されたバグの数。
  • New Vulnerabilities: 新しく発見された脆弱性の数。
  • New Security Hotspots: 新しく発見されたセキュリティホットスポットの数。
  • Added Debt: 新しく追加された技術的負債の量。
  • New Code Smells: 新しく発見されたコードスメルの数。
  • Coverage on New Lines: 新しいコード行に対するテストカバレッジの割合。
  • Duplications on New Lines: 新しいコード行における重複の割合。

3. Reliability(信頼性)

信頼性セクションでは、コードの信頼性に関する評価が表示されます。評価はAからEの5段階で示され、Aが最も信頼性が高いことを意味します。

4. Security(セキュリティ)

セキュリティセクションでは、コードのセキュリティに関する評価が表示されます。こちらもAからEの5段階で評価され、Aが最もセキュリティが高いことを意味します。

5. Maintainability(保守性)

保守性セクションでは、コードの保守性に関する評価が表示されます。評価はAからEの5段階で示され、Aが最も保守性が高いことを意味します。

6. Security Review(セキュリティレビュー)

セキュリティレビューセクションでは、セキュリティホットスポットのレビュー状況が表示されます。これにより、セキュリティ上の懸念がどの程度レビューされているかを把握することができます。

7. Coverage(カバレッジ)

カバレッジセクションでは、テストカバレッジの状況が表示されます。これは、コードのどの部分がテストされているか、どの部分がテストされていないかを示すものです。カバレッジが高いほど、コードの信頼性が高いとされます。

8. Duplications(重複)

重複セクションでは、コード内の重複部分が表示されます。重複コードは、コードの保守性を低下させるため、可能な限り削除することが推奨されます。

その他SonarQubeに関する用語の紹介

Quality Profile

  • Quality Profileは各開発言語ごとに作成するもので、品質チェックを行う項目をカスタマイズすることが可能となる機能です。

Quality Gate

  • Quality Gateは品質チェックの定量的な基準を設定することが可能となる機能です。具体的には、コードのバグ、セキュリティの脆弱性、コードの重複などの指標を基に評価を行います。

使ってみた感想

多様な静的コード解析ツールの統合

SonarQubeはGitLab CI/CDにより、JaCoCo、Checkstyle、PMD、SpotBugsなどの多様な静的コード解析ツールを統合して使用することができ、各ツールの強みを活かしながら、包括的なコード品質管理が可能となりました。特に、各ツールのレポートが一元化されるため、管理が非常に楽になりました。

設定の柔軟性

SonarQubeの設定は非常に柔軟で、プロジェクトごとに異なるルールセットを適用することができます。これにより、プロジェクトの特性に応じた最適なコード品質チェックが可能となりました。また、品質ゲートや品質プロファイルをカスタマイズすることで、プロジェクトの品質基準を明確に定義することができ、多様な需要に応えられます。

Discussion

ログインするとコメントできます