Notes sur GitLab CI

Auteur : Francois-Emmanuel Goffinet

Date de fabrication : Fri Apr 12 2019 09:33:55 GMT+0000 (Coordinated Universal Time)

Téléchargements des supports

Page de garde
Figure 1 : Page de garde

1. Introduction au projet GitLab

GitLab est un outil de gestion du cycle de vie de DevOps basé Web qui fournit un gestionnaire de référentiel Git fournissant des fonctionnalités wiki, de suivi des problèmes et de pipeline CI/CD. Il est développé sous licence open-source par GitLab Inc.

Le logiciel se décline en quatre produits :

  • GitLab CE (Community Edition) - auto-hébergé et grauit, support communautaire.
  • GitLab EE (Enterprise Edition) - auto-hébergé et payant, fonctionnalités supplémentaires.
  • GitLab.com - SaaS et gratuit.
  • GitLab.io - Instance privée gérée par GitLab Inc.

Les outils comparables sont par exemple GitHub ou Bitbucket.

2. Introduction à DevOps avec GitLab CI

La documentation de GitLab CI sur trouve à l'adresse https://docs.gitlab.com/ee/ci/README.html.

Stages of the DevOps lifecycle
Figure 2 : Stages of the DevOps lifecycle

Un cycle de vie DevOps se compose de différentes étapes en boucle : "Plan", "Create", "Verify", "Package", "Release", "Monitor". De manière transversale "Manage" et "Secure" s'intéressent à toutes les étapes du cycle.

Stages of the DevOps lifecycle
Figure 3 : Stages of the DevOps lifecycle
DevOps Stage Description
Manage Statistiques et fonctions d'analyse.
Plan Planification et gestion de projet.
Create Fonctions SCM (Source Code Management)
Verify Tests, qualité du code et fonctions d'intégration continue.
Package Registre des conteneurs Docker.
Release Release et de livraison de l'application.
Configure Outils de configuration d'applications et d'infrastructures.
Monitor Fonctions de surveillance et de métrique des applications.
Secure Fonctionnalités de sécurité.

3. Projet de départ GitLab CI avec Pages

GitLab Pages est une fonctionnalité qui permet de publier des sites web statiques directement à partir d'un référentiel dans GitLab. La documentation de départ accessible à partir de cette page : Creating and Tweaking GitLab CI/CD for GitLab Pages.

Un cycle d'intégration continue dans Gitlab CI est défini à partir d'un fichier de configuration écrit en YAML. Le fichier est placé à la racine du projet sous le nom réservé de .gitlab-ci.yml.

Un "pipeline" est une suite de "stages", soit un flux d'étapes. Un "stage" exécute des jobs. Ceux-ci sont définit par des variables, des commandes et la génération d'"artifacts". Un "artifacts" est le résultats d'une exécution gardé en mémoire pour traitement dans le "pipeline".

L'exécution des jobs sont réalisées dans des conteneurs Docker sur n'importe quel machine ou Pod K8s (Kubernetes) enregistrés comme "Gitlab Runner".

GitLab CI/CD Pipeline Configuration Reference

Un "job" spécial nommé "pages" génère tous les "artifacts" d'un site web dans le dossier spécial public.

Job spécial Pages et dossier public/

Essai local avec un exemple Gitlab

Référentiel à importer : Example GitBook site using GitLab Pages

yum -y install git
git clone https://gitlab.com/pages/gitbook.git
cd gitbook
ls -la
docker run -it -p 4000:4000 -v $PWD:/gitbook node:latest bash
cd /gitbook
npm install gitbook-cli -g
gitbook install
gitbook serve

Pipeline GitLab CI

Fichier .gitlab-ci.yml

# requiring the environment of NodeJS 10
image: node:10

# add 'node_modules' to cache for speeding up builds
cache:
  paths:
    - node_modules/ # Node modules and dependencies

before_script:
  - npm install gitbook-cli -g # install gitbook
  - gitbook fetch 3.2.3 # fetch final stable version
  - gitbook install # add any requested plugins in book.json

test:
  stage: test
  script:
    - gitbook build . public # build to public path
  only:
    - branches # this job will affect every branch except 'master'
  except:
    - master

# the 'pages' job will deploy and build your site to the 'public' path
pages:
  stage: deploy
  script:
    - gitbook build . public # build to public path
  artifacts:
    paths:
      - public
    expire_in: 1 week
  only:
    - master # this job will affect only the 'master' branch

4. CI/CD Gitbook

Pipeline GitLab CI

Référentiel à importer : Gitbook Publication

Pipeline Gitlab pour gitbook
Figure 4 : Pipeline Gitlab pour gitbook

Fichier gitlab-ci.yml :

# This pipeline run three stages Test, Build and Deploy
stages:
  - test
  - build
  - deploy

image: goffinet/gitbook:latest

# the 'gitbook' job will test the gitbook tools
gitbook:
  stage: test
  image: registry.gitlab.com/goffinet/gitbook-gitlab:latest
  script:
    - 'echo "node version: $(node -v)"'
    - gitbook -V
    - calibre --version
  allow_failure: false

