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:
2) Selecciona el menú My account en la esquina superior derecha:
3) Selecciona el submenú de seguridad y genera un token para usar Jenkins con los siguientes parámetros:
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:
5) Crea un webhook para que lo use Jenkins haciendo clic en Administration -> Configuration -> Webhooks:
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:
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:
2) Haz clic en Install Suggested Plugins y espera a que se complete la instalación.
3) En la siguiente pantalla puedes hacer clic en Skip and Continue as Admin, si lo prefieres:
4) Configura la URL de Jenkins como desees (yo suelo asumir los valores sugeridos) y luego haz clic en Save and Finish:
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:
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":
7) A continuación, Manage Credentials:
8) En la tabla “Stores scoped to Jenkins”, haz clic en System (al lado del ícono).
9) En la tabla System, clic en Global Credentials (unrestricted):
10) Por último, selecciona Add Credentials:
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:
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:
14) Cuando el download termine, regresa al paso 6 y haz clic en clique en Herramienta de configuración global:
15) Ve a la sección SonarQube Scanner y haz clic en Agregar escáner SonarQube:
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:
17) Vuelve al paso 6 y haz clic en Configurar el sistema:
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:
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.
- Con referencia al paso 6 de los pasos descritos anteriormente, haz clic en "Gerenciar Jenkins" y luego en "Herramienta de configuración global":
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)
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:
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:
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):
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:
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:
2) Complete el campo Project display name con el valor simple-test-project y termine haciendo clic en Set Up:
¡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:
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:
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.:
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.
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.