Comunicación entre BitbucketCloud, Jenkins y Sonarqube. Además de poder validar el porcentaje de cobertura y notificar el éxito o fallo del pipeline a Bitbucket en el Pull Request creado.
Para poder lograr el alcance mencionado se utilizó Docker, Jenkins, Sonarqube y BitbucketCloud.
Descargar Docker Desktop Mac de la página web de Docker. Parala elaboración de este README se utilizó la versión para Mac.
-
Abrir un terminal y obtener una imagen de Jenkins, la cual se puede encontrar en Docker Hub, en este caso hemos usado la última versión.
docker pull jenkins/jenkins
-
Crear un contenedor de la imagen de Jenkins obtenida anteriormente. Establecer los puertos ha usar con el siguiente comando:
docker run -p 8080:8080 -p 50000:50000 <nombre-imagen>
-
Abrir un navegador web e ingresar a
http://localhost:8080/
. Hasta este punto ya tenemos Jenkins corriendo.
Dado que el Jenkins se está ejecutando en la computadora de manera local este no será visible para otras herramientas y plataformas que estén en Internet.
Para solucionar esto usamos la herramienta Ngrok la cual permite exponer a Internet un servidor web que se ejecute en la máquina local.
-
Entrar al contenedor creado previamente:
docker exec -u root -ti <nombre-contenedor> bash
-
Actualizamos el repositorio:
apt-get update
-
Entrar a la carpeta
jenkins_home
:/cd /var/jenkins_home/
-
Crear la carpeta
android-sdk
:mkdir android-sdk
-
Entrar a la carpeta creada:
cd /var/jenkins_home/android-sdk
-
Descargar el
SDK tools
para Linux usando el utilitariowget
:wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip
-
Extraer el contenido:
unzip sdk-tools-linux-4333796.zip
-
Entrar a la carpeta
bin
:cd tools/bin/
-
Crear el archivo
repositories.cfg
:touch ~/.android/repositories.cfg
-
Actualizar los SDK:
./sdkmanager —-update
-
Ejecutar el siguiente comando y aceptar todas las licencias:
./sdkmanager --licenses
-
Descargar la plataforma y build-tools de acuerdo a nuestro proyecto.
./sdkmanager "platforms;android-29" "build-tools;29.0.2" "extras;google;m2repository" "extras;android;m2repository"
-
Con esto ya tenemos Android SDK instalado en el contenedor Jenkins. Finalmente ejecutar
exit
para salir del contenedor.exit
-
Se debe indicar la ruta del Android SDK. Ir a Administrar Jenkins > Configurar el Sistema.
-
Buscar la sección Propiedades globales y habilitar la opción Variables de entorno. En nombre ingresar ANDROID_HOME y /var/jenkins_home/android-sdk en valor.
-
Finalmente hacer click en el botón Guardar.
-
Al igual que con Jenkins abrir un terminal y obtener la imagen oficial de Sonarqube.
docker pull sonarqube
-
Crear el contenedor de la imagen obtenida en el paso previo.
docker run -d --name sonarqube -p 9000:9000 <nombre-imagen>
-
Abrir un navegador y acceder a
http://localhost:9000/
.
-
En la url del SonarQube ir a Administration, luego en Configuration presionar sobre este, aparecerá una lista de opciones, hacer click en Webhooks.
-
Hacer click en el botón Create, ingresar el nombre que deseemos, en la sección URL ingresar <Jenkins-URL>/sonarqube-webhook/ y hacer click en el botón Create.
-
En SonarQube seleccionar la opción Quality Gates que se encuentra en la parte superior.
-
Hacer click en Create, colocar un nombre y agregar las condiciones que se desea y finalmente seleccionar el proyecto que se será afectado por estas condiciones.
Si deseamos reforzar la seguridad al no proporcionar las credenciales de un usuario real de Sonarqube se puede proporcionar un token de usuario como reemplazo de inicio de sesión del usuario. Esto aumentará la seguridad de la instalación al no permitir que la contraseña de un usuario viaje a traves de la red.
-
Primero, en SonarQube ir a My Account y luego hacer click en Security.
-
Agregar un nombre para el token y hacer click en Generate, se mostrará un token el cual será usado en Jenkins para establecer el servidor de SonarQube.
-
Ir a Administrar Jenkins > Administrar Plugins > Todos los plugins, en la caja de Filtrar ingresar SonarQube Scanner for Jenkins.
-
Se debe indicar el servidor SonarQube. Ir a Administrar Jenkins > Configurar el Sistema.
-
Buscar la sección SonarQube servers, agregar el nombre, la url y el token de autenticación de nuestro servidor SonarQube.
-
Ingresar a Bitbucket Cloud, crear o seleccionar el repositorio que se desee. Ingresar a la sección Settings > Webhooks, hacer click en Add webhook, ingresar un nombre para el webhook, en la URL ingresar <Jenkins-URL>/bitbucket-scmsource-hook/notify y seleccionar en qué acciones queremos que se notifique a Jenkins.
-
Ahora en Jenkis, ir a Administrar Jenkins > Administrar Plugins > Todos los plugins, en la caja de Filtrar ingresar Bitbucket Branch Source y seleccionarlo, luego ingresar en la caja de texto e ingresar Bitbucket Build Status Notifier y hacer lo mismo.
El plugin Bitbucket Build Status Notifier este complemento está dirigido a BitBucket Cloud, no a BitBucket Server (anteriormente conocido como Stash).
Con este plugin podemos usar la función bitbucketStatusNotify(buildState) el cual acepta tres parametros
INPROGRESS
,SUCCESSFUL
yFAILED
.Para mayor información visitar el [GitHub] (https://github.com/jenkinsci/bitbucket-build-status-notifier-plugin) del plugin.
Las integraciones de la API REST de Bitbucket Cloud pueden usar OAuth 2.0 para acceder a recursos en Bitbucket.
-
Ir a Bitbucket settings, dentro de la sección ACCESS MANAGNEMENT ir a OAuth.
-
Ingresar un nombre para el OAuth consumer, en Callback URL ingresar la url del Jenkins.
-
Marcar las opciones de lectura y escritura para repositorios y pull request.
-
Luego en Jenkins ir a Administrar Jenkins > Configurar el Sistema. Buscar la sección Bitbucket Build Status Notifier Plugin, si no se tiene las credenciales guardadas anteriormente entonces dar click en el botón Add para agregar la credencial global.
-
Seleccionar el tipo Username with password.
-
Establecer el key de OAuth consumer en Username.
-
Establecer el secret de OAuth consumer en Password.
-
Hacer click el botón Add.
-
En el combo box seleccionar la credencial guarda que se ha creado.
-
Finalmente hacer click en el botón Guardar.
-
En la página principal de Jenkins, hacer click e un Nueva Tarea.
-
Seleccionar la opción Multibranch Pipeline.
-
En la siguiente vista, ir a la sección Branch Sources. hacer click sobre el combo box Add source y seleccionar la opción Bitbucket.
-
Agregar las credenciales, nombre de usuario de Bitbucket, luego se mostrará en el sección Repository Name los repositorios públicos que tengamos.
-
Indicar la ruta del Jenkinsfile.
-
Hacer click en el botón Save.
-
Se ejecutará por primera vez lo configurado y se mostrará una vista similar a la siguiente:
Se creó un Jenkisfile con 4 stages (etapas): Checkout, Build, Sonar y Quality Gate.
-
En el stage Checkout hacemos una llamada a bitbucketStatusNotify(buildState: 'INPROGRESS') para notificar el estado al repositorio.
stage('Checkout') { steps { bitbucketStatusNotify(buildState: 'INPROGRESS') checkout scm } }
-
En el stage Build corremos la aplicación Android.
stage('Build') { steps { sh "./gradlew assembleDebug --no-daemon" } }
-
En el stage Sonar hacemos uso del bloque
withSonarQubeEnv
el cual recibe como parámetro el nombre del SonarQube.stage('Sonar') { steps { withSonarQubeEnv("SonarQube") { sh "./gradlew --info sonarqube --no-daemon" } } }
-
En el stage Quality Gate, la función
waitForQualityGate()
devuelve el estado del quality gate, si no se tiene el establecido en SonarQube se lanza un error.stage("Quality Gate") { steps { script { def qg = waitForQualityGate() if (qg.status != 'OK') { error "Pipeline aborted due to quality gate failure: ${qg.status}" } } } }
-
Finalmente en el pipeline tenemos acciones post ejecución de stages para notificar el estado del pipeline al repositorio.
post { success { bitbucketStatusNotify(buildState: 'SUCCESSFUL') } aborted { bitbucketStatusNotify(buildState: 'FAILED') } failure { bitbucketStatusNotify(buildState: 'FAILED') } }