15
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

MicroAd (マイクロアド)Advent Calendar 2020

Day 2

GitHub Actionsでテスト、lint、カバレッジ計測

Last updated at Posted at 2020-12-01

この記事はMicroAd (マイクロアド) Advent Calendar 2020 - Qiitaの2日目の記事です。


やること

GitHub ActionsJava/Kotlin製ライブラリ(ビルドツールはgradle)のCI環境を構築します。
具体的には、以下2項目を行います。

  • PRを出した際にテストとlintを走らせる
  • カバレッジを計測する

サンプルプロジェクトの内容

サンプルコードには以下の加算コードとそのテストコードなどが含まれています。

プロダクションコード
package com.wrongwrong

fun myAdd(a: Double, b: Double) = a + b

コード全体は以下で公開しています。

テンプレートについて

ワークフローの基本的なテンプレートはhttps://github.com/${ユーザー}/${リポジトリ}/actions/newに公開されているため、基本的にこれをコピペする形で話を進めます。

PRを出した際にテストとlintを走らせる

テストとlint./gradlewから呼び出す形で実行するのが簡単です。

テストを走らせる

まずテストを走らせてみます。
Java with Gradleテンプレートを参考に、${プロジェクトルート}/.github/workflows/ci.ymlを追加します。
image.png

内容に関しては、run: ./gradlew testでテストを呼び出していることが分かれば一旦大丈夫だと思います。

ci.yml
# This workflow will build a Java project with Gradle
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle

name: Test with Gradle

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - name: Set up JDK 1.8
        uses: actions/setup-java@v1
        with:
          java-version: 1.8
      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
      - name: Test with Gradle
        run: ./gradlew test

これによりテストが走るようになりました。
image.png

lintを走らせる

次にlintを走らせます。
lintktlint gradle plugin(org.jlleitschuh.gradle.ktlint)を用いて行います。

build.gradle.kts(抜粋)
plugins {
    kotlin("jvm") version "1.4.10"
    id("org.jlleitschuh.gradle.ktlint") version "9.4.1" // 追加
}

ワークフロー設定は、run: ./gradlew ktlintするだけで行えます。
今回はテストの前にlintを走らせる形としました。

ci.yml(抜粋)
        run: chmod +x gradlew
      # 下2行を追記
      - name: ktlint check
        run: ./gradlew ktlintCheck
      - name: Test with Gradle
        run: ./gradlew test

試しにlintが引っかかる状態で実行した結果が以下です。
ktlint checkが追加され、失敗しています。
image.png

バッジを表示する

テストやlintが出来たので、READMEにそのステータスバッジを出します。
バッジは当該ワークフローからCreate status budgeすれば取得できます。
image.png
image.png

2. カバレッジを計測する

続いてテストのカバレッジを計測します。
今回はJaCoCoで生成したカバレッジファイルをCodecovにアップロードする形でこれを行います。

JaCoCo関連の設定

まずJaCoCo関連の設定を追加します。
詳しい説明は以前書いた記事の中で説明したためここでは省略します。

build.gradle.kts(JaCoCo関連の抜粋)
/* 略 */

plugins {

    /* 略 */

    id("jacoco")
}

/* 略 */

tasks {

    /* 略 */

    jacocoTestReport {
        reports {
            xml.isEnabled = true
            csv.isEnabled = false
            html.isEnabled = true
        }
    }
    test {
        useJUnitPlatform()
        // テスト終了時にjacocoのレポートを生成する
        finalizedBy(jacocoTestReport)
    }
}

ローカルで./gradlew testした際に${プロジェクトルート}/build/reports/jacoco/にテストレポートが吐き出されていればJaCoCo関連の設定は完了です。

Codecovのセットアップ

Codecovのセットアップに関しても、以前書いた記事の中で詳しく説明したためここでは省略します。
Repository Upload Tokenが取得できれば完了です。

GitHub Actionsの設定

Repository Upload TokenをリポジトリのSecretsに追加

リポジトリのSettings -> Secrets -> New repository secretに先ほど生成したRepository Upload Tokenを設定します。
image.png

キーの名前は後述するワークフローの設定で参照できれば何でもよいと思いますが、今回はCODECOV_TOKENとします。
image.png

ワークフローの設定

以下4行を追加することでアップロードが行われるようになります。

ci.yml(抜粋)
        run: chmod +x gradlew
      - name: ktlint check
        run: ./gradlew ktlintCheck
      - name: Test with Gradle
        run: ./gradlew test
      # 下4行を追記
      - name: upload coverage
        uses: codecov/codecov-action@v1
        with:
          token: ${{ secrets.CODECOV_TOKEN }}

この状態でPRを作成することで、codecov関係が動くようになりました。
image.png

結果は以下のように確認できます。
image.png

テスト無しで関数を1つ追加した様子が以下です。
カバレッジが落ちていることが確認できます。
image.png

終わりに

GitHub ActionsJava/Kotlin製ライブラリ(ビルドツールはgradle)のCI環境を構築してみました。

感想としては「連携等で必要な操作も最低限で超簡単だしマジぱねえ」という感じです。
個人開発に関してはCircle CIからの乗り換えを決断しました。

仕事で使っているGitHub Enterpriseについては記事執筆時点(11/24)でActionsがまだ来ていませんが、2020中に来る来るという話なので、今から楽しみにしています。

明日は@yassan168によるHadoopネタの記事です。

参考にさせて頂いた記事

15
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?