feat(ci): add kover for test coverage reporting (#3041)

Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
pull/2900/merge
James Rich 2025-09-10 10:30:47 -05:00 zatwierdzone przez GitHub
rodzic 72c5284e2e
commit 0659d38438
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: B5690EEEBB952194
9 zmienionych plików z 69 dodań i 9 usunięć

Wyświetl plik

@ -34,7 +34,7 @@ jobs:
# upload_artifacts defaults to true, so no need to explicitly set # upload_artifacts defaults to true, so no need to explicitly set
secrets: secrets:
GRADLE_ENCRYPTION_KEY: ${{ secrets.GRADLE_ENCRYPTION_KEY }} GRADLE_ENCRYPTION_KEY: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
check-workflow-status: check-workflow-status:
name: Check Workflow Status name: Check Workflow Status
runs-on: ubuntu-latest runs-on: ubuntu-latest

Wyświetl plik

@ -9,6 +9,8 @@ on:
required: false required: false
DATADOG_CLIENT_TOKEN: DATADOG_CLIENT_TOKEN:
required: false required: false
CODECOV_TOKEN:
required: false
inputs: inputs:
upload_artifacts: upload_artifacts:
description: 'Whether to upload build and Detekt artifacts' description: 'Whether to upload build and Detekt artifacts'
@ -67,9 +69,17 @@ jobs:
echo "datadogApplicationId=$DATADOG_APPLICATION_ID" >> ./secrets.properties echo "datadogApplicationId=$DATADOG_APPLICATION_ID" >> ./secrets.properties
echo "datadogClientToken=$DATADOG_CLIENT_TOKEN" >> ./secrets.properties echo "datadogClientToken=$DATADOG_CLIENT_TOKEN" >> ./secrets.properties
- name: Run Spotless, Detekt, Build, Lint, and Local Tests - name: Run Spotless, Detekt, Build, Lint, and Local Tests
run: ./gradlew :app:spotlessCheck :app:detekt :app:lintFdroidDebug :app:lintGoogleDebug :app:assembleDebug :app:testFdroidDebug :app:testGoogleDebug --configuration-cache --scan run: ./gradlew :app:spotlessCheck :app:detekt :app:lintFdroidDebug :app:lintGoogleDebug :app:assembleDebug koverXmlReport --configuration-cache --scan
env: env:
VERSION_CODE: ${{ env.VERSION_CODE }} VERSION_CODE: ${{ env.VERSION_CODE }}
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
slug: meshtastic/Meshtastic-Android
files: app/build/reports/kover/xml/report.xml
- name: Upload F-Droid debug artifact - name: Upload F-Droid debug artifact
if: ${{ inputs.upload_artifacts }} if: ${{ inputs.upload_artifacts }}
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4

Wyświetl plik

@ -70,4 +70,4 @@ jobs:
with: with:
name: android-test-reports-api-${{ matrix.api-level }} name: android-test-reports-api-${{ matrix.api-level }}
path: app/build/outputs/androidTest-results/ path: app/build/outputs/androidTest-results/
retention-days: 14 retention-days: 14

Wyświetl plik

@ -5,6 +5,7 @@
![GitHub all releases](https://img.shields.io/github/downloads/meshtastic/meshtastic-android/total) ![GitHub all releases](https://img.shields.io/github/downloads/meshtastic/meshtastic-android/total)
[![Android CI](https://github.com/meshtastic/Meshtastic-Android/actions/workflows/pull-request.yml/badge.svg?branch=main)](https://github.com/meshtastic/Meshtastic-Android/actions/workflows/pull-request.yml) [![Android CI](https://github.com/meshtastic/Meshtastic-Android/actions/workflows/pull-request.yml/badge.svg?branch=main)](https://github.com/meshtastic/Meshtastic-Android/actions/workflows/pull-request.yml)
[![codecov](https://codecov.io/gh/meshtastic/Meshtastic-Android/graph/badge.svg)](https://codecov.io/gh/meshtastic/Meshtastic-Android)
[![Crowdin](https://badges.crowdin.net/e/f440f1a5e094a5858dd86deb1adfe83d/localized.svg)](https://crowdin.meshtastic.org/android) [![Crowdin](https://badges.crowdin.net/e/f440f1a5e094a5858dd86deb1adfe83d/localized.svg)](https://crowdin.meshtastic.org/android)
[![CLA assistant](https://cla-assistant.io/readme/badge/meshtastic/Meshtastic-Android)](https://cla-assistant.io/meshtastic/Meshtastic-Android) [![CLA assistant](https://cla-assistant.io/readme/badge/meshtastic/Meshtastic-Android)](https://cla-assistant.io/meshtastic/Meshtastic-Android)
[![Fiscal Contributors](https://opencollective.com/meshtastic/tiers/badge.svg?label=Fiscal%20Contributors&color=deeppink)](https://opencollective.com/meshtastic/) [![Fiscal Contributors](https://opencollective.com/meshtastic/tiers/badge.svg?label=Fiscal%20Contributors&color=deeppink)](https://opencollective.com/meshtastic/)

Wyświetl plik

@ -34,6 +34,7 @@ plugins {
alias(libs.plugins.secrets) alias(libs.plugins.secrets)
alias(libs.plugins.spotless) alias(libs.plugins.spotless)
alias(libs.plugins.dokka) alias(libs.plugins.dokka)
alias(libs.plugins.kover)
} }
val keystorePropertiesFile = rootProject.file("keystore.properties") val keystorePropertiesFile = rootProject.file("keystore.properties")
@ -62,12 +63,18 @@ android {
minSdk = Configs.MIN_SDK minSdk = Configs.MIN_SDK
targetSdk = Configs.TARGET_SDK targetSdk = Configs.TARGET_SDK
// Prioritize injected props, then ENV, then fallback to git commit count // Prioritize injected props, then ENV, then fallback to git commit count
versionCode = (project.findProperty("android.injected.version.code")?.toString()?.toInt() versionCode =
?: System.getenv("VERSION_CODE")?.toInt() (
?: gitVersionProvider.get().toInt()) project.findProperty("android.injected.version.code")?.toString()?.toInt()
versionName = (project.findProperty("android.injected.version.name")?.toString() ?: System.getenv("VERSION_CODE")?.toInt()
?: System.getenv("VERSION_NAME") ?: gitVersionProvider.get().toInt()
?: Configs.VERSION_NAME_BASE) )
versionName =
(
project.findProperty("android.injected.version.name")?.toString()
?: System.getenv("VERSION_NAME")
?: Configs.VERSION_NAME_BASE
)
testInstrumentationRunner = "com.geeksville.mesh.TestRunner" testInstrumentationRunner = "com.geeksville.mesh.TestRunner"
buildConfigField("String", "MIN_FW_VERSION", "\"${Configs.MIN_FW_VERSION}\"") buildConfigField("String", "MIN_FW_VERSION", "\"${Configs.MIN_FW_VERSION}\"")
buildConfigField("String", "ABS_MIN_FW_VERSION", "\"${Configs.ABS_MIN_FW_VERSION}\"") buildConfigField("String", "ABS_MIN_FW_VERSION", "\"${Configs.ABS_MIN_FW_VERSION}\"")

Wyświetl plik

@ -31,6 +31,44 @@ plugins {
alias(libs.plugins.protobuf) apply false alias(libs.plugins.protobuf) apply false
alias(libs.plugins.secrets) apply false alias(libs.plugins.secrets) apply false
alias(libs.plugins.dokka) apply false alias(libs.plugins.dokka) apply false
alias(libs.plugins.kover)
}
kover {
reports {
total {
filters {
excludes {
// Exclude generated classes
classes("*_Impl")
classes("*Binding")
classes("*Factory")
classes("*.BuildConfig")
classes("*.R")
classes("*.R$*")
// Exclude UI components
annotatedBy("*Preview")
// Exclude declarations
annotatedBy(
"*.HiltAndroidApp",
"*.AndroidEntryPoint",
"*.Module",
"*.Provides",
"*.Binds",
"*.Composable",
)
}
}
}
}
}
dependencies {
kover(project(":app"))
kover(project(":network"))
kover(project(":mesh_service_example"))
} }
tasks.register<Delete>("clean") { tasks.register<Delete>("clean") {

Wyświetl plik

@ -31,6 +31,7 @@ kotlin = "2.2.20"
kotlinx-collections-immutable = "0.4.0" kotlinx-collections-immutable = "0.4.0"
kotlinx-coroutines-android = "1.10.2" kotlinx-coroutines-android = "1.10.2"
kotlinx-serialization-json = "1.9.0" kotlinx-serialization-json = "1.9.0"
kover = "0.9.1"
lifecycle = "2.9.3" lifecycle = "2.9.3"
location-services = "21.3.0" location-services = "21.3.0"
maps-compose = "6.10.0" maps-compose = "6.10.0"
@ -229,6 +230,7 @@ kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" } kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" }
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
kover = { id = "org.jetbrains.kotlinx.kover", version.ref = "kover" }
protobuf = { id = "com.google.protobuf", version.ref = "protobuf-gradle-plugin" } protobuf = { id = "com.google.protobuf", version.ref = "protobuf-gradle-plugin" }
secrets = { id = "com.google.android.libraries.mapsplatform.secrets-gradle-plugin", version.ref = "secrets-gradle-plugin" } secrets = { id = "com.google.android.libraries.mapsplatform.secrets-gradle-plugin", version.ref = "secrets-gradle-plugin" }
spotless = { id = "com.diffplug.spotless", version .ref= "spotless" } spotless = { id = "com.diffplug.spotless", version .ref= "spotless" }

Wyświetl plik

@ -23,6 +23,7 @@ plugins {
alias(libs.plugins.compose) alias(libs.plugins.compose)
alias(libs.plugins.protobuf) alias(libs.plugins.protobuf)
alias(libs.plugins.detekt) alias(libs.plugins.detekt)
alias(libs.plugins.kover)
} }
android { android {

Wyświetl plik

@ -25,6 +25,7 @@ plugins {
alias(libs.plugins.detekt) alias(libs.plugins.detekt)
id("kotlinx-serialization") id("kotlinx-serialization")
alias(libs.plugins.dokka) alias(libs.plugins.dokka)
alias(libs.plugins.kover)
} }
android { android {