CINXE.COM

GerritForge Blog | Git and Gerrit Code Review supported and delivered to your Enterprise

<!DOCTYPE html> <!--[if IE 6]> <html id="ie6" lang="en"> <![endif]--> <!--[if IE 7]> <html id="ie7" lang="en"> <![endif]--> <!--[if IE 8]> <html id="ie8" lang="en"> <![endif]--> <!--[if !(IE 6) & !(IE 7) & !(IE 8)]><!--> <html lang="en"> <!--<![endif]--> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width" /> <title> GerritForge Blog | Git and Gerrit Code Review supported and delivered to your Enterprise </title> <link rel="profile" href="https://gmpg.org/xfn/11" /> <link rel="stylesheet" type="text/css" media="all" href="https://s2.wp.com/wp-content/themes/pub/twentyeleven/style.css?ver=20190507" /> <link rel="pingback" href="https://gitenterprise.me/xmlrpc.php"> <!--[if lt IE 9]> <script src="https://s2.wp.com/wp-content/themes/pub/twentyeleven/js/html5.js?ver=3.7.0" type="text/javascript"></script> <![endif]--> <script type="text/javascript"> WebFontConfig = {"google":{"families":["Cabin:r:latin,latin-ext","Cabin:r,i,b,bi:latin,latin-ext"]},"api_url":"https:\/\/fonts-api.wp.com\/css"}; (function() { var wf = document.createElement('script'); wf.src = 'https://s0.wp.com/wp-content/plugins/custom-fonts/js/webfont.js'; wf.type = 'text/javascript'; wf.async = 'true'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(wf, s); })(); </script><style id="jetpack-custom-fonts-css">.wf-active #site-title{font-family:"Cabin",sans-serif;font-style:normal;font-weight:400}.wf-active #site-title a{font-size:48px;font-weight:400;font-style:normal}@media print{.wf-active #site-title a{font-size:33.6pt;font-style:normal;font-weight:400}}.wf-active blockquote, .wf-active body{font-family:"Cabin",sans-serif;font-size:130%}.wf-active body, .wf-active input, .wf-active textarea{font-size:19.5px;font-family:"Cabin",sans-serif}.wf-active blockquote{font-family:"Cabin",sans-serif}.wf-active blockquote cite{font-size:15.6px;font-family:"Cabin",sans-serif}.wf-active #site-description{font-size:18.2px}.wf-active .entry-meta{font-size:15.6px}.wf-active .gallery-caption, .wf-active .wp-caption .wp-caption-text{font-family:"Cabin",sans-serif;font-size:15.6px}.wf-active .wp-caption .wp-caption-text:before{font-size:18.2px}.wf-active #author-info{font-size:15.6px}.wf-active .entry-header .comments-link .leave-reply{font-family:"Cabin",sans-serif;font-size:33.8px}.wf-active .entry-header .entry-format{font-size:13px}.wf-active blockquote.pull{font-size:27.3px}.wf-active .format-quote blockquote{font-size:22.1px}.wf-active article.intro .entry-content{font-size:20.8px}.wf-active .widget-area{font-size:15.6px}.wf-active .widget_twitter .timesince{font-size:14.3px}.wf-active .nocomments, .wf-active .nopassword{font-size:31.2px}.wf-active .comment-meta{font-size:15.6px}.wf-active #respond .comment-form-author .required, .wf-active #respond .comment-form-email .required{font-size:28.6px}.wf-active #respond .comment-notes, .wf-active #respond .logged-in-as{font-size:16.9px}.wf-active #respond input#submit{font-size:19.5px}.wf-active #cancel-comment-reply-link{font-size:13px}.wf-active #site-generator{font-size:15.6px}@media print{.wf-active body{font-size:13pt}}@media print{.wf-active #site-description{font-size:13pt}}@media print{.wf-active .entry-meta{font-size:13pt}}.wf-active h1, .wf-active h2, .wf-active h3, .wf-active h4, .wf-active h5, .wf-active h6{font-family:"Cabin",sans-serif;font-size:160%;font-style:normal;font-weight:400}.wf-active .page-title{font-size:16px;font-weight:400;font-style:normal}.wf-active .entry-title{font-size:41.6px;font-weight:400;font-style:normal}.wf-active .comment-content h1, .wf-active .comment-content h2, .wf-active .entry-content h1, .wf-active .entry-content h2{font-weight:400;font-style:normal}.wf-active .comment-content h3, .wf-active .entry-content h3{font-size:16px;font-style:normal;font-weight:400}.wf-active #author-description h2{font-size:24px;font-weight:400;font-style:normal}.wf-active .singular .entry-title{font-size:57.6px;font-weight:400;font-style:normal}.wf-active .error404 .widgettitle{font-size:16px;font-style:normal;font-weight:400}.wf-active h1.showcase-heading{font-size:16px;font-weight:400;font-style:normal}.wf-active section.recent-posts .other-recent-posts .entry-title{font-size:27.2px;font-style:normal;font-weight:400}.wf-active .widget-title{font-size:16px;font-weight:400;font-style:normal}.wf-active .widget_twentyeleven_ephemera .widget-entry-title{font-size:24px;font-weight:400;font-style:normal}.wf-active #comments-title{font-size:16px;font-weight:400;font-style:normal}.wf-active #reply-title{font-size:38.4px;font-weight:400;font-style:normal}@media print{.wf-active .entry-title, .wf-active .singular .entry-title{font-size:33.6pt;font-style:normal;font-weight:400}}</style> <meta name='robots' content='max-image-preview:large' /> <!-- Async WordPress.com Remote Login --> <script id="wpcom_remote_login_js"> var wpcom_remote_login_extra_auth = ''; function wpcom_remote_login_remove_dom_node_id( element_id ) { var dom_node = document.getElementById( element_id ); if ( dom_node ) { dom_node.parentNode.removeChild( dom_node ); } } function wpcom_remote_login_remove_dom_node_classes( class_name ) { var dom_nodes = document.querySelectorAll( '.' + class_name ); for ( var i = 0; i < dom_nodes.length; i++ ) { dom_nodes[ i ].parentNode.removeChild( dom_nodes[ i ] ); } } function wpcom_remote_login_final_cleanup() { wpcom_remote_login_remove_dom_node_classes( "wpcom_remote_login_msg" ); wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_key" ); wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_validate" ); wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_js" ); wpcom_remote_login_remove_dom_node_id( "wpcom_request_access_iframe" ); wpcom_remote_login_remove_dom_node_id( "wpcom_request_access_styles" ); } // Watch for messages back from the remote login window.addEventListener( "message", function( e ) { if ( e.origin === "https://r-login.wordpress.com" ) { var data = {}; try { data = JSON.parse( e.data ); } catch( e ) { wpcom_remote_login_final_cleanup(); return; } if ( data.msg === 'LOGIN' ) { // Clean up the login check iframe wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_key" ); var id_regex = new RegExp( /^[0-9]+$/ ); var token_regex = new RegExp( /^.*|.*|.*$/ ); if ( token_regex.test( data.token ) && id_regex.test( data.wpcomid ) ) { // We have everything we need to ask for a login var script = document.createElement( "script" ); script.setAttribute( "id", "wpcom_remote_login_validate" ); script.src = '/remote-login.php?wpcom_remote_login=validate' + '&wpcomid=' + data.wpcomid + '&token=' + encodeURIComponent( data.token ) + '&host=' + window.location.protocol + '//' + window.location.hostname + '&postid=2836' + '&is_singular='; document.body.appendChild( script ); } return; } // Safari ITP, not logged in, so redirect if ( data.msg === 'LOGIN-REDIRECT' ) { window.location = 'https://wordpress.com/log-in?redirect_to=' + window.location.href; return; } // Safari ITP, storage access failed, remove the request if ( data.msg === 'LOGIN-REMOVE' ) { var css_zap = 'html { -webkit-transition: margin-top 1s; transition: margin-top 1s; } /* 9001 */ html { margin-top: 0 !important; } * html body { margin-top: 0 !important; } @media screen and ( max-width: 782px ) { html { margin-top: 0 !important; } * html body { margin-top: 0 !important; } }'; var style_zap = document.createElement( 'style' ); style_zap.type = 'text/css'; style_zap.appendChild( document.createTextNode( css_zap ) ); document.body.appendChild( style_zap ); var e = document.getElementById( 'wpcom_request_access_iframe' ); e.parentNode.removeChild( e ); document.cookie = 'wordpress_com_login_access=denied; path=/; max-age=31536000'; return; } // Safari ITP if ( data.msg === 'REQUEST_ACCESS' ) { console.log( 'request access: safari' ); // Check ITP iframe enable/disable knob if ( wpcom_remote_login_extra_auth !== 'safari_itp_iframe' ) { return; } // If we are in a "private window" there is no ITP. var private_window = false; try { var opendb = window.openDatabase( null, null, null, null ); } catch( e ) { private_window = true; } if ( private_window ) { console.log( 'private window' ); return; } var iframe = document.createElement( 'iframe' ); iframe.id = 'wpcom_request_access_iframe'; iframe.setAttribute( 'scrolling', 'no' ); iframe.setAttribute( 'sandbox', 'allow-storage-access-by-user-activation allow-scripts allow-same-origin allow-top-navigation-by-user-activation' ); iframe.src = 'https://r-login.wordpress.com/remote-login.php?wpcom_remote_login=request_access&origin=' + encodeURIComponent( data.origin ) + '&wpcomid=' + encodeURIComponent( data.wpcomid ); var css = 'html { -webkit-transition: margin-top 1s; transition: margin-top 1s; } /* 9001 */ html { margin-top: 46px !important; } * html body { margin-top: 46px !important; } @media screen and ( max-width: 660px ) { html { margin-top: 71px !important; } * html body { margin-top: 71px !important; } #wpcom_request_access_iframe { display: block; height: 71px !important; } } #wpcom_request_access_iframe { border: 0px; height: 46px; position: fixed; top: 0; left: 0; width: 100%; min-width: 100%; z-index: 99999; background: #23282d; } '; var style = document.createElement( 'style' ); style.type = 'text/css'; style.id = 'wpcom_request_access_styles'; style.appendChild( document.createTextNode( css ) ); document.body.appendChild( style ); document.body.appendChild( iframe ); } if ( data.msg === 'DONE' ) { wpcom_remote_login_final_cleanup(); } } }, false ); // Inject the remote login iframe after the page has had a chance to load // more critical resources window.addEventListener( "DOMContentLoaded", function( e ) { var iframe = document.createElement( "iframe" ); iframe.style.display = "none"; iframe.setAttribute( "scrolling", "no" ); iframe.setAttribute( "id", "wpcom_remote_login_key" ); iframe.src = "https://r-login.wordpress.com/remote-login.php" + "?wpcom_remote_login=key" + "&origin=aHR0cHM6Ly9naXRlbnRlcnByaXNlLm1l" + "&wpcomid=17973225" + "&time=1739874525"; document.body.appendChild( iframe ); }, false ); </script> <link rel='dns-prefetch' href='//s1.wp.com' /> <link rel='dns-prefetch' href='//s2.wp.com' /> <link rel='dns-prefetch' href='//s0.wp.com' /> <link rel="alternate" type="application/rss+xml" title="GerritForge Blog &raquo; Feed" href="https://gitenterprise.me/feed/" /> <link rel="alternate" type="application/rss+xml" title="GerritForge Blog &raquo; Comments Feed" href="https://gitenterprise.me/comments/feed/" /> <script type="text/javascript"> /* <![CDATA[ */ function addLoadEvent(func) { var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = func; } else { window.onload = function () { oldonload(); func(); } } } /* ]]> */ </script> <script type="text/javascript"> /* <![CDATA[ */ window._wpemojiSettings = {"baseUrl":"https:\/\/s0.wp.com\/wp-content\/mu-plugins\/wpcom-smileys\/twemoji\/2\/72x72\/","ext":".png","svgUrl":"https:\/\/s0.wp.com\/wp-content\/mu-plugins\/wpcom-smileys\/twemoji\/2\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/s2.wp.com\/wp-includes\/js\/wp-emoji-release.min.js?m=1719498190i&ver=6.7.2-RC1-59780"}}; /*! This file is auto-generated */ !function(i,n){var o,s,e;function c(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function p(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data),r=(e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0),new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data));return t.every(function(e,t){return e===r[t]})}function u(e,t,n){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\uddfa\ud83c\uddf3","\ud83c\uddfa\u200b\ud83c\uddf3")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!n(e,"\ud83d\udc26\u200d\u2b1b","\ud83d\udc26\u200b\u2b1b")}return!1}function f(e,t,n){var r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):i.createElement("canvas"),a=r.getContext("2d",{willReadFrequently:!0}),o=(a.textBaseline="top",a.font="600 32px Arial",{});return e.forEach(function(e){o[e]=t(a,e,n)}),o}function t(e){var t=i.createElement("script");t.src=e,t.defer=!0,i.head.appendChild(t)}"undefined"!=typeof Promise&&(o="wpEmojiSettingsSupports",s=["flag","emoji"],n.supports={everything:!0,everythingExceptFlag:!0},e=new Promise(function(e){i.addEventListener("DOMContentLoaded",e,{once:!0})}),new Promise(function(t){var n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"}),a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=function(e){c(n=e.data),a.terminate(),t(n)})}catch(e){}c(n=f(s,u,p))}t(n)}).then(function(e){for(var t in e)n.supports[t]=e[t],n.supports.everything=n.supports.everything&&n.supports[t],"flag"!==t&&(n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&n.supports[t]);n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&!n.supports.flag,n.DOMReady=!1,n.readyCallback=function(){n.DOMReady=!0}}).then(function(){return e}).then(function(){var e;n.supports.everything||(n.readyCallback(),(e=n.source||{}).concatemoji?t(e.concatemoji):e.wpemoji&&e.twemoji&&(t(e.twemoji),t(e.wpemoji)))}))}((window,document),window._wpemojiSettings); /* ]]> */ </script> <link crossorigin='anonymous' rel='stylesheet' id='all-css-0-1' href='https://s2.wp.com/wp-content/mu-plugins/jetpack-plugin/sun/modules/infinite-scroll/infinity.css?m=1685115060i&cssminify=yes' type='text/css' media='all' /> <style id='wp-emoji-styles-inline-css'> img.wp-smiley, img.emoji { display: inline !important; border: none !important; box-shadow: none !important; height: 1em !important; width: 1em !important; margin: 0 0.07em !important; vertical-align: -0.1em !important; background: none !important; padding: 0 !important; } </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-2-1' href='https://s0.wp.com/_static/??-eJyljkEOwiAQRS8knWKNdmM8C9AJUimQmaGG21vdmLhq4vLn5b18eBblchJMAiVWHxKDr9u0SH4jhLAe+67vNNga4gQ2ZvdQMVgy1IClRewc8wH+C8kdlz2hj8UwoxTz1k3LVZSnMO3+8pMgIyF5/uq35aovwzieznrQ8wtw12pJ&cssminify=yes' type='text/css' media='all' /> <style id='wp-block-library-inline-css'> .has-text-align-justify { text-align:justify; } .has-text-align-justify{text-align:justify;} </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-4-1' href='https://s2.wp.com/_static/??-eJzTLy/QzcxLzilNSS3WzyrWz01NyUxMzUnNTc0rQeEU5CRWphbp5qSmJyZX6uVm5uklFxfr6OPTDpRD5sM02efaGpoZmFkYGRuZGmQBAHPvL0Y=&cssminify=yes' type='text/css' media='all' /> <style id='jetpack-sharing-buttons-style-inline-css'> .jetpack-sharing-buttons__services-list{display:flex;flex-direction:row;flex-wrap:wrap;gap:0;list-style-type:none;margin:5px;padding:0}.jetpack-sharing-buttons__services-list.has-small-icon-size{font-size:12px}.jetpack-sharing-buttons__services-list.has-normal-icon-size{font-size:16px}.jetpack-sharing-buttons__services-list.has-large-icon-size{font-size:24px}.jetpack-sharing-buttons__services-list.has-huge-icon-size{font-size:36px}@media print{.jetpack-sharing-buttons__services-list{display:none!important}}.editor-styles-wrapper .wp-block-jetpack-sharing-buttons{gap:0;padding-inline-start:0}ul.jetpack-sharing-buttons__services-list.has-background{padding:1.25em 2.375em} </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-6-1' href='https://s2.wp.com/wp-content/plugins/coblocks/2.18.1-simple-rev.4/dist/coblocks-style.css?m=1681832297i&cssminify=yes' type='text/css' media='all' /> <style id='classic-theme-styles-inline-css'> /*! This file is auto-generated */ .wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-8-1' href='https://s1.wp.com/_static/??/wp-content/mu-plugins/core-compat/wp-mediaelement.css,/wp-content/mu-plugins/wpcom-bbpress-premium-themes.css?m=1432920480j&cssminify=yes' type='text/css' media='all' /> <style id='global-styles-inline-css'> :root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #fff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--blue: #1982d1;--wp--preset--color--dark-gray: #373737;--wp--preset--color--medium-gray: #666;--wp--preset--color--light-gray: #e2e2e2;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--font-family--albert-sans: 'Albert Sans', sans-serif;--wp--preset--font-family--alegreya: Alegreya, serif;--wp--preset--font-family--arvo: Arvo, serif;--wp--preset--font-family--bodoni-moda: 'Bodoni Moda', serif;--wp--preset--font-family--bricolage-grotesque: 'Bricolage Grotesque', sans-serif;--wp--preset--font-family--cabin: Cabin, sans-serif;--wp--preset--font-family--chivo: Chivo, sans-serif;--wp--preset--font-family--commissioner: Commissioner, sans-serif;--wp--preset--font-family--cormorant: Cormorant, serif;--wp--preset--font-family--courier-prime: 'Courier Prime', monospace;--wp--preset--font-family--crimson-pro: 'Crimson Pro', serif;--wp--preset--font-family--dm-mono: 'DM Mono', monospace;--wp--preset--font-family--dm-sans: 'DM Sans', sans-serif;--wp--preset--font-family--dm-serif-display: 'DM Serif Display', serif;--wp--preset--font-family--domine: Domine, serif;--wp--preset--font-family--eb-garamond: 'EB Garamond', serif;--wp--preset--font-family--epilogue: Epilogue, sans-serif;--wp--preset--font-family--fahkwang: Fahkwang, sans-serif;--wp--preset--font-family--figtree: Figtree, sans-serif;--wp--preset--font-family--fira-sans: 'Fira Sans', sans-serif;--wp--preset--font-family--fjalla-one: 'Fjalla One', sans-serif;--wp--preset--font-family--fraunces: Fraunces, serif;--wp--preset--font-family--gabarito: Gabarito, system-ui;--wp--preset--font-family--ibm-plex-mono: 'IBM Plex Mono', monospace;--wp--preset--font-family--ibm-plex-sans: 'IBM Plex Sans', sans-serif;--wp--preset--font-family--ibarra-real-nova: 'Ibarra Real Nova', serif;--wp--preset--font-family--instrument-serif: 'Instrument Serif', serif;--wp--preset--font-family--inter: Inter, sans-serif;--wp--preset--font-family--josefin-sans: 'Josefin Sans', sans-serif;--wp--preset--font-family--jost: Jost, sans-serif;--wp--preset--font-family--libre-baskerville: 'Libre Baskerville', serif;--wp--preset--font-family--libre-franklin: 'Libre Franklin', sans-serif;--wp--preset--font-family--literata: Literata, serif;--wp--preset--font-family--lora: Lora, serif;--wp--preset--font-family--merriweather: Merriweather, serif;--wp--preset--font-family--montserrat: Montserrat, sans-serif;--wp--preset--font-family--newsreader: Newsreader, serif;--wp--preset--font-family--noto-sans-mono: 'Noto Sans Mono', sans-serif;--wp--preset--font-family--nunito: Nunito, sans-serif;--wp--preset--font-family--open-sans: 'Open Sans', sans-serif;--wp--preset--font-family--overpass: Overpass, sans-serif;--wp--preset--font-family--pt-serif: 'PT Serif', serif;--wp--preset--font-family--petrona: Petrona, serif;--wp--preset--font-family--piazzolla: Piazzolla, serif;--wp--preset--font-family--playfair-display: 'Playfair Display', serif;--wp--preset--font-family--plus-jakarta-sans: 'Plus Jakarta Sans', sans-serif;--wp--preset--font-family--poppins: Poppins, sans-serif;--wp--preset--font-family--raleway: Raleway, sans-serif;--wp--preset--font-family--roboto: Roboto, sans-serif;--wp--preset--font-family--roboto-slab: 'Roboto Slab', serif;--wp--preset--font-family--rubik: Rubik, sans-serif;--wp--preset--font-family--rufina: Rufina, serif;--wp--preset--font-family--sora: Sora, sans-serif;--wp--preset--font-family--source-sans-3: 'Source Sans 3', sans-serif;--wp--preset--font-family--source-serif-4: 'Source Serif 4', serif;--wp--preset--font-family--space-mono: 'Space Mono', monospace;--wp--preset--font-family--syne: Syne, sans-serif;--wp--preset--font-family--texturina: Texturina, serif;--wp--preset--font-family--urbanist: Urbanist, sans-serif;--wp--preset--font-family--work-sans: 'Work Sans', sans-serif;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}.has-albert-sans-font-family{font-family: var(--wp--preset--font-family--albert-sans) !important;}.has-alegreya-font-family{font-family: var(--wp--preset--font-family--alegreya) !important;}.has-arvo-font-family{font-family: var(--wp--preset--font-family--arvo) !important;}.has-bodoni-moda-font-family{font-family: var(--wp--preset--font-family--bodoni-moda) !important;}.has-bricolage-grotesque-font-family{font-family: var(--wp--preset--font-family--bricolage-grotesque) !important;}.has-cabin-font-family{font-family: var(--wp--preset--font-family--cabin) !important;}.has-chivo-font-family{font-family: var(--wp--preset--font-family--chivo) !important;}.has-commissioner-font-family{font-family: var(--wp--preset--font-family--commissioner) !important;}.has-cormorant-font-family{font-family: var(--wp--preset--font-family--cormorant) !important;}.has-courier-prime-font-family{font-family: var(--wp--preset--font-family--courier-prime) !important;}.has-crimson-pro-font-family{font-family: var(--wp--preset--font-family--crimson-pro) !important;}.has-dm-mono-font-family{font-family: var(--wp--preset--font-family--dm-mono) !important;}.has-dm-sans-font-family{font-family: var(--wp--preset--font-family--dm-sans) !important;}.has-dm-serif-display-font-family{font-family: var(--wp--preset--font-family--dm-serif-display) !important;}.has-domine-font-family{font-family: var(--wp--preset--font-family--domine) !important;}.has-eb-garamond-font-family{font-family: var(--wp--preset--font-family--eb-garamond) !important;}.has-epilogue-font-family{font-family: var(--wp--preset--font-family--epilogue) !important;}.has-fahkwang-font-family{font-family: var(--wp--preset--font-family--fahkwang) !important;}.has-figtree-font-family{font-family: var(--wp--preset--font-family--figtree) !important;}.has-fira-sans-font-family{font-family: var(--wp--preset--font-family--fira-sans) !important;}.has-fjalla-one-font-family{font-family: var(--wp--preset--font-family--fjalla-one) !important;}.has-fraunces-font-family{font-family: var(--wp--preset--font-family--fraunces) !important;}.has-gabarito-font-family{font-family: var(--wp--preset--font-family--gabarito) !important;}.has-ibm-plex-mono-font-family{font-family: var(--wp--preset--font-family--ibm-plex-mono) !important;}.has-ibm-plex-sans-font-family{font-family: var(--wp--preset--font-family--ibm-plex-sans) !important;}.has-ibarra-real-nova-font-family{font-family: var(--wp--preset--font-family--ibarra-real-nova) !important;}.has-instrument-serif-font-family{font-family: var(--wp--preset--font-family--instrument-serif) !important;}.has-inter-font-family{font-family: var(--wp--preset--font-family--inter) !important;}.has-josefin-sans-font-family{font-family: var(--wp--preset--font-family--josefin-sans) !important;}.has-jost-font-family{font-family: var(--wp--preset--font-family--jost) !important;}.has-libre-baskerville-font-family{font-family: var(--wp--preset--font-family--libre-baskerville) !important;}.has-libre-franklin-font-family{font-family: var(--wp--preset--font-family--libre-franklin) !important;}.has-literata-font-family{font-family: var(--wp--preset--font-family--literata) !important;}.has-lora-font-family{font-family: var(--wp--preset--font-family--lora) !important;}.has-merriweather-font-family{font-family: var(--wp--preset--font-family--merriweather) !important;}.has-montserrat-font-family{font-family: var(--wp--preset--font-family--montserrat) !important;}.has-newsreader-font-family{font-family: var(--wp--preset--font-family--newsreader) !important;}.has-noto-sans-mono-font-family{font-family: var(--wp--preset--font-family--noto-sans-mono) !important;}.has-nunito-font-family{font-family: var(--wp--preset--font-family--nunito) !important;}.has-open-sans-font-family{font-family: var(--wp--preset--font-family--open-sans) !important;}.has-overpass-font-family{font-family: var(--wp--preset--font-family--overpass) !important;}.has-pt-serif-font-family{font-family: var(--wp--preset--font-family--pt-serif) !important;}.has-petrona-font-family{font-family: var(--wp--preset--font-family--petrona) !important;}.has-piazzolla-font-family{font-family: var(--wp--preset--font-family--piazzolla) !important;}.has-playfair-display-font-family{font-family: var(--wp--preset--font-family--playfair-display) !important;}.has-plus-jakarta-sans-font-family{font-family: var(--wp--preset--font-family--plus-jakarta-sans) !important;}.has-poppins-font-family{font-family: var(--wp--preset--font-family--poppins) !important;}.has-raleway-font-family{font-family: var(--wp--preset--font-family--raleway) !important;}.has-roboto-font-family{font-family: var(--wp--preset--font-family--roboto) !important;}.has-roboto-slab-font-family{font-family: var(--wp--preset--font-family--roboto-slab) !important;}.has-rubik-font-family{font-family: var(--wp--preset--font-family--rubik) !important;}.has-rufina-font-family{font-family: var(--wp--preset--font-family--rufina) !important;}.has-sora-font-family{font-family: var(--wp--preset--font-family--sora) !important;}.has-source-sans-3-font-family{font-family: var(--wp--preset--font-family--source-sans-3) !important;}.has-source-serif-4-font-family{font-family: var(--wp--preset--font-family--source-serif-4) !important;}.has-space-mono-font-family{font-family: var(--wp--preset--font-family--space-mono) !important;}.has-syne-font-family{font-family: var(--wp--preset--font-family--syne) !important;}.has-texturina-font-family{font-family: var(--wp--preset--font-family--texturina) !important;}.has-urbanist-font-family{font-family: var(--wp--preset--font-family--urbanist) !important;}.has-work-sans-font-family{font-family: var(--wp--preset--font-family--work-sans) !important;} :where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;} :root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;} :where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;} </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-10-1' href='https://s1.wp.com/_static/??/wp-content/themes/pub/twentyeleven/blocks.css,/wp-content/themes/pub/twentyeleven/style-wpcom.css?m=1622849015j&cssminify=yes' type='text/css' media='all' /> <style id='akismet-widget-style-inline-css'> .a-stats { --akismet-color-mid-green: #357b49; --akismet-color-white: #fff; --akismet-color-light-grey: #f6f7f7; max-width: 350px; width: auto; } .a-stats * { all: unset; box-sizing: border-box; } .a-stats strong { font-weight: 600; } .a-stats a.a-stats__link, .a-stats a.a-stats__link:visited, .a-stats a.a-stats__link:active { background: var(--akismet-color-mid-green); border: none; box-shadow: none; border-radius: 8px; color: var(--akismet-color-white); cursor: pointer; display: block; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen-Sans', 'Ubuntu', 'Cantarell', 'Helvetica Neue', sans-serif; font-weight: 500; padding: 12px; text-align: center; text-decoration: none; transition: all 0.2s ease; } /* Extra specificity to deal with TwentyTwentyOne focus style */ .widget .a-stats a.a-stats__link:focus { background: var(--akismet-color-mid-green); color: var(--akismet-color-white); text-decoration: none; } .a-stats a.a-stats__link:hover { filter: brightness(110%); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06), 0 0 2px rgba(0, 0, 0, 0.16); } .a-stats .count { color: var(--akismet-color-white); display: block; font-size: 1.5em; line-height: 1.4; padding: 0 13px; white-space: nowrap; } </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-12-1' href='https://s2.wp.com/_static/??-eJx9jEEOwjAMBD9EcHNoxQXxlhDc4OLYUeNQ8XuCxAEkxG1npRnYiosqhmKQmyvcEkmFFc+sqc8EsX7ivuMOfksJ1bHGYKTyBW7mQOs/dUErId7eDLUJZL00xgokMwkZuhpXZQa7Yu63bT3xQMY7yqt8ykc/HUbvx2EalieHg1CG&cssminify=yes' type='text/css' media='all' /> <style id='jetpack-global-styles-frontend-style-inline-css'> :root { --font-headings: unset; --font-base: unset; --font-headings-default: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif; --font-base-default: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;} </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-14-1' href='https://s2.wp.com/wp-content/themes/h4/global.css?m=1420737423i&cssminify=yes' type='text/css' media='all' /> <script type="text/javascript" id="wpcom-actionbar-placeholder-js-extra"> /* <![CDATA[ */ var actionbardata = {"siteID":"17973225","postID":"0","siteURL":"https:\/\/gitenterprise.me","xhrURL":"https:\/\/gitenterprise.me\/wp-admin\/admin-ajax.php","nonce":"d08fda9c36","isLoggedIn":"","statusMessage":"","subsEmailDefault":"instantly","proxyScriptUrl":"https:\/\/s0.wp.com\/wp-content\/js\/wpcom-proxy-request.js?ver=20211021","i18n":{"followedText":"New posts from this site will now appear in your <a href=\"https:\/\/wordpress.com\/reader\">Reader<\/a>","foldBar":"Collapse this bar","unfoldBar":"Expand this bar","shortLinkCopied":"Shortlink copied to clipboard."}}; /* ]]> */ </script> <script type="text/javascript" id="jetpack-mu-wpcom-settings-js-before"> /* <![CDATA[ */ var JETPACK_MU_WPCOM_SETTINGS = {"assetsUrl":"https:\/\/s1.wp.com\/wp-content\/mu-plugins\/jetpack-mu-wpcom-plugin\/sun\/jetpack_vendor\/automattic\/jetpack-mu-wpcom\/src\/build\/"}; /* ]]> */ </script> <script crossorigin='anonymous' type='text/javascript' src='https://s1.wp.com/wp-content/js/rlt-proxy.js?m=1720530689i'></script> <script type="text/javascript" id="rlt-proxy-js-after"> /* <![CDATA[ */ rltInitialize( {"token":null,"iframeOrigins":["https:\/\/widgets.wp.com"]} ); /* ]]> */ </script> <link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://gitenterprise.wordpress.com/xmlrpc.php?rsd" /> <meta name="generator" content="WordPress.com" /> <link rel='shortlink' href='https://wp.me/1dpEJ' /> <!-- Jetpack Open Graph Tags --> <meta property="og:type" content="website" /> <meta property="og:title" content="GerritForge Blog" /> <meta property="og:description" content="Git and Gerrit Code Review supported and delivered to your Enterprise" /> <meta property="og:url" content="https://gitenterprise.me/" /> <meta property="og:site_name" content="GerritForge Blog" /> <meta property="og:image" content="https://secure.gravatar.com/blavatar/eed96af042594364b60c41a0d2e7491f1f820da3cb34dde769ea4ebc2f758cc7?s=200&#038;ts=1739874525" /> <meta property="og:image:width" content="200" /> <meta property="og:image:height" content="200" /> <meta property="og:image:alt" content="" /> <meta property="og:locale" content="en_US" /> <!-- End Jetpack Open Graph Tags --> <link rel="shortcut icon" type="image/x-icon" href="https://secure.gravatar.com/blavatar/eed96af042594364b60c41a0d2e7491f1f820da3cb34dde769ea4ebc2f758cc7?s=32" sizes="16x16" /> <link rel="icon" type="image/x-icon" href="https://secure.gravatar.com/blavatar/eed96af042594364b60c41a0d2e7491f1f820da3cb34dde769ea4ebc2f758cc7?s=32" sizes="16x16" /> <link rel="apple-touch-icon" href="https://secure.gravatar.com/blavatar/eed96af042594364b60c41a0d2e7491f1f820da3cb34dde769ea4ebc2f758cc7?s=114" /> <link rel='openid.server' href='https://gitenterprise.me/?openidserver=1' /> <link rel='openid.delegate' href='https://gitenterprise.me/' /> <link rel="search" type="application/opensearchdescription+xml" href="https://gitenterprise.me/osd.xml" title="GerritForge Blog" /> <link rel="search" type="application/opensearchdescription+xml" href="https://s1.wp.com/opensearch.xml" title="WordPress.com" /> <meta name="theme-color" content="#e2e2e2" /> <style type="text/css">.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}</style> <style type="text/css"> .recentcomments a { display: inline !important; padding: 0 !important; margin: 0 !important; } table.recentcommentsavatartop img.avatar, table.recentcommentsavatarend img.avatar { border: 0px; margin: 0; } table.recentcommentsavatartop a, table.recentcommentsavatarend a { border: 0px !important; background-color: transparent !important; } td.recentcommentsavatarend, td.recentcommentsavatartop { padding: 0px 0px 1px 0px; margin: 0px; } td.recentcommentstextend { border: none !important; padding: 0px 0px 2px 10px; } .rtl td.recentcommentstextend { padding: 0px 10px 2px 0px; } td.recentcommentstexttop { border: none; padding: 0px 0px 0px 10px; } .rtl td.recentcommentstexttop { padding: 0px 10px 0px 0px; } </style> <meta name="description" content="Git and Gerrit Code Review supported and delivered to your Enterprise" /> <style type="text/css" id="twentyeleven-header-css"> #site-title a, #site-description { color: #5e5e5e; } </style> <link rel="stylesheet" id="custom-css-css" type="text/css" href="https://s2.wp.com/?custom-css=1&#038;csblog=1dpEJ&#038;cscache=6&#038;csrev=14" /> </head> <body class="home blog wp-embed-responsive customizer-styles-applied two-column right-sidebar jetpack-reblog-enabled"> <div class="skip-link"><a class="assistive-text" href="#content">Skip to primary content</a></div><div class="skip-link"><a class="assistive-text" href="#secondary">Skip to secondary content</a></div><div id="page" class="hfeed"> <header id="branding"> <hgroup> <h1 id="site-title"><span><a href="https://gitenterprise.me/" rel="home">GerritForge Blog</a></span></h1> <h2 id="site-description">Git and Gerrit Code Review supported and delivered to your Enterprise</h2> </hgroup> <a href="https://gitenterprise.me/"> <img src="https://gitenterprise.me/wp-content/uploads/2023/11/cropped-gerritmeets.banner.blog2_.jpg" width="1000" height="287" alt="GerritForge Blog" /> </a> <form method="get" id="searchform" action="https://gitenterprise.me/"> <label for="s" class="assistive-text">Search</label> <input type="text" class="field" name="s" id="s" placeholder="Search" /> <input type="submit" class="submit" name="submit" id="searchsubmit" value="Search" /> </form> <nav id="access"> <h3 class="assistive-text">Main menu</h3> <div class="menu-products-container"><ul id="menu-products" class="menu"><li id="menu-item-2378" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-2378"><a href="https://www.meetup.com/gerritmeets/">Gerrit Meets</a></li> <li id="menu-item-21" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-21"><a href="https://www.gerritforge.com">Home</a></li> <li id="menu-item-18" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-18"><a href="https://www.gerritforge.com/pricing.html">Pricing</a></li> <li id="menu-item-22" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-22"><a href="https://www.gerritforge.com/support.html">Support</a></li> <li id="menu-item-25" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25"><a href="#">Blog</a></li> <li id="menu-item-26" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-26"><a href="https://www.gerritforge.com/events.html">News &amp; Events</a></li> <li id="menu-item-27" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-27"><a href="https://www.gerritforge.com/contact.html">Contact</a></li> </ul></div> </nav><!-- #access --> </header><!-- #branding --> <div id="main"> <div id="primary"> <div id="content" role="main"> <nav id="nav-above"> <h3 class="assistive-text">Post navigation</h3> <div class="nav-previous"><a href="https://gitenterprise.me/page/2/" ><span class="meta-nav">&larr;</span> Older posts</a></div> <div class="nav-next"></div> </nav><!-- #nav-above --> <article id="post-2836" class="post-2836 post type-post status-publish format-standard has-post-thumbnail hentry category-uncategorized"> <header class="entry-header"> <h1 class="entry-title"><a href="https://gitenterprise.me/2025/02/04/gerrit-acls-the-most-powerful-of-any-git-server-yet/" rel="bookmark">Gerrit ACLs: The most powerful of any Git server&nbsp;yet?</a></h1> <div class="entry-meta"> <span class="sep">Posted on </span><a href="https://gitenterprise.me/2025/02/04/gerrit-acls-the-most-powerful-of-any-git-server-yet/" title="5:11 pm" rel="bookmark"><time class="entry-date" datetime="2025-02-04T17:11:41+00:00">February 4, 2025</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://gitenterprise.me/author/dani469816031f4/" title="View all posts by Daniele Sassoli" rel="author">Daniele Sassoli</a></span></span> </div><!-- .entry-meta --> <div class="comments-link"> <a href="https://gitenterprise.me/2025/02/04/gerrit-acls-the-most-powerful-of-any-git-server-yet/#respond"><span class="leave-reply">Reply</span></a> </div> </header><!-- .entry-header --> <div class="entry-content"> <p id="3894"></p> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2025/02/gerrit-code-review-access-control.png"><img data-attachment-id="2842" data-permalink="https://gitenterprise.me/2025/02/04/gerrit-acls-the-most-powerful-of-any-git-server-yet/gerrit-code-review-access-control/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2025/02/gerrit-code-review-access-control.png" data-orig-size="1920,1080" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="gerrit-code-review-access-control" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2025/02/gerrit-code-review-access-control.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2025/02/gerrit-code-review-access-control.png?w=584" width="1024" height="576" src="https://gitenterprise.me/wp-content/uploads/2025/02/gerrit-code-review-access-control.png?w=1024" alt="" class="wp-image-2842" /></a></figure> <p id="3894"><br>(TL;DR) <a href="https://gerritcodereview.com">Gerrit Code Review</a> offers extensive configuration options that allow <strong>organizations to finely control access rights</strong> while ensuring <strong>auditability through versioned changes in Git</strong>. It supports hierarchical <strong>project inheritance</strong>, enabling structured, scalable permission management. This allows companies to define base rules centrally, which child projects can inherit and customize.</p> <p>Its key features include granular Access Control Lists (ACLs), where <strong>permissions can be set at various levels, even down to individual refs (branches)</strong>. Submit Requirements provide highly customizable rules for determining whether a change is mergeable, while ref-specific permissions allow precise access policies for different branches. Auditability is a significant advantage, as all permission changes are tracked as Git commits, making compliance easy in regulated environments.</p> <p id="3894">Gerrit’s flexibility makes it a top choice for enterprises in security-sensitive and highly regulated industries.</p> <hr class="wp-block-separator has-alpha-channel-opacity" /> <p id="3894">One thing you notice immediately when you start working with/managing Gerrit is the incredible amount of configuration options that allow you to really tailor the installation to your needs.</p> <p id="06e5">This theme pervades all of Gerrit, and the Access Control List (ACL) setup is no exception. Gerrit allows organizations to be extremely fine-grained when granting users access to the code base.</p> <p id="c99d">Not only you have an unparalleled level of control over your access rights set-up, but&nbsp;<strong>it is also as auditable as it gets, as each and every change done to the system is automatically versioned via Git .</strong></p> <p id="4656">This is one of the major reasons why big organizations, or organizations in highly regulated fields, find so much success with Gerrit, other tools simply don’t provide the flexibility and auditability that Gerrit does.</p> <blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"> <p id="127e">In a world that is becoming increasingly regulated, it is essential to easily comply with auditors&#8217; requirements, and no tool does this quite as well as Gerrit.</p> </blockquote> <h2 class="wp-block-heading" id="9fd6"><strong>So, what’s the fuss all about?</strong></h2> <p id="ce5b">Well, let’s go in order. Firstly, you should know that&nbsp;<strong>Gerrit allows you to have a hierarchy of projects.</strong>&nbsp;By default, when you create a new setup, there will always be two projects:&nbsp;<code>All-Users</code>&nbsp;and&nbsp;<code>All-Projects</code>. To briefly sum up the former, it will contain all the information related to the users of the system. Each new user creation or modification will be tracked in this Git repository, making it extremely auditable.</p> <p id="d587">However, it’s&nbsp;<code>All-Projects</code>where all the fun happens. You can look at&nbsp;<code>All-Projects</code>&nbsp;as the father of all other repositories you’ll create, as, by default, all new repositories inherit their access rights from this one.</p> <h1 class="wp-block-heading" id="eb45">ACL Project Inheritance</h1> <p id="25b0">Yes, you read that right,&nbsp;<strong>access rights can be inherited across repositories</strong>. This is extremely powerful as it allows you to have “hollow” projects that are nothing more than organizational templates for security or compliance structures that then each project can extend.</p> <p id="a886">For example, say that your organization is split in two, loosly coupled, main divisions. They might want to share very basic rules, i.e. all changes need to be tested before merging, but other than that, they are very much independent and have separate audit requirements or security concerns.</p> <p id="00f8"><em>With Gerrit, they can define the basic rules in All-Projects and then have “hollow” child projects that inherit these rules and further customize them.</em></p> <p id="da06">For example, let’s create two repositories, one per area of the company, they’ll be called&nbsp;<code>SuperSecretProjects</code>&nbsp;and&nbsp;<code>PublicProjects</code>. These projects might never have any code committed to them; they are “just” a shell for different ACLs to reflect how that part of the company works. Each new project can then inherit from them and will have the correct access rights setup without the need to do anything else.</p> <p id="6d36">Long gone are the days of one of your teams getting the set-up wrong and wreaking havoc further down the line or auditors having to bother teams individually to get access to their set-up. This can all be managed centrally, while still allowing teams to do the customizations they require.</p> <h1 class="wp-block-heading" id="4d1b">But how fine-grained are we talking?</h1> <p id="f7f5">Well, let’s examine how to configure new ACLs and the options you have.</p> <figure class="wp-block-image"><img src="https://gitenterprise.me/wp-content/uploads/2025/02/df3a4-1tzxkzqwbqvvze4s0nphodg.png" alt="" /></figure> <p id="a755">This is what a classic Gerrit project access page looks like. You can see that this project, as every project by default, inherits its rights from&nbsp;<code>All-Projects</code>. However, you can then extend its permissions as required. In this case, we’re specifying that&nbsp;<code>Java Developer</code>&nbsp;and&nbsp;<code>Bazel Expert</code>can express deep dislike towards a change (<code>-2</code>) or a moderate approval (<code>+1</code>) by providing a vote on the&nbsp;<code>Code-Review</code>&nbsp;label, however only the principal engineer will be able to vote with the full range of votes applicable for this label.</p> <p id="d25b">Further more, we restrict&nbsp;<code>read</code>&nbsp;access to&nbsp;<code>super-secret-branch</code>&nbsp;to just the principal engineer. This essentially restricts who can view this secret branch, to the point that if any other user will try to&nbsp;<code>git clone</code>&nbsp;this repository, it will not clone this branch(or branches related to this name space).&nbsp;<strong>This is an incredibly powerful feature that, as far as I know, is unique to Gerrit.</strong></p> <p id="1976">You’ll notice that I’m keeping a very generic language, others might refer to being able to vote with&nbsp;<code>Code-Review +2</code>&nbsp;on a change as “being able to approve it”, however, this is not strictly true, it all depends on how we define the submittability(aka whether a change is mergeable or not) of the change for the project in question. To explain this further, I’ll need to take you on a small detour.</p> <h2 class="wp-block-heading" id="6d02"><strong>Submit Requirements</strong></h2> <p id="7b4b">You’ve guessed it, even the definition of what makes a change good enough to be submitted is extremely configurable thanks to a concept called&nbsp;<code>Submit Requirements</code>. These can be defined in&nbsp;<code>All-Projects</code>&nbsp;or at lower levels in your project hierarchy if you wish to do so. Interestingly, you can also specify which submit requirements can can be altered by each team and which ones need to be enforced company wide.</p> <blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"> <p id="6189">Submit requirements are a way of decoupling the defintion of submittability of a change from the labels that users can vote on. Labels alone have a purely informational role, but couple them with submit requirements and you get an extremely flexible framework customizable to any requirement.</p> </blockquote> <p id="25cb">These&nbsp;<code>Submit Requirements</code>&nbsp;are defined in&nbsp;<code>project.config</code>&nbsp;and read something like so:</p> <pre class="wp-block-preformatted">[submit-requirement "Code-Review-Required"]<br> description = At least one maximum vote for label 'Code-Review' is required<br> applicableIf = -branch:refs/meta/config<br> submittableIf = label:Code-Review=MAX,user=non_uploader AND -label:Code-Review=MIN<br> overridableIf = uploader:MyTrustedUser<br> canOverrideInChildProjects = true</pre> <p id="52ef">This is quite intuitive language, but let’s briefly go over it:</p> <p id="1ce1">Looking at the&nbsp;<code>submittableIf</code>&nbsp;part of the definition, we can see how this will ensure that changes will only become submittable only if there is at least one vote for the label&nbsp;<code>Code-Review</code>&nbsp;with the highest scored configured for that label that doesn’t come from the user that uploaded the change initially. There should also be no vote with the minimum value by anyone.</p> <p id="bcf1">However, this requirement can be&nbsp;<code>overriden</code>&nbsp;if, for example, I have a specific user, like an AIBot or a Ci/Cd system, that I’m happy to always trust.</p> <p id="d99e">Finally, if there are specific branches that I’d like to exclude, I can do that too by setting the&nbsp;<code>applicableIf</code>&nbsp;clause.</p> <p id="ea74"><em>This is just an example</em>. The real strength here is that in either of the applicableIf, submittableIf , and overridableIf clauses, you can use any of the expression<strong> operators available for </strong><a href="https://gerrit-review.googlesource.com/Documentation/user-search.html" target="_blank" rel="noreferrer noopener"><strong>searching changes</strong></a><strong> and more.</strong></p> <p id="7c27">Overrall, an incredibly powerful tool if you ask me.</p> <p id="c940">But enough of this now, what about specifying different permission, like push/pull or deletion of branches?</p> <h1 class="wp-block-heading" id="cbe5"><strong>Ref specific permissions</strong></h1> <p id="3ea1">Everything we do in Gerrit applies to a&nbsp;<code>ref namespace</code>.</p> <p id="5cd2">If you don’t know what a ref is you can think of it somewhat like a branch. Branches, strictly speaking, are refs that are under the namespace&nbsp;<code>refs/heads</code>&nbsp;, so, for example, what you refer too as&nbsp;<code>master</code>&nbsp;really is stored in&nbsp;<code>refs/heads/master</code>&nbsp;.</p> <figure class="wp-block-image"><img src="https://gitenterprise.me/wp-content/uploads/2025/02/0d363-1ei8mf9u2xbnl5xsyskpvyg.png" alt="" /></figure> <p id="9bee">Hopefully, this helps you understand the image above. When we refer to&nbsp;<code>Reference: refs/*</code>&nbsp;, we’re telling Gerrit to apply the following permission to every ref in the repository.</p> <p id="4489">Let that sink in,&nbsp;<strong>Gerrit allows you specify different permissions for each ref in your repository.</strong></p> <p id="02f5">Say for example that you want to provide developers with their own sandbox branch where they can go off and test whatever they want. You could provide everyone the&nbsp;<code>create</code>&nbsp;permission in the&nbsp;<code>refs/sandbox</code>&nbsp;namespace and off you go! You could then change your submit requirements so that they aren’t&nbsp;<code>applicable if</code>&nbsp;the target branch starts with&nbsp;<code>refs/sandbox</code>, effectively providing each developer with their own environment to test anything they want.</p> <h1 class="wp-block-heading" id="0003"><strong>But what permissions can I set on these refs?</strong></h1> <p id="e10a">That’s a great question. Really there’s very little limit to the workflows you can achieve with Gerrit. For instance, you can add whatever labels you want, and configure whatever values with whatever description you want.</p> <p id="cd51">For instance, say we want to add a&nbsp;<code>Verified</code>&nbsp;label, we’d edit the necessary project.config like so:</p> <pre class="wp-block-preformatted">[label "Verified"]<br> function = NoBlock<br> defaultValue = 0<br> value = -1 Fails<br> value = 0 No score<br> value = +1 Verified<br> copyCondition = changekind:NO_CHANGE OR changekind:NO_CODE_CHANGE</pre> <p id="bab3">You can then grant users, or groups, specific permissions on specific branches, like below, where I’m allowing the&nbsp;<code>Administrators</code>&nbsp;group to vote with either&nbsp;<code>-1</code>&nbsp;and&nbsp;<code>+1</code>&nbsp;on all&nbsp;<code>refs/heads</code>&nbsp;branched.</p> <figure class="wp-block-image"><img src="https://gitenterprise.me/wp-content/uploads/2025/02/38376-1wpm1uqnvchzvhwni1le_pw.png" alt="" /></figure> <p id="a160">Effectively giving you all the flexibility you could possibly want.</p> <p id="ebc4">Gerrit, out of the box, allows you to assign permissions like</p> <ul class="wp-block-list"> <li>Delete changes</li> <li>Push (force or not)</li> <li>Submit</li> <li>And many, many more…</li> </ul> <p id="9ea1">You can find a complete list [here](<a href="https://gerrit-review.googlesource.com/Documentation/access-control.html" rel="noreferrer noopener" target="_blank">https://gerrit-review.googlesource.com/Documentation/access-control.html</a>)</p> <h1 class="wp-block-heading" id="2dbe">But what about auditability?</h1> <p id="11e9">That’s the most beautiful part of it all: Gerrit is not only extremely flexible,&nbsp;<strong><em>any changes you make to its permission model are “just” code changes, which can be reviewed like any other change and are even versioned like any other code change in a Git repository.<br></em></strong>If we scroll to the top of the access page, we see the&nbsp;<code>History: browse</code>&nbsp;link</p> <figure class="wp-block-image"><img src="https://gitenterprise.me/wp-content/uploads/2025/02/26a37-17pih6_sxqho75v8jtd6vdq.png" alt="" /></figure> <p id="7d1a">This will bring you to your default code browser where you can see the git log of the&nbsp;<code>All-Projects</code>&nbsp;repo</p> <figure class="wp-block-image"><img src="https://gitenterprise.me/wp-content/uploads/2025/02/e012b-1okqhaciybgmtbfeaahzbpq.png" alt="" /></figure> <p id="bda8">We can see how the configuration of a new label and providing users with the capability to use it have been recorded with 2 separate commits. Each one of these commits would have been reviewed prior to being merged, that too with configurable ACLs. Which also means that the diff can be easily inspected to easily understand what each changed entailed.</p> <p id="c30a">This is unlike any tool I know of and it’s incredibily useful when it comes to analysing what the state of the permissions was when a change was merged if investigating it months if not years after the fact and ensuring that all requirements at the time where met.</p> <h1 class="wp-block-heading" id="7c19">To recap</h1> <p id="e816">Gerrit gives you best-in-class auditability and workflow customization capabilities that provide unparalleled power to fine-tune approval workflows to your company’s needs.</p> <p id="351e">The hierarchical inheritance model is a game-changer when it comes to enabling teams to move quickly while still ensuring all crucial business rules are always enforced.</p> <p id="3ad3">It’s these capabilities that make Gerrit the ideal choice for enterprises in highly regulated industries, where security, governance and scalability are crucial for success.</p> <hr class="wp-block-separator has-alpha-channel-opacity" /> <p><strong><em>Daniele Sassoli<br></em></strong><em>GerritForge Inc. &#8211; Engineering Manager<br>Gerrit Code Review Community Manager<br>Gerrit Code Review Contributor</em></p> </div><!-- .entry-content --> <footer class="entry-meta"> <span class="cat-links"> <span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://gitenterprise.me/category/uncategorized/" rel="category tag">Uncategorized</a> </span> <span class="sep"> | </span> <span class="comments-link"><a href="https://gitenterprise.me/2025/02/04/gerrit-acls-the-most-powerful-of-any-git-server-yet/#respond"><span class="leave-reply">Leave a reply</span></a></span> </footer><!-- .entry-meta --> </article><!-- #post-2836 --> <article id="post-2826" class="post-2826 post type-post status-publish format-standard hentry category-gerrit category-gerritmeets category-git category-jgit category-kubernetes tag-code-review tag-devops tag-gerrit tag-gerrit-code-review tag-git tag-github tag-linux tag-meetup tag-programming"> <header class="entry-header"> <h1 class="entry-title"><a href="https://gitenterprise.me/2025/01/30/gerrit-code-review-project-future-in-2025-and-beyond-at-gerritmeets/" rel="bookmark">Gerrit Code Review future in 2025 and&nbsp;beyond</a></h1> <div class="entry-meta"> <span class="sep">Posted on </span><a href="https://gitenterprise.me/2025/01/30/gerrit-code-review-project-future-in-2025-and-beyond-at-gerritmeets/" title="12:23 pm" rel="bookmark"><time class="entry-date" datetime="2025-01-30T12:23:25+00:00">January 30, 2025</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://gitenterprise.me/author/gitenterprise/" title="View all posts by Git and Gerrit Code Review for the Enterprise" rel="author">Git and Gerrit Code Review for the Enterprise</a></span></span> </div><!-- .entry-meta --> <div class="comments-link"> <a href="https://gitenterprise.me/2025/01/30/gerrit-code-review-project-future-in-2025-and-beyond-at-gerritmeets/#respond"><span class="leave-reply">Reply</span></a> </div> </header><!-- .entry-header --> <div class="entry-content"> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2025/01/future-of-gerrit.jpg"><img data-attachment-id="2829" data-permalink="https://gitenterprise.me/2025/01/30/gerrit-code-review-project-future-in-2025-and-beyond-at-gerritmeets/future-of-gerrit/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2025/01/future-of-gerrit.jpg" data-orig-size="1920,1080" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="future-of-gerrit" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2025/01/future-of-gerrit.jpg?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2025/01/future-of-gerrit.jpg?w=584" width="1024" height="576" src="https://gitenterprise.me/wp-content/uploads/2025/01/future-of-gerrit.jpg?w=1024" alt="" class="wp-image-2829" /></a></figure> <h2 class="wp-block-heading"> </h2> <p><strong>(TL;DR) </strong>The <a href="https://gerritcodereview.com">Gerrit Code Review project</a> has an <a href="https://www.gerritcodereview.com/roadmap.html">ambitious roadmap for 2025</a> and beyond. <strong>Gerrit 3.12</strong> (H1 2025) will focus on <strong>JGit performance improvements</strong>, <strong>X.509 signed commit support</strong>, and <strong>enhanced Owners and Analytics plugins</strong>. <strong>Gerrit 3.13</strong> (H2 2025) aims to further optimize <strong>push performance, UI usability, and plugin updates</strong>, including <strong>Kafka and Zookeeper integrations</strong>.</p> <p>The <strong>k8s-Gerrit</strong> initiative will improve Gerrit&#8217;s deployment on Kubernetes, ensuring better scalability and resilience. Looking ahead, <strong>Gerrit 4.0 (2026/2027)</strong> plans to <strong>decouple the review UI from the JGit server</strong>, enabling alternative review interfaces and improved flexibility.</p> <p>The <a href="https://www.meetup.com/gerritmeets/events/305718795/">February 2025 GerritMeets in Sunnyvale CA on the 19th of February 2025</a> will be all about roadmap and Q&amp;A on what we would like to see coming in Gerrit. See below more details about Gerrit Code Review in 2025 and the future ahead.</p> <h2 class="wp-block-heading">Gerrit 3.12 (Target: H1 2025)</h2> <h3 class="wp-block-heading"><em>JGit Performance Improvements</em></h3> <p>The development team is prioritizing significant performance enhancements in JGit, the Java implementation of Git used by Gerrit. Key objectives include:</p> <ul class="wp-block-list"> <li><strong>Speeding Up Conflicting Ref Names on Push:</strong> This aims to reduce delays during push operations when ref name conflicts occur.</li> <li><strong>Enhancing SearchForReuse Latency for Large Monorepos:</strong> The goal is to improve latency by at least an order of magnitude, facilitating more efficient operations in extensive monorepositories.</li> <li><strong>Improving Object Lookup Across Multiple Packfiles:</strong> Efforts are underway to accelerate object lookup times by at least tenfold, enhancing performance in repositories with numerous packfiles.</li> <li><strong>Parallelizing Bitmap Generation:</strong> By enabling bitmap generation across multiple cores, the team aims to expedite this process, contributing to overall performance gains.</li> </ul> <h3 class="wp-block-heading"><em>Gerrit Core Experience Enhancements</em></h3> <p>A notable feature planned for this release is the support for X.509 signed commits, which will bolster security and authenticity in the code review process.</p> <p><em>Owners Plugin Improvements</em></p> <p>Enhancements to the Owners Plugin are set to provide clearer insights and streamlined interactions:</p> <ul class="wp-block-list"> <li><strong>Action Requirements Display:</strong> Explicitly showing required actions by each owner at the file level.</li> <li><strong>Detailed Pending Reviews:</strong> Offering more comprehensive information on pending reviews by owners.</li> <li><strong>Easier Contact with File Owners:</strong> Facilitating more straightforward communication with file owners.</li> </ul> <h3 class="wp-block-heading"><em>Analytics Plugin Optimization</em></h3> <p>The analytics plugin is slated for improvements to enhance speed and usability:</p> <ul class="wp-block-list"> <li><strong>Repo Manifest Discovery:</strong> Native support for discovering repository manifests.</li> <li><strong>Faster Metrics Extraction:</strong> Accelerated extraction of metrics for branches, aiding in quicker data analysis.</li> </ul> <h2 class="wp-block-heading"><strong>Gerrit 3.13 (Target: H2 2025)</strong></h2> <h3 class="wp-block-heading"><em>JGit Performance and Concurrency Enhancements</em></h3> <p>Building upon previous improvements, version 3.13 aims to further optimize performance:</p> <ul class="wp-block-list"> <li><strong>Optional Connectivity and Collision Checks:</strong> Improving push performance by allowing the skipping of certain checks when appropriate.</li> <li><strong>Customizable Lock-Interval Retries:</strong> Providing flexibility in managing lock intervals to enhance concurrency handling.</li> <li><strong>Read-Only Multi-Pack Index Support:</strong> Introducing support for read-only multi-pack indexes to improve repository access efficiency.</li> </ul> <h3 class="wp-block-heading"><em>Gerrit Core and UI Experience Enhancements</em></h3> <p>User experience remains a focal point with planned features such as:</p> <ul class="wp-block-list"> <li><strong>File List Filtering:</strong> Allowing users to filter the file list in the change review screen for more efficient navigation.</li> <li><strong>Headless Gerrit Packaging:</strong> Offering a version of Gerrit that serves only read/write Git protocols, catering to users seeking a streamlined experience.</li> </ul> <h3 class="wp-block-heading"><em>Plugin Updates</em></h3> <p>The roadmap includes updates to key plugins:</p> <ul class="wp-block-list"> <li><strong>Kafka Events-Broker:</strong> Upgrading to support Kafka 3.9.0, enhancing event handling capabilities.</li> <li><strong>Zookeeper Global-Refdb:</strong> Updating to support Zookeeper 3.9.3, improving global reference database management.</li> </ul> <h3 class="wp-block-heading"><em>Replication Plugin Enhancements</em></h3> <p>Efforts to simplify configuration and improve performance include:</p> <ul class="wp-block-list"> <li><strong>Dynamic Endpoint Management:</strong> Introducing APIs for creating and updating replication endpoints dynamically.</li> <li><strong>UI Integration:</strong> Displaying replication status within the user interface for better visibility.</li> <li><strong>Reduced Latency on Force-Push:</strong> Improving replication latency during force-push operations by applying objects with prerequisites.</li> </ul> <h2 class="wp-block-heading"><strong>k8s-Gerrit</strong></h2> <p>The k8s-Gerrit initiative focuses on deploying Gerrit within Kubernetes environments, aiming to enhance scalability, resilience, and ease of management. This approach leverages Kubernetes&#8217; orchestration capabilities to provide automated deployment, scaling, and management of Gerrit instances, facilitating more efficient resource utilization and operational consistency.</p> <h2 class="wp-block-heading"><strong>Gerrit 4.0 (Target: 2026/2027)</strong></h2> <p>Looking ahead, Gerrit 4.0 is set to introduce significant architectural changes:</p> <ul class="wp-block-list"> <li><strong>Decoupling Gerrit Review UI and JGit Server:</strong> This separation will allow the Gerrit UI and JGit server to operate as independent services, providing greater flexibility in deployment and scaling.</li> <li><strong>Enabling Alternative Review UIs:</strong> By decoupling components, the platform will support the integration of other review interfaces, such as pull-request systems, offering users a broader range of tools tailored to their workflows.</li> </ul> <hr class="wp-block-separator has-alpha-channel-opacity" /> <p>The Gerrit community is encouraged to stay engaged with these developments, as the roadmap is subject to change. Contributors planning to work on features not listed are advised to inform the Engineering Steering Committee (ESC) to ensure alignment with the project&#8217;s goals.</p> <p>The future of Gerrit Code Review in 2025 and beyond is truly remarkable, come and join <a href="https://www.meetup.com/gerritmeets/events/305718795/">GerritMeets on Wednesday, February 19, 2025 &#8211; 11:45 AM to 1:00 PM PDT</a></p> <p><em><strong>Luca Milanesio<br></strong>Gerrit Code Review Maintainer<br>Gerrit Code Review Release Manager<br>Member of the Gerrit Code Review Engineering Steering Committee</em></p> </div><!-- .entry-content --> <footer class="entry-meta"> <span class="cat-links"> <span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://gitenterprise.me/category/gerrit/" rel="category tag">gerrit</a>, <a href="https://gitenterprise.me/category/gerritmeets/" rel="category tag">gerritmeets</a>, <a href="https://gitenterprise.me/category/git/" rel="category tag">git</a>, <a href="https://gitenterprise.me/category/git/jgit/" rel="category tag">jgit</a>, <a href="https://gitenterprise.me/category/kubernetes/" rel="category tag">kubernetes</a> </span> <span class="sep"> | </span> <span class="tag-links"> <span class="entry-utility-prep entry-utility-prep-tag-links">Tagged</span> <a href="https://gitenterprise.me/tag/code-review/" rel="tag">code review</a>, <a href="https://gitenterprise.me/tag/devops/" rel="tag">DevOps</a>, <a href="https://gitenterprise.me/tag/gerrit/" rel="tag">gerrit</a>, <a href="https://gitenterprise.me/tag/gerrit-code-review/" rel="tag">gerrit code review</a>, <a href="https://gitenterprise.me/tag/git/" rel="tag">git</a>, <a href="https://gitenterprise.me/tag/github/" rel="tag">github</a>, <a href="https://gitenterprise.me/tag/linux/" rel="tag">linux</a>, <a href="https://gitenterprise.me/tag/meetup/" rel="tag">meetup</a>, <a href="https://gitenterprise.me/tag/programming/" rel="tag">programming</a> </span> <span class="sep"> | </span> <span class="comments-link"><a href="https://gitenterprise.me/2025/01/30/gerrit-code-review-project-future-in-2025-and-beyond-at-gerritmeets/#respond"><span class="leave-reply">Leave a reply</span></a></span> </footer><!-- .entry-meta --> </article><!-- #post-2826 --> <article id="post-2796" class="post-2796 post type-post status-publish format-standard hentry category-cloud category-code-review-2 category-conference category-git category-hackathon category-jgit tag-devops tag-git tag-github tag-programming tag-technology"> <header class="entry-header"> <h1 class="entry-title"><a href="https://gitenterprise.me/2024/12/23/gerritforge-2024-in-review-git-gerrit-code-review-and-more/" rel="bookmark">GerritForge 2024 in review: Git, Gerrit Code Review and&nbsp;more</a></h1> <div class="entry-meta"> <span class="sep">Posted on </span><a href="https://gitenterprise.me/2024/12/23/gerritforge-2024-in-review-git-gerrit-code-review-and-more/" title="2:17 pm" rel="bookmark"><time class="entry-date" datetime="2024-12-23T14:17:54+00:00">December 23, 2024</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://gitenterprise.me/author/gitenterprise/" title="View all posts by Git and Gerrit Code Review for the Enterprise" rel="author">Git and Gerrit Code Review for the Enterprise</a></span></span> </div><!-- .entry-meta --> <div class="comments-link"> <a href="https://gitenterprise.me/2024/12/23/gerritforge-2024-in-review-git-gerrit-code-review-and-more/#respond"><span class="leave-reply">Reply</span></a> </div> </header><!-- .entry-header --> <div class="entry-content"> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2024/12/gerritforge-2024-review.jpg"><img data-attachment-id="2799" data-permalink="https://gitenterprise.me/2024/12/23/gerritforge-2024-in-review-git-gerrit-code-review-and-more/gerritforge-2024-review/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/12/gerritforge-2024-review.jpg" data-orig-size="1920,1080" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="gerritforge-2024-review" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/12/gerritforge-2024-review.jpg?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/12/gerritforge-2024-review.jpg?w=584" width="1024" height="576" src="https://gitenterprise.me/wp-content/uploads/2024/12/gerritforge-2024-review.jpg?w=1024" alt="" class="wp-image-2799" srcset="https://gitenterprise.me/wp-content/uploads/2024/12/gerritforge-2024-review.jpg?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2024/12/gerritforge-2024-review.jpg?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/12/gerritforge-2024-review.jpg?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/12/gerritforge-2024-review.jpg?w=768 768w, https://gitenterprise.me/wp-content/uploads/2024/12/gerritforge-2024-review.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <p>As 2024 draws to a close, it’s a great time to reflect on the milestones and achievements of the GerritForge team in innovating Git performance with the release of GHS, supporting and advancing the Gerrit Code Review project with 20 releases and over 1.5k commits. This year has been one of exciting developments and initiatives that have made Gerrit stronger, more accessible, and better equipped to meet the needs of modern software teams. Here&#8217;s what GerritForge accomplished for the Git and Gerrit Code Review ecosystem in 2024.</p> <h2 class="wp-block-heading"><strong>2024 in numbers</strong></h2> <ul class="wp-block-list"> <li>1,500 changes merged</li> <li>40 repositories involved in the Gerrit and JGit projects</li> <li>20 releases</li> <li>5 conferences, 6 meetups</li> <li>11 contributors, 4 maintainers</li> <li>20k man/hours spent in open-source projects</li> </ul> <h2 class="wp-block-heading">Managing the Releases of Gerrit 3.10 and 3.11</h2> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2024/12/gerrit-3.10-3.11.png"><img data-attachment-id="2815" data-permalink="https://gitenterprise.me/2024/12/23/gerritforge-2024-in-review-git-gerrit-code-review-and-more/gerrit-3-10-3-11-2/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/12/gerrit-3.10-3.11.png" data-orig-size="1920,1080" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="gerrit-3.10-3.11" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/12/gerrit-3.10-3.11.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/12/gerrit-3.10-3.11.png?w=584" loading="lazy" width="1024" height="576" src="https://gitenterprise.me/wp-content/uploads/2024/12/gerrit-3.10-3.11.png?w=1024" alt="" class="wp-image-2815" srcset="https://gitenterprise.me/wp-content/uploads/2024/12/gerrit-3.10-3.11.png?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2024/12/gerrit-3.10-3.11.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/12/gerrit-3.10-3.11.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/12/gerrit-3.10-3.11.png?w=768 768w, https://gitenterprise.me/wp-content/uploads/2024/12/gerrit-3.10-3.11.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <p>As usual, we continue to ensure the regular releases of new Gerrit versions. This year was no exception with the releases of Gerrit 3.10 and 3.11. These releases introduced new features, performance optimisations, and bug fixes to further solidify Gerrit as the leading code review tool for large-scale projects.</p> <p>Our team cooperated with the Gerrit Code Review community to ensure these releases were stable, well-documented, and aligned with community needs. From coordinating release schedules to ensuring compatibility with plugins and integrations, GerritForge played a key role in making these versions a reality.</p> <h3 class="wp-block-heading">Key Highlights</h3> <ul class="wp-block-list"> <li>Gerrit 3.10 brought major improvements in user experience, including refined UI capabilities and enhanced search functionality.</li> <li>Gerrit 3.11 introduced critical updates to multi-site support, security enhancements, and significant performance boosts.</li> </ul> <h2 class="wp-block-heading">GerritMeets success in both the USA and Europe</h2> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2024/12/gerritmeets-logo.png"><img data-attachment-id="2816" data-permalink="https://gitenterprise.me/2024/12/23/gerritforge-2024-in-review-git-gerrit-code-review-and-more/gerritmeets-logo/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/12/gerritmeets-logo.png" data-orig-size="968,484" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="GerritMeets-logo" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/12/gerritmeets-logo.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/12/gerritmeets-logo.png?w=584" loading="lazy" width="968" height="484" src="https://gitenterprise.me/wp-content/uploads/2024/12/gerritmeets-logo.png?w=968" alt="" class="wp-image-2816" srcset="https://gitenterprise.me/wp-content/uploads/2024/12/gerritmeets-logo.png 968w, https://gitenterprise.me/wp-content/uploads/2024/12/gerritmeets-logo.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/12/gerritmeets-logo.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/12/gerritmeets-logo.png?w=768 768w" sizes="(max-width: 968px) 100vw, 968px" /></a></figure> <p>The GerritMeets series has become a cornerstone of community engagement, and 2024 was no exception. GerritForge organised six GerritMeets across several locations, including California, Germany, and the UK, bringing together contributors, users, and maintainers to share knowledge, discuss trends, and explore use cases.<br>Each session covered a diverse range of topics, including:</p> <ul class="wp-block-list"> <li>Best practices for multi-site setups.</li> <li>Advanced plugin development.</li> <li>Gerrit performance tuning for large repositories.</li> <li>Innovations in CI/CD workflows with Gerrit.</li> </ul> <p>These virtual meetups provided a platform for collaboration and learning, reinforcing Gerrit’s community spirit. All the recordings of the 2024 GerritMeets are available as a playlist on the <a href="https://www.youtube.com/playlist?list=PLySCWiWz9cNtZ1W0QzWq3TwPTRB7UWwy-">GerritForge TV YouTube channel</a>.</p> <h2 class="wp-block-heading">World-class Enterprise Gerrit-as-a-Service on Google Cloud Platform</h2> <p> In 2024, GerritForge expanded Gerrit’s capabilities by adding support for Gerrit-as-a-Service (GaaS) on the Google Cloud Platform (GCP). This initiative makes it easier than ever for organizations to adopt Gerrit without the operational overhead of managing infrastructure.</p> <figure class="wp-block-image"><img src="https://lh7-qw.googleusercontent.com/docsz/AD_4nXf6WOKODrxOfkYD4GVdbKX5I_wLw9Te91s0m8p3a4R5kJH24u12NyTmCUVZbHtgVHnoZEpyDTG5KbGkhoxHFNRIyRwhhzFTmrloD7pjvPovdfltlBlC8N1By6dmwYeGIT8Ck4o2?key=CTgEzh_dmQJr7aiQX9A_ottZ" alt="" /></figure> <h3 class="wp-block-heading">Benefits of Gerrit-as-a-Service on GCP</h3> <ul class="wp-block-list"> <li>Scalability: Leveraging GCP’s powerful infrastructure to scale Gerrit deployments for enterprises of any size.</li> <li>Simplicity: Reducing setup and maintenance complexity, allowing teams to focus on development and code reviews.</li> <li>High Availability: Utilizing GCP’s advanced networking and storage capabilities for improved uptime and disaster recovery.</li> </ul> <p>By enabling Gerrit on GCP, GerritForge is broadening the tool&#8217;s accessibility, particularly for teams looking for a cloud-native, fully managed solution.</p> <h2 class="wp-block-heading">Gerrit User Summit with Qualcomm</h2> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2024/12/gus2024.png"><img data-attachment-id="2818" data-permalink="https://gitenterprise.me/2024/12/23/gerritforge-2024-in-review-git-gerrit-code-review-and-more/gus2024/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/12/gus2024.png" data-orig-size="306,126" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="gus2024" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/12/gus2024.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/12/gus2024.png?w=306" loading="lazy" width="306" height="126" src="https://gitenterprise.me/wp-content/uploads/2024/12/gus2024.png?w=306" alt="" class="wp-image-2818" srcset="https://gitenterprise.me/wp-content/uploads/2024/12/gus2024.png 306w, https://gitenterprise.me/wp-content/uploads/2024/12/gus2024.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/12/gus2024.png?w=300 300w" sizes="(max-width: 306px) 100vw, 306px" /></a></figure> <p>This year’s Gerrit User Summit, organized by Qualcomm in collaboration with GerritForge, was a highlight for the community. Held at the Qualcomm HQ in San Diego, CA (USA), the summit offered a chance for Gerrit enthusiasts worldwide to come together in person.<br>The agenda featured:</p> <ul class="wp-block-list"> <li>Keynotes by Gerrit maintainers and industry leaders.</li> <li>Hands-on hackathon for contributors and users.</li> <li>Insightful panels on the future of Gerrit.</li> </ul> <p>The collaboration with Qualcomm not only expanded the summit&#8217;s reach but also highlighted Gerrit&#8217;s growing importance in enterprise environments.</p> <h2 class="wp-block-heading">Showcasing GHS and Gerrit Code Review worldwide</h2> <figure class="wp-block-image"><img src="https://lh7-qw.googleusercontent.com/docsz/AD_4nXdcKIJeYICtZ9WeoLfrHSjDHgUSGQkVKLIKYHaaLtCi_e-lYK19cmyXrUR8TP4GWIMwMgaJFVKRw1xqTqP3EWJ47JopbVyPWQT1ErW2pM04lsJD4-VuOO96hAQsxPt9xoO4pbWLPg?key=CTgEzh_dmQJr7aiQX9A_ottZ" alt="" /></figure> <p>This year, GerritForge actively participated in numerous conferences to showcase GHS and expand Gerrit’s visibility, and demonstrate its unique capabilities. These events were a fantastic opportunity to uncover GHS and showcase Gerrit to hundreds of developers who had never encountered it.</p> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2024/12/ghs.png"><img data-attachment-id="2820" data-permalink="https://gitenterprise.me/2024/12/23/gerritforge-2024-in-review-git-gerrit-code-review-and-more/ghs/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/12/ghs.png" data-orig-size="401,379" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="ghs" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/12/ghs.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/12/ghs.png?w=401" loading="lazy" width="401" height="379" src="https://gitenterprise.me/wp-content/uploads/2024/12/ghs.png?w=401" alt="" class="wp-image-2820" srcset="https://gitenterprise.me/wp-content/uploads/2024/12/ghs.png 401w, https://gitenterprise.me/wp-content/uploads/2024/12/ghs.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/12/ghs.png?w=300 300w" sizes="(max-width: 401px) 100vw, 401px" /></a></figure> <p>At these conferences, we showcased:</p> <ul class="wp-block-list"> <li><strong>GHS</strong>: It demonstrates its seamless integration with Git and showcases a whopping 100x performance improvement over a vanilla setup thanks to the power of AI and reinforcement learning.</li> <li><strong>K8s-Gerrit</strong>: Highlighting how Gerrit deployed on Kubernetes provides unparalleled flexibility, performance, and multi-site support.</li> </ul> <p>Through live demos, presentations, and Q&amp;A sessions, we highlighted GHS and Gerrit’s ability to scale, its unique review model, and its role in making software delivery pipelines up to 100x times faster.</p> <h2 class="wp-block-heading">K8s-Gerrit Hackathon with SAP</h2> <p>Collaboration was at the forefront of the k8s-Gerrit Hackathon, co-hosted by GerritForge and SAP. The hackathon brought together developers from both SAP and GerritForge teams to tackle the challenges of Kubernetes-based Gerrit deployments and multi-site support.</p> <figure class="wp-block-image"><img src="https://lh7-qw.googleusercontent.com/docsz/AD_4nXeaCOcInucrU5fOzUu7i2Y3d-8n9FZsMW_nq_6ePi85f4ACFNZDLLTUN4J0y_6pvXwFieThXRQt_r4SzBH2_W-UIGIOhXIbl0hgpRzFWx7OzyXwEUgcoAyV7gwiBJU8Z67ixgpY-w?key=CTgEzh_dmQJr7aiQX9A_ottZ" alt="" /></figure> <h3 class="wp-block-heading">Outcomes of the Hackathon</h3> <ul class="wp-block-list"> <li>Enhanced scalability for k8s-Gerrit deployments.</li> <li>Breakthroughs in multi-site replication and disaster recovery.</li> <li>Valuable contributions to the Gerrit codebase and documentation.</li> </ul> <p>The event exemplified the power of open collaboration, pushing Gerrit further into cloud-native development.</p> <h2 class="wp-block-heading">Looking Ahead to 2025</h2> <p>As we celebrate the progress made in 2024, we remain focused on the road ahead. GerritForge is committed to:</p> <ul class="wp-block-list"> <li>Public offering of GHS</li> <li>Gerrit-as-a-Service in Google Cloud</li> <li>Gerrit Code Review v3.12 and v3.13</li> <li>More GerritMeets and Gerrit User Summit events</li> </ul> <p>Our gratitude goes out to the Git and Gerrit Code Review communities, contributors, and partners who have made this year a success. Together, we’re building a tool that empowers teams to deliver high-quality code faster and more efficiently.<br>Here’s to an even more impactful 2025!</p> <p><em><strong>Daniele Sassoli </strong>&#8211; Gerrit Code Review Community Manager<br><strong>Luca Milanesio</strong> &#8211; JGit Committer / Gerrit Code Review Engineering Steering Committee / Release Manager and Maintainer</em></p> </div><!-- .entry-content --> <footer class="entry-meta"> <span class="cat-links"> <span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://gitenterprise.me/category/cloud/" rel="category tag">cloud</a>, <a href="https://gitenterprise.me/category/code-review-2/" rel="category tag">code-review</a>, <a href="https://gitenterprise.me/category/conference/" rel="category tag">conference</a>, <a href="https://gitenterprise.me/category/git/" rel="category tag">git</a>, <a href="https://gitenterprise.me/category/hackathon/" rel="category tag">hackathon</a>, <a href="https://gitenterprise.me/category/git/jgit/" rel="category tag">jgit</a> </span> <span class="sep"> | </span> <span class="tag-links"> <span class="entry-utility-prep entry-utility-prep-tag-links">Tagged</span> <a href="https://gitenterprise.me/tag/devops/" rel="tag">DevOps</a>, <a href="https://gitenterprise.me/tag/git/" rel="tag">git</a>, <a href="https://gitenterprise.me/tag/github/" rel="tag">github</a>, <a href="https://gitenterprise.me/tag/programming/" rel="tag">programming</a>, <a href="https://gitenterprise.me/tag/technology/" rel="tag">technology</a> </span> <span class="sep"> | </span> <span class="comments-link"><a href="https://gitenterprise.me/2024/12/23/gerritforge-2024-in-review-git-gerrit-code-review-and-more/#respond"><span class="leave-reply">Leave a reply</span></a></span> </footer><!-- .entry-meta --> </article><!-- #post-2796 --> <article id="post-2786" class="post-2786 post type-post status-publish format-standard hentry category-uncategorized tag-technology"> <header class="entry-header"> <h1 class="entry-title"><a href="https://gitenterprise.me/2024/11/06/hackathon-and-gerrit-user-summit-2024/" rel="bookmark">Hackathon and Gerrit User Summit&nbsp;2024</a></h1> <div class="entry-meta"> <span class="sep">Posted on </span><a href="https://gitenterprise.me/2024/11/06/hackathon-and-gerrit-user-summit-2024/" title="8:58 am" rel="bookmark"><time class="entry-date" datetime="2024-11-06T08:58:32+00:00">November 6, 2024</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://gitenterprise.me/author/barbasa78/" title="View all posts by Fabio Ponciroli" rel="author">Fabio Ponciroli</a></span></span> </div><!-- .entry-meta --> <div class="comments-link"> <a href="https://gitenterprise.me/2024/11/06/hackathon-and-gerrit-user-summit-2024/#respond"><span class="leave-reply">Reply</span></a> </div> </header><!-- .entry-header --> <div class="entry-content"> <figure data-carousel-extra='{"blog_id":17973225,"permalink":"https:\/\/gitenterprise.me\/2024\/11\/06\/hackathon-and-gerrit-user-summit-2024\/"}' class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex"> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2024/11/screenshot-2024-11-06-at-10.12.28e280afam.png"><img data-attachment-id="2791" data-permalink="https://gitenterprise.me/2024/11/06/hackathon-and-gerrit-user-summit-2024/screenshot-2024-11-06-at-10-12-28-am/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/11/screenshot-2024-11-06-at-10.12.28e280afam.png" data-orig-size="1435,837" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Screenshot 2024-11-06 at 10.12.28 AM" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/11/screenshot-2024-11-06-at-10.12.28e280afam.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/11/screenshot-2024-11-06-at-10.12.28e280afam.png?w=584" loading="lazy" width="1024" height="597" data-id="2791" src="https://gitenterprise.me/wp-content/uploads/2024/11/screenshot-2024-11-06-at-10.12.28e280afam.png?w=1024" alt="" class="wp-image-2791" srcset="https://gitenterprise.me/wp-content/uploads/2024/11/screenshot-2024-11-06-at-10.12.28e280afam.png?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2024/11/screenshot-2024-11-06-at-10.12.28e280afam.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/11/screenshot-2024-11-06-at-10.12.28e280afam.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/11/screenshot-2024-11-06-at-10.12.28e280afam.png?w=768 768w, https://gitenterprise.me/wp-content/uploads/2024/11/screenshot-2024-11-06-at-10.12.28e280afam.png 1435w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> </figure> <p>I had the pleasure of attending the latest <strong>Hackhathon</strong> and <strong>Gerrit User Summit</strong> in San Diego, at the beginning of October and I want to start by extending a thank you to GerritForge Inc. and Qualcomm for organizing it.&nbsp;</p> <p>It’s been good to see new faces participating, particularly at the User Summit. The hackathon allowed us to explore different topics, from performance improvements to AI integration.</p> <p>The main outcomes were the following:</p> <ul class="wp-block-list"> <li>JGit performance improvements: Multi-pack index (MIDX for short) is a feature already present in <a href="https://git-scm.com/docs/multi-pack-index">CGit</a>, where it proved to bring a significant performance improvement in object lookup. We managed to implement a PoC in JGit for the MIDX loader and use it in the code. Some basic initial profiling provided a 63% improvement in performance on upload-pack! Not bad for a three-day work! <a href="https://eclipse.gerrithub.io/c/eclipse-jgit/jgit/+/1202417/4">Here is the list</a> of JGit changes. Stay tuned for further development.</li> <li>New AI model implementation: the existing <a href="https://github.com/amarula/chatgpt-code-review-gerrit-plugin/">ChatGPT plugin</a> has been <a href="https://gerrit.googlesource.com/plugins/ai-code-review">renamed</a> and abstracted to accommodate other AI models (i.e. Llama).</li> <li>Message of the day plugin: The <a href="https://gerrit.googlesource.com/plugins/messageoftheday">Message of the Day plugin</a> is a simple plugin for displaying messages to users, for example, during maintenance operations. Currently, the plugin requires configuration changes to set it up, which can be tedious for Gerrit admins daily. Some <a href="https://gerrit-review.googlesource.com/c/plugins/messageoftheday/+/438841">changes</a> have been made to allow the plugin to be configured via the UI.</li> </ul> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2024/11/screenshot-2024-11-06-at-10.22.54e280afam.png"><img data-attachment-id="2793" data-permalink="https://gitenterprise.me/2024/11/06/hackathon-and-gerrit-user-summit-2024/screenshot-2024-11-06-at-10-22-54-am/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/11/screenshot-2024-11-06-at-10.22.54e280afam.png" data-orig-size="1155,801" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Screenshot 2024-11-06 at 10.22.54 AM" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/11/screenshot-2024-11-06-at-10.22.54e280afam.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/11/screenshot-2024-11-06-at-10.22.54e280afam.png?w=584" loading="lazy" width="1024" height="710" src="https://gitenterprise.me/wp-content/uploads/2024/11/screenshot-2024-11-06-at-10.22.54e280afam.png?w=1024" alt="" class="wp-image-2793" srcset="https://gitenterprise.me/wp-content/uploads/2024/11/screenshot-2024-11-06-at-10.22.54e280afam.png?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2024/11/screenshot-2024-11-06-at-10.22.54e280afam.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/11/screenshot-2024-11-06-at-10.22.54e280afam.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/11/screenshot-2024-11-06-at-10.22.54e280afam.png?w=768 768w, https://gitenterprise.me/wp-content/uploads/2024/11/screenshot-2024-11-06-at-10.22.54e280afam.png 1155w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <p>The user summit was rich of talks around version upgrades and Gerrit running in k8s, among other topics. Here is a quick summary of the talks, which will be published on <a href="https://www.youtube.com/@GerritForgeTV">GerritForge TV</a>:</p> <ul class="wp-block-list"> <li>Version upgrades: Qualcomm proposed a talk describing their use case while migrating from 2.7 to 3.5 their high-availability installation. On the same note, we, as GerritForge, proposed a different approach to migrations, bringing a new pattern to the community to minimize disruptions, particularly when migrating many versions in one go. We described some use cases of customers we helped migrate on a project basis rather than a “big bang” approach.</li> <li>K8s Gerrit: SAP described the now mature high-availability setup internally used running Gerrit on K8s, using the operator implemented in the <a href="https://gerrit.googlesource.com/k8s-gerrit/">k8s Gerrit project</a>. We, as GerritForge, illustrated the changes we did to the same project to allow Gerrit to run in a multi-site fashion, leveraging a share-nothing architecture.</li> <li>The expensive re-check button: research from the University of Waterloo presented by Prof. Shane Mcintosh illustrated the “hidden” costs behind the bad habit of a “simple” re-triggering of test suites because of non-deterministic test behaviors. The case study presented was on the OpenStack project.</li> <li>What’s new in 3.11: Qualcomm presented interesting features and bug fixes for the soon-to-be-released Gerrit version.</li> <li>Git repo maintenance made easy: SCMs are a mission-critical part of any software-related business. GerritForge talked about <a href="https://www.gerritforge.com/ghs.html">GHS</a>, an AI-driven approach to maintaining the performance of busy Git repositories that undergo heavy workloads.</li> </ul> <p>These and many other topics were discussed during the conference and unconference section of the user summit. This is it for now, but I am looking forward to the next User Summit to meet with the community and come up with new interesting discussions.</p> <p></p> </div><!-- .entry-content --> <footer class="entry-meta"> <span class="cat-links"> <span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://gitenterprise.me/category/uncategorized/" rel="category tag">Uncategorized</a> </span> <span class="sep"> | </span> <span class="tag-links"> <span class="entry-utility-prep entry-utility-prep-tag-links">Tagged</span> <a href="https://gitenterprise.me/tag/technology/" rel="tag">technology</a> </span> <span class="sep"> | </span> <span class="comments-link"><a href="https://gitenterprise.me/2024/11/06/hackathon-and-gerrit-user-summit-2024/#respond"><span class="leave-reply">Leave a reply</span></a></span> </footer><!-- .entry-meta --> </article><!-- #post-2786 --> <article id="post-2775" class="post-2775 post type-post status-publish format-standard hentry category-eclipse category-git category-kubernetes category-open-source category-uncategorized tag-code-review tag-devops tag-gerrit tag-git tag-github tag-programming tag-version-control"> <header class="entry-header"> <h1 class="entry-title"><a href="https://gitenterprise.me/2024/09/12/ghs-worldwide-roadshow/" rel="bookmark">GHS Worldwide Roadshow</a></h1> <div class="entry-meta"> <span class="sep">Posted on </span><a href="https://gitenterprise.me/2024/09/12/ghs-worldwide-roadshow/" title="8:39 pm" rel="bookmark"><time class="entry-date" datetime="2024-09-12T20:39:32+01:00">September 12, 2024</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://gitenterprise.me/author/dani469816031f4/" title="View all posts by Daniele Sassoli" rel="author">Daniele Sassoli</a></span></span> </div><!-- .entry-meta --> <div class="comments-link"> <a href="https://gitenterprise.me/2024/09/12/ghs-worldwide-roadshow/#respond"><span class="leave-reply">Reply</span></a> </div> </header><!-- .entry-header --> <div class="entry-content"> <figure class="wp-block-image is-resized"><img data-attachment-id="2783" data-permalink="https://gitenterprise.me/2024/09/12/ghs-worldwide-roadshow/untitled-design-1-2/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/08/untitled-design-1-1.png" data-orig-size="693,395" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Untitled design (1)" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/08/untitled-design-1-1.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/08/untitled-design-1-1.png?w=584" loading="lazy" width="693" height="395" src="https://gitenterprise.me/wp-content/uploads/2024/08/untitled-design-1-1.png" alt="" class="wp-image-2783" style="width:628px;height:auto" srcset="https://gitenterprise.me/wp-content/uploads/2024/08/untitled-design-1-1.png 693w, https://gitenterprise.me/wp-content/uploads/2024/08/untitled-design-1-1.png?w=150&amp;h=85 150w, https://gitenterprise.me/wp-content/uploads/2024/08/untitled-design-1-1.png?w=300&amp;h=171 300w" sizes="(max-width: 693px) 100vw, 693px" /></figure> <p>We&#8217;re thrilled to announce that our team will be speaking about our advancements with GerritForge AI Health Service (GHS) at several prestigious conferences in the coming months. These events provide an incredible opportunity to share our innovative AI solutions with a broader audience, engage with industry experts, and showcase how GHS is revolutionizing the way organizations maintain the health and stability of their Gerrit and Git systems.</p> <p>Our journey begins at the <strong><a href="https://events.linuxfoundation.org/open-source-summit-europe/">Linux Open Source Summit</a> in Vienna</strong>, from the 16th to the 18th of September. This summit is a cornerstone event for the open-source community, and we couldn&#8217;t be more excited to discuss how GHS leverages AI to ensure the seamless performance of Git and Gerrit systems, even in the most demanding environments.</p> <p>Next, we&#8217;ll be in Berlin for <strong><a href="https://git-merge.com/">Git Merge</a></strong> on the 19th and 20th of September. Git Merge is the go-to event for Git enthusiasts and professionals alike, and we&#8217;re eager to dive deep into the technical aspects of GHS, sharing insights on how our AI solution optimizes system performance, reduces downtime, and empowers development teams to focus on what they do best—creating great software.</p> <p>In October, we&#8217;re particularly excited about the <strong>Gerrit User Summit in San Diego</strong>, on the 10th and 11th. This event is especially important to us as it brings together the Gerrit community to discuss the latest developments and best practices. We&#8217;ll be showcasing how GHS is enhancing Gerrit environments by providing intelligent and automated health monitoring and ensuring peak performance.</p> <p>Following that, we&#8217;ll speak at the <strong><a href="https://www.ocxconf.org/event/2024/summary">OCX</a> conference in Mainz</strong>, from the 22nd to the 24th of October. OCX is known for bringing together top minds in DevOps and open-source technology, making it the perfect venue to highlight how GHS is transforming the management of code review and source control systems with intelligent, automated health monitoring and remediation.</p> <p>Finally, we&#8217;re thrilled to wrap up our conference tour at <strong><a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/">KubeCon</a></strong> in Salt Lake City, from the 12th to the 15th of November. As one of the most anticipated events in the cloud-native ecosystem, KubeCon offers an unparalleled platform to demonstrate how GHS integrates with Kubernetes environments, ensuring that your SCM systems are always running at peak performance.</p> <p>These conferences represent more than just speaking engagements for us—they are an opportunity to engage with the community, learn from our peers, and continue pushing the boundaries of what&#8217;s possible with AI in software development. We can&#8217;t wait to connect with you at these events and share how GHS can make a tangible difference in your organization&#8217;s success.</p> <p>Stay tuned for more updates as we approach these dates, and be sure to catch our sessions if you&#8217;re attending any of these events!</p> <p><em><strong>Daniele Sassoli<br></strong>GerritForge Engineering Manager<br>Gerrit Code Review Community Manager and Contributor</em></p> </div><!-- .entry-content --> <footer class="entry-meta"> <span class="cat-links"> <span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://gitenterprise.me/category/eclipse/" rel="category tag">eclipse</a>, <a href="https://gitenterprise.me/category/git/" rel="category tag">git</a>, <a href="https://gitenterprise.me/category/kubernetes/" rel="category tag">kubernetes</a>, <a href="https://gitenterprise.me/category/open-source/" rel="category tag">open source</a>, <a href="https://gitenterprise.me/category/uncategorized/" rel="category tag">Uncategorized</a> </span> <span class="sep"> | </span> <span class="tag-links"> <span class="entry-utility-prep entry-utility-prep-tag-links">Tagged</span> <a href="https://gitenterprise.me/tag/code-review/" rel="tag">code review</a>, <a href="https://gitenterprise.me/tag/devops/" rel="tag">DevOps</a>, <a href="https://gitenterprise.me/tag/gerrit/" rel="tag">gerrit</a>, <a href="https://gitenterprise.me/tag/git/" rel="tag">git</a>, <a href="https://gitenterprise.me/tag/github/" rel="tag">github</a>, <a href="https://gitenterprise.me/tag/programming/" rel="tag">programming</a>, <a href="https://gitenterprise.me/tag/version-control/" rel="tag">version-control</a> </span> <span class="sep"> | </span> <span class="comments-link"><a href="https://gitenterprise.me/2024/09/12/ghs-worldwide-roadshow/#respond"><span class="leave-reply">Leave a reply</span></a></span> </footer><!-- .entry-meta --> </article><!-- #post-2775 --> <article id="post-2558" class="post-2558 post type-post status-publish format-standard hentry category-bazel tag-buildbuddy tag-cicd tag-cloud tag-devops tag-jenkinsci tag-software-development"> <header class="entry-header"> <h1 class="entry-title"><a href="https://gitenterprise.me/2024/06/26/gerrit-code-review-rbe-moving-to-buildbuddy-on-prem/" rel="bookmark">Gerrit Code Review RBE: moving to BuildBuddy&nbsp;on-prem</a></h1> <div class="entry-meta"> <span class="sep">Posted on </span><a href="https://gitenterprise.me/2024/06/26/gerrit-code-review-rbe-moving-to-buildbuddy-on-prem/" title="11:08 pm" rel="bookmark"><time class="entry-date" datetime="2024-06-26T23:08:10+01:00">June 26, 2024</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://gitenterprise.me/author/alvarovilaplana/" title="View all posts by alvarovilaplana" rel="author">alvarovilaplana</a></span></span> </div><!-- .entry-meta --> <div class="comments-link"> <a href="https://gitenterprise.me/2024/06/26/gerrit-code-review-rbe-moving-to-buildbuddy-on-prem/#respond"><span class="leave-reply">Reply</span></a> </div> </header><!-- .entry-header --> <div class="entry-content"> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2024/06/gerrit-build-buddy.jpg"><img data-attachment-id="2705" data-permalink="https://gitenterprise.me/2024/06/26/gerrit-code-review-rbe-moving-to-buildbuddy-on-prem/gerrit-build-buddy/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/06/gerrit-build-buddy.jpg" data-orig-size="1890,1080" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="gerrit-build-buddy" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/06/gerrit-build-buddy.jpg?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/06/gerrit-build-buddy.jpg?w=584" loading="lazy" width="1024" height="585" src="https://gitenterprise.me/wp-content/uploads/2024/06/gerrit-build-buddy.jpg?w=1024" alt="" class="wp-image-2705" srcset="https://gitenterprise.me/wp-content/uploads/2024/06/gerrit-build-buddy.jpg?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2024/06/gerrit-build-buddy.jpg?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/06/gerrit-build-buddy.jpg?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/06/gerrit-build-buddy.jpg?w=768 768w, https://gitenterprise.me/wp-content/uploads/2024/06/gerrit-build-buddy.jpg 1890w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <p>The <a href="https://gerritcodereview.com">Gerrit Code Review Open-Source project</a> has transitioned from using Google Cloud Platform’s Remote Build Execution (RBE) to BuildBuddy&#8217;s on-premises to address performance, stability, and latency issues. The migration process included setting up a new Jenkins controller and provisioning BuildBuddy executors on newly provisioned on-premises boxes, which showed significantly reduced build times and a more consistent and reliable performance. After thorough evaluation and community consensus, BuildBuddy was adopted as the new default for Gerrit&#8217;s CI/CD pipeline, enhancing overall efficiency and stability.</p> <h2 class="wp-block-heading">Historical Context</h2> <p class="has-text-align-left">The <a href="https://gerritcodereview.com">Gerrit Code Review project</a> has undergone significant evolution in its build processes to enhance efficiency and performance. This evolution reflects the increasing complexity and demands of modern CI/CD pipelines.</p> <h3 class="wp-block-heading"><strong>Overview of Gerrit Code Review</strong></h3> <p>Gerrit is a powerful code review tool with a powerful web and command-line interface, all built on top of the Git open-source project. Gerrit codebase is significant and multifaceted, using Python tooling, TypeScript front-end and a Java-based backend. To appreciate the challenges and the need for robust build tools, consider the scope of Gerrit&#8217;s codebase and build activity:</p> <ul class="wp-block-list"> <li><strong>Plugins:</strong> Gerrit comprises 14 core plugins maintained as git submodules, plus a universe of over 300 community-based plugins developed in multiple languages, from Java to Scala and Groovy.</li> <li><strong>Java Codebase:</strong> The project includes 6011 Java files, with 4765 dedicated to production code, amassing ca. 411,768 lines of code (LoC). Additionally, there are 1246 test files (924 unit tests and 322 integration tests) contributing another ca. 276,632 LoC.</li> <li><strong>Frontend Codebase:</strong> The frontend is built with 110 JavaScript files (ca. 2345 LoC), 733 TypeScript files (ca. 175,765 LoC), 293 HTML files, and 9 CSS files.</li> <li><strong>Dependencies:</strong> Gerrit relies on 135 Java dependencies managed through Maven and 25 NPM dependencies (5 runtime and 20 development).</li> </ul> <p>Gerrit has been founded in 2008 and has over 15 years of code-history, which reflects the evolution of the build tools, Java VMs and front-end technologies used for over a decade. The pre-requisites that you would have to manage in order to build Gerrit are diverse and quite challenging.</p> <h3 class="wp-block-heading"><strong>Build and Verification Activity</strong></h3> <p>The Gerrit project is highly active, with rigorous commit-level verification processes to ensure code quality and stability. For example, from June 9 to June 23, 2024, Gerrit handled:</p> <p><strong>Total of changes:</strong></p> <figure class="wp-block-table is-style-stripes"><table class="has-fixed-layout"><tbody><tr><td><strong>Branch</strong></td><td><strong>Number of changes</strong></td></tr><tr><td>master</td><td>65</td></tr><tr><td>stable-3.10</td><td>18</td></tr><tr><td>stable-3.9</td><td>16</td></tr><tr><td>stable-3.8</td><td>15</td></tr><tr><td>stable-3.7</td><td>2</td></tr><tr><td>stable-3.6</td><td>0</td></tr><tr><td>stable-3.5</td><td>1</td></tr><tr><td>stable-3.4</td><td>1</td></tr><tr><td><strong>Total</strong></td><td><strong>118</strong></td></tr></tbody></table></figure> <p><strong>Total of revisions (patch sets):</strong></p> <figure class="wp-block-table is-style-stripes"><table class="has-fixed-layout"><tbody><tr><td><strong>Branch</strong></td><td><strong>Number of revisions</strong></td></tr><tr><td>master</td><td>230</td></tr><tr><td>stable-3.10</td><td>86</td></tr><tr><td>stable-3.9</td><td>21</td></tr><tr><td>stable-3.8</td><td>22</td></tr><tr><td>stable-3.7</td><td>4</td></tr><tr><td>stable-3.6</td><td>0</td></tr><tr><td>stable-3.5</td><td>4</td></tr><tr><td>stable-3.4</td><td>1</td></tr><tr><td><strong>Total</strong></td><td><strong>368</strong></td></tr></tbody></table></figure> <p><strong>Total of Gerrit verifications:</strong></p> <figure class="wp-block-table is-style-stripes"><table class="has-fixed-layout"><tbody><tr><td><strong>Type of verification</strong></td><td><strong>number of verifications</strong></td></tr><tr><td>Build/Tests</td><td>277</td></tr><tr><td>Code Style</td><td>320</td></tr><tr><td>PolyGerrit UI Tests</td><td>124</td></tr><tr><td>RBE BB Build/Tests</td><td>271</td></tr><tr><td><strong>Total</strong></td><td><strong>992</strong></td></tr></tbody></table></figure> <h3 class="wp-block-heading"><strong>Evolution of Build Tools</strong></h3> <p>The journey of Gerrit&#8217;s build tools reflects its growth and the increasing complexity of its CI/CD requirements:</p> <ol class="wp-block-list"> <li><strong>Apache Maven</strong>: Up until version 2.7, Gerrit used Apache Maven as its build tool. Maven, known for its comprehensive project management capabilities, was sufficient during Gerrit&#8217;s early stages.</li> <li><strong>Buck</strong>: From version 2.8 to 2.13, Gerrit transitioned to Buck, a build tool designed for faster builds. Buck’s incremental build capabilities helped manage the growing codebase more efficiently than Maven.</li> <li><strong>Bazel</strong>: Since version 2.14, Bazel has been the default build tool for Gerrit. Bazel&#8217;s advanced features, including its support for remote caching and execution, provided significant improvements in build performance and scalability.</li> </ol> <h3 class="wp-block-heading"><strong>Transition to Bazel with Remote Execution and Caching</strong></h3> <p>In December 2020, Gerrit Code Review made a significant shift by adopting Bazel with remote execution and caching to address the challenges of long build times. This strategic move aimed to leverage Bazel’s advanced capabilities to enhance the efficiency of the CI processes.</p> <p><span style="text-decoration: underline">Reasons for the Shift</span></p> <p>The primary driver for this transition was the increasing build times due to the growing complexity and size of the Gerrit codebase. The conventional local build processes were becoming a bottleneck, slowing down the development and integration cycles.</p> <p><span style="text-decoration: underline">Implementation with GCP Remote Build Execution (RBE)</span></p> <p>Gerrit integrated Google Cloud Platform&#8217;s Remote Build Execution (GCP RBE) as the remote server to support this transition. The integration provided several key benefits:</p> <ul class="wp-block-list"> <li><strong>Reduced Build Times</strong>: By offloading build and test tasks to powerful remote servers, build times were significantly reduced.</li> <li><strong>Efficient Resource Utilization</strong>: Local machines were freed from heavy build tasks, allowing developers to continue working without interruptions.</li> <li><strong>Scalability and Parallelisation</strong>: Remote execution and the parallelisation of Gerrit&#8217;s Bazel tasks allowed to leverage the scalable cloud resources.</li> </ul> <p>This implementation marked a crucial enhancement in Gerrit&#8217;s CI/CD pipeline, setting the stage for further optimisations and improvements in the build process.</p> <h2 class="wp-block-heading">Motivation to find RBE alternatives</h2> <p>The RBE implementation on Google Cloud has served the Gerrit Code Review project successfully for many years; however, the needs of the project grew over time and the CI/CD infrastructure had to satisfy additional requirements.</p> <ol class="wp-block-list"> <li>Stability: Google Cloud is SaaS solution which could be flaky at times, whilst the project needed a stable deployment with full control on its stability not influenced by external factors.</li> <li>Latency between the controller and the executors: the latency between the main CI/CD controller (Jenkins) and the RBE executors paid a significant price for shorter builds like the Code-Style checks, whilst a localised data processing resulted in faster build times and quicker feedback cycles.</li> <li>Predictability: Consistent and reliable performance is crucial for efficient CI/CD workflows.</li> </ol> <h2 class="wp-block-heading">Moving to BuildBuddy RBE</h2> <p><a href="https://www.buildbuddy.io/">BuildBuddy</a> is an open-core Bazel build event viewer, result store, remote cache, and remote build execution platform that provided many new benefits to the Gerrit Code Review builds:</p> <ol class="wp-block-list"> <li><strong>Integration and Customisation</strong>: the integration with the existing CI/CD pipelines was straightforward.</li> <li><strong>Open Source Community</strong>: BuildBuddy, being open-core, benefits from community-driven innovation and collaborative support.</li> <li><strong>Enterprise Features</strong>: BuildBuddy Enterprise offers advanced features for companies that need robust capabilities: <ul class="wp-block-list"> <li><strong>OpenID Connect Auth Support</strong>: Integrates with Google OAuth.</li> <li><strong>Remote Build Execution</strong>: Supports custom Docker images.</li> <li><strong>Configurable Bazel Caches TTL</strong>: Allows setting TTL for build results and cache with support for persistent build artifact storage.</li> <li><strong>High Availability</strong>: Configurations for high availability also on-premises</li> </ul> </li> <li><strong>Control and Stability</strong>: On-premise deployment offers full control and enhanced stability by minimizing reliance on external factors.</li> <li><strong>Very Low Latency</strong>: Localized data processing results in faster build times and quicker feedback cycles: we could locate the executors and the Jenkins controller in the same data-centre with micro-seconds network latency.</li> <li><strong>Predictable Performance</strong>: Consistent and reliable performance is crucial for efficient CI/CD workflows, thanks to the dedicated always-on executors.</li> </ol> <p>BuildBuddy RBE allowed more development efficiency and reliability for the Gerrit Code Review project, making it a compelling choice for optimizing CI/CD processes while leveraging the benefits of open-source software and robust enterprise features.</p> <h2 class="wp-block-heading">What was the migration plan ?</h2> <p>To clarify a few points for a better understanding of the this section:</p> <ol class="wp-block-list"> <li><strong>Scope of Bazel RBE Execution:</strong> Bazel RBE is executed only in the Gerrit project and its core plugins (git submodules). It is not executed in non-core plugins, such as pull-replication, high-availability, multi-site, etc.</li> <li><strong>Branch Support:</strong> From a CI/CD perspective, only the master branch and the last three stable branches are supported for Gerrit project, core and non-core plugins. At the time of the migration, these branches were master, stable-3.7, stable-3.8, and stable-3.9.</li> </ol> <p>The initial phase of the migration aimed to assess the reliability and stability of BuildBuddy RBE. A priority in this phase was to maintain the current CI/CD process while simultaneously evaluating BuildBuddy RBE without any disruptions.</p> <p>To achieve this phase, several updates and new services were implemented:</p> <p><strong>Adding BuildBuddy Bazel remote configuration</strong> in <a href="https://gerrit-review.googlesource.com/q/topic:%22bazel_remote_bb%22">Gerrit master branch</a>.</p> <p><strong>Provisioning BuildBuddy Executors:</strong> A cloud host was provisioned with the following specifications: 128 CPUs, Intel(R) Xeon(R) Gold 6438Y+, 128GB RAM, and SSD. This host runs 3 BuildBuddy executors (as docker containers).</p> <p><strong>Setting up a new Gerrit CI Server:</strong> A new Jenkins server was set up to run build jobs against BuildBuddy RBE on the Gerrit master branch. This server is not accessible from outside.</p> <p><strong>Registering a new Gerrit verification:</strong> A new verification named RBE BB Build/Tests was added to <em>gerrit-review.googlesource.com</em> to trigger builds on the new Gerrit CI server whenever a new revision was created on the Gerrit master branch.</p> <p><strong>Figure 1: Architecture Migration diagram with default CI flow and new BuildBuddy CI flow</strong>:</p> <figure class="wp-block-image size-large is-resized"><a href="https://gitenterprise.me/wp-content/uploads/2024/06/blog-architectural-diagram-2.png"><img data-attachment-id="2697" data-permalink="https://gitenterprise.me/2024/06/26/gerrit-code-review-rbe-moving-to-buildbuddy-on-prem/blog-architectural-diagram-2/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/06/blog-architectural-diagram-2.png" data-orig-size="1148,958" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="blog-architectural-diagram-2" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/06/blog-architectural-diagram-2.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/06/blog-architectural-diagram-2.png?w=584" loading="lazy" width="1024" height="854" src="https://gitenterprise.me/wp-content/uploads/2024/06/blog-architectural-diagram-2.png?w=1024" alt="" class="wp-image-2697" style="width:759px;height:auto" srcset="https://gitenterprise.me/wp-content/uploads/2024/06/blog-architectural-diagram-2.png?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2024/06/blog-architectural-diagram-2.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/06/blog-architectural-diagram-2.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/06/blog-architectural-diagram-2.png?w=768 768w, https://gitenterprise.me/wp-content/uploads/2024/06/blog-architectural-diagram-2.png 1148w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <h3 class="wp-block-heading">How is the new CI/CD flow?</h3> <p>In the default CI flow, when a user creates a new revision (patch set) in Gerrit master, or stable-3.7 or stable-3.8 or stable-3.9 branches, a set of verification jobs trigger Jenkins jobs. These verification jobs include:</p> <ul class="wp-block-list"> <li><strong>RBE GCP Build/Tests:</strong> Builds the codebase and executes all the unit/integration tests on GCP RBE.</li> <li><strong>Code Style:</strong> Checks Java and Bazel formatting, and JavaScript lint.</li> <li><strong>Build/Tests:</strong> Builds the codebase and executes one single no-op test.</li> <li><strong>PolyGerrit UI Tests:</strong> Executes unit/integration tests for PolyGerrit UI.</li> </ul> <p>If any of the verification jobs fail, the verification status of the revision is marked with a -1.</p> <p>As mentioned earlier, the intention when testing the reliability and stability of BuildBuddy RBE was to avoid interfering with the default CI/CD flow. To achieve this, a new verification job called RBE BB Build/Tests was added. This verification triggers a Jenkins job on the new Gerrit CI, which builds the codebase and executes unit/integration tests on BuildBuddy RBE. This setup allowed the default flow and the BuildBuddy RBE flow to coexist without affecting each other.</p> <p>It is important to note two things:</p> <ul class="wp-block-list"> <li>Only revisions in the master branch of Gerrit project triggered this new verification job. The data collected from the master branch is sufficient to draw conclusions.</li> <li>The status of this new verification job does not affect the overall verification status of the revision.</li> </ul> <p><strong>Figure 2: Verification jobs, default ones and the BuildBuddy RBE, triggered in a Gerrit master branch revision</strong>:</p> <figure class="wp-block-image size-large is-resized"><a href="https://gitenterprise.me/wp-content/uploads/2024/06/screenshot-2024-06-18-at-19.39.18-1.png"><img data-attachment-id="2647" data-permalink="https://gitenterprise.me/2024/06/26/gerrit-code-review-rbe-moving-to-buildbuddy-on-prem/screenshot-2024-06-18-at-19-39-18-1/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/06/screenshot-2024-06-18-at-19.39.18-1.png" data-orig-size="3428,1734" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="screenshot-2024-06-18-at-19.39.18-1" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/06/screenshot-2024-06-18-at-19.39.18-1.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/06/screenshot-2024-06-18-at-19.39.18-1.png?w=584" loading="lazy" width="1024" height="517" src="https://gitenterprise.me/wp-content/uploads/2024/06/screenshot-2024-06-18-at-19.39.18-1.png?w=1024" alt="" class="wp-image-2647" style="width:768px;height:auto" srcset="https://gitenterprise.me/wp-content/uploads/2024/06/screenshot-2024-06-18-at-19.39.18-1.png?w=1022 1022w, https://gitenterprise.me/wp-content/uploads/2024/06/screenshot-2024-06-18-at-19.39.18-1.png?w=2044 2044w, https://gitenterprise.me/wp-content/uploads/2024/06/screenshot-2024-06-18-at-19.39.18-1.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/06/screenshot-2024-06-18-at-19.39.18-1.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/06/screenshot-2024-06-18-at-19.39.18-1.png?w=768 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <p>Once the first phase concluded, it was important to analyze the data to determine if BuildBuddy RBE was reliable and stable enough to proceed to the next phase. In the second phase, the plan was to evaluate the performance of BuildBuddy RBE against GCP RBE. Architecturally, the CI/CD process remained the same as in the first phase, with one key difference: the verification job RBE BB Build/Tests would be triggered when revisions were created for the Gerrit repo on the master, stable-3.7, stable-3.8, and stable-3.9 branches. This was necessary to ensure that BuildBuddy RBE handled the same number of jobs as GCP RBE, allowing for a fair performance comparison.</p> <h2 class="wp-block-heading">Data Collection</h2> <p>Before analysing the data, it&#8217;s imperative to elucidate our data collection methodology. To procure the build data (build number, execution time in GCP RBE and BB RBE and status), we developed a <a href="https://gerrithub.io/plugins/gitiles/GerritForge/rbe-data-analytics/+/refs/heads/master/rbe_builds_bb_gcp.py">script in python</a> that employed two APIs:</p> <ul class="wp-block-list"> <li><a href="https://gerrit-review.googlesource.com/Documentation/rest-api-changes.html">Gerrit Code Review &#8211; Rest API Query changes</a> to list all the changes.<br>For example: <a href="https://gerrit-review.googlesource.com/changes/?q=project:gerrit+AND+not+dir:polygerrit-ui+AND+(branch:master)&#038;o=CURRENT_REVISION" rel="nofollow">https://gerrit-review.googlesource.com/changes/?q=project:gerrit+AND+not+dir:polygerrit-ui+AND+(branch:master)&#038;o=CURRENT_REVISION</a></li> </ul> <ul class="wp-block-list"> <li><a href="https://gerrit.googlesource.com/plugins/checks/+/refs/heads/master/resources/Documentation/rest-api-checks.md">Checks plugin &#8211; Rest API List of checks</a> to list al the checks for a specific change number and revision number.<br>For example: <a href="https://gerrit-review.googlesource.com/changes/400398/revisions/1/checks" rel="nofollow">https://gerrit-review.googlesource.com/changes/400398/revisions/1/checks</a></li> </ul> <p><strong>Notes:</strong></p> <ul class="wp-block-list"> <li>Build number is a unique number represented by the tuple: (change number, revision number).</li> <li>All the graphs show builds in chronological order.</li> <li>The build numbers are not shown in the graphs for readable purposes.</li> <li>Builds labelled as &#8220;RUNNING&#8221; or those lacking specification according to the API have been excluded from the calculations.</li> </ul> <h3 class="wp-block-heading">Key Performance Indicators</h3> <ul class="wp-block-list"> <li><strong>Average Build Time</strong>: Calculate the average build time for each platform (GCP RBE and BuildBuddy RBE) to understand the typical time it takes to complete a build on each platform.</li> </ul> <ul class="wp-block-list"> <li><strong>Percentage of Builds Faster</strong>: Determine the percentage of builds that are completed faster on BuildBuddy RBE compared to GCP RBE. This helps assess which platform is more efficient in terms of build time.</li> </ul> <ul class="wp-block-list"> <li><strong>Overall Success Rate / Failure Rate</strong>: Calculate the overall success and failing rate of builds on BuildBuddy RBE. This considers both successful and failed builds to provide a comprehensive view of platform reliability.</li> </ul> <ul class="wp-block-list"> <li><strong>Outliers (&gt;60 minutes)</strong>: Identify the percentage of builds that exceed a certain threshold, such as 60 minutes in BuildBuddy RBE. This helps pinpoint builds that take exceptionally long and may require investigation or optimization.</li> </ul> <ul class="wp-block-list"> <li><strong>Average Build Time Reduction</strong>: Determine the average reduction in build time when using BuildBuddy RBE compared to GCP RBE. This quantifies the efficiency improvement gained by using the BuildBuddy platform.<br></li> </ul> <h3 class="wp-block-heading">PHASES</h3> <p>As we mentioned above, the migration has been segmented into two distinct phases:</p> <p><strong>Phase 1</strong>: Spanning from December 28th, 2023, to February 9th, 2024, during which RBE BuildBuddy operated against the Gerrit master branch.<br><strong>Phase 2</strong>: Commencing from February 10th, 2024, to February 26th, during which RBE BuildBuddy operated against the Gerrit master, stable-3.7, stable-3.8, and stable-3.9 branches.</p> <h4 class="wp-block-heading">Phase 1: Evaluate if BuildBuddy RBE offers stability and low latency</h4> <p>To make the data more readable and understandable, I have split the data into 2 graphs:</p> <p class="has-text-align-left"><strong>Figure 3: RBE Successful Build time for Gerrit master between 28th December 2023 to 18th January 2024</strong>:</p> <figure class="wp-block-image size-large is-resized"><a href="https://gitenterprise.me/wp-content/uploads/2024/06/figure_1_rbe_successful_build_time.png"><img data-attachment-id="2570" data-permalink="https://gitenterprise.me/2024/06/26/gerrit-code-review-rbe-moving-to-buildbuddy-on-prem/figure_1_rbe_successful_build_time/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/06/figure_1_rbe_successful_build_time.png" data-orig-size="1438,730" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="figure_1_rbe_successful_build_time" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/06/figure_1_rbe_successful_build_time.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/06/figure_1_rbe_successful_build_time.png?w=584" loading="lazy" width="1024" height="519" src="https://gitenterprise.me/wp-content/uploads/2024/06/figure_1_rbe_successful_build_time.png?w=1024" alt="" class="wp-image-2570" style="width:864px;height:auto" srcset="https://gitenterprise.me/wp-content/uploads/2024/06/figure_1_rbe_successful_build_time.png?w=1022 1022w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_1_rbe_successful_build_time.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_1_rbe_successful_build_time.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_1_rbe_successful_build_time.png?w=768 768w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_1_rbe_successful_build_time.png 1438w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <p class="has-text-align-left"><strong>Figure 4: RBE Successful Build time for Gerrit master&nbsp;between 19th January 2024 to 9th February 2024</strong>:</p> <figure class="wp-block-image size-large is-resized"><a href="https://gitenterprise.me/wp-content/uploads/2024/06/figure_2_rbe_successful_build_time.png"><img data-attachment-id="2572" data-permalink="https://gitenterprise.me/2024/06/26/gerrit-code-review-rbe-moving-to-buildbuddy-on-prem/figure_2_rbe_successful_build_time/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/06/figure_2_rbe_successful_build_time.png" data-orig-size="1640,631" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="figure_2_rbe_successful_build_time" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/06/figure_2_rbe_successful_build_time.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/06/figure_2_rbe_successful_build_time.png?w=584" loading="lazy" width="1024" height="393" src="https://gitenterprise.me/wp-content/uploads/2024/06/figure_2_rbe_successful_build_time.png?w=1024" alt="" class="wp-image-2572" style="width:861px;height:auto" srcset="https://gitenterprise.me/wp-content/uploads/2024/06/figure_2_rbe_successful_build_time.png?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_2_rbe_successful_build_time.png?w=1021 1021w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_2_rbe_successful_build_time.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_2_rbe_successful_build_time.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_2_rbe_successful_build_time.png?w=768 768w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_2_rbe_successful_build_time.png 1640w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <p><strong>Total number of builds:</strong></p> <div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-1 wp-block-columns-is-layout-flex"> <div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:100%"> <figure class="wp-block-table is-style-stripes"><table class="has-fixed-layout"><tbody><tr><td></td><td><strong>master</strong></td></tr><tr><td><strong>GCP Builds</strong></td><td>489</td></tr><tr><td><strong>BB Builds</strong></td><td>489</td></tr></tbody></table></figure> </div> </div> <p><strong>Build status:</strong></p> <figure class="wp-block-table is-style-stripes"><table class="has-fixed-layout"><tbody><tr><td></td><td><strong>BB Successful</strong></td><td><strong>BB failed</strong></td></tr><tr><td><strong>GCP Successful</strong></td><td>390</td><td>17</td></tr><tr><td><strong>GCP Failed</strong></td><td>0</td><td>82</td></tr></tbody></table></figure> <p>Initially, <strong>3.47%</strong> of BuildBuddy RBE builds failed due to CPU exhaustion caused by running 100 BuildBuddy executors simultaneously. This problem was addressed by reducing the number of executors to 3. BuildBuddy engineers advise running only one executor container per host/node, with each executor capable of handling multiple RBE Actions concurrently. For each action, an executor initiates an isolated runner to execute it. We plan to reassess our configuration in due course.</p> <p><strong>Average build time when GCP and BuildBuddy builds were successful:</strong></p> <figure class="wp-block-table is-style-stripes"><table class="has-fixed-layout"><tbody><tr><td></td><td><strong>Minutes</strong></td></tr><tr><td><strong>GCP Average</strong></td><td>18.69</td></tr><tr><td><strong>BB Average</strong></td><td>10.2</td></tr></tbody></table></figure> <p><strong><em>Where the average build time reduction is 8.49 minutes and 96.4% (376 out of 390 builds) of BuildBuddy builds are faster than GCP builds.</em></strong></p> <p>We discovered that <strong>1.5%</strong> of BuildBuddy successful builds were <strong>outliers</strong>. This was due to the need for a restart of the new Gerrit CI server, which caused temporary disruptions.</p> <figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>change_number</th><th>REVISION_NUMBER</th><th>GCP RBE MINUTES</th><th>BB RBE MINUTES</th></tr></thead><tbody><tr><td>400398</td><td>1</td><td>6.7</td><td>868.68</td></tr><tr><td>399657</td><td>11</td><td>13.7</td><td>1293.55</td></tr><tr><td>399657</td><td>14</td><td>21.45</td><td>137.47</td></tr><tr><td>400958</td><td>2</td><td>14.52</td><td>154.3</td></tr><tr><td>247812</td><td>7</td><td>26.62</td><td>67.17</td></tr><tr><td>406597</td><td>1</td><td>14.18</td><td>79.55</td></tr></tbody></table></figure> <p><strong>Average time when GCP and BB Failed:</strong></p> <figure class="wp-block-table is-style-stripes"><table class="has-fixed-layout"><tbody><tr><td></td><td><strong>Minutes</strong></td></tr><tr><td><strong>GCP Average</strong></td><td>17.68</td></tr><tr><td><strong>BB Average</strong></td><td>23.29</td></tr></tbody></table></figure> <p><strong>Conclusions:</strong></p> <p>Assessing performance and stability, the results were promising, with the BuildBuddy platform showcasing superior performance, as highlighted in the table &#8220;Average build time when GCP and BB Successful&#8221;. Additionally, issues with BuildBuddy failing builds during successful GCP builds were addressed, primarily stemming from resolved configuration problems. Although outliers represented a mere 1.5%, their significance was negligible. However, despite these favourable outcomes, caution was warranted due to the higher volume of builds in GCP compared to BuildBuddy, attributed to GCP&#8217;s operation across stable branches.</p> <h4 class="wp-block-heading">Phase 2: Compare BuildBuddy RBE with GCP RBE based on performance</h4> <p>To make the data more readable and understandable, The data has been splitted into 4 graphs:</p> <p class="has-text-align-left"><strong>Figure 5: RBE Successful Build time for Gerrit master</strong>:</p> <figure class="wp-block-image size-large is-resized"><a href="https://gitenterprise.me/wp-content/uploads/2024/06/figure_3_rbe_successful_build_time.png"><img data-attachment-id="2589" data-permalink="https://gitenterprise.me/2024/06/26/gerrit-code-review-rbe-moving-to-buildbuddy-on-prem/figure_3_rbe_successful_build_time/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/06/figure_3_rbe_successful_build_time.png" data-orig-size="1069,393" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="figure_3_rbe_successful_build_time" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/06/figure_3_rbe_successful_build_time.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/06/figure_3_rbe_successful_build_time.png?w=584" loading="lazy" width="1024" height="376" src="https://gitenterprise.me/wp-content/uploads/2024/06/figure_3_rbe_successful_build_time.png?w=1024" alt="" class="wp-image-2589" style="width:857px;height:auto" srcset="https://gitenterprise.me/wp-content/uploads/2024/06/figure_3_rbe_successful_build_time.png?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_3_rbe_successful_build_time.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_3_rbe_successful_build_time.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_3_rbe_successful_build_time.png?w=768 768w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_3_rbe_successful_build_time.png 1069w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <p class="has-text-align-left"><strong>Figure 6: RBE Successful Build time for Gerrit stable-3.9:<br></strong></p> <figure class="wp-block-image size-large is-resized"><a href="https://gitenterprise.me/wp-content/uploads/2024/06/figure_4_rbe_successful_build_time.png"><img data-attachment-id="2591" data-permalink="https://gitenterprise.me/2024/06/26/gerrit-code-review-rbe-moving-to-buildbuddy-on-prem/figure_4_rbe_successful_build_time/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/06/figure_4_rbe_successful_build_time.png" data-orig-size="1182,392" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="figure_4_rbe_successful_build_time" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/06/figure_4_rbe_successful_build_time.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/06/figure_4_rbe_successful_build_time.png?w=584" loading="lazy" width="1024" height="339" src="https://gitenterprise.me/wp-content/uploads/2024/06/figure_4_rbe_successful_build_time.png?w=1024" alt="" class="wp-image-2591" style="width:852px;height:auto" srcset="https://gitenterprise.me/wp-content/uploads/2024/06/figure_4_rbe_successful_build_time.png?w=1022 1022w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_4_rbe_successful_build_time.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_4_rbe_successful_build_time.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_4_rbe_successful_build_time.png?w=768 768w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_4_rbe_successful_build_time.png 1182w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <p class="has-text-align-left"><strong>Figure 7: RBE Successful Build time for Gerrit stable-3.8:</strong></p> <figure class="wp-block-image size-large is-resized"><a href="https://gitenterprise.me/wp-content/uploads/2024/06/figure_5_rbe_successful_build_time.png"><img data-attachment-id="2593" data-permalink="https://gitenterprise.me/2024/06/26/gerrit-code-review-rbe-moving-to-buildbuddy-on-prem/figure_5_rbe_successful_build_time/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/06/figure_5_rbe_successful_build_time.png" data-orig-size="898,396" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="figure_5_rbe_successful_build_time" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/06/figure_5_rbe_successful_build_time.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/06/figure_5_rbe_successful_build_time.png?w=584" loading="lazy" width="898" height="396" src="https://gitenterprise.me/wp-content/uploads/2024/06/figure_5_rbe_successful_build_time.png?w=898" alt="" class="wp-image-2593" style="width:850px;height:auto" srcset="https://gitenterprise.me/wp-content/uploads/2024/06/figure_5_rbe_successful_build_time.png 898w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_5_rbe_successful_build_time.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_5_rbe_successful_build_time.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_5_rbe_successful_build_time.png?w=768 768w" sizes="(max-width: 898px) 100vw, 898px" /></a></figure> <p class="has-text-align-left"><strong>Figure 8: RBE Successful Build time for Gerrit stable-3.7</strong>:</p> <figure class="wp-block-image size-large is-resized"><a href="https://gitenterprise.me/wp-content/uploads/2024/06/figure_6_rbe_successful_build_time-1.png"><img data-attachment-id="2596" data-permalink="https://gitenterprise.me/2024/06/26/gerrit-code-review-rbe-moving-to-buildbuddy-on-prem/figure_6_rbe_successful_build_time-1/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/06/figure_6_rbe_successful_build_time-1.png" data-orig-size="1050,398" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="figure_6_rbe_successful_build_time-1" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/06/figure_6_rbe_successful_build_time-1.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/06/figure_6_rbe_successful_build_time-1.png?w=584" loading="lazy" width="1024" height="388" src="https://gitenterprise.me/wp-content/uploads/2024/06/figure_6_rbe_successful_build_time-1.png?w=1024" alt="" class="wp-image-2596" style="width:844px;height:auto" srcset="https://gitenterprise.me/wp-content/uploads/2024/06/figure_6_rbe_successful_build_time-1.png?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_6_rbe_successful_build_time-1.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_6_rbe_successful_build_time-1.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_6_rbe_successful_build_time-1.png?w=768 768w, https://gitenterprise.me/wp-content/uploads/2024/06/figure_6_rbe_successful_build_time-1.png 1050w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <p><strong>Successful BB Build status / Successful GCP Build status:</strong></p> <figure class="wp-block-table is-style-stripes"><table class="has-fixed-layout"><tbody><tr><td></td><td><strong>master</strong></td><td><strong>stable-3.9</strong></td><td><strong>stable-3.8</strong></td><td><strong>stable-3.7</strong></td><td><strong>Total</strong></td></tr><tr><td><strong>Builds</strong></td><td>119</td><td>26</td><td>6</td><td>11</td><td>162</td></tr></tbody></table></figure> <p><strong>Average time when GCP and BB Successful</strong>:</p> <figure class="wp-block-table is-style-stripes"><table class="has-fixed-layout"><tbody><tr><td></td><td><strong>Minutes</strong></td></tr><tr><td><strong>GCP Average</strong></td><td>13.91</td></tr><tr><td><strong>BB Average</strong></td><td>8.45</td></tr></tbody></table></figure> <p><strong><em>Where the average build time reduction is 5.46 minutes and 90.74% (147 out of 162 builds) of BuildBuddy builds are faster than GCP builds.</em></strong></p> <p><strong>Failed BB Build states / Failed GCP Build status</strong>:</p> <figure class="wp-block-table is-style-stripes"><table class="has-fixed-layout"><tbody><tr><td></td><td><strong>master</strong></td><td><strong>stable-3.9</strong></td><td><strong>stable-3.8</strong></td><td><strong>stable-3.7</strong></td><td><strong>Total</strong></td></tr><tr><td><strong>Builds</strong></td><td>30</td><td>12</td><td>1</td><td>1</td><td>44</td></tr></tbody></table></figure> <p><strong>Failed BB Build status / Successful GCP Build status</strong>:</p> <figure class="wp-block-table is-style-stripes"><table class="has-fixed-layout"><tbody><tr><td></td><td><strong>master</strong></td><td><strong>stable-3.9</strong></td><td><strong>stable-3.8</strong></td><td><strong>stable-3.7</strong></td><td><strong>Total</strong></td></tr><tr><td><strong>Builds</strong></td><td>1</td><td>2</td><td>0</td><td>0</td><td>3</td></tr></tbody></table></figure> <p>It is worth noting that <strong>1.14%</strong> of BuildBuddy builds failed.</p> <p><strong>Average time when GCP and BB builds failed</strong></p> <figure class="wp-block-table is-style-stripes"><table class="has-fixed-layout"><tbody><tr><td></td><td><strong>Minutes</strong></td></tr><tr><td><strong>GCP Average</strong></td><td>10.96</td></tr><tr><td><strong>BB Average</strong></td><td>9.43</td></tr></tbody></table></figure> <p><strong>Conclusions:</strong></p> <p>The findings indicated that the BuildBuddy scenario demonstrated a more consistent performance, due to the on-premises allocated resources, as emphasised in the table &#8220;Average build time when GCP and BB Successful,&#8221; with comparable volumes of builds. Moreover, the stability remained highly consistent, evident from the table &#8220;Failed BB Build status / Successful GCP Build status,&#8221; alongside the absence of outliers.</p> <h2 class="wp-block-heading">Gerrit code review community decision</h2> <p>On February 27, 2024, <a href="https://groups.google.com/g/repo-discuss/c/jQPgaKmaNQA/m/joX6z7JFAAAJ">the collected data was shared</a> with the Gerrit code review open-source community. After careful consideration and thorough analysis, BuildBuddy was found to demonstrate remarkable stability. While it cannot be definitively stated that BuildBuddy surpasses GCP in all aspects, it notably outperforms GCP in terms of latency. Given its superior latency performance and strong stability, the decision was made to adopt BuildBuddy to replace GCP in the CI/CD pipeline.</p> <h2 class="wp-block-heading">Final migration phase</h2> <p>On March 29, 2024, the <a href="https://groups.google.com/g/repo-discuss/c/7kiCDuOcpzw">new Gerrit CI was established as the default CI using BuildBuddy RBE</a>, and the following actions were taken:</p> <ul class="wp-block-list"> <li>Decommissioned the old Gerrit CI server.</li> <li>Configured Gerrit CI to support both core and non-core plugin jobs, ensuring external visibility.</li> <li>Unregistered the Gerrit verification RBE GCP Build/Tests on gerrit-review.googlesource.com.</li> </ul> <p><strong>Figure 9: Default Architecture diagram with BuildBuddy CI/CD flow as default CI/CD flow</strong>:</p> <figure class="wp-block-image size-large is-resized"><a href="https://gitenterprise.me/wp-content/uploads/2024/06/blog-architectural-diagram-migration-completed-2.png"><img data-attachment-id="2698" data-permalink="https://gitenterprise.me/2024/06/26/gerrit-code-review-rbe-moving-to-buildbuddy-on-prem/blog-architectural-diagram-migration-completed-2/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/06/blog-architectural-diagram-migration-completed-2.png" data-orig-size="1070,1160" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="blog-architectural-diagram-migration-completed-2" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/06/blog-architectural-diagram-migration-completed-2.png?w=277" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/06/blog-architectural-diagram-migration-completed-2.png?w=584" loading="lazy" width="945" height="1024" src="https://gitenterprise.me/wp-content/uploads/2024/06/blog-architectural-diagram-migration-completed-2.png?w=945" alt="" class="wp-image-2698" style="width:763px;height:auto" srcset="https://gitenterprise.me/wp-content/uploads/2024/06/blog-architectural-diagram-migration-completed-2.png?w=945 945w, https://gitenterprise.me/wp-content/uploads/2024/06/blog-architectural-diagram-migration-completed-2.png?w=138 138w, https://gitenterprise.me/wp-content/uploads/2024/06/blog-architectural-diagram-migration-completed-2.png?w=277 277w, https://gitenterprise.me/wp-content/uploads/2024/06/blog-architectural-diagram-migration-completed-2.png?w=768 768w, https://gitenterprise.me/wp-content/uploads/2024/06/blog-architectural-diagram-migration-completed-2.png 1070w" sizes="(max-width: 945px) 100vw, 945px" /></a></figure> <h2 class="wp-block-heading">Final Conclusions</h2> <p>Following the completion of the migration, data on BuildBuddy RBE was collected from May 1, 2024, to June 24, 2024, to validate all assumptions. Subsequent statistical analysis yielded the following results:</p> <p><strong>Figure 10: Successful Builds:</strong></p> <figure class="wp-block-image size-large is-resized"><a href="https://gitenterprise.me/wp-content/uploads/2024/06/image-2.png"><img data-attachment-id="2755" data-permalink="https://gitenterprise.me/2024/06/26/gerrit-code-review-rbe-moving-to-buildbuddy-on-prem/image-4/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/06/image-2.png" data-orig-size="1200,742" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/06/image-2.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/06/image-2.png?w=584" loading="lazy" width="1024" height="633" src="https://gitenterprise.me/wp-content/uploads/2024/06/image-2.png?w=1024" alt="" class="wp-image-2755" style="width:883px;height:auto" srcset="https://gitenterprise.me/wp-content/uploads/2024/06/image-2.png?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2024/06/image-2.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/06/image-2.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/06/image-2.png?w=768 768w, https://gitenterprise.me/wp-content/uploads/2024/06/image-2.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <figure class="wp-block-table is-style-stripes"><table class="has-fixed-layout"><tbody><tr><td><strong>Builds</strong></td><td>465</td><td></td></tr><tr><td><strong>Mean</strong></td><td>13.62 min</td><td></td></tr><tr><td><strong>Median</strong></td><td>10.47 min</td><td></td></tr><tr><td><strong>Standard dev</strong></td><td>10.79 min</td><td>A higher standard deviation indicates that the build times are spread out over a wide range, meaning there is a lot of variability in the times</td></tr><tr><td><strong>Q3</strong></td><td>15.23 min</td><td>75% of builds are completed in less than 15.23 minutes.</td></tr></tbody></table></figure> <p><strong>Figure 11: Failed Builds:</strong></p> <figure class="wp-block-image size-large is-resized"><a href="https://gitenterprise.me/wp-content/uploads/2024/06/image.png"><img data-attachment-id="2750" data-permalink="https://gitenterprise.me/2024/06/26/gerrit-code-review-rbe-moving-to-buildbuddy-on-prem/image-2/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/06/image.png" data-orig-size="1200,742" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/06/image.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/06/image.png?w=584" loading="lazy" width="1024" height="633" src="https://gitenterprise.me/wp-content/uploads/2024/06/image.png?w=1024" alt="" class="wp-image-2750" style="width:889px;height:auto" srcset="https://gitenterprise.me/wp-content/uploads/2024/06/image.png?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2024/06/image.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/06/image.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/06/image.png?w=768 768w, https://gitenterprise.me/wp-content/uploads/2024/06/image.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <figure class="wp-block-table is-style-stripes"><table class="has-fixed-layout"><tbody><tr><td><strong>Builds</strong></td><td>105</td><td></td></tr><tr><td><strong>Mean</strong></td><td>7.72 min</td><td></td></tr><tr><td><strong>Median</strong></td><td>6.22 min</td><td></td></tr><tr><td><strong>Standard dev</strong></td><td>7.56 min</td><td></td></tr><tr><td><strong>Q3</strong></td><td>7.7 min</td><td>75% of builds are completed in less than 7.7 minutes.</td></tr></tbody></table></figure> <p>While we are satisfied with our current results, we recognize the need for improvements in our successful builds. Our next step will be to analyze all the build data provided by the BuildBuddy dashboard, including target-level metrics, timing, artifacts, cache, and executions. This analysis will help us enhance the Bazel configuration and improve build performance.</p> <p><strong>Figure 12: BuildBuddy dashboard</strong></p> <figure class="wp-block-image size-large is-resized"><a href="https://gitenterprise.me/wp-content/uploads/2024/06/screenshot-2024-06-26-at-13.45.24.png"><img data-attachment-id="2762" data-permalink="https://gitenterprise.me/2024/06/26/gerrit-code-review-rbe-moving-to-buildbuddy-on-prem/screenshot-2024-06-26-at-13-45-24/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/06/screenshot-2024-06-26-at-13.45.24.png" data-orig-size="2534,1211" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Screenshot 2024-06-26 at 13.45.24" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/06/screenshot-2024-06-26-at-13.45.24.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/06/screenshot-2024-06-26-at-13.45.24.png?w=584" loading="lazy" width="1024" height="489" src="https://gitenterprise.me/wp-content/uploads/2024/06/screenshot-2024-06-26-at-13.45.24.png?w=1024" alt="" class="wp-image-2762" style="width:743px;height:auto" srcset="https://gitenterprise.me/wp-content/uploads/2024/06/screenshot-2024-06-26-at-13.45.24.png?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2024/06/screenshot-2024-06-26-at-13.45.24.png?w=2046 2046w, https://gitenterprise.me/wp-content/uploads/2024/06/screenshot-2024-06-26-at-13.45.24.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/06/screenshot-2024-06-26-at-13.45.24.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/06/screenshot-2024-06-26-at-13.45.24.png?w=768 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <hr class="wp-block-separator has-alpha-channel-opacity" /> <p><em>Alvaro Vilaplana-Garcia &#8211; Gerrit Code Review Contributor<br>Luca Milanesio &#8211; Gerrit Code Review Maintainer and Release Manager</em></p> <p></p> </div><!-- .entry-content --> <footer class="entry-meta"> <span class="cat-links"> <span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://gitenterprise.me/category/bazel/" rel="category tag">bazel</a> </span> <span class="sep"> | </span> <span class="tag-links"> <span class="entry-utility-prep entry-utility-prep-tag-links">Tagged</span> <a href="https://gitenterprise.me/tag/buildbuddy/" rel="tag">buildbuddy</a>, <a href="https://gitenterprise.me/tag/cicd/" rel="tag">cicd</a>, <a href="https://gitenterprise.me/tag/cloud/" rel="tag">cloud</a>, <a href="https://gitenterprise.me/tag/devops/" rel="tag">DevOps</a>, <a href="https://gitenterprise.me/tag/jenkinsci/" rel="tag">jenkinsci</a>, <a href="https://gitenterprise.me/tag/software-development/" rel="tag">software-development</a> </span> <span class="sep"> | </span> <span class="comments-link"><a href="https://gitenterprise.me/2024/06/26/gerrit-code-review-rbe-moving-to-buildbuddy-on-prem/#respond"><span class="leave-reply">Leave a reply</span></a></span> </footer><!-- .entry-meta --> </article><!-- #post-2558 --> <article id="post-2546" class="post-2546 post type-post status-publish format-standard hentry category-gerrit category-summit category-user-summit tag-business tag-conferences tag-events tag-marketing tag-news"> <header class="entry-header"> <h1 class="entry-title"><a href="https://gitenterprise.me/2024/01/24/gerrit-user-summit-2023-recap-and-survey-results/" rel="bookmark">Gerrit User Summit 2023 – Recap and Survey&nbsp;Results</a></h1> <div class="entry-meta"> <span class="sep">Posted on </span><a href="https://gitenterprise.me/2024/01/24/gerrit-user-summit-2023-recap-and-survey-results/" title="8:57 am" rel="bookmark"><time class="entry-date" datetime="2024-01-24T08:57:41+00:00">January 24, 2024</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://gitenterprise.me/author/yolandajasso/" title="View all posts by Yolanda L Jasso" rel="author">Yolanda L Jasso</a></span></span> </div><!-- .entry-meta --> <div class="comments-link"> <a href="https://gitenterprise.me/2024/01/24/gerrit-user-summit-2023-recap-and-survey-results/#respond"><span class="leave-reply">Reply</span></a> </div> </header><!-- .entry-header --> <div class="entry-content"> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2024/01/gerrit-user-summit-2023-gothenburg.jpg"><img data-attachment-id="2551" data-permalink="https://gitenterprise.me/2024/01/24/gerrit-user-summit-2023-recap-and-survey-results/gerrit-user-summit-2023-gothenburg/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/01/gerrit-user-summit-2023-gothenburg.jpg" data-orig-size="1920,1080" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="gerrit-user-summit-2023-gothenburg" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/01/gerrit-user-summit-2023-gothenburg.jpg?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/01/gerrit-user-summit-2023-gothenburg.jpg?w=584" loading="lazy" width="1024" height="576" src="https://gitenterprise.me/wp-content/uploads/2024/01/gerrit-user-summit-2023-gothenburg.jpg?w=1024" alt="" class="wp-image-2551" srcset="https://gitenterprise.me/wp-content/uploads/2024/01/gerrit-user-summit-2023-gothenburg.jpg?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2024/01/gerrit-user-summit-2023-gothenburg.jpg?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/01/gerrit-user-summit-2023-gothenburg.jpg?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/01/gerrit-user-summit-2023-gothenburg.jpg?w=768 768w, https://gitenterprise.me/wp-content/uploads/2024/01/gerrit-user-summit-2023-gothenburg.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <p>The <a href="https://gerrit.googlesource.com/summit/2023/+/refs/heads/master/index.md" target="_blank" rel="noreferrer noopener"><strong>Gerrit User Summit 2023</strong></a> took place in-person simultaneously in Sunnyvale, California on September 30th and in Gothenburg, Sweden until October 1st 2023. To accommodate the global community, it was live streamed on <a href="https://tv.gerritforge.com" target="_blank" rel="noreferrer noopener">GerritForge TV</a> so that individuals in various locations could participate, share their experiences, and contribute their ideas.</p> <p>If you were unable to attend the Summit, you can find all the&nbsp;<a href="https://www.gerritcodereview.com/presentations.html">presentations and content online</a>&nbsp;. Additionally, recordings of the presentations and Q&amp;A sessions can be accessed on&nbsp;<a href="https://tv.gerritforge.com/">GerritForge’s TV channel on YouTube</a>.</p> <h1 class="wp-block-heading" id="stats-and-attendee-feedback-around-the-2023-summit">Stats and attendee feedback around the 2023 Summit</h1> <p><strong>Snapshot</strong></p> <ul class="wp-block-list"> <li>2 days</li> <li>2 locations</li> <li>84 registrations</li> <li>over 70% attendance</li> <li>34 companies</li> <li>16 sessions</li> <li>18 presenters from 8 organisations</li> </ul> <p>Despite the challenges posed by the time difference, the community still got involved showing its commitment.</p> <h1 class="wp-block-heading" id="what-is-the-opinion-about-the-summit">What is the opinion about the Summit?</h1> <p>A survey was sent to all of the attendees on both locations and even though there was a 30% response rate in USA and 17% in Sweden we delved into the details, and these are the comments received:</p> <h3 class="wp-block-heading">Q1: How would you rate the Gerrit User Summit 2023 edition?</h3> <figure class="wp-block-image"><img src="https://www.gerritcodereview.com/images/sweden.png" alt="GUS 2023 - Rate - Sweden" title="GUS 2023 - Rate - Sweden" /></figure> <p></p> <figure class="wp-block-image"><img src="https://www.gerritcodereview.com/images/usa.png" alt="GUS 2023 - Rate - USA" title="GUS 2023 - Rate - USA" /></figure> <p>While in USA, 9% of the respondents rated their experience at a 10, 55% rated it at a 9 and 36% gave an 8; in Sweden the great majority rated it with an 8. Where 10 was the highest positive rate, this feedback gives an idea of how satisfied attendees were in general with the User Summit. Understanding individual experiences and perceptions allows us to evaluate the event and identify areas for improvement.<a href="https://www.gerritcodereview.com/2023-11-18-gus-2023-surevey-results.html#q2-what-did-you-like-the-most-about-the-2023-summit"></a></p> <h3 class="wp-block-heading" id="q2-what-did-you-like-the-most-about-the-2023-summit">Q2: What did you like the most about the 2023 Summit?<a href="https://www.gerritcodereview.com/2023-11-18-gus-2023-surevey-results.html#q2-what-did-you-like-the-most-about-the-2023-summit"></a></h3> <p>Attendees in California were thoroughly impressed with the <strong>technical excellence of the talks</strong> at the event and appreciated the <strong>valuable networking opportunities</strong>. On the other hand, <strong>Gothenburg attendees raved about the fantastic space and location of the venue</strong>. They found the off-camera discussions, presentations, and Q&amp;A sessions incredibly interesting and enjoyable. Thought the use of <a href="https://www.slido.com/" target="_blank" rel="noreferrer noopener">Slido</a> for Q&amp;A was highly effective, giving attendees ample time to contemplate and engage with the speakers.</p> <p>They also loved hearing <em>organisations share their stories</em> and the <em>collaborative atmosphere</em> for creating new design documents and proof-of-concept code. The attendees were left with the impression that the <strong>event brought together a multitude of talented individuals</strong> who delivered <strong>engaging talks</strong>. The event left high expectations for upcoming features and created an enthusiastic, positive atmosphere.They truly valued the chance to engage with fellow attendees and found the experience rewarding.</p> <h3 class="wp-block-heading" id="q3-what-did-you-not-like-about-the-2023-summit">Q3: What did you not like about the 2023 Summit?<a href="https://www.gerritcodereview.com/2023-11-18-gus-2023-surevey-results.html#q3-what-did-you-not-like-about-the-2023-summit"></a></h3> <p>Attendees from both locations expressed their <em>concern about the division of the summit into two locations and time zones</em>, which made it challenging to connect with the entire group. While the idea of having simultaneous locations was appreciated, attendees in Gothenburg felt disadvantaged as they were unable to ask live questions to presenters due to the time difference with the USA. It was recommended <em>not to repeat this approach in future events</em>. However, overall, the attendees had a positive experience at the summit. They <strong>expressed their wish for Google to attend in the future</strong> and highlighted a missing feature in Slide that would allow for the separation of topics in questions.</p> <p>Some <strong>attendees preferred the event to be held on weekdays rather than weekends</strong>, as it affected their personal time. Additionally, they expressed a <em>preference for more user/project-driven success stories</em>, as opposed to focusing solely on development and administrative topics. Some attendees also noted that there was a lack of diversity in the companies present. In Gothenburg in particular, they suggested choosing a venue with less noise for dinner to facilitate networking. Lastly, it was reported that the attendance felt to be relatively low especially in Gothenburg where the venue could have hosted hundreds of attendees.</p> <h3 class="wp-block-heading" id="q4-what-was-your-main-objective-in-attending-the-summit">Q4: What was your main objective in attending the Summit?<a href="https://www.gerritcodereview.com/2023-11-18-gus-2023-surevey-results.html#q4-what-was-your-main-objective-in-attending-the-summit"></a></h3> <p>The attendees had two main objectives in mind: learning and networking. Going into further detail, they expressed various specific goals, including <strong>sharing research findings and enticing potential industrial partnerships</strong>. They were also keen on staying updated with the latest developments in the Gerrit ecosystem and gaining insights into how Gerrit is utilized within the community. <strong>Meeting people face-to-face was highly valued</strong>, as it provided a more personal and direct means of communication compared to email or Discord. Additionally, attendees wished to actively participate in the open-source Gerrit community and discover new directions for the product. Some mentioned that they <em>were excited about the opportunity to listen to James Blair</em>. For some attendees, the event offered a chance to reconnect with Gerrit after a period of absence. Some emphasised in the fact that fostering a positive open-source software community was a shared aspiration, alongside the desire to learn about how organisations utilise Gerrit in their processes. Overall, the attendees were motivated to make the most of the event, seeking knowledge exchange and valuable connections.</p> <h3 class="wp-block-heading" id="q5-do-you-consider-to-have-achieved-the-objective">Q5: Do you consider to have achieved the objective?<a href="https://www.gerritcodereview.com/2023-11-18-gus-2023-surevey-results.html#q5-do-you-consider-to-have-achieved-the-objective"></a></h3> <p>A decisive <strong>100% said to have achieved their goal </strong>by attending the Summit.</p> <h1 class="wp-block-heading" id="reactivating-the-gerrit-community">Reactivating the Gerrit community</h1> <p>Given the initiative to create a <strong>group of monthly in-person meet-ups</strong> (<a href="https://www.meetup.com/gerritmeets/">GerritMeets</a>) to revive the community in the Bay Area (CA), in-person attendees at the summit in Sunnyvale, CA, were asked about their topics of interest, if they would attend in person, remotely live or watch the recorded content afterwards, and if they would participate by giving a talk.</p> <p>Respondents agreed 100% that they would be willing to give a talk. They differed in the mode of attendance, as opinions were evenly divided between attending in person, joining remotely via live streaming, and accessing the recorded content after the meetup. The suggested topics were:</p> <ul class="wp-block-list"> <li><a href="https://youtu.be/_Pcx_aMyZVw?si=yU2peuHHcKmuIeYZ">‘How to write a scripting plugin in Gerrit’</a>, </li> <li>‘Getting started with pull-replication and multi-site’, </li> <li>‘Research on code review’.</li> </ul> <p>The invitation to these periodic meetings was extended to the global community and when asked for topics of interest, the topic ‘Hacking’ was added.</p> <h1 class="wp-block-heading" id="whats-next-for-2024">What’s next for 2024?</h1> <ul class="wp-block-list"> <li><a href="https://www.meetup.com/gerritmeets/" target="_blank" rel="noreferrer noopener">GerritMeets</a> will start every month in 2024, from February. GerritMeets is periodic in-person meetup in the Bay Area, with the intention to live stream, so the global community can join as listener as well as with a talk, so everybody can learn &amp; share knowledge and experience.</li> <li>With Gerrit&nbsp;<a href="https://www.gerritcodereview.com/3.9.html">3.9 been released</a>&nbsp;in November 2023, 2024 will be the year of Gerrit 3.10, in May, and 3.11, in November.</li> <li><strong>Gerrit User Summit will be back in the autumn of 2024</strong> with more interesting talks from the community</li> </ul> <p>A genuine thank you goes out to all the participants and presenters who made the Gerrit Virtual User Summit 2023 a great success. We look forward to another exciting and even more engaging get-together next year in 2024!</p> <p><em>Yolanda Jasso</em><br>Gerrit Code Review &#8211; Community Manager</p> <p></p> </div><!-- .entry-content --> <footer class="entry-meta"> <span class="cat-links"> <span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://gitenterprise.me/category/gerrit/" rel="category tag">gerrit</a>, <a href="https://gitenterprise.me/category/summit/" rel="category tag">summit</a>, <a href="https://gitenterprise.me/category/user-summit/" rel="category tag">user summit</a> </span> <span class="sep"> | </span> <span class="tag-links"> <span class="entry-utility-prep entry-utility-prep-tag-links">Tagged</span> <a href="https://gitenterprise.me/tag/business/" rel="tag">business</a>, <a href="https://gitenterprise.me/tag/conferences/" rel="tag">conferences</a>, <a href="https://gitenterprise.me/tag/events/" rel="tag">Events</a>, <a href="https://gitenterprise.me/tag/marketing/" rel="tag">marketing</a>, <a href="https://gitenterprise.me/tag/news/" rel="tag">news</a> </span> <span class="sep"> | </span> <span class="comments-link"><a href="https://gitenterprise.me/2024/01/24/gerrit-user-summit-2023-recap-and-survey-results/#respond"><span class="leave-reply">Leave a reply</span></a></span> </footer><!-- .entry-meta --> </article><!-- #post-2546 --> <article id="post-2474" class="post-2474 post type-post status-publish format-standard hentry tag-ai tag-devops tag-gerrit-code-review tag-git tag-github tag-metrics tag-programming tag-software-development"> <header class="entry-header"> <h1 class="entry-title"><a href="https://gitenterprise.me/2024/01/02/gerritforge-looks-at-a-bright-ai-future-in-2024/" rel="bookmark">GerritForge looks at a bright AI future in&nbsp;2024</a></h1> <div class="entry-meta"> <span class="sep">Posted on </span><a href="https://gitenterprise.me/2024/01/02/gerritforge-looks-at-a-bright-ai-future-in-2024/" title="12:52 am" rel="bookmark"><time class="entry-date" datetime="2024-01-02T00:52:19+00:00">January 2, 2024</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://gitenterprise.me/author/gitenterprise/" title="View all posts by Git and Gerrit Code Review for the Enterprise" rel="author">Git and Gerrit Code Review for the Enterprise</a></span></span> </div><!-- .entry-meta --> <div class="comments-link"> <a href="https://gitenterprise.me/2024/01/02/gerritforge-looks-at-a-bright-ai-future-in-2024/#respond"><span class="leave-reply">Reply</span></a> </div> </header><!-- .entry-header --> <div class="entry-content"> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2024/01/gerritforge.2024.resolution.png"><img data-attachment-id="2475" data-permalink="https://gitenterprise.me/2024/01/02/gerritforge-looks-at-a-bright-ai-future-in-2024/gerritforge-2024-resolution/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/01/gerritforge.2024.resolution.png" data-orig-size="1792,1024" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="gerritforge.2024.resolution" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/01/gerritforge.2024.resolution.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/01/gerritforge.2024.resolution.png?w=584" loading="lazy" width="1024" height="585" src="https://gitenterprise.me/wp-content/uploads/2024/01/gerritforge.2024.resolution.png?w=1024" alt="" class="wp-image-2475" srcset="https://gitenterprise.me/wp-content/uploads/2024/01/gerritforge.2024.resolution.png?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2024/01/gerritforge.2024.resolution.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/01/gerritforge.2024.resolution.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/01/gerritforge.2024.resolution.png?w=768 768w, https://gitenterprise.me/wp-content/uploads/2024/01/gerritforge.2024.resolution.png 1792w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <h2 class="wp-block-heading">Looking back at 2023 in numbers</h2> <p>It has been an outstanding year for <a href="https://www.gerritforge.com" target="_blank" rel="noreferrer noopener">GerritForge</a> and <a href="https://www.gerritcodereview.com" target="_blank" rel="noreferrer noopener">Gerrit Code Review</a> in 2023, with excellent achievements on our <a href="https://gitenterprise.me/2023/01/13/2023-new-year-and-opportunities-for-gerritforge-and-gerrit-code-review/">2023 GOALS</a>. </p> <p>The numbers show the GerritForge commitment throughout the past 12 months:</p> <ul class="wp-block-list"> <li><strong>853 changes</strong> merged (26% of the whole project contributions)</li> <li><strong>47 projects</strong>, including Gerrit, JGit and major core and non-core plugins</li> <li><strong>12 contributors</strong></li> <li><strong>4 maintainers</strong>, including the Gerrit Code Review release manager</li> <li><strong>4 Gerrit community events</strong>, including the <a href="https://gerrit.googlesource.com/summit/2023/+/refs/heads/master/index.md" target="_blank" rel="noreferrer noopener">Gerrit User Summit 2023</a> and <a href="https://www.meetup.com/gerritmeets/" target="_blank" rel="noreferrer noopener">GerritMeets</a></li> </ul> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2024/01/project.contributions-1.png"><img data-attachment-id="2480" data-permalink="https://gitenterprise.me/2024/01/02/gerritforge-looks-at-a-bright-ai-future-in-2024/project-contributions-1/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/01/project.contributions-1.png" data-orig-size="1920,1080" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="project.contributions-1" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/01/project.contributions-1.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/01/project.contributions-1.png?w=584" loading="lazy" width="1024" height="576" src="https://gitenterprise.me/wp-content/uploads/2024/01/project.contributions-1.png?w=1024" alt="" class="wp-image-2480" srcset="https://gitenterprise.me/wp-content/uploads/2024/01/project.contributions-1.png?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2024/01/project.contributions-1.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/01/project.contributions-1.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/01/project.contributions-1.png?w=768 768w, https://gitenterprise.me/wp-content/uploads/2024/01/project.contributions-1.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <h2 class="wp-block-heading">Top #5 projects&#8217; contributions</h2> <p><a href="https://www.gerritforge.com" target="_blank" rel="noreferrer noopener">GerritForge</a> has confirmed over 2023 its commitment to the <a href="https://www.gerritcodereview.com" target="_blank" rel="noreferrer noopener">Gerrit Code Review</a> platforming, helping deliver two major releases: Gerrit v3.8 and v3.9.</p> <p>The <a href="https://analytics.gerrithub.io/kibana/s/gerritcodereview/goto/f5f744ef7e4bf16e9f51f4d3ec6d3654" target="_blank" rel="noreferrer noopener">major contributions</a> combined are focused on the plugins for extending the reach of the Gerrit platform, first and foremost the <a href="https://gerrit.googlesource.com/plugins/pull-replication/+/refs/heads/master" target="_blank" rel="noreferrer noopener">pull-replication</a> and <a href="https://gerrit.googlesource.com/plugins/multi-site/+/refs/heads/master" target="_blank" rel="noreferrer noopener">multi-site</a>, as shown by the split of the <strong>853 contributions across the projects</strong>, weighted by the number of changes and average modifications per change.</p> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2024/01/projects.contributions.2023.png"><img data-attachment-id="2484" data-permalink="https://gitenterprise.me/2024/01/02/gerritforge-looks-at-a-bright-ai-future-in-2024/projects-contributions-2023/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/01/projects.contributions.2023.png" data-orig-size="1920,1080" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="projects.contributions.2023" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/01/projects.contributions.2023.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/01/projects.contributions.2023.png?w=584" loading="lazy" width="1024" height="576" src="https://gitenterprise.me/wp-content/uploads/2024/01/projects.contributions.2023.png?w=1024" alt="" class="wp-image-2484" srcset="https://gitenterprise.me/wp-content/uploads/2024/01/projects.contributions.2023.png?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2024/01/projects.contributions.2023.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/01/projects.contributions.2023.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/01/projects.contributions.2023.png?w=768 768w, https://gitenterprise.me/wp-content/uploads/2024/01/projects.contributions.2023.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <ol class="wp-block-list"> <li><strong><a href="https://gerrit.googlesource.com/plugins/pull-replication/+/refs/heads/master" target="_blank" rel="noreferrer noopener">Pull replication plugin</a></strong><br>This is where GerritForge excelled in providing an unprecedented level of performance over anything that has been built so far in terms of Git replication for Gerrit. Roughly one-third of the Team efforts have contributed to the pull replication plugin, which provided over 2022/23 a 1000x speedup factor compared to Gerrit tradition factor. GerritForge has further improved its stability, resilience and self-healing capabilities thanks to a fully distributed and pluggable message broker system.</li> <li><strong>Gerrit <a href="https://gerritcodereview.com/3.8.html" target="_blank" rel="noreferrer noopener">v3.8</a> and <a href="http://gerritcodereview.com/3.9.html" target="_blank" rel="noreferrer noopener">v3.9</a></strong><br>GerritForge helped release two major versions of Gerrit Code Review, contributing noteworthy features like Java 17 support, cross-plugin communication, importing of projects across instances and the migration to Bazel 7.</li> <li><strong><a href="https://gerrit.googlesource.com/plugins/owners/+/refs/heads/master" target="_blank" rel="noreferrer noopener">Owners plugin</a></strong><br>Jacek has completely revamped the engine of the owners plugin, boosting it with an unprecedented level of performance, hundreds of times faster than in the previous release, and bringing it to the modernity of submit requirements without the need to write any Prolog rules.</li> <li><strong><a href="https://gerrit.googlesource.com/plugins/multi-site/+/refs/heads/master" target="_blank" rel="noreferrer noopener">Multi-site plugin</a></strong><br>The whole team helped provide more stability and bug fixes across multiple versions of Gerrit, from v3.4 up to the latest v3.9.</li> <li><strong><a href="https://eclipse.gerrithub.io/plugins/gitiles/eclipse-jgit/jgit/+/refs/heads/master" target="_blank" rel="noreferrer noopener">JGit</a></strong><br>GerritForge kept its promises in stepping up its efforts in getting important fixes merged, including the optimisation of the refs scanning in Git Protocol v2 and the fix for bitmap processing with incoming Git receive-pack concurrency that we promised to fix at the beginning of 2023.</li> </ol> <h2 class="wp-block-heading">Migration of Eclipse JGit/EGit to GerritHub.io</h2> <p>The 2023 has also seen a major improvement in GerritHub stability and availability, halving the total outage in a 12-month period from 19 to 10 minutes, with a total<strong> uptime of 99.998%</strong> (source: PIngdom.com)</p> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2024/01/gerrithub.io_.uptime.new_.png"><img data-attachment-id="2491" data-permalink="https://gitenterprise.me/2024/01/02/gerritforge-looks-at-a-bright-ai-future-in-2024/gerrithub-io_-uptime-new_/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/01/gerrithub.io_.uptime.new_.png" data-orig-size="1662,818" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="gerrithub.io_.uptime.new_" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/01/gerrithub.io_.uptime.new_.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/01/gerrithub.io_.uptime.new_.png?w=584" loading="lazy" width="1024" height="503" src="https://gitenterprise.me/wp-content/uploads/2024/01/gerrithub.io_.uptime.new_.png?w=1024" alt="" class="wp-image-2491" srcset="https://gitenterprise.me/wp-content/uploads/2024/01/gerrithub.io_.uptime.new_.png?w=1022 1022w, https://gitenterprise.me/wp-content/uploads/2024/01/gerrithub.io_.uptime.new_.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/01/gerrithub.io_.uptime.new_.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/01/gerrithub.io_.uptime.new_.png?w=768 768w, https://gitenterprise.me/wp-content/uploads/2024/01/gerrithub.io_.uptime.new_.png 1662w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <p>With the increased stability plus the new features of projects imports since v3.7, the <a href="https://gitenterprise.me/2023/11/21/14-years-of-jgit-egit-code-reviews-migrated-to-gerrithub/">Eclipse JGit and EGit projects have decided and completed their migration to GerritHub.io</a> on the 21st of November, 2023. Since then, h<span style="text-decoration: underline">undreds of changes have continued their reviews</span>, and <a href="https://eclipse.gerrithub.io/q/status:merged+-age:40d" target="_blank" rel="noreferrer noopener">62 of them have been merged on GerritHub</a>.</p> <p>The whole process was completed <strong>without any downtime and a reduced read-only window</strong> on the legacy Eclipse&#8217;s instance git.eclipse.org, which was needed because of the lack of multi-site support on the Eclipse side.</p> <h2 class="wp-block-heading">What we did achieve from our goals of 2023</h2> <ul class="wp-block-list"> <li><strong>JGit changes</strong>: we did merge 22 changes in 2023, most of them within the list of our targets for the year. One related to the packed-refs loading optimisation was abandoned (doesn&#8217;t get much traction from the rest of the community), and the last major one left is the priority queue refactoring still in progress on stable-6.6. Also, thanks to the migration of JGit/EGit to GerritHub.io, David Ostrovsky managed to get hold of its committer status and will now be able to provide more help in support in getting changes reviewed and merged.</li> <li><strong>JGit multi-pack index support:</strong> we did not have the bandwidth and focus to tackle this major improvement. The task is still open for anyone willing to help implement it.</li> <li><strong>Git repository optimiser</strong>: we kick-started the activity and researched the topic, with Ponch presenting the current status at the Gerrit User Summit 2023 in Sunnyvale CA.</li> <li><strong>Gerrit v3.8 and project-specific change numbers</strong>: the design document has been abandoned because of the need of rethinking its end-to-end user goals. However, we found and fixed many use cases where Gerrit wasn&#8217;t using the project/change-number pair for identifying changes, which is a pre-requisite for implementing any future project-specific change number use-case.</li> <li><strong>Gerrit Certified Binaries</strong>: the Platinum Enterprise Support for Gerrit has been enriched in 2023 with the certified binaries programme, with enhanced Gatling tests and E2E validation using AWS-Gerrit. Many bugs have been found and fixed in all the active versions of Gerrit; some of them were very critical and surprisingly undiscovered for months.</li> <li><strong>GerritForge Inc. revenue targets in the USA</strong>: the revenues increased by 50% in 2023, which was slightly below the initial expectations but still remarkable, despite the latest economic downturn of the past 12 months. 100% of the business has been transferred to the USA, including the GerritForge trademark and logo and we are now ready to start a new robust growth cycle in 2024 and beyond.</li> </ul> <h2 class="wp-block-heading">Looking at the future with AI in 2024</h2> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2024/01/lay-offs-season.jpg"><img data-attachment-id="2499" data-permalink="https://gitenterprise.me/2024/01/02/gerritforge-looks-at-a-bright-ai-future-in-2024/lay-offs-season/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/01/lay-offs-season.jpg" data-orig-size="1920,1080" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="lay-offs-season" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/01/lay-offs-season.jpg?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/01/lay-offs-season.jpg?w=584" loading="lazy" width="1024" height="576" src="https://gitenterprise.me/wp-content/uploads/2024/01/lay-offs-season.jpg?w=1024" alt="" class="wp-image-2499" srcset="https://gitenterprise.me/wp-content/uploads/2024/01/lay-offs-season.jpg?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2024/01/lay-offs-season.jpg?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/01/lay-offs-season.jpg?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/01/lay-offs-season.jpg?w=768 768w, https://gitenterprise.me/wp-content/uploads/2024/01/lay-offs-season.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <p>The recent economic news in the past 6 months has highlighted a <em>difficult moment after the COVID-19 pandemic</em>: the conjunction of the cost of living crisis, rising interest rates and two new major wars across the globe have pushed <em>major tech companies to revise their small to medium-term growth figures</em>, resulting in a series of <strong>waves of lay offs in the tech sector and beyond</strong>.</p> <p>Whilst the layoffs are not immediately related to a lack of profitability of the companies involved, it highlights that <strong>in the medium term there will be a lot fewer engineers looking after the production systems across the company, including SCM</strong>.</p> <p><strong>SCM and Code Review are at the heart of the software lifecycle</strong> of tech companies and, therefore, represent the most critical part of the business that would need to be <strong>protected at all costs</strong>. <a href="https://www.gerritforge.com" target="_blank" rel="noreferrer noopener">GerritForge</a> sees this change as a pivotal moment for <strong>stepping up its efforts in serving the community and helping companies to thrive with Gerrit and its Git SCM projects</strong>.</p> <h2 class="wp-block-heading">How do we maintain SCM stability with fewer people?</h2> <p><a href="https://www.gerritcodereview.com" target="_blank" rel="noreferrer noopener">Gerrit Code Review</a> has become more and more stable and reliable over the years, which should sound reassuring for all of those companies that are looking at a reduced staff and the challenge of keeping the lights on of the SCM. However, the <strong>major cause of disruption is represented by what is not linked to the SCM code but rather its data</strong>.</p> <p>The <strong>Git repositories and their status are nowadays responsible for 80% of the stability issues</strong> with Gerrit and possibly with other Git servers as well. Imagine a system that is receiving a high rate of Git traffic (e.g. Git clone) of 100 operations per minute, and the system is able to cope thanks to a very optimised repository and bitmaps. However, things may change quickly and some of the user actions (e.g. a user performing a force-push on a feature branch) could invalidate the effectiveness of the Git bitmap and the server will start accumulating a backlog of traffic.</p> <p>In a fully staffed team of SCM administrators and with all the necessary metrics and alerts in place, the above condition would trigger a specific alert that can be noticed, analysed, and actioned swiftly before anyone notices any service degradation.</p> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2024/01/system.congestion.queue_.png"><img data-attachment-id="2504" data-permalink="https://gitenterprise.me/2024/01/02/gerritforge-looks-at-a-bright-ai-future-in-2024/system-congestion-queue_/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/01/system.congestion.queue_.png" data-orig-size="2662,1450" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="system.congestion.queue_" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/01/system.congestion.queue_.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/01/system.congestion.queue_.png?w=584" loading="lazy" width="1024" height="557" src="https://gitenterprise.me/wp-content/uploads/2024/01/system.congestion.queue_.png?w=1024" alt="" class="wp-image-2504" srcset="https://gitenterprise.me/wp-content/uploads/2024/01/system.congestion.queue_.png?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2024/01/system.congestion.queue_.png?w=2045 2045w, https://gitenterprise.me/wp-content/uploads/2024/01/system.congestion.queue_.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/01/system.congestion.queue_.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/01/system.congestion.queue_.png?w=768 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <p>However, when there is a <strong>shortage of Git SCM admins</strong>, the number of metrics and alerts to keep under control could be overwhelming, and the trade-offs <strong>could leave the system congestion classified as a lower-priority problem</strong>.</p> <p>When a system congestion lasts too long, the incoming tasks queueing could reach its limits, and the users may start noticing issues. If the resource pools are too congested, the <strong>system could also start a catastrophic failure loop</strong> where the workload further reduces the fan out of the execution pool and causing soon a <strong>global outage</strong>.</p> <p>The above condition is only one example of what could happen to a Git SCM system, but not the only one. There are <strong>many variables to take into account for preventing a system from failing</strong>; the knowledge and experience of managing them is embedded in the many of the engineers that are potentially laid off, with the potential of serious consequences for the tech companies.</p> <h2 class="wp-block-heading">GerritForge brings AI to the rescue of Git SCM stability</h2> <p><a href="https://www.gerritforge.com" target="_blank" rel="noreferrer noopener">GerritForge</a> has been active in the past 14 years in making the Git SCM system more suitable for enterprises from its very first inception: <em>that&#8217;s the reason why this blog is named &#8220;GitEnterprise&#8221;</em> after all.</p> <p>We have been investing over 2022 and 2023 in analysing, gathering and exporting all the metrics of the Git repositories to the eyes and minds of the SCM administrators, thanks to open-source products like <a href="https://gerrit.googlesource.com/plugins/git-repo-metrics/+/refs/heads/master" target="_blank" rel="noreferrer noopener">Git repo-metrics plugin</a>. However, the recent economic downturn could leave all the knowledge and value of this data into a black hole if left in its current form.</p> <p>When the work of analysing, monitoring and taking action on the data becomes too overwhelming for the size of the SCM Team left after the layoffs, there are other <strong>AI-based tools that can come to the rescue</strong>. However, none of them is available<em> &#8220;out of the box&#8221; </em>and their setup, maintenance and operation could also become an impediment.</p> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2024/01/gerrit-devops-analytics.png"><img data-attachment-id="2512" data-permalink="https://gitenterprise.me/2024/01/02/gerritforge-looks-at-a-bright-ai-future-in-2024/gerrit-devops-analytics/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/01/gerrit-devops-analytics.png" data-orig-size="1906,1080" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="gerrit-devops-analytics" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/01/gerrit-devops-analytics.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/01/gerrit-devops-analytics.png?w=584" loading="lazy" width="1024" height="580" src="https://gitenterprise.me/wp-content/uploads/2024/01/gerrit-devops-analytics.png?w=1024" alt="" class="wp-image-2512" srcset="https://gitenterprise.me/wp-content/uploads/2024/01/gerrit-devops-analytics.png?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2024/01/gerrit-devops-analytics.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/01/gerrit-devops-analytics.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/01/gerrit-devops-analytics.png?w=768 768w, https://gitenterprise.me/wp-content/uploads/2024/01/gerrit-devops-analytics.png 1906w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <p>GerritForge has a historic know-how on knowledge-based systems and has been lecturing the community about data collection and analysis for many years in the Gerrit Code Review community, for example the <a href="https://gitenterprise.me/2020/05/12/crunch-code-review-hashtags-with-gerrit-devops-analytics/">Gerrit DevOps Analytics</a> initiative back in 2017. It is now the right time to push on these technologies and package them in a form that could be directly usable for all those companies who need it now.</p> <h2 class="wp-block-heading">Introducing GHS &#8211; GerritForge-AI Health Service</h2> <p>As part of our 2024 goals, <a href="https://www.gerritforge.com" target="_blank" rel="noreferrer noopener">GerritForge</a> will release a brand-new service called <a href="https://youtu.be/0_UD33aK-3o">GHS</a>, directly addressing the needs of all companies that need to have a fully automated intelligent system for collecting, analysing and acting on the Git repository metrics.</p> <p>The high-level description of the service has already been anticipated at the <a href="https://youtu.be/0_UD33aK-3o" target="_blank" rel="noreferrer noopener">Gerrit User Summit 2023 in Sunnyvale by Ponch</a> and the first release of the product is due in Q1 of 2024.</p> <h3 class="wp-block-heading">How does GHS work?</h3> <p>GHS is a <strong>multi-stage system</strong> composed of four basic processes:</p> <ol class="wp-block-list"> <li><strong>Collect the metrics</strong> of your Gerrit or <strong>other Git repositories</strong> automatically and publish them on your registry of choice (e.g. Prometheus)</li> <li><strong>Combine the repository metrics with the other metrics of the system</strong>, including the CPU, memory and system load, automatically.</li> <li><strong>Detect dangerous situations</strong> where the repository or the system is starting to struggle and suggest a series of remediation policies, using the knowledge base and experience of GerritForge&#8217;s Team encoded as part of the AI engine.</li> <li><strong>Define a direct remediation plan with suggested priorities</strong> and, if requested, act on them automatically, assessing the results.</li> </ol> <p>Stage 4, the <em>automatic execution of the suggested remediation, can be also performed in cooperation with the SCM Administrators&#8217; Team</em> as it may need to go through the company procedures for its execution, such as change-management process or communication with the business.</p> <p>However, if needed, <strong>point 4. can also be fully automated</strong> to allow GHS to act in case the SCM admins do not provide negative feedback on the proposed actions.</p> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2024/01/git-health-service-1.png"><img data-attachment-id="2531" data-permalink="https://gitenterprise.me/2024/01/02/gerritforge-looks-at-a-bright-ai-future-in-2024/git-health-service-1/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/01/git-health-service-1.png" data-orig-size="1920,1080" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="git-health-service-1" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/01/git-health-service-1.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/01/git-health-service-1.png?w=584" loading="lazy" width="1024" height="576" src="https://gitenterprise.me/wp-content/uploads/2024/01/git-health-service-1.png?w=1024" alt="" class="wp-image-2531" srcset="https://gitenterprise.me/wp-content/uploads/2024/01/git-health-service-1.png?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2024/01/git-health-service-1.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/01/git-health-service-1.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/01/git-health-service-1.png?w=768 768w, https://gitenterprise.me/wp-content/uploads/2024/01/git-health-service-1.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <h3 class="wp-block-heading">What the benefits of GHS for the SCM Team?</h3> <p><a href="https://www.youtube.com/watch?v=0_UD33aK-3o" target="_blank" rel="noreferrer noopener">GHS</a> is the natural evolution of GerritForge&#8217;s services, which have historically been proactive in the analysis of the Git SCM data and the proposal of an action plan. The GerritForge&#8217;s Health Check is a service that we have been successfully providing for years to our customers; the GerritForge Health Service is the completion of the End-to-End stability that the SCM Team needs now more than ever, to survive with a reduced workforce.</p> <ul class="wp-block-list"> <li>To the <em>SCM Administrator</em>, GHS provides the <strong>metrics, analysis and tailored recommendations</strong> in real-time.</li> <li>To the <em>Head of SCM and Release Management Team</em>, GHS gives the <strong>peace of mind of keeping the system stable</strong> with a reduced workforce.</li> <li>To the <em>SCM users and developers</em>, GHS provides a <strong>stable and responsive system throughout the day</strong>, without slowdowns or outages</li> <li>To the <em>Head of IT</em>, GHS allows to satisfy the <strong>company&#8217;s needs of costs and head count reduction without sacrificing the overall productivity</strong> of the Teams involved.</li> </ul> <h2 class="wp-block-heading">GerritForge&#8217;s pledges to Gerrit Code Review quality and Open-Source</h2> <p>GerritForge has provided Enterprise Support and free contributions to Gerrit Code Review for 14 years, pretty much since the beginning of the project. We pledged in the past to be always 100% Open-Source and do commit to our promises.</p> <p>For 2024, GerritForge will focus on delivering its promising Open-Source contributions to the stability and reliability of Gerrit Code Review, with:</p> <ul class="wp-block-list"> <li><strong>Support for the Gerrit Code Review</strong> platform releases, Gerrit v3.10 and v3.11</li> <li>Free support and development of the <strong>Gerrit CI validation process</strong>, in collaboration with all the other Gerrit Code Review contributors and maintainers</li> <li>Free <strong>Open-Source fixes for all critical problems</strong> raised by any of its <strong>Enterprise Support Customers</strong>, available to everyone in the Gerrit Code Review community</li> <li>Free <strong>Open-Source code base for the main four components of the new GHS product</strong>, following the Open-Core methodology for developing the service.</li> </ul> <p>With regards to the initiatives that we started in the past few years, including pull-replication and multi-site, we believe they have reached a maturity level that would not need further major refactoring and extensions in 2024. We will continue to support and improve them over the years, based on the feedback and support requests coming from the Enterprise Support Customers and the wider Gerrit Open-Source community.</p> <h2 class="wp-block-heading">GHS AI engine and dogfooding on GerritHub.io.</h2> <p><a href="https://www.youtube.com/watch?v=0_UD33aK-3o" target="_blank" rel="noreferrer noopener">GHS</a> will have a rule-based AI system that will drive all the main decisions on the selection and prioritisation of the corrective actions on the system. As with all AI systems, the engine will need to start with a baseline knowledge and intelligence and evolve based on the experience made on real-life systems.</p> <p><a href="https://www.gerritforge.com" target="_blank" rel="noreferrer noopener">GerritForge&#8217;s</a> commitment to quality is based on the base principle of <a href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food" target="_blank" rel="noreferrer noopener">dogfooding</a>, where we use the system <strong>we develop every single day and learn from it</strong>. The paradigm is on the basis of our 14 years of success and we are committed to using it also for the development of GHS.</p> <p>GerritForge has been hosting <a href="https://review.gerrithub.io" target="_blank" rel="noreferrer noopener">GerritHub.io</a> since 2013, and <strong>tens of thousands of people</strong> and <strong>hundreds of companies</strong> are using it for their private and Open-Source projects every single day. The system is fully self-serviced; however, still relies on manual maintenance from our Gerrit and Git SCM admins.</p> <p>We are committed to starting using GHS on <a href="https://review.gerrithub.io" target="_blank" rel="noreferrer noopener">GerritHub.io</a> from day 1 and use the metrics and learning of the systems to improve its AI rule engine continuously. All customers of GerritForge&#8217;s <a href="https://www.youtube.com/watch?v=0_UD33aK-3o" target="_blank" rel="noreferrer noopener">GHS</a> service will therefore benefit from historic knowledge and experience induced by the the learnings and optimisations made on GerritHub.io for the months and years to come.</p> <h2 class="wp-block-heading">GHS = Git SCM admins humans and AI-robots working together</h2> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2024/01/firefly-software-developer-and-robot-working-together-38063.jpg"><img data-attachment-id="2534" data-permalink="https://gitenterprise.me/2024/01/02/gerritforge-looks-at-a-bright-ai-future-in-2024/firefly-software-developer-and-robot-working-together-38063/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2024/01/firefly-software-developer-and-robot-working-together-38063.jpg" data-orig-size="2688,1536" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="firefly-software-developer-and-robot-working-together-38063" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2024/01/firefly-software-developer-and-robot-working-together-38063.jpg?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2024/01/firefly-software-developer-and-robot-working-together-38063.jpg?w=584" loading="lazy" width="1024" height="585" src="https://gitenterprise.me/wp-content/uploads/2024/01/firefly-software-developer-and-robot-working-together-38063.jpg?w=1024" alt="" class="wp-image-2534" srcset="https://gitenterprise.me/wp-content/uploads/2024/01/firefly-software-developer-and-robot-working-together-38063.jpg?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2024/01/firefly-software-developer-and-robot-working-together-38063.jpg?w=2048 2048w, https://gitenterprise.me/wp-content/uploads/2024/01/firefly-software-developer-and-robot-working-together-38063.jpg?w=150 150w, https://gitenterprise.me/wp-content/uploads/2024/01/firefly-software-developer-and-robot-working-together-38063.jpg?w=300 300w, https://gitenterprise.me/wp-content/uploads/2024/01/firefly-software-developer-and-robot-working-together-38063.jpg?w=768 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <p><strong><a href="https://www.youtube.com/watch?v=0_UD33aK-3o" target="_blank" rel="noreferrer noopener">GHS</a></strong> will <strong>revolutionise the way Git SCM admins are managing the system today</strong>: they will not be alone anymore, juggling a series of tools to understand what&#8217;s going on, but they will have an <strong>intelligent and expert robot at their service</strong>, driven by the <em>wisdom</em> and <em>continuous learnings made by GerritForge</em>, at their service every single day.</p> <p>We expect a different future way of working in front of us: we are <strong>embracing this radical change in how people and companies work</strong> and making <strong>GHS serve them effectively and in line with our Open-Source pledges</strong>.</p> <p>The <strong>future is bright with GerritForge-AI Health Service</strong>, Git and <strong>Gerrit Code Review</strong> at your service !</p> <hr class="wp-block-separator has-alpha-channel-opacity" /> <p><em><a href="https://www.linkedin.com/in/lucamilanesio" target="_blank" rel="noreferrer noopener">Luca Milanesio</a></em><br><a href="https://www.gerritforge.com" target="_blank" rel="noreferrer noopener">GerritForge</a> CEO<br><em>Gerrit Code Review Release Manager and member of the Engineering Steering Committee</em></p> </div><!-- .entry-content --> <footer class="entry-meta"> <span class="cat-links"> <span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> Uncategorized </span> <span class="sep"> | </span> <span class="tag-links"> <span class="entry-utility-prep entry-utility-prep-tag-links">Tagged</span> <a href="https://gitenterprise.me/tag/ai/" rel="tag">AI</a>, <a href="https://gitenterprise.me/tag/devops/" rel="tag">DevOps</a>, <a href="https://gitenterprise.me/tag/gerrit-code-review/" rel="tag">gerrit code review</a>, <a href="https://gitenterprise.me/tag/git/" rel="tag">git</a>, <a href="https://gitenterprise.me/tag/github/" rel="tag">github</a>, <a href="https://gitenterprise.me/tag/metrics/" rel="tag">metrics</a>, <a href="https://gitenterprise.me/tag/programming/" rel="tag">programming</a>, <a href="https://gitenterprise.me/tag/software-development/" rel="tag">software-development</a> </span> <span class="sep"> | </span> <span class="comments-link"><a href="https://gitenterprise.me/2024/01/02/gerritforge-looks-at-a-bright-ai-future-in-2024/#respond"><span class="leave-reply">Leave a reply</span></a></span> </footer><!-- .entry-meta --> </article><!-- #post-2474 --> <article id="post-2379" class="post-2379 post type-post status-publish format-standard hentry category-eclipse category-jgit-2 category-migration category-multi-site tag-eclipse"> <header class="entry-header"> <h1 class="entry-title"><a href="https://gitenterprise.me/2023/11/21/14-years-of-jgit-egit-code-reviews-migrated-to-gerrithub/" rel="bookmark">14 years of JGit/EGit Code Reviews migrated to&nbsp;GerritHub</a></h1> <div class="entry-meta"> <span class="sep">Posted on </span><a href="https://gitenterprise.me/2023/11/21/14-years-of-jgit-egit-code-reviews-migrated-to-gerrithub/" title="1:13 pm" rel="bookmark"><time class="entry-date" datetime="2023-11-21T13:13:55+00:00">November 21, 2023</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://gitenterprise.me/author/gitenterprise/" title="View all posts by Git and Gerrit Code Review for the Enterprise" rel="author">Git and Gerrit Code Review for the Enterprise</a></span></span> </div><!-- .entry-meta --> <div class="comments-link"> <a href="https://gitenterprise.me/2023/11/21/14-years-of-jgit-egit-code-reviews-migrated-to-gerrithub/#respond"><span class="leave-reply">Reply</span></a> </div> </header><!-- .entry-header --> <div class="entry-content"> <figure class="wp-block-image size-large is-style-default"><a href="https://gitenterprise.me/wp-content/uploads/2023/11/firefly_9c8f6781-a3b7-49c1-9dc7-45d7c1e875ea.jpeg"><img data-attachment-id="2380" data-permalink="https://gitenterprise.me/2023/11/21/14-years-of-jgit-egit-code-reviews-migrated-to-gerrithub/firefly_9c8f6781-a3b7-49c1-9dc7-45d7c1e875ea/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2023/11/firefly_9c8f6781-a3b7-49c1-9dc7-45d7c1e875ea.jpeg" data-orig-size="1792,1024" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="firefly_9c8f6781-a3b7-49c1-9dc7-45d7c1e875ea" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2023/11/firefly_9c8f6781-a3b7-49c1-9dc7-45d7c1e875ea.jpeg?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2023/11/firefly_9c8f6781-a3b7-49c1-9dc7-45d7c1e875ea.jpeg?w=584" loading="lazy" width="1024" height="585" src="https://gitenterprise.me/wp-content/uploads/2023/11/firefly_9c8f6781-a3b7-49c1-9dc7-45d7c1e875ea.jpeg?w=1024" alt="" class="wp-image-2380" srcset="https://gitenterprise.me/wp-content/uploads/2023/11/firefly_9c8f6781-a3b7-49c1-9dc7-45d7c1e875ea.jpeg?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2023/11/firefly_9c8f6781-a3b7-49c1-9dc7-45d7c1e875ea.jpeg?w=150 150w, https://gitenterprise.me/wp-content/uploads/2023/11/firefly_9c8f6781-a3b7-49c1-9dc7-45d7c1e875ea.jpeg?w=300 300w, https://gitenterprise.me/wp-content/uploads/2023/11/firefly_9c8f6781-a3b7-49c1-9dc7-45d7c1e875ea.jpeg?w=768 768w, https://gitenterprise.me/wp-content/uploads/2023/11/firefly_9c8f6781-a3b7-49c1-9dc7-45d7c1e875ea.jpeg 1792w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"> <p>21 November 2023 (Sunnyvale, CA) &#8211; GerritForge Inc. the leader in Gerrit Code Review Enterprise Support, has successfully re-hosted the Eclipse JGit/EGit projects on GerritHub.io, preserving 14 years of the repository history, including all changes, reviews and comments. Everything that has been produced and was historically available on the <a href="https://git.eclipse.org/r" target="_blank" rel="noreferrer noopener">https://git.eclipse.org/r</a> website is now fully available on <a href="https://eclipse.gerrithub.io" target="_blank" rel="noreferrer noopener">https://eclipse.gerrithub.io</a>.</p> </blockquote> <h2 class="wp-block-heading">From repo.or.cz to Eclipse</h2> <p><a href="https://gitenterprise.me/2018/01/30/shawn-pearce-a-true-leader/">Shawn Pearce (RIP)</a> started the JGit project back in 2006 on <a href="https://repo.or.cz/egit.git/commit/c1f287cb19b9910af19756cf29c08b1fda75da8c" target="_blank" rel="noreferrer noopener">repo.or.cz</a> and later joined Google in 2008 where he was given the task to adapt the <a href="https://web.archive.org/web/20151017112923/https://cloud.google.com/appengine/articles/rietveld" target="_blank" rel="noreferrer noopener">Gerrit Rietveld Code Review tool</a> for the development of the Android Operating System.</p> <p><a href="https://git.eclipse.org/r/c/egit/egit/+/1/" target="_blank" rel="noreferrer noopener">Later in 2009</a> Shawn started the <a href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food" target="_blank" rel="noreferrer noopener">dogfooding</a> practice by also re-hosting the project on Gerrit Code Review instance, kindly offered to the <a href="http://www.eclipse.org" target="_blank" rel="noreferrer noopener">Eclipse Foundation</a> as self-hosting of the <a href="https://projects.eclipse.org/projects/technology.egit" target="_blank" rel="noreferrer noopener">Eclipse plugin for Git</a> (i.e. EGit) and its 100% pure Java implementation of the Git protocol and data format (i.e. JGit). The URL of the self-hosted dogfooding Gerrit instance was <a href="https://www.eclipse.org/lists/jgit-dev/msg00044.html" target="_blank" rel="noreferrer noopener">https://egit.eclipse.org</a> which was later exposed as <a href="https://git.eclipse.org/r" target="_blank" rel="noreferrer noopener">https://git.eclipse.org/r</a>.</p> <p>Here is the first Gerrit change&nbsp;<a href="https://www.google.com/url?q=https://git.eclipse.org/r/c/egit/egit/%2B/1&amp;sa=D&amp;source=docs&amp;ust=1700482770169368&amp;usg=AOvVaw2pTR5SG3c_itpq1etISBfS" target="_blank" rel="noreferrer noopener">https://git.eclipse.org/r/c/egit/egit/+/1</a> hosted on the first Gerrit Code Review Server&nbsp;Shawn Pearce and <a href="https://projects.eclipse.org/user/1341" target="_blank" rel="noreferrer noopener">Matthias Sohn</a> hosted ourselves on a vserver we got from Eclipse foundation.</p> <p>Since then, the <a href="https://gerritcodereview.com" target="_blank" rel="noreferrer noopener">Gerrit Code Review</a> project has massively evolved, and Google adopted the tool for all its Open-Source projects in a highly available multi-site and multi-domain setup across the globe. Noteworthy examples are <a href="https://gerrit-review.googlesource.com" target="_blank" rel="noreferrer noopener">https://gerrit-review.googlesource.com</a>, <a href="https://android-review.googlesource.com" target="_blank" rel="noreferrer noopener">https://android-review.googlesource.com</a> and <a href="https://chromium-review.googlesource.com" target="_blank" rel="noreferrer noopener">https://chromium-review.googlesource.com</a>.</p> <h2 class="wp-block-heading">Project growth on Eclipse</h2> <p>The <a href="https://eclipse.org" target="_blank" rel="noreferrer noopener">Eclipse Foundation</a> started to encourage all of its projects to adopt <a href="https://gerritcodereview.com" target="_blank" rel="noreferrer noopener">Gerrit Code Review</a>, which became the main hub where all the other Open-Source components and contributors were uploading their code and collaborating.</p> <p>Today, the <a href="https://git.eclipse.org/r" target="_blank" rel="noreferrer noopener">https://git.eclipse.org/r</a> site hosts over <strong>1300 repositories</strong> and <strong>tens of thousands of contributors and reviewers</strong>.</p> <h2 class="wp-block-heading">The risks of the announced shutdown&nbsp;</h2> <p>The <a href="https://eclipse.org" target="_blank" rel="noreferrer noopener">Eclipse Foundation</a> started looking at more comprehensive hosting solutions well beyond pure Git hosting and associated Code Review, including GitHub and GitLab and started using them side-by-side with their existing <a href="https://git.eclipse.org/r." target="_blank" rel="noreferrer noopener">https://git.eclipse.org/r.</a><br>In November 2021, the organisation <a href="https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/issues/680">decided to shut down the Gerrit Code Review instance</a> giving as alternatives to migrate the projects to either GitHub or GitLab.</p> <p>Although both GitHub and GitLab would have offered to keep the code history of all projects, the review information would have been completely lost. <a href="https://gerritcodereview.com">Gerrit Code Review</a> has a JSON format (code-named NoteDb) for storing all the review comments together with the repository so that code and review meta-data can be kept safe in the same place. However, GitHub and GitLab have a more traditional relational DBMS approach and would have been unable to render Gerrit&#8217;s NoteDb.</p> <p>If the project would have migrated to GitHub or GitLab, they could have created three main issues:</p> <ol class="wp-block-list"> <li>All the review history would have been formally accessible in the repository but not visible on the GitHub or GitLab UI</li> <li>All associations between the NoteDb data and the committers&#8217; identity would have been lost.</li> <li>New reviews of the code developed on GitHub or GitLab UI would have been stored on a server-side relational DBMS.</li> </ol> <h2 class="wp-block-heading">GerritForge offers to rescue 14 years of review data</h2> <p><a href="https://www.gerritforge.com">GerritForge</a>, the <a href="https://analytics.gerrithub.io" target="_blank" rel="noreferrer noopener">largest contributor</a> to the <a href="https://gerritcodereview.com" target="_blank" rel="noreferrer noopener">Gerrit Code Review</a> project outside of Google, leader of the <a href="https://www.gerritcodereview.com/support.html#enterprise-support" target="_blank" rel="noreferrer noopener">Gerrit Code Review Enterprise Support</a>, launched a new dogfooding project called <a href="https://www.youtube.com/watch?v=jeWTvDad6VM" target="_blank" rel="noreferrer noopener">GerritHub.io back in 2013</a> with the aim of providing the richer Code Review experience of Gerrit on top of every GitHub repository.</p> <p>The main goal of <a href="https://review.gerrithub.io" target="_blank" rel="noreferrer noopener">GerritHub.io</a> was to enable anyone who has a public or private repository on GitHub to use <a href="https://gerritcodereview.com">Gerrit Code Review</a> on top of their existing data. All the authentication, authorisation and publishing of the repository stay on GitHub, whilst <a href="https://review.gerrithub.io" target="_blank" rel="noreferrer noopener">GerritHub.io</a> provides the Code Review and collaboration experience.</p> <p>Because the <a href="https://eclipse.org" target="_blank" rel="noreferrer noopener">Eclipse Foundation</a> offered GitHub as one of the alternatives to <a href="https://git.eclipse.org/r" target="_blank" rel="noreferrer noopener">https://git.eclipse.org/r</a>, <a href="https://review.gerrithub.io" target="_blank" rel="noreferrer noopener">GerritHub.io</a> was the most likely candidate to achieve a win-win situation:</p> <ol class="wp-block-list"> <li>The <a href="https://eclipse.org" target="_blank" rel="noreferrer noopener">Eclipse Foundation</a>&#8216;s win: they have been able to shut down <a href="https://git.eclipse.org/r" target="_blank" rel="noreferrer noopener">https://git.eclipse.org/r</a> and save on hosting and maintenance costs.</li> <li>The projects&#8217; win: all their repositories would have been moved to GitHub, and all existing 14 years of review history and new reviews would be accessible through <a href="https://review.gerrithub.io" target="_blank" rel="noreferrer noopener">GerritHub.io</a></li> </ol> <h2 class="wp-block-heading">The migration project from git.eclipse.org/r to eclipse.gerrithub.io</h2> <p>The migration journey started six months ago, when <a href="https://projects.eclipse.org/content/matthias-sohn-committer-java-implementation-git" target="_blank" rel="noreferrer noopener">Matthias Sohn</a>, the project leader of JGit and EGit, <a href="https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/issues/3137" target="_blank" rel="noreferrer noopener">announced on the Eclipse Foundation issue tracker</a> that he was planning to use <a href="https://review.gerrithub.io" target="_blank" rel="noreferrer noopener">GerritHub.io</a> as Code-Review frontend for his migrated projects in GitHub.</p> <p>The project was made possible thanks to the introduction of the <a href="https://www.gerritcodereview.com/3.7.html#import-projects-changes-from-other-gerrit-servers" target="_blank" rel="noreferrer noopener">&#8220;importing feature&#8221; in Gerrit v3.7</a>, where projects can be moved between Gerrit instances by keeping their change numbers, accounts identities mapping and all associated review data.</p> <p>Using existing GitHub projects on <a href="https://review.gerrithub.io" target="_blank" rel="noreferrer noopener">GerritHub.io</a> is straightforward, and anyone can get started in a matter of minutes; however, the <a href="https://eclipse.org" target="_blank" rel="noreferrer noopener">Eclipse Foundation</a> case was more complex because of multiple additional requirements:</p> <ul class="wp-block-list"> <li>Custom validation of incoming Git commits authors against the <a href="https://www.eclipse.org/legal/ECA.php" target="_blank" rel="noreferrer noopener">Eclipse ECA</a> policies. The Foundation had developed a <a href="https://github.com/EclipseFdn/gerrit-eca-plugin" target="_blank" rel="noreferrer noopener">custom plugin on Gerrit Code Review</a> that needed to be amended to be suitable for a shared-hosting platform like <a href="https://review.gerrithub.io" target="_blank" rel="noreferrer noopener">GerritHub.io</a>.</li> <li>Virtual isolation of the <a href="https://eclipse.org" target="_blank" rel="noreferrer noopener">Eclipse Foundation</a> projects from all the other 56k repositories on <a href="https://review.gerrithub.io" target="_blank" rel="noreferrer noopener">GerritHub.io</a>. All the repositories that were migrated from the legacy <a href="https://git.eclipse.org/r" target="_blank" rel="noreferrer noopener">https://git.eclipse.org/r</a> needed a new &#8220;home page&#8221; in GerritHub.io called <a href="https://eclipse.gerrithub.io" target="_blank" rel="noreferrer noopener">https://eclipse.gerrithub.io</a></li> <li>The <a href="https://eclipse.org" target="_blank" rel="noreferrer noopener">Eclipse Foundation</a> needed the configuration of <a href="https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/scopes-for-oauth-apps" target="_blank" rel="noreferrer noopener">specific OAuth scopes</a> and permission tailored to the roles of the Eclipse Foundation contributors and reviewers.</li> </ul> <p>Last but not least, the migration from <a href="https://git.eclipse.org/r" target="_blank" rel="noreferrer noopener">https://git.eclipse.org/r</a> to <a href="https://eclipse.gerrithub.io" target="_blank" rel="noreferrer noopener">https://eclipse.gerrithub.io</a> needed to be completed with <strong>zero downtime</strong> and <em>minimal disruption</em> for the existing committers and contributors to the project. Therefore, a classic <a href="https://en.wikipedia.org/wiki/Big_bang_adoption" target="_blank" rel="noreferrer noopener">&#8220;big-bang&#8221; migration</a> with a planned outage was not an option.</p> <h2 class="wp-block-heading">Gerrit multi-site and the enablement of smooth migration paths</h2> <p><a href="https://gerritcodereview.com" target="_blank" rel="noreferrer noopener">Gerrit Code Review</a> has been <a href="https://youtu.be/wlHpqfnIBWE" target="_blank" rel="noreferrer noopener">multi-site at Google</a> for many years, but that deployment was limited to the forked version hosted in Google&#8217;s data centres.<br><a href="https://gerritforge.com" target="_blank" rel="noreferrer noopener">GerritForge</a> and the rest of the Open-Source community have invested a lot into publicly available multi-site support since 2018, and it is <a href="https://youtu.be/DA2aeP_IUl4?si=3JoZtuXtrwty2lLT">currently able to provide an equivalent solution on a standard infrastructure</a>, leveraging a global-refdb and events-broker off-the-shelf.</p> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2023/11/gerrit-multi-site-2023.png"><img data-attachment-id="2411" data-permalink="https://gitenterprise.me/2023/11/21/14-years-of-jgit-egit-code-reviews-migrated-to-gerrithub/gerrit-multi-site-2023/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2023/11/gerrit-multi-site-2023.png" data-orig-size="3000,1562" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="gerrit-multi-site-2023" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2023/11/gerrit-multi-site-2023.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2023/11/gerrit-multi-site-2023.png?w=584" loading="lazy" width="1024" height="533" src="https://gitenterprise.me/wp-content/uploads/2023/11/gerrit-multi-site-2023.png?w=1024" alt="" class="wp-image-2411" srcset="https://gitenterprise.me/wp-content/uploads/2023/11/gerrit-multi-site-2023.png?w=1024 1024w, https://gitenterprise.me/wp-content/uploads/2023/11/gerrit-multi-site-2023.png?w=2048 2048w, https://gitenterprise.me/wp-content/uploads/2023/11/gerrit-multi-site-2023.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2023/11/gerrit-multi-site-2023.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2023/11/gerrit-multi-site-2023.png?w=768 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <p>Being multi-site means that the &#8220;logical domain&#8221; (e.g. <a href="https://eclipse.gerrithub.io" target="_blank" rel="noreferrer noopener">eclipse.gerrithub.io</a>), instead of being served by a set of hosts in a single data centre, it can <strong>point to different locations across the globe</strong>, all active at the same time and <em>accept read/write operations, such as Git push, clone, fetch and code-reviews</em>. The full <a href="https://github.com/GerritCodeReview/plugins_multi-site/blob/master/DESIGN.md" target="_blank" rel="noreferrer noopener">design of the solution is available on the multi-site plugin repository</a></p> <p>When two users are pushing code at the same time to two different sites, Gerrit will check the destination refs against the SHA1 stored in the global-refdb and will coordinate the transactions to avoid <a href="https://en.wikipedia.org/wiki/Split-brain_(computing)" target="_blank" rel="noreferrer noopener">ending up in a split-brain situation</a>. Synchronisation between sites is achieved using the <a href="https://github.com/GerritCodeReview/plugins_pull-replication/blob/master/src/main/resources/Documentation/about.md">pull-replication plugin</a>.</p> <p><a href="https://gerritcodereview.com" target="_blank" rel="noreferrer noopener">Gerrit Code Review</a> is designed to be future-proof, thanks to a clear separation and contract between the front end and the backend REST-API. That allows a smooth <a href="https://en.wikipedia.org/wiki/Blue%E2%80%93green_deployment" target="_blank" rel="noreferrer noopener">blue-green migration</a> between releases because every release of Gerrit is forward and backwards compatible with its next release +1. For example, <a href="https://review.gerrithub.io" target="_blank" rel="noreferrer noopener">GerritHub.io</a> is running two different versions of <a href="https://gerritcodereview.com" target="_blank" rel="noreferrer noopener">Gerrit Code Review</a> on different sites as we speak: <a href="https://www.gerritcodereview.com/3.8.html#382" target="_blank" rel="noreferrer noopener">v3.8.2</a> in the US and Canada (<a href="https://review-am.gerrithub.io" target="_blank" rel="noreferrer noopener">https://review-am.gerrithub.io</a>) and <a href="https://www.gerritcodereview.com/3.9.html" target="_blank" rel="noreferrer noopener">v3.9.0-rc5 </a>in Europe (<a href="https://review-eu.gerrithub.io" target="_blank" rel="noreferrer noopener">https://review-eu.gerrithub.io</a>), without anyone noticing any disruption. Each site progresses towards newer releases bi-weekly whilst the overall service remains active.</p> <h2 class="wp-block-heading">Project-based migration from git.eclipse.org to eclipse.gerrithub.io</h2> <p>Gerrit projects include all the commits and meta-data in the same repository and, therefore, have the perfect design to allow an easy migration between servers. However, there are some gotchas:</p> <ul class="wp-block-list"> <li>Every Gerrit server has a server-id associated with it, which is used to &#8220;tag&#8221; every change. That prevents Gerrit from parsing and indexing data that does not necessarily belong to the server.</li> <li>Every NoteDb meta-data record is strictly decoupled from any <a href="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.201-3.pdf" target="_blank" rel="noreferrer noopener">Personal Identifiable Information (aka PII)</a>, including the full name and e-mails of the authors, committers, owners and reviewers of the changes under review. The lookup between the anonymised identity (aka account-id) and the PII is contained in a centralised repository called &#8216;All-Users.git&#8217;, which isn&#8217;t accessible.</li> <li>Every change has a unique incremental number associated with it, the change number. The numbering sequence is unique per Gerrit server, but when moving projects between different servers, you may have numbering conflicts.</li> </ul> <p><a href="https://www.linkedin.com/in/lucamilanesio" target="_blank" rel="noreferrer noopener">Luca Milanesio</a> and <a href="https://projects.eclipse.org/user/1341" target="_blank" rel="noreferrer noopener">Matthia Sohn</a>, both maintainers of the <a href="https://gerritcodereview.com" target="_blank" rel="noreferrer noopener">Gerrit Code Review</a> project, have cooperated to find solutions to all three problems and have included them in <a href="https://gerritcodereview.com/3.7.html" target="_blank" rel="noreferrer noopener">Gerrit v3.7</a> onwards.</p> <p><a href="https://gerritforge.com" target="_blank" rel="noreferrer noopener">GerritForge</a> has configured the server ID of <a href="https://git.eclipse.org/r" target="_blank" rel="noreferrer noopener">git.eclipse.org</a> as an <em>&#8220;external imported server ID&#8221;</em> so that every project coming from the <a href="https://eclipse.org" target="_blank" rel="noreferrer noopener">Eclipse Foundation</a> can be parsed and indexed. Its review metadata is rendered on the UI.</p> <p>The identities are mapped using the public REST-API <code>https://git.eclipse.org/r/accounts/NN/detail</code>, which allows the association of <a href="https://review.gerrithub.io" target="_blank" rel="noreferrer noopener">GerritHub</a> users with the legacy <a href="https://eclipse.org" target="_blank" rel="noreferrer noopener">Eclipse Foundation</a> account IDs matched by e-mail address.</p> <p>With regards to the change numbers, the legacy sequence numbers coming with <a href="https://git.eclipse.org/r" target="_blank" rel="noreferrer noopener">https://git.eclipse.org/r</a> are in conflict with the changes on <a href="https://review.gerrithub.io" target="_blank" rel="noreferrer noopener">GerritHub.io</a>; see, for example, <a href="https://review.gerrithub.io/5819" target="_blank" rel="noreferrer noopener">https://review.gerrithub.io/5819</a> and <a href="https://git.eclipse.org/5819" target="_blank" rel="noreferrer noopener">https://git.eclipse</a><a href="https://git.eclipse.org/r/5819" target="_blank" rel="noreferrer noopener">.</a><a href="https://git.eclipse.org/5819" target="_blank" rel="noreferrer noopener">org/r/5819</a>, both valid change numbers but pointing to <em>different projects</em> on <em>different servers</em>.<br><a href="https://gerritforge.com" target="_blank" rel="noreferrer noopener">GerritForge</a> has developed a <a href="https://github.com/GerritForge/redirect-change-number">new ad-hoc plugin</a> to allow existing URLs, previously pointing to <a href="https://git.eclipse.org/r" target="_blank" rel="noreferrer noopener">https://git.eclipse.org/r</a>, to continue to work as expected on the projects migrated to <a href="https://eclipse.gerrithub.io">eclipse.gerrithub.io</a>.<br>The plugin has a full list of the legacy URLs on <a href="https://git.eclipse.org/r" target="_blank" rel="noreferrer noopener">https://git.eclipse.org/r</a> and performs the correct redirect to the full equivalent project / change on eclipse.gerrithub.io.<br>For example, <a href="https://git.eclipse.org/r/5819" target="_blank" rel="noreferrer noopener">https://git.eclipse.org/r/5819</a> and <a href="https://eclipse.gerrithub.io/5819" target="_blank" rel="noreferrer noopener">https://eclipse.gerrithub.io/5819</a> are both referring to the same <code>Change-Id:Iff84409c</code> of the JGit project.</p> <h2 class="wp-block-heading">eclipse.gerrithub.io as a Gerrit Code Review multi-tenant domain</h2> <p><a href="https://gerritcodereview.com" target="_blank" rel="noreferrer noopener">Gerrit Code Review</a> has secretly supported multi-tenant domains for over a decade; however, that was implemented using a private fork implemented at Google and only in their data centres, as <a href="https://www.youtube.com/watch?v=wlHpqfnIBWE&amp;t=285s" target="_blank" rel="noreferrer noopener">Patrick Hiesel presented at the Gerrit User Summit 2017</a> in London.</p> <p>The Open-Source version does not have support for multi-tenancy in the Gerrit core. However, I developed a <a href="https://gerrit.googlesource.com/modules/virtualhost/" target="_blank" rel="noreferrer noopener">minimalistic solution six years ago</a> that would give the &#8220;user experience&#8221; of virtual hosting on Gerrit.<br>The idea behind the solution is quite simple: <em>hide unwanted projects based on the full domain name</em>, pretty much like the virtual hosts work on the HTTP Servers world.</p> <p>For example, you could define eclipse.gerrithub.io as follows:</p> <pre class="wp-block-preformatted"> [server "eclipse.gerrithub.io"] projects = eclipse-jgit/* projects = eclipse-egit/*</pre> <p>Shawn himself was stunned when he saw the source code of the <a href="https://gerrit.googlesource.com/modules/virtualhost/+/2687d84d52e21dcc309bac078691a84e66a9eab6" target="_blank" rel="noreferrer noopener">virtual-host libmodule back in 2017</a>, with the comment <em>&#8220;how did I end up writing so much code, if you did everything in just 7 Java classes?&#8221;</em></p> <p>To be fair, the solution Shawn implemented on review-*.googlesource.com was a lot more comprehensive than the <a href="https://gerrit.googlesource.com/modules/virtualhost/" target="_blank" rel="noreferrer noopener">virtual-host libmodule</a>, because it also included the ability to have different gerrit.config per tenant, whilst the solution implemented on <a href="https://review.gerrithub.io" target="_blank" rel="noreferrer noopener">GerritHub.io</a> is a simple extra permission filter applied based on the domain name.</p> <p>That means that all the <a href="https://eclipse.gerrithub.io/admin/repos/q/filter:eclipse" target="_blank" rel="noreferrer noopener">Eclipse repositories</a> are effectively available on any of the <a href="https://review.gerrithub.io" target="_blank" rel="noreferrer noopener">GerritHub.io</a> sites and also accessible with the main domain URL <a href="https://review.gerrithub.io" target="_blank" rel="noreferrer noopener">https://review.gerrithub.io</a>; the filtering on the virtual-host is a pure visibility setting for avoiding the users coming from the Eclipse Foundation from being overwhelmed by the other <em>50k projects hosted on GerritHub.io</em>.</p> <p>The advantage is that all the current <a href="https://review.gerrithub.io" target="_blank" rel="noreferrer noopener">GerritHub.io</a> sites replicate the Eclipse Foundations repositories, providing, therefore, additional redundancy to the overall setup. All commits pushed to any of the <strong>repositories on eclipse.gerrithub.io will also be replicated to all sites</strong>, including the ones NOT starting with eclipse.gerrithub.io. Thanks to this redundancy, all the projects hosted on GerritHub.io can benefit from an <strong>astonishing <a href="https://gitenterprise.me/2023/01/13/2023-new-year-and-opportunities-for-gerritforge-and-gerrit-code-review/">99.997% availability</a></strong>, well above any other free Git hosting sites for Open-Source available right now.</p> <h2 class="wp-block-heading">What&#8217;s next for the other 1,300 repositories on git.eclipse.org?</h2> <p>The work done for migrating the JGit and EGit projects to <a href="https://eclipse.gerrithub.io" rel="nofollow">https://eclipse.gerrithub.io</a> is the ground needed for the reuse of the same path for many more repositories and projects that want to keep their review history before the legacy git.eclipse.org site is going to be shut down by the Eclipse Foundation.<br>The scope definition, the user accounts association, and the provision of the users and projects are going to be exactly the same for any other project that wants to move to keep its history.</p> <p>Once all the projects are migrated, the Eclipse Foundation can define a redirection rule that serves all the incoming requests to <a href="https://git.eclipse.org/r" target="_blank" rel="noreferrer noopener">https://git.eclipse.org/r</a> and redirects them to <a href="https://eclipse.gerrithub.io" target="_blank" rel="noreferrer noopener">https://eclipse.gerrithub.io</a>.</p> <h2 class="wp-block-heading">Lessons learnt and takeaway for other migrations</h2> <p>Migrating projects between Gerrit instances was declared impossible just a few years ago; however, that was the end goal of the whole Gerrit NoteDb project. Shawn Pearce used to say that he <em>&#8220;would like to make all his reviews locally on his laptops and just push code and reviews once they landed</em>&#8220;, making the Code Review an integral part of the Git data format.</p> <p>The success of this migration project is the demonstration that <strong>Shawn&#8217;s vision was really innovative</strong> and, thanks to the <span style="text-decoration: underline">cooperation of the community,</span> projects can last and <span style="text-decoration: underline">persevere well beyond the boundaries and lifetime of the people</span> who initially founded them.</p> <p>Migrating projects and consolidating Gerrit Servers is not something that is only applicable to this example of the <a href="https://eclipse.org" target="_blank" rel="noreferrer noopener">Eclipse Foundation</a> server shutdown, but can be <strong>further applied to other domains and use cases</strong>.<br>Companies are constantly changing, splitting and merging; projects need to follow the organisation and also move between Gerrit Servers and domains.</p> <p>All the innovations introduced in <a href="https://gerritcodereview.com/3.7.html" target="_blank" rel="noreferrer noopener">Gerrit v3.7</a> and beyond can serve as an example of the implementation of a different migration path compared to the traditional big-bang approach.</p> <p>One important lesson from the <a href="https://eclipse.org" target="_blank" rel="noreferrer noopener">Eclipse Foundation&#8217;s</a> experience is that <strong>every migration comes with many little but important details</strong>: all of them need accurate evaluation, implementation and testing. <span style="text-decoration: underline">Upfront planning is needed</span>; however, many times, many <span style="text-decoration: underline">more details are found along the migration path</span>, making it difficult to estimate correctly all the efforts and costs associated. Migrating is like doing daily exercising, the first round sounds quite lengthy and challenging, however, the following rounds can reuse the tools and experience earned in the previous migrations.</p> <p>Lastly, this exercise has shown <strong>how important it is to keep the project&#8217;s history for planning its future</strong>. It would have been unthinkable for the <a href="https://www.eclipse.org/jgit/" target="_blank" rel="noreferrer noopener">JGit/EGit projets</a> to continue developing without being able to leverage the learnings, discussions and experience from the past.</p> <blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"> <p>&#8220;The Code Review history is our legacy; learning from our past gives us direction for our future.&#8221;<br><br><strong><a href="https://www.linkedin.com/in/lucamilanesio/" target="_blank" rel="noreferrer noopener">Luca Milanesio</a></strong><br><a href="https://gerritforge.com" target="_blank" rel="noreferrer noopener">GerritForge, Inc.</a> &#8211; CEO and CTO<br>Gerrit Code Review Maintainer<br>Gerrit Release Manager<br>Member of the Gerrit Engineering Steering Committee</p> </blockquote> <p></p> <p></p> </div><!-- .entry-content --> <footer class="entry-meta"> <span class="cat-links"> <span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://gitenterprise.me/category/eclipse/" rel="category tag">eclipse</a>, <a href="https://gitenterprise.me/category/jgit-2/" rel="category tag">jgit</a>, <a href="https://gitenterprise.me/category/migration/" rel="category tag">migration</a>, <a href="https://gitenterprise.me/category/multi-site/" rel="category tag">multi-site</a> </span> <span class="sep"> | </span> <span class="tag-links"> <span class="entry-utility-prep entry-utility-prep-tag-links">Tagged</span> <a href="https://gitenterprise.me/tag/eclipse/" rel="tag">eclipse</a> </span> <span class="sep"> | </span> <span class="comments-link"><a href="https://gitenterprise.me/2023/11/21/14-years-of-jgit-egit-code-reviews-migrated-to-gerrithub/#respond"><span class="leave-reply">Leave a reply</span></a></span> </footer><!-- .entry-meta --> </article><!-- #post-2379 --> <article id="post-2344" class="post-2344 post type-post status-publish format-standard hentry category-uncategorized"> <header class="entry-header"> <h1 class="entry-title"><a href="https://gitenterprise.me/2023/06/02/report-from-a-gerrit-hackathon-repository-optimizer-poc/" rel="bookmark">Report from a Gerrit hackathon: Repository Optimizer&nbsp;PoC</a></h1> <div class="entry-meta"> <span class="sep">Posted on </span><a href="https://gitenterprise.me/2023/06/02/report-from-a-gerrit-hackathon-repository-optimizer-poc/" title="1:09 pm" rel="bookmark"><time class="entry-date" datetime="2023-06-02T13:09:23+01:00">June 2, 2023</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://gitenterprise.me/author/barbasa78/" title="View all posts by Fabio Ponciroli" rel="author">Fabio Ponciroli</a></span></span> </div><!-- .entry-meta --> <div class="comments-link"> <a href="https://gitenterprise.me/2023/06/02/report-from-a-gerrit-hackathon-repository-optimizer-poc/#respond"><span class="leave-reply">Reply</span></a> </div> </header><!-- .entry-header --> <div class="entry-content"> <p>The Gerrit spring hackathon just ended on Discord, with GerritForge attending from London, SAP, Google from Germany, and WikiMedia from France). One of the PoC we have been working on is a prototype for a scalable and “intelligent” repository optimizer.</p> <p>Following last year&#8217;s release of the git-repo-metrics plugin, <a href="https://www.youtube.com/watch?v=4u2Fe0h8_IU">presented</a> in the previous users summit, which tracks live information on Git repositories, we thought that having a tool that can “automagically” do something with the collected data would be helpful.<br>We started working on, what we called, the RepoVet©, a modular tool that can make intelligent and autonomous decisions on what needs to be improved on a repository.</p> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2023/06/doctor.git_.png"><img data-attachment-id="2354" data-permalink="https://gitenterprise.me/2023/06/02/report-from-a-gerrit-hackathon-repository-optimizer-poc/doctor-git_/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2023/06/doctor.git_.png" data-orig-size="1024,1024" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="doctor.git_" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2023/06/doctor.git_.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2023/06/doctor.git_.png?w=584" loading="lazy" width="1024" height="1024" src="https://gitenterprise.me/wp-content/uploads/2023/06/doctor.git_.png?w=1024" alt="" class="wp-image-2354" srcset="https://gitenterprise.me/wp-content/uploads/2023/06/doctor.git_.png 1024w, https://gitenterprise.me/wp-content/uploads/2023/06/doctor.git_.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2023/06/doctor.git_.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2023/06/doctor.git_.png?w=768 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> <h2 class="wp-block-heading">Architecture</h2> <p>The main constraints we aimed for were:</p> <ul class="wp-block-list"> <li>Git server implementation agnostic: we want the tool to be usable on any Git repository, not necessarily one managed by Gerrit Code Review</li> <li>Modular: the different components of the tool must be independent and pluggable, giving a chance to integrate into already existing Git server Setups.</li> </ul> <p>After a couple of whiteboard rounds, we developed the following components: Monitor, RuleEngine, and Optimizer.</p> <p>Each is independent, highly configurable, and communicates with the other components via a message broker (<a href="https://aws.amazon.com/sqs/">AWS SQS</a>). Following is a list of the responsibility of each of them:</p> <ul class="wp-block-list"> <li>Monitor: watch the filesystem and notify for activities happening in the git repository, i.e., increase/decrease of repository size</li> <li>RuleEngine: listens for notifications from Monitor and decides whether any activity is needed on the repository, i.e., a git GC, a git repack, etc. The decision can be based not only on the repository parameters (number of loose objects, number of refs, etc.) but also, for example, on traffic patterns. If RuleEngine decides an optimization is needed, it will notify the Optimizer.</li> <li>Optimizer: listen for instructions coming from the RuleEngine and execute them. This can be a git GC, a git repack, etc. It is not its call to decide which activity to carry on. However, it will determine if it is the right moment. For example, it will only run concurrent GCs or do any operation if there are enough resources.</li> </ul> <p>Following is an example of interaction among the components, where the decision to run a GC is based on some thresholds set in the repository configuration:</p> <figure class="wp-block-image size-large"><a href="https://gitenterprise.me/wp-content/uploads/2023/06/architecture.png"><img data-attachment-id="2350" data-permalink="https://gitenterprise.me/2023/06/02/report-from-a-gerrit-hackathon-repository-optimizer-poc/architecture/" data-orig-file="https://gitenterprise.me/wp-content/uploads/2023/06/architecture.png" data-orig-size="1004,649" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="architecture" data-image-description="" data-image-caption="" data-medium-file="https://gitenterprise.me/wp-content/uploads/2023/06/architecture.png?w=300" data-large-file="https://gitenterprise.me/wp-content/uploads/2023/06/architecture.png?w=584" loading="lazy" width="1004" height="649" src="https://gitenterprise.me/wp-content/uploads/2023/06/architecture.png?w=1004" alt="" class="wp-image-2350" srcset="https://gitenterprise.me/wp-content/uploads/2023/06/architecture.png 1004w, https://gitenterprise.me/wp-content/uploads/2023/06/architecture.png?w=150 150w, https://gitenterprise.me/wp-content/uploads/2023/06/architecture.png?w=300 300w, https://gitenterprise.me/wp-content/uploads/2023/06/architecture.png?w=768 768w" sizes="(max-width: 1004px) 100vw, 1004px" /></a></figure> <p>In the above example, Monitor reports an increase in the repository size and notifies the RuleEngine via the broker RepoActivity queue.</p> <p>RuleEngine gets the repository configuration and decides a GC is needed since some thresholds were exceeded. It notifies the operation type and the repository to the Optimizer via the broker RepoIntervention queue.</p> <p>Optimizer checks if there are other GC currently running and if there are enough resources and then runs the GC and keeps track of its result and timestamp.</p> <p>As it is possible to see, we met the criteria we initially aimed for since:</p> <ul class="wp-block-list"> <li>None of the components needs or use Gerrit, even though the repository was hosted in a Gerrit Code Review setup</li> <li>Components are independent and swappable. For example, if we used Gerrit, the RepoMonitor could be swapped with a plugin acting as a bridge between Gerrit stream events and the broker.</li> </ul> <h2 class="wp-block-heading">Lessons learned</h2> <ul class="wp-block-list"> <li>Having low coupling among the different components will allow: <ul class="wp-block-list"> <li>The user to pick only the components needed in their installation</li> <li>The user to integrate the tool into a pre-existing infrastructure</li> <li>The developers to potentially work with different technologies and different lifecycles</li> </ul> </li> <li>The user to pick only the components needed in their installation</li> <li>SQS proved to be straightforward to work with during the prototyping phase, allowing to spin up the service locally with Docker quickly</li> <li>Modeling the messages among the components is crucial and has to be carefully thought-out at the beginning</li> <li>More planning needs to be spent in choosing the broker system; for example, handling non-processable messages and managing DLQs hasn’t been considered at all</li> </ul> <h2 class="wp-block-heading">Next steps</h2> <p>We are aiming to start working on an MVP as soon as possible. Maybe starting from one of the components and slowly adding the others.</p> <p>As soon as we have an MVP, as usual, the code will be available; just waiting for contributions and feedback.</p> <p>Traditionally, we will use gerrithub.io to dogfood it, and we will report back.</p> <p>Stay tuned!</p> </div><!-- .entry-content --> <footer class="entry-meta"> <span class="cat-links"> <span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://gitenterprise.me/category/uncategorized/" rel="category tag">Uncategorized</a> </span> <span class="sep"> | </span> <span class="comments-link"><a href="https://gitenterprise.me/2023/06/02/report-from-a-gerrit-hackathon-repository-optimizer-poc/#respond"><span class="leave-reply">Leave a reply</span></a></span> </footer><!-- .entry-meta --> </article><!-- #post-2344 --> <nav id="nav-below"> <h3 class="assistive-text">Post navigation</h3> <div class="nav-previous"><a href="https://gitenterprise.me/page/2/" ><span class="meta-nav">&larr;</span> Older posts</a></div> <div class="nav-next"></div> </nav><!-- #nav-above --> </div><!-- #content --> </div><!-- #primary --> <div id="secondary" class="widget-area" role="complementary"> <aside id="twitter-4" class="widget widget_twitter"><h3 class="widget-title"><a href='http://twitter.com/gerritreview'>Gerrit News</a></h3><a class="twitter-timeline" data-height="600" data-dnt="true" href="https://twitter.com/gerritreview">Tweets by gerritreview</a></aside><aside id="wp_tag_cloud-3" class="widget wp_widget_tag_cloud"><h3 class="widget-title">Tags</h3><ul class='wp-tag-cloud' role='list'> <li><a href="https://gitenterprise.me/tag/2021/" class="tag-cloud-link tag-link-173981 tag-link-position-1" style="font-size: 10.333333333333pt;" aria-label="2021 (2 items)">2021</a></li> <li><a href="https://gitenterprise.me/tag/acl/" class="tag-cloud-link tag-link-37196 tag-link-position-2" style="font-size: 8pt;" aria-label="acl (1 item)">acl</a></li> <li><a href="https://gitenterprise.me/tag/acquisition/" class="tag-cloud-link tag-link-142153 tag-link-position-3" style="font-size: 8pt;" aria-label="acquisition (1 item)">acquisition</a></li> <li><a href="https://gitenterprise.me/tag/analytics/" class="tag-cloud-link tag-link-11453 tag-link-position-4" style="font-size: 15.12962962963pt;" aria-label="Analytics (6 items)">Analytics</a></li> <li><a href="https://gitenterprise.me/tag/audit/" class="tag-cloud-link tag-link-3089 tag-link-position-5" style="font-size: 8pt;" aria-label="audit (1 item)">audit</a></li> <li><a href="https://gitenterprise.me/tag/bigdata/" class="tag-cloud-link tag-link-15968671 tag-link-position-6" style="font-size: 8pt;" aria-label="bigdata (1 item)">bigdata</a></li> <li><a href="https://gitenterprise.me/tag/call-for-presentations/" class="tag-cloud-link tag-link-14254312 tag-link-position-7" style="font-size: 10.333333333333pt;" aria-label="Call for presentations (2 items)">Call for presentations</a></li> <li><a href="https://gitenterprise.me/tag/cloud/" class="tag-cloud-link tag-link-69816 tag-link-position-8" style="font-size: 14.222222222222pt;" aria-label="cloud (5 items)">cloud</a></li> <li><a href="https://gitenterprise.me/tag/cloudera/" class="tag-cloud-link tag-link-17966630 tag-link-position-9" style="font-size: 8pt;" aria-label="cloudera (1 item)">cloudera</a></li> <li><a href="https://gitenterprise.me/tag/cmmi/" class="tag-cloud-link tag-link-184753 tag-link-position-10" style="font-size: 8pt;" aria-label="cmmi (1 item)">cmmi</a></li> <li><a href="https://gitenterprise.me/tag/code-review/" class="tag-cloud-link tag-link-348621 tag-link-position-11" style="font-size: 22pt;" aria-label="code review (23 items)">code review</a></li> <li><a href="https://gitenterprise.me/tag/code-search/" class="tag-cloud-link tag-link-556391 tag-link-position-12" style="font-size: 8pt;" aria-label="code search (1 item)">code search</a></li> <li><a href="https://gitenterprise.me/tag/continuous-delivery/" class="tag-cloud-link tag-link-32361710 tag-link-position-13" style="font-size: 15.777777777778pt;" aria-label="continuous delivery (7 items)">continuous delivery</a></li> <li><a href="https://gitenterprise.me/tag/continuous-integration/" class="tag-cloud-link tag-link-163615 tag-link-position-14" style="font-size: 10.333333333333pt;" aria-label="continuous integration (2 items)">continuous integration</a></li> <li><a href="https://gitenterprise.me/tag/devops/" class="tag-cloud-link tag-link-28070474 tag-link-position-15" style="font-size: 15.777777777778pt;" aria-label="DevOps (7 items)">DevOps</a></li> <li><a href="https://gitenterprise.me/tag/docker/" class="tag-cloud-link tag-link-4504191 tag-link-position-16" style="font-size: 11.888888888889pt;" aria-label="docker (3 items)">docker</a></li> <li><a href="https://gitenterprise.me/tag/edit/" class="tag-cloud-link tag-link-76624 tag-link-position-17" style="font-size: 8pt;" aria-label="edit (1 item)">edit</a></li> <li><a href="https://gitenterprise.me/tag/elasticsearch/" class="tag-cloud-link tag-link-50684163 tag-link-position-18" style="font-size: 10.333333333333pt;" aria-label="ElasticSearch (2 items)">ElasticSearch</a></li> <li><a href="https://gitenterprise.me/tag/enterprise/" class="tag-cloud-link tag-link-15328 tag-link-position-19" style="font-size: 8pt;" aria-label="enterprise (1 item)">enterprise</a></li> <li><a href="https://gitenterprise.me/tag/events/" class="tag-cloud-link tag-link-924 tag-link-position-20" style="font-size: 11.888888888889pt;" aria-label="Events (3 items)">Events</a></li> <li><a href="https://gitenterprise.me/tag/gerrit/" class="tag-cloud-link tag-link-1307989 tag-link-position-21" style="font-size: 21.481481481481pt;" aria-label="gerrit (21 items)">gerrit</a></li> <li><a href="https://gitenterprise.me/tag/gerrit-code-review/" class="tag-cloud-link tag-link-377645019 tag-link-position-22" style="font-size: 18.5pt;" aria-label="gerrit code review (12 items)">gerrit code review</a></li> <li><a href="https://gitenterprise.me/tag/gerritforge/" class="tag-cloud-link tag-link-691913041 tag-link-position-23" style="font-size: 11.888888888889pt;" aria-label="GerritForge (3 items)">GerritForge</a></li> <li><a href="https://gitenterprise.me/tag/gerrithub/" class="tag-cloud-link tag-link-345466106 tag-link-position-24" style="font-size: 15.12962962963pt;" aria-label="gerrithub (6 items)">gerrithub</a></li> <li><a href="https://gitenterprise.me/tag/gerrit-user-summit-2017/" class="tag-cloud-link tag-link-592745207 tag-link-position-25" style="font-size: 15.777777777778pt;" aria-label="Gerrit User Summit 2017 (7 items)">Gerrit User Summit 2017</a></li> <li><a href="https://gitenterprise.me/tag/gerrit-user-summit-2021/" class="tag-cloud-link tag-link-726757155 tag-link-position-26" style="font-size: 15.12962962963pt;" aria-label="Gerrit User Summit 2021 (6 items)">Gerrit User Summit 2021</a></li> <li><a href="https://gitenterprise.me/tag/gerrit-ver-2-15/" class="tag-cloud-link tag-link-596510658 tag-link-position-27" style="font-size: 8pt;" aria-label="Gerrit Ver.2.15 (1 item)">Gerrit Ver.2.15</a></li> <li><a href="https://gitenterprise.me/tag/git/" class="tag-cloud-link tag-link-209196 tag-link-position-28" style="font-size: 16.425925925926pt;" aria-label="git (8 items)">git</a></li> <li><a href="https://gitenterprise.me/tag/github/" class="tag-cloud-link tag-link-5603054 tag-link-position-29" style="font-size: 18.5pt;" aria-label="github (12 items)">github</a></li> <li><a href="https://gitenterprise.me/tag/gitminutes/" class="tag-cloud-link tag-link-248991976 tag-link-position-30" style="font-size: 8pt;" aria-label="GitMinutes (1 item)">GitMinutes</a></li> <li><a href="https://gitenterprise.me/tag/google/" class="tag-cloud-link tag-link-81 tag-link-position-31" style="font-size: 14.222222222222pt;" aria-label="Google (5 items)">Google</a></li> <li><a href="https://gitenterprise.me/tag/groovy/" class="tag-cloud-link tag-link-883 tag-link-position-32" style="font-size: 8pt;" aria-label="Groovy (1 item)">Groovy</a></li> <li><a href="https://gitenterprise.me/tag/hooks/" class="tag-cloud-link tag-link-405804 tag-link-position-33" style="font-size: 8pt;" aria-label="Hooks (1 item)">Hooks</a></li> <li><a href="https://gitenterprise.me/tag/ide/" class="tag-cloud-link tag-link-7746 tag-link-position-34" style="font-size: 8pt;" aria-label="ide (1 item)">ide</a></li> <li><a href="https://gitenterprise.me/tag/installer/" class="tag-cloud-link tag-link-212876 tag-link-position-35" style="font-size: 8pt;" aria-label="installer (1 item)">installer</a></li> <li><a href="https://gitenterprise.me/tag/jenkinsci/" class="tag-cloud-link tag-link-50337214 tag-link-position-36" style="font-size: 14.222222222222pt;" aria-label="jenkinsci (5 items)">jenkinsci</a></li> <li><a href="https://gitenterprise.me/tag/kibana/" class="tag-cloud-link tag-link-99581934 tag-link-position-37" style="font-size: 8pt;" aria-label="kibana (1 item)">kibana</a></li> <li><a href="https://gitenterprise.me/tag/marathon/" class="tag-cloud-link tag-link-11758 tag-link-position-38" style="font-size: 8pt;" aria-label="marathon (1 item)">marathon</a></li> <li><a href="https://gitenterprise.me/tag/mesos/" class="tag-cloud-link tag-link-669602 tag-link-position-39" style="font-size: 8pt;" aria-label="mesos (1 item)">mesos</a></li> <li><a href="https://gitenterprise.me/tag/microsoft/" class="tag-cloud-link tag-link-637 tag-link-position-40" style="font-size: 8pt;" aria-label="microsoft (1 item)">microsoft</a></li> <li><a href="https://gitenterprise.me/tag/migration/" class="tag-cloud-link tag-link-1158 tag-link-position-41" style="font-size: 10.333333333333pt;" aria-label="migration (2 items)">migration</a></li> <li><a href="https://gitenterprise.me/tag/movetogitlab/" class="tag-cloud-link tag-link-635762271 tag-link-position-42" style="font-size: 8pt;" aria-label="movetogitlab (1 item)">movetogitlab</a></li> <li><a href="https://gitenterprise.me/tag/multi-site/" class="tag-cloud-link tag-link-353198 tag-link-position-43" style="font-size: 10.333333333333pt;" aria-label="multi-site (2 items)">multi-site</a></li> <li><a href="https://gitenterprise.me/tag/notedb/" class="tag-cloud-link tag-link-596510657 tag-link-position-44" style="font-size: 10.333333333333pt;" aria-label="NoteDb (2 items)">NoteDb</a></li> <li><a href="https://gitenterprise.me/tag/oauth/" class="tag-cloud-link tag-link-2027657 tag-link-position-45" style="font-size: 10.333333333333pt;" aria-label="oauth (2 items)">oauth</a></li> <li><a href="https://gitenterprise.me/tag/outage/" class="tag-cloud-link tag-link-142465 tag-link-position-46" style="font-size: 15.777777777778pt;" aria-label="outage (7 items)">outage</a></li> <li><a href="https://gitenterprise.me/tag/packages/" class="tag-cloud-link tag-link-65759 tag-link-position-47" style="font-size: 10.333333333333pt;" aria-label="packages (2 items)">packages</a></li> <li><a href="https://gitenterprise.me/tag/performance/" class="tag-cloud-link tag-link-1930 tag-link-position-48" style="font-size: 8pt;" aria-label="performance (1 item)">performance</a></li> <li><a href="https://gitenterprise.me/tag/polygerrit/" class="tag-cloud-link tag-link-576110593 tag-link-position-49" style="font-size: 10.333333333333pt;" aria-label="PolyGerrit (2 items)">PolyGerrit</a></li> <li><a href="https://gitenterprise.me/tag/polymer/" class="tag-cloud-link tag-link-9470 tag-link-position-50" style="font-size: 13.185185185185pt;" aria-label="Polymer (4 items)">Polymer</a></li> <li><a href="https://gitenterprise.me/tag/problems/" class="tag-cloud-link tag-link-6615 tag-link-position-51" style="font-size: 8pt;" aria-label="problems (1 item)">problems</a></li> <li><a href="https://gitenterprise.me/tag/programming/" class="tag-cloud-link tag-link-196 tag-link-position-52" style="font-size: 13.185185185185pt;" aria-label="programming (4 items)">programming</a></li> <li><a href="https://gitenterprise.me/tag/rabbitmq/" class="tag-cloud-link tag-link-8662793 tag-link-position-53" style="font-size: 8pt;" aria-label="rabbitmq (1 item)">rabbitmq</a></li> <li><a href="https://gitenterprise.me/tag/rbac/" class="tag-cloud-link tag-link-1080600 tag-link-position-54" style="font-size: 8pt;" aria-label="rbac (1 item)">rbac</a></li> <li><a href="https://gitenterprise.me/tag/release/" class="tag-cloud-link tag-link-7781 tag-link-position-55" style="font-size: 10.333333333333pt;" aria-label="release (2 items)">release</a></li> <li><a href="https://gitenterprise.me/tag/replication/" class="tag-cloud-link tag-link-481477 tag-link-position-56" style="font-size: 8pt;" aria-label="replication (1 item)">replication</a></li> <li><a href="https://gitenterprise.me/tag/reviewdb/" class="tag-cloud-link tag-link-596510661 tag-link-position-57" style="font-size: 8pt;" aria-label="ReviewDb (1 item)">ReviewDb</a></li> <li><a href="https://gitenterprise.me/tag/scala/" class="tag-cloud-link tag-link-312256 tag-link-position-58" style="font-size: 8pt;" aria-label="Scala (1 item)">Scala</a></li> <li><a href="https://gitenterprise.me/tag/scalability/" class="tag-cloud-link tag-link-157223 tag-link-position-59" style="font-size: 8pt;" aria-label="scalability (1 item)">scalability</a></li> <li><a href="https://gitenterprise.me/tag/scm/" class="tag-cloud-link tag-link-101807 tag-link-position-60" style="font-size: 8pt;" aria-label="scm (1 item)">scm</a></li> <li><a href="https://gitenterprise.me/tag/scope/" class="tag-cloud-link tag-link-15710 tag-link-position-61" style="font-size: 8pt;" aria-label="scope (1 item)">scope</a></li> <li><a href="https://gitenterprise.me/tag/security/" class="tag-cloud-link tag-link-801 tag-link-position-62" style="font-size: 8pt;" aria-label="security (1 item)">security</a></li> <li><a href="https://gitenterprise.me/tag/software/" class="tag-cloud-link tag-link-581 tag-link-position-63" style="font-size: 8pt;" aria-label="software (1 item)">software</a></li> <li><a href="https://gitenterprise.me/tag/software-development/" class="tag-cloud-link tag-link-2301 tag-link-position-64" style="font-size: 10.333333333333pt;" aria-label="software-development (2 items)">software-development</a></li> <li><a href="https://gitenterprise.me/tag/sox/" class="tag-cloud-link tag-link-4956 tag-link-position-65" style="font-size: 8pt;" aria-label="sox (1 item)">sox</a></li> <li><a href="https://gitenterprise.me/tag/spark/" class="tag-cloud-link tag-link-63429 tag-link-position-66" style="font-size: 8pt;" aria-label="spark (1 item)">spark</a></li> <li><a href="https://gitenterprise.me/tag/summit/" class="tag-cloud-link tag-link-115537 tag-link-position-67" style="font-size: 10.333333333333pt;" aria-label="summit (2 items)">summit</a></li> <li><a href="https://gitenterprise.me/tag/technology/" class="tag-cloud-link tag-link-6 tag-link-position-68" style="font-size: 10.333333333333pt;" aria-label="technology (2 items)">technology</a></li> <li><a href="https://gitenterprise.me/tag/triagrams/" class="tag-cloud-link tag-link-412664764 tag-link-position-69" style="font-size: 8pt;" aria-label="triagrams (1 item)">triagrams</a></li> <li><a href="https://gitenterprise.me/tag/unicode/" class="tag-cloud-link tag-link-34880 tag-link-position-70" style="font-size: 8pt;" aria-label="Unicode (1 item)">Unicode</a></li> <li><a href="https://gitenterprise.me/tag/upgrade/" class="tag-cloud-link tag-link-8683 tag-link-position-71" style="font-size: 8pt;" aria-label="upgrade (1 item)">upgrade</a></li> <li><a href="https://gitenterprise.me/tag/user-summit/" class="tag-cloud-link tag-link-212859364 tag-link-position-72" style="font-size: 14.222222222222pt;" aria-label="user summit (5 items)">user summit</a></li> <li><a href="https://gitenterprise.me/tag/utf-8/" class="tag-cloud-link tag-link-241625 tag-link-position-73" style="font-size: 8pt;" aria-label="utf-8 (1 item)">utf-8</a></li> <li><a href="https://gitenterprise.me/tag/web-components/" class="tag-cloud-link tag-link-12762127 tag-link-position-74" style="font-size: 8pt;" aria-label="web components (1 item)">web components</a></li> <li><a href="https://gitenterprise.me/tag/zero-downtime/" class="tag-cloud-link tag-link-28327653 tag-link-position-75" style="font-size: 10.333333333333pt;" aria-label="zero downtime (2 items)">zero downtime</a></li> </ul> </aside><aside id="archives-4" class="widget widget_archive"><h3 class="widget-title">Archives</h3> <ul> <li><a href='https://gitenterprise.me/2025/02/'>February 2025</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2025/01/'>January 2025</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2024/12/'>December 2024</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2024/11/'>November 2024</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2024/09/'>September 2024</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2024/06/'>June 2024</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2024/01/'>January 2024</a>&nbsp;(2)</li> <li><a href='https://gitenterprise.me/2023/11/'>November 2023</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2023/06/'>June 2023</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2023/01/'>January 2023</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2022/11/'>November 2022</a>&nbsp;(2)</li> <li><a href='https://gitenterprise.me/2022/09/'>September 2022</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2022/02/'>February 2022</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2022/01/'>January 2022</a>&nbsp;(2)</li> <li><a href='https://gitenterprise.me/2021/12/'>December 2021</a>&nbsp;(3)</li> <li><a href='https://gitenterprise.me/2021/11/'>November 2021</a>&nbsp;(5)</li> <li><a href='https://gitenterprise.me/2021/05/'>May 2021</a>&nbsp;(2)</li> <li><a href='https://gitenterprise.me/2021/04/'>April 2021</a>&nbsp;(3)</li> <li><a href='https://gitenterprise.me/2021/01/'>January 2021</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2020/12/'>December 2020</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2020/06/'>June 2020</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2020/05/'>May 2020</a>&nbsp;(2)</li> <li><a href='https://gitenterprise.me/2020/04/'>April 2020</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2019/12/'>December 2019</a>&nbsp;(3)</li> <li><a href='https://gitenterprise.me/2019/10/'>October 2019</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2019/09/'>September 2019</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2019/06/'>June 2019</a>&nbsp;(2)</li> <li><a href='https://gitenterprise.me/2019/05/'>May 2019</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2019/03/'>March 2019</a>&nbsp;(2)</li> <li><a href='https://gitenterprise.me/2019/02/'>February 2019</a>&nbsp;(2)</li> <li><a href='https://gitenterprise.me/2019/01/'>January 2019</a>&nbsp;(2)</li> <li><a href='https://gitenterprise.me/2018/12/'>December 2018</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2018/11/'>November 2018</a>&nbsp;(2)</li> <li><a href='https://gitenterprise.me/2018/09/'>September 2018</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2018/06/'>June 2018</a>&nbsp;(2)</li> <li><a href='https://gitenterprise.me/2018/05/'>May 2018</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2018/04/'>April 2018</a>&nbsp;(2)</li> <li><a href='https://gitenterprise.me/2018/01/'>January 2018</a>&nbsp;(3)</li> <li><a href='https://gitenterprise.me/2017/12/'>December 2017</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2017/11/'>November 2017</a>&nbsp;(3)</li> <li><a href='https://gitenterprise.me/2017/10/'>October 2017</a>&nbsp;(3)</li> <li><a href='https://gitenterprise.me/2017/09/'>September 2017</a>&nbsp;(3)</li> <li><a href='https://gitenterprise.me/2017/05/'>May 2017</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2017/03/'>March 2017</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2017/02/'>February 2017</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2016/11/'>November 2016</a>&nbsp;(4)</li> <li><a href='https://gitenterprise.me/2016/10/'>October 2016</a>&nbsp;(2)</li> <li><a href='https://gitenterprise.me/2016/03/'>March 2016</a>&nbsp;(4)</li> <li><a href='https://gitenterprise.me/2015/11/'>November 2015</a>&nbsp;(2)</li> <li><a href='https://gitenterprise.me/2015/10/'>October 2015</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2015/07/'>July 2015</a>&nbsp;(2)</li> <li><a href='https://gitenterprise.me/2015/06/'>June 2015</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2015/05/'>May 2015</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2015/04/'>April 2015</a>&nbsp;(2)</li> <li><a href='https://gitenterprise.me/2015/03/'>March 2015</a>&nbsp;(5)</li> <li><a href='https://gitenterprise.me/2015/02/'>February 2015</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2014/09/'>September 2014</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2014/07/'>July 2014</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2014/04/'>April 2014</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2014/03/'>March 2014</a>&nbsp;(4)</li> <li><a href='https://gitenterprise.me/2014/02/'>February 2014</a>&nbsp;(2)</li> <li><a href='https://gitenterprise.me/2014/01/'>January 2014</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2013/12/'>December 2013</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2013/10/'>October 2013</a>&nbsp;(3)</li> <li><a href='https://gitenterprise.me/2013/08/'>August 2013</a>&nbsp;(3)</li> <li><a href='https://gitenterprise.me/2013/07/'>July 2013</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2013/06/'>June 2013</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2013/04/'>April 2013</a>&nbsp;(3)</li> <li><a href='https://gitenterprise.me/2013/03/'>March 2013</a>&nbsp;(3)</li> <li><a href='https://gitenterprise.me/2013/02/'>February 2013</a>&nbsp;(3)</li> <li><a href='https://gitenterprise.me/2013/01/'>January 2013</a>&nbsp;(3)</li> <li><a href='https://gitenterprise.me/2012/12/'>December 2012</a>&nbsp;(1)</li> <li><a href='https://gitenterprise.me/2010/11/'>November 2010</a>&nbsp;(1)</li> </ul> </aside> </div><!-- #secondary .widget-area --> </div><!-- #main --> <footer id="colophon"> <div id="supplementary" class="three"> <div id="first" class="widget-area" role="complementary"> <aside id="blog-stats-4" class="widget widget_blog-stats"><h3 class="widget-title">Blog Stats</h3> <ul> <li>298,076 hits</li> </ul> </aside> </div><!-- #first .widget-area --> <div id="second" class="widget-area" role="complementary"> <aside id="wpcom_social_media_icons_widget-5" class="widget widget_wpcom_social_media_icons_widget"><h3 class="widget-title">Keep in touch</h3><ul><li><a href="https://www.facebook.com/GerritForge/" class="genericon genericon-facebook" target="_blank"><span class="screen-reader-text">View GerritForge&#8217;s profile on Facebook</span></a></li><li><a href="https://twitter.com/GerritReview/" class="genericon genericon-twitter" target="_blank"><span class="screen-reader-text">View GerritReview&#8217;s profile on Twitter</span></a></li><li><a href="https://github.com/GerritForge/" class="genericon genericon-github" target="_blank"><span class="screen-reader-text">View GerritForge&#8217;s profile on GitHub</span></a></li><li><a href="https://www.youtube.com/channel/UCmX-TZXPuidt3gL8F7CVjtw/" class="genericon genericon-youtube" target="_blank"><span class="screen-reader-text">View UCmX-TZXPuidt3gL8F7CVjtw&#8217;s profile on YouTube</span></a></li></ul></aside><aside id="follow_button_widget-3" class="widget widget_follow_button_widget"> <a class="wordpress-follow-button" href="https://gitenterprise.me" data-blog="17973225" data-lang="en" data-show-follower-count="true">Follow GerritForge Blog on WordPress.com</a> <script type="text/javascript">(function(d){ window.wpcomPlatform = {"titles":{"timelines":"Embeddable Timelines","followButton":"Follow Button","wpEmbeds":"WordPress Embeds"}}; var f = d.getElementsByTagName('SCRIPT')[0], p = d.createElement('SCRIPT');p.type = 'text/javascript';p.async = true;p.src = '//widgets.wp.com/platform.js';f.parentNode.insertBefore(p,f);}(document));</script> </aside> </div><!-- #second .widget-area --> <div id="third" class="widget-area" role="complementary"> <aside id="recent-comments-4" class="widget widget_recent_comments"><h3 class="widget-title">Recent Comments</h3> <table class="recentcommentsavatar" cellspacing="0" cellpadding="0" border="0"> <tr><td title="Daniele Sassoli" class="recentcommentsavatartop" style="height:32px; width:32px;"><img alt='' src='https://1.gravatar.com/avatar/7ecdc355529a83e171add7cf16b66b958cbc5ea3b437bfd4c50b1fb1a310e657?s=32&#038;d=&#038;r=G' srcset='https://1.gravatar.com/avatar/7ecdc355529a83e171add7cf16b66b958cbc5ea3b437bfd4c50b1fb1a310e657?s=32&#038;d=&#038;r=G 1x, https://1.gravatar.com/avatar/7ecdc355529a83e171add7cf16b66b958cbc5ea3b437bfd4c50b1fb1a310e657?s=48&#038;d=&#038;r=G 1.5x, https://1.gravatar.com/avatar/7ecdc355529a83e171add7cf16b66b958cbc5ea3b437bfd4c50b1fb1a310e657?s=64&#038;d=&#038;r=G 2x, https://1.gravatar.com/avatar/7ecdc355529a83e171add7cf16b66b958cbc5ea3b437bfd4c50b1fb1a310e657?s=96&#038;d=&#038;r=G 3x, https://1.gravatar.com/avatar/7ecdc355529a83e171add7cf16b66b958cbc5ea3b437bfd4c50b1fb1a310e657?s=128&#038;d=&#038;r=G 4x' class='avatar avatar-32' height='32' width='32' loading='lazy' decoding='async' /></td><td class="recentcommentstexttop" style="">Daniele Sassoli on <a href="https://gitenterprise.me/2017/12/18/gerrit-user-summit-multimaster-at-qualcomm/#comment-25059">Gerrit User Summit: Multimaste&hellip;</a></td></tr> </table> </aside> </div><!-- #third .widget-area --> </div><!-- #supplementary --> <div id="site-generator"> <a href="https://wordpress.com/?ref=footer_blog" rel="nofollow">Blog at WordPress.com.</a> </div> </footer><!-- #colophon --> </div><!-- #page --> <script type="text/javascript"> var infiniteScroll = {"settings":{"id":"content","ajaxurl":"https:\/\/gitenterprise.me\/?infinity=scrolling","type":"click","wrapper":true,"wrapper_class":"infinite-wrap","footer":"page","click_handle":"1","text":"Older posts","totop":"Scroll back to top","currentday":"02.06.23","order":"DESC","scripts":[],"styles":[],"google_analytics":false,"offset":1,"history":{"host":"gitenterprise.me","path":"\/page\/%d\/","use_trailing_slashes":true,"parameters":""},"query_args":{"error":"","m":"","p":0,"post_parent":"","subpost":"","subpost_id":"","attachment":"","attachment_id":0,"name":"","pagename":"","page_id":0,"second":"","minute":"","hour":"","day":0,"monthnum":0,"year":0,"w":0,"category_name":"","tag":"","cat":"","tag_id":"","author":"","author_name":"","feed":"","tb":"","paged":0,"meta_key":"","meta_value":"","preview":"","s":"","sentence":"","title":"","fields":"","menu_order":"","embed":"","category__in":[],"category__not_in":[],"category__and":[],"post__in":[],"post__not_in":[],"post_name__in":[],"tag__in":[],"tag__not_in":[],"tag__and":[],"tag_slug__in":[],"tag_slug__and":[],"post_parent__in":[],"post_parent__not_in":[],"author__in":[],"author__not_in":[],"search_columns":[],"lazy_load_term_meta":false,"posts_per_page":10,"ignore_sticky_posts":false,"suppress_filters":false,"cache_results":true,"update_post_term_cache":true,"update_menu_item_cache":false,"update_post_meta_cache":true,"post_type":"","nopaging":false,"comments_per_page":"50","no_found_rows":false,"order":"DESC"},"query_before":"2025-02-18 10:28:45","last_post_date":"2023-06-02 13:09:23","body_class":"infinite-scroll","loading_text":"Loading new page","stats":"blog=17973225&v=wpcom&tz=1&user_id=0&subd=gitenterprise&x_pagetype=infinite-click"}}; </script> <!-- --> <script type="text/javascript" src="//0.gravatar.com/js/hovercards/hovercards.min.js?ver=2025087d8bf6c02970a26c6b0c26b0fcfc89796aa30f84307cffd8fd28d2bcca53dd7a" id="grofiles-cards-js"></script> <script type="text/javascript" id="wpgroho-js-extra"> /* <![CDATA[ */ var WPGroHo = {"my_hash":""}; /* ]]> */ </script> <script crossorigin='anonymous' type='text/javascript' src='https://s2.wp.com/wp-content/mu-plugins/gravatar-hovercards/wpgroho.js?m=1610363240i'></script> <script> // Initialize and attach hovercards to all gravatars ( function() { function init() { if ( typeof Gravatar === 'undefined' ) { return; } if ( typeof Gravatar.init !== 'function' ) { return; } Gravatar.profile_cb = function ( hash, id ) { WPGroHo.syncProfileData( hash, id ); }; Gravatar.my_hash = WPGroHo.my_hash; Gravatar.init( 'body', '#wp-admin-bar-my-account', { i18n: { 'Edit your profile →': 'Edit your profile →', 'View profile →': 'View profile →', 'Contact': 'Contact', 'Send money': 'Send money', 'Sorry, we are unable to load this Gravatar profile.': 'Sorry, we are unable to load this Gravatar profile.', 'Profile not found.': 'Profile not found.', 'Too Many Requests.': 'Too Many Requests.', 'Internal Server Error.': 'Internal Server Error.', }, } ); } if ( document.readyState !== 'loading' ) { init(); } else { document.addEventListener( 'DOMContentLoaded', init ); } } )(); </script> <div style="display:none"> <div class="grofile-hash-map-f3cd43fe529dfb5e8a44bad20c52dcbd"> </div> </div> <div id="actionbar" dir="ltr" style="display: none;" class="actnbr-pub-twentyeleven actnbr-has-follow actnbr-has-actions"> <ul> <li class="actnbr-btn actnbr-hidden"> <a class="actnbr-action actnbr-actn-follow " href=""> <svg class="gridicon" height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path clip-rule="evenodd" d="m4 4.5h12v6.5h1.5v-6.5-1.5h-1.5-12-1.5v1.5 10.5c0 1.1046.89543 2 2 2h7v-1.5h-7c-.27614 0-.5-.2239-.5-.5zm10.5 2h-9v1.5h9zm-5 3h-4v1.5h4zm3.5 1.5h-1v1h1zm-1-1.5h-1.5v1.5 1 1.5h1.5 1 1.5v-1.5-1-1.5h-1.5zm-2.5 2.5h-4v1.5h4zm6.5 1.25h1.5v2.25h2.25v1.5h-2.25v2.25h-1.5v-2.25h-2.25v-1.5h2.25z" fill-rule="evenodd"></path></svg> <span>Subscribe</span> </a> <a class="actnbr-action actnbr-actn-following no-display" href=""> <svg class="gridicon" height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill-rule="evenodd" clip-rule="evenodd" d="M16 4.5H4V15C4 15.2761 4.22386 15.5 4.5 15.5H11.5V17H4.5C3.39543 17 2.5 16.1046 2.5 15V4.5V3H4H16H17.5V4.5V12.5H16V4.5ZM5.5 6.5H14.5V8H5.5V6.5ZM5.5 9.5H9.5V11H5.5V9.5ZM12 11H13V12H12V11ZM10.5 9.5H12H13H14.5V11V12V13.5H13H12H10.5V12V11V9.5ZM5.5 12H9.5V13.5H5.5V12Z" fill="#008A20"></path><path class="following-icon-tick" d="M13.5 16L15.5 18L19 14.5" stroke="#008A20" stroke-width="1.5"></path></svg> <span>Subscribed</span> </a> <div class="actnbr-popover tip tip-top-left actnbr-notice" id="follow-bubble"> <div class="tip-arrow"></div> <div class="tip-inner actnbr-follow-bubble"> <ul> <li class="actnbr-sitename"> <a href="https://gitenterprise.me"> <img loading='lazy' alt='' src='https://secure.gravatar.com/blavatar/eed96af042594364b60c41a0d2e7491f1f820da3cb34dde769ea4ebc2f758cc7?s=50&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png' srcset='https://secure.gravatar.com/blavatar/eed96af042594364b60c41a0d2e7491f1f820da3cb34dde769ea4ebc2f758cc7?s=50&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 1x, https://secure.gravatar.com/blavatar/eed96af042594364b60c41a0d2e7491f1f820da3cb34dde769ea4ebc2f758cc7?s=75&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 1.5x, https://secure.gravatar.com/blavatar/eed96af042594364b60c41a0d2e7491f1f820da3cb34dde769ea4ebc2f758cc7?s=100&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 2x, https://secure.gravatar.com/blavatar/eed96af042594364b60c41a0d2e7491f1f820da3cb34dde769ea4ebc2f758cc7?s=150&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 3x, https://secure.gravatar.com/blavatar/eed96af042594364b60c41a0d2e7491f1f820da3cb34dde769ea4ebc2f758cc7?s=200&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 4x' class='avatar avatar-50' height='50' width='50' /> GerritForge Blog </a> </li> <div class="actnbr-message no-display"></div> <form method="post" action="https://subscribe.wordpress.com" accept-charset="utf-8" style="display: none;"> <div class="actnbr-follow-count">Join 159 other subscribers</div> <div> <input type="email" name="email" placeholder="Enter your email address" class="actnbr-email-field" aria-label="Enter your email address" /> </div> <input type="hidden" name="action" value="subscribe" /> <input type="hidden" name="blog_id" value="17973225" /> <input type="hidden" name="source" value="https://gitenterprise.me/" /> <input type="hidden" name="sub-type" value="actionbar-follow" /> <input type="hidden" id="_wpnonce" name="_wpnonce" value="f1ef094c29" /> <div class="actnbr-button-wrap"> <button type="submit" value="Sign me up"> Sign me up </button> </div> </form> <li class="actnbr-login-nudge"> <div> Already have a WordPress.com account? <a href="https://wordpress.com/log-in?redirect_to=https%3A%2F%2Fr-login.wordpress.com%2Fremote-login.php%3Faction%3Dlink%26back%3Dhttps%253A%252F%252Fgitenterprise.me%252F2025%252F02%252F04%252Fgerrit-acls-the-most-powerful-of-any-git-server-yet%252F">Log in now.</a> </div> </li> </ul> </div> </div> </li> <li class="actnbr-ellipsis actnbr-hidden"> <svg class="gridicon gridicons-ellipsis" height="24" width="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><g><path d="M7 12c0 1.104-.896 2-2 2s-2-.896-2-2 .896-2 2-2 2 .896 2 2zm12-2c-1.104 0-2 .896-2 2s.896 2 2 2 2-.896 2-2-.896-2-2-2zm-7 0c-1.104 0-2 .896-2 2s.896 2 2 2 2-.896 2-2-.896-2-2-2z"/></g></svg> <div class="actnbr-popover tip tip-top-left actnbr-more"> <div class="tip-arrow"></div> <div class="tip-inner"> <ul> <li class="actnbr-sitename"> <a href="https://gitenterprise.me"> <img loading='lazy' alt='' src='https://secure.gravatar.com/blavatar/eed96af042594364b60c41a0d2e7491f1f820da3cb34dde769ea4ebc2f758cc7?s=50&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png' srcset='https://secure.gravatar.com/blavatar/eed96af042594364b60c41a0d2e7491f1f820da3cb34dde769ea4ebc2f758cc7?s=50&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 1x, https://secure.gravatar.com/blavatar/eed96af042594364b60c41a0d2e7491f1f820da3cb34dde769ea4ebc2f758cc7?s=75&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 1.5x, https://secure.gravatar.com/blavatar/eed96af042594364b60c41a0d2e7491f1f820da3cb34dde769ea4ebc2f758cc7?s=100&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 2x, https://secure.gravatar.com/blavatar/eed96af042594364b60c41a0d2e7491f1f820da3cb34dde769ea4ebc2f758cc7?s=150&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 3x, https://secure.gravatar.com/blavatar/eed96af042594364b60c41a0d2e7491f1f820da3cb34dde769ea4ebc2f758cc7?s=200&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 4x' class='avatar avatar-50' height='50' width='50' /> GerritForge Blog </a> </li> <li class="actnbr-folded-follow"> <a class="actnbr-action actnbr-actn-follow " href=""> <svg class="gridicon" height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path clip-rule="evenodd" d="m4 4.5h12v6.5h1.5v-6.5-1.5h-1.5-12-1.5v1.5 10.5c0 1.1046.89543 2 2 2h7v-1.5h-7c-.27614 0-.5-.2239-.5-.5zm10.5 2h-9v1.5h9zm-5 3h-4v1.5h4zm3.5 1.5h-1v1h1zm-1-1.5h-1.5v1.5 1 1.5h1.5 1 1.5v-1.5-1-1.5h-1.5zm-2.5 2.5h-4v1.5h4zm6.5 1.25h1.5v2.25h2.25v1.5h-2.25v2.25h-1.5v-2.25h-2.25v-1.5h2.25z" fill-rule="evenodd"></path></svg> <span>Subscribe</span> </a> <a class="actnbr-action actnbr-actn-following no-display" href=""> <svg class="gridicon" height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill-rule="evenodd" clip-rule="evenodd" d="M16 4.5H4V15C4 15.2761 4.22386 15.5 4.5 15.5H11.5V17H4.5C3.39543 17 2.5 16.1046 2.5 15V4.5V3H4H16H17.5V4.5V12.5H16V4.5ZM5.5 6.5H14.5V8H5.5V6.5ZM5.5 9.5H9.5V11H5.5V9.5ZM12 11H13V12H12V11ZM10.5 9.5H12H13H14.5V11V12V13.5H13H12H10.5V12V11V9.5ZM5.5 12H9.5V13.5H5.5V12Z" fill="#008A20"></path><path class="following-icon-tick" d="M13.5 16L15.5 18L19 14.5" stroke="#008A20" stroke-width="1.5"></path></svg> <span>Subscribed</span> </a> </li> <li class="actnbr-signup"><a href="https://wordpress.com/start/">Sign up</a></li> <li class="actnbr-login"><a href="https://wordpress.com/log-in?redirect_to=https%3A%2F%2Fr-login.wordpress.com%2Fremote-login.php%3Faction%3Dlink%26back%3Dhttps%253A%252F%252Fgitenterprise.me%252F2025%252F02%252F04%252Fgerrit-acls-the-most-powerful-of-any-git-server-yet%252F">Log in</a></li> <li class="flb-report"> <a href="https://wordpress.com/abuse/?report_url=https://gitenterprise.me" target="_blank" rel="noopener noreferrer"> Report this content </a> </li> <li class="actnbr-reader"> <a href="https://wordpress.com/reader/feeds/7323783"> View site in Reader </a> </li> <li class="actnbr-subs"> <a href="https://subscribe.wordpress.com/">Manage subscriptions</a> </li> <li class="actnbr-fold"><a href="">Collapse this bar</a></li> </ul> </div> </div> </li> </ul> </div> <script> window.addEventListener( "load", function( event ) { var link = document.createElement( "link" ); link.href = "https://s0.wp.com/wp-content/mu-plugins/actionbar/actionbar.css?v=20250116"; link.type = "text/css"; link.rel = "stylesheet"; document.head.appendChild( link ); var script = document.createElement( "script" ); script.src = "https://s0.wp.com/wp-content/mu-plugins/actionbar/actionbar.js?v=20250204"; script.defer = true; document.body.appendChild( script ); } ); </script> <div id="jp-carousel-loading-overlay"> <div id="jp-carousel-loading-wrapper"> <span id="jp-carousel-library-loading">&nbsp;</span> </div> </div> <div class="jp-carousel-overlay" style="display: none;"> <div class="jp-carousel-container"> <!-- The Carousel Swiper --> <div class="jp-carousel-wrap swiper-container jp-carousel-swiper-container jp-carousel-transitions" itemscope itemtype="https://schema.org/ImageGallery"> <div class="jp-carousel swiper-wrapper"></div> <div class="jp-swiper-button-prev swiper-button-prev"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="maskPrev" mask-type="alpha" maskUnits="userSpaceOnUse" x="8" y="6" width="9" height="12"> <path d="M16.2072 16.59L11.6496 12L16.2072 7.41L14.8041 6L8.8335 12L14.8041 18L16.2072 16.59Z" fill="white"/> </mask> <g mask="url(#maskPrev)"> <rect x="0.579102" width="23.8823" height="24" fill="#FFFFFF"/> </g> </svg> </div> <div class="jp-swiper-button-next swiper-button-next"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="maskNext" mask-type="alpha" maskUnits="userSpaceOnUse" x="8" y="6" width="8" height="12"> <path d="M8.59814 16.59L13.1557 12L8.59814 7.41L10.0012 6L15.9718 12L10.0012 18L8.59814 16.59Z" fill="white"/> </mask> <g mask="url(#maskNext)"> <rect x="0.34375" width="23.8822" height="24" fill="#FFFFFF"/> </g> </svg> </div> </div> <!-- The main close buton --> <div class="jp-carousel-close-hint"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="maskClose" mask-type="alpha" maskUnits="userSpaceOnUse" x="5" y="5" width="15" height="14"> <path d="M19.3166 6.41L17.9135 5L12.3509 10.59L6.78834 5L5.38525 6.41L10.9478 12L5.38525 17.59L6.78834 19L12.3509 13.41L17.9135 19L19.3166 17.59L13.754 12L19.3166 6.41Z" fill="white"/> </mask> <g mask="url(#maskClose)"> <rect x="0.409668" width="23.8823" height="24" fill="#FFFFFF"/> </g> </svg> </div> <!-- Image info, comments and meta --> <div class="jp-carousel-info"> <div class="jp-carousel-info-footer"> <div class="jp-carousel-pagination-container"> <div class="jp-swiper-pagination swiper-pagination"></div> <div class="jp-carousel-pagination"></div> </div> <div class="jp-carousel-photo-title-container"> <h2 class="jp-carousel-photo-caption"></h2> </div> <div class="jp-carousel-photo-icons-container"> <a href="#" class="jp-carousel-icon-btn jp-carousel-icon-info" aria-label="Toggle photo metadata visibility"> <span class="jp-carousel-icon"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="maskInfo" mask-type="alpha" maskUnits="userSpaceOnUse" x="2" y="2" width="21" height="20"> <path fill-rule="evenodd" clip-rule="evenodd" d="M12.7537 2C7.26076 2 2.80273 6.48 2.80273 12C2.80273 17.52 7.26076 22 12.7537 22C18.2466 22 22.7046 17.52 22.7046 12C22.7046 6.48 18.2466 2 12.7537 2ZM11.7586 7V9H13.7488V7H11.7586ZM11.7586 11V17H13.7488V11H11.7586ZM4.79292 12C4.79292 16.41 8.36531 20 12.7537 20C17.142 20 20.7144 16.41 20.7144 12C20.7144 7.59 17.142 4 12.7537 4C8.36531 4 4.79292 7.59 4.79292 12Z" fill="white"/> </mask> <g mask="url(#maskInfo)"> <rect x="0.8125" width="23.8823" height="24" fill="#FFFFFF"/> </g> </svg> </span> </a> <a href="#" class="jp-carousel-icon-btn jp-carousel-icon-comments" aria-label="Toggle photo comments visibility"> <span class="jp-carousel-icon"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="maskComments" mask-type="alpha" maskUnits="userSpaceOnUse" x="2" y="2" width="21" height="20"> <path fill-rule="evenodd" clip-rule="evenodd" d="M4.3271 2H20.2486C21.3432 2 22.2388 2.9 22.2388 4V16C22.2388 17.1 21.3432 18 20.2486 18H6.31729L2.33691 22V4C2.33691 2.9 3.2325 2 4.3271 2ZM6.31729 16H20.2486V4H4.3271V18L6.31729 16Z" fill="white"/> </mask> <g mask="url(#maskComments)"> <rect x="0.34668" width="23.8823" height="24" fill="#FFFFFF"/> </g> </svg> <span class="jp-carousel-has-comments-indicator" aria-label="This image has comments."></span> </span> </a> </div> </div> <div class="jp-carousel-info-extra"> <div class="jp-carousel-info-content-wrapper"> <div class="jp-carousel-photo-title-container"> <h2 class="jp-carousel-photo-title"></h2> </div> <div class="jp-carousel-comments-wrapper"> <div id="jp-carousel-comments-loading"> <span>Loading Comments...</span> </div> <div class="jp-carousel-comments"></div> <div id="jp-carousel-comment-form-container"> <span id="jp-carousel-comment-form-spinner">&nbsp;</span> <div id="jp-carousel-comment-post-results"></div> <form id="jp-carousel-comment-form"> <label for="jp-carousel-comment-form-comment-field" class="screen-reader-text">Write a Comment...</label> <textarea name="comment" class="jp-carousel-comment-form-field jp-carousel-comment-form-textarea" id="jp-carousel-comment-form-comment-field" placeholder="Write a Comment..." ></textarea> <div id="jp-carousel-comment-form-submit-and-info-wrapper"> <div id="jp-carousel-comment-form-commenting-as"> <fieldset> <label for="jp-carousel-comment-form-email-field">Email (Required)</label> <input type="text" name="email" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-email-field" /> </fieldset> <fieldset> <label for="jp-carousel-comment-form-author-field">Name (Required)</label> <input type="text" name="author" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-author-field" /> </fieldset> <fieldset> <label for="jp-carousel-comment-form-url-field">Website</label> <input type="text" name="url" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-url-field" /> </fieldset> </div> <input type="submit" name="submit" class="jp-carousel-comment-form-button" id="jp-carousel-comment-form-button-submit" value="Post Comment" /> </div> </form> </div> </div> <div class="jp-carousel-image-meta"> <div class="jp-carousel-title-and-caption"> <div class="jp-carousel-photo-info"> <h3 class="jp-carousel-caption" itemprop="caption description"></h3> </div> <div class="jp-carousel-photo-description"></div> </div> <ul class="jp-carousel-image-exif" style="display: none;"></ul> <a class="jp-carousel-image-download" href="#" target="_blank" style="display: none;"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="3" y="3" width="19" height="18"> <path fill-rule="evenodd" clip-rule="evenodd" d="M5.84615 5V19H19.7775V12H21.7677V19C21.7677 20.1 20.8721 21 19.7775 21H5.84615C4.74159 21 3.85596 20.1 3.85596 19V5C3.85596 3.9 4.74159 3 5.84615 3H12.8118V5H5.84615ZM14.802 5V3H21.7677V10H19.7775V6.41L9.99569 16.24L8.59261 14.83L18.3744 5H14.802Z" fill="white"/> </mask> <g mask="url(#mask0)"> <rect x="0.870605" width="23.8823" height="24" fill="#FFFFFF"/> </g> </svg> <span class="jp-carousel-download-text"></span> </a> <div class="jp-carousel-image-map" style="display: none;"></div> </div> </div> </div> </div> </div> </div> <link crossorigin='anonymous' rel='stylesheet' id='all-css-0-2' href='https://s0.wp.com/_static/??-eJydj8EOAiEMRH9I7HLYjRfjpxiEhnSFQigN8e81Wffmxb3NNDMvHRjV+MIduUNWU5NGYoEVe3X++fUgypBL0IQC3rWigglkUMVmHsoh4dmLnOA4bM/shz95d2IPERkbfQryWx78cVCI2AWkeHLJZAzkzMaW/tqm3/LVLpfZ2nlapvUNgJiBFQ==&cssminify=yes' type='text/css' media='all' /> <style id='core-block-supports-inline-css'> .wp-block-gallery.wp-block-gallery-1{--wp--style--unstable-gallery-gap:var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) );gap:var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) );}.wp-container-core-columns-is-layout-1{flex-wrap:nowrap;} </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-2-2' href='https://s2.wp.com/wp-content/mu-plugins/jetpack-plugin/sun/modules/tiled-gallery/tiled-gallery/tiled-gallery.css?m=1692973127i&cssminify=yes' type='text/css' media='all' /> <script type="text/javascript" id="coblocks-loader-js-extra"> /* <![CDATA[ */ var wpcom_coblocks_js = {"coblocks_masonry_js":"https:\/\/s2.wp.com\/wp-content\/plugins\/coblocks\/2.18.1-simple-rev.4\/dist\/js\/coblocks-masonry.min.js","coblocks_lightbox_js":"https:\/\/s2.wp.com\/wp-content\/plugins\/coblocks\/2.18.1-simple-rev.4\/dist\/js\/coblocks-lightbox.min.js","jquery_core_js":"\/wp-includes\/js\/jquery\/jquery.min.js","jquery_migrate_js":"\/wp-includes\/js\/jquery\/jquery-migrate.min.js","masonry_js":"\/wp-includes\/js\/masonry.min.js","imagesloaded_js":"\/wp-includes\/js\/imagesloaded.min.js"}; var coblocksLigthboxData = {"closeLabel":"Close Gallery","leftLabel":"Previous","rightLabel":"Next"}; /* ]]> */ </script> <script type="text/javascript" id="jetpack-carousel-js-extra"> /* <![CDATA[ */ var jetpackSwiperLibraryPath = {"url":"https:\/\/s2.wp.com\/wp-content\/mu-plugins\/jetpack-plugin\/sun\/_inc\/build\/carousel\/swiper-bundle.min.js"}; var jetpackCarouselStrings = {"widths":[370,700,1000,1200,1400,2000],"is_logged_in":"","lang":"en","ajaxurl":"https:\/\/gitenterprise.me\/wp-admin\/admin-ajax.php","nonce":"82adfa74c0","display_exif":"1","display_comments":"1","single_image_gallery":"1","single_image_gallery_media_file":"","background_color":"black","comment":"Comment","post_comment":"Post Comment","write_comment":"Write a Comment...","loading_comments":"Loading Comments...","image_label":"Open image in full-screen.","download_original":"View full size <span class=\"photo-size\">{0}<span class=\"photo-size-times\">\u00d7<\/span>{1}<\/span>","no_comment_text":"Please be sure to submit some text with your comment.","no_comment_email":"Please provide an email address to comment.","no_comment_author":"Please provide your name to comment.","comment_post_error":"Sorry, but there was an error posting your comment. Please try again later.","comment_approved":"Your comment was approved.","comment_unapproved":"Your comment is in moderation.","camera":"Camera","aperture":"Aperture","shutter_speed":"Shutter Speed","focal_length":"Focal Length","copyright":"Copyright","comment_registration":"0","require_name_email":"1","login_url":"https:\/\/gitenterprise.wordpress.com\/wp-login.php?redirect_to=https%3A%2F%2Fgitenterprise.me%2F2025%2F02%2F04%2Fgerrit-acls-the-most-powerful-of-any-git-server-yet%2F","blog_id":"17973225","meta_data":["camera","aperture","shutter_speed","focal_length","copyright"],"stats_query_args":"blog=17973225&v=wpcom&tz=1&user_id=0&subd=gitenterprise","is_public":"1"}; /* ]]> */ </script> <script type="text/javascript" id="custom-content-types-data-js-before"> /* <![CDATA[ */ var CUSTOM_CONTENT_TYPE__INITIAL_STATE; typeof CUSTOM_CONTENT_TYPE__INITIAL_STATE === "object" || (CUSTOM_CONTENT_TYPE__INITIAL_STATE = JSON.parse(decodeURIComponent("%7B%22active%22%3Atrue%2C%22over_ride%22%3Afalse%7D"))); /* ]]> */ </script> <script crossorigin='anonymous' type='text/javascript' src='https://s0.wp.com/_static/??-eJyNj8sOwiAQRX9ImGCtj4XxUwyl2AwO0DCg8e8lphhjXLi8N2dO7sB9FiaGbEMGx+DjgGRFYZv0VDuB4RKl4xV8cL6ImcqEgcHZPGtzXTJwCXDGYGAoSCPUYwyYrWCTIlHLD+kxfEub0cSBorkyrKXaSyUY/VwXJXuTGxiRXzMbJCjq0aZfvr9HGp1i/ZfeWCsW68kf1a7rDmrbd717Aqexb8U='></script> <script type="text/javascript" src="https://platform.twitter.com/widgets.js?ver=20111117" id="twitter-widgets-js"></script> <script crossorigin='anonymous' type='text/javascript' src='https://s2.wp.com/_static/??-eJx9zcEKwjAMgOEXsgtVnO4gPorULIx0aVrWhuHbu8NOQzx+h58f1uIwayNtkMwVsYm1QqRWAs67oZrCixXhbSwjNBYa3RREaPn8U5dYu1hP8PuCYclWSdxaMKcDt+6ZHr6/X70/X4Zb/ALIrz9C'></script> <script type="text/javascript"> (function () { var wpcom_reblog = { source: 'toolbar', toggle_reblog_box_flair: function (obj_id, post_id) { // Go to site selector. This will redirect to their blog if they only have one. const postEndpoint = `https://wordpress.com/post`; // Ideally we would use the permalink here, but fortunately this will be replaced with the // post permalink in the editor. const originalURL = `${ document.location.href }?page_id=${ post_id }`; const url = postEndpoint + '?url=' + encodeURIComponent( originalURL ) + '&is_post_share=true' + '&v=5'; const redirect = function () { if ( ! window.open( url, '_blank' ) ) { location.href = url; } }; if ( /Firefox/.test( navigator.userAgent ) ) { setTimeout( redirect, 0 ); } else { redirect(); } }, }; window.wpcom_reblog = wpcom_reblog; })(); </script> <script type="text/javascript"> (function() { var extend = function(out) { out = out || {}; for (var i = 1; i < arguments.length; i++) { if (!arguments[i]) continue; for (var key in arguments[i]) { if (arguments[i].hasOwnProperty(key)) out[key] = arguments[i][key]; } } return out; }; extend( window.infiniteScroll.settings.scripts, ["jetpack-mu-wpcom-settings","rlt-proxy","wpcom-actionbar-placeholder","grofiles-cards","wpgroho","mobile-useragent-info","custom-content-types-data","the-neverending-homepage","coblocks-loader","jetpack-carousel","twitter-widgets","tiled-gallery","carousel-wpcom"] ); extend( window.infiniteScroll.settings.styles, ["the-neverending-homepage","wp-block-library","wp-block-library-theme","jetpack-layout-grid","jetpack-ratings","mediaelement","wp-mediaelement","coblocks-frontend","wpcom-core-compat-playlist-styles","wpcom-bbpress2-staff-css","twentyeleven-block-style","twentyeleven-wpcom-style","reblogging","geo-location-flair","infinity-twentyeleven","h4-global","wp-emoji-styles","videopress-video-style","jetpack-sharing-buttons-style","classic-theme-styles","global-styles","akismet-widget-style","jetpack-global-styles-frontend-style","jetpack-carousel-swiper-css","jetpack-carousel","genericons","jetpack_social_media_icons_widget","tiled-gallery","core-block-supports","core-block-supports-duotone"] ); })(); </script> <span id="infinite-aria" aria-live="assertive"></span> <script src="//stats.wp.com/w.js?68" defer></script> <script type="text/javascript"> _tkq = window._tkq || []; _stq = window._stq || []; _tkq.push(['storeContext', {'blog_id':'17973225','blog_tz':'1','user_lang':'en','blog_lang':'en','user_id':'0'}]); _stq.push(['view', {'blog':'17973225','v':'wpcom','tz':'1','user_id':'0','subd':'gitenterprise'}]); _stq.push(['extra', {'crypt':'UE40eW5QN0p8M2Y/RE1mNzc2NTVTamdsd0xoLz9RQkM2K298TXY9bERQMXc2MjhEaVZfb2wwakRoSj0mUkp1THptM1NdbkV1WjZIcU9mVWQmPUIvMlN6Jk8wW3NYVEJ3dWZOWExuWD9VNTEucGVTRmZwYTB2ZD82MHd0Y1Y0RlltYWdKeC9TU05lUzUxV1pzZWh8UlVSPSVZTFlSY2FZLDhlcVdYRzB3Ul8wTFswMDRMMX5FQW50QV9BMncvW042YWVCK2pRaGJYLkNtMVQyMFg2OWNEVi9oSHYmXyVPaUc2dEk9K21JMnx0clpibFNFNlBCNWRjdXJDWnZsfGIzdE5WUm02Nk9YQ3pzJjh4NEVrTkpmP2ZDTzlsT2Y0OUdaNlBoWWlLcDFEdWMvPz16WzFNc09iUH5sSj8/MiY0WXkuPz85aGN8RWtqLnRQJmtrfH4rSUJhQXNbMzhTRk5udUpibStfTT1WVCY3TU8mNXBfcWRtYjJ0L3JBWG0rQVBGZmo9PUI='}]); _stq.push([ 'clickTrackerInit', '17973225', '0' ]); </script> <noscript><img src="https://pixel.wp.com/b.gif?v=noscript" style="height:1px;width:1px;overflow:hidden;position:absolute;bottom:1px;" alt="" /></noscript> <script defer id="bilmur" data-provider="wordpress.com" data-service="simple" src="/wp-content/js/bilmur-4.min.js?i=12&m=202508"></script><script> ( function() { function getMobileUserAgentInfo() { if ( typeof wpcom_mobile_user_agent_info === 'object' ) { wpcom_mobile_user_agent_info.init(); var mobileStatsQueryString = ''; if ( wpcom_mobile_user_agent_info.matchedPlatformName !== false ) { mobileStatsQueryString += '&x_' + 'mobile_platforms' + '=' + wpcom_mobile_user_agent_info.matchedPlatformName; } if ( wpcom_mobile_user_agent_info.matchedUserAgentName !== false ) { mobileStatsQueryString += '&x_' + 'mobile_devices' + '=' + wpcom_mobile_user_agent_info.matchedUserAgentName; } if ( wpcom_mobile_user_agent_info.isIPad() ) { mobileStatsQueryString += '&x_' + 'ipad_views' + '=' + 'views'; } if ( mobileStatsQueryString != '' ) { new Image().src = document.location.protocol + '//pixel.wp.com/g.gif?v=wpcom-no-pv' + mobileStatsQueryString + '&baba=' + Math.random(); } } } document.addEventListener( 'DOMContentLoaded', getMobileUserAgentInfo ); } )(); </script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10