Set up continuous code quality analysis by integrating SonarQube with Jenkins CI/CD pipelines. This tutorial covers SonarQube Scanner installation, webhook configuration, quality gates, and automated reporting for enforcing code standards across your development workflow.
Prerequisites
- Jenkins server with admin access
- SonarQube server running
- Java project with Maven or Gradle build
What this solves
Integrating SonarQube with Jenkins automates code quality analysis in your CI/CD pipeline, catching bugs, security vulnerabilities, and code smells before they reach production. This setup enforces quality gates that can fail builds when code doesn't meet your standards, providing immediate feedback to developers and maintaining consistent code quality across your entire codebase.
Step-by-step configuration
Install SonarQube Scanner on Jenkins
Install the SonarQube Scanner plugin and configure the scanner tool in Jenkins. This provides the integration between Jenkins and your SonarQube server.
wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-5.0.1.3006-linux.zip
unzip sonar-scanner-cli-5.0.1.3006-linux.zip
sudo mv sonar-scanner-5.0.1.3006-linux /opt/sonar-scanner
sudo ln -s /opt/sonar-scanner/bin/sonar-scanner /usr/local/bin/sonar-scanner
Configure SonarQube Scanner in Jenkins
Add the SonarQube Scanner installation to Jenkins global tool configuration so pipelines can use it.
- Navigate to Jenkins Dashboard → Manage Jenkins → Global Tool Configuration
- Scroll to SonarQube Scanner section
- Click "Add SonarQube Scanner"
- Set Name:
SonarQubeScanner - Set SONAR_RUNNER_HOME:
/opt/sonar-scanner - Click "Save"
Create SonarQube authentication token
Generate a token in SonarQube that Jenkins will use for authentication during analysis.
- Log into your SonarQube web interface
- Go to User → My Account → Security
- Generate a new token with name
jenkins-integration - Copy the generated token (you won't see it again)
Configure SonarQube server in Jenkins
Add your SonarQube server details and authentication token to Jenkins system configuration.
- Navigate to Jenkins Dashboard → Manage Jenkins → Configure System
- Scroll to SonarQube servers section
- Click "Add SonarQube"
- Set Name:
SonarQube - Set Server URL:
http://your-sonarqube-server:9000 - Add credentials with the token from previous step
- Click "Save"
Configure SonarQube webhook
Set up a webhook so SonarQube can notify Jenkins when analysis is complete, enabling quality gate checks.
curl -u admin:admin -X POST "http://your-sonarqube-server:9000/api/webhooks/create" \
-d "name=jenkins-webhook" \
-d "url=http://your-jenkins-server:8080/sonarqube-webhook/"
Create sonar-project.properties file
Add project configuration file to your source code repository to define analysis parameters.
sonar.projectKey=your-project-key
sonar.projectName=Your Project Name
sonar.projectVersion=1.0
sonar.sources=src
sonar.language=java
sonar.sourceEncoding=UTF-8
sonar.java.binaries=target/classes
sonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml
Create Jenkins pipeline with SonarQube integration
Configure a Jenkins pipeline that runs SonarQube analysis and checks quality gates as part of your CI/CD process.
pipeline {
agent any
environment {
SCANNER_HOME = tool 'SonarQubeScanner'
}
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Build') {
steps {
sh 'mvn clean compile'
}
}
stage('Test') {
steps {
sh 'mvn test'
publishTestResults testResultsPattern: 'target/surefire-reports/*.xml'
}
}
stage('SonarQube Analysis') {
steps {
withSonarQubeEnv('SonarQube') {
sh '${SCANNER_HOME}/bin/sonar-scanner'
}
}
}
stage('Quality Gate') {
steps {
timeout(time: 1, unit: 'HOURS') {
waitForQualityGate abortPipeline: true
}
}
}
stage('Deploy') {
when {
branch 'main'
}
steps {
sh 'mvn deploy'
}
}
}
post {
always {
publishHTML([
allowMissing: false,
alwaysLinkToLastBuild: true,
keepAll: true,
reportDir: 'target/site/jacoco',
reportFiles: 'index.html',
reportName: 'Coverage Report'
])
}
failure {
mail to: 'team@example.com',
subject: "Failed Pipeline: ${env.JOB_NAME} - ${env.BUILD_NUMBER}",
body: "Build failed. Check console output at ${env.BUILD_URL}"
}
}
}
Configure quality gates in SonarQube
Set up quality gate rules that define when a build should pass or fail based on code quality metrics.
- In SonarQube, go to Quality Gates → Create
- Name it
Strict Gate - Add conditions:
- Coverage on New Code: Minimum 80%
- Duplicated Lines on New Code: Maximum 3%
- Security Rating on New Code: Grade A
- Reliability Rating on New Code: Grade A
- Maintainability Rating on New Code: Grade A
- Set as default quality gate
Configure branch analysis
Enable branch and pull request analysis for comprehensive code quality checking across all development branches.
sonar.projectKey=your-project-key
sonar.projectName=Your Project Name
sonar.sources=src
sonar.java.binaries=target/classes
sonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml
Branch analysis
sonar.pullrequest.provider=github
sonar.pullrequest.github.repository=your-org/your-repo
Set up automated reporting
Configure Jenkins to generate and archive quality reports after each analysis for tracking trends over time.
post {
always {
script {
def sonarqubeUrl = "http://your-sonarqube-server:9000"
def projectKey = "your-project-key"
// Generate quality report
sh """
curl -u ${SONAR_AUTH_TOKEN}: \
"${sonarqubeUrl}/api/measures/component?component=${projectKey}&metricKeys=coverage,duplicated_lines_density,reliability_rating,security_rating,sqale_rating" \
> sonarqube-metrics.json
"""
archiveArtifacts artifacts: 'sonarqube-metrics.json', fingerprint: true
}
}
}
Configure advanced quality rules
For enterprise environments with multiple projects, you'll want to configure custom quality profiles and rules. This builds on the SonarQube quality gates configuration to enforce consistent standards across teams.
Create custom quality profile
Set up project-specific quality profiles with custom rules that match your coding standards and security requirements.
- In SonarQube, navigate to Quality Profiles
- Select your language (e.g., Java)
- Click "Create" and name it
Enterprise Java - Inherit from "Sonar way" profile
- Add custom rules for:
- Maximum method complexity: 10
- Maximum file length: 500 lines
- Mandatory code comments on public methods
- Required unit test coverage: 80%
- Set as default for your project
Configure pipeline notifications
Set up Slack or email notifications for quality gate failures to ensure immediate team visibility of code quality issues.
post {
failure {
script {
if (currentBuild.result == 'FAILURE' && env.STAGE_NAME == 'Quality Gate') {
slackSend(
channel: '#dev-team',
color: 'danger',
message: "Quality Gate Failed: ${env.JOB_NAME} - ${env.BUILD_NUMBER}\nSonarQube Report: http://your-sonarqube-server:9000/dashboard?id=your-project-key"
)
}
}
}
success {
script {
if (env.BRANCH_NAME == 'main') {
slackSend(
channel: '#dev-team',
color: 'good',
message: "✅ Quality Gate Passed: ${env.JOB_NAME} deployed to production"
)
}
}
}
}
Verify your setup
# Verify SonarQube Scanner installation
sonar-scanner --version
Test SonarQube server connection
curl -u your-token: http://your-sonarqube-server:9000/api/system/status
Verify Jenkins can reach SonarQube
curl -I http://your-jenkins-server:8080/sonarqube-webhook/
Check webhook configuration
curl -u admin:admin "http://your-sonarqube-server:9000/api/webhooks/list"
Verify quality gate status for project
curl -u your-token: "http://your-sonarqube-server:9000/api/qualitygates/project_status?projectKey=your-project-key"
your-token, your-sonarqube-server, your-jenkins-server, and your-project-key with your actual values.Common issues
| Symptom | Cause | Fix |
|---|---|---|
| Quality gate never completes | Webhook not configured properly | Verify webhook URL in SonarQube admin settings and Jenkins accessibility |
| Scanner not found error | SonarQube Scanner not in PATH | Check tool configuration in Jenkins and verify /opt/sonar-scanner installation |
| Authentication failed | Invalid or expired token | Regenerate SonarQube token and update Jenkins credentials |
| Project not found in SonarQube | Wrong project key in properties | Verify sonar.projectKey matches exactly with SonarQube project |
| Coverage reports not showing | Wrong path to coverage XML | Update sonar.coverage.jacoco.xmlReportPaths to correct file location |
| Pipeline hangs on quality gate | Webhook delivery failure | Check Jenkins logs and ensure Jenkins URL is accessible from SonarQube server |
Next steps
- Configure SonarQube quality gates and custom rules for advanced quality enforcement
- Set up SonarQube branch analysis with pull request decoration for comprehensive code review integration
- Integrate SonarQube with Kubernetes security scanning workflows for container-based deployments
- Configure Jenkins pipeline with Docker registry security scanning for complete CI/CD security