Pipelines avances et multi-projets 30 min de lecture

Parent-child et multi-project pipelines

Parent-child pipelines

Les parent-child pipelines permettent de decouper un pipeline complexe en sous-pipelines independants. Le pipeline parent declenche des pipelines enfants definis dans d'autres fichiers YAML.

Declenchement d'un child pipeline

# .gitlab-ci.yml (parent)
stages:
  - triggers

trigger-frontend:
  stage: triggers
  trigger:
    include: frontend/.gitlab-ci.yml
    strategy: depend    # Le parent attend la fin du child

trigger-backend:
  stage: triggers
  trigger:
    include: backend/.gitlab-ci.yml
    strategy: depend

Pipeline enfant dynamique

generate-config:
  stage: build
  script:
    - python generate_pipeline.py > generated-ci.yml
  artifacts:
    paths:
      - generated-ci.yml

trigger-dynamic:
  stage: deploy
  trigger:
    include:
      - artifact: generated-ci.yml
        job: generate-config
    strategy: depend

Multi-project pipelines

Declencher un pipeline dans un autre projet GitLab :

deploy-infra:
  stage: deploy
  trigger:
    project: devops/infrastructure
    branch: main
    strategy: depend

# Avec passage de variables
deploy-with-vars:
  stage: deploy
  variables:
    APP_VERSION: $CI_COMMIT_TAG
    ENVIRONMENT: production
  trigger:
    project: devops/deploy-scripts
    branch: main

DAG (Directed Acyclic Graph)

Le mot-cle needs permet de creer un graphe de dependances sans respecter l'ordre des stages :

stages:
  - build
  - test
  - deploy

build-frontend:
  stage: build
  script: npm run build

build-backend:
  stage: build
  script: mvn package

test-frontend:
  stage: test
  needs: ["build-frontend"]    # Demarre des que build-frontend finit
  script: npm test

test-backend:
  stage: test
  needs: ["build-backend"]     # Pas besoin d'attendre build-frontend
  script: mvn test

deploy:
  stage: deploy
  needs: ["test-frontend", "test-backend"]
  script: ./deploy.sh
Astuce : Le DAG reduit considerablement le temps total du pipeline car les jobs n'attendent plus la fin de tout le stage precedent.