{"id":565,"date":"2022-02-16T20:45:54","date_gmt":"2022-02-16T20:45:54","guid":{"rendered":"https:\/\/www.louismarchand.me\/?page_id=565"},"modified":"2022-02-16T21:45:03","modified_gmt":"2022-02-16T21:45:03","slug":"utiliser-les-services-dintegration-continue","status":"publish","type":"page","link":"https:\/\/www.louismarchand.me\/index.php\/utiliser-les-services-dintegration-continue\/","title":{"rendered":"Utiliser les services d&rsquo;int\u00e9gration continue"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>Les services d&rsquo;int\u00e9gration continue sont des outils permettant au syst\u00e8me de d\u00e9veloppement de valider la non-r\u00e9gression du code source sans la n\u00e9cessit\u00e9 d&rsquo;imposer l&rsquo;ex\u00e9cution manuelle des tests aux d\u00e9veloppeurs.<\/p>\n<p>Il est \u00e0 noter qu&rsquo;en plus des tests, les services d&rsquo;int\u00e9gration continue moderne peuvent automatiser un grand nombre de t\u00e2ches. Par exemple les t\u00e2ches de compilation, de livraison, de d\u00e9ploiement et d&rsquo;inspection (monitoring) peuvent \u00eatre faites \u00e0 l&rsquo;aide de ces outils.<\/p>\n<h2>Pourquoi utiliser les services d&rsquo;int\u00e9gration continue dans le logiciel libre<\/h2>\n<p>Il est d&rsquo;autant plus important de bien tester la non-r\u00e9gression des logiciels libres puisque ces derniers encouragent la participation du plus grand nombre au d\u00e9veloppement du logiciel. Sans service d&rsquo;int\u00e9gration continue, les administrateurs de d\u00e9p\u00f4t d&rsquo;un logiciel ayant une grande popularit\u00e9 se verront rapidement d\u00e9pass\u00e9s par les \u00e9v\u00e9nements.<\/p>\n<p>Ainsi, en instaurant une politique de \u00ab\u00a0merge\/pull\u00a0\u00bb request bas\u00e9e sur le r\u00e9sultat d&rsquo;un service d&rsquo;int\u00e9gration continue, les administrateurs de d\u00e9p\u00f4t peuvent diminuer au maximum les t\u00e2ches \u00e0 effectuer durant le \u00ab\u00a0merge\/pull\u00a0\u00bb.<\/p>\n<h2>Types de tests \u00e0 implanter<\/h2>\n<p>En g\u00e9n\u00e9ral, le minimum qu&rsquo;un service de d\u00e9veloppement continu devrait avoir \u00e0 faire est:<\/p>\n<ul>\n<li>La compilation du projet (si n\u00e9cessaire);<\/li>\n<li>L&rsquo;ex\u00e9cution des tests unitaires;<\/li>\n<li>L&rsquo;ex\u00e9cution des tests de non-r\u00e9gression.<\/li>\n<\/ul>\n<p>Si le langage le permet, il est \u00e9galement possible (et souhaitable) d&rsquo;ex\u00e9cuter:<\/p>\n<ul>\n<li>Un \u00ab\u00a0linter\u00a0\u00bb afin de valider le standard du projet;<\/li>\n<li>Les syst\u00e8mes de m\u00e9triques permettant de valider le projet.<\/li>\n<\/ul>\n<p>Il est bien entendu possible d&rsquo;en faire plus.<\/p>\n<h2>Les logiciels d&rsquo;int\u00e9gration continue<\/h2>\n<p>Voici une liste de service libre d&rsquo;int\u00e9gration continue non exhaustive pouvant \u00eatre utilis\u00e9e dans un projet de logiciel libre.<\/p>\n<ul>\n<li>Gitlab CI\/CD<\/li>\n<li>Github Action<\/li>\n<li>Jenkins<\/li>\n<li>Travis CI<\/li>\n<li>Azure Pipelines<\/li>\n<\/ul>\n<h2>La proc\u00e9dure de configuration d&rsquo;un logiciel d&rsquo;int\u00e9gration continue<\/h2>\n<p>Il est important de comprendre que chaque logiciel d&rsquo;int\u00e9gration continue a une proc\u00e9dure de configuration diff\u00e9rente et il est impossible de toutes les montrer ici.<\/p>\n<p>Par contre, ces proc\u00e9dures sont tout de m\u00eame relativement semblables. Nous allons donc utiliser le logiciel Gitlab CI\/CD pour cette pr\u00e9sentation.<\/p>\n<p>Afin d&rsquo;utiliser Gitlab CI\/CD, il est n\u00e9cessaire d&rsquo;avoir un d\u00e9p\u00f4t (ou un clone du d\u00e9p\u00f4t) du projet sur Gitlab.<\/p>\n<h3>Cr\u00e9er le fichier de configuration<\/h3>\n<p>Gitlab CI\/CD utilise des fichiers Yaml afin de configurer le \u00ab\u00a0pipeline\u00a0\u00bb d&rsquo;int\u00e9gration continue. Afin de cr\u00e9er un nouveau fichier de configuration Yaml, il suffit de se rendre dans la section \u00ab\u00a0CI\/CD\u00a0\u00bb dans le d\u00e9p\u00f4t Gitlab.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"220\" height=\"278\" class=\"size-full wp-image-569 aligncenter\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2022\/02\/gitlab_ci_open.png\" alt=\"Gitlab CI\/CD\" \/><\/p>\n<p>Ensuite, pour g\u00e9n\u00e9rer initialement le script, vous pouvez soit utiliser un script mod\u00e8le (\u00ab\u00a0template\u00a0\u00bb) fourni par Gitlab, ou bien utiliser le bouton \u00ab\u00a0use template\u00a0\u00bb pour avoir un mod\u00e8le de base.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"529\" height=\"416\" class=\"size-medium wp-image-572 aligncenter\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2022\/02\/gitlab_ci_specific_template.png\" alt=\"Templates sp\u00e9cifiques\" srcset=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2022\/02\/gitlab_ci_specific_template.png 529w, https:\/\/www.louismarchand.me\/wp-content\/uploads\/2022\/02\/gitlab_ci_specific_template-300x236.png 300w\" sizes=\"auto, (max-width: 529px) 100vw, 529px\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"540\" height=\"307\" class=\"size-medium wp-image-573 aligncenter\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2022\/02\/gitlab_ci_generic_template.png\" alt=\"Template g\u00e9n\u00e9rique\" srcset=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2022\/02\/gitlab_ci_generic_template.png 540w, https:\/\/www.louismarchand.me\/wp-content\/uploads\/2022\/02\/gitlab_ci_generic_template-300x171.png 300w\" sizes=\"auto, (max-width: 540px) 100vw, 540px\" \/><\/p>\n<p>Il est \u00e9galement possible de cr\u00e9er manuellement le fichier Yaml \u00e0 la racine du projet. Le fichier doit s&rsquo;appeler exactement \u00ab\u00a0.gitlab-ci.yml\u00a0\u00bb (ne pas oublier le \u00ab\u00a0.\u00a0\u00bb).<\/p>\n<h3>Les configurations de bases<\/h3>\n<p>En fonction du type de langage \u00e0 utiliser, on utilise des configurations diff\u00e9rentes (avec ou sans compilation, linter, etc.) Nous ne les montrerons pas toutes ici. Nous n&rsquo;allons que montrer la base. La documentation compl\u00e8te est accessible (en anglais seulement) <a href=\"https:\/\/docs.gitlab.com\/ee\/ci\/\">ici<\/a>. Donc, la premi\u00e8re section du script est la section \u00ab\u00a0stages\u00a0\u00bb indiquant les diff\u00e9rentes \u00e9tapes \u00e0 utiliser. Par exemple, la section \u00ab\u00a0stage\u00a0\u00bb suivante a trois (3) \u00e9tapes: la compilation, les tests) et le d\u00e9ploiement:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"nt\">stages<\/span><span class=\"p\">:<\/span>\r\n  <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">compilation<\/span>\r\n  <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">test<\/span>\r\n  <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">deploiement<\/span>\r\n<\/pre>\n<\/div>\n<p>Ensuite, nous pouvons cr\u00e9er autant de sections que nous souhaitons, mais pour que ces sections soient ex\u00e9cut\u00e9es, nous devons sp\u00e9cifier dans quel \u00ab\u00a0stage\u00a0\u00bb ils doivent \u00eatre utilis\u00e9s. Par exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"nt\">stages<\/span><span class=\"p\">:<\/span>\r\n  <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">compilation<\/span>\r\n  <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">test<\/span>\r\n  <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">deploiement<\/span>\r\n\r\n<span class=\"nt\">compilation-job<\/span><span class=\"p\">:<\/span>\r\n  <span class=\"nt\">stage<\/span><span class=\"p\">:<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">compilation<\/span>\r\n  <span class=\"nt\">script<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo Compilation<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">...<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo Compilation termin\u00e9<\/span>\r\n\r\n<span class=\"nt\">unit-test-job<\/span><span class=\"p\">:<\/span>\r\n  <span class=\"nt\">stage<\/span><span class=\"p\">:<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">test<\/span>\r\n  <span class=\"nt\">script<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo Ex\u00e9cution des tests<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">...<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo Fin des tests<\/span>\r\n\r\n<span class=\"nt\">lint-test-job<\/span><span class=\"p\">:<\/span>\r\n  <span class=\"nt\">stage<\/span><span class=\"p\">:<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">test<\/span>\r\n  <span class=\"nt\">script<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo Ex\u00e9cution du Linter<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">...<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo Fin d'ex\u00e9cution du Linter<\/span>\r\n\r\n<span class=\"nt\">deploiement-job<\/span><span class=\"p\">:<\/span>\r\n  <span class=\"nt\">stage<\/span><span class=\"p\">:<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">deploiement<\/span>\r\n  <span class=\"nt\">script<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo D\u00e9ploiement<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">...<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo Fin du d\u00e9ploiement<\/span>\r\n<\/pre>\n<\/div>\n<p>Il est \u00e0 noter que les \u00ab\u00a0&#8230;\u00a0\u00bb dans les sections \u00ab\u00a0script\u00a0\u00bb repr\u00e9sentent les lignes de commande \u00e0 ex\u00e9cuter pour effectuer les \u00e9tapes correspondantes.<\/p>\n<p>Parfois, il est n\u00e9cessaire de garder certaines informations entre les \u00ab\u00a0stages\u00a0\u00bb (par exemple, des fichiers compil\u00e9s). Pour se faire, on utilise des \u00ab\u00a0artifacts\u00a0\u00bb. De plus, pour s&rsquo;assurer que le \u00ab\u00a0Gitlab Runner\u00a0\u00bb ex\u00e9cute les \u00ab\u00a0stages\u00a0\u00bb dans le bon ordre, on peut utiliser des \u00ab\u00a0dependencies\u00a0\u00bb. Voici un exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"nt\">stages<\/span><span class=\"p\">:<\/span>\r\n  <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">compilation<\/span>\r\n  <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">test<\/span>\r\n  <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">deploiement<\/span>\r\n\r\n<span class=\"nt\">compilation-job<\/span><span class=\"p\">:<\/span>\r\n  <span class=\"nt\">stage<\/span><span class=\"p\">:<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">compilation<\/span>\r\n  <span class=\"nt\">script<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo Compilation<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">...<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo Compilation termin\u00e9<\/span>\r\n  <span class=\"nt\">artifacts<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"nt\">paths<\/span><span class=\"p\">:<\/span>\r\n      <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">build<\/span>\r\n\r\n<span class=\"nt\">unit-test-job<\/span><span class=\"p\">:<\/span>\r\n  <span class=\"nt\">stage<\/span><span class=\"p\">:<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">test<\/span>\r\n  <span class=\"nt\">dependencies<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">compilation-job<\/span>\r\n  <span class=\"nt\">script<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo Ex\u00e9cution des tests<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">...<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo Fin des tests<\/span>\r\n\r\n<span class=\"nt\">lint-test-job<\/span><span class=\"p\">:<\/span>\r\n  <span class=\"nt\">stage<\/span><span class=\"p\">:<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">test<\/span>\r\n  <span class=\"nt\">script<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo Ex\u00e9cution du Linter<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">...<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo Fin d'ex\u00e9cution du Linter<\/span>\r\n\r\n<span class=\"nt\">deploiement-job<\/span><span class=\"p\">:<\/span>\r\n  <span class=\"nt\">stage<\/span><span class=\"p\">:<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">deploiement<\/span>\r\n  <span class=\"nt\">dependencies<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">compilation-job<\/span>\r\n  <span class=\"nt\">script<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo D\u00e9ploiement<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">...<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo Fin du d\u00e9ploiement<\/span>\r\n<\/pre>\n<\/div>\n<h3>Utilisation de docker<\/h3>\n<p>L&rsquo;ex\u00e9cution de la configuration du Gitlab CI\/CD de base peut \u00eatre suffisant pour des t\u00e2ches simples ne n\u00e9cessitant pas de logiciel (compilateur, interpr\u00e9teur, etc.) ou librairie particuli\u00e8re. Par contre, si un syst\u00e8me plus pr\u00e9cis est n\u00e9cessaire, il est possible d&rsquo;ex\u00e9cuter les scripts dans des \u00ab\u00a0dockers\u00a0\u00bb. Tous les \u00ab\u00a0dockers\u00a0\u00bb accessibles gratuitement sur le site de <a href=\"https:\/\/hub.docker.com\">DockerHub<\/a> peuvent \u00eatre utilis\u00e9s. \u00c9galement, il est possible de fournir l&rsquo;image docker directement dans le d\u00e9p\u00f4t ou bien utiliser un lien afin de t\u00e9l\u00e9charger l&rsquo;image. Pour utiliser un \u00ab\u00a0docker\u00a0\u00bb, il faut utiliser une information \u00ab\u00a0image\u00a0\u00bb.<\/p>\n<p>Il est \u00e0 noter qu&rsquo;une nouvelle image de \u00ab\u00a0docker\u00a0\u00bb sera g\u00e9n\u00e9r\u00e9e \u00e0 chaque \u00ab\u00a0stage\u00a0\u00bb du \u00ab\u00a0pipeline\u00a0\u00bb. Il est donc n\u00e9cessaire de configurer \u00e0 nouveau le \u00ab\u00a0docker\u00a0\u00bb.<\/p>\n<p>Voici un exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"nt\">stages<\/span><span class=\"p\">:<\/span>\r\n  <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">compilation<\/span>\r\n  <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">test<\/span>\r\n\r\n<span class=\"nt\">compilation-job<\/span><span class=\"p\">:<\/span>\r\n  <span class=\"nt\">image<\/span><span class=\"p\">:<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">debian:latest<\/span>\r\n  <span class=\"nt\">stage<\/span><span class=\"p\">:<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">compilation<\/span>\r\n  <span class=\"nt\">script<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo \"Pr\u00e9paration de l'image...\"<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">apt-get update<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">apt-get install -y build-essential<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">apt-get clean<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">rm -rf \/var\/lib\/apt\/lists\/*<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo \"Pr\u00e9paration termin\u00e9.\"<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo \"Compilation de la librairie...\"<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">make clean<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">make all<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo \"Compilation termin\u00e9e\"<\/span>\r\n  <span class=\"nt\">artifacts<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"nt\">paths<\/span><span class=\"p\">:<\/span>\r\n      <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">bin<\/span>\r\n\r\n<span class=\"nt\">test-job<\/span><span class=\"p\">:<\/span>\r\n  <span class=\"nt\">image<\/span><span class=\"p\">:<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">debian:latest<\/span>\r\n  <span class=\"nt\">stage<\/span><span class=\"p\">:<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">test<\/span>\r\n  <span class=\"nt\">dependencies<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">compilation-job<\/span>\r\n  <span class=\"nt\">script<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo \"Pr\u00e9paration de l'image...\"<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">apt-get update<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">apt-get install -y build-essential<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">apt-get clean<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">rm -rf \/var\/lib\/apt\/lists\/*<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo \"Pr\u00e9paration termin\u00e9.\"<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo \"Compilation des tests...\"<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">cd test<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">make clean<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">make all<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo \"Ex\u00e9cution des tests...\"<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">bin\/Release\/test<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo \"Fin des tests.\"<\/span>\r\n<\/pre>\n<\/div>\n<p>Si la m\u00eame image est utilis\u00e9e pour tous les \u00ab\u00a0stage\u00a0\u00bb, on peut sp\u00e9cifier l&rsquo;image une seule fois. De plus, afin de ne pas dupliquer inutilement la pr\u00e9paration du docker, on peut utiliser l&rsquo;information \u00ab\u00a0extends\u00a0\u00bb et mettre les instructions dans un \u00ab\u00a0before_script\u00a0\u00bb commun.<\/p>\n<p>Voici un exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"nt\">image<\/span><span class=\"p\">:<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">debian:latest<\/span>\r\n\r\n<span class=\"nt\">stages<\/span><span class=\"p\">:<\/span>\r\n  <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">compilation<\/span>\r\n  <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">test<\/span>\r\n\r\n<span class=\"nt\">.prepare-image<\/span><span class=\"p\">:<\/span>\r\n  <span class=\"nt\">before_script<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo \"Pr\u00e9paration de l'image...\"<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">apt-get update<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">apt-get install -y build-essential<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">apt-get clean<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">rm -rf \/var\/lib\/apt\/lists\/*<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo \"Pr\u00e9paration termin\u00e9.\"<\/span>\r\n\r\n<span class=\"nt\">compilation-job<\/span><span class=\"p\">:<\/span>\r\n  <span class=\"nt\">stage<\/span><span class=\"p\">:<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">compilation<\/span>\r\n  <span class=\"nt\">extends<\/span><span class=\"p\">:<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">.prepare-image<\/span>\r\n  <span class=\"nt\">script<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo \"Compilation de la librairie...\"<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">make clean<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">make all<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo \"Compilation termin\u00e9e\"<\/span>\r\n  <span class=\"nt\">artifacts<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"nt\">paths<\/span><span class=\"p\">:<\/span>\r\n      <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">bin<\/span>\r\n\r\n<span class=\"nt\">test-job<\/span><span class=\"p\">:<\/span>\r\n  <span class=\"nt\">stage<\/span><span class=\"p\">:<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">test<\/span>\r\n  <span class=\"nt\">extends<\/span><span class=\"p\">:<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">.prepare-image<\/span>\r\n  <span class=\"nt\">dependencies<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">compilation-job<\/span>\r\n  <span class=\"nt\">script<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo \"Compilation des tests...\"<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">cd test<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">make clean<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">make all<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo \"Ex\u00e9cution des tests...\"<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">bin\/Release\/test<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo \"Fin des tests.\"<\/span>\r\n<\/pre>\n<\/div>\n<h3>Les variables<\/h3>\n<p>Il y a trois types de variables utilisables dans un script Yaml de gitlab CI\/CD:<\/p>\n<ul>\n<li>Variable pr\u00e9d\u00e9finie<\/li>\n<li>Variable publique<\/li>\n<li>Variable cach\u00e9e<\/li>\n<\/ul>\n<p>Les variables pr\u00e9d\u00e9finies sont des variables qui sont d\u00e9finies par le Gitlab Runner directement. Il y en a une grande quantit\u00e9 et on peut avoir leur documentation <a href=\"https:\/\/docs.gitlab.com\/ee\/ci\/variables\/predefined_variables.html\">ici<\/a>.<\/p>\n<p>Les variables publiques sont g\u00e9n\u00e9ralement indiqu\u00e9es directement dans le fichier \u00ab\u00a0.gitlab-ci.yml\u00a0\u00bb; dans une section \u00ab\u00a0variables\u00a0\u00bb (soit dans un \u00ab\u00a0stage\u00a0\u00bb ou dans une section en tant que telle).<\/p>\n<p>Voici un exemple utilisant des variables:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"nt\">variables<\/span><span class=\"p\">:<\/span>\r\n  <span class=\"nt\">VARIABLE_GOLBALE<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"Valeur<\/span> <span class=\"s\">de<\/span> <span class=\"s\">la<\/span> <span class=\"s\">variable<\/span> <span class=\"s\">globale\"<\/span>\r\n\r\n<span class=\"nt\">stages<\/span><span class=\"p\">:<\/span>\r\n  <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">jobs<\/span>\r\n\r\n<span class=\"nt\">job_1<\/span><span class=\"p\">:<\/span>\r\n  <span class=\"nt\">stage<\/span><span class=\"p\">:<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">jobs<\/span>\r\n  <span class=\"nt\">variables<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"nt\">VARIABLE_LOCALE<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"Valeur<\/span> <span class=\"s\">de<\/span> <span class=\"s\">la<\/span> <span class=\"s\">variable<\/span> <span class=\"s\">locale\"<\/span>\r\n  <span class=\"nt\">script<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo \"Nom du stage courrant:\" \"$CI_JOB_STAGE\"<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo \"La variable globale:\" \"$VARIABLE_GOLBALE\"<\/span>\r\n    <span class=\"p p-Indicator\">-<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">echo \"La variable locale:\" \"$VARIABLE_LOCALE\"<\/span>\r\n<\/pre>\n<\/div>\n<p>Les derniers types de variables sont les variables cach\u00e9es. Ce type de variable n\u00e9cessite de placer la valeur de ces variables directement dans les configurations priv\u00e9es du d\u00e9p\u00f4t Gitlab. Il est g\u00e9n\u00e9ralement utile de cr\u00e9er ce type de variable lorsque certaines informations n\u00e9cessaires \u00e0 la compilation et aux tests ne peuvent pas \u00eatre publiques. Le meilleur exemple de ce type de variables est les cl\u00e9s d&rsquo;API Web.<\/p>\n<p>Afin de d\u00e9clarer une variable cach\u00e9e il faut aller dans les configurations CI\/CD du d\u00e9p\u00f4t.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"415\" height=\"312\" class=\"size-medium wp-image-591 aligncenter\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2022\/02\/gitlab_ci_variable_cache_1.png\" alt=\"\" srcset=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2022\/02\/gitlab_ci_variable_cache_1.png 415w, https:\/\/www.louismarchand.me\/wp-content\/uploads\/2022\/02\/gitlab_ci_variable_cache_1-300x226.png 300w\" sizes=\"auto, (max-width: 415px) 100vw, 415px\" \/><\/p>\n<p>Ensuite, il faut se rendre dans la section \u00ab\u00a0Variables\u00a0\u00bb<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"638\" height=\"228\" class=\"size-medium wp-image-592 aligncenter\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2022\/02\/gitlab_ci_variable_cache_2.png\" alt=\"\" srcset=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2022\/02\/gitlab_ci_variable_cache_2.png 638w, https:\/\/www.louismarchand.me\/wp-content\/uploads\/2022\/02\/gitlab_ci_variable_cache_2-300x107.png 300w\" sizes=\"auto, (max-width: 638px) 100vw, 638px\" \/><\/p>\n<p>Enfin, on peut ajouter des variables en utilisant le bouton \u00ab\u00a0Add variable\u00a0\u00bb<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"205\" height=\"153\" class=\"size-full wp-image-593 aligncenter\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2022\/02\/gitlab_ci_variable_cache_3.png\" alt=\"\" \/><\/p>\n<p>Les variables sont repr\u00e9sent\u00e9es de mani\u00e8re \u00ab\u00a0Cl\u00e9-&gt;Valeur\u00a0\u00bb ou la cl\u00e9 est le nom de la variable et la valeur est sa valeur.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"764\" height=\"495\" class=\"size-medium wp-image-595 aligncenter\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2022\/02\/gitlab_ci_variable_cache_4.png\" alt=\"\" srcset=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2022\/02\/gitlab_ci_variable_cache_4.png 764w, https:\/\/www.louismarchand.me\/wp-content\/uploads\/2022\/02\/gitlab_ci_variable_cache_4-300x194.png 300w\" sizes=\"auto, (max-width: 764px) 100vw, 764px\" \/><\/p>\n<p>Il est important de noter que pour s&rsquo;assurer que la valeur de la variable n&rsquo;apparaisse pas dans les \u00ab\u00a0logs\u00a0\u00bb des ex\u00e9cutions de \u00ab\u00a0pipeline\u00a0\u00bb, il faut cocher le \u00ab\u00a0Mask\u00a0\u00bb. Noter \u00e9galement que les variables \u00ab\u00a0Mask\u00a0\u00bb doivent respecter les crit\u00e8res suivants:<\/p>\n<ul>\n<li>\u00catre sur une seule ligne,<\/li>\n<li>\u00catre d&rsquo;au moins 8 caract\u00e8res,<\/li>\n<li>\u00catre des caract\u00e8res compatibles avec le standard <a href=\"https:\/\/base64.guru\/learn\/base64-characters\">Base64<\/a>, en plus des caract\u00e8res:\n<ul>\n<li>\u00ab\u00a0@\u00a0\u00bb, \u00ab\u00a0:\u00a0\u00bb, \u00ab\u00a0.\u00a0\u00bb et \u00ab\u00a0~\u00a0\u00bb<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.louismarchand.me\/index.php\/projet-dans-un-contexte-de-logiciel-libre\/\">Retour<\/a><\/p>\n<hr \/>\n<p>Auteur: Louis Marchand<br \/>\n<a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/deed.fr\" target=\"_blank\" rel=\"license noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/i.creativecommons.org\/l\/by\/4.0\/80x15.png\" alt=\"Creative Commons License\" \/><\/a><br \/>\nSauf pour les sections sp\u00e9cifi\u00e9es autrement, ce travail est sous licence <a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/deed.fr\" target=\"_blank\" rel=\"license noopener noreferrer\">Creative Commons Attribution 4.0 International<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Les services d&rsquo;int\u00e9gration continue sont des outils permettant au syst\u00e8me de d\u00e9veloppement de valider la non-r\u00e9gression du code source sans la n\u00e9cessit\u00e9 d&rsquo;imposer l&rsquo;ex\u00e9cution manuelle des tests aux d\u00e9veloppeurs. Il est \u00e0 noter qu&rsquo;en plus des tests, les services d&rsquo;int\u00e9gration continue moderne peuvent automatiser un grand nombre de t\u00e2ches. Par exemple les t\u00e2ches de&hellip; <a class=\"more-link\" href=\"https:\/\/www.louismarchand.me\/index.php\/utiliser-les-services-dintegration-continue\/\">Continue reading <span class=\"screen-reader-text\">Utiliser les services d&rsquo;int\u00e9gration continue<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-565","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/565","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/comments?post=565"}],"version-history":[{"count":23,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/565\/revisions"}],"predecessor-version":[{"id":597,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/565\/revisions\/597"}],"wp:attachment":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/media?parent=565"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}