Commit 77bfefe0 authored by Cyril L'Orphelin's avatar Cyril L'Orphelin
Browse files

Merge branch 'develop' into 'master'

TP5

See merge request !17
parents f250dc80 084d88e6
## 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
- 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 <a href="https://docs.gitlab.com/ee/ci/yaml/#stages">stage</a> test et le <a href="https://docs.gitlab.com/ee/ci/yaml/#jobs">job </a> 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
<details>
<summary>Solution</summary>
<pre><code>
stages :
- test
job_test :
stage: test
script :
- echo "Hello world"
- date
</code></pre>
</details>
----
- 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
<details>
<summary>Solution</summary>
<pre><code>
image : ubuntu
stages :
- test
job_test :
stage: test
script :
- echo "Hello world"
- date
</code></pre>
</details>
----
- Un pipeline est défini à l'aide de plusieurs <a href="https://docs.gitlab.com/ee/ci/yaml/#stages">stages</a>
- 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 <a href="https://docs.gitlab.com/ee/ci/yaml/#allow_failure">allow_failure.</a>
- 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)
<details>
<summary>Solution 1 </summary>
<pre><code>
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
</code></pre>
</details>
<details>
<summary>Solution 2 </summary>
<pre><code>
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
</code></pre>
</details>
----
- Les mots clés <a href="https://docs.gitlab.com/ee/ci/yaml/#only--except">only/except</a> 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
<details>
<summary>Solution </summary>
<pre><code>
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
</code></pre>
</details>
### Etape 2 : Automatisation des tests avec Python
**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 !
<details>
<summary>Solution </summary>
<pre class=" language-yaml" tabindex="0"><code class=" language-yaml"><span class="token key atrule">image</span><span class="token punctuation">:</span> python<span class="token punctuation">:</span><span class="token number">3</span>
<span class="token key atrule">stages</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> lint
<span class="token punctuation">-</span> test
<span class="token key atrule">job_lint</span><span class="token punctuation">:</span>
<span class="token key atrule">stage</span><span class="token punctuation">:</span> lint
<span class="token key atrule">script</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> pip install pylint
<span class="token punctuation">-</span> cd TP5/src
<span class="token punctuation">-</span> pylint tri
<span class="token key atrule">allow_failure</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>
<span class="token key atrule">job_test</span><span class="token punctuation">:</span>
<span class="token key atrule">stage</span><span class="token punctuation">:</span> test
<span class="token key atrule">script</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> cd TP5/src
<span class="token punctuation">-</span> python <span class="token punctuation">-</span>m unittest tri_test
</code>
</details>
</pre>
* * *
**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`
<details>
<summary>Solution coverage</summary>
<pre class=" language-yaml" tabindex="0"><code class=" language-yaml"><span class="token key atrule">image</span> <span class="token punctuation">:</span> python<span class="token punctuation">:</span><span class="token number">3</span>
<span class="token key atrule">stages</span> <span class="token punctuation">:</span>
<span class="token punctuation">-</span> lint
<span class="token punctuation">-</span> test
<span class="token punctuation">-</span> deploy
<span class="token key atrule">job_lint</span> <span class="token punctuation">:</span>
<span class="token key atrule">stage</span><span class="token punctuation">:</span> lint
<span class="token key atrule">script</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> pip install pylint
<span class="token punctuation">-</span> cd TP5/src
<span class="token punctuation">-</span> pylint tri
<span class="token key atrule">allow_failure</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>
<span class="token key atrule">job_test</span> <span class="token punctuation">:</span>
<span class="token key atrule">stage</span><span class="token punctuation">:</span> test
<span class="token key atrule">script</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> pip install coverage
<span class="token punctuation">-</span> cd TP5/src
<span class="token punctuation">-</span> echo " " <span class="token important">&amp;&amp;</span> echo "<span class="token punctuation">-</span><span class="token punctuation">-</span> Performance tests from tri.py <span class="token punctuation">-</span><span class="token punctuation">-</span>" <span class="token important">&amp;&amp;</span> coverage run tri.py
<span class="token punctuation">-</span> echo " " <span class="token important">&amp;&amp;</span> echo "<span class="token punctuation">-</span><span class="token punctuation">-</span> Coverage Report via Unit Tests <span class="token punctuation">-</span><span class="token punctuation">-</span>" <span class="token important">&amp;&amp;</span> coverage run <span class="token punctuation">-</span>m unittest tri_test.py <span class="token important">&amp;&amp;</span> coverage report <span class="token punctuation">-</span>m <span class="token punctuation">-</span><span class="token punctuation">-</span>omit=tri_test.py
</code></pre>
</details>
<details>
<summary>Badges</summary>
<ul>
<li>Settings > badges </li>
<li>Name : Coverage</li>
<li>Link : https://gitlab.in2p3.fr/%{project_path}/-/commits/%{default_branch}</li>
<li>Url : https://gitlab.in2p3.fr/%{project_path}/badges/%{default_branch}/coverage.svg</li>
</ul>
</details>
* * *
**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**
<details>
<summary>Solution</summary>
<pre class=" language-yaml" tabindex="0"><code class=" language-yaml"><span class="token key atrule">image</span> <span class="token punctuation">:</span> python<span class="token punctuation">:</span><span class="token number">3</span>
<span class="token key atrule">stages</span> <span class="token punctuation">:</span>
<span class="token punctuation">-</span> lint
<span class="token punctuation">-</span> test
<span class="token punctuation">-</span> deploy
<span class="token key atrule">job_lint</span> <span class="token punctuation">:</span>
<span class="token key atrule">stage</span><span class="token punctuation">:</span> lint
<span class="token key atrule">script</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> pip install pylint
<span class="token punctuation">-</span> cd TP5/src
<span class="token punctuation">-</span> pylint tri
<span class="token key atrule">allow_failure</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>
<span class="token key atrule">job_test</span> <span class="token punctuation">:</span>
<span class="token key atrule">stage</span><span class="token punctuation">:</span> test
<span class="token key atrule">script</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> pip install coverage
<span class="token punctuation">-</span> cd TP5/src
<span class="token punctuation">-</span> echo " " <span class="token important">&amp;&amp;</span> echo "<span class="token punctuation">-</span><span class="token punctuation">-</span> Performance tests from tri.py <span class="token punctuation">-</span><span class="token punctuation">-</span>" <span class="token important">&amp;&amp;</span> coverage run tri.py
<span class="token punctuation">-</span> echo " " <span class="token important">&amp;&amp;</span> echo "<span class="token punctuation">-</span><span class="token punctuation">-</span> Coverage Report via Unit Tests <span class="token punctuation">-</span><span class="token punctuation">-</span>" <span class="token important">&amp;&amp;</span> coverage run <span class="token punctuation">-</span>m unittest tri_test.py <span class="token important">&amp;&amp;</span> coverage report <span class="token punctuation">-</span>m <span class="token punctuation">-</span><span class="token punctuation">-</span>omit=tri_test.py
</code></pre>
</details>
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment