Setup SonarQube scanner for multiple programming languages with automated code quality analysis

Intermediate 45 min Apr 02, 2026 384 views
Ubuntu 24.04 Debian 12 AlmaLinux 9 Rocky Linux 9

Configure SonarQube Scanner CLI to analyze Java, Python, JavaScript, and C# projects with automated quality gates and CI/CD integration. Streamline code quality analysis across your entire development pipeline with Docker and Jenkins automation.

Prerequisites

  • SonarQube server running
  • Java 11 or later installed
  • Network access to SonarQube server

What this solves

SonarQube Scanner enables automated code quality analysis across multiple programming languages in your development pipeline. This tutorial shows you how to set up the scanner CLI, configure it for Java, Python, JavaScript, and C# projects, and integrate it with CI/CD systems for continuous quality monitoring.

Step-by-step installation

Update system packages

Start by updating your package manager to ensure you have the latest repositories.

sudo apt update && sudo apt upgrade -y
sudo dnf update -y

Install Java and required dependencies

SonarQube Scanner requires Java 11 or later to run properly.

sudo apt install -y openjdk-17-jdk wget unzip curl
sudo dnf install -y java-17-openjdk-devel wget unzip curl

Download and install SonarQube Scanner CLI

Download the latest version of SonarQube Scanner and install it to a system directory.

cd /opt
sudo wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-5.0.1.3006-linux.zip
sudo unzip sonar-scanner-cli-5.0.1.3006-linux.zip
sudo mv sonar-scanner-5.0.1.3006-linux sonar-scanner
sudo chown -R root:root /opt/sonar-scanner
sudo chmod 755 /opt/sonar-scanner/bin/sonar-scanner

Configure environment variables

Set up system-wide environment variables for the SonarQube Scanner.

SONAR_SCANNER_HOME="/opt/sonar-scanner"
PATH="$PATH:/opt/sonar-scanner/bin"
JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64"

Load the new environment variables and verify the installation.

source /etc/environment
sonar-scanner --version

Configure global scanner properties

Set up the global configuration file with your SonarQube server connection details.

# SonarQube server configuration
sonar.host.url=https://sonarqube.example.com
sonar.login=your-sonarqube-token

Default source encoding

sonar.sourceEncoding=UTF-8

Scanner performance settings

sonar.scanner.javaOpts=-Xmx2048m

Configure multi-language project analysis

Java project configuration

Create a sonar-project.properties file in your Java project root directory.

# Project identification
sonar.projectKey=my-java-project
sonar.projectName=My Java Application
sonar.projectVersion=1.0

Source and binary directories

sonar.sources=src/main/java sonar.java.binaries=target/classes sonar.java.libraries=target/dependency/*.jar

Test configuration

sonar.tests=src/test/java sonar.java.test.binaries=target/test-classes

Coverage reports

sonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml

Python project configuration

Configure SonarQube Scanner for Python projects with pytest and coverage integration.

# Project identification
sonar.projectKey=my-python-project
sonar.projectName=My Python Application
sonar.projectVersion=1.0

Source configuration

sonar.sources=src sonar.python.version=3.9,3.10,3.11,3.12

Test configuration

sonar.tests=tests sonar.python.coverage.reportPaths=coverage.xml sonar.python.xunit.reportPath=test-reports/pytest.xml

Exclusions

sonar.exclusions=/_test.py,/test_.py,/__pycache__/

JavaScript/Node.js project configuration

Set up scanner properties for JavaScript projects with Jest testing framework.

# Project identification
sonar.projectKey=my-javascript-project
sonar.projectName=My JavaScript Application
sonar.projectVersion=1.0

Source configuration

sonar.sources=src sonar.javascript.file.suffixes=.js,.jsx

Test configuration

sonar.tests=tests sonar.test.inclusions=/.test.js,/.spec.js sonar.javascript.lcov.reportPaths=coverage/lcov.info

Exclusions

sonar.exclusions=node_modules/,build/,dist/**

C# project configuration

Configure the scanner for .NET C# projects with MSBuild integration.

# Project identification
sonar.projectKey=my-csharp-project
sonar.projectName=My C# Application
sonar.projectVersion=1.0

Source configuration

sonar.sources=src sonar.cs.opencover.reportsPaths=coverage.xml sonar.cs.nunit.reportsPaths=TestResults/*.xml

Build configuration

sonar.msbuild.testProjectPattern=.[Tt]est.

Exclusions

sonar.exclusions=/bin/,/obj/,**/*.Designer.cs

Set up quality gates and profiles

Configure custom quality gates

Create project-specific quality gate configurations for stricter code quality enforcement.

# Quality gate configuration
sonar.qualitygate.wait=true
sonar.qualitygate.timeout=300

Coverage thresholds

