Table of Contents
Introduction
In today’s fast-paced DevOps environment, maintaining code quality is paramount. Integrating SonarQube with Jenkins in a Docker environment offers a robust solution for continuous code inspection and improvement.
This guide will walk you through the steps to set up SonarQube from a Jenkins pipeline job in Docker, ensuring your projects adhere to high standards of code quality and security.
Integrating SonarQube from a Jenkins Pipeline job in Docker: A Step-by-Step Guide.
Docker Compose for SonarQube
Create directories to keep SonarQube’s data
# mkdir -p /data/sonarqube/{conf,logs,temp,data,extensions,bundled_plugins,postgresql,postgresql_data}
Create a new user and change those directories owner
# adduser sonarqube
# usermod -aG docker sonarqube
# chown -R sonarqube:sonarqube /data/sonarqube/
Find UID of sonarqube user
# id sonarqube
Create a Docker Compose file using the UID in the user.
version: "3"
networks:
sonarnet:
driver: bridge
services:
sonarqube:
// use UID here
user: 1005:1005
image: sonarqube
ports:
- "9000:9000"
networks:
- sonarnet
environment:
- sonar.jdbc.url=jdbc:postgresql://db:5432/sonar
volumes:
- /data/sonarqube/conf:/opt/sonarqube/conf
- /data/sonarqube/logs:/opt/sonarqube/logs
- /data/sonarqube/temp:/opt/sonarqube/temp
- /data/sonarqube/data:/opt/sonarqube/data
- /data/sonarqube/extensions:/opt/sonarqube/extensions
- /data/sonarqube/bundled_plugins:/opt/sonarqube/lib/bundled-plugins
db:
image: postgres
networks:
- sonarnet
environment:
- POSTGRES_USER=sonar
- POSTGRES_PASSWORD=sonar
volumes:
- /data/sonarqube/postgresql:/var/lib/postgresql
- /data/sonarqube/postgresql_data:/var/lib/postgresql/data
Use docker-compose start
# docker-compose -f sonarqube-compose.yml up
Install and configure Nginx
Nginx Install
# yum install nginx
Start Nginx service
# service nginx start
Configure nginx
I have created a “/etc/nginx/conf.d/sonar.devopsroles.com.conf” file, look like as below:
upstream sonar {
server 127.0.0.1:9000;
}
server {
listen 80;
server_name dev.sonar.devopsroles.com;
root /var/www/html;
allow all;
}
location / {
return 301 https://dev.sonar.devopsroles.com;
}
}
server {
listen 443 ssl;
server_name dev.sonar.devopsroles.com;
access_log /var/log/nginx/dev.sonar.devopsroles.com-access.log proxy;
error_log /var/log/nginx/dev.sonar.devopsroles.com-error.log warn;
location / {
proxy_http_version 1.1;
proxy_request_buffering off;
proxy_buffering off;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://sonar$request_uri;
}
}
Check syntax and reload NGINX’s configs
# nginx -t && systemctl start nginx
Jenkins Docker Compose
Here is an example of a Jenkins Docker Compose setup that could be used for integrating SonarQube from a Jenkins pipeline job:
version: '3'
services:
jenkins:
image: jenkins/jenkins:lts
container_name: jenkins
ports:
- "8080:8080"
- "50000:50000"
volumes:
- jenkins_home:/var/jenkins_home
networks:
- jenkins-sonarqube
sonarqube:
image: sonarqube:latest
container_name: sonarqube
ports:
- "9000:9000"
environment:
- SONAR_JDBC_URL=jdbc:postgresql://db:5432/sonarqube
- SONAR_JDBC_USERNAME=sonar
- SONAR_JDBC_PASSWORD=sonar
networks:
- jenkins-sonarqube
db:
image: postgres:latest
container_name: postgres
environment:
- POSTGRES_USER=sonar
- POSTGRES_PASSWORD=sonar
- POSTGRES_DB=sonarqube
networks:
- jenkins-sonarqube
networks:
jenkins-sonarqube:
volumes:
jenkins_home:
Explanation:
- Jenkins Service: Runs Jenkins on the default LTS image. It exposes ports 8080 (Jenkins web UI) and 50000 (Jenkins slave agents).
- SonarQube Service: Runs SonarQube on the latest image. It connects to a PostgreSQL database for data storage.
- PostgreSQL Service: Provides the database backend for SonarQube.
- Networks and Volumes: Shared network (
jenkins-sonarqube
) and a named volume (jenkins_home
) for Jenkins data persistence.
Conclusion
By following this comprehensive guide, you have successfully integrated SonarQube with Jenkins using Docker, enhancing your continuous integration pipeline. This setup not only helps in maintaining code quality but also ensures your development process is more efficient and reliable. Thank you for visiting DevOpsRoles, and we hope this tutorial has been helpful in improving your DevOps practices.