## TP5 : intégration et déploiement continus ---- ### Préambule - Le TP est réalisable entièrement dans Gitlab avec l'aide de l'éditeur de pipeline - Vous allez vous placer sur votre projet personnel anf - Vous allez créer une nouvelle branche tp5 - Vous allez vérifier dans les préférences générales du projet si la CI/CD est activée, activez la si nécessaire : Settings > General > Visibility, project features, permissions - A partir de maintenant, vous allez simplement éditer et commiter le manifeste .gitlab-ci.yml - Vous avez des liens pour vous aider sur chaque mot clé qui pointent sur la documentation Gitlab ---- ### Etape 1 : Stages et Pipelines - Créez un fichier .gitlab-ci.yml à la racine de votre projet ou utilisez le bouton "CI/CD configuration" - Ajouter un seul stage test et le job qui correspond - Le script devra faire un "Hello world" et afficher la date courante - Après le commit, visualisez le pipeline et l'execution du runner dans Gitlab
Solution

stages :
  - test

job_test :
  stage: test
  script :
    - echo "Hello world"
    - date
---- - Les jobs sont exécutés dans des conteneurs Docker. - Vous pouvez choisir le conteneur à utiliser avec le mot-clés image - Pour l'execution précédente, l'image par défaut a été utilisée, recommencez en utilisant une image ubuntu
Solution

image : ubuntu
stages :
  - test

job_test :
stage: test
script :
- echo "Hello world"
- date
---- - Un pipeline est défini à l'aide de plusieurs stages - Plusieurs jobs de la même étape pourront être exécuté en même temps si les ressources le permettent. - En revanche, l'exécution d'une étape dépend du bon déroulement de la précédente, à moins d'en autoriser explicitement l'échec avec allow_failure. - Vous allez créer un pipeline dans une image ubuntu avec 3 stages (Solution 1) - le premier va executer une script pour donner la date - le deuxième va executer une script pour donner le listing du répertoire courant "ls" - le troisième va executer une script pour donner des informations système sur la machine "uname -r" - Introduisez une erreur dans le script du stage 2 (appelez une commande non existante genre ms) - Que se passe t'il pour le stage 3 ? - Faites en sorte que le stage 3 soit executé malgré l'échec du stage 2 (Solution 2)
Solution 1

image : ubuntu

stages :
  - test1
  - test2
  - test3

job_test1 :
  stage: test1
  script :
    - date

job_test2 :
  stage: test2
  script :
    - ls

job_test3 :
  stage: test3
  script :
    - uname -r
Solution 2

image : ubuntu

stages :
  - test1
  - test2
  - test3

job_test1 :
  stage: test1
  script :
    - date

job_test2 :
  stage: test2
  script :
    - ms
  allow_failure: true

job_test3 :
  stage: test3
  script :
    - uname -r
---- - Les mots clés only/except permettent de définir des roles de déploiement - Reprenez l'exemple avec 3 stages, et faites en sorte - que le stage 1 soit toujours executé (pas de règles) - que le stage 2 soit executé sur la branche tp5 - que le stage 3 soit executé sur une branche tp5_test que vous allez crée au préalable - Vérifiez les exécutions sur les 2 branches
Solution

image : ubuntu

stages :
  - test1
  - test2
  - test3

job_test1 :
  stage: test1
  script :
    - date

job_test2 :
  stage: test2
  script :
    - ms
  allow_failure: true

job_test3 :
  stage: test3
  script :
    - uname -r
### Etape 2 : Automatisation des tests et génération de la documentation **Problème 1** * Vous allez désormais utiliser une image python:3 pour exécuter le pipeline et il va falloir installer les modules qui vont bien ! * Vous devez avoir dans le répertoire TP5 un répertoire **src** avec le fichier [tri.py](src/tri.py) et son fichier de test [tri_test.py](src/tri_test.py) * Vous allez écrire un stage de lecture qui execute pylint sur tri.py * Vous allez écrire un stage de test qui exécute unittest * Que se passe t'il avec le stage de lecture ? Peut être qu'il faut le considérer comme non bloquant !
Solution
image: python:3
stages:
  - lint
  - test

job_lint:
  stage: lint
  script:
    - pip install pylint
    - cd TP5/src
    - pylint tri
  allow_failure: true

job_test:
  stage: test
  script:
    - cd TP5/src
    - python -m unittest tri_test

* * * **Problème 2** * Vous allez maintenant remplacer unittest par l'outil [`coverage`](https://coverage.readthedocs.io/en/coverage-5.5/) * A partir de `Settings` > `CI/CD` > `General Pipeline` : ajouter l'expression régulière suivante pour les test de couverture : `^TOTAL.+?(\d+\%)$` * Vous pouvez désormais rajouter un badge de couverture dans la partie `Settings` > `General` > `Badges`
Solution coverage
image : python:3
stages :
  - lint
  - test
  - deploy

job_lint :
stage: lint
script:
- pip install pylint
- cd TP5/src
- pylint tri
allow_failure: true

job_test :
stage: test
script:
- pip install coverage
- cd TP5/src
- echo " " && echo "-- Performance tests from tri.py --" && coverage run tri.py
- echo " " && echo "-- Coverage Report via Unit Tests --" && coverage run -m unittest tri_test.py && coverage report  -m --omit=tri_test.py
Badges
* * * **Problème 3** * Vous allez maintenant ajouter un stage de build de la documentation 1. Vous devrez install sphinx et le theme rtd (sphinx-rtd-theme) 2. dans le répertoire documentation adaptez les fichiers à votre convenance : [conf.py](documentation/conf.py "conf for sphinx") et [index.rst](documentation/index.rst "index for sphinx") 3. Générer la documentation avec sphinx-build dans le répertoire public 4. Rajouter le path public dans [l'artifact](https://docs.gitlab.com/ee/ci/pipelines/job_artifacts.html "doc gitlab artifact") 5. Renommer votre job en "pages" et vérifiez après un déploiement réussi, l'accès à vos "pages" dans le menu **Settings > Pages**
Solution
image : python:3
stages :
  - lint
  - test
  - deploy

job_lint :
stage: lint
script:
- pip install pylint
- cd TP5/src
- pylint tri
allow_failure: true

job_test :
stage: test
script:
- pip install coverage
- cd TP5/src
- echo " " && echo "-- Performance tests from tri.py --" && coverage run tri.py
- echo " " && echo "-- Coverage Report via Unit Tests --" && coverage run -m unittest tri_test.py && coverage report  -m --omit=tri_test.py

pages:
stage: deploy
script:
- pip install sphinx -U
- pip install sphinx-rtd-theme
- sphinx-build -b html TP5/documentation public
artifacts:
paths:
- public