Fix syntax error #16
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: SonarCloud Analysis | |
| on: | |
| push: | |
| branches: | |
| - '*' | |
| pull_request: | |
| branches: | |
| - '*' | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| sonarcloud: | |
| name: SonarCloud Scan | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Enable KVM group perms | |
| run: | | |
| echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules | |
| sudo udevadm control --reload-rules | |
| sudo udevadm trigger --name-match=kvm | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 # Shallow clones should be disabled for better relevancy of analysis | |
| - name: Set up JDK 17 | |
| uses: actions/setup-java@v4 | |
| with: | |
| distribution: 'temurin' | |
| java-version: 17 | |
| cache: 'gradle' | |
| - name: Gradle cache | |
| uses: gradle/actions/setup-gradle@v3 | |
| - name: Build project and run tests with coverage | |
| run: | | |
| # Build the project | |
| ./gradlew assembleDebug --stacktrace | |
| # Run tests with coverage - allow test failures | |
| ./gradlew testDebugUnitTest jacocoTestReport --stacktrace | |
| TEST_RESULT=$? | |
| if [ $TEST_RESULT -ne 0 ]; then | |
| echo "Some tests failed, but continuing to check for coverage data..." | |
| # Even if tests fail, JaCoCo should generate a report with partial coverage | |
| # from the tests that did pass | |
| fi | |
| # Check if the report was generated with content | |
| if [ -f build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml ]; then | |
| # Use stat command compatible with both Linux and macOS | |
| if [[ "$(uname)" == "Darwin" ]]; then | |
| # macOS syntax | |
| REPORT_SIZE=$(stat -f%z build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml) | |
| else | |
| # Linux syntax | |
| REPORT_SIZE=$(stat -c%s build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml) | |
| fi | |
| if [ "$REPORT_SIZE" -lt 1000 ]; then | |
| echo "JaCoCo report is too small ($REPORT_SIZE bytes), likely empty. Trying to generate from test execution data..." | |
| # Try to generate the report directly from the exec file | |
| if [ -f build/jacoco/testDebugUnitTest.exec ]; then | |
| java -jar ~/.gradle/caches/modules-2/files-2.1/org.jacoco/org.jacoco.cli/0.8.8/*/org.jacoco.cli-0.8.8.jar report build/jacoco/testDebugUnitTest.exec \ | |
| --classfiles build/intermediates/runtime_library_classes_dir/debug \ | |
| --sourcefiles src/main/java \ | |
| --xml build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml | |
| # Check if the report was successfully generated | |
| if [[ "$(uname)" == "Darwin" ]]; then | |
| # macOS syntax | |
| NEW_REPORT_SIZE=$(stat -f%z build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml) | |
| else | |
| # Linux syntax | |
| NEW_REPORT_SIZE=$(stat -c%s build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml) | |
| fi | |
| if [ "$NEW_REPORT_SIZE" -lt 1000 ]; then | |
| echo "ERROR: Failed to generate a valid JaCoCo report with coverage data" | |
| exit 1 | |
| else | |
| echo "JaCoCo report successfully generated with size $NEW_REPORT_SIZE bytes" | |
| fi | |
| else | |
| echo "ERROR: No JaCoCo execution data file found. Tests may not have run correctly." | |
| exit 1 | |
| fi | |
| else | |
| echo "JaCoCo report generated successfully with size $REPORT_SIZE bytes" | |
| fi | |
| else | |
| echo "ERROR: JaCoCo report file not found. Coverage data is missing." | |
| exit 1 | |
| fi | |
| - name: Prepare class files for SonarQube analysis | |
| run: | | |
| echo "Searching for compiled class files..." | |
| # Create the target directory | |
| mkdir -p build/intermediates/runtime_library_classes_dir/debug | |
| # Find all directories containing class files | |
| CLASS_DIRS=$(find build -name "*.class" -type f -exec dirname {} \; | sort -u) | |
| if [ -z "$CLASS_DIRS" ]; then | |
| echo "WARNING: No class files found in the build directory!" | |
| else | |
| echo "Found class files in the following directories:" | |
| echo "$CLASS_DIRS" | |
| # Copy classes from the first directory with classes | |
| FIRST_CLASS_DIR=$(echo "$CLASS_DIRS" | head -1) | |
| echo "Copying classes from $FIRST_CLASS_DIR to build/intermediates/runtime_library_classes_dir/debug" | |
| cp -r $FIRST_CLASS_DIR/* build/intermediates/runtime_library_classes_dir/debug/ || echo "Failed to copy from $FIRST_CLASS_DIR" | |
| # Verify the target directory now has class files | |
| CLASS_COUNT=$(find build/intermediates/runtime_library_classes_dir/debug -name "*.class" | wc -l) | |
| echo "Target directory now contains $CLASS_COUNT class files" | |
| fi | |
| # Update sonar-project.properties with all found class directories as a fallback | |
| echo "\n# Additional binary paths found during build" >> sonar-project.properties | |
| echo "sonar.java.binaries=build/intermediates/runtime_library_classes_dir/debug,$CLASS_DIRS" >> sonar-project.properties | |
| echo "Checking for JaCoCo report files..." | |
| find build -name "*.xml" | grep jacoco || echo "No XML files found" | |
| find build -name "*.exec" | grep jacoco || echo "No exec files found" | |
| echo "Contents of JaCoCo report directory:" | |
| ls -la build/reports/jacoco/jacocoTestReport/ || echo "Directory not found" | |
| echo "\nChecking test execution results:" | |
| find build -name "TEST-*.xml" | xargs cat | grep -E 'tests|failures|errors|skipped' || echo "No test result files found" | |
| echo "\nChecking JaCoCo report content:" | |
| if [ -f build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml ]; then | |
| echo "Report file size: $(wc -c < build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml) bytes" | |
| echo "First 500 chars of report:" | |
| head -c 500 build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml | |
| echo "\n\nCounting coverage elements:" | |
| grep -c "<package" build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml || echo "No packages found" | |
| grep -c "<class" build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml || echo "No classes found" | |
| grep -c "<method" build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml || echo "No methods found" | |
| grep -c "<line" build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml || echo "No lines found" | |
| grep -c 'ci="1"' build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml || echo "No covered lines found" | |
| else | |
| echo "JaCoCo report file not found" | |
| fi | |
| echo "\nChecking binary directories specified in sonar-project.properties:" | |
| echo "build/intermediates/runtime_library_classes_dir/debug:" | |
| ls -la build/intermediates/runtime_library_classes_dir/debug || echo "Directory not found" | |
| echo "\nChecking all available class directories:" | |
| find build -path "*/build/*" -name "*.class" | head -n 5 || echo "No class files found" | |
| # Android instrumented test section for comprehensive coverage | |
| - name: AVD cache | |
| uses: actions/cache@v4 | |
| id: avd-cache | |
| with: | |
| path: | | |
| ~/.android/avd/* | |
| ~/.android/adb* | |
| key: avd-28 | |
| - name: Create AVD and generate snapshot for caching | |
| if: steps.avd-cache.outputs.cache-hit != 'true' | |
| uses: reactivecircus/android-emulator-runner@v2 | |
| with: | |
| api-level: 28 | |
| force-avd-creation: false | |
| emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none | |
| disable-animations: true | |
| script: echo "Generated AVD snapshot for caching." | |
| - name: Assemble debug AndroidTest | |
| run: ./gradlew assembleDebugAndroidTest | |
| - name: Run instrumented tests with coverage | |
| uses: reactivecircus/android-emulator-runner@v2 | |
| with: | |
| api-level: 28 | |
| profile: Galaxy Nexus | |
| script: | | |
| # Run instrumented tests with coverage - allow test failures | |
| # Use a more direct approach to ensure coverage is enabled | |
| ./gradlew assembleDebugAndroidTest | |
| # Run only a single test class with coverage explicitly enabled | |
| adb shell am instrument -w -e coverage true -e class tests.database.DatabaseInitializationTest io.split.android.android_client.test/androidx.test.runner.AndroidJUnitRunner | |
| TEST_RESULT=$? | |
| if [ $TEST_RESULT -ne 0 ]; then | |
| echo "Some instrumented tests failed, but continuing to check for coverage data..." | |
| fi | |
| # Create directory for coverage files | |
| mkdir -p build/outputs/code_coverage/debugAndroidTest/connected/ | |
| # Try to find and pull coverage files from various possible locations | |
| echo "Searching for coverage files..." | |
| # Check app-specific data directory | |
| adb shell run-as io.split.android.android_client find /data/data/io.split.android.android_client -name "*.ec" | while read -r file; do | |
| echo "Found coverage file: $file" | |
| filename=$(basename "$file") | |
| adb shell run-as io.split.android.android_client cat "$file" > "build/outputs/code_coverage/debugAndroidTest/connected/$filename" | |
| echo "Pulled coverage file to build/outputs/code_coverage/debugAndroidTest/connected/$filename" | |
| done | |
| # Also check sdcard location | |
| adb pull /sdcard/coverage.ec build/outputs/code_coverage/debugAndroidTest/connected/ || echo "No coverage file at /sdcard/coverage.ec" | |
| # List all coverage files to verify | |
| find build -name "*.ec" -o -name "*.exec" | |
| # Run the JaCoCo report task | |
| ./gradlew jacocoAndroidTestReport | |
| REPORT_RESULT=$? | |
| if [ $REPORT_RESULT -ne 0 ]; then | |
| echo "Failed to generate Android test coverage report, but continuing..." | |
| fi | |
| # Check if the Android test report was generated with content | |
| if [ -f build/reports/jacoco/jacocoAndroidTestReport/jacocoAndroidTestReport.xml ]; then | |
| # Use stat command compatible with both Linux and macOS | |
| if [[ "$(uname)" == "Darwin" ]]; then | |
| # macOS syntax | |
| REPORT_SIZE=$(stat -f%z build/reports/jacoco/jacocoAndroidTestReport/jacocoAndroidTestReport.xml) | |
| else | |
| # Linux syntax | |
| REPORT_SIZE=$(stat -c%s build/reports/jacoco/jacocoAndroidTestReport/jacocoAndroidTestReport.xml) | |
| fi | |
| echo "Android test JaCoCo report size: $REPORT_SIZE bytes" | |
| if [ "$REPORT_SIZE" -lt 1000 ]; then | |
| echo "WARNING: Android test JaCoCo report is too small, likely empty" | |
| else | |
| echo "Android test JaCoCo report generated successfully" | |
| fi | |
| else | |
| echo "WARNING: Android test JaCoCo report file not found" | |
| fi | |
| continue-on-error: true | |
| - name: Generate combined coverage report | |
| run: | | |
| # Generate combined report - allow failures | |
| ./gradlew jacocoCombinedReport || { | |
| echo "Failed to generate combined report, but continuing..." | |
| } | |
| # Check if the combined report was generated with content | |
| if [ -f build/reports/jacoco/jacocoCombinedReport/jacocoCombinedReport.xml ]; then | |
| # Use stat command compatible with both Linux and macOS | |
| if [[ "$(uname)" == "Darwin" ]]; then | |
| # macOS syntax | |
| REPORT_SIZE=$(stat -f%z build/reports/jacoco/jacocoCombinedReport/jacocoCombinedReport.xml) | |
| else | |
| # Linux syntax | |
| REPORT_SIZE=$(stat -c%s build/reports/jacoco/jacocoCombinedReport/jacocoCombinedReport.xml) | |
| fi | |
| echo "Combined JaCoCo report size: $REPORT_SIZE bytes" | |
| if [ "$REPORT_SIZE" -lt 1000 ]; then | |
| echo "WARNING: Combined JaCoCo report is too small, likely empty" | |
| # Try to manually combine the reports | |
| mkdir -p build/reports/jacoco/jacocoCombinedReport/ | |
| cp build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml build/reports/jacoco/jacocoCombinedReport/jacocoCombinedReport.xml | |
| else | |
| echo "Combined JaCoCo report generated successfully" | |
| fi | |
| else | |
| echo "WARNING: Combined JaCoCo report file not found, using unit test report as fallback" | |
| mkdir -p build/reports/jacoco/jacocoCombinedReport/ | |
| cp build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml build/reports/jacoco/jacocoCombinedReport/jacocoCombinedReport.xml | |
| fi | |
| continue-on-error: true | |
| - name: Check combined coverage report | |
| run: | | |
| echo "Checking for all coverage data files:" | |
| find build -name "*.exec" -o -name "*.ec" | sort | |
| echo "\nChecking combined JaCoCo report content:" | |
| if [ -f build/reports/jacoco/jacocoCombinedReport/jacocoCombinedReport.xml ]; then | |
| echo "Report file size: $(wc -c < build/reports/jacoco/jacocoCombinedReport/jacocoCombinedReport.xml) bytes" | |
| echo "First 500 chars of report:" | |
| head -c 500 build/reports/jacoco/jacocoCombinedReport/jacocoCombinedReport.xml | |
| echo "\n\nCounting coverage elements:" | |
| grep -c "<package" build/reports/jacoco/jacocoCombinedReport/jacocoCombinedReport.xml || echo "No packages found" | |
| grep -c "<class" build/reports/jacoco/jacocoCombinedReport/jacocoCombinedReport.xml || echo "No classes found" | |
| grep -c "<method" build/reports/jacoco/jacocoCombinedReport/jacocoCombinedReport.xml || echo "No methods found" | |
| grep -c "<line" build/reports/jacoco/jacocoCombinedReport/jacocoCombinedReport.xml || echo "No lines found" | |
| grep -c 'ci="1"' build/reports/jacoco/jacocoCombinedReport/jacocoCombinedReport.xml || echo "No covered lines found" | |
| else | |
| echo "Combined JaCoCo report file not found" | |
| fi | |
| - name: SonarCloud Scan | |
| uses: SonarSource/sonarqube-scan-action@v5 | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information | |
| SONAR_TOKEN: ${{ secrets.SONARQUBE_TOKEN }} | |
| SONAR_HOST_URL: ${{ secrets.SONARQUBE_HOST }} |