Jenkins y SonarQube para simulaciones de entorno

Jenkins y SonarQube para simulaciones de entorno

Resolver problemas es una parte inherente de la rutina de un desarrollador de software, ya sea escribiendo código para funciones descritas en nuevas reglas comerciales, optimizando código heredado o incluso refactorizando estructuras existentes.

Para garantizar la calidad en la resolución de estos problemas, es natural y esencial que el desarrollador escriba pruebas con el objetivo de aumentar la confiabilidad de la solución propuesta, entregando software con riesgo reducido de fallas operativas y alta satisfacción del usuario en el entorno de producción.

Desde el código escrito y funcional en la máquina del desarrollador, hasta lo que los usuarios tienen acceso como producto, hay un camino a seguir. Compilación del código, validación de casos de prueba (ya sean unitarios y/o de integración), validación en ambiente de calidad y solo entonces la disponibilidad del producto.
Dicho esto, el propósito de este artículo es explicar cómo combinar Jenkins con SonarQube en un entorno de desarrollo local.

  • Jenkins es una herramienta que ayuda a los desarrolladores en el proceso de integración continua (CI) y garantiza que cada incremento de código se integre, pruebe y luego se implemente;
  • SonarQube es una herramienta que tiene como objetivo evaluar la calidad del código fuente en desarrollo, comprobando la complejidad, la duplicidad del código, entre otras métricas;


Nota: Como requisito previo para ejecutar los pasos descritos en el artículo, es necesario tener instalado Docker. Para validar el funcionamiento del entorno configurado se puede utilizar este proyecto (es una API REST simple escrita en Java con Maven+SpringBoot).

El problema
Un buen código no es solo uno que compila, ejecuta y funciona. En aplicaciones de mercado, debe ser fácil de mantener, cubierto por pruebas, con baja complejidad, alta confiabilidad y seguridad... Parece mucho para abordar, ¿no? ¡Pero tranquilo! Existe una forma automatizada de proporcionar a los desarrolladores un análisis de estos puntos durante el proceso de integración continua. Hablemos de ello en este artículo justo debajo.

La solución
Como se describió anteriormente, es necesario tener Docker instalado para implementar la solución propuesta. Con eso hecho, ensuciémonos las manos:

Configuración a nivel de Container.

1) Ejecuta el contenedor de SonarQube:

2) Ejecuta Jenkins en Docker con el siguiente comando:

Nota: Para facilitar las pruebas y evitar enviar confirmaciones al repositorio remoto (como GitHub, por ejemplo), cada vez que se realiza un cambio, el directorio del espacio de trabajo donde se clona el proyecto de prueba se monta como un volumen en el container de Jenkins, agregando una opción para las variables de entorno que le permite a Jenkins usar el pago de repositorios locales.

3) Configura sonar-scanner-client en Jenkins:

Ajustes a nivel de Interfaz Gráfica

Con los contenedores funcionando y configurados correctamente, vamos a los ajustes de interfaz, empezando por SonarQube:

SonarQube


1) Accede a la dirección de SonarQube (http://localhost:9000/) e inicia sesión con usuario administrador y contraseña de administrador. Luego restablece tu contraseña según lo solicitado:

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente
Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

2) Selecciona el menú My account en la esquina superior derecha:

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

3) Selecciona el submenú de seguridad y genera un token para usar Jenkins con los siguientes parámetros:

Interface gráfica do usuário, Aplicativo, Site

Descrição gerada automaticamente

4) Copia el valor del token generado haciendo clic en copy. Guárdalo en algún lugar para que pueda ser copiado y utilizado en el futuro:

Interface gráfica do usuário

Descrição gerada automaticamente

5) Crea un webhook para que lo use Jenkins haciendo clic en Administration -> Configuration -> Webhooks:

Interface gráfica do usuário

Descrição gerada automaticamente

6) En la siguiente pantalla, haz clic en crear e ingresa los siguientes parámetros. Es importante tener en cuenta que en la URL, el valor ingresado no puede ser localhost, sino el valor de la IP local:

Interface gráfica do usuário, Texto, Aplicativo

Descrição gerada automaticamente

Jenkins

La siguiente configuración se realizará en Jenkins:

1) Ve a la dirección de Jenkins (http://localhost:8080/). Usa aquí el valor reservado en el paso de configuración del contenedor de Jenkins:

Interface gráfica do usuário, Texto, Aplicativo

Descrição gerada automaticamente

2) Haz clic en Install Suggested Plugins y espera a que se complete la instalación.

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

3) En la siguiente pantalla puedes hacer clic en Skip and Continue as Admin, si lo prefieres:

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

4) Configura la URL de Jenkins como desees (yo suelo asumir los valores sugeridos) y luego haz clic en Save and Finish:

Interface gráfica do usuário, Texto, Aplicativo

Descrição gerada automaticamente

