Tema:
Análisis de código de aplicaciones.
Introducción
En esta guía aprenderemos a realizar analisis de codigo de manera manual con la herramientas sonarqube que fue instalada anteriormente.
Objetivo
Objetivo General:
- El objetivo de la practica es realizar analisis de codigo de un aplicativo utilizando la herramienta de sonarqube.
Desarrollo del tema
Para poder asegurar que se están siguiendo las mejores prácticas en el desarrollo, debemos de aplicar algún tipo de escaner contra el código escrito, de forma que podamos tener información sobre qué tan expuestos estamos a ataques, cantidad de bugs detectados, entre otras métricas. Para ello es común utilizar SonarQube dado su nivel de madurez y amplia base de datos que utiliza para realizar el análisis de nuetro código.
Laboratorio: Análisis de código de aplicaciones
Descripción
La presente guía aborda la automatización de la fase de análisis de la aplicación.
Objetivos
- Ejecutar el análisis de código desde comandos
- Visualizar el resultado desde la interfaz de SonarQube
Antes de comenzar
- Contar con el acceso al ambiente del laboratorio.
Acceder al laboratorio.
-
Ingresar al servidor de laboratorio con la llave proporcionada.
export LAB=X ssh student@lab-${LAB}-aio -
Cambiar al usuario root
sudo -i -
Proporcione accesos administrativos al cluster de Kubernetes
export KUBECONFIG=/etc/rancher/rke2/rke2.yamlexport PATH=$PATH:/var/lib/rancher/rke2/binexport CONTAINERD_ADDRESS=/run/k3s/containerd/containerd.sock
Inicio de laboratorio
Obtener token de sonar.
Ingresar a su instancia de sonar con la clave anteriormente seteada.
http://sonar.x.x.x.x.nip.io/
Generar un token de tipo global analysis token y guardar el valor. Setearlo como variable de entorno.
SONAR_TOKEN=<TOKEN>
-
Ingrese a la carpeta
testingcd testing -
Reemplace el contenido de
settings.xmlcon el siguiente contenido1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
<settings> <pluginGroups> <pluginGroup>org.sonarsource.scanner.maven</pluginGroup> </pluginGroups> <profiles> <profile> <id>sonar</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <!-- Cambiar x.x.x.x.nip.io por el dominio correcto --> <sonar.host.url> http://sonar.x.x.x.x.nip.io/ </sonar.host.url> </properties> </profile> </profiles> </settings> -
Corra un contenedor con una terminal activa y un volumen montando la carpeta actual
nerdctl run -it --rm -e SONAR_TOKEN=$SONAR_TOKEN -v $PWD:/usr/src/app maven:3.8.5-openjdk-18 bash -
Acceda a la carpeta de la aplicación
cd /usr/src/app -
Ejecute el análisis con maven y dando el parametro de
sonar.login=tokenmvn -s settings.xml verify sonar:sonar -Dmaven.repo.local=$PWD/.m2/repository -DskipTests -Dsonar.login=token exit -
Revisar en el portal de SonarQube un nuevo proyecto con el resultado del analisis
-
Revisar los resultados del análisis realizado
-
Cree un script llamado
analyze.shcon el siguiente contenido1 2 3 4 5 6 7 8
#!/bin/bash cd /usr/src/app echo $PWD mvn -s settings.xml verify sonar:sonar -Dmaven.repo.local=$PWD/.m2/repository -DskipTests -Dsonar.login=token exit -
Asigne permisos de ejecución al archivo
chmod +x ./analyze.sh -
Corra el script desde el contenedor
nerdctl run -it --rm -e SONAR_TOKEN=$SONAR_TOKEN -v $PWD:/usr/src/app maven:3.8.5-openjdk-18 /usr/src/app/analyze.sh -
Revisar en el portal de SonarQube el proyecto
getting-started-testing -
Revisar los resultados del análisis realizado
-
Editar el script reemplazando los parametros de maven por
$MVN_ARGS1 2 3 4 5 6 7 8
#!/bin/bash cd /usr/src/app echo $PWD mvn -s settings.xml verify sonar:sonar $MVN_ARGS exit -
Editar el script agregando un ping de test al servidor de SonarQube como condicional
1 2 3 4 5 6 7 8 9 10 11 12
#!/bin/bash cd /usr/src/app echo $PWD if [[ $(curl -Ss http://${SONAR_URL}) ]]; then mvn -s settings.xml verify sonar:sonar $MVN_ARGS else echo "[ERROR] No hay conexion hacia el servidor de SonarQube" fi exit -
Corra el script desde el contenedor
# Cambiar x.x.x.x.nip.io por el dominio correcto # Cambiar token por el valor obtenido desde el portal de SonarQube nerdctl run -it --rm -v $PWD:/usr/src/app \ -e SONAR_URL="sonar.x.x.x.x.nip.io" \ -e SONAR_TOKEN=$SONAR_TOKEN \ -e MVN_ARGS="-Dmaven.repo.local=/usr/src/app/.m2/repository -DskipTests -Dsonar.login=token" \ maven:3.8.5-openjdk-18 /usr/src/app/analyze.sh -
Revisar en el portal de SonarQube el proyecto
getting-started-testing -
Revisar los resultados del análisis realizado
-
Borrar todo el contenido del archivo src/main/java/org/acme/getting/started/testing/GreetingResource.java y reemplazarlo con el siguiente
package org.acme.getting.started.testing; import javax.inject.Inject; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("/hello") public class GreetingResource { public String publicMessage = "Hello Quarkus!"; @GET @Produces(MediaType.TEXT_PLAIN) @Path("/greeting/{name}") public String greeting(String unusedName) { return "Greetings from SonarQube Test"; } @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return "hello"; } public void doNothing() { } } -
Corra el script desde el contenedor , ahora deberiamos de ver muchos mas problemas en sonarqube
# Cambiar x.x.x.x.nip.io por el dominio correcto # Cambiar token por el valor obtenido desde el portal de SonarQube nerdctl run -it --rm -v $PWD:/usr/src/app \ -e SONAR_URL="sonarqube.x.x.x.x.nip.io" -e SONAR_TOKEN=$SONAR_TOKEN \ -e MVN_ARGS="-Dmaven.repo.local=/usr/src/app/.m2/repository -DskipTests -Dsonar.login=token" \ maven:3.8.5-openjdk-18 /usr/src/app/analyze.sh -
Revisar en el portal de SonarQube el proyecto
getting-started-testing -
Revisar los resultados del análisis realizado en la pestaña
New Code
policy.csv: |+ p, argo-ci, applications, , /, allow p, argo-ci, clusters, get, /, allow p, argo-ci, clusters, update, , allow p, argo-ci, projects, , , allow p, argo-ci, repositories, , , allow