Garder Gitlab Auto-Devops et avoir les rapports de tests et de coverage
J'aime bien utiliser toutes les features des produits que j'utilise sans pour autant m’ennuyer à devoir configurer trop de choses. Malheureusement, out-of-the-box, Auto-Devops de Gitlab ne semble pas pouvoir obtenir les rapports de test et de coverage automatiquement.
Pour remplacer une partie de Auto-Devops, la documentation de Gitlab conseille de copier le template de base de Auto-Devops dans son projet et de le modifier directement. Ce n'est pas parfait parce qu'on ne bénéficiera pas des mises à jour automatique du workflow de base, mais on s'en contentera.
Le but est donc de surcharger l'étape test
. Pour cela, il faut commenter cette ligne :
- template: Jobs/Test.gitlab-ci.yml
Et la remplacer par exemple par :
- local: .gitlab-ci/test.yml
Dans mon cas, j'utilise l'image Docker créée lors de l’étape build
pour y faire passer mes tests, ce qui peut donner à peu près ça :
test:
stage: test
image: '${CI_TEMPLATE_REGISTRY_HOST}/gitlab-org/cluster-integration/auto-build-image:${AUTO_BUILD_IMAGE_VERSION}'
variables:
DOCKER_TLS_CERTDIR: ''
services:
- name: 'docker:20.10.12-dind'
command: ['--tls=false', '--host=tcp://0.0.0.0:2375']
script:
# On récupère le nom de l'image buildée et publiée en step 1
- |
if [[ -z "$CI_COMMIT_TAG" ]]; then
export CI_APPLICATION_REPOSITORY=${CI_APPLICATION_REPOSITORY:-$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG}
export CI_APPLICATION_TAG=${CI_APPLICATION_TAG:-$CI_COMMIT_SHA}
else
export CI_APPLICATION_REPOSITORY=${CI_APPLICATION_REPOSITORY:-$CI_REGISTRY_IMAGE}
export CI_APPLICATION_TAG=${CI_APPLICATION_TAG:-$CI_COMMIT_TAG}
fi
# On démarre les tests en partant de cette image
- docker run --name ${CI_COMMIT_SHA} ${CI_APPLICATION_REPOSITORY}:${CI_APPLICATION_TAG} bash -c "yarn install && yarn test:cov"
# On copie les rapports de code coverage
- docker cp ${CI_COMMIT_SHA}:/usr/src/app/coverage/cobertura-coverage.xml ./cobertura-coverage.xml
- docker cp ${CI_COMMIT_SHA}:/usr/src/app/coverage/junit.xml ./junit.xml
# On supprime l'instance du container
- docker rm -vf ${CI_COMMIT_SHA}
rules:
- if: '$TEST_DISABLED'
when: never
- if: '$CI_COMMIT_TAG || $CI_COMMIT_BRANCH'
coverage: '/All files[^|]*\|[^|]*\s+([\d\.]+)/'
artifacts:
reports:
coverage_report:
coverage_format: cobertura
path: cobertura-coverage.xml
junit: junit.xml
La ligne coverage: '/All files[^|]*\|[^|]*\s+([\d\.]+)/'
récupère le pourcentage de code coverage (à modifier selon le framework de test). C'est affiché dans le résumé des pipelines d'une merge request.
La partie artifacts
récupère les rapports pour les intégrer à Gitlab et permet d'avoir un onglet test dans les pipelines avec la liste de tous les tests et une visualisation du code coverage lors des code reviews d'une merge request !