{"id":27298,"date":"2023-08-25T11:26:25","date_gmt":"2023-08-25T09:26:25","guid":{"rendered":"https:\/\/digatus.com\/partie-2-ci-cd-avance-avec-azure-devops\/"},"modified":"2025-11-27T11:40:52","modified_gmt":"2025-11-27T10:40:52","slug":"partie-2-ci-cd-avance-avec-azure-devops","status":"publish","type":"post","link":"https:\/\/digatus.com\/fr\/partie-2-ci-cd-avance-avec-azure-devops\/","title":{"rendered":"Partie 2 : CI\/CD avanc\u00e9 avec Azure DevOps"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"27298\" class=\"elementor elementor-27298 elementor-15405\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-a014c68 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"a014c68\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d36618b\" data-id=\"d36618b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-59dfede elementor-widget elementor-widget-text-editor\" data-id=\"59dfede\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h5>Partie 2 : Biblioth\u00e8ques Go, mod\u00e8les de pipelines et versionnement<\/h5>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-f53c9b9 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"f53c9b9\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ef99a8e\" data-id=\"ef99a8e\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c35c145 elementor-widget elementor-widget-text-editor\" data-id=\"c35c145\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><em>Apr\u00e8s avoir cr\u00e9\u00e9 un pipeline simple dans la premi\u00e8re partie de cette s\u00e9rie d&rsquo;articles, nous approfondissons le sujet dans la partie 2. Nous cr\u00e9ons une biblioth\u00e8que pour notre projet Go d&rsquo;exemple, qui contiendra du code commun avec d&rsquo;autres futurs microservices Go. Ce faisant, nous relevons le d\u00e9fi de maintenir son d\u00e9p\u00f4t Git priv\u00e9 dans Azure DevOps. Ensuite, nous cr\u00e9ons un nouveau pipeline pour une application Python. Afin d&rsquo;\u00e9viter la duplication de code dans les scripts de pipeline, nous cr\u00e9ons un mod\u00e8le de pipeline dont les deux pipelines h\u00e9ritent leur structure de base. De plus, nous \u00e9tendons les pipelines avec un versionnement automatique utilisant des tags Git, ce qui simplifiera consid\u00e9rablement la gestion des d\u00e9pendances et l&rsquo;utilisation des images Docker publi\u00e9es.     <\/em><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-dfb5090 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"dfb5090\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ec0952d\" data-id=\"ec0952d\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-413196e elementor-widget elementor-widget-text-editor\" data-id=\"413196e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h5>Int\u00e9gration de biblioth\u00e8ques Go personnelles depuis Azure Repos<\/h5><p>La gestion des d\u00e9pendances en Go est relativement simple : elle ne n\u00e9cessite que l&rsquo;URL d&rsquo;un d\u00e9p\u00f4t Git et un tag Git. Go extrait ensuite du d\u00e9p\u00f4t Git le commit correspondant au tag et met le code \u00e0 disposition lors de la compilation. Pour les d\u00e9p\u00f4ts Git publics, par exemple sur GitHub, cela ne pose g\u00e9n\u00e9ralement pas de probl\u00e8me. En revanche, pour les d\u00e9p\u00f4ts Git priv\u00e9s, quelques \u00e9tapes suppl\u00e9mentaires sont n\u00e9cessaires.   <\/p><p>Tout d&rsquo;abord, nous cr\u00e9ons un second projet Go nomm\u00e9 <strong>example-go-library<\/strong> avec une fonction que nous utiliserons plus tard dans <strong>example-go-project<\/strong>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-7d6d2df elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7d6d2df\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b529bed\" data-id=\"b529bed\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3bf8f60 elementor-widget elementor-widget-image\" data-id=\"3bf8f60\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"768\" height=\"165\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-library_go.mod_-768x165.png\" class=\"attachment-medium_large size-medium_large wp-image-27300\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-library_go.mod_-768x165.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-library_go.mod_-300x65.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-library_go.mod_.png 868w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e979bf1 elementor-widget elementor-widget-image\" data-id=\"e979bf1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"768\" height=\"167\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-library_log_message.go_-768x167.png\" class=\"attachment-medium_large size-medium_large wp-image-27299\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-library_log_message.go_-768x167.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-library_log_message.go_-300x65.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-library_log_message.go_.png 871w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-26c1dcc elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"26c1dcc\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a6bf6af\" data-id=\"a6bf6af\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-43521e8 elementor-widget elementor-widget-text-editor\" data-id=\"43521e8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Pour que notre biblioth\u00e8que puisse \u00eatre r\u00e9f\u00e9renc\u00e9e ult\u00e9rieurement dans d&rsquo;autres projets Go, il est imp\u00e9ratif d&rsquo;utiliser l&rsquo;URL compl\u00e8te comme nom de module :<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-4c2cc61 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"4c2cc61\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-613b5d6\" data-id=\"613b5d6\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-e6c547a elementor-widget elementor-widget-image\" data-id=\"e6c547a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"768\" height=\"30\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/module-768x30.png\" class=\"attachment-medium_large size-medium_large wp-image-27301\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/module-768x30.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/module-300x12.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/module.png 890w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c0a9211 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"c0a9211\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-67516c6\" data-id=\"67516c6\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4c5f82a elementor-widget elementor-widget-text-editor\" data-id=\"4c5f82a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Sinon, nous obtiendrons des messages d&rsquo;erreur de ce type :<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-7889591 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7889591\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8821294\" data-id=\"8821294\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-21b43ed elementor-widget elementor-widget-image\" data-id=\"21b43ed\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"126\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/go.mod-error-768x126.png\" class=\"attachment-medium_large size-medium_large wp-image-27302\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/go.mod-error-768x126.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/go.mod-error-300x49.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/go.mod-error.png 889w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-a28546a elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"a28546a\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-23eea8a\" data-id=\"23eea8a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a4d99c0 elementor-widget elementor-widget-text-editor\" data-id=\"a4d99c0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>L&rsquo;importation dans <strong>example-go-project<\/strong> se pr\u00e9sente alors comme suit :<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-495160b elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"495160b\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-80d8f69\" data-id=\"80d8f69\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-38f9930 elementor-widget elementor-widget-image\" data-id=\"38f9930\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"144\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-project_go.mod_-768x144.png\" class=\"attachment-medium_large size-medium_large wp-image-27303\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-project_go.mod_-768x144.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-project_go.mod_-300x56.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-project_go.mod_.png 869w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-11b0511 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"11b0511\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3d27b3e\" data-id=\"3d27b3e\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d58c368 elementor-widget elementor-widget-text-editor\" data-id=\"d58c368\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Si la biblioth\u00e8que est un d\u00e9p\u00f4t Git priv\u00e9 comme dans ce cas, les param\u00e8tres suivants sont \u00e9galement n\u00e9cessaires (\u00e0 la fois dans l&rsquo;environnement de d\u00e9veloppement local et plus tard dans le Dockerfile) :<\/p><ul><li>La variable d&rsquo;environnement <em>GOPRIVATE<\/em>. Elle emp\u00eache le chargement de la biblioth\u00e8que via un proxy Go public (qui n&rsquo;a pas acc\u00e8s au d\u00e9p\u00f4t Git priv\u00e9). <\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-9a7dae9 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"9a7dae9\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f8c068b\" data-id=\"f8c068b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-9ef7a3e elementor-widget elementor-widget-image\" data-id=\"9ef7a3e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"30\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/GOPRIVATE-768x30.png\" class=\"attachment-medium_large size-medium_large wp-image-27304\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/GOPRIVATE-768x30.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/GOPRIVATE-300x12.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/GOPRIVATE.png 803w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-8b88cc6 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"8b88cc6\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2e56b4f\" data-id=\"2e56b4f\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2619d5b elementor-widget elementor-widget-text-editor\" data-id=\"2619d5b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li>Le param\u00e8tre Git suivant pour l&rsquo;authentification (un PAT peut \u00eatre cr\u00e9\u00e9 dans Azure DevOps sous l&rsquo;option de menu \u00ab Personal Access Tokens \u00bb dans le menu utilisateur en haut \u00e0 droite) :<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-11f664f elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"11f664f\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c7861f5\" data-id=\"c7861f5\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ad5ca5b elementor-widget elementor-widget-image\" data-id=\"ad5ca5b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"50\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/gitconfig-768x50.png\" class=\"attachment-medium_large size-medium_large wp-image-27305\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/gitconfig-768x50.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/gitconfig-300x19.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/gitconfig.png 801w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-7f74973 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7f74973\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b6bfce3\" data-id=\"b6bfce3\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b9e2c83 elementor-widget elementor-widget-text-editor\" data-id=\"b9e2c83\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Nous prenons comme base le petit serveur HTTP de la partie 1 de cette s\u00e9rie d&rsquo;articles et rempla\u00e7ons l&rsquo;importation \u00ab github.com\/sirupsen\/logrus \u00bb par \u00ab dev.azure.com\/dennishellerdigatus\/CICD-Test\/_git\/example-go-library.git\/log \u00bb et tous les appels de logrus.Info par log.Message.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-58ccbbb elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"58ccbbb\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-76126f6\" data-id=\"76126f6\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-55869c6 elementor-widget elementor-widget-image\" data-id=\"55869c6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"463\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-project_main.go_-768x463.png\" class=\"attachment-medium_large size-medium_large wp-image-27306\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-project_main.go_-768x463.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-project_main.go_-300x181.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-project_main.go_.png 870w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-b79b3b8 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"b79b3b8\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ce07633\" data-id=\"ce07633\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-cfdcef5 elementor-widget elementor-widget-text-editor\" data-id=\"cfdcef5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Le Dockerfile doit \u00e9galement \u00eatre adapt\u00e9 en cons\u00e9quence pour que nous ayons acc\u00e8s au d\u00e9p\u00f4t Git priv\u00e9. Nous d\u00e9finissons donc ici aussi la variable d&rsquo;environnement GOPRIVATE et le param\u00e8tre Git avec le PAT : <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-8471cc0 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"8471cc0\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9e9bb34\" data-id=\"9e9bb34\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-149142e elementor-widget elementor-widget-image\" data-id=\"149142e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"420\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-project_Dockerfile-768x420.png\" class=\"attachment-medium_large size-medium_large wp-image-27307\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-project_Dockerfile-768x420.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-project_Dockerfile-300x164.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-project_Dockerfile.png 870w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-feec094 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"feec094\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-38f1e8f\" data-id=\"38f1e8f\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c6f846c elementor-widget elementor-widget-text-editor\" data-id=\"c6f846c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Nous devons \u00e9galement adapter le pipeline. L\u00e0 aussi, nous effectuons les pr\u00e9paratifs n\u00e9cessaires avant l&rsquo;\u00e9tape go mod download. Heureusement, nous n&rsquo;avons pas besoin de publier notre PAT personnel dans le Dockerfile, mais nous obtenons un PAT g\u00e9n\u00e9r\u00e9 automatiquement, car le build est d\u00e9j\u00e0 ex\u00e9cut\u00e9 dans le cadre prot\u00e9g\u00e9 de notre projet Azure DevOps. Nous l&rsquo;obtenons via la variable $(System.AccessToken) et il n&rsquo;est valide que pour la dur\u00e9e du build. Le pipeline complet se pr\u00e9sente maintenant comme suit :    <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-5b212fd elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"5b212fd\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7d651fc\" data-id=\"7d651fc\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5328517 elementor-widget elementor-widget-image\" data-id=\"5328517\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1947\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-project_azure-pipelines.yaml_-768x1947.png\" class=\"attachment-medium_large size-medium_large wp-image-27308\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-project_azure-pipelines.yaml_-768x1947.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-project_azure-pipelines.yaml_-118x300.png 118w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-project_azure-pipelines.yaml_-404x1024.png 404w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-project_azure-pipelines.yaml_-606x1536.png 606w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-project_azure-pipelines.yaml_-808x2048.png 808w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-go-project_azure-pipelines.yaml_.png 850w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-ca578ad elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"ca578ad\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8c921be\" data-id=\"8c921be\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b1e1914 elementor-widget elementor-widget-text-editor\" data-id=\"b1e1914\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Lors de l&rsquo;ex\u00e9cution du pipeline, nous voyons que le PAT est utilis\u00e9 et masqu\u00e9 par Azure DevOps :<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-791bb4a elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"791bb4a\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-0210835\" data-id=\"0210835\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ed92285 elementor-widget elementor-widget-image\" data-id=\"ed92285\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1394\" height=\"847\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-04-27-213738.png\" class=\"attachment-full size-full wp-image-27309\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-04-27-213738.png 1394w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-04-27-213738-300x182.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-04-27-213738-1024x622.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-04-27-213738-768x467.png 768w\" sizes=\"(max-width: 1394px) 100vw, 1394px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-8c0c31e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"8c0c31e\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8759023\" data-id=\"8759023\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-04e24be elementor-widget elementor-widget-text-editor\" data-id=\"04e24be\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Ensuite, un test dans un shell local nous confirme que tout fonctionne toujours comme auparavant :<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-fb8c6a4 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"fb8c6a4\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-e723c65\" data-id=\"e723c65\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7c2e1e1 elementor-widget elementor-widget-image\" data-id=\"7c2e1e1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"67\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-04-26-122318-768x67.png\" class=\"attachment-medium_large size-medium_large wp-image-27310\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-04-26-122318-768x67.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-04-26-122318-300x26.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-04-26-122318-1024x90.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-04-26-122318.png 1176w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-43b57b6 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"43b57b6\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-bc4a2bd\" data-id=\"bc4a2bd\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-9797d9d elementor-widget elementor-widget-text-editor\" data-id=\"9797d9d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>M\u00eame si tout semble identique de l&rsquo;ext\u00e9rieur, nous avons maintenant l&rsquo;avantage de pouvoir d\u00e9placer n&rsquo;importe quel code dans la biblioth\u00e8que et le r\u00e9utiliser dans d&rsquo;autres projets Go. En particulier dans un paysage de microservices avec de nombreux petits services \u00e9crits en Go, il y a g\u00e9n\u00e9ralement une base de code commune, de sorte que l&rsquo;introduction d&rsquo;une biblioth\u00e8que peut permettre d&rsquo;\u00e9conomiser beaucoup de code dupliqu\u00e9. <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-6eebefb elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6eebefb\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6fdfa8b\" data-id=\"6fdfa8b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f1be3db elementor-widget elementor-widget-text-editor\" data-id=\"f1be3db\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h5>Le deuxi\u00e8me pipeline CI \u2013 Python et Docker<\/h5><p>Afin d&rsquo;apporter un peu de diversit\u00e9 dans notre environnement de microservices, nous allons n\u00e9anmoins changer de langage et cr\u00e9er un autre microservice en Python. Celui-ci devra appeler le point de terminaison REST de notre microservice Go. Naturellement, le nouveau microservice b\u00e9n\u00e9ficiera \u00e9galement d&rsquo;un pipeline. \u00c9tant donn\u00e9 que Python, contrairement \u00e0 Go, est interpr\u00e9t\u00e9 \u00e0 l&rsquo;ex\u00e9cution, l&rsquo;\u00e9tape de compilation est ici supprim\u00e9e. Les \u00e9tapes de test sont similaires \u00e0 celles du pipeline Go, et les \u00e9tapes Docker sont identiques. Plus tard, nous extrairons les \u00e9l\u00e9ments communs des deux pipelines dans un mod\u00e8le de pipeline, afin d&rsquo;\u00e9viter \u00e9galement ici la duplication de code et d&rsquo;\u00eatre flexibles pour d&rsquo;autres pipelines futurs.     <\/p><p>Voici le code simple de notre application Python, qui appelle simplement notre microservice Go toutes les 3 secondes et enregistre le r\u00e9sultat :<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-fbcc75e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"fbcc75e\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5c3f0ee\" data-id=\"5c3f0ee\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a5cebce elementor-widget elementor-widget-image\" data-id=\"a5cebce\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"422\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-python-project_main.py_-768x422.png\" class=\"attachment-medium_large size-medium_large wp-image-27311\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-python-project_main.py_-768x422.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-python-project_main.py_-300x165.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-python-project_main.py_.png 869w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-84ec043 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"84ec043\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3e79aef\" data-id=\"3e79aef\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-067bb68 elementor-widget elementor-widget-text-editor\" data-id=\"067bb68\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Par souci d&rsquo;exhaustivit\u00e9, nous cr\u00e9ons \u00e9galement un petit test unitaire qui simule le microservice Go et capture la sortie standard avec capsys :<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-fc3a113 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"fc3a113\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-841e86b\" data-id=\"841e86b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7c585f0 elementor-widget elementor-widget-image\" data-id=\"7c585f0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"423\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-python-project_main_test.py_-768x423.png\" class=\"attachment-medium_large size-medium_large wp-image-27312\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-python-project_main_test.py_-768x423.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-python-project_main_test.py_-300x165.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-python-project_main_test.py_.png 869w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-126cd75 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"126cd75\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-beadcf5\" data-id=\"beadcf5\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-df077ff elementor-widget elementor-widget-text-editor\" data-id=\"df077ff\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Nous empaquetons ensuite l&rsquo;application dans une image Docker. La variable d&rsquo;environnement <span style=\"color: #800080;\"><em>PYTHONUNBUFFERED<\/em><\/span>=<span style=\"color: #0000ff;\">1<\/span> est importante pour s&rsquo;assurer que nous pouvons voir les sorties de journaux en temps r\u00e9el. Nous installons les d\u00e9pendances &#8211; dans ce cas, une seule biblioth\u00e8que, sinon nous utiliserions un fichier de requirements &#8211; avec <span style=\"color: #0000ff;\">pip<\/span>.  <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c06edc7 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"c06edc7\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a1e904b\" data-id=\"a1e904b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1ee824b elementor-widget elementor-widget-image\" data-id=\"1ee824b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"297\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-python-project_Dockerfile-768x297.png\" class=\"attachment-medium_large size-medium_large wp-image-27313\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-python-project_Dockerfile-768x297.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-python-project_Dockerfile-300x116.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-python-project_Dockerfile.png 847w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-623ec50 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"623ec50\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d4d688e\" data-id=\"d4d688e\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-0e6e0da elementor-widget elementor-widget-text-editor\" data-id=\"0e6e0da\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Nous cr\u00e9ons le pipeline de mani\u00e8re analogue au pipeline Go. Dans la premi\u00e8re \u00e9tape, nous informons \u00e0 nouveau Azure DevOps du langage et de la version avec lesquels nous souhaitons travailler &#8211; dans ce cas, Python 3.11.3. Ensuite, nous installons les d\u00e9pendances, puis nous ex\u00e9cutons les tests avec <strong>pytest<\/strong>. Le param\u00e8tre <strong>&#8211;capture=tee-sys<\/strong> permet de capturer la sortie standard dans le test. Avec <strong>&#8211;cov=main<\/strong>, nous calculons la couverture de code et avec <strong>&#8211;junit-xml=report.xml<\/strong>, nous g\u00e9n\u00e9rons le rapport de test classique. Ici aussi, il existe d\u00e9j\u00e0 un outil pour pr\u00e9parer la couverture de code : le package Python <strong>coverage<\/strong>. Sans param\u00e8tres suppl\u00e9mentaires, il est compatible par d\u00e9faut avec le format de r\u00e9sultat de <strong>pytest <\/strong>. Les \u00e9tapes restantes pour publier les r\u00e9sultats des tests et pour construire et pousser l&rsquo;image Docker sont identiques au pipeline Go :       <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-5bfc617 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"5bfc617\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-24ff154\" data-id=\"24ff154\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2631911 elementor-widget elementor-widget-image\" data-id=\"2631911\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1323\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-python-project_azure-pipelines.yaml_-768x1323.png\" class=\"attachment-medium_large size-medium_large wp-image-27314\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-python-project_azure-pipelines.yaml_-768x1323.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-python-project_azure-pipelines.yaml_-174x300.png 174w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-python-project_azure-pipelines.yaml_-594x1024.png 594w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-python-project_azure-pipelines.yaml_.png 869w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c636742 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"c636742\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ed15861\" data-id=\"ed15861\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b1db171 elementor-widget elementor-widget-text-editor\" data-id=\"b1db171\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Notre premier pipeline Python est termin\u00e9. Le r\u00e9sultat est remarquable : <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-f39d221 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"f39d221\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7c6a463\" data-id=\"7c6a463\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4561c7e elementor-widget elementor-widget-image\" data-id=\"4561c7e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1390\" height=\"847\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-05-02-160536.png\" class=\"attachment-full size-full wp-image-27315\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-05-02-160536.png 1390w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-05-02-160536-300x183.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-05-02-160536-1024x624.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-05-02-160536-768x468.png 768w\" sizes=\"(max-width: 1390px) 100vw, 1390px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-f15d925 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"f15d925\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-caa7956\" data-id=\"caa7956\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3d7ed36 elementor-widget elementor-widget-text-editor\" data-id=\"3d7ed36\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>De m\u00eame pour les r\u00e9sultats des tests et la couverture :<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-2965c15 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"2965c15\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-86505ef\" data-id=\"86505ef\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4906fa2 elementor-widget elementor-widget-image\" data-id=\"4906fa2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1392\" height=\"844\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-05-03-055114.png\" class=\"attachment-full size-full wp-image-27317\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-05-03-055114.png 1392w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-05-03-055114-300x182.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-05-03-055114-1024x621.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-05-03-055114-768x466.png 768w\" sizes=\"(max-width: 1392px) 100vw, 1392px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0e15433 elementor-widget elementor-widget-image\" data-id=\"0e15433\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1394\" height=\"848\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-05-03-055206.png\" class=\"attachment-full size-full wp-image-27316\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-05-03-055206.png 1394w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-05-03-055206-300x182.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-05-03-055206-1024x623.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-05-03-055206-768x467.png 768w\" sizes=\"(max-width: 1394px) 100vw, 1394px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-014c826 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"014c826\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f138d1a\" data-id=\"f138d1a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4e0cf9d elementor-widget elementor-widget-text-editor\" data-id=\"4e0cf9d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h5>Penser de mani\u00e8re prospective : les mod\u00e8les de pipeline<\/h5><p>Si nous comparons maintenant nos deux pipelines &#8211; Go et Python &#8211; nous constatons que nous avons certaines \u00e9tapes identiques et d&rsquo;autres diff\u00e9rentes. Pour \u00e9conomiser du travail sur les futurs pipelines, Azure DevOps nous offre la possibilit\u00e9 de cr\u00e9er des mod\u00e8les de pipeline. De plus, si nous voulons modifier ou \u00e9tendre ult\u00e9rieurement une partie commune du pipeline, nous n&rsquo;aurons alors qu&rsquo;\u00e0 le faire une seule fois dans le mod\u00e8le commun et non dans chaque pipeline individuel.  <\/p><p><span style=\"font-style: inherit; font-weight: inherit; color: var( --e-global-color-text ); background-color: var(--ast-global-color-4);\">La hi\u00e9rarchie des mod\u00e8les pourrait m\u00eame \u00eatre pouss\u00e9e plus loin, de sorte que nous aurions, par exemple, un mod\u00e8le commun pour l&rsquo;ensemble de l&rsquo;entreprise, puis un sous-mod\u00e8le pour le projet et d&rsquo;autres sous-mod\u00e8les pour CI et CD, diff\u00e9rents langages et frameworks jusqu&rsquo;au pipeline final pour un microservice. Le mot-cl\u00e9 pour utiliser les mod\u00e8les est, comme dans la programmation orient\u00e9e objet,  <\/span><span style=\"font-style: inherit; font-weight: inherit; background-color: var(--ast-global-color-4); color: #0000ff;\">extends<\/span><span style=\"font-style: inherit; font-weight: inherit; color: var( --e-global-color-text ); background-color: var(--ast-global-color-4);\">:. Il est important de noter qu&rsquo;un pipeline ne peut h\u00e9riter que d&rsquo;un seul mod\u00e8le. La cl\u00e9 pour rendre les mod\u00e8les extensibles r\u00e9side dans les param\u00e8tres, qui permettent de remplir les espaces r\u00e9serv\u00e9s dans le mod\u00e8le. Ces param\u00e8tres peuvent \u00eatre de simples valeurs textuelles, des nombres, des listes, des objets complexes et m\u00eame des listes d&rsquo;\u00e9tapes compl\u00e8tes de pipeline. Des valeurs par d\u00e9faut sont \u00e9galement possibles. Les param\u00e8tres d&rsquo;un mod\u00e8le sont d\u00e9clar\u00e9s tout en haut du mod\u00e8le dans la section     <\/span><span style=\"font-style: inherit; font-weight: inherit; background-color: var(--ast-global-color-4); color: #0000ff;\">parameters<\/span><span style=\"font-style: inherit; font-weight: inherit; color: var( --e-global-color-text ); background-color: var(--ast-global-color-4);\">: et peuvent ensuite \u00eatre utilis\u00e9s dans le code du mod\u00e8le avec la notation suivante : <\/span><strong style=\"font-style: inherit; color: var( --e-global-color-text ); background-color: var(--ast-global-color-4);\">{{ parameters.xxx }}<\/strong><span style=\"font-style: inherit; font-weight: inherit; color: var( --e-global-color-text ); background-color: var(--ast-global-color-4);\">. La hi\u00e9rarchie des mod\u00e8les et les param\u00e8tres sont \u00e9valu\u00e9s lors de la compilation du pipeline pour cr\u00e9er un seul grand script de pipeline dans lequel les param\u00e8tres sont d\u00e9j\u00e0 remplac\u00e9s. Contrairement aux param\u00e8tres, il existe des variables dites qui peuvent \u00eatre cr\u00e9\u00e9es, modifi\u00e9es et lues au moment de l&rsquo;ex\u00e9cution. Celles-ci sont utilis\u00e9es avec la notation suivante et ne sont interpr\u00e9t\u00e9es qu&rsquo;\u00e0 l&rsquo;ex\u00e9cution :   <\/span><strong style=\"font-style: inherit; color: var( --e-global-color-text ); background-color: var(--ast-global-color-4);\">$(variable)<\/strong><span style=\"font-style: inherit; font-weight: inherit; color: var( --e-global-color-text ); background-color: var(--ast-global-color-4);\">. Les fichiers de mod\u00e8le sont stock\u00e9s comme des pipelines normaux sous forme de fichiers YAML. Comme ils sont utilis\u00e9s dans plusieurs autres d\u00e9p\u00f4ts Git, il est judicieux de cr\u00e9er un d\u00e9p\u00f4t Git distinct pour eux, dans notre cas, nous l&rsquo;appelons  <\/span><strong style=\"font-style: inherit; color: var( --e-global-color-text ); background-color: var(--ast-global-color-4);\">example-pipeline-templates<\/strong><span style=\"font-style: inherit; font-weight: inherit; color: var( --e-global-color-text ); background-color: var(--ast-global-color-4);\">.<\/span><\/p><p>Revenons \u00e0 nos deux pipelines : la structure de base (la publication des r\u00e9sultats de test et la construction et le t\u00e9l\u00e9chargement de l&rsquo;image Docker) est identique. Seule la partie centrale, la construction et les tests, diff\u00e8re. Voici un aper\u00e7u de toutes les \u00e9tapes des deux pipelines :  <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-4dcf604 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"4dcf604\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f1c2725\" data-id=\"f1c2725\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-56c2919 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"56c2919\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9fe9502\" data-id=\"9fe9502\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a6602ed elementor-widget elementor-widget-text-editor\" data-id=\"a6602ed\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Il est donc logique de d\u00e9placer l&rsquo;\u00e9tape <span style=\"color: #0000ff;\">checkout<\/span>: et les 4 derni\u00e8res \u00e9tapes dans un mod\u00e8le commun et d&rsquo;utiliser un espace r\u00e9serv\u00e9 avec un param\u00e8tre pour la partie centrale. Cela ressemble \u00e0 ceci : <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-b3ca769 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"b3ca769\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ca8aa39\" data-id=\"ca8aa39\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-92bd39d elementor-widget elementor-widget-image\" data-id=\"92bd39d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"928\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-pipeline-templates_azure-pipelines-ci-docker.yaml_-768x928.png\" class=\"attachment-medium_large size-medium_large wp-image-27318\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-pipeline-templates_azure-pipelines-ci-docker.yaml_-768x928.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-pipeline-templates_azure-pipelines-ci-docker.yaml_-248x300.png 248w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-pipeline-templates_azure-pipelines-ci-docker.yaml_-847x1024.png 847w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-pipeline-templates_azure-pipelines-ci-docker.yaml_.png 852w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-03afaae elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"03afaae\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-0aa5d39\" data-id=\"0aa5d39\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4d62a68 elementor-widget elementor-widget-text-editor\" data-id=\"4d62a68\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Si un param\u00e8tre est not\u00e9 comme une entr\u00e9e de liste YAML unique mais contient une liste, Azure DevOps l&rsquo;\u00e9tend automatiquement sans que nous ayons besoin d&rsquo;\u00e9crire explicitement une boucle <strong>each<\/strong>. Le mod\u00e8le ressemble en principe \u00e0 un pipeline normal et pourrait \u00e9galement \u00eatre utilis\u00e9 comme tel. Si nous cr\u00e9ions un pipeline dans Azure DevOps avec ce fichier mod\u00e8le, nous devrions remplir manuellement les param\u00e8tres lors du d\u00e9marrage du pipeline, ce qui n&rsquo;est pas possible pour le type <strong>stepList<\/strong>. Par cons\u00e9quent, la valeur par d\u00e9faut serait utilis\u00e9e ici : une liste vide.   <\/p><p>Nous modifions maintenant nos deux pipelines existants pour qu&rsquo;ils h\u00e9ritent de ce mod\u00e8le et d\u00e9finissons les valeurs des param\u00e8tres. Pour ce faire, nous devons d&rsquo;abord sp\u00e9cifier le d\u00e9p\u00f4t Git contenant le mod\u00e8le et lui attribuer un alias. Ensuite, nous pouvons sp\u00e9cifier le mod\u00e8le avec <span style=\"color: #0000ff;\">extends<\/span> : et <span style=\"color: #0000ff;\">template<\/span> :. La syntaxe ici est <strong>&lt;chemin relatif&gt;@&lt;alias du d\u00e9p\u00f4t&gt;<\/strong>. Lorsqu&rsquo;un pipeline contient <span style=\"color: #0000ff;\">extends<\/span> : au niveau sup\u00e9rieur, il ne peut pas contenir ses propres <span style=\"color: #0000ff;\">stages<\/span> :, <span style=\"color: #0000ff;\">jobs<\/span> : ou <span style=\"color: #0000ff;\">steps<\/span> : \u00e0 c\u00f4t\u00e9, mais l&rsquo;ensemble du pipeline doit \u00eatre construit sur la structure de base du mod\u00e8le et toutes les modifications individuelles doivent \u00eatre r\u00e9alis\u00e9es via des param\u00e8tres. Comme mentionn\u00e9 pr\u00e9c\u00e9demment, Azure DevOps assemble un seul grand script de pipeline \u00e0 partir de la hi\u00e9rarchie des mod\u00e8les avant l&rsquo;ex\u00e9cution du pipeline, de sorte que nous obtenons exactement le m\u00eame r\u00e9sultat \u00e0 la fin.     <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-affb830 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"affb830\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-63136df\" data-id=\"63136df\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-0fb7638 elementor-widget elementor-widget-image\" data-id=\"0fb7638\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"806\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-python-project_azure-pipelines.yaml_new-768x806.png\" class=\"attachment-medium_large size-medium_large wp-image-27319\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-python-project_azure-pipelines.yaml_new-768x806.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-python-project_azure-pipelines.yaml_new-286x300.png 286w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-python-project_azure-pipelines.yaml_new.png 774w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-3d5ec72 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"3d5ec72\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8ae6323\" data-id=\"8ae6323\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c3da5ae elementor-widget elementor-widget-text-editor\" data-id=\"c3da5ae\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h5>Versionnement avec les balises Git<\/h5><p>Actuellement, nous utilisons le hachage du commit Git comme balise d&rsquo;image Docker, qui est difficile \u00e0 m\u00e9moriser. Une balise cod\u00e9e en dur comme <strong>latest<\/strong> aurait l&rsquo;inconv\u00e9nient de ne pouvoir utiliser qu&rsquo;une seule version en parall\u00e8le. Il est donc logique d&rsquo;introduire un concept de versionnement bas\u00e9 sur le versionnement s\u00e9mantique et de l&rsquo;int\u00e9grer dans le pipeline, de sorte que le num\u00e9ro de version soit automatiquement incr\u00e9ment\u00e9 et utilis\u00e9 simultan\u00e9ment comme balise d&rsquo;image Docker. De plus, nous cr\u00e9ons une balise Git \u00e0 chaque build pour pouvoir associer ult\u00e9rieurement les images Docker au code source. Comme la logique pour cela devient relativement complexe, nous la pla\u00e7ons dans un script Bash. Tr\u00e8s probablement, nous en aurons \u00e9galement besoin dans les futurs pipelines CI, nous cr\u00e9ons donc imm\u00e9diatement un autre mod\u00e8le <strong>azure-pipelines-ci.yaml<\/strong>, qui sert de nouveau mod\u00e8le de base pour <strong>azure-pipelines-ci-docker.yaml<\/strong>. Ainsi, nous avons d\u00e9j\u00e0 une hi\u00e9rarchie de mod\u00e8les \u00e0 trois niveaux.      <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-25f2662 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"25f2662\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-76e16dd\" data-id=\"76e16dd\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3d1ae2d elementor-widget elementor-widget-image\" data-id=\"3d1ae2d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1749\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-pipeline-templates_azure-pipelines-ci.yaml_-768x1749.png\" class=\"attachment-medium_large size-medium_large wp-image-27320\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-pipeline-templates_azure-pipelines-ci.yaml_-768x1749.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-pipeline-templates_azure-pipelines-ci.yaml_-132x300.png 132w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-pipeline-templates_azure-pipelines-ci.yaml_-450x1024.png 450w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-pipeline-templates_azure-pipelines-ci.yaml_-674x1536.png 674w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-pipeline-templates_azure-pipelines-ci.yaml_-899x2048.png 899w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-pipeline-templates_azure-pipelines-ci.yaml_.png 1339w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-37a61e3 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"37a61e3\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-60797ec\" data-id=\"60797ec\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-e14d2f6 elementor-widget elementor-widget-text-editor\" data-id=\"e14d2f6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Pour expliquer le script &#8211; nous distinguons diff\u00e9rents cas :<\/p><ul><li>Si une balise de version est d\u00e9j\u00e0 directement sur le commit pour lequel le pipeline s&rsquo;ex\u00e9cute, nous la prenons et ne changeons rien \u00e0 la version.<\/li><li>Si le pipeline a \u00e9t\u00e9 lanc\u00e9 \u00e0 partir d&rsquo;une demande de fusion, le versionnement nous importe peu. Nous voulons simplement d\u00e9terminer si le code et l&rsquo;image Docker peuvent \u00eatre construits et si les tests sont r\u00e9ussis. Nous prenons donc simplement la derni\u00e8re version existante que nous pouvons trouver dans l&rsquo;historique Git et ne changeons rien \u00e0 la version.  <\/li><li>Sinon, nous recherchons dans l&rsquo;historique Git la balise de version la plus proche dans le pass\u00e9. Si nous sommes sur un commit de fusion, nous recherchons dans les deux directions et prenons la version la plus \u00e9lev\u00e9e. <\/li><li>Si nous ne trouvons aucune version pr\u00e9c\u00e9dente, nous commen\u00e7ons avec la version 0.1.<\/li><li>Sinon, nous augmentons la version comme suit :<ul><li>Sur la branche <strong>master<\/strong>, nous augmentons la version mineure de 1.<\/li><li>Sur la branche <strong>dev<\/strong>, nous augmentons le niveau de correctif de 1.<\/li><li>Sur les branches de fonctionnalit\u00e9s, nous n&rsquo;augmentons pas le num\u00e9ro de version.<\/li><\/ul><\/li><li>De plus, nous ajoutons un suffixe au num\u00e9ro de version :<ul><li>Sur la branche <strong>dev<\/strong> <strong>-dev<\/strong>.<\/li><li>Sur les branches de fonctionnalit\u00e9s, une version r\u00e9duite du nom de la branche.<\/li><li>Pour les projets Go, il est important que les balises ne soient pas d\u00e9plac\u00e9es, car le client Go met en cache l&rsquo;ensemble du d\u00e9p\u00f4t Git localement et stocke une signature pour chaque version qui ne doit plus \u00eatre modifi\u00e9e. Pour ce cas d&rsquo;utilisation, il existe le param\u00e8tre uniqueGitTags. Lorsqu&rsquo;il est d\u00e9fini sur true, nous cr\u00e9ons une version unique distincte pour chaque commit en ajoutant un autre suffixe contenant le hachage du commit et un horodatage.  <\/li><\/ul><\/li><\/ul><p>\u00c0 partir du script Bash, nous cr\u00e9ons une variable de pipeline d&rsquo;ex\u00e9cution nomm\u00e9e <span style=\"color: #339966;\">Version<\/span>. Cela est possible gr\u00e2ce \u00e0 ce que l&rsquo;on appelle une <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/devops\/pipelines\/scripts\/logging-commands?view=azure-devops&amp;tabs=bash#setvariable-initialize-or-modify-the-value-of-a-variable\">commande de journalisation<\/a>. Pour ce faire, nous devons simplement \u00e9crire une commande sp\u00e9ciale dans la sortie standard du script Bash : <span style=\"color: #0000ff;\">echo<\/span> <span style=\"color: #339966;\">\u00ab ##vso[task .setvariable variable=\u00a0\u00bb&lt;name&gt;;isreadonly=true\u00a0\u00bb]&lt;VALEUR&gt; \u00bb<\/span>. Ainsi, la version peut \u00eatre utilis\u00e9e dans les \u00e9tapes ult\u00e9rieures du pipeline, par exemple comme balise d&rsquo;image Docker. Ce n&rsquo;est que si le pipeline s&rsquo;est ex\u00e9cut\u00e9 avec succ\u00e8s que nous repoussons la balise de version dans le r\u00e9f\u00e9rentiel Git distant, sinon elle doit \u00eatre ignor\u00e9e. Pour ce faire, nous for\u00e7ons Azure DevOps \u00e0 extraire compl\u00e8tement le r\u00e9f\u00e9rentiel Git \u00e0 chaque ex\u00e9cution d&rsquo;un pipeline en d\u00e9finissant le param\u00e8tre <span style=\"color: #0000ff;\"><strong>clean<\/strong><\/span><strong>: true<\/strong> dans l&rsquo;\u00e9tape <span style=\"color: #0000ff;\">checkout<\/span>:. De plus, nous devons \u00e9galement d\u00e9finir le param\u00e8tre <span style=\"color: #0000ff;\"><strong>persistCredentials<\/strong><\/span><strong>: true<\/strong>, sinon les informations d&rsquo;identification pour le r\u00e9f\u00e9rentiel Git distant seraient supprim\u00e9es apr\u00e8s l&rsquo;\u00e9tape <span style=\"color: #0000ff;\">checkout<\/span>: pour des raisons de s\u00e9curit\u00e9 et nous n&rsquo;aurions pas d&rsquo;informations d&rsquo;identification pour repousser la balise Git.      <\/p><p>Le fichier <strong>azure-pipeline-ci-docker.yaml<\/strong> se r\u00e9duit alors aux deux \u00e9tapes Docker. Pour r\u00e9f\u00e9rencer le mod\u00e8le, le nom de fichier <strong>azure-pipeline-ci.yaml<\/strong> suffit ici, car les deux fichiers se trouvent dans le m\u00eame r\u00e9f\u00e9rentiel Git. Il est bien s\u00fbr important ici de modifier la balise de l&rsquo;image Docker de <span style=\"color: #339966;\">\u00ab $(Build.SourceVersion) \u00bb<\/span> \u00e0 <span style=\"color: #339966;\">\u00ab $(Version) \u00bb<\/span> pour utiliser le num\u00e9ro de version comme balise d&rsquo;image Docker. Si nous sommes sur la branche <strong>master<\/strong>, nous d\u00e9finissons &#8211; comme il est d&rsquo;usage pour les images Docker &#8211; la balise <strong>latest<\/strong> en plus du num\u00e9ro de version. De plus, nous ajoutons une <strong><span style=\"color: #0000ff;\">condition<\/span>:<\/strong> \u00e0 l&rsquo;\u00e9tape \u00ab Push Docker Image \u00bb<strong>&#8211;<\/strong> qui fait sauter l&rsquo;\u00e9tape dans le contexte d&rsquo;une demande de tirage. Comme pour le versionnage, dans le contexte d&rsquo;une demande de tirage, nous ne sommes int\u00e9ress\u00e9s que par la v\u00e9rification de la validit\u00e9 du code et non par la publication de quoi que ce soit.     <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-a1539fb elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"a1539fb\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-981277a\" data-id=\"981277a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ff6c458 elementor-widget elementor-widget-image\" data-id=\"ff6c458\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"855\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-pipeline-templates_azure-pipelines-ci-docker.yaml_neu-768x855.png\" class=\"attachment-medium_large size-medium_large wp-image-27321\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-pipeline-templates_azure-pipelines-ci-docker.yaml_neu-768x855.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-pipeline-templates_azure-pipelines-ci-docker.yaml_neu-269x300.png 269w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/example-pipeline-templates_azure-pipelines-ci-docker.yaml_neu.png 848w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-6d7789d elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6d7789d\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-caac58b\" data-id=\"caac58b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-94bdca6 elementor-widget elementor-widget-text-editor\" data-id=\"94bdca6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Maintenant, nous lan\u00e7ons le pipeline pour le <strong>example-python-project<\/strong>. On ne voit pas grand-chose de la grande restructuration en coulisses pour le moment. Les nouvelles \u00e9tapes de construction sont <strong>Versioning<\/strong> et <strong>Create git tag.<\/strong> Comme nous n&rsquo;avons pas encore d&rsquo;autre balise de version, nous obtenons le message suivant : Mise \u00e0 jour de \u00ab  \u00bb \u00e0 \u00ab 0.0.1 \u00bb.  <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-732ffa2 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"732ffa2\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d601345\" data-id=\"d601345\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7a0e23b elementor-widget elementor-widget-image\" data-id=\"7a0e23b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"2062\" height=\"1315\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-122101.png\" class=\"attachment-full size-full wp-image-27322\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-122101.png 2062w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-122101-300x191.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-122101-1024x653.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-122101-768x490.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-122101-1536x980.png 1536w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-122101-2048x1306.png 2048w\" sizes=\"(max-width: 2062px) 100vw, 2062px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c03f6b4 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"c03f6b4\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-075aaa1\" data-id=\"075aaa1\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1d92a3b elementor-widget elementor-widget-text-editor\" data-id=\"1d92a3b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Lors du push Docker, le num\u00e9ro de version est maintenant utilis\u00e9 comme balise comme souhait\u00e9 :<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c02b88e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"c02b88e\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-cb206bd\" data-id=\"cb206bd\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-af50bb4 elementor-widget elementor-widget-image\" data-id=\"af50bb4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1287\" height=\"483\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-122038.png\" class=\"attachment-full size-full wp-image-27323\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-122038.png 1287w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-122038-300x113.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-122038-1024x384.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-122038-768x288.png 768w\" sizes=\"(max-width: 1287px) 100vw, 1287px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-1b0ce5e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"1b0ce5e\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7662ab4\" data-id=\"7662ab4\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-02678ad elementor-widget elementor-widget-text-editor\" data-id=\"02678ad\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Malheureusement, le push de la balise Git \u00e9choue encore :<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-ae82d55 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"ae82d55\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-e119261\" data-id=\"e119261\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-95b2adb elementor-widget elementor-widget-image\" data-id=\"95b2adb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"2421\" height=\"507\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-122209.png\" class=\"attachment-full size-full wp-image-27324\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-122209.png 2421w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-122209-300x63.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-122209-1024x214.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-122209-768x161.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-122209-1536x322.png 1536w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-122209-2048x429.png 2048w\" sizes=\"(max-width: 2421px) 100vw, 2421px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-2b9aad0 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"2b9aad0\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-eadf85d\" data-id=\"eadf85d\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d8d8683 elementor-widget elementor-widget-text-editor\" data-id=\"d8d8683\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Cela est d\u00fb au fait que les pipelines dans Azure DevOps sont ex\u00e9cut\u00e9s au nom d&rsquo;un utilisateur virtuel appel\u00e9 <strong>&lt;Nom-du-Projet&gt; Build Service (&lt;Nom-de-l&rsquo;Organisation&gt;)<\/strong>. Pour des raisons de s\u00e9curit\u00e9, celui-ci n&rsquo;a par d\u00e9faut aucun droit d&rsquo;\u00e9criture sur les r\u00e9f\u00e9rentiels Git. Dans notre cas, cependant, c&rsquo;est souhaitable. Pour accorder l&rsquo;autorisation n\u00e9cessaire, nous naviguons \u00e0 travers le menu via l&rsquo;engrenage en bas \u00e0 gauche vers \u00ab Project Settings \u00bb \u00e0 \u00ab Repositories \u00bb \u00e0 onglet \u00ab Security \u00bb \u00e0 \u00ab Users \u00bb \u00e0 \u00ab CICD-Test Build Service (dennishellerdigatus) \u00bb et modifions dans le tableau de droite la valeur pour <strong>Contribute<\/strong> de <strong>Not Set<\/strong> \u00e0 <strong>Allow<\/strong> :   <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-9b7c81e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"9b7c81e\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5c488f9\" data-id=\"5c488f9\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ab51aad elementor-widget elementor-widget-image\" data-id=\"ab51aad\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"2141\" height=\"1315\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-123045.png\" class=\"attachment-full size-full wp-image-27325\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-123045.png 2141w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-123045-300x184.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-123045-1024x629.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-123045-768x472.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-123045-1536x943.png 1536w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-123045-2048x1258.png 2048w\" sizes=\"(max-width: 2141px) 100vw, 2141px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-95c6327 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"95c6327\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-e43af90\" data-id=\"e43af90\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-0e45daf elementor-widget elementor-widget-text-editor\" data-id=\"0e45daf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Un clic sur <strong>Rerun failed jobs<\/strong> dans le pipeline \u00e9chou\u00e9 nous montre que nous avons trouv\u00e9 le bon param\u00e8tre dans la jungle des autorisations d&rsquo;Azure DevOps. Le pipeline s&rsquo;ex\u00e9cute maintenant avec succ\u00e8s : <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c1abc40 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"c1abc40\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-38c9b42\" data-id=\"38c9b42\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2a7cdda elementor-widget elementor-widget-image\" data-id=\"2a7cdda\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"2146\" height=\"1314\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-123232.png\" class=\"attachment-full size-full wp-image-27326\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-123232.png 2146w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-123232-300x184.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-123232-1024x627.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-123232-768x470.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-123232-1536x940.png 1536w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-123232-2048x1254.png 2048w\" sizes=\"(max-width: 2146px) 100vw, 2146px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-7bf789d elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7bf789d\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a949ddb\" data-id=\"a949ddb\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7fb6475 elementor-widget elementor-widget-text-editor\" data-id=\"7fb6475\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Nous voyons \u00e9galement les nouvelles balises dans le journal Git et dans Docker Hub :<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-a2dd719 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"a2dd719\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-68b4661\" data-id=\"68b4661\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d32d383 elementor-widget elementor-widget-image\" data-id=\"d32d383\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"2151\" height=\"1311\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-123519.png\" class=\"attachment-full size-full wp-image-27327\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-123519.png 2151w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-123519-300x183.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-123519-1024x624.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-123519-768x468.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-123519-1536x936.png 1536w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-07-123519-2048x1248.png 2048w\" sizes=\"(max-width: 2151px) 100vw, 2151px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8017a66 elementor-widget elementor-widget-image\" data-id=\"8017a66\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"733\" height=\"559\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-14-071238.png\" class=\"attachment-full size-full wp-image-27328\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-14-071238.png 733w, https:\/\/digatus.com\/wp-content\/uploads\/2023\/08\/Screenshot-2023-06-14-071238-300x229.png 300w\" sizes=\"(max-width: 733px) 100vw, 733px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-2dd417d elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"2dd417d\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5759e33\" data-id=\"5759e33\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5d35d04 elementor-widget elementor-widget-text-editor\" data-id=\"5d35d04\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h5>Conclusion<\/h5><p>Azure DevOps offre une multitude de possibilit\u00e9s pour cr\u00e9er des pipelines simples et complexes. Il est agr\u00e9able de constater que &#8211; contrairement \u00e0 d&rsquo;autres syst\u00e8mes CI\/CD &#8211; on peut cr\u00e9er rapidement et facilement des pipelines sans avoir \u00e0 se pr\u00e9occuper de nombreux sujets. Cela est d\u00fb au fait que les valeurs et param\u00e8tres par d\u00e9faut sont tr\u00e8s bien \u00e9quilibr\u00e9s entre la libert\u00e9 n\u00e9cessaire et la s\u00e9curit\u00e9. Les fonctionnalit\u00e9s plus complexes sont encapsul\u00e9es de mani\u00e8re \u00e0 ne pas g\u00eaner si on n&rsquo;en a pas besoin. Plus tard, on peut sortir de ces cadres petit \u00e0 petit, ce qui signifie qu&rsquo;on doit \u00e9crire plus de code soi-m\u00eame et modifier les param\u00e8tres, mais on dispose \u00e9galement de plus de fonctionnalit\u00e9s. Ainsi, des sc\u00e9narios complexes peuvent \u00e9galement \u00eatre mis en \u0153uvre avec des hi\u00e9rarchies de mod\u00e8les et des scripts Bash.     <\/p><p>La r\u00e9utilisabilit\u00e9 et l&rsquo;extensibilit\u00e9 des scripts de pipeline gr\u00e2ce \u00e0 la fonction de mod\u00e8le &#8211; en particulier l&rsquo;insertion de listes enti\u00e8res d&rsquo;\u00e9tapes &#8211; constituent ind\u00e9niablement l&rsquo;un des atouts majeurs d&rsquo;Azure DevOps. Dans l&rsquo;\u00e9ventualit\u00e9 o\u00f9 les t\u00e2ches standard s&rsquo;av\u00e9reraient insuffisantes, il est toujours possible de basculer vers le niveau Bash plus complet. L\u00e0 aussi, tous les outils n\u00e9cessaires sont install\u00e9s, tels que git, go et python. Si nous utilisons un agent de construction auto-h\u00e9berg\u00e9, nous pourrions installer n&rsquo;importe quels outils suppl\u00e9mentaires comme jq, make ou kustomize. Fort heureusement, nous n&rsquo;avons gu\u00e8re eu \u00e0 nous pr\u00e9occuper des autorisations jusqu&rsquo;\u00e0 pr\u00e9sent. Il existe de nombreuses options de configuration \u00e0 cet \u00e9gard, mais malheureusement, le fonctionnement des autorisations est parfois tr\u00e8s difficile \u00e0 appr\u00e9hender. Un point positif ici est qu&rsquo;Azure DevOps propose un bouton de \u00ab Quick-Fix \u00bb pour les probl\u00e8mes d&rsquo;autorisation fr\u00e9quemment rencontr\u00e9s, qui ajuste automatiquement les autorisations sur place, sans qu&rsquo;il soit n\u00e9cessaire de naviguer \u00e0 travers des menus complexes.      <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>L&rsquo;id\u00e9e de cette s\u00e9rie d&rsquo;articles est n\u00e9e d&rsquo;une situation chez un client o\u00f9 nous avons introduit le CI\/CD car la charge de travail manuelle n&rsquo;\u00e9tait plus g\u00e9rable. Les instructions suivantes sont donc fra\u00eechement issues de la pratique. Par souci de simplicit\u00e9, nous avons abr\u00e9g\u00e9 le long processus d&rsquo;essais et de recherche d&rsquo;erreurs pour ne pr\u00e9senter ici que le r\u00e9sultat final. Les extraits de code sont exemplaires, mais suffisants pour pr\u00e9senter la fonctionnalit\u00e9.   <\/p>\n","protected":false},"author":2,"featured_media":27186,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[164],"tags":[172,170],"class_list":["post-27298","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-article-fr","tag-cloud-fr","tag-developpement-de-logiciels"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Partie 2 : CI\/CD avanc\u00e9 avec Azure DevOps - digatus<\/title>\n<meta name=\"description\" content=\"Partie 2 : Biblioth\u00e8ques Go, mod\u00e8les de pipelines et versionnement. Un guide pratique pour le d\u00e9veloppement personnel avec Azure DevOps.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/digatus.com\/fr\/partie-2-ci-cd-avance-avec-azure-devops\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Partie 2 : CI\/CD avanc\u00e9 avec Azure DevOps\" \/>\n<meta property=\"og:description\" content=\"Partie 2 : Biblioth\u00e8ques Go, mod\u00e8les de pipelines et versionnement. Un guide pratique.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/digatus.com\/fr\/partie-2-ci-cd-avance-avec-azure-devops\/\" \/>\n<meta property=\"og:site_name\" content=\"digatus\" \/>\n<meta property=\"article:published_time\" content=\"2023-08-25T09:26:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-27T10:40:52+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/de.digatus.com\/wp-content\/uploads\/2023\/08\/CICD-Azure-DevOps_Teil2-1024x535.png\" \/>\n<meta name=\"author\" content=\"Annabell Renner\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Partie 2 : CI\/CD avanc\u00e9 avec Azure DevOps\" \/>\n<meta name=\"twitter:description\" content=\"Partie 2 : Biblioth\u00e8ques Go, mod\u00e8les de pipelines et versionnement. Un guide pratique.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/de.digatus.com\/wp-content\/uploads\/2023\/08\/CICD-Azure-DevOps_Teil2-1024x535.png\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Annabell Renner\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/digatus.com\\\/fr\\\/partie-2-ci-cd-avance-avec-azure-devops\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/fr\\\/partie-2-ci-cd-avance-avec-azure-devops\\\/\"},\"author\":{\"name\":\"Annabell Renner\",\"@id\":\"https:\\\/\\\/digatus.com\\\/fr\\\/#\\\/schema\\\/person\\\/4902929f286856c9caf9575e10acd69e\"},\"headline\":\"Partie 2 : CI\\\/CD avanc\u00e9 avec Azure DevOps\",\"datePublished\":\"2023-08-25T09:26:25+00:00\",\"dateModified\":\"2025-11-27T10:40:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/fr\\\/partie-2-ci-cd-avance-avec-azure-devops\\\/\"},\"wordCount\":3329,\"publisher\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/fr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/fr\\\/partie-2-ci-cd-avance-avec-azure-devops\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/digatus.com\\\/wp-content\\\/uploads\\\/2022\\\/07\\\/CI_CD_DevOps_Azure.png\",\"keywords\":[\"Cloud\",\"D\u00e9veloppement de logiciels\"],\"articleSection\":[\"Article\"],\"inLanguage\":\"fr-FR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/digatus.com\\\/fr\\\/partie-2-ci-cd-avance-avec-azure-devops\\\/\",\"url\":\"https:\\\/\\\/digatus.com\\\/fr\\\/partie-2-ci-cd-avance-avec-azure-devops\\\/\",\"name\":\"Partie 2 : CI\\\/CD avanc\u00e9 avec Azure DevOps - digatus\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/fr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/fr\\\/partie-2-ci-cd-avance-avec-azure-devops\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/fr\\\/partie-2-ci-cd-avance-avec-azure-devops\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/digatus.com\\\/wp-content\\\/uploads\\\/2022\\\/07\\\/CI_CD_DevOps_Azure.png\",\"datePublished\":\"2023-08-25T09:26:25+00:00\",\"dateModified\":\"2025-11-27T10:40:52+00:00\",\"description\":\"Partie 2 : Biblioth\u00e8ques Go, mod\u00e8les de pipelines et versionnement. Un guide pratique pour le d\u00e9veloppement personnel avec Azure DevOps.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/fr\\\/partie-2-ci-cd-avance-avec-azure-devops\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/digatus.com\\\/fr\\\/partie-2-ci-cd-avance-avec-azure-devops\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/digatus.com\\\/fr\\\/partie-2-ci-cd-avance-avec-azure-devops\\\/#primaryimage\",\"url\":\"https:\\\/\\\/digatus.com\\\/wp-content\\\/uploads\\\/2022\\\/07\\\/CI_CD_DevOps_Azure.png\",\"contentUrl\":\"https:\\\/\\\/digatus.com\\\/wp-content\\\/uploads\\\/2022\\\/07\\\/CI_CD_DevOps_Azure.png\",\"width\":950,\"height\":633,\"caption\":\"ci_cd_devops_azure\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/digatus.com\\\/fr\\\/partie-2-ci-cd-avance-avec-azure-devops\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\\\/\\\/digatus.com\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Partie 2 : CI\\\/CD avanc\u00e9 avec Azure DevOps\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/digatus.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/digatus.com\\\/fr\\\/\",\"name\":\"digatus\",\"description\":\"Transforming IT, Empowering Business.\",\"publisher\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/fr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/digatus.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/digatus.com\\\/fr\\\/#organization\",\"name\":\"digatus\",\"url\":\"https:\\\/\\\/digatus.com\\\/fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/digatus.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/digatus.com\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/Logo_digatus_green_web_rgb.png\",\"contentUrl\":\"https:\\\/\\\/digatus.com\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/Logo_digatus_green_web_rgb.png\",\"width\":1200,\"height\":312,\"caption\":\"digatus\"},\"image\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/digatus.com\\\/fr\\\/#\\\/schema\\\/person\\\/4902929f286856c9caf9575e10acd69e\",\"name\":\"Annabell Renner\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f260d8c39a817b4f01ed758cefc9933458252cc43e8c4c292328cc6009d4fea2?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f260d8c39a817b4f01ed758cefc9933458252cc43e8c4c292328cc6009d4fea2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f260d8c39a817b4f01ed758cefc9933458252cc43e8c4c292328cc6009d4fea2?s=96&d=mm&r=g\",\"caption\":\"Annabell Renner\"},\"url\":\"https:\\\/\\\/digatus.com\\\/fr\\\/author\\\/annabell\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Partie 2 : CI\/CD avanc\u00e9 avec Azure DevOps - digatus","description":"Partie 2 : Biblioth\u00e8ques Go, mod\u00e8les de pipelines et versionnement. Un guide pratique pour le d\u00e9veloppement personnel avec Azure DevOps.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/digatus.com\/fr\/partie-2-ci-cd-avance-avec-azure-devops\/","og_locale":"fr_FR","og_type":"article","og_title":"Partie 2 : CI\/CD avanc\u00e9 avec Azure DevOps","og_description":"Partie 2 : Biblioth\u00e8ques Go, mod\u00e8les de pipelines et versionnement. Un guide pratique.","og_url":"https:\/\/digatus.com\/fr\/partie-2-ci-cd-avance-avec-azure-devops\/","og_site_name":"digatus","article_published_time":"2023-08-25T09:26:25+00:00","article_modified_time":"2025-11-27T10:40:52+00:00","og_image":[{"url":"https:\/\/de.digatus.com\/wp-content\/uploads\/2023\/08\/CICD-Azure-DevOps_Teil2-1024x535.png","type":"","width":"","height":""}],"author":"Annabell Renner","twitter_card":"summary_large_image","twitter_title":"Partie 2 : CI\/CD avanc\u00e9 avec Azure DevOps","twitter_description":"Partie 2 : Biblioth\u00e8ques Go, mod\u00e8les de pipelines et versionnement. Un guide pratique.","twitter_image":"https:\/\/de.digatus.com\/wp-content\/uploads\/2023\/08\/CICD-Azure-DevOps_Teil2-1024x535.png","twitter_misc":{"\u00c9crit par":"Annabell Renner","Dur\u00e9e de lecture estim\u00e9e":"16 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/digatus.com\/fr\/partie-2-ci-cd-avance-avec-azure-devops\/#article","isPartOf":{"@id":"https:\/\/digatus.com\/fr\/partie-2-ci-cd-avance-avec-azure-devops\/"},"author":{"name":"Annabell Renner","@id":"https:\/\/digatus.com\/fr\/#\/schema\/person\/4902929f286856c9caf9575e10acd69e"},"headline":"Partie 2 : CI\/CD avanc\u00e9 avec Azure DevOps","datePublished":"2023-08-25T09:26:25+00:00","dateModified":"2025-11-27T10:40:52+00:00","mainEntityOfPage":{"@id":"https:\/\/digatus.com\/fr\/partie-2-ci-cd-avance-avec-azure-devops\/"},"wordCount":3329,"publisher":{"@id":"https:\/\/digatus.com\/fr\/#organization"},"image":{"@id":"https:\/\/digatus.com\/fr\/partie-2-ci-cd-avance-avec-azure-devops\/#primaryimage"},"thumbnailUrl":"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/CI_CD_DevOps_Azure.png","keywords":["Cloud","D\u00e9veloppement de logiciels"],"articleSection":["Article"],"inLanguage":"fr-FR"},{"@type":"WebPage","@id":"https:\/\/digatus.com\/fr\/partie-2-ci-cd-avance-avec-azure-devops\/","url":"https:\/\/digatus.com\/fr\/partie-2-ci-cd-avance-avec-azure-devops\/","name":"Partie 2 : CI\/CD avanc\u00e9 avec Azure DevOps - digatus","isPartOf":{"@id":"https:\/\/digatus.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/digatus.com\/fr\/partie-2-ci-cd-avance-avec-azure-devops\/#primaryimage"},"image":{"@id":"https:\/\/digatus.com\/fr\/partie-2-ci-cd-avance-avec-azure-devops\/#primaryimage"},"thumbnailUrl":"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/CI_CD_DevOps_Azure.png","datePublished":"2023-08-25T09:26:25+00:00","dateModified":"2025-11-27T10:40:52+00:00","description":"Partie 2 : Biblioth\u00e8ques Go, mod\u00e8les de pipelines et versionnement. Un guide pratique pour le d\u00e9veloppement personnel avec Azure DevOps.","breadcrumb":{"@id":"https:\/\/digatus.com\/fr\/partie-2-ci-cd-avance-avec-azure-devops\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/digatus.com\/fr\/partie-2-ci-cd-avance-avec-azure-devops\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/digatus.com\/fr\/partie-2-ci-cd-avance-avec-azure-devops\/#primaryimage","url":"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/CI_CD_DevOps_Azure.png","contentUrl":"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/CI_CD_DevOps_Azure.png","width":950,"height":633,"caption":"ci_cd_devops_azure"},{"@type":"BreadcrumbList","@id":"https:\/\/digatus.com\/fr\/partie-2-ci-cd-avance-avec-azure-devops\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/digatus.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Partie 2 : CI\/CD avanc\u00e9 avec Azure DevOps"}]},{"@type":"WebSite","@id":"https:\/\/digatus.com\/fr\/#website","url":"https:\/\/digatus.com\/fr\/","name":"digatus","description":"Transforming IT, Empowering Business.","publisher":{"@id":"https:\/\/digatus.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/digatus.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/digatus.com\/fr\/#organization","name":"digatus","url":"https:\/\/digatus.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/digatus.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/digatus.com\/wp-content\/uploads\/2025\/01\/Logo_digatus_green_web_rgb.png","contentUrl":"https:\/\/digatus.com\/wp-content\/uploads\/2025\/01\/Logo_digatus_green_web_rgb.png","width":1200,"height":312,"caption":"digatus"},"image":{"@id":"https:\/\/digatus.com\/fr\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/digatus.com\/fr\/#\/schema\/person\/4902929f286856c9caf9575e10acd69e","name":"Annabell Renner","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/f260d8c39a817b4f01ed758cefc9933458252cc43e8c4c292328cc6009d4fea2?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f260d8c39a817b4f01ed758cefc9933458252cc43e8c4c292328cc6009d4fea2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f260d8c39a817b4f01ed758cefc9933458252cc43e8c4c292328cc6009d4fea2?s=96&d=mm&r=g","caption":"Annabell Renner"},"url":"https:\/\/digatus.com\/fr\/author\/annabell\/"}]}},"_links":{"self":[{"href":"https:\/\/digatus.com\/fr\/wp-json\/wp\/v2\/posts\/27298","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digatus.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/digatus.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/digatus.com\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/digatus.com\/fr\/wp-json\/wp\/v2\/comments?post=27298"}],"version-history":[{"count":1,"href":"https:\/\/digatus.com\/fr\/wp-json\/wp\/v2\/posts\/27298\/revisions"}],"predecessor-version":[{"id":27330,"href":"https:\/\/digatus.com\/fr\/wp-json\/wp\/v2\/posts\/27298\/revisions\/27330"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/digatus.com\/fr\/wp-json\/wp\/v2\/media\/27186"}],"wp:attachment":[{"href":"https:\/\/digatus.com\/fr\/wp-json\/wp\/v2\/media?parent=27298"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/digatus.com\/fr\/wp-json\/wp\/v2\/categories?post=27298"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/digatus.com\/fr\/wp-json\/wp\/v2\/tags?post=27298"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}