Desplegar contenedor Docker con Sonarcube e integrar con Jenkins para analizar código

Tiempo de lectura: 4 minutos

Hoy vamos a ver cómo instalar Sonarcube usando un contenedor Docker.

Para ello vamos a utilizar el siguiente contenedor Docker:

version: "3.1"

services:
  sonarqube:
    image: sonarqube:lts-community
    container_name: sonarqube
    hostname: sonarqube
    ports:
      - 9000:9000
    environment:
      - sonar.jdbc.url=jdbc:postgresql://posgres_db:5432/sonar
      - sonar.jdbc.username=posgres
      - sonar.jdbc.password=adminposgres
      - sonar.search.javaAdditionalOpts=-Dbootstrap.system_call_filter=false
    volumes:
      - ./config/sonarqube/logs:/opt/sonarqube/logs
      - ./config/sonarqube/data:/opt/sonarqube/data
      - ./config/sonarqube/extensions:/opt/sonarqube/extensions

    networks:
      - docker-network

  posgres_db:
    image: postgres:13.1
    container_name: posgres_db
    hostname: posgres_db
    environment:
      - POSTGRES_USER=posgres
      - POSTGRES_PASSWORD=adminposgres
    volumes:
      - ./config/postgres/pg_db:/var/lib/postgresql
      - ./config/postgres/pg_data:/var/lib/postgresql/data
    ulimits:
      nofile:
        soft: 65536
        hard: 65536
    networks:
      - docker-network

networks:
  docker-network:
    driver: bridge
    external: true

Ahora vamos a ejecutar el código con docker compose up:

docker compose up

Si no ejecuta, deberemos poner permisos a las carpetas /config/sonarqube/ .

sudo chmod -R 777 /config/sonarqube/

Una vez ejecutado deberiamos poder acceder desde http://localhost:9000

Nos pedirá usuario y contaseña:

Por defecto son:

Usuario: admin

Contraseña: admin

Actualizamos la contraseña por una segura:

Ahora añadimos un proyecto, pulsamos en añadir manualmente:

Ponemos un nombre y nos completará la clave y elegimos de que rama queremos desplegar nuestro proyecto:

Ahora nos pide cómo queremos inicializar el repositorio. Elegimos localmente:

Generamos un token y lo guardamos, ya que no aparecerá mas.

Y ahora tendremos que lanzar un comando usando el scanner de SonarCube para completar el proceso.

Para configurar el Scanner en Jenkins:

  • Vamos a administrar Jenkins:
  • Instalamos el Sonarqube Scanner:
  • Ahora vamos a Global Tool Configuration:
  • Buscamos SonarCube Scanner, elegimos Añadir SonarQube Scanner y elegimos Instalar Automáticamente con Maven Central. Elegimos una versión y guardamos.
  • Para que se ejecute la instalación podemos crear un Job, elegir en Build Steps:
  • Execute SonarQube Scanner:
  • Le damos a guardar y construir ahora, para que descargue el SonarQube Scanner:

Aunque la ejecución falle, se habrá completado la instalación:

Lo importante es quedarse con la ruta dónde se descomprime el sonar-scanner para luego añadirlo a la variable de entorno.

En este caso: /var/jenkins_home/tools/hudson.plugins.sonar.SonarRunnerInstallation/SonarQube/

Ahora vamos a Configurar Jenkins.

Vamos a Configurar Sistema:

Vamos al apartado de Variables de entorno:

Añadimos una variable de entorno llamada SCANNER_HOME

El contenido es:

/var/jenkins_home/tools/hudson.plugins.sonar.SonarRunnerInstallation/SonarQube/

Vamos a SonarQube Servers y añadimos el nuestro:

Ahora entramos en Server authentication token

Creamos una clave de tipo Secret Text:

Obtenemos la clave que viene en el comando de Execute Scanner y la pegamos dentro de Secret, también lo tendremos que utilizar en el archivo que crearemos abajo.

Guardamos esta configuración y ya tenemos listo nuestro Jenkins para ejecutar desde pipeline.

Ahora vamos a nuestro proyecto y en raíz (a nivel del código). Creamos el archivo sonar-project.properties

Añadimos lo siguiente:

sonar.projectKey=Proyecto
sonar.projectName=Proyecto
sonar.projectVersion=1.0

sonar.sources=.

sonar.python.version=3

sonar.host.url=http://localhost:9000
sonar.login=TOKEN_GENERADO_GUARDADO_EN_SECRET

Ahora añadimos un nuevo stage en el Jenkins file del proyecto, usaremos la variable SCANNER_HOME creada anteriormente.

stage('SonarQube analysis') {
            environment {
                scannerHome = "${SCANNER_HOME}"
                projectPropertiesPath = "./Server/app/sonar-project.properties"
            }
            steps {
                script {
                    def scannerCmd = "${scannerHome}bin/sonar-scanner"
                    sh "${scannerCmd} -Dproject.settings=${projectPropertiesPath}"
                }
            }
        }

Una vez añadido ya podemos lanzar la prueba en Jenkins y SonarQube nos analizará el código.

Deja un comentario