Skip to content

Intégration continue

L'intégration continue dans le système de gestion de versions permet d'automatiser certaines étapes du développement, telle que la vérification du respect des normes de code et la vérification des tests unitaires. On peut aussi y intégrer le déploiement; on parlera alors de déploiement continu.

Pour configurer l'intégration continue dans GitLab il faut créer un fichier .gitlab-ci.yml à la racine du dépôt.

Dans ce fichier on spécifie les tâches à exécuter qui sont composées d'instructions (scripts). On spécifie aussi les dépendances à utiliser, telles que les images Docker.

Exemple Angular

image: node:22

# Liste des tâches dans l'ordre d'exécution
stages:
  - test
  - dependencies
  - unit
  - build

# Pour utiliser la cache entre les tâches
cache:
  key: $CI_COMMIT_REF_SLUG
  paths:
    - .npm/

before_script:
  - npm ci --cache .npm --prefer-offline

# On lance le pipeline dès qu'il y a un commit sur dev ou main, ou qu'il y a un merge request à dev ou à main
workflow:
  rules:
    - if: $CI_COMMIT_BRANCH == "dev" || $CI_COMMIT_BRANCH == "main"
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && ( $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "dev" )
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && ( $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" )

# Installation des dépendances
dependencies_job:
  image: node:22-alpine
  stage: dependencies
  script:
    - npm install

# Exécution des tests unitaires
unit-test-job:
  image: trion/ng-cli-karma:20.3.5
  stage: unit
  allow_failure: false
  script:
    - npm install
    - ng test --progress=false --watch=false --code-coverage
  coverage: '/Lines \W+: (\d+\.\d+)%.*/'
  artifacts:
    paths:
      - coverage/ # exporter le rapport de couverture (on pourra le télécharger pour le consulter)


# Vérifier ESLint
lint-test-job:
  image: node:22-alpine
  stage: unit    # En même temps que les tests unitaires.
  script:
    - npm link @angular/[email protected]
    - ng lint

# Créer un build web
build-job:
  image: node:22-alpine
  stage: build
  script:
    - npm link @angular/[email protected]
    - npm run build --release
  artifacts:
    paths:
      - $CI_PROJECT_DIR/dist  # exporter l'application web (qu'on pourra télécharger)

Exemple Laravel

image: php:8.3-cli

stages:
  - dependencies
  - test

cache:
  key: composer
  paths:
    - vendor/

before_script:
  - apt-get update && apt-get install -y git unzip libzip-dev curl
  - docker-php-ext-install zip pdo_mysql
  - pecl install xdebug && docker-php-ext-enable xdebug
  - curl -sS https://getcomposer.org/installer | php
  - mv composer.phar /usr/local/bin/composer
  - composer install

workflow:
  rules:
    - if: $CI_COMMIT_BRANCH == "dev" || $CI_COMMIT_BRANCH == "main"
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && ( $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "dev" )
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && ( $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" )


dependencies_job:
  stage: dependencies
  script:
    - composer install
  artifacts:
    paths:
      - vendor/
    expire_in: 1h

# Run tests
unit_test:
  stage: test
  dependencies:
    - dependencies_job
  script:
    - cp .env.example .env
    - php artisan key:generate
    - php artisan migrate --force
    - XDEBUG_MODE=coverage php artisan test --coverage-html=coverage-report --colors=never
  artifacts:
    when: always
    paths:
      - coverage-report/