# the 'lint' job will test the markdown syntax
lint:
  stage: test
  script:
    - 'echo "node version: $(node -v)"'
    - echo "markdownlint version:" $(markdownlint -V)
    - markdownlint --config ./markdownlint.json README.md
    - markdownlint --config ./markdownlint.json *.md
  allow_failure: true

# the 'html' job will build your document in html format
html:
  stage: build
  dependencies:
    - gitbook
    - lint
  script:
    - gitbook install # add any requested plugins in book.json
    - gitbook build . book # html build
  artifacts:
    paths:
      - book
    expire_in: 1 day
  only:
    - master # this job will affect only the 'master' branch the 'html' job will build your document in pdf format
  allow_failure: false

# the 'pdf' job will build your document in pdf format
pdf:
  stage: build
  dependencies:
    - gitbook
    - lint
  before_script:
    - mkdir ebooks
  script:
    - gitbook install # add any requested plugins in book.json
    - gitbook pdf . ebooks/${CI_PROJECT_NAME}.pdf # pdf build
  artifacts:
    paths:
      - ebooks/${CI_PROJECT_NAME}.pdf
    expire_in: 1 day
  only:
    - master # this job will affect only the 'master' branch the 'pdf' job will build your document in pdf format

# the 'epub' job will build your document in epub format
epub:
  stage: build
  dependencies:
    - gitbook
    - lint
  before_script:
    - mkdir ebooks
  script:
    - gitbook install # add any requested plugins in book.json
    - gitbook epub . ebooks/${CI_PROJECT_NAME}.epub # epub build
  artifacts:
    paths:
      - ebooks/${CI_PROJECT_NAME}.epub
    expire_in: 1 day
  only:
    - master # this job will affect only the 'master' branch

# the 'mobi' job will build your document in mobi format
mobi:
  stage: build
  dependencies:
    - gitbook
    - lint
  before_script:
    - mkdir ebooks
  script:
    - gitbook install # add any requested plugins in book.json
    - gitbook mobi . ebooks/${CI_PROJECT_NAME}.mobi # mobi build
  artifacts:
    paths:
      - ebooks/${CI_PROJECT_NAME}.mobi
    expire_in: 1 day
  only:
    - master # this job will affect only the 'master' branch

# the 'pages' job will deploy your site to your gitlab pages service
pages:
  stage: deploy
  dependencies:
    - html
    - pdf
    - mobi
    - epub # We want to specify dependencies in an explicit way, to avoid confusion if there are different build jobs
  script:
    - mkdir .public
    - cp -r book/* .public
    - cp -r ebooks/* .public
    - mv .public public
  artifacts:
    paths:
      - public
  only:
    - master

Déploiement sur Netlify

Deployer sur Netlify
Figure 5 : Deployer sur Netlify

5. CI/CD Jekyll

Pipeline GitLab CI

Référentiel à importer : Jekyll good-clean-read

Fichier gitlab-ci.yml :

image: ruby:2.3

variables:
  JEKYLL_ENV: production
  LC_ALL: C.UTF-8

before_script:
  - bundle install

pages:
  stage: deploy
  script:
  - bundle exec jekyll build -d public
  artifacts:
    paths:
    - public
  only:
  - gitlab

6. CI/CD Mkdocs

Pipeline GitLab CI

Référentiel à importer : mkdocs-material-boilerplate

Fichier gitlab-ci.yml :

image: python:3.6-alpine

before_script:
  - pip install --upgrade pip && pip install -r requirements.txt

pages:
  script:
    - mkdocs build
    - mv site public
  artifacts:
    paths:
    - public
  only:
  - master

Déploiement sur Netlify

Deployer sur Netlify
Figure 6 : Deployer sur Netlify

7. CI/CD Maven - Apache Tomcat

https://docs.gitlab.com/ee/ci/examples/artifactory_and_gitlab/

Premier exemple

Exemple CI/CD avec Maven, lecture de l'exemple et application selon le document Maven in five minutes.

Créer un dépôt sur Gilab et le cloner localement.

Importer une clé SSH.

Image Docker maven.

Pipeline :

  • test
  • build

Essai local

mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
cd my-app
docker run -it -v $PWD/my-app:/my-app maven bash
exit

Pipeline GitLab CI

Fichier .gitlab-ci.yml

image: maven:latest

build:
  stage: build
  script:
  - mvn package
  artifacts:
    paths:
    - target

test:
  stage: test
  script:
  - java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App

Initialisation d'un repo gitlab

git init
git add *
echo "target" >> .gitignore
git add .gitignore
git remote add origin https://gitlab.com/account/project.git
git push -u origin master

Second exemple

Cette fois ci avec l'archétype Maven "Webapp" et une phase/job "deploy"

  • test
  • build
  • deploy

Déploiement sur Tomcat

...

Méthodes Authentification
SSH et Bash clé secrète
SCP clé secrète
Text Manager avec curl login/mot de passe

Variables cachées

...

Gitlab Runner

Exécution sur un Gitlab-Runner qui héberge le serveur applicatif.

...

Avertissement Slack

...

Pipeline GitLab CI

...

8. Installation d'un serveur GitLab CE

Installation par dépôt de paquetage

How to Install and Configure GitLab CE on CentOS 7.

Modèle AWS CloudFormation

...

9. Administration d'un serveur GitLab

...