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 dependenciesartifacts
: 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:
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 commandefind . -name "*.class" -exec touch {} +
pour cela. Ce script doit être lancé avant les commandes maven ( dans before_script)