diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f0670c2e5..fe8f209d8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -151,10 +151,15 @@ jobs: token: ${{ secrets.CODECOV_TOKEN }} flags: backend-python-${{ matrix.python-version }} files: coverage.xml - - name: SonarQube Scan - uses: SonarSource/sonarqube-scan-action@v5 - env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + - name: Upload coverage artifacts + uses: actions/upload-artifact@v4 + if: always() + with: + name: backend-coverage-${{ matrix.python-version }} + path: | + .coverage + coverage.xml + retention-days: 1 - name: Stop containers if: always() run: | @@ -237,10 +242,13 @@ jobs: token: ${{ secrets.CODECOV_TOKEN }} flags: frontend-node-${{ matrix.node-version }} directory: src-ui/coverage/ - - name: SonarQube Scan - uses: SonarSource/sonarqube-scan-action@v5 - env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + - name: Upload coverage artifacts + uses: actions/upload-artifact@v4 + if: always() + with: + name: frontend-coverage-${{ matrix.shard-index }} + path: src-ui/coverage/coverage-final.json + retention-days: 1 tests-frontend-e2e: name: "Frontend E2E Tests (Node ${{ matrix.node-version }} - ${{ matrix.shard-index }}/${{ matrix.shard-count }})" runs-on: ubuntu-24.04 @@ -321,6 +329,52 @@ jobs: env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} run: cd src-ui && pnpm run build --configuration=production + sonarqube-analysis: + name: "SonarQube Analysis" + runs-on: ubuntu-24.04 + needs: + - tests-backend + - tests-frontend + if: github.repository_owner == 'paperless-ngx' + steps: + - name: Checkout + uses: actions/checkout@v5 + with: + fetch-depth: 0 + - name: Download all backend coverage + uses: actions/download-artifact@v4 + with: + pattern: backend-coverage-* + path: ./coverage/ + - name: Download all frontend coverage + uses: actions/download-artifact@v4 + with: + pattern: frontend-coverage-* + path: ./coverage/ + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ env.DEFAULT_PYTHON_VERSION }} + - name: Install coverage tools + run: | + pip install coverage + npm install -g nyc + # Merge backend coverage from all Python versions + - name: Merge backend coverage + run: | + coverage combine coverage/backend-coverage-*/.coverage + coverage xml -o merged-backend-coverage.xml + # Merge frontend coverage from all shards + - name: Merge frontend coverage + run: | + # Merge all coverage-final.json files + npx nyc merge coverage/frontend-coverage-*/ merged-frontend.json + # Generate LCOV from merged data + npx nyc report --reporter=lcov --temp-dir ./ --report-dir ./ + - name: SonarQube Analysis + uses: SonarSource/sonarqube-scan-action@v5 + env: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} build-docker-image: name: Build Docker image for ${{ github.ref_name }} runs-on: ubuntu-24.04 diff --git a/sonar-project.properties b/sonar-project.properties index 34c4a1208..4e9d1fe5c 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,13 +1,25 @@ sonar.projectKey=paperless-ngx_paperless-ngx sonar.organization=paperless-ngx +sonar.projectName=Paperless-ngx +sonar.projectVersion=1.0 +# Source and test directories +sonar.sources=src/,src-ui/src/ +sonar.tests=src/,src-ui/src/ +sonar.test.inclusions=**/test_*.py,**/tests.py,**/*.spec.ts,**/*.test.ts -# This is the name and version displayed in the SonarCloud UI. -sonar.projectName=paperless-ngx -#sonar.projectVersion=1.0 +# Language specific settings +sonar.python.version=3.10,3.11,3.12,3.13 -# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. -sonar.sources=. -sonar.python.coverage.reportPaths=coverage.xml -sonar.python.version=3.10, 3.11, 3.12, 3.13 -sonar.javascript.lcov.reportPaths=./coverage/lcov.info +# Coverage reports +sonar.python.coverage.reportPaths=merged-backend-coverage.xml +sonar.javascript.lcov.reportPaths=lcov.info + +# Test execution reports +sonar.junit.reportPaths=**/junit.xml,**/test-results.xml + +# Encoding +sonar.sourceEncoding=UTF-8 + +# Exclusions +sonar.exclusions=**/migrations/**,**/node_modules/**,**/static/**,**/venv/**,**/.venv/**,**/dist/**