Gitlab Ci

GitlabCI

GitlabCI Docs

Exemple de CI/CD

image: docker:19.03.5-dind

variables:
    DOCKER_DRIVER: overlay2
    DOCKER_IMAGE: $CI_REGISTRY_IMAGE/portail

services:
   - docker:19.03.1-dind

stages:
   - dependencies
   - test
   - build
   - dev
   - production

"Composer dependencies":
  image: wodby/drupal-php:$PHP_TAG
  stage: dependencies
  script: 
    - cd sources && composer install
  artifacts:
    expire_in: 1 week
    paths:
    - ./sources/vendor
    - ./sources/web
  only:
    - develop
    - merge_requests
    - /^test-.*$/
    - /^v.*$/

"Yarn dependencies":
  image: wodby/node:$NODE_TAG
  stage: dependencies
  script: |
    cd sources/web/themes/custom/mfr_theme && yarn install && yarn run start
  artifacts:
    expire_in: 1 week
    paths:
    - ./sources/web/themes/custom/mfr_theme
  only:
    - develop
    - merge_requests
    - /^test-.*$/
    - /^v.*$/

"Test Composer":
  image: wodby/drupal-php:$PHP_TAG
  stage: test
  script: |
    cd sources && ./scripts/qa/test-code.sh
  dependencies:
    - "Composer dependencies"
  only:
    - merge_requests
    - /^v.*$/

"Test Yarn":
  image: wodby/node:$NODE_TAG
  stage: test
  script: |
    cd sources/web/themes/custom/mfr_theme && yarn run lint
  dependencies:
    - "Yarn dependencies"
  only:
    - merge_requests
    - /^v.*$/

"Docker create indexer" :
  image: docker:19.03.5-dind
  stage: build
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script: |
    docker build -f docker/Dockerfile_indexer -t $CI_REGISTRY/pole-education/mfr/atos-mfr-indexer:$CI_COMMIT_REF_NAME . 2>&1 | tee -a build.log
    docker push $CI_REGISTRY/pole-education/mfr/atos-mfr-indexer:$CI_COMMIT_REF_NAME
  after_script:
    - docker logout $CI_REGISTRY
  dependencies:
    - "Composer dependencies"
    - "Yarn dependencies"
  only:
    - develop
    - /^test-.*$/
    - /^v.*$/

"Docker create solr" :
  image: docker:19.03.5-dind
  stage: build
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script: |
    docker build -f docker/Dockerfile_solr -t $CI_REGISTRY/pole-education/mfr/atos-mfr-solr:$CI_COMMIT_REF_NAME . 2>&1 | tee -a build.log
    docker push $CI_REGISTRY/pole-education/mfr/atos-mfr-solr:$CI_COMMIT_REF_NAME
  after_script:
    - docker logout $CI_REGISTRY
  dependencies:
    - "Composer dependencies"
    - "Yarn dependencies"
  only:
    - develop
    - /^test-.*$/
    - /^v.*$/

"Docker create indexer to dev" :
  image: docker:19.03.5-dind
  stage: dev
  before_script:
    - docker login -u $CI_REGISTRY_USER_ATOS -p $CI_REGISTRY_PASSWORD_ATOS $CI_REGISTRY_ATOS
  script: |
    docker build -f docker/Dockerfile_indexer -t $CI_REGISTRY_ATOS/atos-mfr-indexer:$CI_COMMIT_REF_NAME . 2>&1 | tee -a build.log
    docker push $CI_REGISTRY_ATOS/atos-mfr-indexer:$CI_COMMIT_REF_NAME
  after_script:
    - docker logout mfr-docker.mtpl.bs.fr.atos.net
  dependencies:
    - "Composer dependencies"
    - "Yarn dependencies"
  when: manual
  only:
    - develop
    - /^test-.*$/
    - /^v.*$/

"Docker create solr to dev" :
  image: docker:19.03.5-dind
  stage: dev
  before_script:
    - docker login -u $CI_REGISTRY_USER_ATOS -p $CI_REGISTRY_PASSWORD_ATOS $CI_REGISTRY_ATOS
  script: |
    docker build -f docker/Dockerfile_solr -t $CI_REGISTRY_ATOS/atos-mfr-solr:$CI_COMMIT_REF_NAME . 2>&1 | tee -a build.log
    docker push $CI_REGISTRY_ATOS/atos-mfr-solr:$CI_COMMIT_REF_NAME
  after_script:
    - docker logout 
  dependencies:
    - "Composer dependencies"
    - "Yarn dependencies"
  when: manual
  only:
    - develop
    - /^test-.*$/
    - /^v.*$/
    