sonar.coverage.exclusions=/Test.java,/test.py,**/*.test.js

Duplication settings

sonar.cpd.exclusions=/Test.java,/migration/**

Analysis mode

sonar.analysis.mode=publish

Configure language-specific profiles

Set up quality profiles for different programming languages with custom rule sets.

# Multi-language project configuration
sonar.projectKey=multi-lang-project
sonar.projectName=Multi-Language Application
sonar.projectVersion=1.0

Multiple source directories

sonar.sources=src/main/java,src/python,src/javascript,src/csharp

Language-specific settings

sonar.java.source=17 sonar.python.version=3.11 sonar.javascript.node.maxspace=8192 sonar.cs.analyzer.projectOutPaths=/bin/,/obj/

Automate CI/CD integration

Jenkins pipeline integration

Create a Jenkins pipeline script for automated SonarQube scanning.

pipeline {
    agent any
    
    environment {
        SONAR_SCANNER_HOME = tool 'SonarScanner'
        PATH = "${SONAR_SCANNER_HOME}/bin:${PATH}"
    }
    
    stages {
        stage('Checkout') {
            steps {
                checkout scm
            }
        }
        
        stage('Build') {
            steps {
                sh 'mvn clean compile test-compile'
            }
        }
        
        stage('Test') {
            steps {
                sh 'mvn test'
                publishTestResults testResultsPattern: 'target/surefire-reports/*.xml'
            }
        }
        
        stage('SonarQube Analysis') {
            steps {
                withSonarQubeEnv('SonarQube') {
                    sh 'sonar-scanner -Dsonar.projectKey=${JOB_NAME} -Dsonar.sources=. -Dsonar.host.url=${SONAR_HOST_URL} -Dsonar.login=${SONAR_AUTH_TOKEN}'
                }
            }
        }
        
        stage('Quality Gate') {
            steps {
                timeout(time: 10, unit: 'MINUTES') {
                    waitForQualityGate abortPipeline: true
                }
            }
        }
    }
}

Docker integration

Create a Docker-based scanning solution for containerized environments.

FROM sonarsource/sonar-scanner-cli:5.0

Install additional tools

USER root RUN apk add --no-cache nodejs npm python3 py3-pip openjdk17

Copy project files

COPY . /usr/src WORKDIR /usr/src

Set environment variables

ENV SONAR_SCANNER_OPTS="-Xmx2048m" ENV SONAR_HOST_URL="https://sonarqube.example.com"

Run analysis

CMD ["sonar-scanner"]

Docker Compose setup

Create a Docker Compose configuration for local development scanning.

version: '3.8'

services:
  sonar-scanner:
    build:
      context: .
      dockerfile: Dockerfile.scanner
    volumes:
      - .:/usr/src
      - sonar-cache:/opt/sonar-scanner/.sonar
    environment:
      - SONAR_HOST_URL=https://sonarqube.example.com
      - SONAR_LOGIN=${SONAR_TOKEN}
    networks:
      - sonar-network

volumes:
  sonar-cache:

networks:
  sonar-network:
    driver: bridge

GitHub Actions integration

Set up automated scanning with GitHub Actions for continuous integration.

name: SonarQube Analysis

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

jobs:
  sonarqube:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v4
      with:
        fetch-depth: 0
    
    - name: Set up JDK 17
      uses: actions/setup-java@v4
      with:
        java-version: '17'
        distribution: 'temurin'
    
    - name: Cache SonarQube packages
      uses: actions/cache@v3
      with:
        path: ~/.sonar/cache
        key: ${{ runner.os }}-sonar
        restore-keys: ${{ runner.os }}-sonar
    
    - name: Run tests
      run: |
        mvn clean test
        npm test -- --coverage
        python -m pytest --cov --cov-report=xml
    
    - name: SonarQube Scan
      uses: sonarqube-quality-gate-action@v1.3.0
      env:
        SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
        SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}

Verify your setup

Test your SonarQube Scanner configuration with a sample project analysis.

# Verify scanner installation
sonar-scanner --version
java -version

Test connection to SonarQube server

curl -u ${SONAR_TOKEN}: ${SONAR_HOST_URL}/api/system/status

Run analysis on sample project

cd /path/to/your/project sonar-scanner -Dsonar.projectKey=test-project -Dsonar.sources=. -X

Check analysis results

curl -u ${SONAR_TOKEN}: "${SONAR_HOST_URL}/api/project_analyses/search?project=test-project"
Note: The -X flag enables debug mode to help troubleshoot any configuration issues during your first scan.

Common issues

Symptom Cause Fix
Scanner command not found PATH not set correctly Add /opt/sonar-scanner/bin to PATH in /etc/environment
Java heap space error Insufficient memory allocation Increase sonar.scanner.javaOpts to -Xmx4096m
Connection refused to SonarQube Wrong host URL or network issues Verify sonar.host.url and network connectivity
Authentication failed Invalid or expired token Generate new token in SonarQube and update sonar.login
No coverage reports found Wrong coverage report paths Verify coverage file paths in sonar.coverage.* properties
Quality gate timeout Server overloaded or slow analysis Increase sonar.qualitygate.timeout or reduce project scope

Next steps

Automated install script

Run this to automate the entire setup

Need help?

Don't want to manage this yourself?

We handle managed devops services for businesses that depend on uptime. From initial setup to ongoing operations.