5) Con todo listo, simplemente haz clic en Start using Jenkins. Recuerda que si no has creado tu propio usuario administrativo, la contraseña del usuario administrador es la misma que se reservó en el paso de configuración del contenedor de Jenkins y que se utilizó en el primer acceso:

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

Ahora agreguemos el token de acceso creado en SonarQube a Jenkins. Esto permitirá enviar la información generada en el proceso de construcción del proyecto a SonarQube para su análisis.

6) Para hacer esto, en el menú de la izquierda, haga clic en "Gerenciar Jenkins":

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

7) A continuación, Manage Credentials:

Interface gráfica do usuário, Aplicativo, Site

Descrição gerada automaticamente

8) En la tabla “Stores scoped to Jenkins”, haz clic en System (al lado del ícono).

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

9) En la tabla System, clic en Global Credentials (unrestricted):

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

10) Por último, selecciona Add Credentials:

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

11) Rellena los datos del formulario Nuevas credenciales con los siguientes valores: Kind -> Secrete text, Scope -> Global, Secret -> valor do secret criado no SonarQube, ID -> JenkinsTokenSonar, Description -> Jenkins Token Sonar.

12) Volviendo al paso 6, clic en Administrar extensiones:

Interface gráfica do usuário, Aplicativo, Site

Descrição gerada automaticamente

13) En el menú de la izquierda de la pantalla Plugins, haz clic en Available Plugins y, en la barra de búsqueda, informa el valor SonarQube Scanner. Selecciona la casilla de verificación de instalación y de nuevo clic en el botón Instalar sin reiniciar:

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

14) Cuando el download termine, regresa al paso 6 y haz clic en clique en Herramienta de configuración global:

Interface gráfica do usuário, Aplicativo, Site

Descrição gerada automaticamente

15) Ve a la sección SonarQube Scanner y haz clic en Agregar escáner SonarQube:

Interface gráfica do usuário, Aplicativo, Teams

Descrição gerada automaticamente

16) Completa el formulario con los siguientes valores:

Nombre: sonarqube, desmarca la casilla de verificación Instalar automáticamente y completa el campo SONAR_RUNNER_HOME con el valor /var/jenkins_home/sonar-scanner/sonar-scanner-4.7.0.2747-linux. Finaliza haciendo clic en guardar:

Interface gráfica do usuário, Texto, Aplicativo

Descrição gerada automaticamente

17) Vuelve al paso 6 y haz clic en Configurar el sistema:

Interface gráfica do usuário, Aplicativo, Site

Descrição gerada automaticamente

18) Navega a los servidores de SonarQube, haz clic en Add SonarQube, completa los valores Name -> sonarqubeserver y URL del servidor -> el valor ingresado no puede ser localhost, sino el valor de IP local. Para el campo Token de autenticación del servidor, selecciona el valor creado "Jenkins Token Sonar". Una vez hecho esto, guarda el avance:

Interface gráfica do usuário, Texto, Aplicativo

Descrição gerada automaticamente

Integración concluida

Con todos los pasos ejecutados, la integración entre Jenkins y SonarQube está completa. Cada proyecto de Jenkins debe tener su propio trabajo y cada trabajo debe configurarse respetando las particularidades de construcción del lenguaje de programación en el que se desarrolló el código.

Los siguientes pasos son opcionales y sirven para demostrar cómo funciona el proceso de construcción e integración de un proyecto escrito en Java con Maven+SpringBoot con SonarQube. El proyecto está listo y se puede replicar desde la URL: https://github.com/kckoerich/simple-test-project.

Jenkins + Maven

Para la construcción de proyectos Java que utilizan Maven, son necesarias algunas configuraciones adicionales en Jenkins, relacionadas con la configuración del JDK (Java Development Kit) y Maven (Dependency and Builds Manager), que se utilizan en el proceso de construcción automatizado en un trabajo. Primero, configura el JDK.

  1. Con referencia al paso 6 de los pasos descritos anteriormente, haz clic en "Gerenciar Jenkins" y luego en "Herramienta de configuración global":
Interface gráfica do usuário, Aplicativo, Site

Descrição gerada automaticamente

2) Navega a la sección JDK, selecciona agregar JDK, completa el campo de nombre con el valor Java, elige el kit de desarrollo Java SE versión 8u221 y marca la casilla de verificación "Estoy de acuerdo con la licencia de desarrollo Java SE". Se requiere una cuenta de Oracle para instalar el JDK. Con tu nombre de usuario y contraseña, inicia sesión en la cuenta haciendo clic en "Por favor, introduzca su nombre de usuario/contraseña". En la siguiente pantalla, completa tus datos y  clic en Aceptar. Al regresar a la Sección JDK, elige Guardar para confirmar la instalación:

3)

Interface gráfica do usuário, Texto, Aplicativo, Email

Descrição gerada automaticamente

Luego configure Maven:


1) Haciendo referencia al paso 1 descrito en la sección de configuración de JDK, selecciona "Administrar Jenkins" y luego en "Herramienta de configuración global".

