Help us understand the problem. What is going on with this article?

Java+Gradle+Wercker構成でCodecovによるカバレッジチェックする

More than 1 year has passed since last update.

私の作業記録としての側面が強いですが、タイトルの内容の作業手順を作成しましたので投稿します。

概要

Gradleを使ったJavaアプリケーションのGitHubリポジトリにおいて、Werckerのビルドフェーズを通して、Codecovへカバレッジ測定結果をコミットするための手順です。

Codecov

URL

https://codecov.io/gh

選択理由

coverallsとどちらを使うか迷ったが、参考記事に賛同して、Codecovにした。

Jacoco

カバレッジ測定に使用する。Gradleから実行する。

version 0.8について

新しいJavaの構文について、カバレッジ対象とするかどうかなどのオプションがいろいろと追加された。
参考記事

明示されていないコンストラクタのカバレッジについて

コンストラクタが宣言されていない、非明示的なコンストラクタについて、コンストラクタ(インスタンス化)のテストコードが書かれていないと、Jacocoでは非通過として扱われ、網羅率が下がる。例えばstaticメソッドが並ぶユーティリティ的なクラスで起きうる。インスタンス化しないクラスについては、若干冗長かもしれないが、丁寧にコンストラクタをprivate化しておく。そうするとJacocoはコンストラクタをカバレッジ対象外として扱い、不必要にカバレッジ網羅率が下がることはなくなる。コンストラクタを明示的に宣言するのであれば、プロダクトコードから使われるはずなので、それはテストコードをきちんとかくこと。

Jacoco 0.8.0から対応されたらしい

目次

  1. CodecovにGitHubリポジトリを追加
  2. build.gradleに、jacocoテストをするための記述を追加
  3. wercker.ymlに、Codecovへカバレッジ送信するための記述を追加
  4. codecov.ymlを作成し、カバレッジ測定結果のOK条件を記載
  5. 追加内容をコミットし、Werckerのビルドを動かす
  6. Codecovへのカバレッジ送信を確認
  7. GitHubリポジトリでCodecovのチェックを強制し、カバレッジ測定結果がNGの場合マージを拒否する
  8. Codecovのバッジを取得

CodecovにGitHubリポジトリを追加

  1. https://codecov.io/gh にアクセス
  2. GitHub、BitBucket、GitLabのアカウントでログインできる
    • 本記事ではGitHubなので、GitHubを選択
  3. 選択したアカウントで使用可能なリポジトリが表示されるので、対象のリポジトリを選択
  4. Codecovへカバレッジ情報を送信するためのトークンが表示されている
  5. トークンは後で使うので、一旦画面を開いたままにしておく

build.gradleに、Jacocoテストをするための記述を追加

  1. 下記をbuild.gradleに追加。

    // codecov用にjacocoプラグインを指定
    apply plugin: 'jacoco'
    
    jacoco {
        // バージョン情報は http://www.eclemma.org/jacoco/ を参照
        toolVersion = "0.8.1"
    }
    
    jacocoTestReport {
        reports {
            xml.enabled = true
            html.enabled = true
        }
    }
    
    // gradle buildを実行した際に、Jacocoでのカバレッジ測定も実行する
    build.dependsOn jacocoTestReport
    
  2. 参考にしたサンプルで、targetCompatibilityのJavaバージョンも記述されていたので、下記も追記した。

    targetCompatibility = 10
    

build.gradle全体

今までの積み上げも含めて、振り返り。

// mainとtestをそれぞれビルドするために、javaプラグインを指定
apply plugin: 'java'

// warへのパッケージングのための、warプラグインを指定
apply plugin: 'war'

// 実行可能クラスの指定、実行可能mainメソッドを持つクラスの指定にはapplicationプラグインを指定
apply plugin: 'application'
// 実行対象クラスを指定する
mainClassName = 'kentfordevgithub.helloworld.HelloWorld'

version = '0.0.1-SNAPSHOT'
sourceCompatibility = 10
targetCompatibility = 10

// 使用するリポジトリ指定
repositories {
    // Mavenリポジトリを使用
    mavenCentral()
}

dependencies {
    // JUnit
    // https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api
    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.2.0'
    // https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine
    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.2.0'
    // https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params
    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-params', version: '5.2.0'
}

// Gradleでのテスト実行時 設定
test {
    // Junit5をGradleで動かすための設定、Gradle4.6からJunit5をGradleがネイティブサポートしたため記述できる
    useJUnitPlatform()
    // テストの並行実行 スレッド数(同時実行数)を設定(テストクラス毎に1スレッドずつ)
    maxParallelForks = 4
}

// 各IDEに対応するためにIDEのプラグインを指定
apply plugin: 'eclipse'
apply plugin: 'idea'

// codecov用にjacocoプラグインを指定
apply plugin: 'jacoco'

jacoco {
    // バージョン情報は http://www.eclemma.org/jacoco/ を参照
    toolVersion = "0.8.1"
}

