<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Code Review &#8211; Best DevOps</title>
	<atom:link href="https://www.bestdevops.com/tag/code-review/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bestdevops.com</link>
	<description>Lets Learn, Do it &#38; Share! Thats a Best DevOps!!!</description>
	<lastBuildDate>Mon, 12 Oct 2026 08:40:19 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>
	<item>
		<title>How can you work with Gerrit code review?</title>
		<link>https://www.bestdevops.com/how-can-you-work-with-gerrit-code-review/</link>
		
		<dc:creator><![CDATA[rahulkr]]></dc:creator>
		<pubDate>Wed, 17 Nov 2021 12:30:23 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[branch]]></category>
		<category><![CDATA[Code Review]]></category>
		<category><![CDATA[committed]]></category>
		<category><![CDATA[Developer]]></category>
		<category><![CDATA[Gerrit]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[repository]]></category>
		<category><![CDATA[Source Code]]></category>
		<category><![CDATA[version-control]]></category>
		<guid isPermaLink="false">https://www.bestdevops.com/?p=22384</guid>

					<description><![CDATA[Welcome to the introductory part of Gerrit. In this article, we would cover all the prominent spaces regarding Gerrit, why [&#8230;]]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img fetchpriority="high" decoding="async" src="https://www.bestdevops.com/wp-content/uploads/2021/11/gerrit-code-review-3.2-intro-1-1024x387.png" alt="" class="wp-image-22390" width="825" height="311" srcset="https://www.bestdevops.com/wp-content/uploads/2021/11/gerrit-code-review-3.2-intro-1-1024x387.png 1024w, https://www.bestdevops.com/wp-content/uploads/2021/11/gerrit-code-review-3.2-intro-1-300x113.png 300w, https://www.bestdevops.com/wp-content/uploads/2021/11/gerrit-code-review-3.2-intro-1-768x290.png 768w, https://www.bestdevops.com/wp-content/uploads/2021/11/gerrit-code-review-3.2-intro-1-1536x580.png 1536w, https://www.bestdevops.com/wp-content/uploads/2021/11/gerrit-code-review-3.2-intro-1-2048x773.png 2048w" sizes="(max-width: 825px) 100vw, 825px" /></figure></div>



<p class="wp-block-paragraph">Welcome to the introductory part of Gerrit. In this article, we would cover all the prominent spaces regarding Gerrit, why use Gerrit? About a code review, and some basic Gerrit terminology.</p>



<h2 class="wp-block-heading">What is Gerrit?</h2>



<p class="wp-block-paragraph">Let’s start with the introduction of Gerrit? Now, take a brief action on <a href="https://www.devopsschool.com/">Gerrit</a>, it is a source code management (SCM) platform that is like a GitHub, bit bucket, or team foundation server in that it manages multiple repositories, tags, branches, and other git resources for multiple projects. Its version control system is GIT. It provides you with an optional code review workflow and access control on git repositories that store changes before they are committed to repository branches. It is a free open-source development and is used by Google to develop an android operating system. So, it&#8217;s free and available, you can easily download it from google.</p>



<h2 class="wp-block-heading">Why use Gerrit?</h2>



<p class="wp-block-paragraph">Now, we have a second option that comes one after the other why are we using it? There are several patterns or behaviors through which you can judge and manage your possibilities. It provides a lightweight framework for reviewing commits before they are accepted into the GIT repository. One more thing, it is performing that captures the team discussion on code changes through change reviews and is persistent and auditable. It allows flexibility to control team workflows to ensure all code changes go through quality assurance checks. And it manages access controls for GIT repositories, and its web-based interface. After this kind of advancement, developers don’t need any additional tools to interact with Gerrit.</p>



<h2 class="wp-block-heading">What is a code review?</h2>



<p class="wp-block-paragraph">A code review is a process of quality assurance that involves other reading and checking source code to offer suggestions, recommendations, or approvals performing a code review into two stages the first is the latest commit pushed as a change, and the second is kept in a staging area for a review. And under the second stage that will be merged into the repository when approved. Along with code review consist of various functions like comments, approvals/rejections, code quality verification, additional patches to fix issues,  the difference between versions, dependencies, and the changing status.</p>



<h2 class="wp-block-heading">Gerrit terminology</h2>



<p class="wp-block-paragraph">Here is some Gerrit terminology that may come up:</p>



<ul class="wp-block-list"><li><strong>Change:</strong> A change represents a single commit that is under review. Particular change is identified with a change-Id.</li></ul>



<ul class="wp-block-list"><li><strong>Patch set: </strong>Patch sets are subsequent commits that are attempting to amend an existing change.</li></ul>



<h4 class="wp-block-heading">Related video:</h4>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe  id="_ytid_91295"  width="675" height="379"  data-origwidth="675" data-origheight="379" src="https://www.youtube.com/embed/48a44t_yz5g?enablejsapi=1&#038;autoplay=0&#038;cc_load_policy=0&#038;cc_lang_pref=&#038;iv_load_policy=1&#038;loop=0&#038;rel=1&#038;fs=1&#038;playsinline=0&#038;autohide=2&#038;theme=dark&#038;color=red&#038;controls=1&#038;disablekb=0&#038;" class="__youtube_prefs__  epyt-is-override  no-lazyload" title="YouTube player"  allow="fullscreen; accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen data-no-lazy="1" data-skipgform_ajax_framebjll=""></iframe>
</div></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Continuous Deployment Using Jenkins: A Real-World Pipeline at Scale</title>
		<link>https://www.bestdevops.com/continuous-deployment-using-jenkins/</link>
					<comments>https://www.bestdevops.com/continuous-deployment-using-jenkins/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Tue, 11 Apr 2017 06:20:11 +0000</pubDate>
				<category><![CDATA[Continuous Delivery]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[DevOps Process]]></category>
		<category><![CDATA[(CI/CD)]]></category>
		<category><![CDATA[CD with jenkins]]></category>
		<category><![CDATA[Code Review]]></category>
		<category><![CDATA[Continuous Deployment]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Jenkins]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=1218</guid>

					<description><![CDATA[Learn how Thumbtack built a continuous deployment pipeline using Jenkins and Gerrit, featuring automated canary rollouts, repository locking, and Slack-integrated deploy notifications.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>This article is based on a case study originally published by Thumbtack Engineering (thumbtack.com), describing their continuous deployment journey starting in late 2015.</em></p>



<h2 class="wp-block-heading">Background: Why Thumbtack Needed a Better Deployment Pipeline</h2>



<p class="wp-block-paragraph">When the author joined Thumbtack in late 2015, the engineering team already had a continuous delivery infrastructure in place for monolith builds. As the team grew, a recurring problem emerged: a significant amount of engineering time was being consumed by the act of deploying the latest build. Deploys were getting larger — so-called &#8220;train deploys&#8221; — and rollbacks were becoming increasingly difficult to execute cleanly.</p>



<p class="wp-block-paragraph">These symptoms pointed to a clear need: invest in a proper, automated deployment pipeline that reduces manual overhead, limits blast radius, and gives engineers clear control at every stage.</p>



<h2 class="wp-block-heading">Continuous Delivery: The Foundation</h2>



<p class="wp-block-paragraph">The existing continuous delivery setup at Thumbtack used <strong>Gerrit</strong> for code review and as the Git repository host. The pipeline worked as follows:</p>



<ol class="wp-block-list">
<li>An engineer submits a Code Review in Gerrit.</li>
<li>Jenkins automatically triggers a build.</li>
<li>Source code is fetched from Gerrit&#8217;s Git repository.</li>
<li>Unit tests are executed. If any fail, the build is aborted and discarded.</li>
<li>If unit tests pass, integration tests are triggered. Again, failure discards the build.</li>
<li>A build that passes all tests is marked as <strong>safe to deploy</strong> and becomes available for promotion.</li>
</ol>



<p class="wp-block-paragraph">This gate-based approach ensured that only validated builds could proceed, but the deployment step itself was still manual and error-prone.</p>



<figure class="wp-block-image"><img decoding="async" src="https://www.thumbtack.com/engineering/wp-content/uploads/2017/04/1491589612_image06.png" alt="Continuous delivery pipeline diagram" width="162" height="722"/><figcaption>Thumbtack&#8217;s continuous delivery pipeline stages</figcaption></figure>



<h2 class="wp-block-heading">Scoping the Continuous Deployment System</h2>



<p class="wp-block-paragraph">Before building the continuous deployment layer, the team defined clear requirements. These goals shaped every design decision:</p>



<ul class="wp-block-list">
<li><strong>Engineer control:</strong> Engineers must be able to manually deploy a specific build version to canary or production at any time.</li>
<li><strong>Easy stop and rollback:</strong> Halting a deployment in progress and rolling back must be straightforward and fast.</li>
<li><strong>Automated gradual rollout:</strong> Traffic should shift incrementally, not all at once, reducing exposure to defects.</li>
<li><strong>Prevent commit pile-up:</strong> No more than 3–4 commits should be in-flight at a time. Smaller batches make it easier to identify which commit introduced a regression.</li>
<li><strong>Restricted submission windows:</strong> Code submission should be blocked during off-hours (9 PM to 9 AM on weekdays, all weekend, and when the office is closed), with an exception for critical bug fixes.</li>
</ul>



<h2 class="wp-block-heading">Gerrit Plugin: Enforcing Repository Locks</h2>



<p class="wp-block-paragraph">Previously, repository locking during restricted periods was entirely manual. Engineers were expected to check a dedicated Slack channel for a &#8220;lock&#8221; signal before submitting code. Locks were placed manually when entering off-hours or during active rollbacks. Predictably, this was unreliable — engineers occasionally submitted code to a locked repository because they missed the Slack message.</p>



<p class="wp-block-paragraph">To solve this, the team built a <strong>custom Gerrit plugin</strong> that enforces repository locking at the tooling level:</p>



<ul class="wp-block-list">
<li>The Gerrit UI displays the current lock status of any repository.</li>
<li>When a repository is locked, Gerrit <strong>rejects submissions</strong> from any engineer who is not the lock owner.</li>
<li>Engineers lock and unlock repositories by running a script that issues a Gerrit SSH command — no manual Slack posts required.</li>
</ul>



<figure class="wp-block-image"><img loading="lazy" decoding="async" src="https://www.thumbtack.com/engineering/wp-content/uploads/2017/04/1491589612_image09.png" alt="Gerrit UI showing repository lock status" width="328" height="258"/><figcaption>Gerrit UI showing the repository lock state</figcaption></figure>



<p class="wp-block-paragraph">Additionally, a <strong>Jenkins job was set up to automatically lock the monolith repository during off-hours</strong>, removing the need for any engineer to remember to do it manually.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" src="https://www.thumbtack.com/engineering/wp-content/uploads/2017/04/1491589612_image08.png" alt="Jenkins job for automated repository locking" width="534" height="343"/><figcaption>Jenkins scheduled job that locks the repository during restricted hours</figcaption></figure>



<h2 class="wp-block-heading">The Continuous Deployment Jenkins Job</h2>



<p class="wp-block-paragraph">With the locking mechanism in place, the team introduced an automated deployment stage into the build pipeline. The deployment job follows a canary-based rollout strategy:</p>



<ol class="wp-block-list">
<li><strong>Pick up the latest successful build</strong> from the CI pipeline.</li>
<li><strong>Set canary traffic to 0%</strong> — no user traffic reaches the new build yet.</li>
<li><strong>Deploy the build to the canary cluster.</strong></li>
<li><strong>Gradually increase traffic</strong> to the canary cluster over approximately 10 minutes.</li>
<li>Once canary reaches <strong>100% of traffic</strong>, the production cluster is updated with the same build.</li>
</ol>



<p class="wp-block-paragraph">Throughout this process, engineers whose code is included in the rollout receive <strong>Slack notifications</strong> in the deploy channel. If error rates spike or an alert fires, a notification is posted to the same channel so the responsible engineer can react immediately.</p>



<p class="wp-block-paragraph">If an engineer detects a problem — via an automated alert, error logs, or metric dashboards — they can <strong>acquire the repository lock</strong>, which interrupts the deployment. From there, the engineer decides next steps: typically shifting all traffic off the canary cluster, reverting the faulty commit, and unlocking the repository once a clean build is verified.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" src="https://www.thumbtack.com/engineering/wp-content/uploads/2017/04/1491589612_image04.png" alt="Continuous deployment flow diagram" width="462" height="822"/><figcaption>Continuous deployment flow: from build to canary to production</figcaption></figure>



<figure class="wp-block-image"><img loading="lazy" decoding="async" src="https://www.thumbtack.com/engineering/wp-content/uploads/2017/04/rollout-1.png" alt="Gradual traffic rollout flow" width="443" height="1042" srcset="https://www.thumbtack.com/engineering/wp-content/uploads/2017/04/rollout-1.png 443w, https://www.thumbtack.com/engineering/wp-content/uploads/2017/04/rollout-1-128x300.png 128w, https://www.thumbtack.com/engineering/wp-content/uploads/2017/04/rollout-1-435x1024.png 435w"/><figcaption>Traffic rollout flow: canary traffic increases incrementally before production promotion</figcaption></figure>



<h2 class="wp-block-heading">Key Design Principles Worth Adopting</h2>



<p class="wp-block-paragraph">The Thumbtack approach illustrates several principles that apply broadly to any team building a continuous deployment pipeline:</p>



<ul class="wp-block-list">
<li><strong>Enforce policies in tooling, not documentation.</strong> Relying on engineers to check Slack before submitting code will fail. Encoding the lock in Gerrit makes the policy impossible to accidentally bypass.</li>
<li><strong>Canary deployments reduce blast radius.</strong> Routing a fraction of traffic to the new build before a full rollout limits the impact of any defect that slipped through testing.</li>
<li><strong>Small, frequent deploys are safer than large batched ones.</strong> Limiting in-flight commits to 3–4 at a time makes root cause analysis significantly faster.</li>
<li><strong>Deploy visibility keeps everyone informed.</strong> Real-time Slack notifications tie the deployment directly to the engineers responsible for the changes, enabling faster human intervention.</li>
<li><strong>Manual override must always be possible.</strong> Automation should accelerate the happy path, but engineers need clear, fast controls to stop or redirect a deployment when something goes wrong.</li>
</ul>



<h2 class="wp-block-heading">Known Limitations and Future Work</h2>



<p class="wp-block-paragraph">After running this system in production for over three months, the team identified two areas for improvement:</p>



<ul class="wp-block-list">
<li><strong>Automated alert-triggered deployment halts:</strong> The team wanted alerts to automatically stop rollouts, but needed to solve the false-positive problem — for example, a transient network blip should not abort an otherwise healthy deploy.</li>
<li><strong>Reducing time from commit to canary:</strong> At the time of writing, sequential monolith builds meant it could take over 20 minutes from code submission to a canary deployment starting. Parallelizing build steps was a planned improvement to shrink this window.</li>
</ul>



<p class="wp-block-paragraph">Both challenges are common in CI/CD pipelines at scale: balancing automation confidence against alert reliability, and optimizing build times without sacrificing test coverage.</p>



<h2 class="wp-block-heading">Summary</h2>



<p class="wp-block-paragraph">Thumbtack&#8217;s continuous deployment pipeline demonstrates a pragmatic, incremental approach: build on existing CI infrastructure, enforce deployment policies in the tools engineers already use, adopt canary rollouts to limit risk, and keep humans in the loop with clear notifications and manual override capabilities. The combination of Gerrit, Jenkins, and Slack notifications — with a custom repository locking plugin — produced a system that reduced deploy overhead and improved deployment safety without removing engineer agency.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/continuous-deployment-using-jenkins/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
