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
91
92
93
94
95
96
97
98
99
100
101
102
103
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.