# 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 }}