GitLab et Maven: ne pas recompiler les classes entre 2 stages

L’objectif est de ne pas recompiler les classes entre les différents stages d’un pipeline.

Une documentation “officielle” de GitLab pour gérer un build maven est ici: https://docs.gitlab.com/ee/ci/examples/artifactory_and_gitlab/. Dans cette documentation, le dossier target est mis en cache. Or, cela ne semble pas être une bonne pratique surtout que le cache est, par défaut, commun à tous les pipelines. Voir la page https://docs.gitlab.com/ee/ci/caching/ qui explique les différences entre cache et artifacts:

  • cache: Use for temporary storage for project dependencies

  • artifacts: Use for stage results that will be passed between stages

Il faudrait donc utiliser les artifacts pour partager les ressources entre les stages.

Le projet exemple fudaa-test-gitlab utilise ce principe. Voir le fichier .gitlab-ci.yml:

build: stage: build ....cut.... artifacts: #to keep the target folders between the jobs. 10 minutes is enough for that expire_in: 10 min paths: - target/ - client/target/ - server/target/

 

les artifacts à conserver sont définis a partir de la ligne 4: le contenu des dossiers target, client/target et server/target seront partageables entre les différents stages.

Recompilations intempestives

Malgré ce cache, les classes sont recompilées entre 2 stages. La documentation freedumbytes explique ce cas:

  1. Entre 2 stages, les sources sont récupérées via git clone et donc plus récentes que les classes. Un contournement est de faire un touch sur les classe. Le script prevent_maven_recompile.sh lance la commande find . -name "*.class" -exec touch {} + pour cela. Ce script doit être lancé avant les commandes maven ( dans before_script)