All checks were successful
PR Checks / android-build (pull_request) Successful in 10m44s
Fix the SonarQube coverage gate (0% on new code) — a reporting gap, not a testing gap: the JVM unit suite already exists but the source-only scan never received a coverage report. - app/build.gradle.kts: apply jacoco, enable debug unit-test coverage, add a jacocoTestReport task (excludes generated/Hilt/Compose-singleton classes) - sonar-project.properties: consume the JaCoCo XML; exclude pure-@Composable UI from coverage (JVM unit tests can't execute composable bodies) - .gitea/workflows/sonarqube.yml: run JDK 17 + Android SDK + `testDebugUnitTest jacocoTestReport` before the scan Also clear the three actionable code smells: remove an unused import (AdminContentScreen), remove an unused parameter (AdminSupportScreen. RespondDialog), and decompose LoginViewModel.submit() (cognitive complexity 20 -> under 15). The remaining 12 smells (snake_case DTO fields that mirror the JSON wire contract; Compose/nav complexity) are marked Won't Fix in SonarQube with rationale. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NgyHnrNa8WwG3doxvxjuCr
91 lines
3.8 KiB
YAML
91 lines
3.8 KiB
YAML
# Run SonarQube static analysis against the code that just landed on `main` and
|
|
# report the results to the self-hosted SonarQube server for review. This is
|
|
# intentionally NON-BLOCKING: it triggers on push to main (i.e. AFTER merge),
|
|
# not on pull_request, so it never gates a PR. It complements pr-checks.yml
|
|
# (which gates PRs) and release.yml (which ships the APK) — this one only feeds
|
|
# the dashboard.
|
|
#
|
|
# Prerequisites (one-time, in the Gitea UI — Repo → Settings → Actions):
|
|
# • Secret SONAR_TOKEN — a SonarQube "Analysis" token generated at
|
|
# My Account → Security in SonarQube for the
|
|
# Runic-Gateway-Android-app project (or a global one).
|
|
# • Variable SONAR_HOST_URL — the SonarQube base URL on your LAN, e.g.
|
|
# http://192.168.0.56:9000
|
|
# (kept as a variable, not committed, so the internal address stays out of git.)
|
|
#
|
|
# The runner (self-hosted `ubuntu-latest`, same as the other workflows) must be
|
|
# able to reach SONAR_HOST_URL on your network. Nothing here waits on the
|
|
# SonarQube Quality Gate, so a failing gate does not fail this job — check the
|
|
# dashboard when you want to.
|
|
#
|
|
# Scope: the Sonar scanner reads sonar-project.properties and analyses the Kotlin
|
|
# source directly. Before the scan we run the JVM unit tests + JaCoCo so SonarQube
|
|
# receives real coverage (sonar.coverage.jacoco.xmlReportPaths) — otherwise it
|
|
# reports 0% and the coverage gate fails despite the test suite existing. That
|
|
# Gradle step needs JDK 17 + the Android SDK (same toolchain as pr-checks.yml);
|
|
# the runner container is bare, so base tools are apt-installed first.
|
|
|
|
name: SonarQube
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
# Allow re-running the analysis on demand from the Actions tab.
|
|
workflow_dispatch: {}
|
|
|
|
concurrency:
|
|
group: sonarqube-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
analysis:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
# The bare runner container lacks git/curl/unzip (checkout + sdkmanager need
|
|
# them) and we install JDK 17 from the Ubuntu archive rather than
|
|
# actions/setup-java (this runner can't reach api.adoptium.net). Mirrors
|
|
# pr-checks.yml — see its header note.
|
|
- name: Install base tools + JDK 17
|
|
run: |
|
|
apt-get update
|
|
apt-get install -y git curl unzip openjdk-17-jdk-headless
|
|
echo "JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64" >> "$GITHUB_ENV"
|
|
|
|
- name: Check out (full history for accurate new-code + blame)
|
|
uses: actions/checkout@v4
|
|
with:
|
|
# SonarQube uses git history to attribute issues to authors and to
|
|
# compute "new code". A shallow clone degrades both.
|
|
fetch-depth: 0
|
|
|
|
- name: Set up Android SDK
|
|
uses: android-actions/setup-android@v3
|
|
|
|
- name: Install Android SDK packages
|
|
run: |
|
|
set +o pipefail
|
|
yes | sdkmanager "platform-tools" "platforms;android-35" "build-tools;35.0.0"
|
|
|
|
- name: Cache Gradle
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: |
|
|
~/.gradle/caches
|
|
~/.gradle/wrapper
|
|
key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle.kts', 'gradle/libs.versions.toml', 'gradle/wrapper/gradle-wrapper.properties') }}
|
|
restore-keys: |
|
|
gradle-${{ runner.os }}-
|
|
|
|
# Produce the JaCoCo XML the scan reports as coverage. Scoped to the debug
|
|
# variant (matches enableUnitTestCoverage) to keep peak memory down.
|
|
- name: Unit tests + JaCoCo coverage
|
|
run: |
|
|
chmod +x ./gradlew
|
|
./gradlew --no-daemon testDebugUnitTest jacocoTestReport
|
|
|
|
- name: Run SonarQube scan
|
|
uses: sonarsource/sonarqube-scan-action@v4
|
|
env:
|
|
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
|
SONAR_HOST_URL: ${{ vars.SONAR_HOST_URL }}
|