HeavyCookie

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 :

.gitlab-ci/test.yml
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 !