En este artículo, te mostraré cómo integrar SonarQube en un pipeline de AWS CodePipeline. SonarQube es una herramienta poderosa para análisis de código estático que detecta problemas de calidad y vulnerabilidades de seguridad en tu código. A continuación, explico cómo hacerlo con ejemplos para proyectos en Java, Node.js, PHP, Go (Golang) y Python.
1. Configurar SonarQube
Antes de comenzar, asegúrate de tener una instancia de SonarQube en ejecución. Puedes configurar SonarQube en un servidor dedicado o utilizar una instancia de EC2 en AWS. Si prefieres, también puedes utilizar SonarCloud, que es la versión en la nube de SonarQube (requiere suscripción).
2. Crear un Proyecto en SonarQube
Inicia sesión en tu instancia de SonarQube.
Crea un proyecto nuevo y genera un token de autenticación. Este token se utilizará para integrar SonarQube en tu pipeline de AWS CodePipeline.
3. Configurar AWS CodeBuild
La integración de SonarQube se realiza durante la fase de construcción en CodeBuild. Aquí es donde ejecutarás el escaneo de SonarQube.
a. Modificar buildspec.yml
El archivo buildspec.yml
debe configurarse para ejecutar el análisis de SonarQube utilizando un plugin o un script.
Ejemplos por Lenguaje
Java (Maven)
version: 0.2
phases:
install:
commands:
- echo "Instalando dependencias..."
- mvn install -DskipTests=true
build:
commands:
- echo "Ejecutando análisis de SonarQube..."
- mvn sonar:sonar \
-Dsonar.projectKey=my_project_key \
-Dsonar.host.url=http://<SONARQUBE_URL>:9000 \
-Dsonar.login=<SONARQUBE_TOKEN>
post_build:
commands:
- echo "Build completado. Revisando resultados de SonarQube..."
artifacts:
files:
- target/**
discard-paths: yes
Reemplaza <SONARQUBE_URL>
con la URL de tu instancia de SonarQube y <SONARQUBE_TOKEN>
con el token generado.
Node.js
version: 0.2
phases:
install:
commands:
- echo "Instalando SonarScanner..."
- npm install -g sonarqube-scanner
build:
commands:
- echo "Ejecutando análisis de SonarQube..."
- sonarqube-scanner \
-Dsonar.projectKey=my_project_key \
-Dsonar.sources=. \
-Dsonar.host.url=http://<SONARQUBE_URL>:9000 \
-Dsonar.login=<SONARQUBE_TOKEN>
post_build:
commands:
- echo "Build completado. Revisando resultados de SonarQube..."
artifacts:
files:
- coverage/*
discard-paths: yes
Este ejemplo instala el SonarScanner para Node.js y ejecuta el análisis.
PHP
version: 0.2
phases:
install:
commands:
- echo "Instalando Composer..."
- curl -sS https://getcomposer.org/installer | php
- php composer.phar install
build:
commands:
- echo "Ejecutando análisis de SonarQube..."
- sonar-scanner \
-Dsonar.projectKey=my_project_key \
-Dsonar.sources=. \
-Dsonar.host.url=http://<SONARQUBE_URL>:9000 \
-Dsonar.login=<SONARQUBE_TOKEN>
post_build:
commands:
- echo "Build completado. Revisando resultados de SonarQube..."
artifacts:
files:
- build/
discard-paths: yes
En PHP, SonarScanner se ejecuta después de instalar las dependencias con Composer.
Golang (Go)
version: 0.2
phases:
install:
commands:
- echo "Instalando Go y dependencias..."
- wget https://golang.org/dl/go1.16.3.linux-amd64.tar.gz
- tar -C /usr/local -xzf go1.16.3.linux-amd64.tar.gz
- export PATH=$PATH:/usr/local/go/bin
- go mod download
build:
commands:
- echo "Ejecutando análisis de SonarQube..."
- sonar-scanner \
-Dsonar.projectKey=my_project_key \
-Dsonar.sources=. \
-Dsonar.host.url=http://<SONARQUBE_URL>:9000 \
-Dsonar.login=<SONARQUBE_TOKEN>
post_build:
commands:
- echo "Build completado. Revisando resultados de SonarQube..."
artifacts:
files:
- bin/*
discard-paths: yes
En Go, SonarScanner se ejecuta después de descargar las dependencias.
Python
version: 0.2
phases:
install:
commands:
- echo "Instalando SonarScanner..."
- pip install sonar-scanner
build:
commands:
- echo "Ejecutando análisis de SonarQube..."
- sonar-scanner \
-Dsonar.projectKey=my_project_key \
-Dsonar.sources=. \
-Dsonar.host.url=http://<SONARQUBE_URL>:9000 \
-Dsonar.login=<SONARQUBE_TOKEN>
post_build:
commands:
- echo "Build completado. Revisando resultados de SonarQube..."
artifacts:
files:
- reports/*
discard-paths: yes
En Python, SonarScanner se instala y ejecuta utilizando pip
.
4. Configurar AWS CodePipeline
a. Fase de construcción
Dentro de CodePipeline, añade una fase de construcción que utilice el proyecto de CodeBuild donde has configurado el análisis de SonarQube.
Crear/editar tu pipeline de CodePipeline:
Añade una fase de construcción si no tienes una.
Configura la acción de construcción para que use el proyecto de CodeBuild que configuraste en el paso anterior.
b. Resultados del análisis
SonarQube almacenará los resultados del análisis en su base de datos y proporcionará un tablero de control donde podrás revisar los problemas de calidad del código y las vulnerabilidades.
5. Configurar Notificaciones y Gestión de Calidad (Opcional)
Puedes configurar SonarQube para que notifique al equipo de desarrollo si se encuentran problemas críticos o errores en el código. SonarQube también se puede configurar para establecer un "quality gate" que debe pasarse antes de permitir que el código se despliegue.
6. Ejemplo con Docker (Opcional)
Si prefieres ejecutar el análisis de SonarQube a través de un contenedor Docker en lugar de usar Maven, Node.js, PHP, Go o Python directamente, puedes usar un enfoque como este en tu buildspec.yml
:
version: 0.2
phases:
install:
commands:
- echo "Instalando Docker..."
- yum install -y docker
- service docker start
build:
commands:
- echo "Ejecutando análisis de SonarQube usando Docker..."
- docker run --rm -e SONAR_HOST_URL="http://<SONARQUBE_URL>:9000" -e SONAR_LOGIN="<SONARQUBE_TOKEN>" -v "$(pwd):/usr/src" sonarsource/sonar-scanner-cli
artifacts:
files:
- sonar-scanner-report.html
discard-paths: yes
Este ejemplo utiliza el contenedor Docker oficial de SonarScanner para realizar el análisis.
7. Integración con Otros Sistemas
SonarQube tiene integraciones con herramientas de CI/CD, Jira, GitHub, Bitbucket, etc. Puedes utilizar estas integraciones para reportar automáticamente problemas de calidad o bloquear merges en tus repositorios si el análisis no cumple con el estándar de calidad.
Integrar SonarQube en tu pipeline de AWS CodePipeline te permite ejecutar análisis de calidad de código de manera automatizada. CodeBuild es el componente que realiza el escaneo de SonarQube, y puedes configurar tu buildspec.yml
para ejecutar el análisis según tus necesidades. La integración de SonarQube en tu pipeline te ayudará a mantener un alto estándar de calidad en tu código y detectar posibles vulnerabilidades de seguridad antes de que lleguen a producción.