"Docker create solr to prod" :
  image: docker:19.03.5-dind
  stage: production
  before_script:
    - docker login $CI_REGISTRY_AZURE -u $CI_REGISTRY_USER_AZURE -p $CI_REGISTRY_PASSWORD_AZURE
  script: |
    docker build -f docker/Dockerfile_solr -t $CI_REGISTRY_AZURE/mfr/solr:$CI_COMMIT_REF_NAME . 2>&1 | tee -a build.log
    docker push $CI_REGISTRY_AZURE/mfr/solr:$CI_COMMIT_REF_NAME
  after_script:
    - docker logout
  only:
    - /^v.*$/

"Docker create indexer to prod" :
  image: docker:19.03.5-dind
  stage: production
  before_script:
    - docker login $CI_REGISTRY_AZURE -u $CI_REGISTRY_USER_AZURE -p $CI_REGISTRY_PASSWORD_AZURE
  script: |
    docker build -f docker/Dockerfile_indexer -t $CI_REGISTRY_AZURE/mfr/indexer:$CI_COMMIT_REF_NAME . 2>&1 | tee -a build.log
    docker push $CI_REGISTRY_AZURE/mfr/indexer:$CI_COMMIT_REF_NAME
  after_script:
    - docker logout
  only:
    - /^v.*$/

Manifeste GitlabCI

Pour s’initier à la CI de Gitlab il faut créer le fichier .gitlab-ci.yml

Le fichier commence par la déclaration d’une image Docker par défaut pour l’exécution du processus.

image: docker:19.03.8-dind

Dans cet exemple, l’image par défaut est une image docker nommée dind. Docker dind c’est quoi ?

L’image doit toujours être accompagnée d’une version la plus précise possible pour éviter des prbolème de montée de version de l’image sans en avoir le contrôle.

On définit par la suite des variables liée à l’utilisation de l’image docker dind. GitlabCI et Docker Build

variables:
    DOCKER_DRIVER: overlay2

Cette variable à pour effet de définir le type de réseau utilisé par l’image.

Par défaut on définit un service pour l’utilisation de Docker Dind.

services:
   - docker:19.03.1-dind

Je définis les étapes de mon processus automatisé.

stages:
   - dependencies
   - test
   - build
   - dev
   - production

Je définit ma première tâche de la manière suivante :

  • Nom de la tâche obligatoire
  • L’image docker à utiliser
  • Le nom de l’étape
  • les commandes à exécuter dans le script
  • La sauvegarde d’artefact issue de la tâche avec une notion de date de péremption
  • La tâche s’exécue uniquement sur la certains branches (branche de feature branch) et en cas de merge request.
"Composer dependencies":
  image: wodby/drupal-php:$PHP_TAG
  stage: dependencies
  script: 
    - cd sources && composer install
  artifacts:
    expire_in: 1 week
    paths:
    - ./sources/vendor
    - ./sources/web
  only:
    - develop
    - merge_requests
    - /^test-.*$/
    - /^v.*$/

Template Gitlab CI

  1. Créer un dépôt spécifique pour vos templates de CI
  2. Ajouter un template

Dans notre exemple nous ferons un template pour la construction d’image Docker :

nom du fichier : Docker.gitlab-ci.yml

# This file is a template, and might need editing before it works on your project.
"🐳 docker-build-master":
  # Official docker image.
  image: docker:latest
  stage: build
  services:
    - docker:dind
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
  script:
    - docker pull $CI_REGISTRY_IMAGE:latest || true
    - docker build --cache-from "$CI_REGISTRY_IMAGE" .
    - docker push "$CI_REGISTRY_IMAGE"
  only:
    - master
  except:
    changes:
      - "*.md"

"🐳 docker-build":
  # Official docker image.
  image: docker:latest
  stage: build
  services:
    - docker:dind
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
  script:
    - docker pull "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG" || true
    - docker build --cache-from "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG" .
    - docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG"
  except:
    refs:
      - master
    changes:
      - "*.md"
  1. Appel du template dans un projet 3.1. Créer un fichier gitlab-ci.yml
include:
  - project: 'template-gitlabci/templates'
    file: 'Docker.gitlab-ci.yml'