2.4.2 : La configuration du CI
Dans cette section, nous allons écrire le fichier de configuration de l'intégration continue de Gitlab : .gitlab-ci.ymlnoteCe fichier est caché, il commence donc pas un point. :
Il faut tout d'abord définir l'image docker que l'on veut utiliser :
1 |
image: gitlab-registry.in2p3.fr/cta-lapp/cours/tests/testgitlabci/base_ubuntu_ci:0.1 |
Note : Il est possible de spécifier une image différente dans les jobs que l'on définit, mais ce n'est pas nécessaire dans notre cas.
Ensuite, on indique les différentes étapes de notre intégration (sachant que chaque étape peut contenir plusieurs jobs) :
1 2 3 4 |
stages: - BuildTestinstall - DocCoverage - deploy |
La première étape permet de tester que tout fonctionne, sans changer les options de compilation :
1 |
dailyBuildMasterAll:
|
On attache notre job à la première étape BuildTestinstall :
1 |
stage: BuildTestinstall
|
On définie le script qui compilera, installera et testera notre projet :
1 2 3 4 5 6 7 8 9 10 11 12 |
script: - export LD_LIBRARY_PATH=/usr/lib - env - mkdir -p build - cd build - > cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DSELF_TESTS_MODE=yes - make all - make install - make test |
On peut spécifier que l'on veux lancer ce job sur toutes les branches et les tags que l'on créé. De cette manière on peut désactiver un job suivant le contexte.
1 2 3 4 |
only: - branches - tags tags: |
Le deuxième job sera lancé à la seconde étape et se chargera de la couverture des tests :
1 |
TestCoverage:
|
On Spécifie l'étape DocCoverage :
1 |
stage: DocCoverage
|
Ensuite on définie le script de ce job :
1 |
script:
|
Il commence de la même manière que le précédent. Il faut cependant spécifier à cmake que l'on veut construire notre projet avec l'option -DCMAKE_BUILD_TYPE=Coverage :
1 2 3 4 5 6 7 8 9 10 11 12 |
- export LD_LIBRARY_PATH=/usr/lib - env - mkdir -p build coverage - cd build - > cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DSELF_TESTS_MODE=yes -DCMAKE_BUILD_TYPE=Coverage - make all - make install - make test |
À la fin du script, on appele gcovr de différente manière pour obtenir un rapport html, xml et un résumé qui sera parsé par gitlab :
1 2 3 4 |
- cd ../coverage - gcovr -r ../ --exclude-throw-branches --html cov_report.html --html-details - gcovr -r ../ --exclude-throw-branches --xml Coverage.xml - gcovr -r ../ --exclude-throw-branches |
La concept d'artifacts permet de sauvegarder le résultat d'un job, dans notre cas le dossier coverage, on peut définir une date limite de sauvegarde pour l'artifacts, ici une journée (cela permet de ne pas stocker trop d'information dans la durée, cela sera particulièrement intéressant pour le prochain job) :
1 2 3 4 |
artifacts: paths: - coverage expire_in: 1d |
Comme pour le job précédent, on peut spécifier dans quel contexte il doit être déclenché :
1 2 3 4 |
only: - branches - tags tags: |
Maintenant, nous définissons le job générant la documentation du projet qui sera lancer en même temps que le précédent. Donc il est également relié à l'étape DocCoverage :
1 2 |
Doc: stage: DocCoverage |
Enuite, nous écrivons le script de ce job :
1 2 3 4 5 6 7 8 9 10 11 12 |
script: - export LD_LIBRARY_PATH=/usr/lib - env - rm -fr build public - mkdir -p build - mkdir -p public - cd build - > cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DDOC_MODE=yes - make all |
Après avoir compilé le projet noteCela n'est pas vraiment utile dans notre cas, mais si le projet génère des sources pendant la compilation il est important de les prendre en compte lors de la génération de la documentation.
1 |
- make doc
|
Puis, on copie la documentation dans le dossier public qui sera définit comme artifacts :
1 |
- scp -r doc/html/* ../public
|
On définie le dossier public comme artifacts :
1 2 3 4 |
artifacts: paths: - public expire_in: 1d |
Comme pour le job précédent, on peut spécifier dans quel contexte il doit être déclenché :
1 2 3 4 |
only: - branches - tags tags: |
Ce dernier job (à l'étape deploy) va mettre en ligne l'artifacts qu'il contient. Il doit donc s'appeler pages, sinon il ne sera pas reconnu par Gitlab :
1 2 |
pages: stage: deploy |
Nous allons juste déplacer le dossier coverage (du job TestCoverage) dans public (du job Doc) :
1 2 |
script: - mv coverage public/ |
Enfin, nous définissons l'artifacts :
1 2 3 4 |
artifacts: paths: - public expire_in: 1d |
Le fichier .gitlab-ci.yml complet :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
image: gitlab-registry.in2p3.fr/cta-lapp/cours/tests/testgitlabci/base_ubuntu_ci:0.1 stages: - BuildTestinstall - DocCoverage - deploy dailyBuildMasterAll: stage: BuildTestinstall script: - export LD_LIBRARY_PATH=/usr/lib - env - mkdir -p build - cd build - > cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DSELF_TESTS_MODE=yes - make all - make install - make test only: - branches - tags tags: TestCoverage: stage: DocCoverage script: - export LD_LIBRARY_PATH=/usr/lib - env - mkdir -p build coverage - cd build - > cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DSELF_TESTS_MODE=yes -DCMAKE_BUILD_TYPE=Coverage - make all - make install - make test - cd ../coverage - gcovr -r ../ --exclude-throw-branches --html cov_report.html --html-details - gcovr -r ../ --exclude-throw-branches --xml Coverage.xml - gcovr -r ../ --exclude-throw-branches artifacts: paths: - coverage expire_in: 1d only: - branches - tags tags: Doc: stage: DocCoverage script: - export LD_LIBRARY_PATH=/usr/lib - env - rm -fr build public - mkdir -p build - mkdir -p public - cd build - > cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DDOC_MODE=yes - make all - make doc - scp -r doc/html/* ../public artifacts: paths: - public expire_in: 1d only: - branches - tags tags: pages: stage: deploy script: - mv coverage public/ artifacts: paths: - public expire_in: 1d |
Vous pouvez le télécharger ici.