Pipeline CI/CD com PHPUnit e SonarQube
Uma das coisas mais importantes e que facilitam muito o trabalho na hora de criar softwares, é ter uma pipeline de integração contínua(CI) e entrega contínua(CD), assim como ter testes unitários na aplicação.
Dentro desse ciclo, é possível integrar ferramentas de análise de qualidade de código, sendo o Sonarqube uma delas (detalhar mais).
Atualmente, temos o PhpUnit e o Pest como dois dosprincipais frameworks de testes unitários para o PHP. Neste artigo, focarei especificamente no PHPUnit.
No arquivo .gitlab-ci.yml, vamos criar um stage para os testes e outro para o SonarQube.
Como podemos observar no código abaixo, o stage responsável por rodar os testes unitários gerará também um arquivo de artefato com o relatório de cobertura de código:
test:
stage: test
image:
name: your application Docker image
entrypoint: [ "" ]
variables:
XDEBUG_MODE: "coverage"
script:
- echo "Executando PHPUnit..."
- cd laravel
- composer update --with-all-dependencies
- vendor/bin/phpunit -c phpunit.xml --coverage-clover=coverage.xml
interruptible: true
allow_failure: true
artifacts:
paths:
- laravel/coverage.xml
dependencies:
- php-composer
sonar:
stage: sonar
image:
name: sonarsource/sonar-scanner-cli:latest
entrypoint: [""]
variables:
SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar"
GIT_DEPTH: "0"
SONAR_SCANNER_OPTS: "-Dsonar.php.coverage.reportPaths=laravel/coverage-report"
cache:
key: "${CI_PROJECT_ID}-${CI_JOB_NAME}"
paths:
- .sonar/cache
dependencies:
- test
script:
- sonar-scanner -Dsonar.qualitygate.wait=false -Dsonar.projectVersion="$CI_COMMIT_REF_NAME" -Dsonar.php.coverage.reportPaths=laravel/coverage.xml
interruptible: true
allow_failure: true
Acima criamos o stage referente ao SonarQube, utilizando a imagem oficial do Sonar. Como podemos observar abaixo, este stage depende do stage test para ser executado. Em seguida, rodamos o script do sonar-scanner para realizar a análise, passando a cobertura gerada pelos testes para o SonarQube.
dependencies:
- test
script:
- sonar-scanner -Dsonar.qualitygate.wait=false -Dsonar.projectVersion="$CI_COMMIT_REF_NAME" -Dsonar.php.coverage.reportPaths=laravel/coverage.xml
Por fim, podemos observar abaixo como serão exibidas algumas informações do relatório de testes gerado pelo PHPUnit.
Como você pode ver, o uso de testes unitários juntamente com o Sonar na sua pipeline é bem fácil e prático. Essa prática garante a qualidade e a estabilidade do código sendo desenvolvido e implantado.