jacocoTestReport {
    reports {
        xml.enabled = true
        html.enabled = true
    }
}

// gradle buildを実行した際に、Jacocoでのカバレッジ測定も実行する
build.dependsOn jacocoTestReport

wercker.ymlに、Codecovへカバレッジ送信するための記述を追加

  1. buildブロックに下記を追加。

    • Gradleでのビルド後に、カバレッジ測定結果をCodecovに送信するコマンドの追加
    • $CODECOV_TOKENはCodecovで上述に表示されていたトークンを参照するための、環境変数
    • 環境変数名は、他に任意の環境変数名が良ければ、変えても良い
    - script:
        name: post coverage to codecov
        code: |
          bash <(curl -s https://codecov.io/bash) -t $CODECOV_TOKEN
    
  2. Werckerのビルドフェーズの環境変数に、Codecovのトークンを追加する

    1. Werckerの対象のアプリケーション画面を開く
    2. Workflowsタブを開く
    3. Pipelinesのbuildを開く
      • buildだけで環境変数を利用するようにするため
      • 環境変数を使用する範囲を最小限にするため、全体のフローには設定しない
    4. <> Environment タブを開く
    5. Keyに上述の環境変数名である CODECOV_TOKEN を入力する
      • 他に任意の環境変数名にしてたら、その名前にする
    6. Valueにトークンを入力する
    7. Protectedにチェックを入れる
      • Werckerのブラウザページ上からは値が確認できなくなる
      • wercker.ymlによるstep実行中にこの環境変数を表示に出力するがあった場合、step実行エラーとなる
    8. Addボタンをクリックして追加を完了

wercker.yml全体

今までの積み上げも含めて、振り返り。

# This references an OpenJDK container from the
# Docker Hub https://hub.docker.com/_/openjdk/
# Read more about containers on our dev center
# http://devcenter.wercker.com/docs/containers/index.html
box: openjdk:10.0.1-jdk

# defining the dev pipeline
dev:
  steps:
    # A step that executes `gradle bootRun` command
    - script:
      name: run gradle
      code: |
        ./gradlew bootRun

# Build definition
build:
  # The steps that will be executed on build
  steps:
    # A step that executes `gradle build` command
    - script:
        name: run gradle
        code: |
          ./gradlew --full-stacktrace -q --project-cache-dir=$WERCKER_CACHE_DIR build
    - script:
        name: post coverage to codecov
        code: |
          bash <(curl -s https://codecov.io/bash) -t $CODECOV_TOKEN

codecov.ymlを作成し、カバレッジ測定結果のOK条件を記載

  1. リポジトリのルートディレクトリにcodecov.ymlを作成
  2. 下記を記述する。

    • しきい値などはRxJavaで設定されているものを参考にした
    • なにか狙いがあれば、仕様書を参考に設定する
    • target、threasholdの値をもとに、カバレッジ測定結果が下回るようなら、NGとして扱われる
    codecov:
      notify:
        require_ci_to_pass: yes
    
    coverage:
      status:
        project:
          default:
            target: 95%
            threshold: 1%
    
        patch:
          default:
            target: 95%
            threshold: 1%
    
        changes: no
    

追加内容をコミットし、Werckerのビルドを動かす

  1. 追加分をコミットし、プッシュする
  2. 以前の記事でWerckerへの自動ビルド、自動テストは連携されているはずなので、Codecovへのカバレッジ測定結果送信も動く

Codecovへのカバレッジ送信を確認

  1. Codecovの対象リポジトリの画面で、上記でコミットした際のカバレッジ測定結果が追加されている
  2. 詳細を開けば、結果がグラフなどで参照できる

GitHubリポジトリでCodecovのチェックを強制し、カバレッジ測定結果がNGの場合マージを拒否する

  1. GutHubリポジトリのSettingsを開く
  2. Branchesを開く
  3. masterブランチを選択して開く
  4. Require status checks to pass before mergingの下記にチェックを入れる
    • codecov/patch
    • codecov/project
  5. 以降のmasterへのプルリクエストはCodecovの結果がOKにならないとマージできない

Codecovからのチェック結果の送信が遅い場合

WerckerのWorflow実行結果は即反映されるが、Codecovからのチェック結果が反映されるのはしばらく時間がかかる。その場合、Codecovのコミット詳細画面のBuildタブから通知を手動で実行することができる。

Codecovのバッジを取得

  1. Setting画面からバッジを表示するリンクを取得できる
  2. README.mdに記載するなどで、カバレッジ測定結果をリポジトリのトップに表示したりする
mediado
私たちメディアドゥは、電子書籍を読者に届けるために「テクノロジー」で「出版社」と「電子書店」を繋ぎ、その先にいる作家と読者を繋げる「電子書籍取次」事業を展開しております。業界最多のコンテンツラインナップとともに最新のテクノロジーを駆使した各種ソリューションを出版社や電子書店に提供し、グローバル且つマルチコンテンツ配信プラットフォームを目指しています。
https://mediado.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away