name: "SonarCloud Analysis" on: workflow_dispatch: pull_request: types: - opened - reopened - synchronize - ready_for_review push: branches: [master] concurrency: group: "${{ github.workflow }}-${{ github.ref || github.run_id }}" cancel-in-progress: true jobs: sonarcloud-analysis: if: ${{ vars.SONAR_SCANNER_ENABLED }} runs-on: ubuntu-24.04-32-core-x64 container: symless/synergy-core:ubuntu-22.04-amd64 timeout-minutes: 20 env: SONAR_SCANNER_VERSION: 6.1.0.4477 SONAR_SCANNER_OPTS: -server SONAR_SCANNER_URL_BASE: https://binaries.sonarsource.com/Distribution/sonar-scanner-cli CPU_CORE_COUNT: 32 steps: - name: Checkout uses: actions/checkout@v4 with: submodules: "recursive" # Fetch all history for SonarScanner blame data fetch-depth: 0 - name: Config Git safe dir run: git config --global --add safe.directory $GITHUB_WORKSPACE - name: Install dependencies run: | ./scripts/install_deps.py --ci-env && apt install curl unzip -y && pip install gcovr - name: Install SonarScanner run: | export SONAR_SCANNER_HOME=$HOME/.sonar/sonar-scanner-$SONAR_SCANNER_VERSION-linux-x64 curl --create-dirs -sSLo $HOME/.sonar/sonar-scanner.zip \ $SONAR_SCANNER_URL_BASE/sonar-scanner-cli-$SONAR_SCANNER_VERSION-linux-x64.zip unzip -o $HOME/.sonar/sonar-scanner.zip -d $HOME/.sonar/ - name: Install build-wrapper run: | file="build-wrapper-linux-x86.zip" url="https://sonarcloud.io/static/cpp/$file" curl --create-dirs -sSLo $HOME/.sonar/$file $url unzip -o $HOME/.sonar/$file -d $HOME/.sonar/ - name: Configure run: cmake -B build --preset=linux-debug -DENABLE_COVERAGE=ON - name: Build run: | export PATH=$HOME/.sonar/build-wrapper-linux-x86:$PATH build-wrapper-linux-x86-64 --out-dir bw-output cmake --build build -j${CPU_CORE_COUNT} - name: Unit tests coverage env: QT_QPA_PLATFORM: offscreen run: cmake --build build --target coverage-unittests - name: Integration tests coverage env: QT_QPA_PLATFORM: offscreen run: | cmake --build build --target coverage-integtests result=$? if [ $result -ne 0 ]; then echo "::warning ::Integration tests failed with code: $result" fi continue-on-error: true - name: Get coverage report paths id: coverage-paths run: | unittests=$(find build -name coverage-unittests.xml) integtests=$(find build -name coverage-integtests.xml) paths="${unittests}${integtests:+,$integtests}" if [ -z "$paths" ]; then echo "Error: No coverage files found" exit 1 fi echo "csv=$paths" >> $GITHUB_OUTPUT - name: Run SonarScanner run: | export PATH=$HOME/.sonar/sonar-scanner-$SONAR_SCANNER_VERSION-linux-x64/bin:$PATH sonar-scanner \ -Dsonar.organization=symless \ -Dsonar.projectKey=symless_synergy-core \ -Dsonar.sources=scripts,src/cmd,src/gui,src/lib \ -Dsonar.tests=src/test \ -Dsonar.exclusions=ext/**,build/** \ -Dsonar.coverage.exclusions=ext/**,scripts/**,src/test/** \ -Dsonar.cpd.exclusions=**/*Test*.cpp \ -Dsonar.host.url=https://sonarcloud.io \ -Dsonar.coverageReportPaths=${{ steps.coverage-paths.outputs.csv }} \ -Dsonar.cfamily.compile-commands=build/compile_commands.json \ -Dsonar.cfamily.threads=${{ env.CPU_CORE_COUNT }} \ -Dsonar.python.version=3.10 env: SONAR_TOKEN: ${{secrets.SONAR_TOKEN}} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}