Après de longues recherches sur le sujet, personne ne s’est retrouvé (en tous cas pas publiquement) dans une situation similaireà la mienne. Lors de la création d’une pipeline avec une gestion de job parent/enfant, une problème de comportement de la pipliene s’opère.
Droit au but
Le Job parent est en cours que le Job suivant s’exécute, et tombera nécessairement en échec.
Cause : Ne pas définir d’environnement dans le Job enfant.
Contexte
Gitlab v15.6.2 (également testé en v15.2.2)
Création d’une pipeline classique : prepare > build > deploy
- Stage : prepare
- Job classique
- Stage : build
- Job parent/enfant
- Stage : deploy
- Job classique
Utilisation des fonctionnalités sympas de Gitlab :
- Environnements : permettent de regrouper des job pour un même but, créer un environnement statique ou dynamique sur lequel opérer des actions.
Mise en place du cas d’étude
Job parent : .gitlab-ci.yml
--- workflow: rules: - if: $CI_PIPELINE_SOURCE == "web" when: always - if: $CI_PIPELINE_SOURCE == "push" when: always variables: PROJECT_NAME: example-project GITLAB_RUNNER_TAG: gitlab-runner stages: - before - build - deploy dependencies: stage: .pre tags: - $GITLAB_RUNNER_TAG script: | echo ".pre/dependencies" prepare: stage: before tags: - $GITLAB_RUNNER_TAG environment: name: staging/${PROJECT_NAME} deployment_tier: staging script: | echo "prepare/prepare" parent_job: stage: build trigger: strategy: depend include: - local: child.gitlab-ci.yml forward: pipeline_variables: true needs: - prepare deploy: stage: deploy tags: - $GITLAB_RUNNER_TAG environment: name: staging/${PROJECT_NAME} deployment_tier: staging script: | echo "deploy/deploy" needs: - parent_job
Job enfant: child.gitlab-ci.yml
--- stages: - child child_job: stage: child tags: - $GITLAB_RUNNER_TAG environment: name: staging/${PROJECT_NAME} deployment_tier: staging script: | echo "build/stream_generic_jar" sleep 10
Constat d’échec
Naturellement, ons’attend à ce que la pipeline s’exécute de manière séquentielle. La réalité est tout autre : le job qui suit le job parent s’exécute même si le job parent n’est pas terminé.
Le Job en échec affiche la cause suivante :
The deployment job is older than the previously succeeded deployment job, and therefore cannot be run.
On voit clairement que le comportement constaté n’est pas celui attendu.
Origine du problème
La partie en cause de ce comportement est la suivante :
- Définition de l’environnement dans le Job enfant
Correction
Correction du Job enfant.
--- stages: - child child_job: stage: child tags: - $GITLAB_RUNNER_TAG # environment: # name: staging/${PROJECT_NAME} # deployment_tier: staging script: | echo "build/stream_generic_jar" sleep 10
Constat de la correction
On retrouve bien le comportement attendu par la pipeline : chaque Job s’exécute séquentiellement.
Les autres articles autour de Gitlab :