{"id":13062,"date":"2017-05-08T09:52:46","date_gmt":"2017-05-08T16:52:46","guid":{"rendered":"\/blog\/?p=13062"},"modified":"2024-09-17T16:19:15","modified_gmt":"2024-09-17T14:19:15","slug":"how-we-used-jenkins-2-and-docker-pipeline-to-migrate-350-maven-ci-jobs-to-pipeline-as-code","status":"publish","type":"post","link":"https:\/\/www.exoplatform.com\/blog\/how-we-used-jenkins-2-and-docker-pipeline-to-migrate-350-maven-ci-jobs-to-pipeline-as-code\/","title":{"rendered":"How we migrate 350+ Maven CI jobs to Pipeline as Code with Jenkins 2 and Docker!"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"13062\" class=\"elementor elementor-13062\">\r\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-section elementor-top-section elementor-element elementor-element-121110c elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"121110c\" data-element_type=\"section\" id=\"sec-image-title\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-04f8922\" data-id=\"04f8922\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a6bbc16 elementor-align-left elementor-widget elementor-widget-post-info\" data-id=\"a6bbc16\" data-element_type=\"widget\" id=\"author-time\" data-widget_type=\"post-info.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<link rel=\"stylesheet\" href=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/plugins\/elementor\/assets\/css\/widget-icon-list.min.css\"><link rel=\"stylesheet\" href=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/plugins\/elementor-pro\/assets\/css\/widget-theme-elements.min.css\">\t\t<ul class=\"elementor-inline-items elementor-icon-list-items elementor-post-info\">\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-repeater-item-a070ed2 elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text elementor-post-info__item elementor-post-info__item--type-custom\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"bsf-rt-reading-time\"><span class=\"bsf-rt-display-label\" prefix=\"Reading Time\">\n\t\t<\/span> <span class=\"bsf-rt-display-time\" reading_time=\"8\"><\/span> \n\t\t<span class=\"bsf-rt-display-postfix\" postfix=\"min\"><\/span><\/span>\n\t\t  \n\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t<li class=\"elementor-icon-list-item elementor-repeater-item-c638fde elementor-inline-item\" itemprop=\"author\">\n\t\t\t\t\t\t<a href=\"https:\/\/www.exoplatform.com\/blog\/author\/maxime-greau\/\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text elementor-post-info__item elementor-post-info__item--type-author\">\n\t\t\t\t\t\t\t\t\t\tMaxime Greau\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t<\/li>\n\t\t\t\t<li class=\"elementor-icon-list-item elementor-repeater-item-f24db26 elementor-inline-item\" itemprop=\"datePublished\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"fas fa-calendar\"><\/i>\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text elementor-post-info__item elementor-post-info__item--type-date\">\n\t\t\t\t\t\t\t\t\t\tmai 8, 2017\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t<\/ul>\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-3afa0d3 undertitle elementor-widget elementor-widget-heading\" data-id=\"3afa0d3\" data-element_type=\"widget\" id=\"bigtitle\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<style>\/*! elementor - v3.13.2 - 11-05-2023 *\/\r\n.elementor-heading-title{padding:0;margin:0;line-height:1}.elementor-widget-heading .elementor-heading-title[class*=elementor-size-]>a{color:inherit;font-size:inherit;line-height:inherit}.elementor-widget-heading .elementor-heading-title.elementor-size-small{font-size:15px}.elementor-widget-heading .elementor-heading-title.elementor-size-medium{font-size:19px}.elementor-widget-heading .elementor-heading-title.elementor-size-large{font-size:29px}.elementor-widget-heading .elementor-heading-title.elementor-size-xl{font-size:39px}.elementor-widget-heading .elementor-heading-title.elementor-size-xxl{font-size:59px}<\/style><h1 class=\"elementor-heading-title elementor-size-default\">How we migrate 350+ Maven CI jobs to Pipeline as Code with Jenkins 2 and Docker!\n<\/h1>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-45919bb elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"45919bb\" data-element_type=\"widget\" data-widget_type=\"divider.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<style>\/*! elementor - v3.13.2 - 11-05-2023 *\/\r\n.elementor-widget-divider{--divider-border-style:none;--divider-border-width:1px;--divider-color:#0c0d0e;--divider-icon-size:20px;--divider-element-spacing:10px;--divider-pattern-height:24px;--divider-pattern-size:20px;--divider-pattern-url:none;--divider-pattern-repeat:repeat-x}.elementor-widget-divider .elementor-divider{display:flex}.elementor-widget-divider .elementor-divider__text{font-size:15px;line-height:1;max-width:95%}.elementor-widget-divider .elementor-divider__element{margin:0 var(--divider-element-spacing);flex-shrink:0}.elementor-widget-divider .elementor-icon{font-size:var(--divider-icon-size)}.elementor-widget-divider .elementor-divider-separator{display:flex;margin:0;direction:ltr}.elementor-widget-divider--view-line_icon .elementor-divider-separator,.elementor-widget-divider--view-line_text .elementor-divider-separator{align-items:center}.elementor-widget-divider--view-line_icon .elementor-divider-separator:after,.elementor-widget-divider--view-line_icon .elementor-divider-separator:before,.elementor-widget-divider--view-line_text .elementor-divider-separator:after,.elementor-widget-divider--view-line_text .elementor-divider-separator:before{display:block;content:\"\";border-bottom:0;flex-grow:1;border-top:var(--divider-border-width) var(--divider-border-style) var(--divider-color)}.elementor-widget-divider--element-align-left .elementor-divider .elementor-divider-separator>.elementor-divider__svg:first-of-type{flex-grow:0;flex-shrink:100}.elementor-widget-divider--element-align-left .elementor-divider-separator:before{content:none}.elementor-widget-divider--element-align-left .elementor-divider__element{margin-left:0}.elementor-widget-divider--element-align-right .elementor-divider .elementor-divider-separator>.elementor-divider__svg:last-of-type{flex-grow:0;flex-shrink:100}.elementor-widget-divider--element-align-right .elementor-divider-separator:after{content:none}.elementor-widget-divider--element-align-right .elementor-divider__element{margin-right:0}.elementor-widget-divider:not(.elementor-widget-divider--view-line_text):not(.elementor-widget-divider--view-line_icon) .elementor-divider-separator{border-top:var(--divider-border-width) var(--divider-border-style) var(--divider-color)}.elementor-widget-divider--separator-type-pattern{--divider-border-style:none}.elementor-widget-divider--separator-type-pattern.elementor-widget-divider--view-line .elementor-divider-separator,.elementor-widget-divider--separator-type-pattern:not(.elementor-widget-divider--view-line) .elementor-divider-separator:after,.elementor-widget-divider--separator-type-pattern:not(.elementor-widget-divider--view-line) .elementor-divider-separator:before,.elementor-widget-divider--separator-type-pattern:not([class*=elementor-widget-divider--view]) .elementor-divider-separator{width:100%;min-height:var(--divider-pattern-height);-webkit-mask-size:var(--divider-pattern-size) 100%;mask-size:var(--divider-pattern-size) 100%;-webkit-mask-repeat:var(--divider-pattern-repeat);mask-repeat:var(--divider-pattern-repeat);background-color:var(--divider-color);-webkit-mask-image:var(--divider-pattern-url);mask-image:var(--divider-pattern-url)}.elementor-widget-divider--no-spacing{--divider-pattern-size:auto}.elementor-widget-divider--bg-round{--divider-pattern-repeat:round}.rtl .elementor-widget-divider .elementor-divider__text{direction:rtl}.e-con-inner>.elementor-widget-divider,.e-con>.elementor-widget-divider{width:var(--container-widget-width,100%);--flex-grow:var(--container-widget-flex-grow)}<\/style>\t\t<div class=\"elementor-divider\">\r\n\t\t\t<span class=\"elementor-divider-separator\">\r\n\t\t\t\t\t\t<\/span>\r\n\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-c048457 elementor-widget elementor-widget-text-editor\" data-id=\"c048457\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<style>\/*! elementor - v3.13.2 - 11-05-2023 *\/\r\n.elementor-widget-text-editor.elementor-drop-cap-view-stacked .elementor-drop-cap{background-color:#69727d;color:#fff}.elementor-widget-text-editor.elementor-drop-cap-view-framed .elementor-drop-cap{color:#69727d;border:3px solid;background-color:transparent}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap{margin-top:8px}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap-letter{width:1em;height:1em}.elementor-widget-text-editor .elementor-drop-cap{float:left;text-align:center;line-height:1;font-size:50px}.elementor-widget-text-editor .elementor-drop-cap-letter{display:inline-block}<\/style>\t\t\t\t<p>A year ago at eXo, we decided to build all our projects in Docker containers.<\/p>\n&nbsp;\n<p>In this series of articles, we will tell you our story of how we upgraded more than 350 Jenkins \u201cstandard\u201d Maven jobs to <strong>Pipeline as code on our Continuous Integration servers,<\/strong> using <a style=\"color: #2f5e92; text-decoration: underline;\" href=\"https:\/\/jenkins.io\/\" target=\"_blank\" rel=\"noopener\">Jenkins 2<\/a> and <a style=\"color: #2f5e92; text-decoration: underline;\" href=\"https:\/\/www.docker.com\/\" target=\"_blank\" rel=\"noopener\">Docker<\/a>.<\/p>\n&nbsp;\n<p>This is a good opportunity to revisit the problems we encountered and the solutions we adopted, as well as to examine some best practices around Maven\/Gradle\/Android builds in Docker containers, all managed by the <strong>Jenkins Pipeline as Code<\/strong> pattern.<\/p>\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-6ded7ce\" data-id=\"6ded7ce\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-fca9597 elementor-widget elementor-widget-image\" data-id=\"fca9597\" data-element_type=\"widget\" data-widget_type=\"image.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<style>\/*! elementor - v3.13.2 - 11-05-2023 *\/\r\n.elementor-widget-image{text-align:center}.elementor-widget-image a{display:inline-block}.elementor-widget-image a img[src$=\".svg\"]{width:48px}.elementor-widget-image img{vertical-align:middle;display:inline-block}<\/style>\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/elementor\/thumbs\/JenkinsDocker-1000x665-1-1-q0eg8vz7c8fb648vphsejmf48xh3tqxwk535zspax4.png\" title=\"JenkinsDocker-1000&#215;665\" alt=\"JenkinsDocker-1000x665\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-3f79d1a elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"3f79d1a\" data-element_type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-9fcbf07\" data-id=\"9fcbf07\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-bd0cbc4 table-content-cs elementor-widget elementor-widget-table-of-contents\" data-id=\"bd0cbc4\" data-element_type=\"widget\" id=\"sticky-tds\" data-settings=\"{&quot;exclude_headings_by_selector&quot;:&quot;.am__title,h6&quot;,&quot;marker_view&quot;:&quot;bullets&quot;,&quot;min_height&quot;:{&quot;unit&quot;:&quot;vh&quot;,&quot;size&quot;:0,&quot;sizes&quot;:[]},&quot;headings_by_tags&quot;:[&quot;h2&quot;,&quot;h3&quot;],&quot;_animation&quot;:&quot;none&quot;,&quot;icon&quot;:{&quot;value&quot;:&quot;&quot;,&quot;library&quot;:&quot;&quot;},&quot;min_height_tablet&quot;:{&quot;unit&quot;:&quot;vh&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;min_height_mobile&quot;:{&quot;unit&quot;:&quot;vh&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;hierarchical_view&quot;:&quot;yes&quot;}\" data-widget_type=\"table-of-contents.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<style>\/*! elementor-pro - v3.8.2 - 21-11-2022 *\/\n.elementor-widget-table-of-contents .elementor-toc__header-title{color:var(--header-color)}.elementor-widget-table-of-contents.elementor-toc--collapsed .elementor-toc__toggle-button--collapse,.elementor-widget-table-of-contents:not(.elementor-toc--collapsed) .elementor-toc__toggle-button--expand{display:none}.elementor-widget-table-of-contents .elementor-widget-container{min-height:var(--box-min-height);border:var(--box-border-width,1px) solid var(--box-border-color,#a4afb7);border-radius:var(--box-border-radius,3px);background-color:var(--box-background-color);-webkit-transition:min-height .4s;-o-transition:min-height .4s;transition:min-height .4s;overflow:hidden}.elementor-toc__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:var(--box-padding,20px);background-color:var(--header-background-color);border-bottom:var(--separator-width,1px) solid var(--box-border-color,#a4afb7)}.elementor-toc__header-title{font-size:18px;margin:0;color:var(--header-color)}.elementor-toc__toggle-button{cursor:pointer;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.elementor-toc__toggle-button i{color:var(--toggle-button-color)}.elementor-toc__toggle-button svg{height:1em;width:1em;fill:var(--toggle-button-color)}.elementor-toc__spinner-container{text-align:center}.elementor-toc__spinner{font-size:2em}.elementor-toc__spinner.e-font-icon-svg{height:1em;width:1em}.elementor-toc__body{padding:var(--box-padding,20px);max-height:var(--toc-body-max-height);overflow-y:auto}.elementor-toc__body::-webkit-scrollbar{width:7px}.elementor-toc__body::-webkit-scrollbar-thumb{background-color:#c2cbd2;border-radius:10px}.elementor-toc__list-wrapper{list-style:none;padding:0}.elementor-toc__list-item{margin-bottom:.5em}.elementor-toc__list-item.elementor-item-active{font-weight:700}.elementor-toc__list-item .elementor-toc__list-wrapper{margin-top:.5em;margin-left:var(--nested-list-indent,1em)}.elementor-toc__list-item-text:hover{color:var(--item-text-hover-color);-webkit-text-decoration:var(--item-text-hover-decoration);text-decoration:var(--item-text-hover-decoration)}.elementor-toc__list-item-text.elementor-item-active{color:var(--item-text-active-color);-webkit-text-decoration:var(--item-text-active-decoration);text-decoration:var(--item-text-active-decoration)}.elementor-toc__list-item-text-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.elementor-toc__list-item-text-wrapper:before,.elementor-toc__list-item-text-wrapper i{margin-right:8px;color:var(--marker-color)}.elementor-toc__list-item-text-wrapper svg{margin-right:8px;fill:var(--marker-color);height:var(--marker-size,.5em);width:var(--marker-size,.5em)}.elementor-toc__list-item-text-wrapper i{font-size:var(--marker-size,.5em)}.elementor-toc__list-item-text-wrapper:before{font-size:var(--marker-size,1em)}.elementor-toc--content-ellipsis .elementor-toc__list-item-text{white-space:nowrap;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.elementor-toc__list-items--collapsible>.elementor-toc__list-wrapper>.elementor-toc__list-item>.elementor-toc__list-wrapper{display:none}.elementor-toc__heading-anchor{position:absolute}.elementor-toc__body .elementor-toc__list-item-text{color:var(--item-text-color);-webkit-text-decoration:var(--item-text-decoration);text-decoration:var(--item-text-decoration)}.elementor-toc__body .elementor-toc__list-item-text:hover{color:var(--item-text-hover-color);-webkit-text-decoration:var(--item-text-hover-decoration);text-decoration:var(--item-text-hover-decoration)}.elementor-toc__body .elementor-toc__list-item-text.elementor-item-active{color:var(--item-text-active-color);-webkit-text-decoration:var(--item-text-active-decoration);text-decoration:var(--item-text-active-decoration)}ol.elementor-toc__list-wrapper{counter-reset:item}ol.elementor-toc__list-wrapper .elementor-toc__list-item{counter-increment:item}ol.elementor-toc__list-wrapper .elementor-toc__list-item-text-wrapper:before{content:counters(item,\".\") \". \"}<\/style>\t\t<div class=\"elementor-toc__header\">\n\t\t\t<h4 class=\"elementor-toc__header-title\">\n\t\t\t\tContent\t\t\t<\/h4>\n\t\t\t\t\t<\/div>\n\t\t<div class=\"elementor-toc__body\">\n\t\t\t<div class=\"elementor-toc__spinner-container\">\n\t\t\t\t<i class=\"elementor-toc__spinner eicon-animation-spin eicon-loading\" aria-hidden=\"true\"><\/i>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-55b7a50\" data-id=\"55b7a50\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-46aaf6e elementor-widget elementor-widget-text-editor\" data-id=\"46aaf6e\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t<p>As with all important technical migration, we did it step by step. The 3 major steps were:<\/p>\n&nbsp;\n<ol style=\"list-style: dis; margin-left: 20px!important;\">\n \t<li style=\"font-weight: 400;\">Create <strong>CI Docker Images<\/strong><\/li>\n \t<li style=\"font-weight: 400;\">Use <strong>Jenkins Pipeline<\/strong> &amp; <strong>Pipeline Docker<\/strong> plugins<\/li>\n \t<li style=\"font-weight: 400;\"><strong>Generate all Pipeline jobs<\/strong> with DSL jobs<\/li>\n<\/ol>\n&nbsp;\n<p>The following diagram represents the workflow for these steps:<\/p>\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-7165107 elementor-widget elementor-widget-image\" data-id=\"7165107\" data-element_type=\"widget\" data-widget_type=\"image.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"853\" height=\"471\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Jenkins-2-and-Docker-Pipeline-on-Continuous-Integration-servers.png\" class=\"attachment-large size-large wp-image-13063\" alt=\"Jenkins 2 and Docker Pipeline on Continuous Integration servers\" loading=\"lazy\" srcset=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Jenkins-2-and-Docker-Pipeline-on-Continuous-Integration-servers.png 853w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Jenkins-2-and-Docker-Pipeline-on-Continuous-Integration-servers-300x166.png 300w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Jenkins-2-and-Docker-Pipeline-on-Continuous-Integration-servers-768x424.png 768w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Jenkins-2-and-Docker-Pipeline-on-Continuous-Integration-servers-720x398.png 720w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Jenkins-2-and-Docker-Pipeline-on-Continuous-Integration-servers-500x276.png 500w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Jenkins-2-and-Docker-Pipeline-on-Continuous-Integration-servers-360x199.png 360w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Jenkins-2-and-Docker-Pipeline-on-Continuous-Integration-servers-200x110.png 200w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Jenkins-2-and-Docker-Pipeline-on-Continuous-Integration-servers-100x55.png 100w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Jenkins-2-and-Docker-Pipeline-on-Continuous-Integration-servers-54x30.png 54w\" sizes=\"(max-width: 853px) 100vw, 853px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-2800266 elementor-widget elementor-widget-text-editor\" data-id=\"2800266\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t<p>In this article, we will explain the context (why we did it), and the first step of the migration towards creating your own CI Docker images.<\/p>\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-4392b46 dow1-cl elementor-reverse-tablet elementor-reverse-mobile elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"4392b46\" data-element_type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-85bd9a7\" data-id=\"85bd9a7\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap\">\r\n\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-048b458\" data-id=\"048b458\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-56aba1a elementor-cta--skin-cover elementor-cta--valign-middle elementor-widget elementor-widget-call-to-action\" data-id=\"56aba1a\" data-element_type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;none&quot;}\" data-widget_type=\"call-to-action.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<link rel=\"stylesheet\" href=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/plugins\/elementor-pro\/assets\/css\/widget-call-to-action.min.css\">\t\t<div class=\"elementor-cta\">\n\t\t\t\t\t<div class=\"elementor-cta__bg-wrapper\">\n\t\t\t\t<div class=\"elementor-cta__bg elementor-bg\" style=\"background-image: url(https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/cta-datasheet-exo-6-9.png);\"><\/div>\n\t\t\t\t<div class=\"elementor-cta__bg-overlay\"><\/div>\n\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-cta__content\">\n\t\t\t\t\n\t\t\t\t<div class=\"elementor-cta__title elementor-cta__content-item elementor-content-item\">eXo Platform 6 Free Datasheet\u200b\u200b<\/div>\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-cta__description elementor-cta__content-item elementor-content-item\">\n\t\t\t\t\t\tDownload the eXo Platform 6 Datasheet and <br>discover all the features and benefits\t\t\t\t\t<\/div>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-cta__button-wrapper elementor-cta__content-item elementor-content-item \">\n\t\t\t\t\t<a class=\"elementor-cta__button elementor-button elementor-size-md\" href=\"https:\/\/www.exoplatform.com\/datasheet-exo-platform-6\/?utm_source=BlogEn&#038;utm_medium=Blog&#038;utm_campaign=Content&#038;utm_content=cta\">\n\t\t\t\t\t\tDownload Now\t\t\t\t\t<\/a>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-76218e9 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"76218e9\" data-element_type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-9884067\" data-id=\"9884067\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap\">\r\n\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-0372461\" data-id=\"0372461\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5cca3b9 myheader1 elementor-widget elementor-widget-heading\" data-id=\"5cca3b9\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">What we build\n<\/h2>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-eb59ff3 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"eb59ff3\" data-element_type=\"widget\" data-widget_type=\"divider.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"elementor-divider\">\r\n\t\t\t<span class=\"elementor-divider-separator\">\r\n\t\t\t\t\t\t<\/span>\r\n\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-521ba5d elementor-widget elementor-widget-text-editor\" data-id=\"521ba5d\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\teXo Platform is built upon open-source and open standards. It adheres to the the Java EE stack and leverages many open-source components.\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-8729da9 elementor-arrows-position-inside elementor-pagination-position-outside elementor-widget elementor-widget-image-carousel\" data-id=\"8729da9\" data-element_type=\"widget\" data-settings=\"{&quot;slides_to_show&quot;:&quot;3&quot;,&quot;navigation&quot;:&quot;both&quot;,&quot;autoplay&quot;:&quot;yes&quot;,&quot;pause_on_hover&quot;:&quot;yes&quot;,&quot;pause_on_interaction&quot;:&quot;yes&quot;,&quot;autoplay_speed&quot;:5000,&quot;infinite&quot;:&quot;yes&quot;,&quot;speed&quot;:500}\" data-widget_type=\"image-carousel.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<style>\/*! elementor - v3.13.2 - 11-05-2023 *\/\r\n.elementor-widget-image-carousel .swiper,.elementor-widget-image-carousel .swiper-container{position:static}.elementor-widget-image-carousel .swiper-container .swiper-slide figure,.elementor-widget-image-carousel .swiper .swiper-slide figure{line-height:inherit}.elementor-widget-image-carousel .swiper-slide{text-align:center}.elementor-image-carousel-wrapper:not(.swiper-container-initialized):not(.swiper-initialized) .swiper-slide{max-width:calc(100% \/ var(--e-image-carousel-slides-to-show, 3))}<\/style>\t\t<div class=\"elementor-image-carousel-wrapper swiper-container\" dir=\"ltr\">\r\n\t\t\t<div class=\"elementor-image-carousel swiper-wrapper\">\r\n\t\t\t\t\t\t\t\t<div class=\"swiper-slide\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Mobile-1-1.jpg\" alt=\"Mobile 1\" \/><\/figure><\/div><div class=\"swiper-slide\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Mobile-2-1-768x1508.png\" alt=\"Mobile 2\" \/><\/figure><\/div><div class=\"swiper-slide\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Desktop-1.png\" alt=\"Desktop\" \/><\/figure><\/div>\t\t\t<\/div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"swiper-pagination\"><\/div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"elementor-swiper-button elementor-swiper-button-prev\" role=\"button\" tabindex=\"0\">\r\n\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"eicon-chevron-left\"><\/i>\t\t\t\t\t\t<span class=\"elementor-screen-only\">Previous image<\/span>\r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t\t<div class=\"elementor-swiper-button elementor-swiper-button-next\" role=\"button\" tabindex=\"0\">\r\n\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"eicon-chevron-right\"><\/i>\t\t\t\t\t\t<span class=\"elementor-screen-only\">Next image<\/span>\r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-ddebe78 elementor-widget elementor-widget-text-editor\" data-id=\"ddebe78\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\tWe have to manage many builds on our CI servers for a variety of reasons, which we can divide into several themes:\n\n\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-5045c3f elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"5045c3f\" data-element_type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-f940b7b\" data-id=\"f940b7b\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap\">\r\n\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-6d029d8\" data-id=\"6d029d8\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ab134a7 myheader1 elementor-widget elementor-widget-heading\" data-id=\"ab134a7\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Platform components and add-ons\n<\/h2>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-536f9be elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"536f9be\" data-element_type=\"widget\" data-widget_type=\"divider.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"elementor-divider\">\r\n\t\t\t<span class=\"elementor-divider-separator\">\r\n\t\t\t\t\t\t<\/span>\r\n\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-3d6f2b1 elementor-widget elementor-widget-text-editor\" data-id=\"3d6f2b1\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t<p>As the first step we have <strong>multiple git repositories for all the components<\/strong> required to create a distribution package for eXo Platform:<\/p>\n&nbsp;\n<ul style=\"list-style: disc; margin-left: 20px!important;\">\n \t<li style=\"font-weight: 400;\">25+ components to build\n<ul style=\"list-style: circle; margin-left: 20px!important;\">\n \t<li style=\"font-weight: 400;\">Platform projects (cf. diagram below)<\/li>\n \t<li style=\"font-weight: 400;\">Juzu projects<\/li>\n<\/ul>\n<\/li>\n \t<li style=\"font-weight: 400;\">Add-ons\n<ul  style=\"list-style: circle; margin-left: 20px!important;\">\n \t<li style=\"font-weight: 400;\">15+ supported Add-ons<\/li>\n \t<li style=\"font-weight: 400;\">100+ community Add-ons<\/li>\n<\/ul>\n<\/li>\n \t<li style=\"font-weight: 400;\">Native Mobile projects\n<ul  style=\"list-style: circle; margin-left: 20px!important;\">\n \t<li style=\"font-weight: 400;\">Android Application<\/li>\n \t<li style=\"font-weight: 400;\">iOS Application<\/li>\n<\/ul>\n<\/li>\n<\/ul>\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-c4801c4 elementor-widget elementor-widget-image\" data-id=\"c4801c4\" data-element_type=\"widget\" data-widget_type=\"image.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"768\" height=\"714\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/multiple-git-repositories-for-all-the-components-768x714.png\" class=\"attachment-medium_large size-medium_large wp-image-13067\" alt=\"multiple git repositories for all the components\" loading=\"lazy\" srcset=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/multiple-git-repositories-for-all-the-components-768x714.png 768w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/multiple-git-repositories-for-all-the-components-300x279.png 300w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/multiple-git-repositories-for-all-the-components-509x473.png 509w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/multiple-git-repositories-for-all-the-components-353x328.png 353w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/multiple-git-repositories-for-all-the-components-254x236.png 254w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/multiple-git-repositories-for-all-the-components-141x131.png 141w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/multiple-git-repositories-for-all-the-components-97x90.png 97w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/multiple-git-repositories-for-all-the-components-32x30.png 32w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/multiple-git-repositories-for-all-the-components.png 962w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-2700be0 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"2700be0\" data-element_type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-cb95f68\" data-id=\"cb95f68\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap\">\r\n\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-8a000ec\" data-id=\"8a000ec\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-6237824 myheader1 elementor-widget elementor-widget-heading\" data-id=\"6237824\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Git Workflow\n<\/h2>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-339a804 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"339a804\" data-element_type=\"widget\" data-widget_type=\"divider.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"elementor-divider\">\r\n\t\t\t<span class=\"elementor-divider-separator\">\r\n\t\t\t\t\t\t<\/span>\r\n\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-ff15f0b elementor-widget elementor-widget-text-editor\" data-id=\"ff15f0b\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t<p>We used a <a href=\"http:\/\/developer.exoplatform.org\/#id-git-workflow\" target=\"_blank\" rel=\"noopener\">Git Workflow, <\/a>based on a <strong>branching model. All eXo projects are required to follow this model;<\/strong><\/p>\n&nbsp;\n<ul style=\"list-style: disc; margin-left: 20px!important;\">\n \t<li style=\"font-weight: 400;\"><strong>eDvelop<\/strong> : using the latest validated development changes.<\/li>\n \t<li style=\"font-weight: 400;\"><strong>Feature<\/strong>: Feature branches are dedicated branches for one big feature (.<\/li>\n \t<li style=\"font-weight: 400;\"><strong>Stable\/<\/strong>: Stable branches are used to perform releases and write or accept fixes. &#8220;xxx&#8221; is the stable version name (e.g 1.0.x).<\/li>\n \t<li style=\"font-weight: 400;\"><strong>Fix<\/strong> Fix branches are dedicated to integrating bugfix on the Development branch. If needed the fix is then cherry-picked and transferred to a more stable branch.<\/li>\n \t<li style=\"font-weight: 400;\"><strong>integration<\/strong>: Integration branches are branches dedicated to automatic integration tasks (like Crowdin translations, for example).<\/li>\n \t<li style=\"font-weight: 400;\"><strong>POC<\/strong>: POC branches are dedicated branches to developing proof of concept<\/li>\n<\/ul>\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-6811104 elementor-widget elementor-widget-image\" data-id=\"6811104\" data-element_type=\"widget\" data-widget_type=\"image.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"768\" height=\"784\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Branching-model-Git-Workflow-for-eXo-projects-768x784.png\" class=\"attachment-medium_large size-medium_large wp-image-35333\" alt=\"Branching model Git Workflow for eXo projects\" loading=\"lazy\" srcset=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Branching-model-Git-Workflow-for-eXo-projects-768x784.png 768w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Branching-model-Git-Workflow-for-eXo-projects-294x300.png 294w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Branching-model-Git-Workflow-for-eXo-projects-50x50.png 50w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Branching-model-Git-Workflow-for-eXo-projects-35x35.png 35w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Branching-model-Git-Workflow-for-eXo-projects-464x473.png 464w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Branching-model-Git-Workflow-for-eXo-projects-322x328.png 322w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Branching-model-Git-Workflow-for-eXo-projects-231x236.png 231w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Branching-model-Git-Workflow-for-eXo-projects-128x131.png 128w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Branching-model-Git-Workflow-for-eXo-projects-88x90.png 88w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Branching-model-Git-Workflow-for-eXo-projects-29x30.png 29w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/Branching-model-Git-Workflow-for-eXo-projects.png 940w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-46085fe elementor-reverse-tablet elementor-reverse-mobile elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"46085fe\" data-element_type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-06ccd5d suppblock\" data-id=\"06ccd5d\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-c7afd90 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"c7afd90\" data-element_type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-470d450\" data-id=\"470d450\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap\">\r\n\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-a055be4\" data-id=\"a055be4\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-e447460 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"e447460\" data-element_type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-8c1b039\" data-id=\"8c1b039\" data-element_type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-6ae1200 elementor-widget elementor-widget-image\" data-id=\"6ae1200\" data-element_type=\"widget\" data-widget_type=\"image.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"154\" height=\"211\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/workplace-1.png\" class=\"attachment-large size-large wp-image-40316\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/workplace-1.png 154w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/workplace-1-96x131.png 96w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/workplace-1-66x90.png 66w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/workplace-1-22x30.png 22w\" sizes=\"(max-width: 154px) 100vw, 154px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-fc1e003 buttonright\" data-id=\"fc1e003\" data-element_type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-8108362 elementor-hidden-tablet elementor-hidden-mobile elementor-widget elementor-widget-image\" data-id=\"8108362\" data-element_type=\"widget\" data-widget_type=\"image.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"207\" height=\"34\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/white-1.jpg\" class=\"attachment-large size-large wp-image-38144\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/white-1.jpg 207w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/white-1-200x33.jpg 200w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/white-1-100x16.jpg 100w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/white-1-70x11.jpg 70w\" sizes=\"(max-width: 207px) 100vw, 207px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-a73eafb elementor-widget elementor-widget-heading\" data-id=\"a73eafb\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<h6 class=\"elementor-heading-title elementor-size-default\">FREE WHITE PAPER<\/h6>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-82278f4 elementor-widget elementor-widget-text-editor\" data-id=\"82278f4\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t<p>Types of Digital workplace solutions<\/p>\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-87c8354 buttonright\" data-id=\"87c8354\" data-element_type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-33c54a6 elementor-widget elementor-widget-text-editor\" data-id=\"33c54a6\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t<p>The modern workplace has evolved significantly in recent years, with advancements in technology, the growing number of tools &#8230;<\/p>\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-209a712 elementor-align-center elementor-widget elementor-widget-button\" data-id=\"209a712\" data-element_type=\"widget\" data-widget_type=\"button.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"elementor-button-wrapper\">\r\n\t\t\t<a href=\"https:\/\/www.exoplatform.com\/types-of-digital-workplace-solutions-white-paper\/?utm_source=BlogEn&#038;utm_medium=Blog&#038;utm_campaign=Content&#038;utm_content=cta\" class=\"elementor-button-link elementor-button elementor-size-md\" role=\"button\">\r\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\r\n\t\t\t\t\t\t<span class=\"elementor-button-text\">Download Now<\/span>\r\n\t\t<\/span>\r\n\t\t\t\t\t<\/a>\r\n\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-ddeb05f elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"ddeb05f\" data-element_type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-61eb271\" data-id=\"61eb271\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap\">\r\n\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-815f207\" data-id=\"815f207\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c8a46c5 myheader1 elementor-widget elementor-widget-heading\" data-id=\"c8a46c5\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Platform versions and clients\n<\/h2>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-5dcd305 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"5dcd305\" data-element_type=\"widget\" data-widget_type=\"divider.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"elementor-divider\">\r\n\t\t\t<span class=\"elementor-divider-separator\">\r\n\t\t\t\t\t\t<\/span>\r\n\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-55824c4 elementor-widget elementor-widget-text-editor\" data-id=\"55824c4\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t<p>Over the last 10 years eXo has released many versions of the eXo Platform. With eXo Platform 5 currently in development, in addition to the versions we maintain for our clients (eXo Platform 4.x : 4.0, 4.1, 4.2, 4.3, 4.4), we always need to manage several versions of the Build stack.<\/p>\n&nbsp;\n<p>We build projects with the JDK6, JDK7 or JDK8, and Maven 3.0, Maven 3.2 or Maven 3.3 versions. The native Android application is built by Gradle.<\/p>\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-206a330 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"206a330\" data-element_type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-d78d5df\" data-id=\"d78d5df\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap\">\r\n\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-68035f3\" data-id=\"68035f3\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4ddfcfe myheader1 elementor-widget elementor-widget-heading\" data-id=\"4ddfcfe\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Remember how to create Jenkins job via the UI?\n<\/h2>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-f24abb8 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"f24abb8\" data-element_type=\"widget\" data-widget_type=\"divider.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"elementor-divider\">\r\n\t\t\t<span class=\"elementor-divider-separator\">\r\n\t\t\t\t\t\t<\/span>\r\n\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-0e283a7 elementor-widget elementor-widget-text-editor\" data-id=\"0e283a7\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\tEven if Jenkins 2 has benefited from the many efforts to enhance it, it\u2019s always painful to create a new Maven job via the UI, as you can see below:\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-2542ae9 elementor-widget elementor-widget-image\" data-id=\"2542ae9\" data-element_type=\"widget\" data-widget_type=\"image.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"584\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-pipeline-as-code-1024x584.png\" class=\"attachment-large size-large wp-image-13069\" alt=\"jenkins pipeline as code\" loading=\"lazy\" srcset=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-pipeline-as-code-1024x584.png 1024w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-pipeline-as-code-300x171.png 300w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-pipeline-as-code-768x438.png 768w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-pipeline-as-code-1536x876.png 1536w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-pipeline-as-code-1250x713.png 1250w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-pipeline-as-code-720x410.png 720w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-pipeline-as-code-500x285.png 500w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-pipeline-as-code-360x205.png 360w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-pipeline-as-code-200x114.png 200w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-pipeline-as-code-100x57.png 100w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-pipeline-as-code-53x30.png 53w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-pipeline-as-code.png 1600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-967e5ef elementor-widget elementor-widget-html\" data-id=\"967e5ef\" data-element_type=\"widget\" data-widget_type=\"html.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<center><p><strong>\u201cJenkins DSL and Pipeline jobs with Docker to the rescue!\u201d<\/strong><\/p><\/center>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-160ccfc elementor-widget elementor-widget-text-editor\" data-id=\"160ccfc\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t<p>As a result, we have had to <strong>manage a lot of builds via the Jenkins UI<\/strong> and many<strong> tools in several versions (Maven, JDK, etc.)<\/strong> on CI agents and development laptops.<\/p>\n&nbsp;\n<p>Finding this inefficient and painful, we decided to find a solution to automate and manage it in a different way.<\/p>\n&nbsp;\n<p>The<a style=\"color: #2f5e92; text-decoration: underline;\" href=\"https:\/\/www.docker.com\/what-container\" target=\"_blank\" rel=\"noopener\"> container (Docker) technology<\/a> combined with the emergence of <a style=\"color: #2f5e92; text-decoration: underline;\" href=\"https:\/\/jenkins.io\/doc\/book\/pipeline\/#why\" target=\"_blank\" rel=\"noopener\">automation tools layered onto Jenkins with Pipeline<\/a>, and the efficiency of the <a style=\"color: #2f5e92; text-decoration: underline;\" href=\"https:\/\/jenkinsci.github.io\/job-dsl-plugin\/\" target=\"_blank\" rel=\"noopener\">Job DSL plugin<\/a>, appeared to be the ultimate solution in the eXo context.<\/p>\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-ac35cbb elementor-widget elementor-widget-heading\" data-id=\"ac35cbb\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Step1: Create your own Docker Images\n<\/h3>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-ca0fe97 elementor-widget elementor-widget-text-editor\" data-id=\"ca0fe97\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\tThere are important requirements to be aware of when creating your own Docker images in general, and builds in particular.\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-468bb9e elementor-widget elementor-widget-image\" data-id=\"468bb9e\" data-element_type=\"widget\" data-widget_type=\"image.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"919\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-docker-pipeline-1024x919.png\" class=\"attachment-large size-large wp-image-35334\" alt=\"jenkins docker pipeline\" loading=\"lazy\" srcset=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-docker-pipeline-1024x919.png 1024w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-docker-pipeline-300x269.png 300w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-docker-pipeline-768x689.png 768w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-docker-pipeline-1536x1379.png 1536w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-docker-pipeline-1250x1122.png 1250w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-docker-pipeline-527x473.png 527w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-docker-pipeline-365x328.png 365w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-docker-pipeline-263x236.png 263w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-docker-pipeline-146x131.png 146w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-docker-pipeline-100x90.png 100w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-docker-pipeline-33x30.png 33w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/jenkins-docker-pipeline.png 1600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-05cc22a elementor-widget elementor-widget-heading\" data-id=\"05cc22a\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Choose a distribution base image\n<\/h3>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-7f54977 elementor-widget elementor-widget-text-editor\" data-id=\"7f54977\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t<p>All our CI agents are managed via Puppet and are based on the Ubuntu distribution, so we decided to use a lighter Docker image based on this distribution: the <a style=\"color: #2f5e92; text-decoration: underline;\" href=\"http:\/\/phusion.github.io\/baseimage-docker\/\" target=\"_blank\" rel=\"noopener\">baseimage-docker<\/a>.<\/p>\n&nbsp;\n<p>This was a good compromise between a very small image like Alpine, which resulted in problems related to JDK installation, and the official Ubuntu Docker image, which was too big.<\/p>\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-a690f57 elementor-widget elementor-widget-code-highlight\" data-id=\"a690f57\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>FROM  phusion\/baseimage:0.9.21\r\nLABEL MAINTAINER \"eXo Platform <docker@exoplatform.com>\"<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-3c1ca4e elementor-widget elementor-widget-heading\" data-id=\"3c1ca4e\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Define the locale\n<\/h3>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-ef80567 elementor-widget elementor-widget-text-editor\" data-id=\"ef80567\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t<p>Who hasn\u2019t had test failure due to encoding issues? It works on your Linux machine, but it fails on your colleague\u2019s laptop running Windows.<\/p>\n&nbsp;\n<p>Thus, it\u2019s mandatory to define a locale to ensure that all developers will have the same behavior, whatever their operating system, and that it will be compliant with the CI server configuration.<\/p>\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-aac6510 elementor-widget elementor-widget-code-highlight\" data-id=\"aac6510\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp># Set the locale\r\nRUN locale-gen en_US.UTF-8\r\nENV LANG en_US.UTF-8\r\nENV LANGUAGE en_US:en\r\nENV LC_ALL en_US.UTF-8<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-7a61f04 elementor-widget elementor-widget-heading\" data-id=\"7a61f04\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Create a dedicated CI user\n<\/h3>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-3e075cb elementor-widget elementor-widget-text-editor\" data-id=\"3e075cb\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t<p>\u201c&#8230;<i>take care of running your processes inside the containers as non-privileged users (i.e., non-root)<\/i>\u201d is one of the most important best practices from <a style=\"color: #2f5e92; text-decoration: underline;\" href=\"https:\/\/docs.docker.com\/engine\/security\/security\/\" target=\"_blank\" rel=\"noopener\">the Docker security guide<\/a>.<\/p>\n&nbsp;\n<p>In the Jenkins context, it\u2019s important to create a <strong>dedicated CI user that will fit the uid:guid of the user used by Jenkins on your server agents<\/strong>.<\/p>\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-1691e81 elementor-widget elementor-widget-code-highlight\" data-id=\"1691e81\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp># eXo CI User\r\nARG EXO_CI_USER_UID=13000\r\nENV EXO_CI_USER ciagent\r\nENV EXO_GROUP ciagent\r\n...\r\n# Create user and group with specific ids\r\nRUN useradd --create-home --user-group -u ${EXO_CI_USER_UID} --shell \/bin\/bash ${EXO_CI_USER}<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-7d77b47 elementor-widget elementor-widget-text-editor\" data-id=\"7d77b47\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t<p>Indeed, when Jenkins will execute a Pipeline job, it will have to mount the workspace and other required folders into the Docker container.<\/p>\n&nbsp;\n<p>For example, Jenkins will execute the following command on the server agent:<\/p>\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-54413ab elementor-widget elementor-widget-code-highlight\" data-id=\"54413ab\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>$ docker run -t -d -u 13000:13000\r\n-v m2-cache-ecms-develop-ci:\/home\/ciagent\/.m2\/repository\r\n-v \/srv\/ciagent\/workspace\/ecms-develop-ci:\/srv\/ciagent\/workspace\/ecms-develop-ci:rw\r\n-v \/srv\/ciagent\/workspace\/ecms-develop-ci@tmp:\/srv\/ciagent\/workspace\/ecms-develop-ci@tmp:rw\r\n...  -e ******** --entrypoint cat exoplatform\/ci:jdk8-maven33<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-7d984f4 elementor-widget elementor-widget-text-editor\" data-id=\"7d984f4\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t<p>This dedicated CI user will<strong> prevent permissions issues with Docker volumes<\/strong>.<\/p>\n&nbsp;\n<p>You willl notice that we define the EXO_CI_USER_UID variable with the Docker <strong>ARG<\/strong> instruction. This is important for the developer experience, which we will explain later in this series of articles.<\/p>\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-e8c4c85 dow2-cl elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"e8c4c85\" data-element_type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-389e587\" data-id=\"389e587\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap\">\r\n\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-72f5874\" data-id=\"72f5874\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7214327 elementor-cta--skin-cover elementor-cta--valign-middle elementor-widget elementor-widget-call-to-action\" data-id=\"7214327\" data-element_type=\"widget\" data-widget_type=\"call-to-action.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"elementor-cta\">\n\t\t\t\t\t<div class=\"elementor-cta__bg-wrapper\">\n\t\t\t\t<div class=\"elementor-cta__bg elementor-bg\" style=\"background-image: url(https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2021\/06\/CTA-collaboraion-platform.png);\"><\/div>\n\t\t\t\t<div class=\"elementor-cta__bg-overlay\"><\/div>\n\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-cta__content\">\n\t\t\t\t\n\t\t\t\t<div class=\"elementor-cta__title elementor-cta__content-item elementor-content-item\">Digital Collaboration Software<\/div>\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-cta__description elementor-cta__content-item elementor-content-item\">\n\t\t\t\t\t\tHelp Your Teams Connect, Collaborate and <br>Get Things Done\n\t\t\t\t\t<\/div>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-cta__button-wrapper elementor-cta__content-item elementor-content-item \">\n\t\t\t\t\t<a class=\"elementor-cta__button elementor-button elementor-size-md\" href=\"https:\/\/www.exoplatform.com\/digital-collaboration-software\/?utm_source=BlogEn&#038;utm_medium=Blog&#038;utm_campaign=Under_Content&#038;utm_content=cta\">\n\t\t\t\t\t\tLearn More\t\t\t\t\t<\/a>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-79a424a elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"79a424a\" data-element_type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-74eff41\" data-id=\"74eff41\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap\">\r\n\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-45682c9\" data-id=\"45682c9\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7ed5260 elementor-widget elementor-widget-heading\" data-id=\"7ed5260\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">ENTRYPOINT and CMD\n<\/h3>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-94be253 elementor-widget elementor-widget-text-editor\" data-id=\"94be253\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t<p>In a Dockerfile, the ENTRYPOINT instruction is an optional definition for the first part of the command to be run. So both <a style=\"color: #2f5e92; text-decoration: underline;\" href=\"https:\/\/www.ctl.io\/developers\/blog\/post\/dockerfile-entrypoint-vs-cmd\/\" target=\"_blank\" rel=\"noopener\">ENTRYPOINT or CMD<\/a> instructions, specified in your Dockerfile, identify the default executable for the Docker image.<\/p>\n&nbsp;\n<p>The best way is to combine both of them by using CMD to provide default arguments for the ENTRYPOINT.<\/p>\n&nbsp;\n<p>In the earlier version of the Jenkins Docker Pipeline plugin, Jenkins didn\u2019t use the <i>&#8211;entrypoint<\/i> option when starting containers, so the command was:<\/p>\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-f34afbb elementor-widget elementor-widget-code-highlight\" data-id=\"f34afbb\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>$ docker run ... -e ******** exoplatform\/ci:jdk8-maven33 cat\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-eb9398d elementor-widget elementor-widget-text-editor\" data-id=\"eb9398d\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t<p>In that case, if your Docker Image declared an ENTRYPOINT as startup command, Jenkins was not able to use your image.<\/p>\n&nbsp;\n<p>That\u2019s why we added a custom script in our Docker Images, as a workaround, which allows one to execute Maven as a startup command, but also to execute the <i>cat<\/i> command and other commands executed with an absolute path:<\/p>\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-3c7e56d elementor-widget elementor-widget-heading\" data-id=\"3c7e56d\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\"><img decoding=\"async\" loading=\"lazy\" class=\"alignleft size-full wp-image-25828\" src=\"https:\/\/www-dev.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/pucejaune.jpg\" alt=\"\" width=\"7\" height=\"6\" \/>  Dockerfile\n\n<\/h4>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-432ffd2 elementor-widget elementor-widget-code-highlight\" data-id=\"432ffd2\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>COPY docker-entrypoint.sh \/usr\/bin\/docker-entrypoint\r\n# Workaround to be able to execute others command than \"mvn\" as entrypoint\r\nENTRYPOINT [\"\/usr\/bin\/docker-entrypoint\"]\r\n\r\nCMD [\"mvn\", \"--help\"]\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-ba7461e elementor-widget elementor-widget-heading\" data-id=\"ba7461e\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\"><img decoding=\"async\" loading=\"lazy\" class=\"alignleft size-full wp-image-25828\" src=\"https:\/\/www-dev.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/pucejaune.jpg\" alt=\"\" width=\"7\" height=\"6\" \/>  docker-entrypoint.sh\n\n\n\n<\/h4>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-583f1b6 elementor-widget elementor-widget-code-highlight\" data-id=\"583f1b6\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp># Hack for Jenkins Pipeline: authorize cat without absolute path\r\nif [[ \"$1\" == \"\/\"* ]] || [[ \"$1\" == \"cat\" ]]; then\r\nexec \"$@\"\r\nfi\r\n\r\nexec mvn \"$@\"\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-6b9594e elementor-widget elementor-widget-text-editor\" data-id=\"6b9594e\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\tIn the latest versions of the J<a style=\"color: #2f5e92; text-decoration: underline;\" href=\"https:\/\/jenkins.io\/doc\/pipeline\/steps\/docker-workflow\/\" target=\"_blank\" rel=\"noopener\">enkins Pipeline Docker plugin,<\/a> this problem has been fixed, to allow use of the <i>&#8211;entrypoint<\/i> option so that the ENTRYPOINT instruction is always overridden:\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-025fe6f elementor-widget elementor-widget-code-highlight\" data-id=\"025fe6f\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>$ docker run ... -e ******** --entrypoint cat exoplatform\/ci:jdk8-maven33\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-2812bdb elementor-widget elementor-widget-heading\" data-id=\"2812bdb\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Use inheritance to avoid code duplication\n<\/h3>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-b7c9cc1 elementor-widget elementor-widget-text-editor\" data-id=\"b7c9cc1\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t<p>We have created and continue to create Docker images to cover our entire Build Stack. Currently this list contains:<\/p>\n&nbsp;\n<ul style=\"list-style: disc; margin-left: 20px!important;\">\n \t<li style=\"font-weight: 400;\">exoplatform\/ci:jdk6-maven30<\/li>\n \t<li style=\"font-weight: 400;\">exoplatform\/ci:jdk7-maven30<\/li>\n \t<li style=\"font-weight: 400;\">exoplatform\/ci:jdk7-maven32<\/li>\n \t<li style=\"font-weight: 400;\">exoplatform\/ci:jdk8-maven32<\/li>\n \t<li style=\"font-weight: 400;\">exoplatform\/ci:jdk8-maven33<\/li>\n \t<li style=\"font-weight: 400;\">exoplatform\/ci:jdk8-gradle2<\/li>\n \t<li style=\"font-weight: 400;\">\u2026<\/li>\n<\/ul>\n&nbsp;\n<p>As you can imagine, there are not many differences between all those images, so we have created CI base images at several levels to be able to avoid code duplication as much as possible.<\/p>\n&nbsp;\n<p>The diagram below shows how those images are organized:<\/p>\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-729de3e elementor-widget elementor-widget-image\" data-id=\"729de3e\" data-element_type=\"widget\" data-widget_type=\"image.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"960\" height=\"720\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/create-Docker-images-for-entire-Build-Stack.png\" class=\"attachment-large size-large wp-image-13072\" alt=\"create Docker images for entire Build Stack\" loading=\"lazy\" srcset=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/create-Docker-images-for-entire-Build-Stack.png 960w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/create-Docker-images-for-entire-Build-Stack-300x225.png 300w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/create-Docker-images-for-entire-Build-Stack-768x576.png 768w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/create-Docker-images-for-entire-Build-Stack-631x473.png 631w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/create-Docker-images-for-entire-Build-Stack-437x328.png 437w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/create-Docker-images-for-entire-Build-Stack-315x236.png 315w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/create-Docker-images-for-entire-Build-Stack-175x131.png 175w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/create-Docker-images-for-entire-Build-Stack-100x75.png 100w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/create-Docker-images-for-entire-Build-Stack-40x30.png 40w\" sizes=\"(max-width: 960px) 100vw, 960px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-6898305 elementor-widget elementor-widget-text-editor\" data-id=\"6898305\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\tBelow is an extract of the Dockerfile for the <strong>exoplatform\/ci:jdk8-maven33 CI Image<\/strong>. You can see that there are only Docker instructions related to the Maven installation, since all other configurations have been done in the inherited images (define locale, create user CI\u2026).\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-a5ca94a elementor-widget elementor-widget-code-highlight\" data-id=\"a5ca94a\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>FROM exoplatform\/ci:jdk8\r\n\r\n# CI Tools version\r\nENV MAVEN_VERSION 3.3.9\r\n# Install Maven\r\nRUN mkdir -p \/usr\/share\/maven \\\r\n&& curl -fsSL http:\/\/archive.apache.org\/dist\/maven\/maven-3\/$MAVEN_VERSION\/binaries\/apache-maven-$MAVEN_VERSION-bin.tar.gz \\\r\n| tar xzf - -C \/usr\/share\/maven --strip-components=1  \\\r\n&& ln -s \/usr\/share\/maven\/bin\/mvn \/usr\/bin\/mvn\r\n\r\n\r\n\r\n\u2026\r\n\r\n# Custom configuration for Maven\r\nENV M2_HOME=\/usr\/share\/maven\r\nENV MAVEN_OPTS=\"-Dmaven.repo.local=${HOME}\/.m2\/repository -XX:+UseConcMarkSweepGC -Xms1G -Xmx2G -XX:MaxMetaspaceSize=1G -Dcom.sun.media.jai.disableMediaLib=true -Djava.io.tmpdir=${EXO_CI_TMP_DIR} -Dmaven.artifact.threads=10 -Djava.awt.headless=true\"\r\nENV PATH=$JAVA_HOME\/bin:$M2_HOME\/bin:$PATH\r\n\r\n...\r\n\r\n# Workaround to be able to execute others command than \"mvn\" as entrypoint\r\nENTRYPOINT [\"\/usr\/bin\/docker-entrypoint\"]\r\n\r\nCMD [\"mvn\", \"--help\"]<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-89895ea elementor-widget elementor-widget-text-editor\" data-id=\"89895ea\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\tAs explained before, we combined ENTRYPOINT and CMD Docker instructions to be able to run all Maven commands easily in this container:\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-428739a elementor-widget elementor-widget-code-highlight\" data-id=\"428739a\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>docker run ... -e ******** exoplatform\/ci:jdk8-maven33 clean package\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-9218e3f elementor-widget elementor-widget-text-editor\" data-id=\"9218e3f\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\tWe also add a custom script, to be able to run the cat command and commands other than Maven by giving the absolute path to the command:\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-a59c124 elementor-widget elementor-widget-code-highlight\" data-id=\"a59c124\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>docker run exoplatform\/ci:jdk8-maven33 \/bin\/echo hello<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-511f260 elementor-widget elementor-widget-text-editor\" data-id=\"511f260\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\tFinally, you will have noticed that we defined the M<strong>2_REPO and MAVEN_OPTS environment variables as Docker ENV instructions<\/strong> with all important parameters having default values, which can be overridden by the -e option in the docker run command.\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-46a21a6 elementor-widget elementor-widget-heading\" data-id=\"46a21a6\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Test your Docker Images<\/h3>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-205f980 elementor-widget elementor-widget-text-editor\" data-id=\"205f980\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t<p>As with other source code, you can create tests suites for your Docker files and images. For the eXo CI Docker images, we use <a style=\"color: #2f5e92; text-decoration: underline;\" href=\"https:\/\/github.com\/aelsabbahy\/goss\" target=\"_blank\" rel=\"noopener\">Goss<\/a> via <a style=\"color: #2f5e92; text-decoration: underline;\" href=\"https:\/\/github.com\/aelsabbahy\/goss\/tree\/master\/extras\/dgoss\" target=\"_blank\" rel=\"noopener\">dgoss<\/a>.<\/p>\n&nbsp;\n<ul style=\"list-style: disc; margin-left: 20px!important;\">\n \t<li style=\"font-weight: 400;\">Goss is a YAML based tool for validating a server\u2019s configuration<\/li>\n \t<li style=\"font-weight: 400;\">dgoss is a wrapper around Goss that aims to bring the simplicity of Goss to Docker containers.<\/li>\n<\/ul>\n&nbsp;\n<p>The first step is to create a YAML file to describe what you want to test in your Docker container. There are <a style=\"color: #2f5e92; text-decoration: underline;\" href=\"https:\/\/github.com\/aelsabbahy\/dgoss-examples\" target=\"_blank\" rel=\"noopener\">some examples online that can help you<\/a> to create this configuration file, but it can be also be generated from the goss command line.<\/p>\n&nbsp;\n<p>For example, say we want to check that some Maven configuration files exist in the container. We want to test that the <strong><i>mvn &#8211;version <\/i><\/strong>command is compliant with the Maven and JDK versions installed.<\/p>\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-f31eaa7 elementor-widget elementor-widget-heading\" data-id=\"f31eaa7\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\"><img decoding=\"async\" loading=\"lazy\" class=\"alignleft size-full wp-image-25828\" src=\"https:\/\/www-dev.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/pucejaune.jpg\" alt=\"\" width=\"7\" height=\"6\" \/>  goss.yaml<\/h4>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-7d825a6 elementor-widget elementor-widget-code-highlight\" data-id=\"7d825a6\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>file:\r\n\/home\/ciagent\/.m2\/repository:\r\ntitle: Validating the presence Maven repository folder\r\nexists: true\r\n\/home\/ciagent\/.m2\/settings.xml:\r\ntitle: Validating the absence of eXo USER settings file\r\nexists: false\r\n\/usr\/share\/maven\/conf\/settings.xml:\r\ntitle: Validating the presence of eXo GLOBAL settings file\r\nexists: true\r\npackage:\r\ngit:\r\ninstalled: true\r\ntitle: Check that git is installed\r\ncommand:\r\nmvn --version:\r\nexit-status: 0\r\nstdout:\r\n- 3.3.9\r\n- 1.8.0\r\n- \"Default locale: en_US, platform encoding: UTF-8\"\r\nstderr: []\r\ntimeout: 0<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-28ab276 elementor-widget elementor-widget-text-editor\" data-id=\"28ab276\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\tThen to execute those tests, it is a simple matter of executing the dgoss tool:\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-1d1e0f8 elementor-widget elementor-widget-code-highlight\" data-id=\"1d1e0f8\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>dgoss run -it exoplatform\/ci:jdk8-maven33 cat\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-4d4b265 elementor-widget elementor-widget-image\" data-id=\"4d4b265\" data-element_type=\"widget\" data-widget_type=\"image.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"871\" height=\"667\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/create-tests-suites-for-eXo-CI-Docker-images.png\" class=\"attachment-large size-large wp-image-13071\" alt=\"create tests suites for eXo CI Docker images\" loading=\"lazy\" srcset=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/create-tests-suites-for-eXo-CI-Docker-images.png 871w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/create-tests-suites-for-eXo-CI-Docker-images-300x230.png 300w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/create-tests-suites-for-eXo-CI-Docker-images-768x588.png 768w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/create-tests-suites-for-eXo-CI-Docker-images-618x473.png 618w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/create-tests-suites-for-eXo-CI-Docker-images-428x328.png 428w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/create-tests-suites-for-eXo-CI-Docker-images-308x236.png 308w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/create-tests-suites-for-eXo-CI-Docker-images-171x131.png 171w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/create-tests-suites-for-eXo-CI-Docker-images-100x77.png 100w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2017\/05\/create-tests-suites-for-eXo-CI-Docker-images-39x30.png 39w\" sizes=\"(max-width: 871px) 100vw, 871px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-2bb9948 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"2bb9948\" data-element_type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-1cff6c5\" data-id=\"1cff6c5\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap\">\r\n\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-8f1d9b7\" data-id=\"8f1d9b7\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c4f0a6a myheader1 elementor-widget elementor-widget-heading\" data-id=\"c4f0a6a\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Conclusion\n<\/h2>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-64e6f31 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"64e6f31\" data-element_type=\"widget\" data-widget_type=\"divider.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"elementor-divider\">\r\n\t\t\t<span class=\"elementor-divider-separator\">\r\n\t\t\t\t\t\t<\/span>\r\n\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-11f237e elementor-widget elementor-widget-text-editor\" data-id=\"11f237e\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t<p>If you are interested in using or testing these Docker Images, you will find:<\/p>\n&nbsp;\n<ul style=\"list-style: disc; margin-left: 20px!important;\">\n \t<li style=\"font-weight: 400;\">all the Dockerfiles on the <a style=\"color: #2f5e92; text-decoration: underline;\" href=\"https:\/\/github.com\/exo-docker\/exo-ci\/\" target=\"_blank\" rel=\"noopener\">dedicated exo-docker\/exo-ci GitHub repository<\/a><\/li>\n \t<li style=\"font-weight: 400;\">all the Docker images on the <a style=\"color: #2f5e92; text-decoration: underline;\" href=\"https:\/\/hub.docker.com\/r\/exoplatform\/ci\/\" target=\"_blank\" rel=\"noopener\">eXo DockerHub Organization<\/a><\/li>\n<\/ul>\n&nbsp;\n<p>Feel free to give your feedback about this.<\/p>\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-9700976 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"9700976\" data-element_type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-4aac7a6\" data-id=\"4aac7a6\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap\">\r\n\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-9029249\" data-id=\"9029249\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-435e773 myheader1 elementor-widget elementor-widget-heading\" data-id=\"435e773\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Next step\n<\/h2>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-11cbc12 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"11cbc12\" data-element_type=\"widget\" data-widget_type=\"divider.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"elementor-divider\">\r\n\t\t\t<span class=\"elementor-divider-separator\">\r\n\t\t\t\t\t\t<\/span>\r\n\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-0daffcd elementor-widget elementor-widget-text-editor\" data-id=\"0daffcd\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\tNow that we have created Docker Images for all our Continuous Integration stacks, we will explain in the next article (Part 2) how to use them on your laptop, whatever your operating system. Stay tuned!\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-e31b276 elementor-hidden-desktop elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"e31b276\" data-element_type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-ba50b25 suppblock\" data-id=\"ba50b25\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-31d3e2d elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"31d3e2d\" data-element_type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-5e4d9fa\" data-id=\"5e4d9fa\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap\">\r\n\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-44d7405\" data-id=\"44d7405\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-6b17d2e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6b17d2e\" data-element_type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-1cfe666\" data-id=\"1cfe666\" data-element_type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-cca0bd7 elementor-widget elementor-widget-image\" data-id=\"cca0bd7\" data-element_type=\"widget\" data-widget_type=\"image.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"159\" height=\"222\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/open-source-wp.png\" class=\"attachment-large size-large wp-image-40335\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/open-source-wp.png 159w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/open-source-wp-94x131.png 94w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/open-source-wp-64x90.png 64w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/open-source-wp-21x30.png 21w\" sizes=\"(max-width: 159px) 100vw, 159px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-860676a buttonright\" data-id=\"860676a\" data-element_type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-beb2bde elementor-widget elementor-widget-image\" data-id=\"beb2bde\" data-element_type=\"widget\" data-widget_type=\"image.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"207\" height=\"34\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/white-1.jpg\" class=\"attachment-large size-large wp-image-38144\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/white-1.jpg 207w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/white-1-200x33.jpg 200w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/white-1-100x16.jpg 100w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/white-1-70x11.jpg 70w\" sizes=\"(max-width: 207px) 100vw, 207px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-25331a3 elementor-widget elementor-widget-heading\" data-id=\"25331a3\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<h6 class=\"elementor-heading-title elementor-size-default\">FREE WHITE PAPER<\/h6>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-43f691b elementor-widget-mobile__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"43f691b\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\tBenefits of Open Source Software <br>for the Enterprise\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-692d621 elementor-hidden-tablet elementor-hidden-mobile elementor-widget elementor-widget-text-editor\" data-id=\"692d621\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\tOpen source\nen entreprise\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-d1bb1df buttonright\" data-id=\"d1bb1df\" data-element_type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-850f847 elementor-widget elementor-widget-text-editor\" data-id=\"850f847\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\tThe term open source refers to any solution that has its source code widely accessible to the public for modification and sharing.\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-54eae20 elementor-align-center elementor-widget elementor-widget-button\" data-id=\"54eae20\" data-element_type=\"widget\" data-widget_type=\"button.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"elementor-button-wrapper\">\r\n\t\t\t<a href=\"https:\/\/www.exoplatform.com\/benefits-of-open-source-software-for-the-enterprise-white-paper\/?utm_source=BlogEn&#038;utm_medium=Blog&#038;utm_campaign=Content&#038;utm_content=cta\" class=\"elementor-button-link elementor-button elementor-size-md\" role=\"button\">\r\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\r\n\t\t\t\t\t\t<span class=\"elementor-button-text\">Download Now<\/span>\r\n\t\t<\/span>\r\n\t\t\t\t\t<\/a>\r\n\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-bf7677b elementor-hidden-tablet elementor-hidden-mobile elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"bf7677b\" data-element_type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-a3b7ea5 suppblock\" data-id=\"a3b7ea5\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-67b57af elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"67b57af\" data-element_type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-bbbe80f\" data-id=\"bbbe80f\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap\">\r\n\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-1c7ed78\" data-id=\"1c7ed78\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-7326c9a elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7326c9a\" data-element_type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-4ffb984\" data-id=\"4ffb984\" data-element_type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-bca5e50 elementor-widget elementor-widget-image\" data-id=\"bca5e50\" data-element_type=\"widget\" data-widget_type=\"image.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"159\" height=\"222\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/open-source-wp.png\" class=\"attachment-large size-large wp-image-40335\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/open-source-wp.png 159w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/open-source-wp-94x131.png 94w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/open-source-wp-64x90.png 64w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/open-source-wp-21x30.png 21w\" sizes=\"(max-width: 159px) 100vw, 159px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-56f5934 buttonright\" data-id=\"56f5934\" data-element_type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2948d18 elementor-widget elementor-widget-image\" data-id=\"2948d18\" data-element_type=\"widget\" data-widget_type=\"image.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"207\" height=\"34\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/white-1.jpg\" class=\"attachment-large size-large wp-image-38144\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/white-1.jpg 207w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/white-1-200x33.jpg 200w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/white-1-100x16.jpg 100w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2022\/12\/white-1-70x11.jpg 70w\" sizes=\"(max-width: 207px) 100vw, 207px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-672da43 elementor-widget elementor-widget-heading\" data-id=\"672da43\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<h6 class=\"elementor-heading-title elementor-size-default\">FREE WHITE PAPER<\/h6>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-21480ad elementor-widget elementor-widget-text-editor\" data-id=\"21480ad\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\tBenefits of Open Source Software <br>for the Enterprise\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-09cb389 buttonright\" data-id=\"09cb389\" data-element_type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-788a6ca elementor-widget elementor-widget-text-editor\" data-id=\"788a6ca\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\tThe term open source refers to any solution that has its source code widely accessible to the public for modification and sharing.\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-34ea7e8 elementor-align-center elementor-widget elementor-widget-button\" data-id=\"34ea7e8\" data-element_type=\"widget\" data-widget_type=\"button.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"elementor-button-wrapper\">\r\n\t\t\t<a href=\"https:\/\/www.exoplatform.com\/benefits-of-open-source-software-for-the-enterprise-white-paper\/?utm_source=BlogEn&#038;utm_medium=Blog&#038;utm_campaign=Content&#038;utm_content=cta\" class=\"elementor-button-link elementor-button elementor-size-md\" role=\"button\">\r\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\r\n\t\t\t\t\t\t<span class=\"elementor-button-text\">Download Now<\/span>\r\n\t\t<\/span>\r\n\t\t\t\t\t<\/a>\r\n\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-2ec0c7b elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"2ec0c7b\" data-element_type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-adc869b\" data-id=\"adc869b\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-6236b3c elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6236b3c\" data-element_type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-f348b87\" data-id=\"f348b87\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5475038 elementor-align-left tags_class_element elementor-widget elementor-widget-post-info\" data-id=\"5475038\" data-element_type=\"widget\" data-widget_type=\"post-info.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<ul class=\"elementor-icon-list-items elementor-post-info\">\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-repeater-item-4f61546\" itemprop=\"about\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"fas fa-tags\"><\/i>\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text elementor-post-info__item elementor-post-info__item--type-terms\">\n\t\t\t\t\t\t\t<span class=\"elementor-post-info__item-prefix\">Tags:<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-post-info__terms-list\">\n\t\t\t\t<a href=\"https:\/\/www.exoplatform.com\/blog\/exo\/\" class=\"elementor-post-info__terms-list-item\">eXo<\/a>, <a href=\"https:\/\/www.exoplatform.com\/blog\/tutorial\/\" class=\"elementor-post-info__terms-list-item\">Tutorial<\/a>\t\t\t\t<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t<li class=\"elementor-icon-list-item elementor-repeater-item-105f90f\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text elementor-post-info__item elementor-post-info__item--type-custom\">\n\t\t\t\t\t\t\t\t\t\t&nbsp;\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t<\/ul>\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-1f2cd37\" data-id=\"1f2cd37\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-295600c elementor-widget elementor-widget-shortcode\" data-id=\"295600c\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"elementor-shortcode\">\n\n<div class=\"kk-star-ratings kksr-shortcode\"\n    data-payload='{&quot;id&quot;:&quot;13062&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;shortcode&quot;,&quot;align&quot;:&quot;&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;0&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;0&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;valign&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;5&quot;,&quot;greet&quot;:&quot;Rate this post&quot;,&quot;legend&quot;:&quot;0\\\/5 - (0 vote)&quot;,&quot;size&quot;:&quot;24&quot;,&quot;width&quot;:&quot;0&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} - ({count} {votes})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 0px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 19.2px;\">\n            <span class=\"kksr-muted\">Rate this post<\/span>\n    <\/div>\n    <\/div>\n<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-4c2bd46 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"4c2bd46\" data-element_type=\"section\" id=\"end-tet\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-1a5b08e\" data-id=\"1a5b08e\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f416bc4 elementor-widget__width-inherit elementor-widget elementor-widget-testimonial\" data-id=\"f416bc4\" data-element_type=\"widget\" data-widget_type=\"testimonial.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<style>\/*! elementor - v3.13.2 - 11-05-2023 *\/\r\n.elementor-testimonial-wrapper{overflow:hidden;text-align:center}.elementor-testimonial-wrapper .elementor-testimonial-content{font-size:1.3em;margin-bottom:20px}.elementor-testimonial-wrapper .elementor-testimonial-name{line-height:1.5;display:block}.elementor-testimonial-wrapper .elementor-testimonial-job{font-size:.85em;display:block}.elementor-testimonial-wrapper .elementor-testimonial-meta{width:100%;line-height:1}.elementor-testimonial-wrapper .elementor-testimonial-meta-inner{display:inline-block}.elementor-testimonial-wrapper .elementor-testimonial-meta .elementor-testimonial-details,.elementor-testimonial-wrapper .elementor-testimonial-meta .elementor-testimonial-image{display:table-cell;vertical-align:middle}.elementor-testimonial-wrapper .elementor-testimonial-meta .elementor-testimonial-image img{width:60px;height:60px;border-radius:50%;-o-object-fit:cover;object-fit:cover;max-width:none}.elementor-testimonial-wrapper .elementor-testimonial-meta.elementor-testimonial-image-position-aside .elementor-testimonial-image{padding-right:15px}.elementor-testimonial-wrapper .elementor-testimonial-meta.elementor-testimonial-image-position-aside .elementor-testimonial-details{text-align:left}.elementor-testimonial-wrapper .elementor-testimonial-meta.elementor-testimonial-image-position-top .elementor-testimonial-details,.elementor-testimonial-wrapper .elementor-testimonial-meta.elementor-testimonial-image-position-top .elementor-testimonial-image{display:block}.elementor-testimonial-wrapper .elementor-testimonial-meta.elementor-testimonial-image-position-top .elementor-testimonial-image{margin-bottom:20px}<\/style>\t\t<div class=\"elementor-testimonial-wrapper\">\r\n\t\t\t\r\n\t\t\t\t\t\t<div class=\"elementor-testimonial-meta elementor-has-image elementor-testimonial-image-position-top\">\r\n\t\t\t\t<div class=\"elementor-testimonial-meta-inner\">\r\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"elementor-testimonial-image\">\r\n\t\t\t\t\t\t\t<a href=\"https:\/\/www.exoplatform.com\/blog\/author\/maxime-greau\/\" target=\"_blank\"><img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/6559a6d18f9fad60e96cd1eb60389840?s=96&amp;d=mm&amp;r=g\" title=\"\" alt=\"\" loading=\"lazy\" \/><\/a>\t\t\t\t\t\t<\/div>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t<div class=\"elementor-testimonial-details\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-testimonial-name\" href=\"https:\/\/www.exoplatform.com\/blog\/author\/maxime-greau\/\" target=\"_blank\">Maxime Greau<\/a>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-9a5f4ee\" data-id=\"9a5f4ee\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-9fadb9e elementor-widget elementor-widget-testimonial\" data-id=\"9fadb9e\" data-element_type=\"widget\" data-widget_type=\"testimonial.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"elementor-testimonial-wrapper\">\r\n\t\t\t\t\t\t\t<div class=\"elementor-testimonial-content\">\n  <figcaption>\n  <\/figcaption>\n<\/div>\r\n\t\t\t\r\n\t\t\t\t\t\t<div class=\"elementor-testimonial-meta\">\r\n\t\t\t\t<div class=\"elementor-testimonial-meta-inner\">\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t<div class=\"elementor-testimonial-details\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"elementor-testimonial-job\">I'm the software factory manager at eXo. I'm responsible for all software factory services (Jenkins CI, GitHub, Nexus, Sonar...) and the eXo release process. \r\nI help to make the eXo developer experience better by simplifying and automating as much of the process as possible.\r\nPassionate about IT and open source, I contribute to open source projects in different ways (speaking at conferences, writing blog posts...). Also, I have written a book about Apache Maven 3.<\/div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-85625ed elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"85625ed\" data-element_type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-1fb4d1a\" data-id=\"1fb4d1a\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-48fab1a faq-id elementor-widget elementor-widget-heading\" data-id=\"48fab1a\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<h6 class=\"elementor-heading-title elementor-size-default\">Related posts<\/h6>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-b79103c emp-cat elementor-widget elementor-widget-shortcode\" data-id=\"b79103c\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"elementor-shortcode\">\n\t<div class=\"am_ajax_post_grid_wrap\"  style=\"background-color: transparent !important; \" data-pagination_type=\"load_more\" data-am_ajax_post_grid='{\"show_filter\":\"yes\",\"btn_all\":\"yes\",\"initial\":\"-1\",\"layout\":\"1\",\"post_type\":\"post\",\"posts_per_page\":\"3\",\"cat\":\"\",\"terms\":\"\",\"paginate\":\"no\",\"hide_empty\":\"true\",\"orderby\":\"date\",\"order\":\"ASC\",\"pagination_type\":\"load_more\",\"infinite_scroll\":\"\",\"animation\":\"\",\"grid_id\":\"\"}'>\r\n\r\n\t\t\t\t\t<div class=\"asr-filter-div\" data-layout=\"1\"><ul>\r\n\t\t\t\t\t\t\t\t\t<li \r\n\r\n\r\n\r\n \r\n   class=\"asr_texonomy active\" style=\"font-weight:bold;\"data_id=\"-1\" style=\"background-color: transparent !important;\">All<\/li>\r\n\t\t\t\t\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1302\">eXo<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"508\">eXo<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"642\">eXo<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1407\">Anerkennung der Mitarbeiter<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"454\">Digital workplace<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"500\">Digital workplace<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1337\">Arbeitsplatz<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"462\">Employee engagement<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"616\">Engagement collaborateur<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1465\">Branchentrends<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"486\">Open source<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"506\">Open source<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"620\">Avenir du travail<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1411\">Cartoon<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"504\">Future of work<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1137\">Actualit\u00e9s<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1366\">Change Management<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"460\">Internal communication<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"492\">Collaboration<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"458\">Collaboration<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1287\">Digital Workplace<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1323\">Digitale Transformation<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"496\">Exp\u00e9rience collaborateur<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"705\">News<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"452\">intranet<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1135\">intranet<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"494\">Communication interne<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1311\">Infografik<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"409\">workplace<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1294\">interne Kommunikation<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"456\">Knowledge management<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"618\">onboarding<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"512\">Employee experience<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"490\">Gestion des connaissances<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1281\">intranet<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"502\">Conduite de changement<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"514\">Employee productivity<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1329\">Kollaboration<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1451\">Leadership<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1187\">Leadership<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"614\">onboarding<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1183\">Cartoon<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"518\">Employee recognition<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1331\">Leitfaden<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1181\">Astuces et bonnes pratiques<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"516\">Change management<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1292\">Mitarbeiter engagement<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"813\">Cartoon<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"411\">Etudes de cas<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1339\">Mitarbeiter Erfahrung<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"622\">Digital transformation<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1175\">Guide<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1317\">Nachrichten<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"799\">Infographic<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1185\">Infographie<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1403\">Onboarding<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1300\">Open source<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"510\">Remote work<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"498\">Productivit\u00e9<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1173\">T\u00e9l\u00e9travail<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"488\">Transformation digitale<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1179\">Tutoriel<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1443\">Actualit\u00e9s produit<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1562\">Extranet<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1461\">Industry trends<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1445\">Product News<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1447\">Produkt Nachrichten<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1309\">Produktivit\u00e4t<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1405\">Reconnaissance des employ\u00e9s<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1307\">Telearbeit<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1463\">Tendances<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1449\">Thought leadership<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1345\">Tipps und Tricks<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"780\">Tips &amp; Tricks<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"819\">Tutorial<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1269\">Uncategorized<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"699\">Uncategorized<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1378\">Wissensmanagement<\/li>\r\n\t\t        \t\t            <li class=\"asr_texonomy\" data_id=\"1304\">Zukunft der Arbeit<\/li>\r\n\t\t        \t        <\/ul><\/div>\r\n\t    \r\n\t    <div class=\"asr-ajax-container\" style=\"background-color: transparent !important;\">\r\n\t\t    <div class=\"asr-loader\">\r\n\t\t    \t<div class=\"lds-dual-ring\"><\/div>\r\n\t\t    <\/div>\r\n\t\t    <div class=\"asrafp-filter-result\">\r\n\t\t    \t<div class=\"am-postgrid-wrapper\">\r\n\r\n\t\t<div class=\"am_post_grid am__col-3 am_layout_1  \">\r\n\t\t\r\n\t\t\t\t\t\t\t\t\t\t<div class=\"am_grid_col\">\r\n\t\t\t\t<div class=\"am_single_grid\">\r\n\t\t\t\t\t<div class=\"am_thumb\">\r\n\t\t\t\t\t<a href=\"https:\/\/www.exoplatform.com\/blog\/manage-projects-within-exo-platfom\/\">\r\n\t\t\t\t\t\t<img width=\"800\" height=\"533\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2021\/09\/800x533-1.jpeg\" class=\"attachment-full size-full wp-post-image\" alt=\"\" decoding=\"async\" loading=\"lazy\" srcset=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2021\/09\/800x533-1.jpeg 800w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2021\/09\/800x533-1-300x200.jpeg 300w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2021\/09\/800x533-1-768x512.jpeg 768w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2021\/09\/800x533-1-710x473.jpeg 710w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2021\/09\/800x533-1-492x328.jpeg 492w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2021\/09\/800x533-1-354x236.jpeg 354w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2021\/09\/800x533-1-197x131.jpeg 197w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2021\/09\/800x533-1-100x67.jpeg 100w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2021\/09\/800x533-1-45x30.jpeg 45w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t<\/a>\t\r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t\t<div class=\"am_cont\">\r\n\t\t\t\t\t\t<a href=\"https:\/\/www.exoplatform.com\/blog\/manage-projects-within-exo-platfom\/\"><h2 class=\"am__title\">Manage projects within eXo Platfom<\/h2><\/a>\r\n\t\t\t\t\t\t<div class=\"am__excerpt\">\r\n\t\t\t\t\t\t<a href=\"https:\/\/www.exoplatform.com\/blog\/manage-projects-within-exo-platfom\/\">Manage projects within eXo Platfom Project management has always been a vital\u2026<\/a>\r\n\t\t\t\t\t\t<\/div>\r\n\t\t\t\t\t\t<a href=\"https:\/\/www.exoplatform.com\/blog\/manage-projects-within-exo-platfom\/\" class=\"am__readmore\">Read More<\/a>\r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t\t<div class=\"post_tags\"><a href=\"https:\/\/www.exoplatform.com\/blog\/tutorial\/\" title=\"Tutorial Tag\" class=\"tutorial\">Tutorial<\/a> <\/div>\t\t\t\t\t<div class=\"am_time\">\r\n\t\t\t\t\t\t<span class=\"bsf-rt-reading-time\"><span class=\"bsf-rt-display-label\" prefix=\"Reading Time\">\n\t\t<\/span> <span class=\"bsf-rt-display-time\" reading_time=\"7\"><\/span> \n\t\t<span class=\"bsf-rt-display-postfix\" postfix=\"min\"><\/span><\/span> \r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t<\/div>\r\n\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t<div class=\"am_grid_col\">\r\n\t\t\t\t<div class=\"am_single_grid\">\r\n\t\t\t\t\t<div class=\"am_thumb\">\r\n\t\t\t\t\t<a href=\"https:\/\/www.exoplatform.com\/blog\/guide-to-integrate-linkedin-2-0-connect-with-the-exo-platform-sign-in-mechanism\/\">\r\n\t\t\t\t\t\t<img width=\"768\" height=\"512\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2021\/03\/linkedin-800x533-768x512-1.jpg\" class=\"attachment-full size-full wp-post-image\" alt=\"\" decoding=\"async\" loading=\"lazy\" srcset=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2021\/03\/linkedin-800x533-768x512-1.jpg 768w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2021\/03\/linkedin-800x533-768x512-1-300x200.jpg 300w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2021\/03\/linkedin-800x533-768x512-1-710x473.jpg 710w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2021\/03\/linkedin-800x533-768x512-1-492x328.jpg 492w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2021\/03\/linkedin-800x533-768x512-1-354x236.jpg 354w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2021\/03\/linkedin-800x533-768x512-1-197x131.jpg 197w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2021\/03\/linkedin-800x533-768x512-1-100x67.jpg 100w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2021\/03\/linkedin-800x533-768x512-1-45x30.jpg 45w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2021\/03\/linkedin-800x533-768x512-1-640x427.jpg 640w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t<\/a>\t\r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t\t<div class=\"am_cont\">\r\n\t\t\t\t\t\t<a href=\"https:\/\/www.exoplatform.com\/blog\/guide-to-integrate-linkedin-2-0-connect-with-the-exo-platform-sign-in-mechanism\/\"><h2 class=\"am__title\">Guide to Integrate LinkedIn 2.0 Connect with the eXo Platform Sign-In Mechanism<\/h2><\/a>\r\n\t\t\t\t\t\t<div class=\"am__excerpt\">\r\n\t\t\t\t\t\t<a href=\"https:\/\/www.exoplatform.com\/blog\/guide-to-integrate-linkedin-2-0-connect-with-the-exo-platform-sign-in-mechanism\/\">Guide to Integrate LinkedIn 2.0 Connect with the eXo Platform Sign-In Mechanism\u2026<\/a>\r\n\t\t\t\t\t\t<\/div>\r\n\t\t\t\t\t\t<a href=\"https:\/\/www.exoplatform.com\/blog\/guide-to-integrate-linkedin-2-0-connect-with-the-exo-platform-sign-in-mechanism\/\" class=\"am__readmore\">Read More<\/a>\r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t\t<div class=\"post_tags\"><a href=\"https:\/\/www.exoplatform.com\/blog\/exo\/\" title=\"eXo Tag\" class=\"exo\">eXo<\/a> <\/div>\t\t\t\t\t<div class=\"am_time\">\r\n\t\t\t\t\t\t<span class=\"bsf-rt-reading-time\"><span class=\"bsf-rt-display-label\" prefix=\"Reading Time\">\n\t\t<\/span> <span class=\"bsf-rt-display-time\" reading_time=\"5\"><\/span> \n\t\t<span class=\"bsf-rt-display-postfix\" postfix=\"min\"><\/span><\/span> \r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t<\/div>\r\n\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t<div class=\"am_grid_col\">\r\n\t\t\t\t<div class=\"am_single_grid\">\r\n\t\t\t\t\t<div class=\"am_thumb\">\r\n\t\t\t\t\t<a href=\"https:\/\/www.exoplatform.com\/blog\/30-digital-collaboration-terms-that-you-should-know-about\/\">\r\n\t\t\t\t\t\t<img width=\"800\" height=\"533\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2020\/03\/30-digital-collaboration-terms.jpg\" class=\"attachment-full size-full wp-post-image\" alt=\"digital collaboration terms\" decoding=\"async\" loading=\"lazy\" srcset=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2020\/03\/30-digital-collaboration-terms.jpg 800w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2020\/03\/30-digital-collaboration-terms-300x200.jpg 300w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2020\/03\/30-digital-collaboration-terms-768x512.jpg 768w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2020\/03\/30-digital-collaboration-terms-710x473.jpg 710w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2020\/03\/30-digital-collaboration-terms-492x328.jpg 492w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2020\/03\/30-digital-collaboration-terms-354x236.jpg 354w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2020\/03\/30-digital-collaboration-terms-197x131.jpg 197w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2020\/03\/30-digital-collaboration-terms-100x67.jpg 100w, https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2020\/03\/30-digital-collaboration-terms-45x30.jpg 45w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t<\/a>\t\r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t\t<div class=\"am_cont\">\r\n\t\t\t\t\t\t<a href=\"https:\/\/www.exoplatform.com\/blog\/30-digital-collaboration-terms-that-you-should-know-about\/\"><h2 class=\"am__title\">30 digital collaboration terms that you should know about<\/h2><\/a>\r\n\t\t\t\t\t\t<div class=\"am__excerpt\">\r\n\t\t\t\t\t\t<a href=\"https:\/\/www.exoplatform.com\/blog\/30-digital-collaboration-terms-that-you-should-know-about\/\">30 digital collaboration terms that you should know about Enterprise software has\u2026<\/a>\r\n\t\t\t\t\t\t<\/div>\r\n\t\t\t\t\t\t<a href=\"https:\/\/www.exoplatform.com\/blog\/30-digital-collaboration-terms-that-you-should-know-about\/\" class=\"am__readmore\">Read More<\/a>\r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t\t<div class=\"post_tags\"><a href=\"https:\/\/www.exoplatform.com\/blog\/digital-workplace-en\/\" title=\"Digital workplace Tag\" class=\"digital-workplace-en\">Digital workplace<\/a> <\/div>\t\t\t\t\t<div class=\"am_time\">\r\n\t\t\t\t\t\t<span class=\"bsf-rt-reading-time\"><span class=\"bsf-rt-display-label\" prefix=\"Reading Time\">\n\t\t<\/span> <span class=\"bsf-rt-display-time\" reading_time=\"8\"><\/span> \n\t\t<span class=\"bsf-rt-display-postfix\" postfix=\"min\"><\/span><\/span> \r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t<\/div>\r\n\t\t\t\r\n\t\t\t\t<\/div>\r\n\r\n\t\t<div class=\"am_posts_navigation\">\r\n\t\t<button type='button' data-paged='1' data-next='2' class=' am-post-grid-load-more '>Voir Plus<\/button>\t\t<\/div>\r\n\r\n\t\t<\/div>\t\t    <\/div>\r\n\t    <\/div>\r\n    <\/div>\r\n\r\n\t\n\n\n\n\t\t\t\n\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-18f441a elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"18f441a\" data-element_type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-329e667\" data-id=\"329e667\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-fd934da elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"fd934da\" data-element_type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-d1cf203\" data-id=\"d1cf203\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-65966e9 elementor-widget elementor-widget-heading\" data-id=\"65966e9\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t<h6 class=\"elementor-heading-title elementor-size-default\">Leave a Reply<\/h6>\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-c82586f\" data-id=\"c82586f\" data-element_type=\"column\">\r\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\r\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2951690 elementor-widget elementor-widget-text-editor\" data-id=\"2951690\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t\t\t<p>( Your e-mail address will not be published)<\/p>\t\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<div class=\"elementor-element elementor-element-00a927c elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"00a927c\" data-element_type=\"widget\" data-widget_type=\"divider.default\">\r\n\t\t\t\t<div class=\"elementor-widget-container\">\r\n\t\t\t\t\t<div class=\"elementor-divider\">\r\n\t\t\t<span class=\"elementor-divider-separator\">\r\n\t\t\t\t\t\t<\/span>\r\n\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<\/section>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t","protected":false},"excerpt":{"rendered":"How we migrate 350+ Maven CI jobs to Pipeline as Code with Jenkins 2 and Docker! A year ago at eXo, we decided to build all our projects in Docker containers. &nbsp; In this series of articles, we will tell you our story of how we upgraded more than 350 Jenkins \u201cstandard\u201d Maven jobs to [&hellip;]","protected":false},"author":69,"featured_media":13073,"comment_status":"open","ping_status":"open","sticky":false,"template":"main1-article.php","format":"image","meta":[],"categories":[819,508],"tags":[606,769,528],"lang":"en","translations":{"en":13062},"pll_sync_post":[],"_links":{"self":[{"href":"https:\/\/www.exoplatform.com\/blog\/wp-json\/wp\/v2\/posts\/13062"}],"collection":[{"href":"https:\/\/www.exoplatform.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.exoplatform.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.exoplatform.com\/blog\/wp-json\/wp\/v2\/users\/69"}],"replies":[{"embeddable":true,"href":"https:\/\/www.exoplatform.com\/blog\/wp-json\/wp\/v2\/comments?post=13062"}],"version-history":[{"count":0,"href":"https:\/\/www.exoplatform.com\/blog\/wp-json\/wp\/v2\/posts\/13062\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.exoplatform.com\/blog\/wp-json\/wp\/v2\/media\/13073"}],"wp:attachment":[{"href":"https:\/\/www.exoplatform.com\/blog\/wp-json\/wp\/v2\/media?parent=13062"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.exoplatform.com\/blog\/wp-json\/wp\/v2\/categories?post=13062"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.exoplatform.com\/blog\/wp-json\/wp\/v2\/tags?post=13062"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}