doc-locale/fr-fr/ci/yaml/workflow.md
{{< details >}}
{{< /details >}}
Utilisez le mot-clé workflow dans votre fichier .gitlab-ci.yml pour contrôler quand les pipelines sont créés.
Le mot-clé workflow est évalué avant les jobs. Par exemple, si un job est configuré pour s'exécuter pour des tags, mais que le workflow empêche les pipelines de tags, le job ne s'exécute jamais.
if courantes pour workflow:rules {#common-if-clauses-for-workflowrules}Exemples de clauses if pour workflow: rules :
| Exemples de règles | Détails |
|---|---|
if: '$CI_PIPELINE_SOURCE == "merge_request_event"' | Contrôler quand les pipelines de merge request s'exécutent. |
if: '$CI_PIPELINE_SOURCE == "push"' | Contrôler quand les pipelines de branche et les pipelines de tags s'exécutent. |
if: $CI_COMMIT_TAG | Contrôler quand les pipelines de tags s'exécutent. |
if: $CI_COMMIT_BRANCH | Contrôler quand les pipelines de branche s'exécutent. |
Consultez les clauses if courantes pour rules pour plus d'exemples.
workflow: rules {#workflow-rules-examples}Dans l'exemple suivant :
push (modifications apportées aux branches et nouveaux tags).-draft ne s'exécutent pas, car ils sont définis sur when: never.workflow:
rules:
- if: $CI_COMMIT_MESSAGE =~ /-draft$/
when: never
- if: $CI_PIPELINE_SOURCE == "push"
Cet exemple comporte des règles strictes, et les pipelines ne s'exécutent dans aucun autre cas.
Il est également possible que toutes les règles soient définies sur when: never, avec une règle finale when: always. Les pipelines correspondant aux règles when: never ne s'exécutent pas. Tous les autres types de pipeline s'exécutent. Par exemple :
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "schedule"
when: never
- if: $CI_PIPELINE_SOURCE == "push"
when: never
- when: always
Cet exemple empêche les pipelines pour les planifications ou les pipelines push (branches et tags). La règle finale when: always exécute tous les autres types de pipeline, including les pipelines de merge request.
Pour faire basculer le pipeline des pipelines de branche vers les pipelines de merge request après la création d'une merge request, ajoutez une section workflow: rules à votre fichier .gitlab-ci.yml.
Si vous utilisez les deux types de pipeline en même temps, des pipelines en double risquent de s'exécuter simultanément. Pour éviter les pipelines en double, utilisez la variable CI_OPEN_MERGE_REQUESTS.
L'exemple suivant concerne un projet qui exécute uniquement des pipelines de branche et des pipelines de merge request, mais n'exécute pas de pipelines dans d'autres cas. Il exécute :
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
when: never
- if: $CI_COMMIT_BRANCH
Si GitLab tente de déclencher :
Vous pouvez également ajouter une règle à une section workflow existante pour basculer des pipelines de branche vers les pipelines de merge request lors de la création d'une merge request.
Ajoutez cette règle en haut de la section workflow, suivie des autres règles déjà présentes :
workflow:
rules:
- if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push"
when: never
- # Previously defined workflow rules here
Les pipelines déclenchés qui s'exécutent sur une branche ont une variable $CI_COMMIT_BRANCH définie et peuvent être bloqués par une règle similaire. Les pipelines déclenchés ont une source de pipeline trigger ou pipeline, donc && $CI_PIPELINE_SOURCE == "push" garantit que la règle ne bloque pas les pipelines déclenchés.
Vous pouvez utiliser workflow: rules avec les pipelines de merge request. Grâce à ces règles, vous pouvez utiliser les fonctionnalités des pipelines de merge request avec des branches de fonctionnalité, tout en conservant des branches à longue durée de vie pour prendre en charge plusieurs versions de votre logiciel.
Par exemple, pour n'exécuter des pipelines que pour vos merge requests, vos tags et vos branches protégées :
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_TAG
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- if: $CI_COMMIT_REF_PROTECTED == "true"
Cet exemple suppose que votre branche par défaut ou d'autres branches à longue durée de vie sont protégées.
Vous pouvez utiliser workflow: rules pour ignorer les pipelines des merge requests en brouillon. Cette approche permet d'économiser des ressources de calcul jusqu'à ce que le développement soit terminé.
Utilisez la variable CI_MERGE_REQUEST_DRAFT pour vérifier si une merge request est à l'état de brouillon. Cette variable détecte automatiquement tous les formats de brouillon pris en charge par GitLab.
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_DRAFT == "true"
when: never
- when: always
stages:
- build
build-job:
stage: build
script:
- echo "Testing"
[!note] La variable
CI_MERGE_REQUEST_DRAFTa été introduite dans GitLab 17.10. Pour les versions antérieures, utilisezCI_MERGE_REQUEST_TITLEavec une expression régulière à la place.
Checking pipeline status. {#merge-request-stuck-with-checking-pipeline-status-message}Si une merge request affiche Checking pipeline status., mais que le message ne disparaît jamais (le « spinner » ne s'arrête jamais de tourner), cela peut être dû à workflow:rules. Ce problème peut survenir si un projet a l'option Les pipelines doivent réussir activée, mais que les workflow:rules empêchent l'exécution d'un pipeline pour la merge request.
Par exemple, avec ce workflow, les merge requests ne peuvent pas être fusionnées, car aucun pipeline ne peut s'exécuter :
workflow:
rules:
- changes:
- .gitlab/**/**.md
when: never