mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-31 10:37:12 -04:00 
			
		
		
		
	Chore: Enable SonarQube scanning (#10904)
--------- Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									c8850fa752
								
							
						
					
					
						commit
						8d1f23e9d6
					
				
							
								
								
									
										91
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										91
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							| @ -151,6 +151,18 @@ jobs: | |||||||
|           token: ${{ secrets.CODECOV_TOKEN }} |           token: ${{ secrets.CODECOV_TOKEN }} | ||||||
|           flags: backend-python-${{ matrix.python-version }} |           flags: backend-python-${{ matrix.python-version }} | ||||||
|           files: coverage.xml |           files: coverage.xml | ||||||
|  |       - name: Upload coverage artifacts | ||||||
|  |         uses: actions/upload-artifact@v4 | ||||||
|  |         if: always() | ||||||
|  |         with: | ||||||
|  |           name: backend-coverage-${{ matrix.python-version }} | ||||||
|  |           path: | | ||||||
|  |             .coverage | ||||||
|  |             coverage.xml | ||||||
|  |             junit.xml | ||||||
|  |           retention-days: 1 | ||||||
|  |           include-hidden-files: true | ||||||
|  |           if-no-files-found: error | ||||||
|       - name: Stop containers |       - name: Stop containers | ||||||
|         if: always() |         if: always() | ||||||
|         run: | |         run: | | ||||||
| @ -233,6 +245,17 @@ jobs: | |||||||
|           token: ${{ secrets.CODECOV_TOKEN }} |           token: ${{ secrets.CODECOV_TOKEN }} | ||||||
|           flags: frontend-node-${{ matrix.node-version }} |           flags: frontend-node-${{ matrix.node-version }} | ||||||
|           directory: src-ui/coverage/ |           directory: src-ui/coverage/ | ||||||
|  |       - name: Upload coverage artifacts | ||||||
|  |         uses: actions/upload-artifact@v4 | ||||||
|  |         if: always() | ||||||
|  |         with: | ||||||
|  |           name: frontend-coverage-${{ matrix.shard-index }} | ||||||
|  |           path: | | ||||||
|  |             src-ui/coverage/lcov.info | ||||||
|  |             src-ui/coverage/coverage-final.json | ||||||
|  |             src-ui/junit.xml | ||||||
|  |           retention-days: 1 | ||||||
|  |           if-no-files-found: error | ||||||
|   tests-frontend-e2e: |   tests-frontend-e2e: | ||||||
|     name: "Frontend E2E Tests (Node ${{ matrix.node-version }} - ${{ matrix.shard-index }}/${{ matrix.shard-count }})" |     name: "Frontend E2E Tests (Node ${{ matrix.node-version }} - ${{ matrix.shard-index }}/${{ matrix.shard-count }})" | ||||||
|     runs-on: ubuntu-24.04 |     runs-on: ubuntu-24.04 | ||||||
| @ -313,6 +336,74 @@ jobs: | |||||||
|         env: |         env: | ||||||
|           CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} |           CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | ||||||
|         run: cd src-ui && pnpm run build --configuration=production |         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@v5.0.0 | ||||||
|  |         with: | ||||||
|  |           pattern: backend-coverage-* | ||||||
|  |           path: ./coverage/ | ||||||
|  |       - name: Download all frontend coverage | ||||||
|  |         uses: actions/download-artifact@v5.0.0 | ||||||
|  |         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: | | ||||||
|  |           # Find all coverage-final.json files from the shards, exit with error if none found | ||||||
|  |           shopt -s nullglob | ||||||
|  |           files=(coverage/frontend-coverage-*/coverage/coverage-final.json) | ||||||
|  |           if [ ${#files[@]} -eq 0 ]; then | ||||||
|  |             echo "No frontend coverage JSON found under coverage/" >&2 | ||||||
|  |             exit 1 | ||||||
|  |           fi | ||||||
|  |           # Create .nyc_output directory and copy each shard's coverage JSON into it with a unique name | ||||||
|  |           mkdir -p .nyc_output | ||||||
|  |           for coverage_json in "${files[@]}"; do | ||||||
|  |             shard=$(basename "$(dirname "$(dirname "$coverage_json")")") | ||||||
|  |             cp "$coverage_json" ".nyc_output/${shard}.json" | ||||||
|  |           done | ||||||
|  |           npx nyc merge .nyc_output .nyc_output/out.json | ||||||
|  |           npx nyc report --reporter=lcovonly --report-dir coverage | ||||||
|  |       - name: Upload coverage artifacts | ||||||
|  |         uses: actions/upload-artifact@v4.6.2 | ||||||
|  |         with: | ||||||
|  |           name: merged-coverage | ||||||
|  |           path: | | ||||||
|  |             merged-backend-coverage.xml | ||||||
|  |             .nyc_output/* | ||||||
|  |             coverage/lcov.info | ||||||
|  |           retention-days: 7 | ||||||
|  |           if-no-files-found: error | ||||||
|  |           include-hidden-files: true | ||||||
|  |       - name: SonarQube Analysis | ||||||
|  |         uses: SonarSource/sonarqube-scan-action@v5 | ||||||
|  |         env: | ||||||
|  |           SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} | ||||||
|   build-docker-image: |   build-docker-image: | ||||||
|     name: Build Docker image for ${{ github.ref_name }} |     name: Build Docker image for ${{ github.ref_name }} | ||||||
|     runs-on: ubuntu-24.04 |     runs-on: ubuntu-24.04 | ||||||
|  | |||||||
| @ -255,6 +255,7 @@ PAPERLESS_DISABLE_DBHANDLER = "true" | |||||||
| PAPERLESS_CACHE_BACKEND = "django.core.cache.backends.locmem.LocMemCache" | PAPERLESS_CACHE_BACKEND = "django.core.cache.backends.locmem.LocMemCache" | ||||||
| 
 | 
 | ||||||
| [tool.coverage.run] | [tool.coverage.run] | ||||||
|  | relative_files = true | ||||||
| source = [ | source = [ | ||||||
|   "src/", |   "src/", | ||||||
| ] | ] | ||||||
|  | |||||||
							
								
								
									
										24
									
								
								sonar-project.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								sonar-project.properties
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | |||||||
|  | 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/ | ||||||
|  | sonar.test.inclusions=**/test_*.py,**/tests.py,**/*.spec.ts,**/*.test.ts | ||||||
|  | 
 | ||||||
|  | # Language specific settings | ||||||
|  | sonar.python.version=3.10,3.11,3.12,3.13 | ||||||
|  | 
 | ||||||
|  | # Coverage reports | ||||||
|  | sonar.python.coverage.reportPaths=merged-backend-coverage.xml | ||||||
|  | sonar.javascript.lcov.reportPaths=coverage/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/** | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user