## 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
- Settings > badges
- Name : Coverage
- Link : https://gitlab.in2p3.fr/%{project_path}/-/commits/%{default_branch}
- Url : https://gitlab.in2p3.fr/%{project_path}/badges/%{default_branch}/coverage.svg
* * *
**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