きり丸の技術日記

技術・エンジニアのイベント・資格等はこちらにまとめる予定です

JavaをSonarCloudでカバレッジ取りながら静的分析する(Gradle, 2021年)

2021年になってGitHub Actions等のCIを使ったSonarCloud連携がしやすくなったので、手順を纏めます。

今回の記事では、JaCoCoでカバレッジを取得して、コードをSonarCloudへ連携できることをゴールとします。

環境

  • Java
    • 11
  • JaCoCo
  • SonarQube
    • 3.3
  • Gradle
    • 7.0.2
  • SonarCloud

書かないこと

  • SonarCloudについて
  • SonarCloudの設定
  • sonar-scannerでの連携
    • SonarQubeの構築記事で紹介予定です
  • GitHub Actionsのsecretの使用方法

ゴール

  • GitHub Actionsでコミットされると自動でSonarCloudに解析される
  • カバレッジも連携する

f:id:nainaistar:20210616193630p:plain

手順

解析対象のソースがあるpublicリポジトリを用意する

SonarCloudが解析できるように、publicリポジトリを作成します。特にこだわりがなければ、GitHubで良いでしょう。また、解析対象のソースが無いとSonarCloudに反映されないので、最低限TDD等で複数サイクル回してコミットされている状態がオススメです。

SonarCloudのプロジェクトを作成する

SonarCloudのページから、作成したリポジトリのアカウントでログインします。

ログイン後、画面右上の+ボタンから「Analyze new project」ボタンで新しいプロジェクトを作成します。

f:id:nainaistar:20210616193648p:plain

個人、または組織を選択して、解析したいリポジトリにチェックを入れます。チェック後、「Set Up」ボタンをクリックします。

f:id:nainaistar:20210616193702p:plain

CIで連携するか、手動で連携するかを選ぶことができます。今回は「With GitHub Actions」を選択します。

f:id:nainaistar:20210616193720p:plain

その後、ログイン用のトークンが発行されます。後で使用しますので、メモしてください。メモ後に「Continue」ボタンをクリックします。

f:id:nainaistar:20210616193738p:plain

Gradleの設定とGitHub Actionsの設定が表示されます。ある程度は参考になりますが、手を加える必要があるので、その点は後述いたします。

f:id:nainaistar:20210616193755p:plain

build.gradleに必要なライブラリとタスクを設定する

build.gradleに必要なライブラリとタスクを設定します。本来であれば、ログイン用のトークンはGitHub Secretsで管理したほうが良いですが、手順を簡略化するために直接書き込みます。

plugins {
    id 'org.sonarqube' version '3.3' // SonarCloudへの転送用
    id "jacoco" // カバレッジを取得します
}

sonarqube {
    properties {
    // プロジェクト名
        property "sonar.projectKey", "hirotoKirimaru_sonar-cloud-practice" 
    // 分析対象の組織名
        property "sonar.organization", "hirotokirimaru-github" 
    // SonarCloudのURL
        property "sonar.host.url", "https://sonarcloud.io" 
    // ログイン用トークン
        property "sonar.login", "62fbe0ec5e29acce113b1edb376c800f6c57096e" 
    // カバレッジレポートの格納先
        property "sonar.coverage.jacoco.xmlReportPaths", "${project.buildDir}/reports/jacoco/test/jacocoTestReport.xml"
    }
}

// テストレポートの出力
jacocoTestReport {
    reports {
        xml.enabled true
        html.enabled true
        csv.enabled false
    }
}

この時点で、SonarCloudへの連携が可能です。次のコマンドで、テストして、カバレッジレポートを出力し、カバレッジとソースコードをSonarCloudに連携することができます。GitHub Actionsで動かす前に、ここで機能確認することがオススメです。

./gradlew test 
./gradlew jacocoTestReport
./gradlew sonarqube

GitHub Actionsの設定

SonarCloudの画面との修正点は以下の通りです。設定値はbuild.gradle側に寄せているので、次のYAMLをコピペするだけで動くはずです。

  • gradlewのパーミッション付与
  • テスト実行
  • カバレッジレポート出力
  • SonarCloudへの連携
  • その他、不要な項目の削除
name: Build
on:
  push:
    branches:
      - master
  pull_request:
    types: [opened, synchronize, reopened]
jobs:
  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0  # Shallow clones should be disabled for a better relevancy of analysis
      - name: Set up JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: 11
      - name: Cache SonarCloud packages
        uses: actions/cache@v1
        with:
          path: ~/.sonar/cache
          key: ${{ runner.os }}-sonar
          restore-keys: ${{ runner.os }}-sonar
      - name: Cache Gradle packages
        uses: actions/cache@v1
        with:
          path: ~/.gradle/caches
          key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
          restore-keys: ${{ runner.os }}-gradle
      - name: chmod
        run: chmod 777 gradlew
      - name: test
        run: ./gradlew test
      - name: testReport
        run: ./gradlew jacocoTestReport
      - name: analyze
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}  # Needed to get PR information, if any
        run: ./gradlew sonarqube

注意点としては、SonarCloudのメインブランチは確認して下さい。私はメインブランチをmasterとしていますが、SonarCloudのメインブランチ名がmainとなっています。トップページはメインブランチの解析結果となりますので、ブランチごとの解析結果を確認したい場合は明示的に変更する必要があります。

「なぜかGitHub Actionsでは正常終了しているのに、結果が連携されない…」と、気になっている方はブランチ名を再確認してください。

f:id:nainaistar:20210616193814p:plain

f:id:nainaistar:20210616193827p:plain

ソースコード

SonarCloudはだいぶ連携が楽にはなりましたが、ブランチ名のデフォルトがmasterからmainに変更されたことでハマっていました。

GitHubのデフォルトブランチ名は未だにmasterを指定しているので、SonarCloud側のデフォルトブランチ名がmainになっていることは気付けませんでした。

Gitと連携できるサービス側でのデフォルトブランチ名は今後も気を付けないといけませんね。


この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。

類似

f:id:nainaistar:20210616193942p:plain