2) Navega a la sección Maven, haz clic en agregar Maven, completa el campo de nombre con el valor Maven, marca la casilla de verificación "Instalar automáticamente" y seleccione la versión 3.8.6. Por último, clic en Guardar:

Interface gráfica do usuário, Texto, Aplicativo

Descrição gerada automaticamente

Ahora que Jenkins está configurado para compilar proyectos Java con Maven, crearemos un trabajo que realizará el paso de compilación para el proyecto de prueba simple. El proyecto debe ser clonado en el directorio $PATH_TO_WORKSPACE, montado en el contenedor de Jenkins como un volumen, en el paso de configuración del contenedor. En mi caso, el directorio de espacios de trabajo es /Users/kckoerich/Development/workspaces.

Programáticamente, tomando mi caso como ejemplo, tendrías:

# navegando até o diretório de workspaces montado no container do Jenkins

cd /Users/kckoerich/Development/workspaces/java


# clonando o projeto

git@github.com:kckoerich/simple-test-project.git

Con el proyecto clonado, configuremos el Job

1) Para hacerlo, en la pantalla de inicio de Jenkins, haga clic en Create a job:

Interface gráfica do usuário, Aplicativo, Teams

Descrição gerada automaticamente

2) En la pantalla de configuración del trabajo, completa el campo de nombre con el valor simple-test-project, seleccione la opción Pipeline y selecciona Aceptar (todo a la derecha):

Interface gráfica do usuário, Texto, Aplicativo

Descrição gerada automaticamente

3) En la siguiente pantalla, ve a la sección Pipeline, en definición, selecciona "Pipeline script from SCM". En SCM, selecciona GIT y en la subsección URL del repositorio ingresa el valor file:///var/workspaces/java/simple-test-project. Después de eso, clic en Guardar:

Tela de computador com texto preto sobre fundo branco

Descrição gerada automaticamente

Hecho esto, el trabajo para construir el proyecto en Jenkins está terminado. Ahora es necesario crear un proyecto en SonarQube, para que, durante el proceso de construcción de Jenkins Pipeline, el proyecto llegue a SonarQube y publique los informes generados durante la construcción. Para hacerlo, ve a http://localhost:9000:

1) En la pantalla principal de SonarQube, selecciona para crear un proyecto haciendo clic en Manually:

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

2) Complete el campo Project display name con el valor simple-test-project y termine haciendo clic en Set Up:

Interface gráfica do usuário, Texto

Descrição gerada automaticamente

¡Ahora volvamos a nuestro trabajo y probemos tu ejecución de la compilación y la integración con SonarQube! Para hacer esto, consulta los pasos a continuación:

1) Accede a la URL http://localhost:8080/job/simple-test-project/ y en el menú del lado izquierdo haz clic en compilar ahora:

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

2) La primera ejecución llevará un tiempo, ya que Jenkins necesita descargar todas las dependencias del proyecto. Cuando finaliza la compilación, el último mensaje en el registro debe ser Finished: SUCCESS:

Interface gráfica do usuário

Descrição gerada automaticamente

Accediendo a SonarQube en la URL del proyecto (http://localhost:9000/dashboard?id=simple-test-project) es posible visualizar toda la información asociada a las métricas capturadas durante el proceso de compilación. Existe un gran universo de información asociada a Deuda Técnica, Confiabilidad, Seguridad, Mantenibilidad, Cobertura de Pruebas, Duplicación de Código, Tamaño, Complejidad, etc.:

Interface gráfica do usuário, Texto

Descrição gerada automaticamente

Además de la información configurada por defecto, es posible personalizar qué y cómo quieres realizar los análisis. ¡Pero ese es un tema para otra conversación!

Conclusión


El proceso de automatización de la compilación propuesto por Jenkins hace que la compilación del código incrementado sea más fluida y eficiente. Durante el proceso de construcción que se ejecuta en el pipeline del proyecto, se proporcionan estadísticas a SonarQube, para que pueda analizar información asociada a varios aspectos del código (como: Fiabilidad, Seguridad, Cobertura de Pruebas, etc.), que se pueden personalizar según los parámetros a analizar.

A pesar de ser un artículo extenso, con una serie de ajustes, es positivo pensar que se ejecutarán una sola vez y aportarán información valiosa sobre el producto desarrollado a lo largo de su ciclo de vida. ¿¡Te imaginas, con cada incremento de código tener que preocuparte de analizar cada uno de los parámetros que cubre el entorno de calidad integrado!? Humanamente inviable en muchos sentidos.

⚠️
Las opiniones y comentarios emitidos en este artículo son propiedad única de su autor y no necesariamente representan el punto de vista de Revelo.

Revelo Content Network da la bienvenida a todas las razas, etnias, nacionalidades, credos, géneros, orientaciones, puntos de vista e ideologías, siempre y cuando promuevan la diversidad, la equidad, la inclusión y el crecimiento profesional de los profesionales en tecnología.