<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Optivem Journal: Continuous Delivery]]></title><description><![CDATA[Continuous Integration, Continuous Delivery, Continuous Deployment]]></description><link>https://journal.optivem.com/s/continuous-delivery</link><image><url>https://substackcdn.com/image/fetch/$s_!0CjJ!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9abead4c-3f54-46b1-96aa-7033849416df_200x200.png</url><title>Optivem Journal: Continuous Delivery</title><link>https://journal.optivem.com/s/continuous-delivery</link></image><generator>Substack</generator><lastBuildDate>Fri, 17 Apr 2026 00:48:40 GMT</lastBuildDate><atom:link href="https://journal.optivem.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Valentina Jemuović, Optivem]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[optivem@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[optivem@substack.com]]></itunes:email><itunes:name><![CDATA[Valentina Jemuović]]></itunes:name></itunes:owner><itunes:author><![CDATA[Valentina Jemuović]]></itunes:author><googleplay:owner><![CDATA[optivem@substack.com]]></googleplay:owner><googleplay:email><![CDATA[optivem@substack.com]]></googleplay:email><googleplay:author><![CDATA[Valentina Jemuović]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[CI/CD Isn’t About Speed. It’s About Safety.]]></title><description><![CDATA[Teams chase faster pipelines and end up with fragile systems.]]></description><link>https://journal.optivem.com/p/cicd-isnt-about-speed-its-about-safety</link><guid isPermaLink="false">https://journal.optivem.com/p/cicd-isnt-about-speed-its-about-safety</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Thu, 15 Jan 2026 07:00:49 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/19a1f97f-cd78-4eb7-be1a-787a7eb119a4_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#128197; Join me for <strong><a href="https://optivem.thinkific.com/products/live_events/2026-02-25-acceptance-testing-live-training">Acceptance Testing (Live Training)</a></strong> on Wed 25th Feb (17:00 - 19:00 CET) <em>(100% discount for Optivem Journal members)</em></p><div><hr></div><p><em>&#128274; Hello, this is Valentina with a premium issue of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply <a href="https://journal.optivem.com/p/tdd-in-legacy-code-transformation">TDD in Legacy Code</a>.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>CI/CD is usually sold as a promise of speed.</p><ul><li><p>&#8220;Deploy faster.&#8221;</p></li><li><p>&#8220;Release more often.&#8221;</p></li><li><p>&#8220;Ship ten times a day.&#8221;</p></li></ul><p>And yet, most teams I work with deploy <strong>more frequently</strong> than ever &#8212; and still dread it.</p><p>Deployments are green, pipelines are automated, dashboards look healthy, but&#8230;</p><ul><li><p>Slack explodes after releases.</p></li><li><p>People hover over rollback buttons.</p></li><li><p>The customers are complaining.</p></li></ul><p>That&#8217;s the paradox.</p><p>CI/CD didn&#8217;t make teams feel safer&#8230;</p><p>It made them move faster <strong>while staying afraid</strong>.</p><p>The truth is - the team thought that they were practicing CI/CD, but they actually weren&#8217;t. They had a pipeline (they thought that means CI/CD), but didn&#8217;t have adequate automated tests, instead relying on Manual QA.</p><p>If they we truly practicing CI/CD, they would have both safety &amp; speed.</p><h2>The Lie We Were Sold</h2><p>Speed is easy to sell.</p><p>Speed has metrics.<br>Speed has charts.<br>Speed looks good in talks and blog posts.</p><p>So CI/CD got framed as a productivity tool:</p><blockquote><p>&#8220;Look how often we deploy.&#8221;</p></blockquote><p>But deploying often is not the goal.</p><p>Deploying <strong>without fear</strong> is.</p><p>Speed without safety just means you&#8217;re reaching failure sooner.</p><h2>What CI/CD Is <em>Actually</em> Optimizing For</h2><p>At its core, CI/CD optimizes for <strong>risk reduction</strong>.</p><p>Every practice that matters in CI/CD points to the same outcome:</p><ul><li><p>smaller failures</p></li><li><p>earlier feedback</p></li><li><p>faster recovery</p></li><li><p>less human panic</p></li></ul><p>CI/CD is a <strong>risk-management system disguised as automation</strong>.</p><p>When it works, deployments stop being events.<br>They become background noise.</p><p>Not because nothing can go wrong &#8212;<br>but because when something does, you already know <em>how</em> it will go wrong, <em>where</em>, and <em>how to undo it</em>.</p><h2>The Four Safety Nets of Real CI/CD</h2>
      <p>
          <a href="https://journal.optivem.com/p/cicd-isnt-about-speed-its-about-safety">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[99% of devs think they practice CI—they don’t.]]></title><description><![CDATA[CI isn&#8217;t just having a pipeline. If you're not practicing TBD and don't have tests, then you are not practicing CI.]]></description><link>https://journal.optivem.com/p/99-of-devs-think-they-practice-ci-they-dont</link><guid isPermaLink="false">https://journal.optivem.com/p/99-of-devs-think-they-practice-ci-they-dont</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Mon, 15 Sep 2025 06:00:59 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a4d1203d-d0e3-46ee-8626-a9ece907d678_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#128197; Join me at the FREE live event <strong><a href="https://maven.com/p/f39276/stop-breaking-production-atdd-in-legacy-code">Stop Breaking Production: ATDD in Legacy Code</a></strong> (Sep 24 at 5:00 PM CET)</p><div><hr></div><p>&#128075; <em>Hello, this is Valentina with the free edition of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply <a href="https://journal.optivem.com/p/tdd-in-legacy-code-transformation">TDD in Legacy Code</a>.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>99% developers do NOT know what CI is.</p><p>They think that CI means building a Pipeline.</p><p>However, those developers adopt Feature Branching &amp; have no Tests.</p><p>They don&#8217;t know that Feature Branching is NOT compatible with CI.</p><p>They also don&#8217;t know that Tests are a must-have for CI.</p><h2>CI requires at least daily integration.</h2><p>The only way to satisfy CI is with:</p><ul><li><p>(A) Trunk Based Development, whereby we just have the "main", we don't have any branches</p></li><li><p>(B) Short-lived branches, where branch lifetime &lt;=1 day</p></li></ul><p>The following does NOT satisfy CI:</p><ul><li><p>(C) Long-lived branches, where branch lifetime &gt; 1 day</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kqWU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c6151a5-52e6-49bb-a945-92abf9baec1c_900x1110.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kqWU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c6151a5-52e6-49bb-a945-92abf9baec1c_900x1110.png 424w, https://substackcdn.com/image/fetch/$s_!kqWU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c6151a5-52e6-49bb-a945-92abf9baec1c_900x1110.png 848w, https://substackcdn.com/image/fetch/$s_!kqWU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c6151a5-52e6-49bb-a945-92abf9baec1c_900x1110.png 1272w, https://substackcdn.com/image/fetch/$s_!kqWU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c6151a5-52e6-49bb-a945-92abf9baec1c_900x1110.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kqWU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c6151a5-52e6-49bb-a945-92abf9baec1c_900x1110.png" width="900" height="1110" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2c6151a5-52e6-49bb-a945-92abf9baec1c_900x1110.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1110,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:98869,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://journal.optivem.com/i/173171106?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c6151a5-52e6-49bb-a945-92abf9baec1c_900x1110.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kqWU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c6151a5-52e6-49bb-a945-92abf9baec1c_900x1110.png 424w, https://substackcdn.com/image/fetch/$s_!kqWU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c6151a5-52e6-49bb-a945-92abf9baec1c_900x1110.png 848w, https://substackcdn.com/image/fetch/$s_!kqWU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c6151a5-52e6-49bb-a945-92abf9baec1c_900x1110.png 1272w, https://substackcdn.com/image/fetch/$s_!kqWU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c6151a5-52e6-49bb-a945-92abf9baec1c_900x1110.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div><hr></div><h3>Trunk Based Development (TBD)</h3><p>Trunk Based Development is a branching strategy where developers integrate their changes into a single shared branch (the trunk) at least once a day (ideally, multiple times per day). The goal is to keep integration simple, reduce merge conflicts, and ensure that the product is always in a releasable state.</p><p>&#9989; Satisfies minimal conditions for Continuous Integration (CI)</p><p><strong>(A) No branches</strong></p><ul><li><p>All changes are integrated directly into the trunk</p></li></ul><p><strong>(B) Short-lived branches (&#8804; 1 day)</strong></p><ul><li><p>Changes are integrated into branches, branches are re-integrated into the trunk daily, branches are removed after merge</p></li></ul><div><hr></div><h3>Feature Branching</h3><p>Feature Branching is a branching strategy where developers create a separate branch for each feature, bug fix or refactoring. These branches often exist for multiple days (sometimes weeks) before being merged back into the main branch. This can create long feedback cycles, painful merges, and delays in integration.</p><p>&#9888;&#65039; Does NOT satisfy the minimal conditions for Continuous Integration (CI)</p><p><strong>(C) Long-lived branches (&gt; 1 day)</strong></p><ul><li><p>Changes are integrated into branches, branches are re-integrated into the trunk over longer timeframes, or branches remain indefinitely</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/p/99-of-devs-think-they-practice-ci-they-dont/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/p/99-of-devs-think-they-practice-ci-they-dont/comments"><span>Leave a comment</span></a></p><div><hr></div><p>&#128197; Join me at the FREE live event <strong><a href="https://maven.com/p/f39276/stop-breaking-production-atdd-in-legacy-code">Stop Breaking Production: ATDD in Legacy Code</a></strong> (Sep 24 at 5:00 PM CET)</p>]]></content:encoded></item><item><title><![CDATA[Modern Pipeline]]></title><description><![CDATA[Many teams have slow delivery. Release cycles are getting longer and longer. Teams are stuck with Manual QA. We lose customers because our software is buggy. How to solve this problem?]]></description><link>https://journal.optivem.com/p/modern-pipeline</link><guid isPermaLink="false">https://journal.optivem.com/p/modern-pipeline</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Thu, 21 Aug 2025 06:01:58 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/518419bf-b159-4b8b-84c5-9edf992bef2c_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#128640; Are you frustrated by long Manual QA cycles? Do you want stop Regression Bugs escaping to production? Join me at my next FREE live event: &#8220;<a href="https://maven.com/p/f39276/stop-breaking-production-atdd-in-legacy-code">Stop Breaking Production: ATDD in Legacy Code</a>&#8221; (Sep 24 at 5:00 PM CET).</p><div><hr></div><p><em>&#128274;Hello, this is Valentina with a premium issue of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply TDD in Legacy Code. This article is part of the <a href="https://journal.optivem.com/p/tdd-in-legacy-code-outline">TDD in Legacy Code</a> series.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>The only way to be able to deliver safely and quickly into production is through <a href="https://continuousdelivery.com/">Continuous Delivery (Jez Humble)</a>:</p><blockquote><p>Continuous Delivery is the ability to get changes of all types&#8212;including new features, configuration changes, bug fixes and experiments&#8212;into production, or into the hands of users, <em>safely</em> and <em>quickly</em> in a <em>sustainable</em> way.</p><p>Our goal is to make deployments&#8212;whether of a large-scale distributed system, a complex production environment, an embedded system, or an app&#8212;predictable, routine affairs that can be performed on demand.</p><p>We achieve all this by ensuring our code is <em>always</em> in a deployable state, even in the face of teams of thousands of developers making changes on a daily basis. We thus completely eliminate the integration, testing and hardening phases that traditionally followed &#8220;dev complete&#8221;, as well as code freezes.</p></blockquote><p>The foundation of Continuous Delivery is the Pipeline.</p><h2>Pipeline</h2><p>The Pipeline is composed of at least 3 stages:</p><ol><li><p><strong>Commit Stage</strong> - automatic verification whether Components work (in isolation)</p></li><li><p><strong>Acceptance Stage</strong> - automatic verification whether the System works (as a whole)</p></li><li><p><strong>Release Stages</strong>:</p><ol><li><p>QA Stage - QA verification whether the System works</p></li><li><p>UAT Stage - business validation whether System meets business needs</p></li><li><p>Staging Stage - final validation in a production-like environment</p></li><li><p>Production Stage - releasing to the End User</p></li></ol></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rsVH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a50372e-c193-4722-af7a-3d993f29954e_2457x679.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rsVH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a50372e-c193-4722-af7a-3d993f29954e_2457x679.png 424w, https://substackcdn.com/image/fetch/$s_!rsVH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a50372e-c193-4722-af7a-3d993f29954e_2457x679.png 848w, https://substackcdn.com/image/fetch/$s_!rsVH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a50372e-c193-4722-af7a-3d993f29954e_2457x679.png 1272w, https://substackcdn.com/image/fetch/$s_!rsVH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a50372e-c193-4722-af7a-3d993f29954e_2457x679.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rsVH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a50372e-c193-4722-af7a-3d993f29954e_2457x679.png" width="1456" height="402" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a50372e-c193-4722-af7a-3d993f29954e_2457x679.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:402,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:78203,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://journal.optivem.com/i/161961328?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a50372e-c193-4722-af7a-3d993f29954e_2457x679.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rsVH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a50372e-c193-4722-af7a-3d993f29954e_2457x679.png 424w, https://substackcdn.com/image/fetch/$s_!rsVH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a50372e-c193-4722-af7a-3d993f29954e_2457x679.png 848w, https://substackcdn.com/image/fetch/$s_!rsVH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a50372e-c193-4722-af7a-3d993f29954e_2457x679.png 1272w, https://substackcdn.com/image/fetch/$s_!rsVH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a50372e-c193-4722-af7a-3d993f29954e_2457x679.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It should be noted that the Acceptance Stage is responsible for the automated verification of functional requirements only. To verify non-functional requirements, we need additional stages, e.g.:</p><ul><li><p>Performance Stage - verify whether the System meets performance requirements</p></li><li><p>Security Stage - verify whether the System meets security requirements</p></li></ul><p><em>Note: There are no limitations regarding this list of Stages. Please structure it based on non-functional requirements.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!L5z5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa53961a7-81dd-4ec2-bd1b-17df6e8ae922_2458x1025.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L5z5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa53961a7-81dd-4ec2-bd1b-17df6e8ae922_2458x1025.png 424w, https://substackcdn.com/image/fetch/$s_!L5z5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa53961a7-81dd-4ec2-bd1b-17df6e8ae922_2458x1025.png 848w, https://substackcdn.com/image/fetch/$s_!L5z5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa53961a7-81dd-4ec2-bd1b-17df6e8ae922_2458x1025.png 1272w, https://substackcdn.com/image/fetch/$s_!L5z5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa53961a7-81dd-4ec2-bd1b-17df6e8ae922_2458x1025.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!L5z5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa53961a7-81dd-4ec2-bd1b-17df6e8ae922_2458x1025.png" width="1456" height="607" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a53961a7-81dd-4ec2-bd1b-17df6e8ae922_2458x1025.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:607,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:118632,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://journal.optivem.com/i/161961328?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa53961a7-81dd-4ec2-bd1b-17df6e8ae922_2458x1025.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!L5z5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa53961a7-81dd-4ec2-bd1b-17df6e8ae922_2458x1025.png 424w, https://substackcdn.com/image/fetch/$s_!L5z5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa53961a7-81dd-4ec2-bd1b-17df6e8ae922_2458x1025.png 848w, https://substackcdn.com/image/fetch/$s_!L5z5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa53961a7-81dd-4ec2-bd1b-17df6e8ae922_2458x1025.png 1272w, https://substackcdn.com/image/fetch/$s_!L5z5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa53961a7-81dd-4ec2-bd1b-17df6e8ae922_2458x1025.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Commit Stage</h2><p>The goal of the Commit Stage is to verify that Components work in isolation &amp; publish their Artifacts.</p><p>The Commit Stage is triggered when developers push changes to the Version Control System.</p><p>For each Component, the following are the key steps in the Commit Stage:</p><ol><li><p>Checkout the Component code</p></li><li><p>Compile the Component code</p></li><li><p>Verify that the Component works correctly (in isolation)</p><ol><li><p>Run Unit Tests</p></li><li><p>Run Narrow Integration Tests</p></li><li><p>Run Component Tests</p></li><li><p>Run Contract Provider Verification Tests</p></li></ol></li><li><p>Verify that the Component&#8217;s code is maintainable, secure, etc.</p><ol><li><p>Run Linter</p></li><li><p>Run Static Code Analysis</p></li></ol></li><li><p>Publish Component&#8217;s Artifact to the Artifact Repository</p><ol><li><p>Build Artifact</p></li><li><p>Publish Artifact</p></li></ol></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RDUv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb957b285-31a6-43f8-b3b3-43e1905a873c_2404x1228.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RDUv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb957b285-31a6-43f8-b3b3-43e1905a873c_2404x1228.png 424w, https://substackcdn.com/image/fetch/$s_!RDUv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb957b285-31a6-43f8-b3b3-43e1905a873c_2404x1228.png 848w, https://substackcdn.com/image/fetch/$s_!RDUv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb957b285-31a6-43f8-b3b3-43e1905a873c_2404x1228.png 1272w, https://substackcdn.com/image/fetch/$s_!RDUv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb957b285-31a6-43f8-b3b3-43e1905a873c_2404x1228.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RDUv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb957b285-31a6-43f8-b3b3-43e1905a873c_2404x1228.png" width="1456" height="744" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b957b285-31a6-43f8-b3b3-43e1905a873c_2404x1228.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:744,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RDUv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb957b285-31a6-43f8-b3b3-43e1905a873c_2404x1228.png 424w, https://substackcdn.com/image/fetch/$s_!RDUv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb957b285-31a6-43f8-b3b3-43e1905a873c_2404x1228.png 848w, https://substackcdn.com/image/fetch/$s_!RDUv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb957b285-31a6-43f8-b3b3-43e1905a873c_2404x1228.png 1272w, https://substackcdn.com/image/fetch/$s_!RDUv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb957b285-31a6-43f8-b3b3-43e1905a873c_2404x1228.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div>
      <p>
          <a href="https://journal.optivem.com/p/modern-pipeline">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Modern Pipeline - Release Stage]]></title><description><![CDATA[After your automated System Level Tests have passed, it's time to go through QA & UAT Testing, and prepare for releasing to Production!]]></description><link>https://journal.optivem.com/p/modern-pipeline-release-stage</link><guid isPermaLink="false">https://journal.optivem.com/p/modern-pipeline-release-stage</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Fri, 15 Aug 2025 06:01:10 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7d3b0280-7c60-43b9-b967-868bad073098_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#128274; Welcome to the premium Optivem Journal. I&#8217;ll help you apply TDD to escape the nightmare of Legacy Code. Join our paid community of 160+ senior engineers &amp; leaders for support on your TDD journey, plus instant access to group chat and live Q&amp;As:</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>In the previous article, <a href="https://journal.optivem.com/p/modern-pipeline-acceptance-stage">Modern Pipeline - Acceptance Stage</a>, we verified whether our System works correctly, by running automated System Level Tests. Within the Acceptance Stage, it deployed the System to the Acceptance Environment, ran Health Checks, Smoke Tests, Acceptance Tests, External System Contract Tests, and E2E Tests.</p><p>Since the Acceptance Stage assured us that our System satisfies Acceptance Criteria, i.e. that it works correctly from End User facing perspective, we&#8217;re now ready to make the System available to humans, most importantly:</p><ul><li><p>Release the System to QA Environment, so that QA Engineers can test it</p></li><li><p>Release the System to Production Environment, so that Users can use it</p></li></ul><p><em>Note: We&#8217;re not limited to just the QA Environment. We&#8217;ll see some additional environments below.</em></p><p><em>Note II: The Acceptance Stage covers only functional testing, but it does not cover non-functional testing. You can consider having additional stages, e.g. Load Test Stage, Stress Test Stage, Soak Test Stage, Security Test Stage, Resilience Test Stage, etc. To summarize, to perform automated non-functional testing, you need to add additional stages to the Pipeline.</em></p><h2>QA Stage</h2><p>In the Acceptance Stage, we had automatic verification that the System works correctly, that it satisfies functional requirements.</p><p>For a version of the System that passed the Acceptance Stage, we need to make it available for humans for both functional and non-functional testing, involving:</p><ul><li><p>Exploratory Testing</p></li><li><p>Usability Testing (UX Testing)</p></li><li><p>Visual Testing (Cross-browser &amp; Cross-device UI Testing)</p></li><li><p>Exploratory Security Testing</p></li></ul><p><em>Note: QA Engineer should NOT perform Manual Regression Testing! Automated Regression Testing was already executed by the Acceptance Stage. It's important to note that here we&#8217;re referring to Functional Regression Testing, since that should be automated not done manually.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Dall!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9c8641-6db0-43be-8302-041c160d902a_882x807.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Dall!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9c8641-6db0-43be-8302-041c160d902a_882x807.png 424w, https://substackcdn.com/image/fetch/$s_!Dall!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9c8641-6db0-43be-8302-041c160d902a_882x807.png 848w, https://substackcdn.com/image/fetch/$s_!Dall!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9c8641-6db0-43be-8302-041c160d902a_882x807.png 1272w, https://substackcdn.com/image/fetch/$s_!Dall!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9c8641-6db0-43be-8302-041c160d902a_882x807.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Dall!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9c8641-6db0-43be-8302-041c160d902a_882x807.png" width="509" height="465.71768707482994" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8c9c8641-6db0-43be-8302-041c160d902a_882x807.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:807,&quot;width&quot;:882,&quot;resizeWidth&quot;:509,&quot;bytes&quot;:51619,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://journal.optivem.com/i/161961328?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9c8641-6db0-43be-8302-041c160d902a_882x807.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Dall!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9c8641-6db0-43be-8302-041c160d902a_882x807.png 424w, https://substackcdn.com/image/fetch/$s_!Dall!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9c8641-6db0-43be-8302-041c160d902a_882x807.png 848w, https://substackcdn.com/image/fetch/$s_!Dall!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9c8641-6db0-43be-8302-041c160d902a_882x807.png 1272w, https://substackcdn.com/image/fetch/$s_!Dall!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9c8641-6db0-43be-8302-041c160d902a_882x807.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div>
      <p>
          <a href="https://journal.optivem.com/p/modern-pipeline-release-stage">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Modern Pipeline - Acceptance Stage]]></title><description><![CDATA[Are your QA Engineers discovering Regression Bugs? They shouldn't have to. You should run automated System Level Tests on your Pipeline, to have assurance that your System works.]]></description><link>https://journal.optivem.com/p/modern-pipeline-acceptance-stage</link><guid isPermaLink="false">https://journal.optivem.com/p/modern-pipeline-acceptance-stage</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Fri, 01 Aug 2025 15:09:05 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/43f9b526-dfdf-4f8e-b78d-a4de71ad7a97_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#128197; Join me for the live workshop <strong><a href="https://lu.ma/vg945412">ATDD in Legacy Code Roadmap</a></strong> on Wed 6th Aug (17:00 - 19:00 CEST) <em>(100% discount for Optivem Journal members)</em></p><div><hr></div><p><em>&#128274; Welcome to the premium Optivem Journal. I&#8217;ll help you apply TDD to escape the nightmare of Legacy Code. Join our paid community of 160+ senior engineers &amp; leaders for support on your TDD journey, plus instant access to group chat and live Q&amp;As:</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>It&#8217;s not enough for Components to work in isolation. We need assurance that the whole System works together. In the previous article, <a href="http://modern-pipeline-commit-stage">Modern Pipeline - Commit Stage</a>, we showed how we can be sure that our Components work in isolation (through Component Level Tests &amp; Unit Level Tests). Now it&#8217;s time to find out how we can be sure that the whole System (all the Components working together) works correctly, i.e., are the business requirements satisfied?</p><h2>Acceptance Stage - Health Checks &amp; Smoke Tests</h2><p>At the simplest level, we need to automatically deploy the System &amp; run automated Health Checks &amp; Smoke Tests. This tells us that the System is up-and-running:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oLHE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0411e36f-a9a1-4b58-8a6d-4a49c9254374_733x761.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oLHE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0411e36f-a9a1-4b58-8a6d-4a49c9254374_733x761.png 424w, https://substackcdn.com/image/fetch/$s_!oLHE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0411e36f-a9a1-4b58-8a6d-4a49c9254374_733x761.png 848w, https://substackcdn.com/image/fetch/$s_!oLHE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0411e36f-a9a1-4b58-8a6d-4a49c9254374_733x761.png 1272w, https://substackcdn.com/image/fetch/$s_!oLHE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0411e36f-a9a1-4b58-8a6d-4a49c9254374_733x761.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oLHE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0411e36f-a9a1-4b58-8a6d-4a49c9254374_733x761.png" width="440" height="456.80763983628924" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0411e36f-a9a1-4b58-8a6d-4a49c9254374_733x761.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:761,&quot;width&quot;:733,&quot;resizeWidth&quot;:440,&quot;bytes&quot;:46141,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://journal.optivem.com/i/167419330?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0411e36f-a9a1-4b58-8a6d-4a49c9254374_733x761.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!oLHE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0411e36f-a9a1-4b58-8a6d-4a49c9254374_733x761.png 424w, https://substackcdn.com/image/fetch/$s_!oLHE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0411e36f-a9a1-4b58-8a6d-4a49c9254374_733x761.png 848w, https://substackcdn.com/image/fetch/$s_!oLHE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0411e36f-a9a1-4b58-8a6d-4a49c9254374_733x761.png 1272w, https://substackcdn.com/image/fetch/$s_!oLHE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0411e36f-a9a1-4b58-8a6d-4a49c9254374_733x761.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DvPX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc28cea86-c4b8-4a85-bbf5-530b8402745f_1306x1385.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DvPX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc28cea86-c4b8-4a85-bbf5-530b8402745f_1306x1385.png 424w, https://substackcdn.com/image/fetch/$s_!DvPX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc28cea86-c4b8-4a85-bbf5-530b8402745f_1306x1385.png 848w, https://substackcdn.com/image/fetch/$s_!DvPX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc28cea86-c4b8-4a85-bbf5-530b8402745f_1306x1385.png 1272w, https://substackcdn.com/image/fetch/$s_!DvPX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc28cea86-c4b8-4a85-bbf5-530b8402745f_1306x1385.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DvPX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc28cea86-c4b8-4a85-bbf5-530b8402745f_1306x1385.png" width="1306" height="1385" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c28cea86-c4b8-4a85-bbf5-530b8402745f_1306x1385.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1385,&quot;width&quot;:1306,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:110864,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://journal.optivem.com/i/167419330?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc28cea86-c4b8-4a85-bbf5-530b8402745f_1306x1385.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DvPX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc28cea86-c4b8-4a85-bbf5-530b8402745f_1306x1385.png 424w, https://substackcdn.com/image/fetch/$s_!DvPX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc28cea86-c4b8-4a85-bbf5-530b8402745f_1306x1385.png 848w, https://substackcdn.com/image/fetch/$s_!DvPX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc28cea86-c4b8-4a85-bbf5-530b8402745f_1306x1385.png 1272w, https://substackcdn.com/image/fetch/$s_!DvPX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc28cea86-c4b8-4a85-bbf5-530b8402745f_1306x1385.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><em>Note: Within the &#8220;Release System&#8220; step, we need to &#8220;Configure Environment&#8220;. As part of that configuration, we need to configure the connection strings to External Systems to point to External System Test Instances.</em></p>
      <p>
          <a href="https://journal.optivem.com/p/modern-pipeline-acceptance-stage">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Modern Pipeline - Commit Stage]]></title><description><![CDATA[What does it mean that build works? Many developers think it means compiling code and publishing artifacts. But how do we know that those artifacts actually work correctly?]]></description><link>https://journal.optivem.com/p/modern-pipeline-commit-stage</link><guid isPermaLink="false">https://journal.optivem.com/p/modern-pipeline-commit-stage</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Fri, 25 Jul 2025 06:01:24 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/f9f6ae8e-7978-45ca-b124-f7bc193dc82b_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#128197; Join me for the live workshop <strong><a href="https://lu.ma/vg945412">ATDD in Legacy Code Roadmap</a></strong> on Wed 6th Aug (17:00 - 19:00 CEST) <em>(100% discount for Optivem Journal members)</em></p><div><hr></div><p><em>&#128274; Welcome to the premium Optivem Journal. I&#8217;ll help you apply TDD to escape the nightmare of Legacy Code. Join our paid community of 160+ senior engineers &amp; leaders for support on your TDD journey, plus instant access to group chat and live Q&amp;As:</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>The goal of the Pipeline is ultimately to release software quickly and safely into a given environment. To achieve this, a necessary (but not sufficient) step is to deploy the System to an Environment automatically. </p><h2>Components</h2><p>The automatic deployment of a System necessitates the automated deployment of Its Component(s). </p><p>A System is comprised of one or more Components. Components might be the following:</p><ul><li><p>MVC App</p></li><li><p>Frontend, Backend</p></li><li><p>Frontend, Microservice #1, Microservice #2, Microservice #3, etc.</p></li></ul><p><em>Note: Instead of Frontend, or additionally, there might be Mobile, Desktop, Console, etc.</em></p><h2>Artifacts</h2><p>Automated deployment of a Component necessitates that we automate the publishing of the Component Artifact, so that we can deploy it.</p><p>Artifacts might be Docker Images, or JAR/WAR files (Java apps), DLL/EXE (.NET apps), Node.js bundles, NuGet packages. Artifact Repositories might be Docker Hub, JFrog Artifactory, AWS CodeArtifact, Azure Artifacts, Google Artifact Repository, etc&#8230;</p><h2>(System) Commit Stage</h2><p>The first step of automating Component deployment is to build and publish its Artifact automatically. This&#8217;s the  purpose of the Commit Stage - to publish the Component Artifacts, so that we can deploy those Component Artifacts in subsequent stages (Acceptance Stage &amp; Release Stage).</p><p>From a System perspective, here&#8217;s the (System) Commit Stage. It&#8217;s comprised of Component Commit Stages that run in parallel. Each Component Commit Stage publishes that Component&#8217;s Artifact to the Artifact Repository.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HtZy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95619594-0b01-4adf-a1f8-0fa2b7bdaa4c_1104x1283.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HtZy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95619594-0b01-4adf-a1f8-0fa2b7bdaa4c_1104x1283.png 424w, https://substackcdn.com/image/fetch/$s_!HtZy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95619594-0b01-4adf-a1f8-0fa2b7bdaa4c_1104x1283.png 848w, https://substackcdn.com/image/fetch/$s_!HtZy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95619594-0b01-4adf-a1f8-0fa2b7bdaa4c_1104x1283.png 1272w, https://substackcdn.com/image/fetch/$s_!HtZy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95619594-0b01-4adf-a1f8-0fa2b7bdaa4c_1104x1283.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HtZy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95619594-0b01-4adf-a1f8-0fa2b7bdaa4c_1104x1283.png" width="506" height="588.0416666666666" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95619594-0b01-4adf-a1f8-0fa2b7bdaa4c_1104x1283.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1283,&quot;width&quot;:1104,&quot;resizeWidth&quot;:506,&quot;bytes&quot;:83785,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://journal.optivem.com/i/161961328?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95619594-0b01-4adf-a1f8-0fa2b7bdaa4c_1104x1283.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!HtZy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95619594-0b01-4adf-a1f8-0fa2b7bdaa4c_1104x1283.png 424w, https://substackcdn.com/image/fetch/$s_!HtZy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95619594-0b01-4adf-a1f8-0fa2b7bdaa4c_1104x1283.png 848w, https://substackcdn.com/image/fetch/$s_!HtZy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95619594-0b01-4adf-a1f8-0fa2b7bdaa4c_1104x1283.png 1272w, https://substackcdn.com/image/fetch/$s_!HtZy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95619594-0b01-4adf-a1f8-0fa2b7bdaa4c_1104x1283.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div>
      <p>
          <a href="https://journal.optivem.com/p/modern-pipeline-commit-stage">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[🏆 TDD in Legacy Code - Pipeline (Summary)]]></title><description><![CDATA[Legacy Code often doesn't have a Pipeline. That's why we have built a Pipeline, so that we have the foundation for automated test execution to support TDD.]]></description><link>https://journal.optivem.com/p/pipeline-in-legacy-code</link><guid isPermaLink="false">https://journal.optivem.com/p/pipeline-in-legacy-code</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Fri, 11 Oct 2024 06:03:04 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/feb367c0-c64a-4b0b-84ed-ecf47cd78221_1200x800.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#128075; Hello, this is Valentina. I help Engineering Leaders &amp; Senior Software Developers apply <a href="https://journal.optivem.com/p/tdd-in-legacy-code-transformation">TDD in Legacy Code</a>. This article is part of the <a href="https://journal.optivem.com/p/tdd-in-legacy-code-outline">TDD in Legacy Code</a> series. To get these articles in your inbox every week, subscribe:</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>Congratulations! You&#8217;ve now completed your Pipeline setup (<em><a href="https://journal.optivem.com/p/tdd-in-legacy-code-outline">TDD in Legacy Code</a> series</em>), which is an important prerequisite before we get started with TDD. Let&#8217;s recap what we&#8217;ve built up to now: </p><ul><li><p>&#9989; <a href="https://journal.optivem.com/p/commit-stage-in-legacy-code">Commit Stage</a></p></li><li><p>&#9989; <a href="https://journal.optivem.com/p/release-stage-in-legacy-code">Release Stage</a></p></li><li><p>&#9989; <a href="https://journal.optivem.com/p/acceptance-stage-in-legacy-code">Acceptance Stage</a></p></li></ul><h2>Why did we build a Pipeline before starting TDD?</h2><p>Legacy Code often lacks a Pipeline, and instead, the delivery process is manual&#8212;manual releases and manual testing. </p><p>What would happen if a team attempted to start TDD on a Legacy Project - but without a Pipeline? </p><ul><li><p><strong>Problem 1. Inconsistent Component Level Test results.</strong> Component Level tests include Unit Tests, Narrow Integration Tests, Component Tests &amp; Contract Tests. If there is no Pipeline, a developer might write these tests, and get them to pass locally (as part of the GREEN step in TDD), and commit the code, but then when another developer pulls the source code, it fails on their machine! So on one developer&#8217;s machine the tests pass, yet on another developer&#8217;s machine it fails! <em>(Of course, there is a deeper issue there with the tests, but it's now blocking the team because there's no Pipeline that detected as issue with the test)</em></p></li><li><p><strong>Problem 2.</strong> <strong>Can&#8217;t effectively run System Level Tests. </strong>System Level tests include Acceptance Tests &amp; Contract Tests, Smoke Tests &amp; E2E Tests. When there&#8217;s no Pipeline, to run any automated system tests, you first need to manually deploy the System. This is time-consuming and error-prone, hence we&#8217;re limited how frequently we can run those tests. And even when we run them, if there&#8217;s an error, we don&#8217;t know if it&#8217;s a deployment issue or something else.</p></li></ul><p>We needed a Build Server so that tests can be verified independently of the developer&#8217;s local machine (solving Problem 1) and that we can run slower tests (solving Problem 2). We needed a Pipeline to get feedback if any tests are red on the Build Server, even though they might be green on the Local Machine (solving Problem 1), and that we could automate deployment to enable System Level (solving Problem 2).</p><p>Thus, before introducing any tests (and TDD), we must ensure we have a Pipeline. A Pipeline is central to Continuous Delivery, enabling us to test our release candidates to ensure that we can safely and quickly release to production. </p><h2>Pipeline Architecture to support TDD</h2><p>We had set the following Pipeline Architecture:</p><ul><li><p>&#9989; Repositories</p></li><li><p>&#9989; Environments</p></li><li><p>&#9989; Pipeline</p></li></ul><p>Let&#8217;s summarize what we&#8217;ve learnt up to now:</p><h2>1. Repositories</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9nnc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe99a24af-4880-4979-8bf3-34b9e9e80177_1280x555.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9nnc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe99a24af-4880-4979-8bf3-34b9e9e80177_1280x555.png 424w, https://substackcdn.com/image/fetch/$s_!9nnc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe99a24af-4880-4979-8bf3-34b9e9e80177_1280x555.png 848w, https://substackcdn.com/image/fetch/$s_!9nnc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe99a24af-4880-4979-8bf3-34b9e9e80177_1280x555.png 1272w, https://substackcdn.com/image/fetch/$s_!9nnc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe99a24af-4880-4979-8bf3-34b9e9e80177_1280x555.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9nnc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe99a24af-4880-4979-8bf3-34b9e9e80177_1280x555.png" width="1280" height="555" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e99a24af-4880-4979-8bf3-34b9e9e80177_1280x555.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:555,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:75667,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9nnc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe99a24af-4880-4979-8bf3-34b9e9e80177_1280x555.png 424w, https://substackcdn.com/image/fetch/$s_!9nnc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe99a24af-4880-4979-8bf3-34b9e9e80177_1280x555.png 848w, https://substackcdn.com/image/fetch/$s_!9nnc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe99a24af-4880-4979-8bf3-34b9e9e80177_1280x555.png 1272w, https://substackcdn.com/image/fetch/$s_!9nnc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe99a24af-4880-4979-8bf3-34b9e9e80177_1280x555.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h4>Component Repositories</h4><p>We&#8217;ve set up Component Repositories:</p><ul><li><p>Frontend Repository</p></li><li><p>Microservice #1 Repository</p></li><li><p>Microservice #2 Repository</p></li><li><p>Microservice #3 Repository</p></li></ul><p>In each Component Repository, we added test placeholders for Component Level Tests:</p><ul><li><p>Unit Tests</p></li><li><p>Narrow Integration Tests</p></li><li><p>Component Tests</p></li><li><p>Contract Tests</p></li></ul><h4>System Level Test Repository</h4><p>Furthermore, we setup a repository for System Level testing:</p><ul><li><p>System Test Repository</p></li></ul><p>In the System Test Repository, we added test placeholders for System Level Tests:</p><ul><li><p>Acceptance Tests</p></li><li><p>External System Contract Tests</p></li><li><p>Smoke Tests</p></li><li><p>E2E Tests</p></li></ul><h2>2. Environments</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ikBf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b2cf138-1512-4680-8d59-0cc8c925f779_1280x585.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ikBf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b2cf138-1512-4680-8d59-0cc8c925f779_1280x585.png 424w, https://substackcdn.com/image/fetch/$s_!ikBf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b2cf138-1512-4680-8d59-0cc8c925f779_1280x585.png 848w, https://substackcdn.com/image/fetch/$s_!ikBf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b2cf138-1512-4680-8d59-0cc8c925f779_1280x585.png 1272w, https://substackcdn.com/image/fetch/$s_!ikBf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b2cf138-1512-4680-8d59-0cc8c925f779_1280x585.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ikBf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b2cf138-1512-4680-8d59-0cc8c925f779_1280x585.png" width="1280" height="585" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8b2cf138-1512-4680-8d59-0cc8c925f779_1280x585.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:585,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:67653,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ikBf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b2cf138-1512-4680-8d59-0cc8c925f779_1280x585.png 424w, https://substackcdn.com/image/fetch/$s_!ikBf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b2cf138-1512-4680-8d59-0cc8c925f779_1280x585.png 848w, https://substackcdn.com/image/fetch/$s_!ikBf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b2cf138-1512-4680-8d59-0cc8c925f779_1280x585.png 1272w, https://substackcdn.com/image/fetch/$s_!ikBf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b2cf138-1512-4680-8d59-0cc8c925f779_1280x585.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h4>Automated Test Environments</h4><ul><li><p>Acceptance Environment - for executing Acceptance Tests</p></li><li><p>E2E Environment - for executing External System Contract Tests &amp; E2E Tests</p></li><li><p>Performance Environment - for executing Performance Tests</p></li><li><p>Security Environment - for executing Security Tests</p></li></ul><p><em>Note: We covered Acceptance Environment and E2E Environment, which are focused on automated functional testing. Furthermore, you can have environments for non-functional tests, e.g. Performance Environment and Security Environment.</em></p><h4>Manual Test Environments</h4><ul><li><p>UAT Environment - for executing Manual QA Tests</p></li></ul><h4>Release Environments</h4><ul><li><p>Staging Environment</p></li><li><p>Production Environment</p></li></ul><h2>3. Pipeline</h2><h4>Pipeline Stages</h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8jYs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F046c1097-3b25-4737-98fd-02b318150960_1280x708.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8jYs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F046c1097-3b25-4737-98fd-02b318150960_1280x708.png 424w, https://substackcdn.com/image/fetch/$s_!8jYs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F046c1097-3b25-4737-98fd-02b318150960_1280x708.png 848w, https://substackcdn.com/image/fetch/$s_!8jYs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F046c1097-3b25-4737-98fd-02b318150960_1280x708.png 1272w, https://substackcdn.com/image/fetch/$s_!8jYs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F046c1097-3b25-4737-98fd-02b318150960_1280x708.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8jYs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F046c1097-3b25-4737-98fd-02b318150960_1280x708.png" width="1280" height="708" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/046c1097-3b25-4737-98fd-02b318150960_1280x708.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:708,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:58980,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8jYs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F046c1097-3b25-4737-98fd-02b318150960_1280x708.png 424w, https://substackcdn.com/image/fetch/$s_!8jYs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F046c1097-3b25-4737-98fd-02b318150960_1280x708.png 848w, https://substackcdn.com/image/fetch/$s_!8jYs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F046c1097-3b25-4737-98fd-02b318150960_1280x708.png 1272w, https://substackcdn.com/image/fetch/$s_!8jYs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F046c1097-3b25-4737-98fd-02b318150960_1280x708.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The Pipeline has these Stages:</p><ol><li><p><strong>Commit Stage</strong> - running Component Level Tests (Unit Tests, Narrow Integration Tests, Component Tests, Contract Tests) and publishing Docker Images</p></li><li><p><strong>Acceptance Stage</strong> - deploying Docker Images to Acceptance Environment and running Smoke Tests &amp; Acceptance Tests; deploying Docker Images to E2E Environment and running Smoke Tests, External System Contract Tests &amp; E2E Tests</p></li><li><p><strong>UAT Stage</strong> - deploying Docker Images to UAT Environment, running Smoke Tests, so that then QA Engineers can do Manual QA Testing</p></li><li><p><strong>Performance Stage</strong> - deploying Docker Images to Performance Environment, running Smoke Tests, running Performance Tests</p></li><li><p><strong>Security Stage</strong> - deploying Docker Images to Security Environment, running Smoke Tests, running Security Tests</p></li><li><p><strong>Staging Stage</strong> - deploying Docker Images to Staging Environment, running Smoke Tests</p></li><li><p><strong>Production Stage</strong> - deploying Docker Images to Production Environment, running Smoke Tests</p></li></ol><p><em>Note: We didn&#8217;t cover the Performance Stage, Security Stage, or Staging Stage; you can optionally add them if you need them.</em></p><h4>Pipeline Dashboard</h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KwRS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa601b087-0096-448f-adc9-f368c8ee63cd_1219x975.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KwRS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa601b087-0096-448f-adc9-f368c8ee63cd_1219x975.png 424w, https://substackcdn.com/image/fetch/$s_!KwRS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa601b087-0096-448f-adc9-f368c8ee63cd_1219x975.png 848w, https://substackcdn.com/image/fetch/$s_!KwRS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa601b087-0096-448f-adc9-f368c8ee63cd_1219x975.png 1272w, https://substackcdn.com/image/fetch/$s_!KwRS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa601b087-0096-448f-adc9-f368c8ee63cd_1219x975.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KwRS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa601b087-0096-448f-adc9-f368c8ee63cd_1219x975.png" width="1219" height="975" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a601b087-0096-448f-adc9-f368c8ee63cd_1219x975.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:975,&quot;width&quot;:1219,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:72529,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!KwRS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa601b087-0096-448f-adc9-f368c8ee63cd_1219x975.png 424w, https://substackcdn.com/image/fetch/$s_!KwRS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa601b087-0096-448f-adc9-f368c8ee63cd_1219x975.png 848w, https://substackcdn.com/image/fetch/$s_!KwRS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa601b087-0096-448f-adc9-f368c8ee63cd_1219x975.png 1272w, https://substackcdn.com/image/fetch/$s_!KwRS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa601b087-0096-448f-adc9-f368c8ee63cd_1219x975.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>Note: You can also add Performance Stage, Security Stage, Staging Stage between the UAT Stage and Production Stage.</em></p><h2>What&#8217;s Next?</h2><p>As part of the Pipeline phase, we&#8217;ve completed:</p><ul><li><p><a href="https://journal.optivem.com/p/commit-stage-in-legacy-code">Commit Stage</a></p></li><li><p><a href="https://journal.optivem.com/p/release-stage-in-legacy-code">Release Stage</a></p></li><li><p><a href="https://journal.optivem.com/p/acceptance-stage-in-legacy-code">Acceptance Stage</a></p></li></ul><p>I know that Pipeline setup was not the most exciting part, but now we&#8217;re ready to get to the fun part! In our upcoming articles, we&#8217;ll be learning about:</p><ul><li><p><strong>Testable Architecture:</strong> How do we make Legacy Code architecture testable so that it can support testing? </p></li><li><p><strong>Test Last Development:</strong> How do we effectively write tests retroactively in a Test-Last approach? </p></li><li><p><strong>Test Driven Development:</strong> Finally, how do we switch to Test-Driven Development?</p></li></ul><p>You can access the full series here: &#128071;&#128071;&#128071;</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;dfc8d8df-631f-4c68-b073-42f221de01c0&quot;,&quot;caption&quot;:&quot;You&#8217;re stuck in Legacy Code. It&#8217;s a Big Ball of Mud, there are no tests. In the book Working Effectively with Legacy Code, Michael Feathers defined Legacy Code:&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;TDD in Legacy Code Transformation&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:27708677,&quot;name&quot;:&quot;Valentina Jemuovi&#263;&quot;,&quot;bio&quot;:&quot;Technical Coach @ Optivem | TDD | Hexagonal Architecture | Clean Architecture | I help Technical Founders to deliver software products faster by minimizing regression bugs and reducing maintenance cost&quot;,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/04f571bf-04c6-43af-b888-9bc1eb7d490a_200x200.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2024-09-26T05:50:48.953Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3fabbb4b-d84d-4f73-9cfe-35491a0d687e_1000x591.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://journal.optivem.com/p/tdd-in-legacy-code-transformation&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:149345949,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:15,&quot;comment_count&quot;:2,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Optivem Journal&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9abead4c-3f54-46b1-96aa-7033849416df_200x200.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">TDD &#183; Hexagonal Architecture &#183; Clean Architecture. Join 5K+ subscribers</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1></h1>]]></content:encoded></item><item><title><![CDATA[TDD in Legacy Code - Acceptance Stage]]></title><description><![CDATA[In Legacy Code, Acceptance Testing is often done manually, which makes ATDD impractical. Let's see how we can introduce the Acceptance Stage as an enabler for Acceptance Tests.]]></description><link>https://journal.optivem.com/p/acceptance-stage-in-legacy-code</link><guid isPermaLink="false">https://journal.optivem.com/p/acceptance-stage-in-legacy-code</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Thu, 10 Oct 2024 06:01:43 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/cb887004-4b6c-46aa-8fbe-4b5969a01a44_1200x800.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#128274;Hello, this is Valentina with a premium issue of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply TDD in Legacy Code. This article is part of the <a href="https://journal.optivem.com/p/tdd-in-legacy-code-outline">TDD in Legacy Code</a> series. To get these articles in your inbox every week, subscribe:</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h2>Legacy Code has Manual Acceptance Testing</h2><p>In Legacy Code, QA Engineers perform Manual Acceptance Testing (Manual E2E Testing), commonly referred to as UAT testing, before releasing the system to Production. This is time-consuming and error-prone, and results in delayed releases.</p><h2>Can&#8217;t do ATDD with Manual Acceptance Tests</h2><p>We can&#8217;t practice ATDD with Manual Acceptance Tests because they are time-consuming, hence were can&#8217;t run them often. Furthermore, they are error-prone, so we can&#8217;t trust their results.</p><h2>We need an Acceptance Stage to support ATDD</h2><p>In order to practice ATDD, we need to start development of any new feature with Automated Acceptance Tests, and to be able to regularly run those tests. We can run these Acceptance Tests to know when we&#8217;ve satisfied the User Story Acceptance Criteria. Furthermore, we use these tests in the future for regression testing at the system level. By eliminating manual acceptance testing, we gain both safety and speed, and enable QA Engineers to do Exploratory Testing.</p><p><em>Previously, we set up the <a href="https://journal.optivem.com/p/release-stage-in-legacy-code">Release Stage</a>, which deployed Docker Images to environments, so that the QA Engineer could do Manual Acceptance Testing. In this article, we will be looking at the Acceptance Stage - running (Automated) Acceptance Tests, External System Contract Tests and E2E Tests.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HNay!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff969f2e6-e71e-4495-bb89-b0ec74b3a60a_3060x1238.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HNay!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff969f2e6-e71e-4495-bb89-b0ec74b3a60a_3060x1238.png 424w, https://substackcdn.com/image/fetch/$s_!HNay!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff969f2e6-e71e-4495-bb89-b0ec74b3a60a_3060x1238.png 848w, https://substackcdn.com/image/fetch/$s_!HNay!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff969f2e6-e71e-4495-bb89-b0ec74b3a60a_3060x1238.png 1272w, https://substackcdn.com/image/fetch/$s_!HNay!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff969f2e6-e71e-4495-bb89-b0ec74b3a60a_3060x1238.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HNay!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff969f2e6-e71e-4495-bb89-b0ec74b3a60a_3060x1238.png" width="1456" height="589" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f969f2e6-e71e-4495-bb89-b0ec74b3a60a_3060x1238.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:589,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:155152,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HNay!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff969f2e6-e71e-4495-bb89-b0ec74b3a60a_3060x1238.png 424w, https://substackcdn.com/image/fetch/$s_!HNay!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff969f2e6-e71e-4495-bb89-b0ec74b3a60a_3060x1238.png 848w, https://substackcdn.com/image/fetch/$s_!HNay!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff969f2e6-e71e-4495-bb89-b0ec74b3a60a_3060x1238.png 1272w, https://substackcdn.com/image/fetch/$s_!HNay!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff969f2e6-e71e-4495-bb89-b0ec74b3a60a_3060x1238.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here are the steps for adding the Acceptance Stage to Legacy Code. You&#8217;ll get tasks to implement in your GitHub Sandbox Project. &#11015;&#65039;&#11015;&#65039;&#11015;&#65039; </p>
      <p>
          <a href="https://journal.optivem.com/p/acceptance-stage-in-legacy-code">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[TDD in Legacy Code - Release Stage]]></title><description><![CDATA[In Legacy Code, releases might be manual, which is inconvenient for ATDD. Let's see how to introduce automated releases, before starting ATDD.]]></description><link>https://journal.optivem.com/p/release-stage-in-legacy-code</link><guid isPermaLink="false">https://journal.optivem.com/p/release-stage-in-legacy-code</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Thu, 03 Oct 2024 06:00:57 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/aca310df-20c9-41b0-b6b0-2b95c3fa5f83_1200x800.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#128274;Hello, this is Valentina with a premium issue of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply TDD in Legacy Code. This article is part of the <a href="https://journal.optivem.com/p/tdd-in-legacy-code-outline">TDD in Legacy Code</a> series. To get these articles in your inbox every week, subscribe:</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h2>Legacy Code often has Manual Releases</h2><p>In Legacy Code, the release process might be manual. This means there&#8217;s a written procedure that documents all the deployment steps - for example, manually setting up the environment, manually deploying the artifacts to an environment, manually running database migration scripts, and manually opening up the app after the deployment to make sure that it&#8217;s up and running.</p><h2>Manual Releases are inconvenient for ATDD</h2><p>The problem with manual releases is that they are time-consuming and error-prone. Manual Releases are not reliable. For example, we can deploy to the UAT Environment, and it&#8217;s fine, but if we make a small error in the deployment to the Production Environment, the system doesn&#8217;t work for the end users.</p><p>Furthermore, Manual Releases would make it inconvenient for us to practice ATDD. Since we may need to run Acceptance Tests on the pipeline multiple times a day, this isn&#8217;t practical if the releases are manual.</p><h2>We should have a Release Stage to support ATDD</h2><p>Before we start with ATDD, we need to ensure that we set up an automated release process. That&#8217;s why we need a Release Stage in our Pipeline. The Release Stage automates environment configuration and deployment of our system environments, as well as basic smoke testing of the system. By eliminating manual activities in the deployment process, we gain both safety and speed, eliminate deployment errors, and perform deployment fast anytime.</p><p><em>Previously, we set up the <a href="https://journal.optivem.com/p/commit-stage-in-legacy-code">Commit Stage</a>, which resulted in publishing the Docker Images for the Docker Registry. In this article, we will be looking at the Release Stage - deploying the Docker Images to environments.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Wq2S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b79a731-a9d8-4237-885c-5cb2801cafb8_3060x1238.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Wq2S!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b79a731-a9d8-4237-885c-5cb2801cafb8_3060x1238.png 424w, https://substackcdn.com/image/fetch/$s_!Wq2S!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b79a731-a9d8-4237-885c-5cb2801cafb8_3060x1238.png 848w, https://substackcdn.com/image/fetch/$s_!Wq2S!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b79a731-a9d8-4237-885c-5cb2801cafb8_3060x1238.png 1272w, https://substackcdn.com/image/fetch/$s_!Wq2S!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b79a731-a9d8-4237-885c-5cb2801cafb8_3060x1238.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Wq2S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b79a731-a9d8-4237-885c-5cb2801cafb8_3060x1238.png" width="1456" height="589" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2b79a731-a9d8-4237-885c-5cb2801cafb8_3060x1238.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:589,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:160012,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Wq2S!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b79a731-a9d8-4237-885c-5cb2801cafb8_3060x1238.png 424w, https://substackcdn.com/image/fetch/$s_!Wq2S!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b79a731-a9d8-4237-885c-5cb2801cafb8_3060x1238.png 848w, https://substackcdn.com/image/fetch/$s_!Wq2S!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b79a731-a9d8-4237-885c-5cb2801cafb8_3060x1238.png 1272w, https://substackcdn.com/image/fetch/$s_!Wq2S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b79a731-a9d8-4237-885c-5cb2801cafb8_3060x1238.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here are the steps for adding the Release Stage to Legacy Code. You&#8217;ll get tasks to implement in your GitHub Sandbox Project. &#11015;&#65039;&#11015;&#65039;&#11015;&#65039; </p>
      <p>
          <a href="https://journal.optivem.com/p/release-stage-in-legacy-code">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[TDD in Legacy Code - Commit Stage]]></title><description><![CDATA[In Legacy Code, developers might be manually building the system. It would be useless to practice TDD with manual builds. Let's see how to introduce Build Automation.]]></description><link>https://journal.optivem.com/p/commit-stage-in-legacy-code</link><guid isPermaLink="false">https://journal.optivem.com/p/commit-stage-in-legacy-code</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Thu, 26 Sep 2024 14:32:27 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/167b5c54-8d42-47ad-9c0a-499360ecd8fd_1200x800.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#128274;Hello, this is Valentina with a premium issue of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply TDD in Legacy Code. This article is part of the <a href="https://journal.optivem.com/p/tdd-in-legacy-code-outline">TDD in Legacy Code</a> series. To get these articles in your inbox every week, subscribe:</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h2>Legacy Code: the build is (often) broken</h2><p>The developer was manually compiling the code (perhaps running a few tests, if any). It seemed to be working, so they deployed it to a server.</p><p>A few minutes later, a teammate pulled the latest source code, ran compilation (and very few tests, if any), and said the build didn&#8217;t work.</p><p>The first developer then exclaimed:</p><blockquote><p>&#8220;But it works on my machine!&#8220;</p></blockquote><p>In Legacy Code projects, there might not be any centralized Build Server, and the build process might be manual. The development team might compile the code locally and produce artifacts that they would later use for manual deployment.</p><h2>TDD is ineffective if you have Manual Builds</h2><p>The problem is, that when the build process is manual, it is error-prone and time-consuming. Furthermore, the person who manually builds the system might not even be running any tests, if any. We have the problem of &#8220;it works on my machine&#8221;, whereby the tests (if any) might be passing on that machine but not generally working. </p><p>Therefore, even if a team tried to do TDD, their tests could be all green locally on their machine, but those same tests could fail on other machines, and the software itself might not be working. Furthermore, the developer who manually builds the system might forget to run the tests and just compile the code.</p><p>Consequently, if you try to practice TDD but you have Manual Builds, then TDD is only partially effective for you.</p><h2>We need Build Automation for effective TDD</h2><p>That&#8217;s why we need to automate the build process - using the Commit Stage. This ensures that code compilation and test execution are done on a separate independent machine. This prevents the case that compilation and tests &#8220;work on my machine&#8220;, and thus prevents faulty builds.</p><p>We automated the build using the Commit Stage. The Commit Stage is the first stage in the Pipeline&#8212;it compiles code, runs developer-facing technically focused tests, and runs static code analysis. Assuming all that passed, the Commit Stage generates Artifacts and stores them in the Artifact Repository. Legacy Projects may not have a Commit Stage at all, or they might be poorly designed, so that&#8217;s what we have to fix to enable the execution of technical tests.</p><p>Furthermore, having a Commit Stage within the Pipeline is a prerequisite for Continuous Integration (CI), irrespective of TDD.</p><p>Therefore, in Legacy Projects, don&#8217;t jump to TDD unless you have setup Build Automation first. That&#8217;s why, in the <a href="https://journal.optivem.com/p/tdd-in-legacy-code-transformation">TDD in Legacy Code Transformation</a>, we start with the Pipeline Commit Stage:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qd_X!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87744450-76b7-45f7-a961-f0ee4b836e7d_3060x1238.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qd_X!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87744450-76b7-45f7-a961-f0ee4b836e7d_3060x1238.png 424w, https://substackcdn.com/image/fetch/$s_!qd_X!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87744450-76b7-45f7-a961-f0ee4b836e7d_3060x1238.png 848w, https://substackcdn.com/image/fetch/$s_!qd_X!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87744450-76b7-45f7-a961-f0ee4b836e7d_3060x1238.png 1272w, https://substackcdn.com/image/fetch/$s_!qd_X!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87744450-76b7-45f7-a961-f0ee4b836e7d_3060x1238.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qd_X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87744450-76b7-45f7-a961-f0ee4b836e7d_3060x1238.png" width="1456" height="589" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/87744450-76b7-45f7-a961-f0ee4b836e7d_3060x1238.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:589,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:155805,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qd_X!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87744450-76b7-45f7-a961-f0ee4b836e7d_3060x1238.png 424w, https://substackcdn.com/image/fetch/$s_!qd_X!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87744450-76b7-45f7-a961-f0ee4b836e7d_3060x1238.png 848w, https://substackcdn.com/image/fetch/$s_!qd_X!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87744450-76b7-45f7-a961-f0ee4b836e7d_3060x1238.png 1272w, https://substackcdn.com/image/fetch/$s_!qd_X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87744450-76b7-45f7-a961-f0ee4b836e7d_3060x1238.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here are the steps for adding the Commit Stage to Legacy Code. You&#8217;ll get tasks to implement in your GitHub Sandbox Project. &#11015;&#65039;&#11015;&#65039;&#11015;&#65039; </p>
      <p>
          <a href="https://journal.optivem.com/p/commit-stage-in-legacy-code">
              Read more
          </a>
      </p>
   ]]></content:encoded></item></channel></rss>