En esta nueva guia vamos a detallar los pasos para poder analizar nuestro código en SonarQube, configurado en una pipeline de Azure DevOps.
Aunque esta configuración viene bastante bien explicada en el propio configurador de SonarQube, os voy a detallar las tareas que debemos configurar para llevar a cabo este análisis.
Primero, instalaremos la extensión de Sonarqube en nuestro tennant de Azure DevOps. Eso, se realiza desde la propia tienda de extensiones que podemos localizar en la parte superior derecha de nuestro portal.
Aunque nos aparecerán varias extensiones de SonarQube, nosotros debemos instalar la oficial.
Configurar conexión a SonarQube
Una vez finalizada la instalación de la extensión, podemos proceder con la configuración de la conexión a nuestro SonarQube. Esto lo realizaremos desde Project Settings > Service Connections.
Aquí, crearemos un nuevo Service Connection e indicaremos los datos de conexión.
Una vez terminada la configuración de la conexión, procederemos a añadir las tareas necesarias en nuestra pipeline.
SonarQube Prepare
El primer paso es la «preparación» de SonarQube. Aquí debemos indicar los datos de conexión al proyecto de SonarQube que corresponda con nuestra Pipeline.
- task: SonarQubePrepare@5
inputs:
SonarQube: 'SonarQube de Mi Dominio'
scannerMode: 'CLI'
configMode: 'manual'
cliProjectKey: 'devops-project01'
cliSources: 'MyScheme'
extraProperties: |
# Comment if you have a project with mixed ObjC / Swift
sonar.language=swift
# Project description
#sonar.projectDescription=prjDescription
# Path to source directories
sonar.sources=MySchemePRD
# Path to test directories (comment if no test)
#sonar.tests=MySchemeTest
# Destination Simulator to run surefire
# As string expected in destination argument of xcodebuild command
# Example = sonar.swift.simulator=platform=iOS Simulator,name=iPhone 6,OS=9.2
sonar.swift.simulator=platform=iOS Simulator,name=iPhone 11,OS=13.3
# Xcode project configuration (.xcodeproj)
# and use the later to specify which project(s) to include in the analysis (comma separated list)
# Specify either xcodeproj or xcodeproj + xcworkspace
sonar.swift.project=MyScheme.xcodeproj
sonar.swift.workspace=MyScheme.xcworkspace
# Scheme to build your application
sonar.swift.appScheme=MyScheme
# Specify your appname when different from targeted scheme.
# Or when slather fails with 'No product binary found'
# You can also provide a list of framework names to analyse for coverage.
# This will be something like "myApp" or "myApp,myFramework"
# sonar.coverage.binaryNames=myApp,myFramework
# Configuration to use for your scheme. if you do not specify that the default will be Debug
sonar.swift.appConfiguration=Debug
##########################
# Optional configuration #
##########################
# Encoding of the source code
sonar.sourceEncoding=UTF-8
# SCM
# sonar.scm.enabled=true
# sonar.scm.url=scm:git:http://xxx
# JUnit report generated by run-sonar.sh is stored in sonar-reports/TEST-report.xml
# Change it only if you generate the file on your own
# The XML files have to be prefixed by TEST- otherwise they are not processed
sonar.junit.reportsPath=sonar-reports/
# Lizard report generated by run-sonar.sh is stored in sonar-reports/lizard-report.xml
# Change it only if you generate the file on your own
# sonar.swift.lizard.report=sonar-reports/lizard-report.xml
# Cobertura report generated by run-sonar.sh is stored in sonar-reports/coverage-swift.xml
# Change it only if you generate the file on your own
#sonar.swift.coverage.reportPattern=sonar-reports/cobertura.xml
sonar.swift.coverage.reportPattern=sonar-reports/coverage-swift.xml
#sonar.coverageReportPaths=sonar-reports/coverage-swift.xml
# OCLint report generated by run-sonar.sh is stored in sonar-reports/oclint.xml
# Change it only if you generate the file on your own
sonar.swift.swiftlint.report=sonar-reports/*-swiftlint.txt
# Change it only if you generate the file on your own
# sonar.swift.tailor.report=sonar-reports/*tailor.txt
# Paths to exclude from coverage report (surefire, 3rd party libraries etc.)
# sonar.swift.excludedPathsFromCoverage=pattern1,pattern2
#sonar.swift.excludedPathsFromCoverage=.*Tests.*
# Ability to skip tests (such as UI Tests running long time)
# Example = sonar.swift.skipTests=UITests
sonar.c.file.suffixes=-
sonar.cpp.file.suffixes=-
sonar.objc.file.suffixes=-
Las primeras líneas son obligatorias (hasta extraProperties) pero, como indico en el ejemplo, podemos añadir otras configuración que faciliten el análisis del código y así evitar errores en la ejecución.
SonarQube Analyze
La siguiente tarea consiste en el propio análisis del código. Esta tarea solo requiere de una línea de configuración, pero será la que mas tiempo lleve en su ejecución.
- task: SonarQubeAnalyze@5
SonarQube Publish
Por ultimo, crearemos la tarea encargada de enviar el resultado del análisis a SonarQube.
- task: SonarQubePublish@5
inputs:
pollingTimeoutSec: '300'
Una vez creadas las 3 tareas, ya podemos ejecutar nuestra pipeline y, una vez finalizada, comprobar el resultado del análisis en el portal de nuestro servidor de SonarQube.
Si queréis ver mas guías relacionadas con otras herramientas y/o configuraciones de Azure DevOps, dímelo en comentarios.