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

<channel>
	<title>DevOps Archives - ShiftMag</title>
	<atom:link href="https://shiftmag.dev/category/devops/feed/" rel="self" type="application/rss+xml" />
	<link>https://shiftmag.dev/category/devops/</link>
	<description>Insightful engineering content &#38; community</description>
	<lastBuildDate>Thu, 11 Jun 2026 12:58:22 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://shiftmag.dev/wp-content/uploads/2024/08/cropped-ShiftMag-favicon-32x32.png</url>
	<title>DevOps Archives - ShiftMag</title>
	<link>https://shiftmag.dev/category/devops/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Solving the Multi-Contributor Challenge with Kubernetes and Ephemeral Environments</title>
		<link>https://shiftmag.dev/kubernetes-multi-contributor-challenge-infobip-9591/</link>
		
		<dc:creator><![CDATA[Antonio Ereiz]]></dc:creator>
		<pubDate>Thu, 11 Jun 2026 12:56:12 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Engineer Explains]]></category>
		<category><![CDATA[kazhoon]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=9591</guid>

					<description><![CDATA[<p>When dozens of developers share the same environment and Git repository, testing changes quickly becomes chaotic. Here's how Kubernetes solves that.</p>
<p>The post <a href="https://shiftmag.dev/kubernetes-multi-contributor-challenge-infobip-9591/">Solving the Multi-Contributor Challenge with Kubernetes and Ephemeral Environments</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img fetchpriority="high" decoding="async" width="1376" height="768" src="https://shiftmag.dev/wp-content/uploads/2026/05/kubernetes-bottleneck-raw.png?x94846" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/05/kubernetes-bottleneck-raw.png 1376w, https://shiftmag.dev/wp-content/uploads/2026/05/kubernetes-bottleneck-raw-300x167.png 300w, https://shiftmag.dev/wp-content/uploads/2026/05/kubernetes-bottleneck-raw-1024x572.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/05/kubernetes-bottleneck-raw-768x429.png 768w" sizes="(max-width: 1376px) 100vw, 1376px" /></figure>


<p class="wp-block-paragraph">I spend most of my time maintaining our companies&nbsp;<strong>internal developer portal (IDP),&nbsp;</strong>known internally as&nbsp;<strong>Kazhoon</strong>&nbsp;(which is built on&nbsp;<a href="https://backstage.io/">Backstage</a>). Like any developer portal, it provides a lot of features built by a wide range of engineering teams.</p>



<p class="wp-block-paragraph">Beyond my core team of maintainers, there are about 50 other contributors across the company who regularly develop their own plugins and features. All of these engineers push code to a single, giant&nbsp;<a href="https://monorepo.tools/">monorepo</a>.</p>



<p class="wp-block-paragraph">As you can imagine, there are going to be a lot of challenges with this kind of setup. In this guide, I&#8217;m going to focus on solving one of them.</p>



<h2 id="ScalingMultiContributorDevelopmentwithKubernetes&amp;EphemeralEnvironments-TheMulti-ContributorChallenge" class="wp-block-heading"><span id="the-multi-contributor-challenge"><strong>The Multi-Contributor Challenge</strong></span></h2>



<p class="wp-block-paragraph">When contributors are working on some feature, before merging, they would like to test it out, usually in a staging/testing environment. A small team working on a project has no issues here. They will just internally coordinate who gets to deploy at what time. But when you have 5 teams simultaneously working on different features, you&nbsp;<strong>will</strong>&nbsp;get conflicts.</p>



<p class="wp-block-paragraph">Our solution initially was to tell people to merge their &#8220;feature&#8221; branch into a &#8220;dev&#8221; branch that in theory should contain the features of all the other contributors as well. We would then deploy just this &#8220;dev&#8221; branch. In practice, however, we were still getting conflicts, just this time in a different place.</p>



<p class="wp-block-paragraph">Contributors would have issues merging their changes into the dev branch due to several reasons. Sometimes the dev branch was outdated, missing the latest changes from the master branch. Sometimes the contributors branch was not up-to-date. </p>



<p class="wp-block-paragraph">Sometimes someone doesn&#8217;t merge cleanly, which causes frustration to all the other people wanting to merge as well. Every few weeks we had to create a new &#8220;dev&#8221; branch from scratch because it just became impossible to fix the problems with the old one.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="491" src="https://shiftmag.dev/wp-content/uploads/2026/05/Photo1-kubernetes-1024x491.png?x94846" alt="The issue of having multiple contributors pushing requests to a single dev branch." class="wp-image-10046" srcset="https://shiftmag.dev/wp-content/uploads/2026/05/Photo1-kubernetes-1024x491.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/05/Photo1-kubernetes-300x144.png 300w, https://shiftmag.dev/wp-content/uploads/2026/05/Photo1-kubernetes-768x368.png 768w, https://shiftmag.dev/wp-content/uploads/2026/05/Photo1-kubernetes.png 1618w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">With many push requests, the &#8220;dev&#8221; branch was in trouble. </figcaption></figure>



<p class="wp-block-paragraph">So how do we solve this problem? The answer came to me while experimenting with Kubernetes. I was in the process of migrating one of our projects from a traditional “Docker on a VM” setup into Kubernetes. The project in question, as you might guess, is Kazhoon, our internal developer portal (IDP).&nbsp;</p>



<p class="wp-block-paragraph">Before explaining the solution, it helps to first understand how we deploy applications to Kubernetes.</p>



<h2 id="ScalingMultiContributorDevelopmentwithKubernetes&amp;EphemeralEnvironments-HowdowedeploytoKubernetes" class="wp-block-heading"><span id="how-do-we-deploy-to-kubernetes"><strong>How do we deploy to Kubernetes</strong></span></h2>



<p class="wp-block-paragraph">Apart from having standard Kubernetes clusters, Infobip also leverages ArgoCD. A continuous delivery/deployment tool that sits between developers and Kubernetes. It uses GitOps principles to continuously sync infrastructure configuration stored in a Git repository with the actual cluster state. </p>



<p class="wp-block-paragraph">This way,&nbsp;developers don&#8217;t need to directly interact with a Kubernetes cluster but instead just tweak and update the files in git and ArgoCD will make sure the changes get reflected in the actual Kubernetes cluster.</p>



<p class="wp-block-paragraph">Also, it gives us a nice UI to monitor the changes. </p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="313" src="https://shiftmag.dev/wp-content/uploads/2026/06/image-2025-11-21_12-46-571-1024x313.png?x94846" alt="" class="wp-image-10289" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/image-2025-11-21_12-46-571-1024x313.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/image-2025-11-21_12-46-571-300x92.png 300w, https://shiftmag.dev/wp-content/uploads/2026/06/image-2025-11-21_12-46-571-768x235.png 768w, https://shiftmag.dev/wp-content/uploads/2026/06/image-2025-11-21_12-46-571.png 1660w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">ArgoCD UI</figcaption></figure>



<p class="wp-block-paragraph"><strong>So how do we deploy?</strong></p>



<p class="wp-block-paragraph">Well&#8230;, let&#8217;s say we want to deploy a &#8220;simple&#8221; application. In this case it is our IDP Kazhoon. Keep in mind that our app has do be dockerized for it to be deployed to Kubernetes.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>P.S. The files below are created in a separate git repository that is linked with our ArgoCD application. For more information check out&nbsp;<a href="https://argo-cd.readthedocs.io/en/stable/getting_started/" target="_blank" rel="noreferrer noopener nofollow">ArgoCD docs</a>. Parts of the files have also been cut out for clarity.</em></p>
</blockquote>



<p class="wp-block-paragraph">We will first create a file which describes how our application should be deployed. Important parts have comments.</p>



<p class="wp-block-paragraph"></p>



<details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow" style="font-size:16px"><summary><strong><em>Deployment &#8211; CLICK TO EXPAND</em></strong></summary>
<pre style="font-family:monospace;color: rgb(68, 68, 68); background-color: rgb(243, 243, 243); font-weight: 400; "><span style="color: rgb(68, 68, 68); font-weight: 400;">apiVersion:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">apps/v1</span>
<span style="color: rgb(68, 68, 68); font-weight: 400;">kind:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">Deployment</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># Type of resource in Kubernetes that manages our pods (aka. instances)</span>
<span style="color: rgb(68, 68, 68); font-weight: 400;">metadata:</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">backstage-deployment</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># Name of the resources</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">namespace:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">infobip-kazhoon</span>
<span style="color: rgb(68, 68, 68); font-weight: 400;">spec:</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">replicas:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">2</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># Number of pods to create/manage</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">selector:</span>
    <span style="color: rgb(68, 68, 68); font-weight: 400;">matchLabels:</span>
      <span style="color: rgb(68, 68, 68); font-weight: 400;">app:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">backstage-deployment</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">template:</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># this is where we describe each deployment of our application</span>
    <span style="color: rgb(68, 68, 68); font-weight: 400;">metadata:</span>
      <span style="color: rgb(68, 68, 68); font-weight: 400;">labels:</span>
        <span style="color: rgb(68, 68, 68); font-weight: 400;">app:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">backstage-deployment</span>
    <span style="color: rgb(68, 68, 68); font-weight: 400;">spec:</span>
      <span style="color: rgb(68, 68, 68); font-weight: 400;">imagePullSecrets:</span>
        <span style="color: rgb(57, 115, 0); font-weight: 400;">-</span> <span style="color: rgb(68, 68, 68); font-weight: 400;">name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">image-pull-secret</span>
      <span style="color: rgb(68, 68, 68); font-weight: 400;">containers:</span>
        <span style="color: rgb(57, 115, 0); font-weight: 400;">-</span> <span style="color: rgb(68, 68, 68); font-weight: 400;">name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">backstage-deployment</span>
          <span style="color: rgb(68, 68, 68); font-weight: 400;">image:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">docker.domain.com/infobip-backstage:1.175.9</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># dockerized image on internal artifact repository.</span>
          <span style="color: rgb(68, 68, 68); font-weight: 400;">imagePullPolicy:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">IfNotPresent</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># Yes, Kubernetes will cache your images, so if it already existed, it will reuse it based on the name/version.</span>
          <span style="color: rgb(68, 68, 68); font-weight: 400;">ports:</span>
            <span style="color: rgb(57, 115, 0); font-weight: 400;">-</span> <span style="color: rgb(68, 68, 68); font-weight: 400;">name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">http</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># new port called "http"</span>
              <span style="color: rgb(68, 68, 68); font-weight: 400;">containerPort:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">7007</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># port where our application is listening</span>
          <span style="color: rgb(68, 68, 68); font-weight: 400;">envFrom:</span>
            <span style="color: rgb(57, 115, 0); font-weight: 400;">-</span> <span style="color: rgb(68, 68, 68); font-weight: 400;">configMapRef:</span>
                <span style="color: rgb(68, 68, 68); font-weight: 400;">name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">backstage-config</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># Environment variables defined in a separate file</span>
            <span style="color: rgb(57, 115, 0); font-weight: 400;">-</span> <span style="color: rgb(68, 68, 68); font-weight: 400;">secretRef:</span>
                <span style="color: rgb(68, 68, 68); font-weight: 400;">name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">backstage-secrets</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f576.png" alt="🕶" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Secret Environment variable defined in a separate file</span>
          <span style="color: rgb(68, 68, 68); font-weight: 400;">resources:</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># We don't need to provision VMs for our application, we just tell Kubernetes how "heavy" our app is and Kubernetes will make sure to give us enough power.</span>
            <span style="color: rgb(68, 68, 68); font-weight: 400;">requests:</span>
              <span style="color: rgb(68, 68, 68); font-weight: 400;">cpu:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">"1"</span>
              <span style="color: rgb(68, 68, 68); font-weight: 400;">memory:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">"1Gi"</span>
            <span style="color: rgb(68, 68, 68); font-weight: 400;">limits:</span>
              <span style="color: rgb(68, 68, 68); font-weight: 400;">cpu:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">"1"</span>
              <span style="color: rgb(68, 68, 68); font-weight: 400;">memory:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">"1Gi"</span></pre>
</details>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">We also need some sort of internal load balancer for our pods to be able to connect to them. We need to create a Kubernetes<strong>&nbsp;Service.&nbsp;</strong></p>



<p class="wp-block-paragraph"></p>



<details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow" style="font-size:16px"><summary><strong><em>Service &#8211; CLICK TO EXPAND</em></strong></summary>
<pre style="font-family:monospace;color: rgb(68, 68, 68); background-color: rgb(243, 243, 243); font-weight: 400; "><span style="color: rgb(68, 68, 68); font-weight: 400;">apiVersion:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">v1</span>
<span style="color: rgb(68, 68, 68); font-weight: 400;">kind:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">Service</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># Type of Kubernetes resource that acts as an internal load balancer. It also allows other resources to communicate with out pods</span>
<span style="color: rgb(68, 68, 68); font-weight: 400;">metadata:</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">backstage-service</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">namespace:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">infobip-kazhoon</span>
<span style="color: rgb(68, 68, 68); font-weight: 400;">spec:</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">selector:</span>
    <span style="color: rgb(68, 68, 68); font-weight: 400;">app:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">backstage-deployment</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># We tell the service which pods it should find</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">ports:</span>
    <span style="color: rgb(57, 115, 0); font-weight: 400;">-</span> <span style="color: rgb(68, 68, 68); font-weight: 400;">name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">http</span> <span style="color: rgb(105, 112, 112); font-weight: 400;">#  we define a new port </span>
      <span style="color: rgb(68, 68, 68); font-weight: 400;">port:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">80</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># this port gets opened on the Service </span>
      <span style="color: rgb(68, 68, 68); font-weight: 400;">targetPort:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">http</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># resolves to the 7007 port of our pods (check the ports defined in the Deployment snippet)</span>
</pre>
</details>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">As a last step we also want to allow for people outside the Kubernetes cluster to connect to our application. We need an&nbsp;<strong>Ingress</strong></p>



<p class="wp-block-paragraph"></p>



<details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow" style="font-size:16px"><summary><strong><em>Ingress &#8211; CLICK TO EXPAND</em></strong></summary>
<pre style="font-family:monospace;color: rgb(68, 68, 68); background-color: rgb(243, 243, 243); font-weight: 400; "><span style="color: rgb(68, 68, 68); font-weight: 400;">apiVersion:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">networking.k8s.io/v1</span>
<span style="color: rgb(68, 68, 68); font-weight: 400;">kind:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">Ingress</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># Type of Kubernetes resource that allows us to expose our internal network to the outside. In Infobip we use Haproxy for this.</span>
<span style="color: rgb(68, 68, 68); font-weight: 400;">metadata:</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">backstage-ingress</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">namespace:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">infobip-kazhoon</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">annotations:</span>
    <span style="color: rgb(68, 68, 68); font-weight: 400;">iks-external-dns.k8s.infobip.com/hostname:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">infobip-kazhoon-iot1.domain.com</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># special Infobip annotations that create a DNS record for our network</span>
    <span style="color: rgb(68, 68, 68); font-weight: 400;">cert-manager.io/common-name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">infobip-kazhoon-iot1.domain.com</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># used for TLS</span>
    <span style="color: rgb(68, 68, 68); font-weight: 400;">cert-manager.io/cluster-issuer:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">vault-issuer</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># TLS</span>
<span style="color: rgb(68, 68, 68); font-weight: 400;">spec:</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">rules:</span>
    <span style="color: rgb(57, 115, 0); font-weight: 400;">-</span> <span style="color: rgb(68, 68, 68); font-weight: 400;">host:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">infobip-kazhoon-iot1.domain.com</span>
      <span style="color: rgb(68, 68, 68); font-weight: 400;">http:</span>
        <span style="color: rgb(68, 68, 68); font-weight: 400;">paths:</span>
          <span style="color: rgb(57, 115, 0); font-weight: 400;">-</span> <span style="color: rgb(68, 68, 68); font-weight: 400;">path:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">/</span>
            <span style="color: rgb(68, 68, 68); font-weight: 400;">pathType:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">Prefix</span>
            <span style="color: rgb(68, 68, 68); font-weight: 400;">backend:</span>
              <span style="color: rgb(68, 68, 68); font-weight: 400;">service:</span>
                <span style="color: rgb(68, 68, 68); font-weight: 400;">name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">backstage-service</span>
                <span style="color: rgb(68, 68, 68); font-weight: 400;">port:</span>
                  <span style="color: rgb(68, 68, 68); font-weight: 400;">number:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">80</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">tls:</span>
    <span style="color: rgb(57, 115, 0); font-weight: 400;">-</span> <span style="color: rgb(68, 68, 68); font-weight: 400;">hosts:</span>
        <span style="color: rgb(57, 115, 0); font-weight: 400;">-</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">infobip-kazhoon-iot1.domain.com</span>
&nbsp; &nbsp; &nbsp; <span style="color: rgb(68, 68, 68); font-weight: 400;">secretName:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">minimal-ingress-cert</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># stores the certificate in this certificate resource</span></pre>
</details>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Once we create all the files, we push them to&nbsp;our git repository and hit &#8220;Sync&#8221; on ArgoCD. If we did everything okay we should see something like this:<br></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="133" src="https://shiftmag.dev/wp-content/uploads/2026/05/image-1-1024x133.png?x94846" alt="request → the ip of the haproxy service (which now has our config from the ingress) → ingress → service (load balancer) → pods" class="wp-image-10099" srcset="https://shiftmag.dev/wp-content/uploads/2026/05/image-1-1024x133.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/05/image-1-300x39.png 300w, https://shiftmag.dev/wp-content/uploads/2026/05/image-1-768x100.png 768w, https://shiftmag.dev/wp-content/uploads/2026/05/image-1.png 1734w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">From left to right:<br><strong>request → the ip of the haproxy service (which now has our config from the ingress) → ingress → service (load balancer) → pods</strong></figcaption></figure>



<p class="wp-block-paragraph"><em>Since this is a simplified &#8220;network&#8221; view we don&#8217;t see all resources (config files, certificates, etc&#8230;). The pods/instances on our right are the result of our &#8220;Deployment&#8221; resource which is not visible here.</em></p>



<p class="wp-block-paragraph">As you can see, with just a handful of files we managed to completely skip VM provisioning as well as avoid the need to click through yet another UI just to deploy.</p>



<h2 id="ScalingMultiContributorDevelopmentwithKubernetes&amp;EphemeralEnvironments-Revelation" class="wp-block-heading"><span id="and-then-it-clicked"><strong>And then, it clicked</strong></span></h2>



<p class="wp-block-paragraph">Kubernetes wasn’t just solving our infrastructure problems. Its design made it possible to solve the contributor problem I described at the beginning.</p>



<p class="wp-block-paragraph">Instead of coordinating deployments, managing shared environments, or deciding who gets to test changes and when, we could let the platform do the work for us.</p>



<p class="wp-block-paragraph">Everything could be automated.<br>Every change could have its own environment.<br>No coordination required.</p>



<p class="wp-block-paragraph"><em>The solution?</em></p>



<h2 id="ScalingMultiContributorDevelopmentwithKubernetes&amp;EphemeralEnvironments-EphemeralEnvironments" class="wp-block-heading"><span id="ephemeral-environments"><strong>Ephemeral Environments</strong></span></h2>



<p class="wp-block-paragraph">Whenever a contributor opens a new pull request, we can create an ephemeral (temporary) environment specifically for that branch, using the steps described in the example above.</p>



<p class="wp-block-paragraph">We deploy the contributor’s branch to this environment and provide a unique link where they can test their changes.</p>



<p class="wp-block-paragraph">This approach means contributors don’t need to think about deployment at all &#8211; everything happens automatically.</p>



<p class="wp-block-paragraph">Each temporary environment is fully isolated from the others. The only shared component is the database, which could be further improved by switching to an in-memory solution.</p>



<p class="wp-block-paragraph">Each environment has its own ingress, ensuring that every contributor receives a dedicated URL for their branch.</p>



<p class="wp-block-paragraph">Because of this, we can eliminate the need for a separate&nbsp;<code>dev</code>&nbsp;branch and deploy feature branches directly.</p>



<h2 id="ScalingMultiContributorDevelopmentwithKubernetes&amp;EphemeralEnvironments-Howitworks?" class="wp-block-heading"><span id="how-it-works"><strong>How it works?</strong></span></h2>



<h2 id="ScalingMultiContributorDevelopmentwithKubernetes&amp;EphemeralEnvironments-PullRequestHooks" class="wp-block-heading"><span id="step-1-pull-request-hooks">Step 1: Pull Request Hooks</span></h2>



<p class="wp-block-paragraph">Initially a contributor will just write some code, test it locally, and when happy, open up a pull request. This is where most developers would usually deploy to some IO environment that is close to a production setup for additional testing.</p>



<p class="wp-block-paragraph">Instead of having to worry about the deployment, a Bitbucket&nbsp;<a href="https://confluence.atlassian.com/bitbucketserver/manage-webhooks-938025878.html" target="_blank" rel="noreferrer noopener nofollow">webhook</a>&nbsp;which listens to the&nbsp;<strong>PR_OPENED&nbsp;</strong>event will trigger a Jenkins job. The same Jenkins job that is used to build the main Kazhoon application. This is done to prevent duplication of jenkins groovy code as well as archetypes, which I will explain later. Simple hook below.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="814" height="498" src="https://shiftmag.dev/wp-content/uploads/2026/05/photo-4-kubernetes.png?x94846" alt="" class="wp-image-10050" srcset="https://shiftmag.dev/wp-content/uploads/2026/05/photo-4-kubernetes.png 814w, https://shiftmag.dev/wp-content/uploads/2026/05/photo-4-kubernetes-300x184.png 300w, https://shiftmag.dev/wp-content/uploads/2026/05/photo-4-kubernetes-768x470.png 768w" sizes="auto, (max-width: 814px) 100vw, 814px" /></figure>



<p class="wp-block-paragraph"><em>Notice the additional hook at the top. This is the main hook used for the app. It triggers the same Jenkins jobs but under different conditions (PUSH_EVENT &#8211; when code is pushed).</em></p>



<p class="wp-block-paragraph"><em>All of this can also be achieved on&nbsp;Github as well, using workflows.</em></p>



<h2 id="ScalingMultiContributorDevelopmentwithKubernetes&amp;EphemeralEnvironments-ThemainJenkinsJob" class="wp-block-heading"><span id="step-2-the-main-jenkins-job">Step 2: The main Jenkins Job</span></h2>



<p class="wp-block-paragraph">Apart from the main logic for building Kazhoon and pushing a docker image (standard for most Infobip apps), we additionally need the setup for Kubernetes. Keep in mind that the Jenkins job runs every time new code gets pushed. We need a way to detect which code change is linked to a PR. In other words:&nbsp;<strong>Does the branch that is currently being built have an open PR linked to it?</strong></p>



<p class="wp-block-paragraph">Initially we figured we could just use the build parameter PR_ID as seen&nbsp;on the image above. This was working okay for testing, but then a problem appeared. How do we detect code changes?&nbsp;After all, we would like the most recent code to be deployed and not just the one that existed when we opened up the PR.</p>



<p class="wp-block-paragraph">Sadly, the PR_ID parameter does not exist on regular code changes. We could create another hook using the PR_SOURCE_RESCOPED event, but that would mean that we will have duplicate Jenkins jobs. One for the newly added hook and one for the original &#8220;main&#8221; hook that always gets triggered when we push code. We need a different solution.</p>



<p class="wp-block-paragraph">Luckily, it is possible to call APIs through Jenkins, so what we can do is call the&nbsp;<a href="https://developer.atlassian.com/server/bitbucket/rest/v1000/intro/#about" target="_blank" rel="noreferrer noopener nofollow">Bitbucket API</a>, check if the branch currently being built has an open pull request, and if so, initiate the Kubernetes setup. This logic can be done on the initial pull request open event as well as subsequent code change triggers. Here is how that would look like. Example written in a Jenkinsfile using scripted pipeline syntax.</p>



<p class="wp-block-paragraph"></p>



<details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow" style="font-size:16px"><summary><strong><em>Bitbucket API example &#8211; CLICK TO EXPAND</em></strong></summary>
<pre style="font-family:monospace;color: rgb(68, 68, 68); background-color: rgb(243, 243, 243); font-weight: 400; ">def <span style="color: rgb(136, 0, 0); font-weight: 700;">findPrForSourceBranch</span>(sourceBranch) {
    <span style="color: rgb(136, 0, 0); font-weight: 700;">withCredentials</span>([<span style="color: rgb(68, 68, 68); font-weight: 700;">string</span>(<span style="color: rgb(68, 68, 68); font-weight: 400;">credentialsId</span>: globconst.GIT_HTTPS_TAG_TOKEN, <span style="color: rgb(68, 68, 68); font-weight: 400;">variable</span>: <span style="color: rgb(136, 0, 0); font-weight: 400;">'GIT_TOKEN'</span>)]) {
        def response = <span style="color: rgb(136, 0, 0); font-weight: 700;">httpRequest</span>(
            <span style="color: rgb(68, 68, 68); font-weight: 400;">url</span>: <span style="color: rgb(136, 0, 0); font-weight: 400;">"${globconst.BITBUCKET_API_URL}projects/IAF/repos/infobip-backstage/pull-requests?state=OPEN&amp;at=refs/heads/${sourceBranch}&amp;direction=OUTGOING"</span>,
            <span style="color: rgb(68, 68, 68); font-weight: 400;">httpMode</span>: <span style="color: rgb(136, 0, 0); font-weight: 400;">'GET'</span>,
            <span style="color: rgb(68, 68, 68); font-weight: 400;">contentType</span>: <span style="color: rgb(136, 0, 0); font-weight: 400;">'APPLICATION_JSON'</span>,
            <span style="color: rgb(68, 68, 68); font-weight: 400;">customHeaders</span>: [[<span style="color: rgb(68, 68, 68); font-weight: 400;">name</span>: <span style="color: rgb(136, 0, 0); font-weight: 400;">'Authorization'</span>, <span style="color: rgb(68, 68, 68); font-weight: 400;">value</span>: <span style="color: rgb(136, 0, 0); font-weight: 400;">"Bearer ${GIT_TOKEN}"</span>]],
            <span style="color: rgb(68, 68, 68); font-weight: 400;">validResponseCodes</span>: <span style="color: rgb(136, 0, 0); font-weight: 400;">'200'</span>
        )
        def prList = <span style="color: rgb(68, 68, 68); font-weight: 700;">new</span> groovy.json.<span style="color: rgb(136, 0, 0); font-weight: 700;">JsonSlurper</span>().<span style="color: rgb(136, 0, 0); font-weight: 700;">parseText</span>(response.content)
        <span style="color: rgb(68, 68, 68); font-weight: 700;">if</span> (prList.size &gt; <span style="color: rgb(136, 0, 0); font-weight: 400;">0</span>) {
            <span style="color: rgb(68, 68, 68); font-weight: 700;">return</span> prList.values[<span style="color: rgb(136, 0, 0); font-weight: 400;">0</span>].id
        }
        <span style="color: rgb(68, 68, 68); font-weight: 700;">return</span> <span style="color: rgb(102, 153, 85); font-weight: 400;">null</span>
    }
}
<span style="color: rgb(136, 0, 0); font-weight: 700;">node</span>(<span style="color: rgb(136, 0, 0); font-weight: 400;">'infobip-docker-nodejs:v20-dev'</span>) {
    <span style="color: rgb(136, 0, 0); font-weight: 700;">LoadJenkinsPipelineLibrary</span>(this)
    <span style="color: rgb(68, 68, 68); font-weight: 700;">if</span> (!env.PR_ID &amp;&amp; env.BRANCH_NAME &amp;&amp; env.BRANCH_NAME != <span style="color: rgb(136, 0, 0); font-weight: 400;">'master'</span>) {
        def prId = <span style="color: rgb(136, 0, 0); font-weight: 700;">findPrForSourceBranch</span>(env.BRANCH_NAME)
        <span style="color: rgb(68, 68, 68); font-weight: 700;">if</span> (prId) {
            env.PR_ID = prId
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: rgb(68, 68, 68); font-weight: 700;">echo</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">"Found PR_ID=${prId} for branch ${env.BRANCH_NAME}"</span>
        } <span style="color: rgb(68, 68, 68); font-weight: 700;">else</span> {
            <span style="color: rgb(68, 68, 68); font-weight: 700;">echo</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">"No PR found for branch ${env.BRANCH_NAME}"</span>
        }
    }</pre>
</details>



<p class="wp-block-paragraph">In the later stages we can just check for the env.PR_ID. If it exists then there is a PR linked to the branch. Here is how that would look like:</p>



<h3 class="wp-block-heading"><span id="stages">Stages:</span></h3>



<ol class="wp-block-list">
<li>Clone Kubernetes config repository which is linked to the ArgoCD application</li>



<li>Generate Kubernetes files from template &#8211; make sure we sanitize the values</li>



<li>Push to git</li>



<li>Trigger sync on ArgoCD and&nbsp;leave comment in PR with link to new deployment.</li>
</ol>



<p class="wp-block-paragraph"></p>



<details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow" style="font-size:16px"><summary><strong><em>Jenkinsfile Kubernetes Logic &#8211; CLICK TO EXPAND</em></strong></summary>
<pre style="font-family:monospace;color: rgb(68, 68, 68); background-color: rgb(243, 243, 243); font-weight: 400; "><span style="color: rgb(68, 68, 68); font-weight: 700;">def</span> K8S_CONFIG_REPO = <span style="color: rgb(136, 0, 0); font-weight: 400;">'ssh://git-instance.com:7999/project-name/infobip-kazhoon.git'</span>
<span style="color: rgb(68, 68, 68); font-weight: 700;">def</span> K8S_CONFIG_BRANCH = <span style="color: rgb(136, 0, 0); font-weight: 400;">'master'</span>
<span style="color: rgb(68, 68, 68); font-weight: 700;">def</span> K8S_CONFIG_TARGET_DIR = <span style="color: rgb(136, 0, 0); font-weight: 400;">'k8s-config-repo'</span>
<span style="color: rgb(68, 68, 68); font-weight: 700;">def</span> featureName = env.BRANCH_NAME.toLowerCase().replaceAll(<span style="color: rgb(171, 86, 86); font-weight: 400;">/[^a-z0-9_-]/</span>, <span style="color: rgb(136, 0, 0); font-weight: 400;">"-"</span>) ?: <span style="color: rgb(136, 0, 0); font-weight: 400;">'feature-preview'</span>
<span style="color: rgb(68, 68, 68); font-weight: 700;">def</span> k8sSafeName = env.BRANCH_NAME.toLowerCase().replaceAll(<span style="color: rgb(171, 86, 86); font-weight: 400;">/[^a-z0-9-]/</span>, <span style="color: rgb(136, 0, 0); font-weight: 400;">"-"</span>).take(<span style="color: rgb(136, 0, 0); font-weight: 400;">40</span>).replaceAll(<span style="color: rgb(171, 86, 86); font-weight: 400;">/-+$/</span>, <span style="color: rgb(136, 0, 0); font-weight: 400;">""</span>) <span style="color: rgb(105, 112, 112); font-weight: 400;">// Kubernetes name limit</span>
<span style="color: rgb(68, 68, 68); font-weight: 700;">def</span> dnsSafeName = k8sSafeName.take(<span style="color: rgb(136, 0, 0); font-weight: 400;">24</span>).replaceAll(<span style="color: rgb(171, 86, 86); font-weight: 400;">/-+$/</span>, <span style="color: rgb(136, 0, 0); font-weight: 400;">""</span>) <span style="color: rgb(105, 112, 112); font-weight: 400;">// DNS name limit eg. infobip-kazhoon-iot1-feature-verylongbr.domain.com</span>

stage(<span style="color: rgb(136, 0, 0); font-weight: 400;">'Clone Kubernetes Config Repo'</span>) {
	<span style="color: rgb(105, 112, 112); font-weight: 400;">// A neat trick to skip jenkins stages. Left out in later stages for brevity</span>
    <span style="color: rgb(68, 68, 68); font-weight: 700;">if</span> (!env.PR_ID) { 
        Utils.markStageSkippedForConditional(STAGE_NAME)
        <span style="color: rgb(68, 68, 68); font-weight: 700;">return</span>
    }
	<span style="color: rgb(105, 112, 112); font-weight: 400;">// Clone the kubernetes repository where we put our initial files for deployment.</span>
    sshagent(<span style="color: rgb(68, 68, 68); font-weight: 400;">credentials:</span> [GIT_CREDENTIALS]) {
        globlib.git.checkout(<span style="color: rgb(68, 68, 68); font-weight: 400;">gitUrl:</span> K8S_CONFIG_REPO, <span style="color: rgb(68, 68, 68); font-weight: 400;">gitBranch:</span> K8S_CONFIG_BRANCH, <span style="color: rgb(68, 68, 68); font-weight: 400;">targetDir:</span> K8S_CONFIG_TARGET_DIR)
    }
}

stage(<span style="color: rgb(136, 0, 0); font-weight: 400;">'Generate Kubernetes Files from Template'</span>) {
    <span style="color: rgb(68, 68, 68); font-weight: 700;">def</span> featurePath = <span style="color: rgb(136, 0, 0); font-weight: 400;">"${K8S_CONFIG_TARGET_DIR}/feature/${featureName}"</span>
    <span style="color: rgb(105, 112, 112); font-weight: 400;">// Copy and customize template. The template looks similar to the 3 files we created for the deployment just with some parts containing placeholders instead of fixed values.</span>
    sh <span style="color: rgb(136, 0, 0); font-weight: 400;">"""
        mkdir -p ${featurePath}
        cp -r ${K8S_CONFIG_TARGET_DIR}/feature/template/* ${featurePath}/

        # Replace placeholders in template
        for f in ${featurePath}/deployment.yaml ${featurePath}/service.yaml ${featurePath}/ingress.yaml; do
            sed -i -e "s|{{IMAGE_TAG}}|${dockerLabel}|" \
                -e "s|{{K8S_SAFE_IMAGE_TAG}}|${k8sSafeName}|" \
                -e "s|{{DNS_NAME}}|${dnsSafeName}|" \"\$f"
        done
    """</span>
}

stage(<span style="color: rgb(136, 0, 0); font-weight: 400;">'Push Kubernetes Resources to Git'</span>) { 
    dir(<span style="color: rgb(136, 0, 0); font-weight: 400;">"${K8S_CONFIG_TARGET_DIR}"</span>) {
        sshagent(<span style="color: rgb(68, 68, 68); font-weight: 400;">credentials:</span> [GIT_CREDENTIALS]) {
            sh <span style="color: rgb(136, 0, 0); font-weight: 400;">"""
                git config user.email "infobip-ci@infobip.com"
                git config user.name "Infobip CI (Jenkins)"
                git add .
				// We don't want the script to fail if there are no changes
                if ! git diff --cached --quiet; then
                    git commit -m 'added feature ${featureName}'
                    git push -u origin ${K8S_CONFIG_BRANCH}
                else
                    echo 'No changes to commit'
                fi
            """</span>
        }
    }
}

stage(<span style="color: rgb(136, 0, 0); font-weight: 400;">'Trigger Sync on ArgoCD'</span>) {
    withCredentials([string(<span style="color: rgb(68, 68, 68); font-weight: 400;">credentialsId:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">'kazhoon_argocd_bearer_token'</span>, <span style="color: rgb(68, 68, 68); font-weight: 400;">variable:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">'BEARER_TOKEN'</span>)]) {
        <span style="color: rgb(68, 68, 68); font-weight: 700;">def</span> response = httpRequest(
            <span style="color: rgb(171, 86, 86); font-weight: 400;">url:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">"https://argo-instance.com/api/v1/applications/infobip-kazhoon-iot1/sync"</span>,
            <span style="color: rgb(171, 86, 86); font-weight: 400;">httpMode:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">'POST'</span>,
            <span style="color: rgb(171, 86, 86); font-weight: 400;">contentType:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">'APPLICATION_JSON'</span>,
            <span style="color: rgb(171, 86, 86); font-weight: 400;">customHeaders:</span> [[<span style="color: rgb(68, 68, 68); font-weight: 400;">name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">'Authorization'</span>, <span style="color: rgb(68, 68, 68); font-weight: 400;">value:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">"Bearer ${BEARER_TOKEN}"</span>]],
            <span style="color: rgb(171, 86, 86); font-weight: 400;">validResponseCodes:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">'200'</span>
        )
    }
	<span style="color: rgb(105, 112, 112); font-weight: 400;">// Utility function for posting comments to Bitbucket PR.</span>
    postPrComment(env.PR_ID, <span style="color: rgb(136, 0, 0); font-weight: 400;">"finish"</span>, <span style="color: rgb(136, 0, 0); font-weight: 400;">"""<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Your **feature environment** is live!
    ![party](https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExcjFyczl4anFvZXYzNGY1aGM2amIyZTk5Y3B6ZWJ4dHM1Y2ExamptYSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/a0h7sAqON67nO/giphy.gif)
    <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f310.png" alt="🌐" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Access it here: [Preview URL](https://infobip-kazhoon-iot1-${dnsSafeName}.domain.com)
    <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2139.png" alt="ℹ" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Note that it might take a few minutes for the DNS to propagate and the service to become fully operational.
    <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2757.png" alt="❗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> If you encounter any issues, please contact [#kazhoon_contributors](https://infobip-support.slack.com/archives/C098ETXLL2U) on slack."""</span>)
}</pre>
</details>



<p class="wp-block-paragraph"></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://shiftmag.dev/wp-content/uploads/2026/05/New-Project5-1024x576.png?x94846" alt="The flow for pushing requests through kubernetes " class="wp-image-10144" srcset="https://shiftmag.dev/wp-content/uploads/2026/05/New-Project5-1024x576.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/05/New-Project5-300x169.png 300w, https://shiftmag.dev/wp-content/uploads/2026/05/New-Project5-768x432.png 768w, https://shiftmag.dev/wp-content/uploads/2026/05/New-Project5.png 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Flow of creating new features</figcaption></figure>



<h2 id="ScalingMultiContributorDevelopmentwithKubernetes&amp;EphemeralEnvironments-Cleanup" class="wp-block-heading"><span id="step-3-cleanup">Step 3: Cleanup</span></h2>



<p class="wp-block-paragraph">After the PR is merged, the letfover deployment is automatically cleaned up using a separate webhook and Jenkins pipeline which I won&#8217;t go into detail for this blog post.</p>



<p class="wp-block-paragraph">In short, when a PR is merged or deleted, a&nbsp;<code>Jenkinsfile.cleanup</code>&nbsp; pipeline is executed to remove all previously created resources and trigger a sync in Argo CD.</p>



<p class="wp-block-paragraph">The same&nbsp;<code>Jenkinsfile.cleanup</code>&nbsp;pipeline also runs periodically to remove stale resources from old PRs, helping avoid unnecessary infrastructure and electricity usage.</p>



<h2 id="ScalingMultiContributorDevelopmentwithKubernetes&amp;EphemeralEnvironments-Conclusion" class="wp-block-heading"><span id="conclusion"><strong>Conclusion</strong></span></h2>



<p class="wp-block-paragraph">Kubernetes and Argo CD allowed us to significantly improve the developer experience for everyone contributing to Kazhoon. By adopting a GitOps-driven approach, we eliminated the need to interact with a UI and, with it, the mental overhead of figuring out how and where to test changes. The entire deployment process is now fully abstracted away from contributors.</p>



<p class="wp-block-paragraph">The original &#8220;dev&#8221; branch which was a major source of confusion and friction no longer exists. Developers work exclusively on their feature branches, each with its own isolated, production-like environment.</p>



<p class="wp-block-paragraph">This setup also removed a large portion of our support overhead. Everything is automatic, predictable, and clearly communicated directly through pull request comments, allowing contributors to focus on what actually matters: building features.</p>



<h2 id="ScalingMultiContributorDevelopmentwithKubernetes&amp;EphemeralEnvironments-Resources&amp;Shout-outs" class="wp-block-heading"><span id="resources-shout-outs"><strong>Resources &amp; Shout-outs</strong></span></h2>



<p class="wp-block-paragraph">Special shout-out to Matej Kern and his team for helping me throughout the entire process. From explaining Kubernetes concepts to setting up the infrastructure behind everything described in this post. This project would not have been possible without their support and guidance.</p>



<p class="wp-block-paragraph">A huge shout-out as well to the maintainers and contributors behind these amazing projects and resources that made this workflow possible:</p>



<ul class="wp-block-list">
<li><a href="https://kubernetes.io/">Kubernetes</a></li>



<li><a href="https://argo-cd.readthedocs.io">Argo CD</a></li>



<li><a href="https://backstage.io/">Backstage, where I got the&nbsp;inspiration from</a></li>



<li><a href="https://www.cncf.io/">The cloud-native computing foundation</a></li>
</ul>



<p class="wp-block-paragraph"><em>Hope you enjoyed this blog post. It&#8217;s my first official one (and definitely not the last). There’s a lot I didn’t manage to include, because it would’ve ended up being a whole novel, so if you have any questions or thoughts, I&#8217;m always happy to chat. Feel free to <a href="https://x.com/a_erajc" target="_blank" rel="noreferrer noopener nofollow">message me on X.</a></em></p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://shiftmag.dev/kubernetes-multi-contributor-challenge-infobip-9591/">Solving the Multi-Contributor Challenge with Kubernetes and Ephemeral Environments</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>What It Takes to Fully Benefit from a Deployment Pipeline</title>
		<link>https://shiftmag.dev/what-it-takes-to-fully-benefit-from-a-deployment-pipeline-7463/</link>
		
		<dc:creator><![CDATA[Denis Kranjcec]]></dc:creator>
		<pubDate>Wed, 24 Dec 2025 13:34:53 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Continuous Delivery]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Deployment Pipeline]]></category>
		<category><![CDATA[development]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=7463</guid>

					<description><![CDATA[<p>To get the full power of a Deployment Pipeline, you need more than tools - you need practices that let it shine and reveal both your strengths and your weaknesses.</p>
<p>The post <a href="https://shiftmag.dev/what-it-takes-to-fully-benefit-from-a-deployment-pipeline-7463/">What It Takes to Fully Benefit from a Deployment Pipeline</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="1200" height="630" src="https://shiftmag.dev/wp-content/uploads/2025/12/development-pipeline-1.png?x94846" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2025/12/development-pipeline-1.png 1200w, https://shiftmag.dev/wp-content/uploads/2025/12/development-pipeline-1-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2025/12/development-pipeline-1-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2025/12/development-pipeline-1-768x403.png 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph">The Deployment Pipeline is a critical tool for ensuring software quality &#8211; and <a href="https://shiftmag.dev/the-dilemma-of-quality-versus-speed-is-false-3310/" target="_blank" rel="noreferrer noopener">quality is a prerequisite for speed</a>.</p>



<p class="wp-block-paragraph">So, what is a <strong>Deployment Pipeline</strong>? How has it helped us improve both quality and speed? And what are, in my experience, the common problems in using and implementing deployment pipelines?</p>



<blockquote class="wp-block-quote is-style-plain is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">A Deployment Pipeline is a machine that helps us move from an idea to valuable software in the hands of users by organizing software development work. It enables us to go from commit to releasable outcome as quickly and efficiently as possible, in a repeatable and reliable way.</p>



<p class="wp-block-paragraph">— Dave Farley, <em><a href="https://leanpub.com/cd-pipelines/" target="_blank" rel="noreferrer noopener">Continuous Delivery Pipelines: How to Build Better Software Faster</a></em></p>
</blockquote>



<p class="wp-block-paragraph">Before exploring how Deployment Pipelines have helped us, it is helpful to briefly introduce <strong>Continuous Integration</strong> and <strong>Continuous Delivery</strong>.</p>



<h2 class="wp-block-heading"><span id="continuous-integration">Continuous Integration</span></h2>



<p class="wp-block-paragraph">Continuous Integration is a software development practice that helps us <strong>create and maintain a high-quality codebase</strong> that is easy to change and to implement new features.</p>



<p class="wp-block-paragraph">As Martin Fowler points out, <a href="https://martinfowler.com/articles/continuousIntegration.html" target="_blank" rel="noreferrer noopener">the practices of Continuous Integration</a> are:</p>



<ul class="wp-block-list">
<li>Put everything in a version controlled mainline​</li>



<li>Automate the Build​</li>



<li>Make the Build Self-Testing​</li>



<li>Everyone Pushes Commits To the Mainline Every Day​</li>



<li>Every Push to Mainline Should Trigger a Build​</li>



<li>Fix Broken Builds Immediately​</li>



<li>Keep the Build Fast​</li>



<li>Hide Work-in-Progress​</li>



<li>Test in a Clone of the Production Environment​</li>



<li>Everyone can see what&#8217;s happening​</li>



<li>Automate Deployment​</li>
</ul>



<ol start="1" class="wp-block-list"></ol>



<p class="wp-block-paragraph">Kent Beck developed the practice of Continuous Integration as part of Extreme Programming in the 1990s. The book <em><a href="https://www.informit.com/store/continuous-integration-improving-software-quality-and-9780321336385" target="_blank" rel="noreferrer noopener">Continuous Integration</a></em> by Paul M. Duvall, Steve Matyas, and Andrew Glover was published in 2007. While this is nothing new, <strong>many software engineers and teams still do not practice Continuous Integration</strong> and therefore miss out on the benefits it provides.</p>



<h2 class="wp-block-heading"><span id="continuous-delivery">Continuous Delivery</span></h2>



<p class="wp-block-paragraph">Continuous Delivery can further help create and maintain high-quality software. The excellent book <em><a href="https://www.amazon.com/Continuous-Delivery-Deployment-Automation-Addison-Wesley/dp/0321601912" target="_blank" rel="noreferrer noopener">Continuous Delivery</a> </em>by Jez Humble and David Farley was published in 2010. and it describes the idea behind continuous delivery in detail, and it introduces &#8220;<em>&#8230;the central paradigm of the book &#8211; a pattern we call the <strong>deployment pipeline</strong></em>&#8220;.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Continuous Delivery is the ability to get changes of all types &#8211; including new features, configuration changes, bug fixes and experiments &#8211; into production, or into the hands of users, safely and quickly in a sustainable way.</p>



<p class="wp-block-paragraph">&#8211; <a href="https://continuousdelivery.com/">https://continuousdelivery.com/</a></p>
</blockquote>



<p class="wp-block-paragraph"><strong>Continuous Integration is a prerequisite for Continuous Delivery</strong>.</p>



<p class="wp-block-paragraph">The minimum activities required for Continuous Delivery, as defined by <a href="https://minimumcd.org/" target="_blank" rel="noreferrer noopener">minimumcd.org</a>, are:</p>



<ul class="wp-block-list">
<li>Use Continuous Integration<em>​</em></li>



<li>The application pipeline is the only way to deploy to any environment​</li>



<li>The pipeline decides the releasability of changes, its verdict is definitive​</li>



<li>Artifacts created by the pipeline always meet the organization’s definition of deployable​</li>



<li>Immutable artifact (no human changes after commit)​</li>



<li>All feature work stops when the pipeline is red​</li>



<li>Production-like test environment​</li>



<li>Rollback on-demand​</li>



<li>Application configuration deploys with artifact​</li>
</ul>



<h2 class="wp-block-heading"><span id="deployment-pipeline">Deployment Pipeline</span></h2>



<p class="wp-block-paragraph">The best description of deployment pipelines, and practical advice on how to implement them, I found in another excellent book <a href="https://leanpub.com/cd-pipelines/" target="_blank" rel="noreferrer noopener"><em>Continuous Delivery Pipelines, How to Build Better Software Faster</em> </a>by Dave Farley. According to him, automation is the key… and is the engine that drives an effective Deployment Pipeline:</p>



<ul class="wp-block-list">
<li>Test Automation​​</li>



<li>Build and Deployment Automation​​</li>



<li>Automate Data Migration​​</li>



<li>Automate Monitoring and Reporting​​</li>



<li>Infrastructure Automation​</li>
</ul>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="624" height="412" src="https://shiftmag.dev/wp-content/uploads/2025/12/denis.jpg?x94846" alt="" class="wp-image-7471" srcset="https://shiftmag.dev/wp-content/uploads/2025/12/denis.jpg 624w, https://shiftmag.dev/wp-content/uploads/2025/12/denis-300x198.jpg 300w" sizes="auto, (max-width: 624px) 100vw, 624px" /></figure>



<p class="wp-block-paragraph">The simplest deployment pipeline should, after each commit, compile the code (if needed), run all unit tests, create a deployable artifact, execute acceptance tests, and enable deployment to production.</p>



<p class="wp-block-paragraph">However, a <strong>deployment pipeline can do much more</strong>, such as:</p>



<ul class="wp-block-list">
<li>Static code analysis</li>



<li>Enable manual testing</li>



<li>Performance tests (e.g., latency, throughput, load)</li>



<li>Data and data migration tests</li>



<li>Security tests</li>



<li>Reliability tests etc.</li>
</ul>



<h2 class="wp-block-heading"><span id="ci-practices"><strong>CI practices</strong></span></h2>



<p class="wp-block-paragraph">I see many teams/companies have a Jenkins job that compiles source code, runs (a few) unit tests, creates an artifact &#8211; often a Docker image &#8211; and have a separate deploy job/button to deploy to the dev and production environments. And they will say they are &#8220;using&#8221; CI/CD. But <strong>most of them are skipping some of the CI practices</strong> and don&#8217;t have code in an always-deployable state, even as a goal, yet still think they are &#8220;using&#8221; CI/CD. </p>



<p class="wp-block-paragraph"><strong>CI practices</strong> are not a menu where you can choose what you like and still have all the benefits CI can help you with.</p>



<h2 class="wp-block-heading"><span id="make-the-build-self-testing"><em>Make the build self-testing</em></span></h2>



<p class="wp-block-paragraph"><strong>Test-Driven Development (TDD)</strong>, or test-first development, is still an exception, and developers usually write tests after the code. Those tests are mostly unit tests (developer-oriented) and much fewer acceptance tests (user-oriented) that cover only parts of the functionalities. The test-after approach usually covers less functionality because the code is harder to test, and tests are complex to write and maintain. Such tests don&#8217;t provide fast and good-enough feedback to automate &#8220;releasability of changes&#8221; or &#8220;enable refactoring for sustained productivity.&#8221; Developers don&#8217;t trust such tests, so manual verification and team coordination are needed to decide when code can be deployed, which is never fully reliable, and more bugs reach production.</p>



<h2 class="wp-block-heading"><span id="everyone-pushes-commits-to-the-mainline-every-day"><em>Everyone pushes commits to the mainline every day</em></span></h2>



<p class="wp-block-paragraph">Same as TDD, <strong>trunk-based development</strong> is still an exception, and almost everyone is using branches and pull requests with many PR reviews at the end of the sprint, so they are not practicing continuous integration by definition. They are missing the benefits CI brings, like &#8220;less time wasted in integration&#8221; and &#8220;enables refactoring for sustained productivity.&#8221;</p>



<h2 class="wp-block-heading"><span id="test-in-a-clone-of-the-production-environment%e2%80%8b"><em>Test in a clone of the production environment​</em></span></h2>



<p class="wp-block-paragraph">Some companies have a <strong>&#8220;static&#8221; copy of production</strong>, with test data already prepared in a database, where they deploy their applications and run tests. As a result, developers can’t run tests on their laptops, test preparation is complex and slow, and they regularly break other tests. Feature flags can’t be tested, and it takes a long time from commit to getting test feedback. This demotivates developers from writing tests, and over time, this negative spiral creates &#8216;legacy&#8217; code that is hard to change.</p>



<p class="wp-block-paragraph">Rarely does any company I know create, on demand, a <strong>&#8220;clone of production&#8221;</strong> &#8211; with the configuration needed for a suite of tests set up exactly as in production, where the tested application is deployed the same way as in production and then tested to determine the releasability of changes.</p>



<p class="wp-block-paragraph">Usually, a Jenkins job starts the needed <strong>testcontainers</strong> during the integration test phase and tests parts of the application &#8211; or a &#8220;test&#8221; version of the application &#8211; that differ from the production application. These tests don’t cover the application artifact that will actually be deployed, nor do they test deployment, configuration, or dependencies (e.g., microservices) that aren’t properly mocked. Instead, some fake repository or adapter implementations are used that don’t exist in production.</p>



<h2 class="wp-block-heading"><span id="the-application-pipeline-is-the-only-way-to-deploy-to-any-environment-and-the-pipeline-decides-the-releasability-of-changes-its-verdict-is-definitive%e2%80%8b"><em>The application pipeline is the only way to deploy to any environment</em> AND <em>The pipeline decides the releasability of changes; its verdict is definitive​</em></span></h2>



<p class="wp-block-paragraph">From what I’ve seen or heard, everyone has a workaround that allows deployment of artifacts that didn’t pass the Deployment Pipeline. Sometimes they create artifacts on their laptop and push them to the repository so they can be deployed. Other times, the pipeline itself allows deployment of code that hasn’t passed all required verifications. </p>



<p class="wp-block-paragraph">This can happen when a &#8220;non-important&#8221; or &#8220;flaky&#8221; test fails, or when a dependency has a critical vulnerability, etc. Usually, the team says these problems will be fixed later, when there’s time, but the new feature is considered urgent and must be deployed ASAP. In practice, <strong>the team never has time to fix these issues</strong>, workarounds become the norm, and the deployment pipeline turns into a theater.</p>



<h2 class="wp-block-heading"><span id="keep-the-build-fast"><em>Keep the build fast</em></span></h2>



<p class="wp-block-paragraph">With microservices being so popular, build time shouldn’t be a major problem. Yet it’s common to see builds lasting half an hour or more. </p>



<p class="wp-block-paragraph">In my experience (mostly with Java), if you create tests &#8211; unit tests, acceptance tests, etc. &#8211; that can run in parallel, it’s easy to have a deployment pipeline finish in under 5 minutes, excluding deployment. Just <strong>run everything in parallel</strong>: unit tests, acceptance tests, services with different feature flags enabled or disabled, and static code analysis.</p>



<h2 class="wp-block-heading"><span id="a-deployment-pipeline-must-be-built-not-bought">A Deployment Pipeline must be built, not bought</span></h2>



<p class="wp-block-paragraph">A deployment pipeline automates your software development process and reveals both its strengths and weaknesses. When your practices are strong, the pipeline amplifies them, providing significant benefits. Conversely, if your practices are weak, the pipeline makes this very apparent &#8211; it can be difficult or even impossible to implement effectively. </p>



<p class="wp-block-paragraph">This is why Continuous Integration and Continuous Delivery are so valuable: they <strong>encourage good practices and make problems visible early</strong>. A Deployment Pipeline is not a product you can buy or outsource; you must build it yourself, leveraging various tools.</p>



<p class="wp-block-paragraph">In my experience, the best way to achieve both speed and quality in software development is to <strong>combine pair or mob programming with test-driven, trunk-based development</strong>, supported by a deployment pipeline that automates feedback on key aspects of the process. This approach provides rapid feedback, within minutes, on ideas and experiments through frequent commits and accompanying tests. It allows the codebase to evolve continuously through refactoring and enables the frequent, low-risk release of new features with minimal stress.</p>
<p>The post <a href="https://shiftmag.dev/what-it-takes-to-fully-benefit-from-a-deployment-pipeline-7463/">What It Takes to Fully Benefit from a Deployment Pipeline</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Good runbooks are a MUST &#8211; unless you want to risk a heart attack</title>
		<link>https://shiftmag.dev/how-to-create-good-runbooks-4950/</link>
		
		<dc:creator><![CDATA[Bojan Vukojicic]]></dc:creator>
		<pubDate>Thu, 15 May 2025 15:57:31 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[incident]]></category>
		<category><![CDATA[runbooks]]></category>
		<category><![CDATA[Troubleshooting]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=4950</guid>

					<description><![CDATA[<p>Want to avoid late-night panic, endless Slack searches, and heart-stopping alerts when you're on call? Then you need to create GOOD runbooks.</p>
<p>The post <a href="https://shiftmag.dev/how-to-create-good-runbooks-4950/">Good runbooks are a MUST &#8211; unless you want to risk a heart attack</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="1200" height="630" src="https://shiftmag.dev/wp-content/uploads/2025/03/Alerts-and-runbooks.png?x94846" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2025/03/Alerts-and-runbooks.png 1200w, https://shiftmag.dev/wp-content/uploads/2025/03/Alerts-and-runbooks-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2025/03/Alerts-and-runbooks-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2025/03/Alerts-and-runbooks-768x403.png 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph">It’s a dull, rainy Friday. You finish coffee with your bestie and head home with your <strong>work laptop</strong>. On-call isn’t great, but at least it pays extra.</p>



<p class="wp-block-paragraph">As soon as you get home, the company phone starts ringing. You find it and feel a mild panic &#8211; <strong>it&#8217;s Opsgenie</strong>. You know something is wrong, and time is critical. You grab your laptop, turn it on, find the alert it triggered for, and start troubleshooting.</p>



<p class="wp-block-paragraph">You get an alert for increased errors on the spam service, follow the runbook, and <strong>realize you can&#8217;t fix it</strong>, so you call the team. They handle it, and you still have the rest of the night free.</p>



<p class="wp-block-paragraph">Has this ever happened to you? Well, <strong>it can if you have good runbooks</strong>!</p>



<h2 class="wp-block-heading"><span id="we-made-our-first-runbooks-and-oh-they-were-great">We made our first runbooks, and oh, they were <em>great</em></span></h2>



<p class="wp-block-paragraph">When reacting to alerts, stress is inevitable, causing you to <strong>miss clues to the root cause</strong>. More often than not, you end up going through the documentation of how something works, instead of looking for what broke.</p>



<p class="wp-block-paragraph">So, let me take you back to the time <strong>when we created our first runbook</strong>.</p>



<p class="wp-block-paragraph">When I first started as a Reliability Operations Engineer, this was a newly formed team, so we didn’t have any alerts or runbooks. But, we knew we were blind on many fronts and needed to catch platform issues somehow.</p>



<p class="wp-block-paragraph">This led us to <strong>inherit some alerts from teams like SRE and start creating our own</strong>. We were proud of our alerts, cheering when they caught incidents. Looking back, they were mediocre, but at the time, we didn’t know better.</p>



<p class="wp-block-paragraph">It was smooth when alerts came during our morning shift, as every dev team was online, and we could ping them for clarification on issues.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">This is a very fruitful process we do almost daily – we receive an alert, notice it’s for a specific service, ping dev teams for information and clarification, and then decide how that information affects what we want the alert to catch.</p>
</blockquote>



<p class="wp-block-paragraph">Was the alert useful? Did it notify us of an actual issue, or did it alert us to normal behavior for that service/location? <strong>We can then exclude</strong> errors from specific locations where they’re expected or fine-tune the thresholds for the alert condition.</p>



<h2 class="wp-block-heading"><span id="responding-to-our-first-on-call-alerts-nearly-gave-me-a-heart-attack">Responding to our first on-call alerts nearly gave me a heart attack</span></h2>



<p class="wp-block-paragraph">I still remember it clearly – we had just started on-call rotations, and it was my turn. The previous week was calm, so I expected the same. After work, I did my groceries and chores, keeping my laptop and company phone nearby. Everything was quiet, so I showered, got ready for bed, and slept. Then, <strong>at 1:30 AM, my company phone rang</strong>.</p>



<p class="wp-block-paragraph">Waking up disoriented, I stumble in the dark, avoiding lights to not wake my girlfriend – she really values her beauty sleep. <strong>I grab the phone, see an Opsgenie alert, and mild panic sets in</strong>. I head to the living room, grab my laptop, and start troubleshooting.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">The alert was named &#8216;Whitelabel CUP DOWN,&#8217; and I had never seen or heard of it. Normally, I’d start troubleshooting and look for what went wrong, but here, I had no idea where or what to search for. The pressure was mounting, as reacting to this alert was my responsibility, and I didn’t know what to do.</p>
</blockquote>



<p class="wp-block-paragraph">For the next 45 minutes, I stumbled through outdated Confluence pages and old Slack threads, trying to find anything about Whitelabel CUP. I was lost, <strong>unsure which logs to check or if it was impacting clients</strong>.</p>



<p class="wp-block-paragraph">At that point, I decided I couldn’t just keep searching the documentation; I needed to act. But it was past 2 AM – what if it wasn’t an issue, and I woke someone up for no reason? Who should I even call?</p>



<p class="wp-block-paragraph">To my relief, the alert resolved itself. I was ecstatic it was over, but <strong>what if it happens again</strong>? Where are the logs? What if someone’s already looking into it? What if clients have complained? I had so many questions, so I wrote them down, closed my laptop, and went back to sleep, hoping it wouldn’t trigger again. And it didn’t.</p>



<h2 class="wp-block-heading"><span id="how-can-we-improve-this">How can we improve this?</span></h2>



<p class="wp-block-paragraph">The next morning, <strong>I admitted my struggles in the daily</strong>, feeling hopeless because I didn’t know how to verify if it was an issue or a false positive, where to find logs, or who to call. As a team, we decided to dedicate time to figure out how to handle this better in the future.</p>



<p class="wp-block-paragraph">The root cause was my lack of knowledge about Whitelabel CUP and how issues with it manifest.</p>



<p class="wp-block-paragraph">This can be addressed in two ways: as a team, <strong>we could all invest time to learn about it</strong>, but that would require significant man-hours, which isn&#8217;t the most efficient approach, especially when a new person joins. Alternatively, we could<strong> assign one person to learn the details, create a runbook, and then share it with the team</strong>.</p>



<h2 class="wp-block-heading"><span id="this-is-how-to-create-a-runbook">This is how to create a runbook</span></h2>



<p class="wp-block-paragraph">The task I was working on started as documenting Whitelabel CUP but evolved into creating a runbook with clear handling steps. Where to check for logs and, most importantly, who we should call if we observe problems, so that once we receive the alert, we have a flow to help us troubleshoot it successfully and in a timely manner.</p>



<p class="wp-block-paragraph">A prerequisite for good runbooks is having good alerts. Because if your alert is bad, the runbook you create for it will, at best, be just as bad. So, for the sake of this article, I’ll skip this part &#8211; I&#8217;m assuming you already have good alerts, right? RIGHT?</p>



<p class="wp-block-paragraph">I&#8217;ll share some generic tips that worked well for us, though your needs may vary since every alert is different.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Runbooks should be written <strong>as clearly and unambiguously as possible</strong> &#8211; so even the newest team member can successfully troubleshoot the alert.</p>
</blockquote>



<p class="wp-block-paragraph">The first step in a runbook is <strong>to quickly assess whether it&#8217;s a false positive or a real issue</strong>. This might involve checking synthetic monitoring, seeing if the same issues appear there, looking at a different data source, or simply checking how production traffic is behaving.</p>



<p class="wp-block-paragraph">After <strong>the &#8216;false positive check&#8217;</strong> comes the juicy part of the runbook. You can direct people to check logs or Grafana panels to confirm whether a hypothesis is true or false. The best approach is to ask a question and provide the answer right in the runbook.</p>



<p class="wp-block-paragraph">For example, the most common one: &#8216;Is there packet loss towards this location? Check here: grafana.com/packetloss.&#8217; This way, you’re asking the question and providing an easy way to check, all in the runbook.</p>



<p class="wp-block-paragraph">Next, ask, ‘Is only service X affected? Check here: all-service-logs.com.’ This helps determine if it&#8217;s just one service or multiple. For service-specific alerts, include mitigating actions like, ‘Find the affected instance here: list-of-instances.com. Redeploy the instance with the highest error rate here: instance-manager.com.’</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>The goal is to have the ideal troubleshooting process</strong>, or as close as possible, while making it quicker. By providing exact links, you save time on typing queries and searching for the right Grafana panel.</p>
</blockquote>



<h2 class="wp-block-heading"><span id="good-runbooks-are-an-ongoing-iterative-effort">Good runbooks are an ongoing, iterative effort</span></h2>



<p class="wp-block-paragraph">Effort is appreciated in all things, and runbooks are no exception. Creating a good runbook seems simple at first, but once it&#8217;s used, <strong>you&#8217;ll realize there are gaps, confusing parts, or areas for improvement</strong>.</p>



<p class="wp-block-paragraph">With experience handling that alert, you’ll be able to streamline things, adding steps or excluding ones you initially thought were necessary. Keep in mind, <strong>you’re not writing documentation, but a quick guide </strong>to help you get to the root cause and take action -whether that means mitigating the issue yourself or engaging the responsible team.</p>



<p class="wp-block-paragraph">Good runbooks are an ongoing, iterative effort. We update them when something’s missing or outdated. Done right, they speed up issue detection and mitigation, and help onboard new team members. Just give them a runbook and let them ask questions &#8211; it’s a great way to gather fresh insights.</p>



<p class="wp-block-paragraph"><strong>If you have alerts, try them out</strong> &#8211; they’ve made our lives easier, and they might do the same for you.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://shiftmag.dev/how-to-create-good-runbooks-4950/">Good runbooks are a MUST &#8211; unless you want to risk a heart attack</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>DORA: Only 10% of developers see big productivity boost by AI</title>
		<link>https://shiftmag.dev/dora-ai-is-boosting-personal-productivity-while-team-delivery-takes-a-hit-4520/</link>
		
		<dc:creator><![CDATA[Milena Radivojević]]></dc:creator>
		<pubDate>Fri, 01 Nov 2024 14:49:45 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[DORA metrics]]></category>
		<category><![CDATA[Platform Engineering]]></category>
		<category><![CDATA[productivity]]></category>
		<category><![CDATA[software delivery]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=4520</guid>

					<description><![CDATA[<p>75% of respondents saw productivity boosts from AI, with just over a third reporting their gains as moderate (25%) or extreme (10%).</p>
<p>The post <a href="https://shiftmag.dev/dora-ai-is-boosting-personal-productivity-while-team-delivery-takes-a-hit-4520/">DORA: Only 10% of developers see big productivity boost by AI</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="1200" height="630" src="https://shiftmag.dev/wp-content/uploads/2024/11/devops.png?x94846" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2024/11/devops.png 1200w, https://shiftmag.dev/wp-content/uploads/2024/11/devops-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2024/11/devops-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2024/11/devops-768x403.png 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph">This is one of the insights from <a href="https://cloud.google.com/resources/devops/state-of-devops" target="_blank" rel="noreferrer noopener">DORA&#8217;s new 2024 State of DevOps report</a>!</p>



<p class="wp-block-paragraph">This year focuses on how AI tools are changing the game, the importance of platform engineering, and why understanding developers is essential for improvement.</p>



<p class="wp-block-paragraph">These are some of the takeaways from the research.</p>



<h2 class="wp-block-heading"><span id="empower-developers-to-work-more-independently"><strong>Empower developers to work more independently</strong></span></h2>



<p class="wp-block-paragraph">For the second year in a row, this research highlights that AI tooling is actually lowering software delivery performance. But the explanation may surprise you; it’s not just that AI code is unreliable.</p>



<p class="wp-block-paragraph">The real link between AI tooling and weaker delivery performance is the tendency for AI-driven coding to result in <a href="https://newsletter.getdx.com/p/2024-dora-report?utm_source=post-email-title&amp;publication_id=996688&amp;post_id=150862140&amp;utm_campaign=email-post-title&amp;isFreemail=true&amp;r=rpwsd&amp;triedRedirect=true&amp;utm_medium=email" target="_blank" rel="noreferrer noopener">larger batches of code</a>.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">AI simply makes it easier to churn out more code in less time, leading to more complex deployments.</p>
</blockquote>



<p class="wp-block-paragraph">Also, <strong>software delivery throughput and quality are becoming less aligned</strong>, and overall performance appears to be slipping compared to last year.</p>



<p class="wp-block-paragraph">And to address this issue, organizations should invest in tools and processes that <strong>empower developers to work more independently</strong> &#8211; like better documentation and self-serve platforms.</p>



<p class="wp-block-paragraph">While these developer platforms may slow down delivery at times, they ultimately enhance both individual and team performance.</p>



<h2 class="wp-block-heading"><span id="we-code-faster-but-meetings-are-still-dragging-on-as-usual">We code faster, but meetings are still dragging on as usual</span></h2>



<p class="wp-block-paragraph">And here’s a surprising twist: while AI adoption boosts individual productivity, flow, and job satisfaction, it may also decrease time spent on valuable work. Yup, you read that right!</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">We may be coding faster, but admin work and endless meetings aren&#8217;t going anywhere.</p>
</blockquote>



<p class="wp-block-paragraph">Now, here’s where the real magic happens: <strong>documentation</strong>. It’s the secret weapon for leveling up your development game. </p>



<p class="wp-block-paragraph">DORA’s research shows a solid link between good documentation and better performance. They estimate that a <strong>25% bump in AI adoption could lead to a 7.5% boost in documentation quality</strong> &#8211; making it more reliable and easier to navigate.</p>



<h2 class="wp-block-heading"><span id="key-to-platform-engineering-success-put-developers-first">Key to platform engineering success? Put developers first</span></h2>



<p class="wp-block-paragraph">This year’s report also digs into platform engineering and what it means for developers. </p>



<p class="wp-block-paragraph">A key factor in the success is to approach platform engineering with <strong>user-centeredness</strong> (users in the context of an internal developer platform are<br>developers), <strong>developer independence</strong>, and a <strong>product mindset</strong>.</p>



<p class="wp-block-paragraph">Here are the highlights:</p>



<ol class="wp-block-list">
<li><strong>Internal platforms</strong> can help individuals and teams get more done, but they might also slow things down and introduce some instability. Still, companies using these platforms often deliver software faster and perform better overall.</li>



<li>To make internal platforms work, <strong>you need to understand your developers</strong>. Think about their goals, not just the tasks they need to finish. The more independence they have, the better!</li>



<li><strong>Good leaders make a huge difference</strong>. When they have a clear vision and support their teams, it leads to happier, more productive developers.</li>
</ol>



<p class="wp-block-paragraph">Overall, software delivery seems to be<strong> facing challenges in 2024</strong>, reflecting the tough conditions many companies are dealing with in today’s economic climate. Buckle up!</p>
<p>The post <a href="https://shiftmag.dev/dora-ai-is-boosting-personal-productivity-while-team-delivery-takes-a-hit-4520/">DORA: Only 10% of developers see big productivity boost by AI</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Build your software like a motorcycle</title>
		<link>https://shiftmag.dev/build-your-software-like-a-motorcycle-3868/</link>
		
		<dc:creator><![CDATA[Anastasija Uspenski]]></dc:creator>
		<pubDate>Tue, 06 Aug 2024 13:50:40 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Quality Assurance]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[blueprints]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Jenkins]]></category>
		<category><![CDATA[quality assurance]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=3868</guid>

					<description><![CDATA[<p>Discover how Jose Javier Moya's motorcycle analogy reveals the secrets of building a successful software deployment process through blueprints, automation, and quality assurance.</p>
<p>The post <a href="https://shiftmag.dev/build-your-software-like-a-motorcycle-3868/">Build your software like a motorcycle</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="1200" height="720" src="https://shiftmag.dev/wp-content/uploads/2024/07/Jose-Javier-Moya.png?x94846" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2024/07/Jose-Javier-Moya.png 1200w, https://shiftmag.dev/wp-content/uploads/2024/07/Jose-Javier-Moya-300x180.png 300w, https://shiftmag.dev/wp-content/uploads/2024/07/Jose-Javier-Moya-1024x614.png 1024w, https://shiftmag.dev/wp-content/uploads/2024/07/Jose-Javier-Moya-768x461.png 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph">&#8220;Building a successful software deployment process is akin to manufacturing a high-quality motorcycle,&#8221; explains <a href="https://www.linkedin.com/in/jjavieralonso/">Jose Javier Moya</a>, a DevOps Ambassador at Amadeus IT Group, who spoke at the WeAreDevelopers World Congress.</p>



<p class="wp-block-paragraph">Moya also highlighted how Git repositories act as blueprints, Jenkins automates consistency, and reconciliation agents ensure deployment integrity, drawing parallels between manufacturing and software processes.</p>



<p class="wp-block-paragraph">This analogy not only underscores the complexity of modern software development but also <strong>provides a clear framework</strong> for understanding how these elements work together to ensure successful implementations.</p>



<h2 class="wp-block-heading"><span id="building-the-perfect-motorcycle">Building the perfect motorcycle</span></h2>



<p class="wp-block-paragraph">Moya used a motorcycle analogy to highlight the need for detailed planning in software development. </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Imagine your company as a motorcycle manufacturer. To build a motorcycle, you need more than just a basic idea. You need a detailed blueprint.</p>
</blockquote>



<p class="wp-block-paragraph">Moya explained that this blueprint includes specifics, such as the size of the tank and the type of tires. Similarly, deploying <strong>software requires more than a simple configuration file</strong>. It demands a comprehensive description of how the software should be built and operated.</p>



<h2 class="wp-block-heading"><span id="the-role-of-git">The role of Git</span></h2>



<p class="wp-block-paragraph">Moya compared motorcycle blueprints to Git repositories. </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">In our motorcycle factory, the blueprint acts as a contract between the manufacturer and the buyer.</p>
</blockquote>



<p class="wp-block-paragraph">Similarly, a Git repository serves as the blueprint for software. <strong>It stores all necessary configuration files and documentation</strong>, ensuring that every aspect of the software deployment is well-documented and controlled. Just as a motorcycle blueprint covers every detail, Git repositories provide comprehensive details for software projects.</p>



<h2 class="wp-block-heading"><span id="use-automation-as-your-secret-weapon">Use automation as your secret weapon</span></h2>



<p class="wp-block-paragraph">Then, he highlighted the crucial role of automation in software deployment. </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Imagine if your motorcycle factory were fully automated. Once you receive a blueprint, the factory will automatically build the motorcycle according to the specified details.</p>
</blockquote>



<p class="wp-block-paragraph">Similarly, automation tools play a crucial role in software development. <strong>For instance, Jenkins and other tools act as gatekeepers</strong>. They check to ensure that all requirements are met before deployment. Using automation, developers can build and deploy software consistently and accurately.</p>



<h2 class="wp-block-heading">Quality assurance is automation&#8217;s secret superpower</h2>



<p class="wp-block-paragraph">According to Moya, automation extends beyond just building and involves quality assurance. </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Jenkins performs various checks, including static analysis, security scans, and operational checks.</p>
</blockquote>



<p class="wp-block-paragraph">These checks <strong>ensure the software is free from vulnerabilities</strong>, does not break existing functionality, and meets operational requirements. This rigorous scrutiny helps prevent issues in production, much like how rigorous testing ensures a motorcycle is safe and reliable before it hits the road.</p>



<h2 class="wp-block-heading"><span id="what-is-the-role-of-reconciliation-agents">What is the role of reconciliation agents?</span></h2>



<p class="wp-block-paragraph">Moya described how reconciliation agents like ArgoCD manage the deployment process. </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">After passing all the checks, the actual deployment is handled by reconciliation agents.</p>
</blockquote>



<p class="wp-block-paragraph"><strong>These tools continuously compare the desired state</strong>, as described in the Git repository, with the actual state of the deployment. They correct deviations, ensuring consistency between the intended and actual configurations, much like ensuring every motorcycle built matches the blueprint.</p>



<h2 class="wp-block-heading"><span id="let-automation-and-reconciliation-take-the-lead">Let automation and reconciliation take the lead</span></h2>



<p class="wp-block-paragraph">Jose Javier Moya also discussed expanding these principles to cloud environments. </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">As software and infrastructure grow more complex, the principles of automation and reconciliation extend beyond traditional applications.</p>
</blockquote>



<p class="wp-block-paragraph">In cloud environments, tools like Terraform manage cloud resources using the same configuration principles, adapting these concepts <strong>to manage increasingly complex infrastructure and services</strong>.</p>



<h2 class="wp-block-heading"><span id="welcome-to-the-new-layers-of-complexity">Welcome to the new layers of complexity</span></h2>



<p class="wp-block-paragraph">Reflecting on the evolution of operations, Moya pointed out that managing systems used to be more straightforward with mainframes and a few servers. </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Over time, as systems grew and became more complex, managing them manually became impractical.</p>
</blockquote>



<p class="wp-block-paragraph"><strong>Virtualization and cloud computing introduced new layers of complexity</strong>, which tools like Git, Jenkins, and ArgoCD now help manage effectively.</p>
<p>The post <a href="https://shiftmag.dev/build-your-software-like-a-motorcycle-3868/">Build your software like a motorcycle</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>DORA Metrics: Mastering the DevOps excellence</title>
		<link>https://shiftmag.dev/dora-metrics-mastering-the-devops-excellence-3403/</link>
		
		<dc:creator><![CDATA[Omkar Kadam]]></dc:creator>
		<pubDate>Thu, 23 May 2024 15:44:21 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Developer Productivity]]></category>
		<category><![CDATA[DORA metrics]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=3403</guid>

					<description><![CDATA[<p>How to translate DORA metrics into tangible markers for measuring DevOps adoption and excellence? </p>
<p>The post <a href="https://shiftmag.dev/dora-metrics-mastering-the-devops-excellence-3403/">DORA Metrics: Mastering the DevOps excellence</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="1200" height="630" src="https://shiftmag.dev/wp-content/uploads/2024/05/DevOps.png?x94846" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2024/05/DevOps.png 1200w, https://shiftmag.dev/wp-content/uploads/2024/05/DevOps-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2024/05/DevOps-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2024/05/DevOps-768x403.png 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph">Imagine yourself entering the DevOps world as a daring explorer, navigating uncharted territories, always driven by the pursuit of improvement. But amidst this excitement, how do you gauge your progress? How can you measure your commitment to the core tenets of DevOps? In this article, we’ll try to do just that!</p>



<p class="wp-block-paragraph">In our quest for DevOps mastery, milestones serve as vital signposts along the winding road. They not only mark our progress but also signify triumphs, affirming that we&#8217;re on the right track toward mastering DevOps.</p>



<h2 class="wp-block-heading"><span id="what-do-dora-metric-measure">What do DORA metric measure?</span></h2>



<p class="wp-block-paragraph">One of the <strong>foundational frameworks for DevOps measurement—the DORA Metrics</strong>. This standard lays the groundwork for assessing DevOps performance:</p>



<ol class="wp-block-list">
<li><strong>Deployment Frequency:</strong> Picture a high-performing team seamlessly deploying code multiple times a day, like clockwork. Take Netflix, for instance, where changes are implemented swiftly, ensuring a seamless streaming experience for millions of users worldwide.<br></li>



<li><strong>Lead Time for Changes:</strong> Imagine the thrill of seeing your code transform into a live feature in less than an hour. Companies like Amazon exemplify this efficiency, where new functionalities swiftly make their way from conception to reality, delighting customers with rapid innovations.<br></li>



<li><strong>Mean Time to Recovery (MTTR):</strong> In the event of a glitch, envision a swift restoration of services within minutes, not hours. Google epitomizes this resilience, swiftly addressing any disruptions to its services and ensuring uninterrupted access for users around the globe.<br></li>



<li><strong>Change Failure Rate:</strong> Consider the confidence of deploying changes with minimal risk—a testament to a low change failure rate. At Spotify, meticulous testing and robust deployment strategies minimize the chances of disruptions, providing users with a seamless music streaming experience.<br></li>



<li><strong>Deployment Stability: </strong>Envision a deployment process characterized by a high success rate, ensuring smooth operations without disruptions. Slack embodies this reliability, with updates seamlessly rolled out to users, enhancing collaboration without interruptions.<br></li>



<li><strong>Customer Feedback:</strong> Beyond technical metrics, imagine the satisfaction of users reflected in glowing feedback. Airbnb thrives on such positive endorsements, with users praising the platform&#8217;s stability, performance, and user-friendly interface, a testament to successful DevOps transformation.<br></li>



<li><strong>Team Collaboration:</strong> Visualize the synergy between development and operations teams, seamlessly working together towards shared goals. At Microsoft, collaborative efforts drive innovation, with teams fostering a culture of shared responsibility and continuous improvement.</li>
</ol>



<h2 class="wp-block-heading"><span id="the-realm-of-elite-performers">The realm of elite performers</span></h2>



<p class="wp-block-paragraph">Companies like Google and Netflix stand as beacons of excellence, achieving on-demand deployment frequency,<strong> lead times under an hour, and a change failure rate below 15%.</strong> Their relentless pursuit of perfection sets the standard for major and mature DevOps adopters worldwide.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="663" src="https://shiftmag.dev/wp-content/uploads/2024/05/dora_metrics-1024x663.png?x94846" alt="" class="wp-image-3404" srcset="https://shiftmag.dev/wp-content/uploads/2024/05/dora_metrics-1024x663.png 1024w, https://shiftmag.dev/wp-content/uploads/2024/05/dora_metrics-300x194.png 300w, https://shiftmag.dev/wp-content/uploads/2024/05/dora_metrics-768x497.png 768w, https://shiftmag.dev/wp-content/uploads/2024/05/dora_metrics.png 1600w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading"><span id="what-gets-measured-gets-tracked">What gets measured gets tracked</span></h2>



<p class="wp-block-paragraph">Now that we know about DORA metrics, how do we translate these into tangible markers for measuring DevOps adoption and excellence? </p>



<p class="wp-block-paragraph">The key lies in meticulous analysis and strategic action:</p>



<ol class="wp-block-list">
<li><strong>Set Baselines and Track Trends:</strong> Establish baseline metrics and monitor trends over time to chart your progress accurately.<br></li>



<li><strong>Identify Bottlenecks: </strong>Dive deep into stagnant metrics to uncover bottlenecks hindering your journey toward DevOps excellence.<br></li>



<li><strong>Drill Down for Root Causes:</strong> Explore the underlying causes of bottlenecks, whether technical limitations or process inefficiencies, to devise targeted solutions.<br></li>



<li><strong>Implement Actionable Changes:</strong> Translate insights into action by implementing automation, refining processes, or fostering a culture of continuous improvement.<br></li>



<li><strong>Monitor and Re-evaluate:</strong> Continuously monitor the impact of your interventions, adapting your strategies based on real-time data to drive sustained performance improvements.</li>
</ol>



<p class="wp-block-paragraph">The path to DevOps mastery is an exhilarating journey filled with challenges and triumphs. As <strong>Peter Drucker</strong> once said, &#8220;What gets measured, gets managed.&#8221; </p>



<p class="wp-block-paragraph">By embracing frameworks like DORA Metrics and adopting a systematic approach to analysis and improvement, organizations can optimize workflows, enhance customer satisfaction, and propel their DevOps journey toward unparalleled success. </p>
<p>The post <a href="https://shiftmag.dev/dora-metrics-mastering-the-devops-excellence-3403/">DORA Metrics: Mastering the DevOps excellence</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Is DevOps just a conspiracy theory?</title>
		<link>https://shiftmag.dev/what-is-devops-3236/</link>
		
		<dc:creator><![CDATA[Tena Šojer Keser]]></dc:creator>
		<pubDate>Tue, 30 Apr 2024 11:48:31 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[Baruch Sadogursky]]></category>
		<category><![CDATA[Shift Conference]]></category>
		<category><![CDATA[Shift Miami 2024]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=3236</guid>

					<description><![CDATA[<p>What is DevOps, anyway? It's been around for 15 years, and has grown into an industry - generating countless tools and quite a revenue. And yet, many people can't answer the question with certainty. </p>
<p>The post <a href="https://shiftmag.dev/what-is-devops-3236/">Is DevOps just a conspiracy theory?</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="1200" height="630" src="https://shiftmag.dev/wp-content/uploads/2023/11/Baruch-Sadogursky.png?x94846" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2023/11/Baruch-Sadogursky.png 1200w, https://shiftmag.dev/wp-content/uploads/2023/11/Baruch-Sadogursky-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2023/11/Baruch-Sadogursky-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2023/11/Baruch-Sadogursky-768x403.png 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph">There is something to unpack here, says <strong>Baruch Sadogursky</strong> as he takes the stage at the <a href="https://shift.infobip.com/us/">Miami Shift Conference</a>. A conspiracy theory, even. </p>



<p class="wp-block-paragraph">And here it is:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">&#8220;DevOps is a conspiracy by Ops people to make developers work harder.&#8221;</p>
</blockquote>



<p class="wp-block-paragraph">Jokes aside, <a href="https://www.linkedin.com/in/jbaruch/">Baruch</a> urges us to look into who teaches us about DevOps. A quick Google search along the lines of &#8220;What is DevOps&#8221; reveals that the answer to this question can be found on the websites of AWS (an Ops platform), Atlassian (a DevOps company), Gitlab (Offering DevOps in the box), Synopsis ( Observability platform). Is it a coincidence that all sources that teach us about DevOps are (dev)ops or DevOps-adjacent companies? &nbsp;</p>



<p class="wp-block-paragraph">Why do they want to sell DevOps ideas to us so badly?<strong> Is it about the revenue</strong> that the industry generates? A DevOps salary is almost double that of a system administrator (with not that great of a difference in the job description); there are almost 20k open positions for DevOps engineers in us alone, and let&#8217;s not forget about the certification business behind it.&nbsp;</p>



<p class="wp-block-paragraph">One could easily make the connection between money and the push for DevOps – but only if we forget to go back in time to when DeOps first started. When it was first conceived and gained momentum, t<strong>he money was just not there</strong>, Baruch notes.&nbsp;</p>



<h2 class="wp-block-heading"><span id="this-looks-familiar">This looks familiar</span></h2>



<div class="wp-block-cover"><span aria-hidden="true" class="wp-block-cover__background has-background-dim"></span><img loading="lazy" decoding="async" width="1024" height="580" class="wp-block-cover__image-background wp-image-3240" alt="" src="https://shiftmag.dev/wp-content/uploads/2024/04/Devops-toolchain.svg_.png?x94846" data-object-fit="cover" srcset="https://shiftmag.dev/wp-content/uploads/2024/04/Devops-toolchain.svg_.png 1024w, https://shiftmag.dev/wp-content/uploads/2024/04/Devops-toolchain.svg_-300x170.png 300w, https://shiftmag.dev/wp-content/uploads/2024/04/Devops-toolchain.svg_-768x435.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><div class="wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow">
<p class="wp-block-paragraph"></p>
</div></div>



<p class="wp-block-paragraph">If we look at the DevOps cycle, it seems pretty familiar – it is basically an <strong>agile development cycle, with an Ops cycle plastered on there</strong>, and suddenly it&#8217;s supposed to all be dev work! Even when we look at the main aspects of DevOps work, we hear Ops concepts: deploying code, going from code commit to running code in production, unplanned outages, and degraded services.</p>



<p class="wp-block-paragraph">Baruch protests that none of them feature in the basic postulates of dev work: <strong>Developers do new features, refactor, and&nbsp;fix bugs</strong>; that&#8217;s the job. The code passes the tests; it works, and the job is done. What happens in production is beyond the scope of work, so there is no room for these ops concepts there, right?</p>



<p class="wp-block-paragraph">Well, it&#8217;s not that simple. If we take a look at a software craftsman definition of done Baruch provided, the list is much longer: </p>



<p class="wp-block-paragraph">The project is done once the dev understands what needs to be done; the code is simple, readable, and easy to deploy; non-functional requirements are met; no tech debt was created; tests pass &amp; QA is happy with the code; team lead, PO and client are all satisfied. That&#8217;s a much longer list, and what stands out is&nbsp;<em>quality.</em></p>



<p class="wp-block-paragraph">Baruch leads with another difficult question&nbsp;here: <strong>What is quality</strong>,&nbsp;that&nbsp;we&#8217;re so concerned about?</p>



<h2 class="wp-block-heading"><span id="testing-in-production-caring-about-what-happens-in-production">Testing in production = caring about what happens in production</span></h2>



<p class="wp-block-paragraph"><strong>Quality is an ever-evolving concept.</strong> It&#8217;s certainly not what it was ten years ago, as Baruch illustrates with an example of his old bank website, which allowed you to check your balances and transactions but nothing more complex. It was nice to have but not critical, so when the website was out for 12 hours for update &amp; maintenance to ensure quality of service, that was not a big deal.</p>



<p class="wp-block-paragraph">That era is gone – we expect more of our software now. In terms of banking, we do it via mobile app and expect everything to work at all reasonable times, and to work quickly and efficiently. Code quality alone is not enough to cater to that.</p>



<p class="wp-block-paragraph">Let&#8217;s just look at the<strong> size of the global datasphere – 175ZB.</strong> There is more and more data in more and more companies, which makes testing harder. Since we have so much data in production that we cannot, or at least it&#8217;s not worth replicating in staging. So, we test in production:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">And if we&#8217;re testing in production, and being in production is what is needed to ensure the software quality that&#8217;s so important to us as developers, that means we now care what happens in production. </p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">And if we care about what happens in production, that means we have to be there when we throw untested software on unsuspecting customers in production and observe the blast radius from our bunker. We have to be there in the middle of the night with the ops people because this is actually the first time we get to test our software.</p>
</blockquote>



<h2 class="wp-block-heading"><span id="the-new-scope-of-work">The new scope of work</span></h2>



<p class="wp-block-paragraph">This new turn of events means that there are some more items on the developers&#8217; to-do list:</p>



<ul class="wp-block-list">
<li>We understand how our software is going to be deployed</li>



<li>The build is reliable, repeatable &amp; fast</li>



<li>The code is stateless &amp; scalable</li>



<li>It starts fast and dies fast</li>



<li>It is observable</li>



<li>It supports feature flags</li>



<li>It&#8217;s backward &amp; forward-compatible</li>



<li>The code emits event streams</li>
</ul>



<p class="wp-block-paragraph">This is what you need to ensure the quality of your software in production, says Baruch, so starting now, you care about this stuff:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">10 years in, developers are still not excited about DevOps. But still, we have to be there – because we care about what we&#8217;re doing. So how do we go from <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f641.png" alt="🙁" class="wp-smiley" style="height: 1em; max-height: 1em;" /> to :). </p>
</blockquote>



<p class="wp-block-paragraph">So, is DevOps a plot by Ops people? For sure, Baruch says, but it&#8217;s also <strong>an evolution</strong> and<strong> a means to an end</strong>. The end being <strong>quality, new features, lean software and security</strong>. DevOps just delivers what every business needs.</p>



<h2 class="wp-block-heading"><span id="devops-engineers-are-rainbow-farting-unicorns">DevOps engineers are rainbow-farting unicorns</span></h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://shiftmag.dev/wp-content/uploads/2024/04/IMG_20240423_151102-1024x768.jpg?x94846" alt="" class="wp-image-3242" srcset="https://shiftmag.dev/wp-content/uploads/2024/04/IMG_20240423_151102-1024x768.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2024/04/IMG_20240423_151102-300x225.jpg 300w, https://shiftmag.dev/wp-content/uploads/2024/04/IMG_20240423_151102-768x576.jpg 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">So now that you&#8217;re thrown into DevOps, you better get to know it. If we look at the traditional DevOps Venn diagram, we can see that DevOps is an intersection between Devs, QA, and Ops. So, are you supposed to master all those disciplines? If that thought terrifies you, Baruch has some good news: </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">That person does not exist. It is a rainbow-farting unicorn, completely made up. DevOps is not about one person; it&#8217;s about collaboration.&nbsp;</p>
</blockquote>



<p class="wp-block-paragraph">Instead, he suggests there are <strong><em>T-shaped people</em></strong>: People who know their job (coding) well but also&nbsp;understand&nbsp;what the Ops and QA part of the house means. This doesn&#8217;t mean developers have to become QA and Ops; they&nbsp;just take an interest in what they do.&nbsp;</p>



<p class="wp-block-paragraph">That&#8217;s not so bad, is it? Or, in Baruch&#8217;s own words:&nbsp;</p>



<p class="wp-block-paragraph">&#8220;DevOps is fine.&#8221;</p>
<p>The post <a href="https://shiftmag.dev/what-is-devops-3236/">Is DevOps just a conspiracy theory?</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>On implementing DevOps, too many tools, DevSecOps, and more with Nana Janashia</title>
		<link>https://shiftmag.dev/nana-janashia-devops-trends-2739/</link>
		
		<dc:creator><![CDATA[Milena Radivojević]]></dc:creator>
		<pubDate>Sun, 03 Mar 2024 19:11:47 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[Nana Janashia]]></category>
		<category><![CDATA[Tech World with Nana]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=2739</guid>

					<description><![CDATA[<p>A DevOps educator with more than one million subscribers on her YouTube channel TechWorld with Nana shares her perspective on the primary challenges in the world of DevOps.</p>
<p>The post <a href="https://shiftmag.dev/nana-janashia-devops-trends-2739/">On implementing DevOps, too many tools, DevSecOps, and more with Nana Janashia</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="1200" height="630" src="https://shiftmag.dev/wp-content/uploads/2024/02/Nana-Janashia.png?x94846" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2024/02/Nana-Janashia.png 1200w, https://shiftmag.dev/wp-content/uploads/2024/02/Nana-Janashia-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2024/02/Nana-Janashia-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2024/02/Nana-Janashia-768x403.png 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph">To excel in DevOps, the first step is to think like an architect – and yes, you heard it right! </p>



<p class="wp-block-paragraph">This is the foundational rule that <a href="https://www.linkedin.com/in/nana-janashia/" target="_blank" rel="noreferrer noopener">Nana Janashia</a>, renowned DevOps Trainer and <a href="https://www.youtube.com/@TechWorldwithNana/videos" target="_blank" rel="noreferrer noopener">YouTuber</a> instills in her students.</p>



<p class="wp-block-paragraph">With her free courses and comprehensive bootcamps offered on YouTube and her proprietary training channel, Nana has facilitated <strong>the transition of hundreds of thousands of people into DevOps roles</strong>. </p>



<p class="wp-block-paragraph">Additionally, her &#8216;IT Beginners&#8217; course (for those without IT backgrounds) has attracted thousands of students as well, demonstrating her dedication to accessible tech education for people with different levels of IT expertise. Currently, about 5,000 students from all continents are enrolled in either of her premium courses.</p>



<p class="wp-block-paragraph">Let&#8217;s delve into her approach and insights.</p>



<h2 class="wp-block-heading"><span id="thinking-like-an-architect">Thinking like an architect</span></h2>



<p class="wp-block-paragraph"><strong>First, the burning question: how do you define DevOps?</strong></p>



<p class="wp-block-paragraph"><strong>Nana:</strong> My own preferred definition of DevOps is this: It’s a combination of all processes and tools that&nbsp;<strong>remove any bottlenecks and slow-down points in the complete software release pipeline</strong>. And if we reverse engineer from that definition, we see the way to remove bottlenecks and things that slow down the process is to automate things, and that’s why at the core of DevOps are automation tools, everything as code concepts, etc.</p>



<p class="wp-block-paragraph">As a DevOps engineer, you need to think like an architect first, examine the existing systems, and identify any inefficiencies, manual steps, long-running steps, blockages, bottlenecks, and any points of human mistakes or issues slipping into production. Then, redesign the systems to improve those inefficiencies, solve the blockages with automation steps, etc. </p>



<p class="wp-block-paragraph">Of course, this is a rather challenging task, especially when dealing with complex systems involving multiple engineering teams.&nbsp;</p>



<p class="wp-block-paragraph"><strong>What is the biggest challenge when</strong><strong> implementing DevOps within organizations?</strong></p>



<p class="wp-block-paragraph"><strong>Nana:</strong>&nbsp;The biggest challenge is that&nbsp;<strong>DevOps impacts the entire set of systems and the whole software development pipeline, which </strong><strong>affects</strong><strong> </strong><strong>different engineering teams and roles</strong>.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">And that can create&nbsp;<strong>a lot of resistance from other engineering teams</strong>, when they don’t fully understand the DevOps principles themselves and often see the implementation of DevOps tools as an interference in their already existing tasks and responsibilities.</p>
</blockquote>



<p class="wp-block-paragraph">The higher impact is on the Operations and System Administration side because the tools and processes DevOps uses to efficiently manage infrastructure, cloud platforms, platforms, etc., are more aligned with software development practices and less familiar with how Operations teams work.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="613" src="https://shiftmag.dev/wp-content/uploads/2024/02/Nana-1-1024x613.png?x94846" alt="" class="wp-image-2772" srcset="https://shiftmag.dev/wp-content/uploads/2024/02/Nana-1-1024x613.png 1024w, https://shiftmag.dev/wp-content/uploads/2024/02/Nana-1-300x179.png 300w, https://shiftmag.dev/wp-content/uploads/2024/02/Nana-1-768x459.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">That’s why <strong>the best way to implement DevOps is by introducing the changes step by step</strong>, smaller improvements, instead of redesigning larger parts of the systems. In parallel, educating other engineering teams about DevOps to promote collaboration.&nbsp;&nbsp;&nbsp;</p>



<p class="wp-block-paragraph"><strong>How a collaboration between development and operations teams should be promoted?</strong></p>



<p class="wp-block-paragraph"><strong>Nana:</strong> Firstly, it&#8217;s essential to ensure everyone is on the same page regarding what DevOps achieves and its implications for each engineering team. This helps to reduce resistance and misinterpretation. However, in practice, things may differ from theory.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">When implementing DevOps, it’s important to understand that even though DevOps engineers are also hands-on engineers implementing processes they designed and architected themselves, <strong>they often need collaboration from other engineers </strong>to build fully automated processes across all systems. </p>
</blockquote>



<p class="wp-block-paragraph">To achieve that, especially in an organization that isn’t fully open to these changes, DevOps engineers should <strong>start with improvements that make the existing tasks of the other engineers easier, faster, and more efficient</strong>. </p>



<h2 class="wp-block-heading"><span id="devsecops-a-multi-layered-approach">DevSecOps: a multi-layered approach</span></h2>



<p class="wp-block-paragraph"><strong>How do you handle monitoring and metrics in your DevOps practices? </strong></p>



<p class="wp-block-paragraph"><strong>Nana:</strong> As systems grew more complex, <strong>automated monitoring became essential</strong> to understand and manage them effectively. Since monitoring should involve multiple levels of the systems, the monitoring tools used for each may be different. Cloud platforms usually have their own services to monitor the cloud infrastructure and services, as well as access to the platform. In the Kubernetes world, tools like Prometheus play a big role in monitoring clusters and workloads inside.</p>



<p class="wp-block-paragraph">With monitoring, it’s important not only to have insights but a<strong>lso to have automated alerting in place</strong> whenever anything deviates from a norm within the systems to proactively address any issues. </p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Ultimate Docker Compose Tutorial" width="500" height="281" src="https://www.youtube.com/embed/SXwC9fSwct8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p class="wp-block-paragraph"><strong>How do you integrate security practices into your DevOps processes, especially in terms of code reviews and automated testing?</strong></p>



<p class="wp-block-paragraph"><strong>Nana</strong>: DevSecOps principles involve dozens of tools to integrate automated security checks in the DevOps processes. </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Like monitoring, security is also applied on multiple layers. And since security is layered,&nbsp;<strong>it’s important to test all parts of the systems</strong>&nbsp;to identify any vulnerabilities. Therefore, the DevSecOps involves tools for testing security issues in the application code, in the third-party dependencies, in the image layers, dynamic security tests to tamper with the application to exploit it like hackers would etc.</p>
</blockquote>



<p class="wp-block-paragraph">Beyond those automated security scans we add in the DevSecOps release pipeline, <strong>we also have security on all other levels. </strong>Every tool and platform we introduce in the systems opens up a new field of security threats that can be exposed if they aren’t secured. That means security on the cloud platform, infrastructure level, security in Kubernetes, compliance as code, automated policy enforcement, etc. </p>



<p class="wp-block-paragraph">And last but not least, probably the most important of all, the access management for all the systems used, from cloud platforms to CI/CD platforms, etc.</p>



<h2 class="wp-block-heading"><span id="devops-tools-ai-driven-features-and-fewer-tools">DevOps tools: AI-driven features and fewer tools</span></h2>



<p class="wp-block-paragraph"><strong>How do you design and implement disaster recovery and high-availability solutions in your DevOps workflows?</strong></p>



<p class="wp-block-paragraph"><strong>Nana</strong>: Many factors are involved in creating efficient DR and HA solutions in DevOps. Some key components I would highlight are:</p>



<ol class="wp-block-list">
<li><strong>Using Infrastructure as Code principles</strong> <strong>to define your infrastructure, networking, and configuration in code</strong>. Using tools like Terraform, AWS CloudFormation, or Kubernetes YAML files to enable you to recreate your infrastructure on-demand.</li>



<li><strong>Deploying applications and services across multiple geographic regions or Availability Zones</strong> <strong>(AZs) to ensure HA</strong>. Many Cloud providers offer multi-region deployments for redundancy.</li>



<li><strong>Regularly backing up data and systems to meet RPO requirements</strong>. Using automated backup and snapshotting tools from cloud providers themselves or third-party backup solutions. Automated is again a key here.&nbsp;</li>
</ol>



<p class="wp-block-paragraph"><strong>In your opinion, what are the emerging trends in DevOps in 2024? Are there any particular tools or technologies you find especially promising or exciting?</strong></p>



<p class="wp-block-paragraph"><strong>Nana</strong>: My focus is rarely the tools and technologies but rather the underlying concepts that are either changing or being standardized. So I believe we will see&nbsp;<strong>many existing DevOps tools introducing AI-driven features</strong>&nbsp;or completely new AI tools for DevOps use cases specifically, which will add to the already vast eco-system of DevOps and Cloud tools. I believe these trends will continue into 2025 as well.</p>



<p class="wp-block-paragraph">However, at some point, we will see the trend to <strong>standardize some of the technologies and concepts</strong>. So eventually, instead of a myriad of tools, we would have fewer tools that become established as the industry standard. But we still have a long way to go till then.</p>
<p>The post <a href="https://shiftmag.dev/nana-janashia-devops-trends-2739/">On implementing DevOps, too many tools, DevSecOps, and more with Nana Janashia</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Michael Coté, VMware: Developer platforms have been a thing for at least 10 years</title>
		<link>https://shiftmag.dev/developer-platform-michael-cote-1410/</link>
		
		<dc:creator><![CDATA[Antonija Bilic Arar]]></dc:creator>
		<pubDate>Wed, 13 Sep 2023 07:30:00 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[developer platform]]></category>
		<category><![CDATA[Michael Coté]]></category>
		<category><![CDATA[Platform Engineering]]></category>
		<category><![CDATA[Shift Conference]]></category>
		<category><![CDATA[VMware]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=1410</guid>

					<description><![CDATA[<p>Michael also shares his opinion on DevOps vs. SRE vs. Platform Engineering debate, and the key ingredient for successful developer platform.</p>
<p>The post <a href="https://shiftmag.dev/developer-platform-michael-cote-1410/">Michael Coté, VMware: Developer platforms have been a thing for at least 10 years</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="1200" height="630" src="https://shiftmag.dev/wp-content/uploads/2023/09/Michael-Cote.png?x94846" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2023/09/Michael-Cote.png 1200w, https://shiftmag.dev/wp-content/uploads/2023/09/Michael-Cote-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2023/09/Michael-Cote-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2023/09/Michael-Cote-768x403.png 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph"><strong>You&#8217;re in a DevOps, wait, I mean SRE&#8230; nope, scratch that&#8230; &#8220;Platform Engineering&#8221; team</strong>. People are coming at you to get Kubernetes up and running and then build some kind of platform on top of Kubernetes. Kubernetes may be new, but building and running developer platforms has been going on for at least 10 years.</p>



<p class="wp-block-paragraph">That&#8217;s how <strong>Michael Coté</strong>, a senior member of technical staff at VMware, introduces the talk he will deliver at the Main stage of the <a href="https://shiftmag.dev/infobip-shift-2023-1354/" target="_blank" rel="noreferrer noopener">Shift conference</a> titled <em><strong>Lessons Learned from 7 Years of Running Developer Platforms</strong></em>.</p>



<h2 class="wp-block-heading"><span id="are-devops-sre-and-platform-engineering-the-same-thing">Are DevOps, SRE, and Platform Engineering the same thing? </span></h2>



<p class="wp-block-paragraph">Of course, the first question we had to ask him was a follow-up to his first sentence. Is DevOps dead or alive and kicking, and are DevOps, SRE, and Platform Engineering actually all the same thing? Michael admits even he is not sure:</p>



<p class="wp-block-paragraph">&#8220;I go back and forth on this a lot. The sum total is helpful &#8211; they&#8217;re all espousing helpful practices and changes that organizations can follow and make to get better at how they do software.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">It’s fair to say that the first wave of platform engineer thought leadership was harsh on DevOps, but I think that <strong>the early “DevOps is Dead” take has dissipated.</strong></p>
</blockquote>



<p class="wp-block-paragraph">The platform engineering community is doing a great job promoting the idea of <strong>product managing platforms</strong>, the notion of a platform itself.&#8221;</p>



<h2 class="wp-block-heading"><span id="paas-is-for-platform-as-a-service">PaaS is for platform-as-a-service</span></h2>



<p class="wp-block-paragraph">However, Michael adds that it isn&#8217;t exactly sorted out yet what platform engineering means. He admits being unsure if he&#8217;s even <strong>part of the core platform engineering community,</strong> so he has given up on defining terms strictly.</p>



<p class="wp-block-paragraph">When pressed for the definition of developer platform, Coté says he defines it as &#8220;everything above IaaS, <strong>what we used to call PaaS.</strong>&#8220;</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">&#8220;For whatever reason, people don’t like to use PaaS anymore, but it pretty much perfectly defines what a “platform” is. I mean, it’s right there in the name of <strong>Platform as a Service</strong>.</p>
</blockquote>



<p class="wp-block-paragraph">You could also throw in developer tooling like CI/CD pipelines and the collaborative sites/consoles/dashboards developers use. Internal<strong> developer portals</strong> are another category figuring itself out). If those tools are tightly integrated with the platform to <strong>make building, deploying, and running the applications better</strong>, it&#8217;s probably worth including them in the definition of &#8220;platform.&#8221;</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="538" src="https://shiftmag.dev/wp-content/uploads/2023/09/developer-platform-1024x538.png?x94846" alt="" class="wp-image-1412" srcset="https://shiftmag.dev/wp-content/uploads/2023/09/developer-platform-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2023/09/developer-platform-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2023/09/developer-platform-768x403.png 768w, https://shiftmag.dev/wp-content/uploads/2023/09/developer-platform.png 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading"><span id="how-platforms-work-at-companies-with-thousands-of-developers">How platforms work at companies with thousands of developers</span></h2>



<p class="wp-block-paragraph">Platform engineering and developer platforms have been in the spotlight for the last couple of years, but according to Coté, they have<strong> been a thing for at least 10 years</strong>. They&#8217;ve come to the spotlight now because most organizations have finished their first round of putting Kubernetes in place.</p>



<p class="wp-block-paragraph">&#8220;It took several years to figure that out and start seeing more use in the mainstream. Once you get Kubernetes up and running, you need to <strong>start building a platform on top of it</strong>: you have to add all that other stuff developers use.&#8221;</p>



<p class="wp-block-paragraph">What Michael is particularly interested in is how <strong>big companies with thousands of developers</strong> and usually operating in pretty regulated industries have been <strong>running developer platforms in the last five, seven, or even ten years:</strong></p>



<p class="wp-block-paragraph">&#8220;<strong>Companies like Mercedes-Benz, JP Morgan Chase, several militaries</strong>, and others have been <strong>running platforms like those for 5, seven, ten-plus years.</strong></p>



<p class="wp-block-paragraph">What I like to do in my talks is catalog the practices they&#8217;ve learned over those years and what works and doesn&#8217;t. </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">I’m especially interested in what very large, usually 30 to 50 or more years old organizations are doing with their platforms: how they make it work for thousands of developers.</p>
</blockquote>



<p class="wp-block-paragraph">As a community, we tend to dismiss the wisdom of teams like this because they&#8217;re not using the next great technology. But, the ways to run a platform are pretty much constant over time, especially in larger organizations.&#8221;</p>



<h2 class="wp-block-heading"><span id="the-developer-platform-is-a-product-developers-are-your-customers">The developer platform is a product; developers are your customers</span></h2>



<p class="wp-block-paragraph">One of the most important lessons he learned from working with such companies and their developer platforms for years is to <strong>treat the developer platform as a product</strong>. And develop it as any company would develop a product by gathering user requirements, developing what they want, getting feedback, and iterating on it.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">If you want to have a good platform you have to immediately start product managing it and think of application developers as your customers.</p>
</blockquote>



<p class="wp-block-paragraph">Whatever team is building the platform should be <strong>talking with application developers all the time</strong> (weekly or so) and getting feedback on what works well for them, what doesn&#8217;t work, and if recent changes to the platform have improved things.</p>



<p class="wp-block-paragraph">You&#8217;d think this is what operations people who run this kind of thing do, but they&#8217;re usually more focused on the state and status of the system &#8211; if it&#8217;s running, if it&#8217;s secure, etc., rather than the platform&#8217;s usefulness to developers.</p>
<p>The post <a href="https://shiftmag.dev/developer-platform-michael-cote-1410/">Michael Coté, VMware: Developer platforms have been a thing for at least 10 years</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Viktor Farcic: There is no such thing as a DevOps engineer</title>
		<link>https://shiftmag.dev/devops-viktor-farcic-945/</link>
		
		<dc:creator><![CDATA[Antonija Bilic Arar]]></dc:creator>
		<pubDate>Thu, 13 Jul 2023 09:26:33 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[DevOps Toolkit]]></category>
		<category><![CDATA[Platform Engineering]]></category>
		<category><![CDATA[Viktor Farcic]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=945</guid>

					<description><![CDATA[<p>We discuss automation and laziness, internal developer platforms and the disappearance of Kubernetes.</p>
<p>The post <a href="https://shiftmag.dev/devops-viktor-farcic-945/">Viktor Farcic: There is no such thing as a DevOps engineer</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="1200" height="630" src="https://shiftmag.dev/wp-content/uploads/2023/07/Viktor-Farcic-1.jpg?x94846" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2023/07/Viktor-Farcic-1.jpg 1200w, https://shiftmag.dev/wp-content/uploads/2023/07/Viktor-Farcic-1-300x158.jpg 300w, https://shiftmag.dev/wp-content/uploads/2023/07/Viktor-Farcic-1-1024x538.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2023/07/Viktor-Farcic-1-768x403.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph">Viktor Farcic works at Upbound, the company behind Crossplane, as a &#8211; in his words &#8211;  &#8220;developer advocate, product manager, maybe. Something like that&#8221;.  He is also a member of the Google Developer Experts, CDF Ambassadors, and Docker Captains groups, a published author and a host of the <a href="https://www.youtube.com/@DevOpsToolkit" target="_blank" rel="noreferrer noopener">YouTube channel DevOps Toolkit</a> and a <a href="https://www.devopsparadox.com/" target="_blank" rel="noreferrer noopener">co-host of the DevOps Paradox</a> podcast.</p>



<p class="wp-block-paragraph">In his videos, Viktor often explains the concepts behind DevOps, compares different tools, or shares his knowledge.&nbsp;We&#8217;re not sure if he would approve of the term <strong>DevOps influencer,</strong> but he is an influential voice in the community and, hence, the best person to share his opinions on some burning questions from the industry.&nbsp;</p>



<h2 class="wp-block-heading"><span id="devops-is-about-self-sufficiency">DevOps is about self-sufficiency</span></h2>



<p class="wp-block-paragraph"><strong>How would you define DevOps, anyway?</strong></p>



<p class="wp-block-paragraph"><strong>Farcic:</strong> Many people, companies, and teams misunderstand what DevOps is. Hence, we got roles like DevOps engineer, essentially the same as people did before.</p>



<p class="wp-block-paragraph">I do not believe there is such a thing as a DevOps engineer. &nbsp;If the whole point of DevOps is to enable communication and collaboration between people who work in Development and those who work in Operations, then what does a DevOps engineer do? That&#8217;s just a different title for the same job.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">I believe that DevOps is all about self-sufficiency. It is about enabling teams to do everything they need related to their project.&nbsp;</p>
</blockquote>



<p class="wp-block-paragraph">Suppose they work on a frontend application or backend application or anything else. In that case, they should be in complete control of the lifecycle of their application from the beginning, from the idea until it is running in production.&nbsp;</p>



<p class="wp-block-paragraph"><strong>That is much more efficient than throwing things over the wall:</strong> OK, I&#8217;m finished coding, let me send it to a different department that will do testing, and then they will send it to another department that will deploy it somewhere, and then they will send it to a different team that will do something else and so on and so forth. That is very inefficient. </p>



<p class="wp-block-paragraph">DevOps is all about <strong>joining development and operational skills into a single team that can do everything.</strong></p>



<h2 class="wp-block-heading"><span id="internal-developer-platform-means-enablement">Internal developer platform means enablement</span></h2>



<p class="wp-block-paragraph"><strong>What about all the buzz about internal developer platforms replacing DevOps?&nbsp;</strong></p>



<p class="wp-block-paragraph"><strong>Farcic:</strong> Internal developer platforms are systems or platforms, as the word says, that enable everybody in the company to perform all the activities they need to do to do their job without relying on others and waiting for others to do that.</p>



<p class="wp-block-paragraph">In practice, <strong>certain experts are codifying their experience into services.</strong> Hence, if you&#8217;re a database administrator, you&#8217;re an expert. Instead of waiting for somebody to ask you to create a database for them or to configure it, <strong>you can codify that knowledge, transform it into a service and plug it into that platform</strong> so that everybody else can do it themselves instead of asking you to do things for them. Click a button, fill in some fields, and create some YAML; whatever the system is, should be the mechanism for others to create and manage that database without you.</p>



<p class="wp-block-paragraph">And you should focus on managing those services instead of managing requests from people to do something. That applies to everything.&nbsp;</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>It applies to infrastructure, containers, building, testing or whatever that something is. If you&#8217;re an expert in something, you should codify that experience and expose it as a service to others.</strong></p>
</blockquote>



<p class="wp-block-paragraph">When we combine all those services, we get a platform. We get what we call today the internal developer platforms. It&#8217;s a place where people can perform activities related to their work, but they&#8217;re not their core expertise because nobody can know everything. But we should be able to perform all the tasks we need for our project. Platform engineering is all about creating internal developer platforms.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://shiftmag.dev/wp-content/uploads/2023/07/viktor-farcic-1024x576.jpg?x94846" alt="" class="wp-image-948" srcset="https://shiftmag.dev/wp-content/uploads/2023/07/viktor-farcic-1024x576.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2023/07/viktor-farcic-300x169.jpg 300w, https://shiftmag.dev/wp-content/uploads/2023/07/viktor-farcic-768x432.jpg 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading"><span id="doing-devops-because-of-laziness">Doing DevOps because of laziness</span></h2>



<p class="wp-block-paragraph"><strong>How come you ended up in the field of DevOps?</strong></p>



<p class="wp-block-paragraph"><strong>Farcic: </strong>The answer is simple, laziness.&nbsp; Most of the time, I&#8217;m lazy, or to be more precise, I do not want to do the things I don&#8217;t want to do. I want to concentrate on things that bring value.&nbsp;</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Early on in my career, I spent a tremendous amount of time automating myself out of my job to let machines do the boring parts and me do the things that interest me.&nbsp;</p>
</blockquote>



<p class="wp-block-paragraph">That had many forms in the past. I automated my tests, I automated my processes through CI/CD pipelines, and so on. Right now, that is in the form of DevOps. <strong>I&#8217;m finding better ways to enable myself and others to do things.&nbsp;</strong></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://shiftmag.dev/wp-content/uploads/2023/07/viktor_farcic1-1024x576.jpeg?x94846" alt="" class="wp-image-946" srcset="https://shiftmag.dev/wp-content/uploads/2023/07/viktor_farcic1-1024x576.jpeg 1024w, https://shiftmag.dev/wp-content/uploads/2023/07/viktor_farcic1-300x169.jpeg 300w, https://shiftmag.dev/wp-content/uploads/2023/07/viktor_farcic1-768x432.jpeg 768w, https://shiftmag.dev/wp-content/uploads/2023/07/viktor_farcic1.jpeg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading"><span id="having-more-tools-is-good-for-the-industry-but-exhausting-for-engineers">Having more tools is good for the industry but exhausting for engineers</span></h2>



<p class="wp-block-paragraph"><strong>Many of your videos compare different developer tools or explain how a certain tool works. Do you sometimes feel like there is a new dev tool every day? Do you feel the tooling fatigue?</strong></p>



<p class="wp-block-paragraph"><strong>Farcic:</strong> Having more tools is not necessarily better for an individual, but it&#8217;s better for the industry as a whole. That&#8217;s how we advance. There is a group of people who think that they can do something better. They start a new project, they create a new tool, and that tool competes with other tools in that area.&nbsp;</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Without an increased number of tools, we would not have competition. We would be stuck with the tools from 30 years ago.&nbsp;</p>
</blockquote>



<p class="wp-block-paragraph"><strong>I will never be against new tools because that would mean I&#8217;m against innovation.</strong> But that&#8217;s for the industry as a whole. For individuals, for developers, that can be overwhelming. That&#8217;s normal. </p>



<p class="wp-block-paragraph">But that&#8217;s OK if people focus on what their expertise is. I expect a Node.js developer to explore new libraries for Node.js. I expect Kubernetes experts to explore new ways to create custom resource definitions in Kubernetes. I expect cloud managers to look forward to the new APIs in AWS for new services. That&#8217;s all good.&nbsp;</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">The problem arises when companies assume that everybody will focus on everything, and that&#8217;s when people get overwhelmed with tools.&nbsp;</p>
</blockquote>



<p class="wp-block-paragraph">But if people focus on specific areas, that shouldn&#8217;t be a problem because exploring new tools that help their core expertise improve and the job they&#8217;re doing improves is a good thing. Even if we spend one day every week exploring new tools that result in higher efficiency, we ultimately win.&nbsp;</p>



<h2 class="wp-block-heading"><span id="the-disappearance-of-kubernetes">The disappearance of Kubernetes</span></h2>



<p class="wp-block-paragraph"><strong>Which new or existing trends or niches will be emerging as key in the next few years?</strong></p>



<p class="wp-block-paragraph"><strong>Farcic:</strong> It&#8217;s easier to say what trends would be emerging in a specific sub-niche or category like security, automation, building, or running stuff. But if I were pressed to answer for DevOps, the answer would be &#8211; <strong>Kubernetes is key.</strong> It feels like Kubernetes has been with us for a long time, but we are only starting now.&nbsp;</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">What comes next is the disappearance of Kubernetes, but not in a sense that we will not be using it, but in the sense that it will become an implementation detail backed by higher-up structural layers.&nbsp;</p>
</blockquote>



<p class="wp-block-paragraph">We will see companies, teams, and providers <strong>offering services on top of Kubernetes that will eventually wholly remove it.</strong> You will be able to deploy or manage applications or infrastructure very efficiently with Kubernetes without even seeing Kubernetes.&nbsp;</p>



<h2 class="wp-block-heading"><span id="devops-is-not-a-good-starting-point-for-a-junior">DevOps is not a good starting point for a junior</span></h2>



<p class="wp-block-paragraph"><strong>Experts in the field often say there are no junior DevOps engineers. Do you agree?&nbsp;</strong></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">I don&#8217;t think that there is such a thing as a DevOps engineer, to begin with.</p>
</blockquote>



<p class="wp-block-paragraph">And if there is such a thing as a DevOps engineer, it couldn&#8217;t be a junior person simply because DevOps combines development and operations. Starting your career in that area would be silly because that means that you would focus both on infrastructure and systems and development from the very beginning of your career.</p>



<p class="wp-block-paragraph"><strong>It makes so much more sense early on when you&#8217;re junior to focus on learning one thing:</strong> how to write code, use AWS, or focus on Linux. And eventually, over time, you will be able to extend your focus, to extend the number of areas you are an expert in, and then you can call yourself a senior.&nbsp;</p>



<p class="wp-block-paragraph">But if DevOps was a thing, if a DevOps engineer was a thing, which I don&#8217;t believe it is, that means that <strong>those engineers would need to know almost everything. That&#8217;s not a good starting point for a junior.&nbsp;</strong></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="625" height="351" src="https://shiftmag.dev/wp-content/uploads/2023/07/viktor-farcic2.webp?x94846" alt="" class="wp-image-951" srcset="https://shiftmag.dev/wp-content/uploads/2023/07/viktor-farcic2.webp 625w, https://shiftmag.dev/wp-content/uploads/2023/07/viktor-farcic2-300x168.webp 300w" sizes="auto, (max-width: 625px) 100vw, 625px" /></figure>



<p class="wp-block-paragraph"><strong>You create videos, speak at conferences, are active on social media, co-host a podcast, and are the author of two books. Where do you get inspiration and motivation for creating content and sharing knowledge?</strong></p>



<p class="wp-block-paragraph"><strong>Farcic:</strong>&nbsp;I am an old person. I have been in this industry for a long time, and many people helped me when I started and through my career. In the second half of my career, I feel that it’s my responsibility to return the favor.&nbsp;<strong>It’s my responsibility to help and teach people younger than me.</strong>&nbsp;And when they become seniors and principals, they should be helping their younger colleagues.&nbsp;</p>



<p class="wp-block-paragraph">It is also gratifying for me, and I learn something when I teach others. I have support from the companies and organizations I am involved with. It’s my way of giving back.</p>
<p>The post <a href="https://shiftmag.dev/devops-viktor-farcic-945/">Viktor Farcic: There is no such thing as a DevOps engineer</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 

Served from: shiftmag.dev @ 2026-07-08 21:53:35 by W3 Total Cache
-->