CINXE.COM
<!doctype html><html lang="en"><head><title data-rh="true">Cracking the Monolith: A Journey to Continuous Deployment | by Mitja Bezenšek | Outfit7 | Medium</title><meta data-rh="true" charset="utf-8"/><meta data-rh="true" name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1,maximum-scale=1"/><meta data-rh="true" name="theme-color" content="#000000"/><meta data-rh="true" name="twitter:app:name:iphone" content="Medium"/><meta data-rh="true" name="twitter:app:id:iphone" content="828256236"/><meta data-rh="true" property="al:ios:app_name" content="Medium"/><meta data-rh="true" property="al:ios:app_store_id" content="828256236"/><meta data-rh="true" property="al:android:package" content="com.medium.reader"/><meta data-rh="true" property="fb:app_id" content="542599432471018"/><meta data-rh="true" property="og:site_name" content="Medium"/><meta data-rh="true" property="og:type" content="article"/><meta data-rh="true" property="article:published_time" content="2023-10-16T08:18:31.085Z"/><meta data-rh="true" name="title" content="Cracking the Monolith: A Journey to Continuous Deployment | by Mitja Bezenšek | Outfit7 | Medium"/><meta data-rh="true" property="og:title" content="Cracking the Monolith: A Journey to Continuous Deployment"/><meta data-rh="true" property="al:android:url" content="medium://p/1a44213a12bf"/><meta data-rh="true" property="al:ios:url" content="medium://p/1a44213a12bf"/><meta data-rh="true" property="al:android:app_name" content="Medium"/><meta data-rh="true" name="description" content="TL;DR: At the Outfit7 platform team we are strong believers in agile development principles and recognize that fast and automated deployments are essential. We’ll see how we made this happen by…"/><meta data-rh="true" property="og:description" content="TL;DR: At the Outfit7 platform team we are strong believers in agile development principles and recognize that fast and automated…"/><meta data-rh="true" property="og:url" content="https://medium.com/outfit7/cracking-the-monolith-a-journey-to-continuous-deployment-1a44213a12bf"/><meta data-rh="true" property="al:web:url" content="https://medium.com/outfit7/cracking-the-monolith-a-journey-to-continuous-deployment-1a44213a12bf"/><meta data-rh="true" property="og:image" content="https://miro.medium.com/v2/resize:fit:1200/1*orCHpijf_4Az1U6IbPX0gQ.jpeg"/><meta data-rh="true" property="article:author" content="https://medium.com/@mitja.bezensek_98237"/><meta data-rh="true" name="author" content="Mitja Bezenšek"/><meta data-rh="true" name="robots" content="index,noarchive,follow,max-image-preview:large"/><meta data-rh="true" name="referrer" content="unsafe-url"/><meta data-rh="true" property="twitter:title" content="Cracking the Monolith: A Journey to Continuous Deployment"/><meta data-rh="true" name="twitter:site" content="@Medium"/><meta data-rh="true" name="twitter:app:url:iphone" content="medium://p/1a44213a12bf"/><meta data-rh="true" property="twitter:description" content="TL;DR: At the Outfit7 platform team we are strong believers in agile development principles and recognize that fast and automated…"/><meta data-rh="true" name="twitter:image:src" content="https://miro.medium.com/v2/resize:fit:1200/1*orCHpijf_4Az1U6IbPX0gQ.jpeg"/><meta data-rh="true" name="twitter:card" content="summary_large_image"/><meta data-rh="true" name="twitter:label1" content="Reading time"/><meta data-rh="true" name="twitter:data1" content="8 min read"/><link data-rh="true" rel="icon" href="https://miro.medium.com/v2/5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19"/><link data-rh="true" rel="search" type="application/opensearchdescription+xml" title="Medium" href="/osd.xml"/><link data-rh="true" rel="apple-touch-icon" sizes="152x152" href="https://miro.medium.com/v2/resize:fill:304:304/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="120x120" href="https://miro.medium.com/v2/resize:fill:240:240/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="76x76" href="https://miro.medium.com/v2/resize:fill:152:152/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="60x60" href="https://miro.medium.com/v2/resize:fill:120:120/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="mask-icon" href="https://miro.medium.com/v2/resize:fill:1000:1000/7*GAOKVe--MXbEJmV9230oOQ.png" color="#171717"/><link data-rh="true" rel="preconnect" href="https://glyph.medium.com" crossOrigin=""/><link data-rh="true" id="glyph_preload_link" rel="preload" as="style" type="text/css" href="https://glyph.medium.com/css/unbound.css"/><link data-rh="true" id="glyph_link" rel="stylesheet" type="text/css" href="https://glyph.medium.com/css/unbound.css"/><link data-rh="true" rel="author" href="https://medium.com/@mitja.bezensek_98237"/><link data-rh="true" rel="canonical" href="https://medium.com/outfit7/cracking-the-monolith-a-journey-to-continuous-deployment-1a44213a12bf"/><link data-rh="true" rel="alternate" href="android-app://com.medium.reader/https/medium.com/p/1a44213a12bf"/><script data-rh="true" type="application/ld+json">{"@context":"http:\u002F\u002Fschema.org","@type":"NewsArticle","image":["https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1200\u002F1*orCHpijf_4Az1U6IbPX0gQ.jpeg"],"url":"https:\u002F\u002Fmedium.com\u002Foutfit7\u002Fcracking-the-monolith-a-journey-to-continuous-deployment-1a44213a12bf","dateCreated":"2023-10-16T08:13:35.805Z","datePublished":"2023-10-16T08:13:35.805Z","dateModified":"2023-10-16T08:18:34.729Z","headline":"Cracking the Monolith: A Journey to Continuous Deployment","name":"Cracking the Monolith: A Journey to Continuous Deployment","description":"TL;DR: At the Outfit7 platform team we are strong believers in agile development principles and recognize that fast and automated deployments are essential. We’ll see how we made this happen by…","identifier":"1a44213a12bf","author":{"@type":"Person","name":"Mitja Bezenšek","url":"https:\u002F\u002Fmedium.com\u002F@mitja.bezensek_98237"},"creator":["Mitja Bezenšek"],"publisher":{"@type":"Organization","name":"Outfit7","url":"https:\u002F\u002Fmedium.com\u002Foutfit7","logo":{"@type":"ImageObject","width":60,"height":60,"url":"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:120\u002F1*nTxl_7KgWQYo8PfVROUK_A.png"}},"mainEntityOfPage":"https:\u002F\u002Fmedium.com\u002Foutfit7\u002Fcracking-the-monolith-a-journey-to-continuous-deployment-1a44213a12bf"}</script><style type="text/css" data-fela-rehydration="532" data-fela-type="STATIC">html{box-sizing:border-box;-webkit-text-size-adjust:100%}*, *:before, *:after{box-sizing:inherit}body{margin:0;padding:0;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;color:rgba(0,0,0,0.8);position:relative;min-height:100vh}h1, h2, h3, h4, h5, h6, dl, dd, ol, ul, menu, figure, blockquote, p, pre, form{margin:0}menu, ol, ul{padding:0;list-style:none;list-style-image:none}main{display:block}a{color:inherit;text-decoration:none}a, button, input{-webkit-tap-highlight-color:transparent}img, svg{vertical-align:middle}button{background:transparent;overflow:visible}button, input, optgroup, select, textarea{margin:0}:root{--reach-tabs:1;--reach-menu-button:1}#speechify-root{font-family:Sohne, sans-serif}div[data-popper-reference-hidden="true"]{visibility:hidden;pointer-events:none}.grecaptcha-badge{visibility:hidden} /*XCode style (c) Angel Garcia <angelgarcia.mail@gmail.com>*/.hljs {background: #fff;color: black; }/* Gray DOCTYPE selectors like WebKit */ .xml .hljs-meta {color: #c0c0c0; }.hljs-comment, .hljs-quote {color: #007400; }.hljs-tag, .hljs-attribute, .hljs-keyword, .hljs-selector-tag, .hljs-literal, .hljs-name {color: #aa0d91; }.hljs-variable, .hljs-template-variable {color: #3F6E74; }.hljs-code, .hljs-string, .hljs-meta .hljs-string {color: #c41a16; }.hljs-regexp, .hljs-link {color: #0E0EFF; }.hljs-title, .hljs-symbol, .hljs-bullet, .hljs-number {color: #1c00cf; }.hljs-section, .hljs-meta {color: #643820; }.hljs-title.class_, .hljs-class .hljs-title, .hljs-type, .hljs-built_in, .hljs-params {color: #5c2699; }.hljs-attr {color: #836C28; }.hljs-subst {color: #000; }.hljs-formula {background-color: #eee;font-style: italic; }.hljs-addition {background-color: #baeeba; }.hljs-deletion {background-color: #ffc8bd; }.hljs-selector-id, .hljs-selector-class {color: #9b703f; }.hljs-doctag, .hljs-strong {font-weight: bold; }.hljs-emphasis {font-style: italic; } </style><style type="text/css" data-fela-rehydration="532" data-fela-type="KEYFRAME">@-webkit-keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}@-moz-keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}@keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}</style><style type="text/css" data-fela-rehydration="532" data-fela-type="RULE">.a{font-family:medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif}.b{font-weight:400}.c{background-color:rgba(255, 255, 255, 1)}.l{display:block}.m{position:sticky}.n{top:0}.o{z-index:500}.p{padding:0 24px}.q{align-items:center}.r{border-bottom:solid 1px #F2F2F2}.y{height:41px}.z{line-height:20px}.ab{display:flex}.ac{height:57px}.ae{flex:1 0 auto}.af{color:inherit}.ag{fill:inherit}.ah{font-size:inherit}.ai{border:inherit}.aj{font-family:inherit}.ak{letter-spacing:inherit}.al{font-weight:inherit}.am{padding:0}.an{margin:0}.ao{cursor:pointer}.ap:disabled{cursor:not-allowed}.aq:disabled{color:#6B6B6B}.ar:disabled{fill:#6B6B6B}.au{width:auto}.av path{fill:#242424}.aw{height:25px}.ax{margin-left:16px}.ay{border:none}.az{border-radius:20px}.ba{width:240px}.bb{background:#F9F9F9}.bc path{fill:#6B6B6B}.be{outline:none}.bf{font-family:sohne, "Helvetica Neue", Helvetica, Arial, sans-serif}.bg{font-size:14px}.bh{width:100%}.bi{padding:10px 20px 10px 0}.bj{background-color:transparent}.bk{color:#242424}.bl::placeholder{color:#6B6B6B}.bm{display:inline-block}.bn{margin-left:12px}.bo{margin-right:12px}.bp{border-radius:4px}.bq{margin-left:24px}.br{height:24px}.bx{background-color:#F9F9F9}.by{border-radius:50%}.bz{height:32px}.ca{width:32px}.cb{justify-content:center}.ch{max-width:680px}.ci{min-width:0}.cj{animation:k1 1.2s ease-in-out infinite}.ck{height:100vh}.cl{margin-bottom:16px}.cm{margin-top:48px}.cn{align-items:flex-start}.co{flex-direction:column}.cp{justify-content:space-between}.cq{margin-bottom:24px}.cw{width:80%}.cx{background-color:#F2F2F2}.dd{height:44px}.de{width:44px}.df{margin:auto 0}.dg{margin-bottom:4px}.dh{height:16px}.di{width:120px}.dj{width:80px}.dp{margin-bottom:8px}.dq{width:96%}.dr{width:98%}.ds{width:81%}.dt{margin-left:8px}.du{color:#6B6B6B}.dv{font-size:13px}.dw{height:100%}.ep{color:#FFFFFF}.eq{fill:#FFFFFF}.er{background:rgba(133, 132, 132, 1)}.es{border-color:rgba(133, 132, 132, 1)}.ew:disabled{cursor:inherit !important}.ex:disabled{opacity:0.3}.ey:disabled:hover{background:rgba(133, 132, 132, 1)}.ez:disabled:hover{border-color:rgba(133, 132, 132, 1)}.fa{border-radius:99em}.fb{border-width:1px}.fc{border-style:solid}.fd{box-sizing:border-box}.fe{text-decoration:none}.ff{text-align:center}.fi{margin-right:32px}.fj{position:relative}.fk{fill:#6B6B6B}.fn{background:transparent}.fo svg{margin-left:4px}.fp svg{fill:#6B6B6B}.fr{box-shadow:inset 0 0 0 1px rgba(0, 0, 0, 0.05)}.fs{position:absolute}.fz{margin:0 24px}.gd{background:rgba(255, 255, 255, 1)}.ge{border:1px solid #F2F2F2}.gf{box-shadow:0 1px 4px #F2F2F2}.gg{max-height:100vh}.gh{overflow-y:auto}.gi{left:0}.gj{top:calc(100vh + 100px)}.gk{bottom:calc(100vh + 100px)}.gl{width:10px}.gm{pointer-events:none}.gn{word-break:break-word}.go{word-wrap:break-word}.gp:after{display:block}.gq:after{content:""}.gr:after{clear:both}.gs{line-height:1.23}.gt{letter-spacing:0}.gu{font-style:normal}.gv{font-weight:700}.ia{align-items:baseline}.ib{width:48px}.ic{height:48px}.id{border:2px solid rgba(255, 255, 255, 1)}.ie{z-index:0}.if{box-shadow:none}.ig{border:1px solid rgba(0, 0, 0, 0.05)}.ih{margin-left:-12px}.ii{width:28px}.ij{height:28px}.ik{z-index:1}.il{width:24px}.im{margin-bottom:2px}.in{flex-wrap:nowrap}.io{font-size:16px}.ip{line-height:24px}.ir{margin:0 8px}.is{display:inline}.it{color:rgba(133, 132, 132, 1)}.iu{fill:rgba(133, 132, 132, 1)}.ix{flex:0 0 auto}.ja{flex-wrap:wrap}.jd{white-space:pre-wrap}.je{margin-right:4px}.jf{overflow:hidden}.jg{max-height:20px}.jh{text-overflow:ellipsis}.ji{display:-webkit-box}.jj{-webkit-line-clamp:1}.jk{-webkit-box-orient:vertical}.jl{word-break:break-all}.jn{padding-left:8px}.jo{padding-right:8px}.kp> *{flex-shrink:0}.kq{overflow-x:scroll}.kr::-webkit-scrollbar{display:none}.ks{scrollbar-width:none}.kt{-ms-overflow-style:none}.ku{width:74px}.kv{flex-direction:row}.kw{z-index:2}.kz{-webkit-user-select:none}.la{border:0}.lb{fill:rgba(117, 117, 117, 1)}.le{outline:0}.lf{user-select:none}.lg> svg{pointer-events:none}.lp{cursor:progress}.lq{margin-left:4px}.lr{margin-top:0px}.ls{opacity:1}.lt{padding:4px 0}.lw{width:16px}.ly{display:inline-flex}.me{max-width:100%}.mf{padding:8px 2px}.mg svg{color:#6B6B6B}.mx{line-height:1.58}.my{letter-spacing:-0.004em}.mz{font-family:source-serif-pro, Georgia, Cambria, "Times New Roman", Times, serif}.nu{margin-bottom:-0.46em}.nv{font-style:italic}.nw{margin-left:auto}.nx{margin-right:auto}.ny{max-width:1920px}.oe{clear:both}.og{cursor:zoom-in}.oh{z-index:auto}.oj{height:auto}.ok{text-decoration:underline}.ol{line-height:1.12}.om{letter-spacing:-0.022em}.on{font-weight:600}.pi{margin-bottom:-0.28em}.po{list-style-type:decimal}.pp{margin-left:30px}.pq{padding-left:0px}.pw{max-width:1600px}.px{margin-top:10px}.py{max-width:728px}.qb{list-style-type:disc}.qc{max-width:667px}.qd{margin-bottom:26px}.qe{margin-top:6px}.qf{margin-top:8px}.qg{margin-right:8px}.qh{padding:8px 16px}.qi{border-radius:100px}.qj{transition:background 300ms ease}.ql{white-space:nowrap}.qm{border-top:none}.qs{height:52px}.qt{max-height:52px}.qu{box-sizing:content-box}.qv{position:static}.qx{max-width:155px}.rd{margin-right:20px}.rj{margin-bottom:48px}.rx{border-radius:2px}.rz{height:64px}.sa{width:64px}.sb{align-self:flex-end}.sc{flex:1 1 auto}.si{padding-right:4px}.sj{font-weight:500}.sw{margin-top:16px}.sx{color:rgba(255, 255, 255, 1)}.sy{fill:rgba(255, 255, 255, 1)}.sz{background:rgba(25, 25, 25, 1)}.ta{border-color:rgba(25, 25, 25, 1)}.td:disabled{opacity:0.1}.te:disabled:hover{background:rgba(25, 25, 25, 1)}.tf:disabled:hover{border-color:rgba(25, 25, 25, 1)}.tg{height:0px}.th{border-bottom:solid 1px #E5E5E5}.ti{margin-top:56px}.tj{margin-top:72px}.tk{padding:24px 0}.tl{margin-bottom:0px}.tm{margin-right:16px}.as:hover:not(:disabled){color:rgba(25, 25, 25, 1)}.at:hover:not(:disabled){fill:rgba(25, 25, 25, 1)}.et:hover{background:rgba(115, 113, 113, 1)}.eu:hover{border-color:rgba(115, 113, 113, 1)}.ev:hover{cursor:pointer}.fl:hover{color:#242424}.fm:hover{fill:#242424}.fq:hover svg{fill:#242424}.ft:hover{background-color:rgba(0, 0, 0, 0.1)}.iq:hover{text-decoration:underline}.iv:hover:not(:disabled){color:rgba(115, 113, 113, 1)}.iw:hover:not(:disabled){fill:rgba(115, 113, 113, 1)}.ld:hover{fill:rgba(8, 8, 8, 1)}.lu:hover{fill:#000000}.lv:hover p{color:#000000}.lx:hover{color:#000000}.mh:hover svg{color:#000000}.qk:hover{background-color:#F2F2F2}.ry:hover{background-color:none}.tb:hover{background:#000000}.tc:hover{border-color:#242424}.bd:focus-within path{fill:#242424}.lc:focus{fill:rgba(8, 8, 8, 1)}.mi:focus svg{color:#000000}.oi:focus{transform:scale(1.01)}.lh:active{border-style:none}</style><style type="text/css" data-fela-rehydration="532" data-fela-type="RULE" media="all and (min-width: 1080px)">.d{display:none}.bw{width:64px}.cg{margin:0 64px}.cv{height:48px}.dc{margin-bottom:52px}.do{margin-bottom:48px}.ef{font-size:14px}.eg{line-height:20px}.em{font-size:13px}.eo{padding:5px 12px}.fh{display:flex}.fy{margin-bottom:68px}.gc{max-width:680px}.hq{font-size:42px}.hr{margin-top:1.19em}.hs{margin-bottom:32px}.ht{line-height:52px}.hu{letter-spacing:-0.011em}.hz{align-items:center}.kb{border-top:solid 1px #F2F2F2}.kc{border-bottom:solid 1px #F2F2F2}.kd{margin:32px 0 0}.ke{padding:3px 8px}.kn> *{margin-right:24px}.ko> :last-child{margin-right:0}.lo{margin-top:0px}.md{margin:0}.nq{font-size:20px}.nr{margin-top:2.14em}.ns{line-height:32px}.nt{letter-spacing:-0.003em}.od{margin-top:56px}.pe{font-size:24px}.pf{margin-top:1.95em}.pg{line-height:30px}.ph{letter-spacing:-0.016em}.pn{margin-top:0.94em}.pv{margin-top:1.14em}.qr{margin-bottom:88px}.rc{display:inline-block}.ri{padding-top:72px}.rk{flex-direction:row}.rn{margin-bottom:0}.ro{margin-right:20px}.sd{max-width:500px}.su{line-height:24px}.sv{letter-spacing:0}</style><style type="text/css" data-fela-rehydration="532" data-fela-type="RULE" media="all and (max-width: 1079.98px)">.e{display:none}.ln{margin-top:0px}.pz{margin-left:auto}.qa{text-align:center}.rb{display:inline-block}</style><style type="text/css" data-fela-rehydration="532" data-fela-type="RULE" media="all and (max-width: 903.98px)">.f{display:none}.lm{margin-top:0px}.ra{display:inline-block}</style><style type="text/css" data-fela-rehydration="532" data-fela-type="RULE" media="all and (max-width: 727.98px)">.g{display:none}.lk{margin-top:0px}.ll{margin-right:0px}.qz{display:inline-block}</style><style type="text/css" data-fela-rehydration="532" data-fela-type="RULE" media="all and (max-width: 551.98px)">.h{display:none}.s{display:flex}.t{justify-content:space-between}.bs{width:24px}.cc{margin:0 24px}.cr{height:40px}.cy{margin-bottom:44px}.dk{margin-bottom:32px}.dx{font-size:13px}.dy{line-height:20px}.eh{padding:0px 8px 1px}.fu{margin-bottom:4px}.gw{font-size:32px}.gx{margin-top:1.01em}.gy{margin-bottom:24px}.gz{line-height:38px}.ha{letter-spacing:-0.014em}.hv{align-items:flex-start}.iy{flex-direction:column}.jb{margin-bottom:2px}.jp{margin:24px -24px 0}.jq{padding:0}.kf> *{margin-right:8px}.kg> :last-child{margin-right:24px}.kx{margin-left:0px}.li{margin-top:0px}.lj{margin-right:0px}.lz{margin:0}.mj{border:1px solid #F2F2F2}.mk{border-radius:99em}.ml{padding:0px 16px 0px 12px}.mm{height:38px}.mn{align-items:center}.mp svg{margin-right:8px}.na{font-size:18px}.nb{margin-top:1.56em}.nc{line-height:28px}.nd{letter-spacing:-0.003em}.nz{margin-top:40px}.oo{font-size:20px}.op{margin-top:1.2em}.oq{line-height:24px}.or{letter-spacing:0}.pj{margin-top:0.67em}.pr{margin-top:1.34em}.qn{margin-bottom:80px}.qy{display:inline-block}.re{padding-top:48px}.rv{margin-bottom:20px}.rw{margin-right:0}.sh{max-width:100%}.sk{font-size:24px}.sl{line-height:30px}.sm{letter-spacing:-0.016em}.mo:hover{border-color:#E5E5E5}</style><style type="text/css" data-fela-rehydration="532" data-fela-type="RULE" media="all and (min-width: 904px) and (max-width: 1079.98px)">.i{display:none}.bv{width:64px}.cf{margin:0 64px}.cu{height:48px}.db{margin-bottom:52px}.dn{margin-bottom:48px}.ed{font-size:14px}.ee{line-height:20px}.ek{font-size:13px}.el{padding:5px 12px}.fg{display:flex}.fx{margin-bottom:68px}.gb{max-width:680px}.hl{font-size:42px}.hm{margin-top:1.19em}.hn{margin-bottom:32px}.ho{line-height:52px}.hp{letter-spacing:-0.011em}.hy{align-items:center}.jx{border-top:solid 1px #F2F2F2}.jy{border-bottom:solid 1px #F2F2F2}.jz{margin:32px 0 0}.ka{padding:3px 8px}.kl> *{margin-right:24px}.km> :last-child{margin-right:0}.mc{margin:0}.nm{font-size:20px}.nn{margin-top:2.14em}.no{line-height:32px}.np{letter-spacing:-0.003em}.oc{margin-top:56px}.pa{font-size:24px}.pb{margin-top:1.95em}.pc{line-height:30px}.pd{letter-spacing:-0.016em}.pm{margin-top:0.94em}.pu{margin-top:1.14em}.qq{margin-bottom:88px}.rh{padding-top:72px}.rl{flex-direction:row}.rp{margin-bottom:0}.rq{margin-right:20px}.se{max-width:500px}.ss{line-height:24px}.st{letter-spacing:0}</style><style type="text/css" data-fela-rehydration="532" data-fela-type="RULE" media="all and (min-width: 728px) and (max-width: 903.98px)">.j{display:none}.w{display:flex}.x{justify-content:space-between}.bu{width:64px}.ce{margin:0 48px}.ct{height:48px}.da{margin-bottom:52px}.dm{margin-bottom:48px}.eb{font-size:13px}.ec{line-height:20px}.ej{padding:0px 8px 1px}.fw{margin-bottom:68px}.ga{max-width:680px}.hg{font-size:42px}.hh{margin-top:1.19em}.hi{margin-bottom:32px}.hj{line-height:52px}.hk{letter-spacing:-0.011em}.hx{align-items:center}.jt{border-top:solid 1px #F2F2F2}.ju{border-bottom:solid 1px #F2F2F2}.jv{margin:32px 0 0}.jw{padding:3px 8px}.kj> *{margin-right:24px}.kk> :last-child{margin-right:0}.mb{margin:0}.ni{font-size:20px}.nj{margin-top:2.14em}.nk{line-height:32px}.nl{letter-spacing:-0.003em}.ob{margin-top:56px}.ow{font-size:24px}.ox{margin-top:1.95em}.oy{line-height:30px}.oz{letter-spacing:-0.016em}.pl{margin-top:0.94em}.pt{margin-top:1.14em}.qp{margin-bottom:88px}.rg{padding-top:72px}.rm{flex-direction:row}.rr{margin-bottom:0}.rs{margin-right:20px}.sf{max-width:500px}.sq{line-height:24px}.sr{letter-spacing:0}</style><style type="text/css" data-fela-rehydration="532" data-fela-type="RULE" media="all and (min-width: 552px) and (max-width: 727.98px)">.k{display:none}.u{display:flex}.v{justify-content:space-between}.bt{width:24px}.cd{margin:0 24px}.cs{height:40px}.cz{margin-bottom:44px}.dl{margin-bottom:32px}.dz{font-size:13px}.ea{line-height:20px}.ei{padding:0px 8px 1px}.fv{margin-bottom:4px}.hb{font-size:32px}.hc{margin-top:1.01em}.hd{margin-bottom:24px}.he{line-height:38px}.hf{letter-spacing:-0.014em}.hw{align-items:flex-start}.iz{flex-direction:column}.jc{margin-bottom:2px}.jr{margin:24px 0 0}.js{padding:0}.kh> *{margin-right:8px}.ki> :last-child{margin-right:8px}.ky{margin-left:0px}.ma{margin:0}.mq{border:1px solid #F2F2F2}.mr{border-radius:99em}.ms{padding:0px 16px 0px 12px}.mt{height:38px}.mu{align-items:center}.mw svg{margin-right:8px}.ne{font-size:18px}.nf{margin-top:1.56em}.ng{line-height:28px}.nh{letter-spacing:-0.003em}.oa{margin-top:40px}.os{font-size:20px}.ot{margin-top:1.2em}.ou{line-height:24px}.ov{letter-spacing:0}.pk{margin-top:0.67em}.ps{margin-top:1.34em}.qo{margin-bottom:80px}.rf{padding-top:48px}.rt{margin-bottom:20px}.ru{margin-right:0}.sg{max-width:100%}.sn{font-size:24px}.so{line-height:30px}.sp{letter-spacing:-0.016em}.mv:hover{border-color:#E5E5E5}</style><style type="text/css" data-fela-rehydration="532" data-fela-type="RULE" media="print">.qw{display:none}</style><style type="text/css" data-fela-rehydration="532" data-fela-type="RULE" media="(orientation: landscape) and (max-width: 903.98px)">.jm{max-height:none}</style><style type="text/css" data-fela-rehydration="532" data-fela-type="RULE" media="(prefers-reduced-motion: no-preference)">.of{transition:transform 300ms cubic-bezier(0.2, 0, 0.2, 1)}</style></head><body><div id="root"><div class="a b c"><div class="d e f g h i j k"></div><script>document.domain = document.domain;</script><div class="l c"><div class="l m n o c"><div class="p q r s t u v w x i d y z"><a class="du ag dv bf ak b am an ao ap aq ar as at s u w i d q dw z" href="https://rsci.app.link/?%24canonical_url=https%3A%2F%2Fmedium.com%2Fp%2F1a44213a12bf&%7Efeature=LoOpenInAppButton&%7Echannel=ShowPostUnderCollection&source=---top_nav_layout_nav----------------------------------" rel="noopener follow">Open in app<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" fill="none" viewBox="0 0 10 10" class="dt"><path fill="currentColor" d="M.985 8.485a.375.375 0 1 0 .53.53zM8.75 1.25h.375A.375.375 0 0 0 8.75.875zM8.375 6.5a.375.375 0 1 0 .75 0zM3.5.875a.375.375 0 1 0 0 .75zm-1.985 8.14 7.5-7.5-.53-.53-7.5 7.5zm6.86-7.765V6.5h.75V1.25zM3.5 1.625h5.25v-.75H3.5z"></path></svg></a><div class="ab q"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><button class="bf b dx dy eh dz ea ei eb ec ej ek ee el em eg eo ep eq er es et eu ev ew ex ey ez fa fb fc fd bm fe ff" data-testid="headerSignUpButton">Sign up</button></span></p><div class="ax l"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSignInButton" rel="noopener follow" href="/m/signin?operation=login&redirect=https%3A%2F%2Fmedium.com%2Foutfit7%2Fcracking-the-monolith-a-journey-to-continuous-deployment-1a44213a12bf&source=post_page---top_nav_layout_nav-----------------------global_nav-----------">Sign in</a></span></p></div></div></div><div class="p q r ab ac"><div class="ab q ae"><a class="af ag ah ai aj ak al am an ao ap aq ar as at ab" aria-label="Homepage" data-testid="headerMediumLogo" rel="noopener follow" href="/?source=---top_nav_layout_nav----------------------------------"><svg xmlns="http://www.w3.org/2000/svg" width="719" height="160" fill="none" viewBox="0 0 719 160" class="au av aw"><path fill="#242424" d="m174.104 9.734.215-.047V8.02H130.39L89.6 103.89 48.81 8.021H1.472v1.666l.212.047c8.018 1.81 12.09 4.509 12.09 14.242V137.93c0 9.734-4.087 12.433-12.106 14.243l-.212.047v1.671h32.118v-1.665l-.213-.048c-8.018-1.809-12.089-4.509-12.089-14.242V30.586l52.399 123.305h2.972l53.925-126.743V140.75c-.687 7.688-4.721 10.062-11.982 11.701l-.215.05v1.652h55.948v-1.652l-.215-.05c-7.269-1.639-11.4-4.013-12.087-11.701l-.037-116.774h.037c0-9.733 4.071-12.432 12.087-14.242m25.555 75.488c.915-20.474 8.268-35.252 20.606-35.507 3.806.063 6.998 1.312 9.479 3.714 5.272 5.118 7.751 15.812 7.368 31.793zm-.553 5.77h65.573v-.275c-.186-15.656-4.721-27.834-13.466-36.196-7.559-7.227-18.751-11.203-30.507-11.203h-.263c-6.101 0-13.584 1.48-18.909 4.16-6.061 2.807-11.407 7.003-15.855 12.511-7.161 8.874-11.499 20.866-12.554 34.343q-.05.606-.092 1.212a50 50 0 0 0-.065 1.151 85.807 85.807 0 0 0-.094 5.689c.71 30.524 17.198 54.917 46.483 54.917 25.705 0 40.675-18.791 44.407-44.013l-1.886-.664c-6.557 13.556-18.334 21.771-31.738 20.769-18.297-1.369-32.314-19.922-31.042-42.395m139.722 41.359c-2.151 5.101-6.639 7.908-12.653 7.908s-11.513-4.129-15.418-11.63c-4.197-8.053-6.405-19.436-6.405-32.92 0-28.067 8.729-46.22 22.24-46.22 5.657 0 10.111 2.807 12.236 7.704zm43.499 20.008c-8.019-1.897-12.089-4.722-12.089-14.951V1.309l-48.716 14.353v1.757l.299-.024c6.72-.543 11.278.386 13.925 2.83 2.072 1.915 3.082 4.853 3.082 8.987v18.66c-4.803-3.067-10.516-4.56-17.448-4.56-14.059 0-26.909 5.92-36.176 16.672-9.66 11.205-14.767 26.518-14.767 44.278-.003 31.72 15.612 53.039 38.851 53.039 13.595 0 24.533-7.449 29.54-20.013v16.865h43.711v-1.746zM424.1 19.819c0-9.904-7.468-17.374-17.375-17.374-9.859 0-17.573 7.632-17.573 17.374s7.721 17.374 17.573 17.374c9.907 0 17.375-7.47 17.375-17.374m11.499 132.546c-8.019-1.897-12.089-4.722-12.089-14.951h-.035V43.635l-43.714 12.551v1.705l.263.024c9.458.842 12.047 4.1 12.047 15.152v81.086h43.751v-1.746zm112.013 0c-8.018-1.897-12.089-4.722-12.089-14.951V43.635l-41.621 12.137v1.71l.246.026c7.733.813 9.967 4.257 9.967 15.36v59.279c-2.578 5.102-7.415 8.131-13.274 8.336-9.503 0-14.736-6.419-14.736-18.073V43.638l-43.714 12.55v1.703l.262.024c9.459.84 12.05 4.097 12.05 15.152v50.17a56.3 56.3 0 0 0 .91 10.444l.787 3.423c3.701 13.262 13.398 20.197 28.59 20.197 12.868 0 24.147-7.966 29.115-20.43v17.311h43.714v-1.747zm169.818 1.788v-1.749l-.213-.05c-8.7-2.006-12.089-5.789-12.089-13.49v-63.79c0-19.89-11.171-31.761-29.883-31.761-13.64 0-25.141 7.882-29.569 20.16-3.517-13.01-13.639-20.16-28.606-20.16-13.146 0-23.449 6.938-27.869 18.657V43.643L545.487 55.68v1.715l.263.024c9.345.829 12.047 4.181 12.047 14.95v81.784h40.787v-1.746l-.215-.053c-6.941-1.631-9.181-4.606-9.181-12.239V66.998c1.836-4.289 5.537-9.37 12.853-9.37 9.086 0 13.692 6.296 13.692 18.697v77.828h40.797v-1.746l-.215-.053c-6.94-1.631-9.18-4.606-9.18-12.239V75.066a42 42 0 0 0-.578-7.26c1.947-4.661 5.86-10.177 13.475-10.177 9.214 0 13.691 6.114 13.691 18.696v77.828z"></path></svg></a><div class="ax h"><div class="ab ay az ba bb q bc bd"><div class="bm" aria-hidden="false" aria-describedby="searchResults" aria-labelledby="searchResults"></div><div class="bn bo ab"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M4.092 11.06a6.95 6.95 0 1 1 13.9 0 6.95 6.95 0 0 1-13.9 0m6.95-8.05a8.05 8.05 0 1 0 5.13 14.26l3.75 3.75a.56.56 0 1 0 .79-.79l-3.73-3.73A8.05 8.05 0 0 0 11.042 3z" clip-rule="evenodd"></path></svg></div><input role="combobox" aria-controls="searchResults" aria-expanded="false" aria-label="search" data-testid="headerSearchInput" tabindex="0" class="ay be bf bg z bh bi bj bk bl" placeholder="Search" value=""/></div></div></div><div class="h k w fg fh"><div class="fi ab"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerWriteButton" rel="noopener follow" href="/m/signin?operation=register&redirect=https%3A%2F%2Fmedium.com%2Fnew-story&source=---top_nav_layout_nav-----------------------new_post_topnav-----------"><div class="bf b bg z du fj fk ab q fl fm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24" aria-label="Write"><path fill="currentColor" d="M14 4a.5.5 0 0 0 0-1zm7 6a.5.5 0 0 0-1 0zm-7-7H4v1h10zM3 4v16h1V4zm1 17h16v-1H4zm17-1V10h-1v10zm-1 1a1 1 0 0 0 1-1h-1zM3 20a1 1 0 0 0 1 1v-1zM4 3a1 1 0 0 0-1 1h1z"></path><path stroke="currentColor" d="m17.5 4.5-8.458 8.458a.25.25 0 0 0-.06.098l-.824 2.47a.25.25 0 0 0 .316.316l2.47-.823a.25.25 0 0 0 .098-.06L19.5 6.5m-2-2 2.323-2.323a.25.25 0 0 1 .354 0l1.646 1.646a.25.25 0 0 1 0 .354L19.5 6.5m-2-2 2 2"></path></svg><div class="dt l">Write</div></div></a></span></div></div><div class="k j i d"><div class="fi ab"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSearchButton" rel="noopener follow" href="/search?source=---top_nav_layout_nav----------------------------------"><div class="bf b bg z du fj fk ab q fl fm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24" aria-label="Search"><path fill="currentColor" fill-rule="evenodd" d="M4.092 11.06a6.95 6.95 0 1 1 13.9 0 6.95 6.95 0 0 1-13.9 0m6.95-8.05a8.05 8.05 0 1 0 5.13 14.26l3.75 3.75a.56.56 0 1 0 .79-.79l-3.73-3.73A8.05 8.05 0 0 0 11.042 3z" clip-rule="evenodd"></path></svg></div></a></div></div><div class="fi h k j"><div class="ab q"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><button class="bf b dx dy eh dz ea ei eb ec ej ek ee el em eg eo ep eq er es et eu ev ew ex ey ez fa fb fc fd bm fe ff" data-testid="headerSignUpButton">Sign up</button></span></p><div class="ax l"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSignInButton" rel="noopener follow" href="/m/signin?operation=login&redirect=https%3A%2F%2Fmedium.com%2Foutfit7%2Fcracking-the-monolith-a-journey-to-continuous-deployment-1a44213a12bf&source=post_page---top_nav_layout_nav-----------------------global_nav-----------">Sign in</a></span></p></div></div></div><div class="l" aria-hidden="false"><button class="ay fn am ab q ao fo fp fq" aria-label="user options menu" data-testid="headerUserIcon"><div class="l fj"><img alt="" class="l fd by bz ca cx" src="https://miro.medium.com/v2/resize:fill:64:64/1*dmbNkD5D-u45r44go_cf0g.png" width="32" height="32" loading="lazy" role="presentation"/><div class="fr by l bz ca fs n ay ft"></div></div></button></div></div></div><div class="l"><div class="fu fv fw fx fy l"><div class="ab cb"><div class="ci bh fz ga gb gc"></div></div><article><div class="l"><div class="l"><span class="l"></span><section><div><div class="fs gi gj gk gl gm"></div><div class="gn go gp gq gr"><div class="ab cb"><div class="ci bh fz ga gb gc"><div><h1 id="34d2" class="pw-post-title gs gt gu bf gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu bk" data-testid="storyTitle">Cracking the Monolith: A Journey to Continuous Deployment</h1><div><div class="speechify-ignore ab cp"><div class="speechify-ignore bh l"><div class="hv hw hx hy hz ab"><div><div class="ab ia"><div><div class="bm" aria-hidden="false"><a rel="noopener follow" href="/@mitja.bezensek_98237?source=post_page---byline--1a44213a12bf--------------------------------"><div class="l ib ic by id ie"><div class="l fj"><img alt="Mitja Bezenšek" class="l fd by dd de cx" src="https://miro.medium.com/v2/resize:fill:88:88/0*3VkJ01vMUfVDBJYX.jpg" width="44" height="44" loading="lazy" data-testid="authorPhoto"/><div class="if by l dd de fs n ig ft"></div></div></div></a></div></div><div class="ih ab fj"><div><div class="bm" aria-hidden="false"><a href="https://medium.com/outfit7?source=post_page---byline--1a44213a12bf--------------------------------" rel="noopener follow"><div class="l ii ij by id ik"><div class="l fj"><img alt="Outfit7" class="l fd by br il cx" src="https://miro.medium.com/v2/resize:fill:48:48/1*dCIQWfMya9g57UUL2ZzrJQ.png" width="24" height="24" loading="lazy" data-testid="publicationPhoto"/><div class="if by l br il fs n ig ft"></div></div></div></a></div></div></div></div></div><div class="bn bh l"><div class="ab"><div style="flex:1"><span class="bf b bg z bk"><div class="im ab q"><div class="ab q in"><div class="ab q"><div><div class="bm" aria-hidden="false"><p class="bf b io ip bk"><a class="af ag ah ai aj ak al am an ao ap aq ar iq" data-testid="authorName" rel="noopener follow" href="/@mitja.bezensek_98237?source=post_page---byline--1a44213a12bf--------------------------------">Mitja Bezenšek</a></p></div></div></div><span class="ir is" aria-hidden="true"><span class="bf b bg z du">·</span></span><p class="bf b io ip du"><span><a class="it iu ah ai aj ak al am an ao ap aq ar ex iv iw" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fsubscribe%2Fuser%2F95ecd7ef38ba&operation=register&redirect=https%3A%2F%2Fmedium.com%2Foutfit7%2Fcracking-the-monolith-a-journey-to-continuous-deployment-1a44213a12bf&user=Mitja+Bezen%C5%A1ek&userId=95ecd7ef38ba&source=post_page-95ecd7ef38ba--byline--1a44213a12bf---------------------post_header-----------">Follow</a></span></p></div></div></span></div></div><div class="l ix"><span class="bf b bg z du"><div class="ab cn iy iz ja"><div class="jb jc ab"><div class="bf b bg z du ab jd"><span class="je l ix">Published in</span><div><div class="l" aria-hidden="false"><a class="af ag ah ai aj ak al am an ao ap aq ar iq ab q" data-testid="publicationName" href="https://medium.com/outfit7?source=post_page---byline--1a44213a12bf--------------------------------" rel="noopener follow"><p class="bf b bg z jf jg jh ji jj jk jl jm bk">Outfit7</p></a></div></div></div><div class="h k"><span class="ir is" aria-hidden="true"><span class="bf b bg z du">·</span></span></div></div><span class="bf b bg z du"><div class="ab ae"><span data-testid="storyReadTime">8 min read</span><div class="jn jo l" aria-hidden="true"><span class="l" aria-hidden="true"><span class="bf b bg z du">·</span></span></div><span data-testid="storyPublishDate">Oct 16, 2023</span></div></span></div></span></div></div></div><div class="ab cp jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke"><div class="h k w fg fh q"><div class="ku l"><div class="ab q kv kw"><div class="pw-multi-vote-icon fj je kx ky kz"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerClapButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Foutfit7%2F1a44213a12bf&operation=register&redirect=https%3A%2F%2Fmedium.com%2Foutfit7%2Fcracking-the-monolith-a-journey-to-continuous-deployment-1a44213a12bf&user=Mitja+Bezen%C5%A1ek&userId=95ecd7ef38ba&source=---header_actions--1a44213a12bf---------------------clap_footer-----------"><div><div class="bm" aria-hidden="false"><div class="la ao lb lc ld le am lf lg lh kz"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l li lj lk ll lm ln lo"><p class="bf b dv z du"><span class="lp">--</span></p></div></div></div><div><div class="bm" aria-hidden="false"><button class="ao la ls lt ab q fk lu lv" aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="lr"><path d="M18.006 16.803c1.533-1.456 2.234-3.325 2.234-5.321C20.24 7.357 16.709 4 12.191 4S4 7.357 4 11.482c0 4.126 3.674 7.482 8.191 7.482.817 0 1.622-.111 2.393-.327.231.2.48.391.744.559 1.06.693 2.203 1.044 3.399 1.044.224-.008.4-.112.486-.287a.49.49 0 0 0-.042-.518c-.495-.67-.845-1.364-1.04-2.057a4 4 0 0 1-.125-.598zm-3.122 1.055-.067-.223-.315.096a8 8 0 0 1-2.311.338c-4.023 0-7.292-2.955-7.292-6.587 0-3.633 3.269-6.588 7.292-6.588 4.014 0 7.112 2.958 7.112 6.593 0 1.794-.608 3.469-2.027 4.72l-.195.168v.255c0 .056 0 .151.016.295.025.231.081.478.154.733.154.558.398 1.117.722 1.659a5.3 5.3 0 0 1-2.165-.845c-.276-.176-.714-.383-.941-.59z"></path></svg><p class="bf b dv z du"><span class="pw-responses-count lq lr">1</span></p></button></div></div></div><div class="ab q kf kg kh ki kj kk kl km kn ko kp kq kr ks kt"><div class="lw k j i d"></div><div class="h k"><div><div class="bm" aria-hidden="false"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerBookmarkButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fbookmark%2Fp%2F1a44213a12bf&operation=register&redirect=https%3A%2F%2Fmedium.com%2Foutfit7%2Fcracking-the-monolith-a-journey-to-continuous-deployment-1a44213a12bf&source=---header_actions--1a44213a12bf---------------------bookmark_footer-----------"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="none" viewBox="0 0 25 25" class="du lx" aria-label="Add to list bookmark button"><path fill="currentColor" d="M18 2.5a.5.5 0 0 1 1 0V5h2.5a.5.5 0 0 1 0 1H19v2.5a.5.5 0 1 1-1 0V6h-2.5a.5.5 0 0 1 0-1H18zM7 7a1 1 0 0 1 1-1h3.5a.5.5 0 0 0 0-1H8a2 2 0 0 0-2 2v14a.5.5 0 0 0 .805.396L12.5 17l5.695 4.396A.5.5 0 0 0 19 21v-8.5a.5.5 0 0 0-1 0v7.485l-5.195-4.012a.5.5 0 0 0-.61 0L7 19.985z"></path></svg></a></span></div></div></div><div class="fd ly cn"><div class="l ae"><div class="ab cb"><div class="lz ma mb mc md me ci bh"><div class="ab"><div class="bm bh" aria-hidden="false"><div><div class="bm" aria-hidden="false"><button aria-label="Listen" data-testid="audioPlayButton" class="af fk ah ai aj ak al mf an ao ap ex mg mh lv mi mj mk ml mm s mn mo mp mq mr ms mt u mu mv mw"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M3 12a9 9 0 1 1 18 0 9 9 0 0 1-18 0m9-10C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2m3.376 10.416-4.599 3.066a.5.5 0 0 1-.777-.416V8.934a.5.5 0 0 1 .777-.416l4.599 3.066a.5.5 0 0 1 0 .832" clip-rule="evenodd"></path></svg><div class="j i d"><p class="bf b bg z du">Listen</p></div></button></div></div></div></div></div></div></div></div><div class="bm" aria-hidden="false" aria-describedby="postFooterSocialMenu" aria-labelledby="postFooterSocialMenu"><div><div class="bm" aria-hidden="false"><button aria-controls="postFooterSocialMenu" aria-expanded="false" aria-label="Share Post" data-testid="headerSocialShareButton" class="af fk ah ai aj ak al mf an ao ap ex mg mh lv mi mj mk ml mm s mn mo mp mq mr ms mt u mu mv mw"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M15.218 4.931a.4.4 0 0 1-.118.132l.012.006a.45.45 0 0 1-.292.074.5.5 0 0 1-.3-.13l-2.02-2.02v7.07c0 .28-.23.5-.5.5s-.5-.22-.5-.5v-7.04l-2 2a.45.45 0 0 1-.57.04h-.02a.4.4 0 0 1-.16-.3.4.4 0 0 1 .1-.32l2.8-2.8a.5.5 0 0 1 .7 0l2.8 2.79a.42.42 0 0 1 .068.498m-.106.138.008.004v-.01zM16 7.063h1.5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-11c-1.1 0-2-.9-2-2v-10a2 2 0 0 1 2-2H8a.5.5 0 0 1 .35.15.5.5 0 0 1 .15.35.5.5 0 0 1-.15.35.5.5 0 0 1-.35.15H6.4c-.5 0-.9.4-.9.9v10.2a.9.9 0 0 0 .9.9h11.2c.5 0 .9-.4.9-.9v-10.2c0-.5-.4-.9-.9-.9H16a.5.5 0 0 1 0-1" clip-rule="evenodd"></path></svg><div class="j i d"><p class="bf b bg z du">Share</p></div></button></div></div></div></div></div></div></div></div></div><p id="0d43" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk"><em class="nv">TL;DR: At the Outfit7 platform team we are strong believers in agile development principles and recognize that fast and automated deployments are essential. We’ll see how we made this happen by transforming our deployment process moving from a manual deployment pipeline to fully automated continuous deployment.</em></p><figure class="nz oa ob oc od oe nw nx paragraph-image"><div role="button" tabindex="0" class="of og fj oh bh oi"><div class="nw nx ny"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*orCHpijf_4Az1U6IbPX0gQ.jpeg 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*orCHpijf_4Az1U6IbPX0gQ.jpeg 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*orCHpijf_4Az1U6IbPX0gQ.jpeg 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*orCHpijf_4Az1U6IbPX0gQ.jpeg 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*orCHpijf_4Az1U6IbPX0gQ.jpeg 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*orCHpijf_4Az1U6IbPX0gQ.jpeg 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*orCHpijf_4Az1U6IbPX0gQ.jpeg 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/1*orCHpijf_4Az1U6IbPX0gQ.jpeg 640w, https://miro.medium.com/v2/resize:fit:720/1*orCHpijf_4Az1U6IbPX0gQ.jpeg 720w, https://miro.medium.com/v2/resize:fit:750/1*orCHpijf_4Az1U6IbPX0gQ.jpeg 750w, https://miro.medium.com/v2/resize:fit:786/1*orCHpijf_4Az1U6IbPX0gQ.jpeg 786w, https://miro.medium.com/v2/resize:fit:828/1*orCHpijf_4Az1U6IbPX0gQ.jpeg 828w, https://miro.medium.com/v2/resize:fit:1100/1*orCHpijf_4Az1U6IbPX0gQ.jpeg 1100w, https://miro.medium.com/v2/resize:fit:1400/1*orCHpijf_4Az1U6IbPX0gQ.jpeg 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="" class="bh me oj c" width="700" height="367" loading="eager" role="presentation"/></picture></div></div></figure><p id="8b29" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">Hi, I’m Mitja Bezenšek, the Principal Lead Software Engineer in the backend department. I’m the kind of person who finds pleasure in both coding and playing in the fascinating world of infrastructure — all to keep things engaging and exciting. In this post, I’d like to delve into one of my favorite topics that bridges the gap between infrastructure and code — continuous deployment pipelines.</p><p id="a725" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">The story starts with “<a class="af ok" href="https://itrevolution.com/product/the-phoenix-project/" rel="noopener ugc nofollow" target="_blank">The Phoenix Project</a>”, a book I couldn’t put down — a must read for anyone in tech. The book explores various aspects of DevOps culture and practices, including the importance of automating and streamlining the deployment process to achieve faster and more reliable software delivery. In this blog post, we’ll dive into our journey of automating deployments for our flagship backend app. It got me wondering: could we achieve similar results through automation?</p><h1 id="cd17" class="ol om gu bf on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi bk">The Journey</h1><p id="5e61" class="pw-post-body-paragraph mx my gu mz b na pj nc nd ne pk ng nh ni pl nk nl nm pm no np nq pn ns nt nu gn bk">Although our team had already adopted many DevOps principles, there was still plenty of room for improvement, especially when it came to our deployment pipelines. At the time, we were using DevOps practices such as semi-automated deployments, CI pipelines triggered on git pushes, unit and integration tests, and Slack notifications for deployments and test failures. Our deployment process worked for us, but we saw the potential for even greater automation.</p><h1 id="d86b" class="ol om gu bf on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi bk">The Traditional Deployment Dance</h1><p id="88c6" class="pw-post-body-paragraph mx my gu mz b na pj nc nd ne pk ng nh ni pl nk nl nm pm no np nq pn ns nt nu gn bk">Our traditional deployment was doing everything by hand by a single person on the team. The person followed the guide with these steps:</p><ol class=""><li id="b0ae" class="mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu po pp pq bk">Daily at 1 PM, whoever was on-call (let’s call them “deployer”) would shout out “Last call for deploy” on Slack.</li><li id="bfdc" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu po pp pq bk">Developers who haven’t merged yet, but wanted to deploy, then rushed to complete their tasks and code reviews all sweating under time pressure.</li><li id="fdb7" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu po pp pq bk">After tasks were collected the deployer initiated a deployment process using an interactive pipeline.</li><li id="a630" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu po pp pq bk">The pipeline presented the deployer with a number of options, including which modules to deploy, whether to do traffic splitting, end-to-end testing preferences etc.</li><li id="f76a" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu po pp pq bk">The pipeline built the application, ran the tests, deployed a new version of the app (without user traffic), and ran pre-production end-to-end tests on it.</li><li id="0777" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu po pp pq bk">After test runs completed the deployer had a chance to move some user traffic to the new version and manually inspect application logs and metrics for any errors before migrating all user traffic.</li><li id="dddc" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu po pp pq bk">In the end, a full end-to-end test suite was executed to identify any remaining corner case bugs.</li></ol><p id="2c8b" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">Steps are depicted in the following diagram:</p><figure class="nz oa ob oc od oe nw nx paragraph-image"><div role="button" tabindex="0" class="of og fj oh bh oi"><div class="nw nx pw"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*pst4mcU8cvJ9RV7i 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*pst4mcU8cvJ9RV7i 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*pst4mcU8cvJ9RV7i 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*pst4mcU8cvJ9RV7i 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*pst4mcU8cvJ9RV7i 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*pst4mcU8cvJ9RV7i 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*pst4mcU8cvJ9RV7i 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/0*pst4mcU8cvJ9RV7i 640w, https://miro.medium.com/v2/resize:fit:720/0*pst4mcU8cvJ9RV7i 720w, https://miro.medium.com/v2/resize:fit:750/0*pst4mcU8cvJ9RV7i 750w, https://miro.medium.com/v2/resize:fit:786/0*pst4mcU8cvJ9RV7i 786w, https://miro.medium.com/v2/resize:fit:828/0*pst4mcU8cvJ9RV7i 828w, https://miro.medium.com/v2/resize:fit:1100/0*pst4mcU8cvJ9RV7i 1100w, https://miro.medium.com/v2/resize:fit:1400/0*pst4mcU8cvJ9RV7i 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="" class="bh me oj c" width="700" height="300" loading="lazy" role="presentation"/></picture></div></div><figcaption class="px ff py nw nx pz qa bf b bg z du">Manual deployment pipeline steps</figcaption></figure><p id="c18f" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">Let’s now take a look why this process was problematic:</p><ul class=""><li id="a9a5" class="mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu qb pp pq bk">The daily “Last call for deploy” announcement added stress to developers, including both task owners and code reviewers.</li><li id="a512" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu qb pp pq bk">Deployments often faced delays, with deployers frequently waiting until the end of their shift for all code reviews to wrap up. Some deployers even resorted to funny, but somewhat annoying, messages to push for deployments. 🙂</li><li id="2e26" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu qb pp pq bk">The error checking process during the traffic split stage was not only tedious but also repetitive and error-prone.</li><li id="7c8f" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu qb pp pq bk">Interestingly, it was the deployer, not the developer, who conducted error checks. In essence, the deployer played the role of Ops, while the developer remained in the Dev role. You can see where I’m going with this. Clearly this is not DevOps.</li></ul><p id="30eb" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">It became clear that we should do something. Relieve the deployers from manual tasks, reduce stress in the team, and enhance the reliability of the deployment process through automation. We had a strong belief that we could accomplish this, given that a majority of the deployment steps were already automated within our semi-automatic pipeline.</p><h1 id="2f3e" class="ol om gu bf on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi bk">Embracing CD 💿 (Continuous Deployment)</h1><p id="6fd8" class="pw-post-body-paragraph mx my gu mz b na pj nc nd ne pk ng nh ni pl nk nl nm pm no np nq pn ns nt nu gn bk">The idea was simple: automate the entire deployment process and implement continuous deployment with a canary rollout update strategy. Basically the same process as depicted in the diagram above but fully automated.</p><figure class="nz oa ob oc od oe nw nx paragraph-image"><div class="nw nx qc"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*1lmdGyuNwHGaX9P2 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*1lmdGyuNwHGaX9P2 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*1lmdGyuNwHGaX9P2 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*1lmdGyuNwHGaX9P2 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*1lmdGyuNwHGaX9P2 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*1lmdGyuNwHGaX9P2 1100w, https://miro.medium.com/v2/resize:fit:1334/format:webp/0*1lmdGyuNwHGaX9P2 1334w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 667px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/0*1lmdGyuNwHGaX9P2 640w, https://miro.medium.com/v2/resize:fit:720/0*1lmdGyuNwHGaX9P2 720w, https://miro.medium.com/v2/resize:fit:750/0*1lmdGyuNwHGaX9P2 750w, https://miro.medium.com/v2/resize:fit:786/0*1lmdGyuNwHGaX9P2 786w, https://miro.medium.com/v2/resize:fit:828/0*1lmdGyuNwHGaX9P2 828w, https://miro.medium.com/v2/resize:fit:1100/0*1lmdGyuNwHGaX9P2 1100w, https://miro.medium.com/v2/resize:fit:1334/0*1lmdGyuNwHGaX9P2 1334w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 667px"/><img alt="" class="bh me oj c" width="667" height="231" loading="lazy" role="presentation"/></picture></div><figcaption class="px ff py nw nx pz qa bf b bg z du">Continuous deployment high level idea</figcaption></figure><p id="3796" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">The feature would go to production as soon as the developer would merge it into the main branch (for those who might be particular, we were using gitflow, so technically, it was the develop branch). So, we embarked on our CD journey, hoping for numerous benefits:</p><ul class=""><li id="d9ec" class="mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu qb pp pq bk">Agility: Faster feature delivery with minimal process overhead.</li><li id="41be" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu qb pp pq bk">Ownership: Developers, being familiar with their code, became the primary owners responsible for taking features to production.</li><li id="d0fe" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu qb pp pq bk">Streamlined Deployments: By deploying only one feature at a time, we reduced complexity and made debugging easier through isolated changes.</li><li id="d6fb" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu qb pp pq bk">Accelerated Deployments: The elimination of waiting periods, or what I like to call “human I/O”.</li><li id="a3e1" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu qb pp pq bk">Improved Reliability: A more robust and resilient automated pipeline compared to manual deployments.</li></ul><p id="77e9" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">Fortunately, our existing culture and way of working provided us with a good head start:</p><ul class=""><li id="7cda" class="mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu qb pp pq bk">Frequent Deployments: It wasn’t unusual for us to have deployments beyond the scheduled 1 PM slot, particularly when urgent bug fixes came up.</li><li id="7860" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu qb pp pq bk">Robust Testing: There were already automated tests with a high degree of confidence. Not to mention that features were also tested by QA in staging environments.</li><li id="0166" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu qb pp pq bk">Monitoring: Backend applications were monitored with countless metrics and an on-call rotation process was in place.</li><li id="9ae9" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu qb pp pq bk">Ownership: Embracing the “build it, you run it” principle, the developers were already responsible for their features after they hit production.</li></ul><h1 id="efed" class="ol om gu bf on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi bk">Challenges</h1><p id="d95c" class="pw-post-body-paragraph mx my gu mz b na pj nc nd ne pk ng nh ni pl nk nl nm pm no np nq pn ns nt nu gn bk">While CD seemed like a natural fit, it was not without its challenges:</p><ul class=""><li id="aedd" class="mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu qb pp pq bk">Distributed Monolith: Our application is a monolith Java application consisting of multiple RESTful modules, where each module depends on the same common code. This often made it difficult to determine which modules required deployment when changes were made in the common code. So usually we would just deploy all of them.</li><li id="a127" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu qb pp pq bk">Deploy Time: Because there were 24 modules in total it took a while to deploy all of them.</li><li id="5c46" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu qb pp pq bk">Deployment Monitoring: The responsibility of the deployer included manually checking logs and metrics for errors. How do we automate this?</li><li id="ad8d" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu qb pp pq bk">Contingency Plans: We needed a strategy for handling errors during deployment.</li></ul><h1 id="3b66" class="ol om gu bf on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi bk">Deploy times</h1><p id="77d5" class="pw-post-body-paragraph mx my gu mz b na pj nc nd ne pk ng nh ni pl nk nl nm pm no np nq pn ns nt nu gn bk">Addressing the deployment time was relatively straightforward. As mentioned earlier our application isn’t a conventional monolith; instead, it’s a collection of REST modules. By using the power of multi-threading, we were able to deploy these modules in parallel, resulting in a significant reduction in deployment time. This approach proved effective, as long as we had sufficient internet bandwidth and enough memory in the CD pipeline (not a problem because we run our CI/CD pipeline in the cloud).</p><p id="6e2a" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">In our initial proof of concept, we found that a complete deployment would take 30 minutes. While this duration was acceptable for deploying a monolith, we wondered if it would be too much for deploying just a single feature (especially considering that we were previously deploying batches of features). To gain a better understanding of the duration, let’s list the steps of the CD deployment pipeline with their duration:</p><ul class=""><li id="fe65" class="mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu qb pp pq bk">Build and run unit tests: 5 minutes</li><li id="fbe1" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu qb pp pq bk">Deploy canary version with 0% traffic: 5 minutes</li><li id="bd62" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu qb pp pq bk">Pre-production tests on the canary version: 10 minutes</li><li id="19ff" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu qb pp pq bk">Canary deployment with traffic split steps 1%, 5%, 15%, 25%: 10 minutes</li></ul><p id="e1f3" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">That’s a total duration of 30 minutes!</p><p id="2b3f" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">To keep it short, although we initially had concerns about the 30 minute deployment duration, we decided to go on and address any issues later on. As it turned out, the 30-minute timeframe turned out just fine.</p><h1 id="f0ce" class="ol om gu bf on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi bk">Error detection and monitoring</h1><p id="3c36" class="pw-post-body-paragraph mx my gu mz b na pj nc nd ne pk ng nh ni pl nk nl nm pm no np nq pn ns nt nu gn bk">In order to avoid catastrophes, there are several safeguards implemented:</p><ul class=""><li id="dd40" class="mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu qb pp pq bk"><strong class="mz gv">Extensive Unit Testing</strong>: A strong culture of writing unit tests for every code component ensures unit tests are executed during every build deployment step, including pull requests.</li><li id="eb8b" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu qb pp pq bk"><strong class="mz gv">Pre-Production Integration Tests</strong>: Before migrating traffic to the canary version, we run a series of short integration tests to validate the core functionalities.</li><li id="0a78" class="mx my gu mz b na pr nc nd ne ps ng nh ni pt nk nl nm pu no np nq pv ns nt nu qb pp pq bk"><strong class="mz gv">Canary Deployment Strategy</strong>: Gradual migration of production traffic allows for monitoring the error rate. In case error counts surges during the canary step, the deployment pipeline automatically reverts traffic to the previous version.</li></ul><figure class="nz oa ob oc od oe nw nx paragraph-image"><div class="nw nx qc"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*14mwpSjale5GaQMx 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*14mwpSjale5GaQMx 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*14mwpSjale5GaQMx 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*14mwpSjale5GaQMx 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*14mwpSjale5GaQMx 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*14mwpSjale5GaQMx 1100w, https://miro.medium.com/v2/resize:fit:1334/format:webp/0*14mwpSjale5GaQMx 1334w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 667px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/0*14mwpSjale5GaQMx 640w, https://miro.medium.com/v2/resize:fit:720/0*14mwpSjale5GaQMx 720w, https://miro.medium.com/v2/resize:fit:750/0*14mwpSjale5GaQMx 750w, https://miro.medium.com/v2/resize:fit:786/0*14mwpSjale5GaQMx 786w, https://miro.medium.com/v2/resize:fit:828/0*14mwpSjale5GaQMx 828w, https://miro.medium.com/v2/resize:fit:1100/0*14mwpSjale5GaQMx 1100w, https://miro.medium.com/v2/resize:fit:1334/0*14mwpSjale5GaQMx 1334w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 667px"/><img alt="" class="bh me oj c" width="667" height="231" loading="lazy" role="presentation"/></picture></div><figcaption class="px ff py nw nx pz qa bf b bg z du">Error detection notification</figcaption></figure><p id="b07c" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">All of these steps drastically reduce the chance of errors.</p><h1 id="8455" class="ol om gu bf on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi bk">SlackOps</h1><p id="feb0" class="pw-post-body-paragraph mx my gu mz b na pj nc nd ne pk ng nh ni pl nk nl nm pm no np nq pn ns nt nu gn bk">We heavily utilize Slack for our communication and transparency. When a feature is merged into the main branch, a message appears on our Slack channels, announcing an ongoing deployment, complete with a detailed change log. We ensure to tag the developer who authored the feature, keeping them informed about the progress. Every step of the pipeline is documented on Slack.</p><figure class="nz oa ob oc od oe nw nx paragraph-image"><div class="nw nx qc"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*6nj6O2xKQb8JSjZ8 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*6nj6O2xKQb8JSjZ8 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*6nj6O2xKQb8JSjZ8 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*6nj6O2xKQb8JSjZ8 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*6nj6O2xKQb8JSjZ8 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*6nj6O2xKQb8JSjZ8 1100w, https://miro.medium.com/v2/resize:fit:1334/format:webp/0*6nj6O2xKQb8JSjZ8 1334w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 667px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/0*6nj6O2xKQb8JSjZ8 640w, https://miro.medium.com/v2/resize:fit:720/0*6nj6O2xKQb8JSjZ8 720w, https://miro.medium.com/v2/resize:fit:750/0*6nj6O2xKQb8JSjZ8 750w, https://miro.medium.com/v2/resize:fit:786/0*6nj6O2xKQb8JSjZ8 786w, https://miro.medium.com/v2/resize:fit:828/0*6nj6O2xKQb8JSjZ8 828w, https://miro.medium.com/v2/resize:fit:1100/0*6nj6O2xKQb8JSjZ8 1100w, https://miro.medium.com/v2/resize:fit:1334/0*6nj6O2xKQb8JSjZ8 1334w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 667px"/><img alt="" class="bh me oj c" width="667" height="231" loading="lazy" role="presentation"/></picture></div><figcaption class="px ff py nw nx pz qa bf b bg z du">Deployment progress notifications</figcaption></figure><p id="be2f" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">Once the deployment successfully concludes the change is posted on our company-wide change log Slack channel. This approach improves transparency and ensures that everyone in the organization has visibility into the ongoing changes.</p><figure class="nz oa ob oc od oe nw nx paragraph-image"><div class="nw nx qc"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*2-kGv5WuS9s1HFMk 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*2-kGv5WuS9s1HFMk 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*2-kGv5WuS9s1HFMk 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*2-kGv5WuS9s1HFMk 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*2-kGv5WuS9s1HFMk 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*2-kGv5WuS9s1HFMk 1100w, https://miro.medium.com/v2/resize:fit:1334/format:webp/0*2-kGv5WuS9s1HFMk 1334w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 667px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/0*2-kGv5WuS9s1HFMk 640w, https://miro.medium.com/v2/resize:fit:720/0*2-kGv5WuS9s1HFMk 720w, https://miro.medium.com/v2/resize:fit:750/0*2-kGv5WuS9s1HFMk 750w, https://miro.medium.com/v2/resize:fit:786/0*2-kGv5WuS9s1HFMk 786w, https://miro.medium.com/v2/resize:fit:828/0*2-kGv5WuS9s1HFMk 828w, https://miro.medium.com/v2/resize:fit:1100/0*2-kGv5WuS9s1HFMk 1100w, https://miro.medium.com/v2/resize:fit:1334/0*2-kGv5WuS9s1HFMk 1334w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 667px"/><img alt="" class="bh me oj c" width="667" height="231" loading="lazy" role="presentation"/></picture></div><figcaption class="px ff py nw nx pz qa bf b bg z du">Change log notifications</figcaption></figure><h1 id="6388" class="ol om gu bf on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi bk">Making Deployments Fun</h1><p id="7a97" class="pw-post-body-paragraph mx my gu mz b na pj nc nd ne pk ng nh ni pl nk nl nm pm no np nq pn ns nt nu gn bk">It might seem unconventional, but that’s exactly what we did. Fun has always been at the core of our company. Even during the time of manual deployments, we made it a point to play music while deploying. This served 2 purposes: it notified everyone in the office that a deployment was underway, but it also brought a fun component into the process. We deliberately chose catchy and unconventional songs to lighten the atmosphere during what used to be a tense moment (a production deployment). So, we took the final step in our journey by automating the process of playing music during deployments. The task was truly exciting, involving coding a Slack bot, installing it on a Raspberry Pi, and setting up some speakers.</p><figure class="nz oa ob oc od oe nw nx paragraph-image"><div role="button" tabindex="0" class="of og fj oh bh oi"><div class="nw nx pw"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*UFZWUDY9t2NuAFu7 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*UFZWUDY9t2NuAFu7 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*UFZWUDY9t2NuAFu7 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*UFZWUDY9t2NuAFu7 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*UFZWUDY9t2NuAFu7 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*UFZWUDY9t2NuAFu7 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*UFZWUDY9t2NuAFu7 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/0*UFZWUDY9t2NuAFu7 640w, https://miro.medium.com/v2/resize:fit:720/0*UFZWUDY9t2NuAFu7 720w, https://miro.medium.com/v2/resize:fit:750/0*UFZWUDY9t2NuAFu7 750w, https://miro.medium.com/v2/resize:fit:786/0*UFZWUDY9t2NuAFu7 786w, https://miro.medium.com/v2/resize:fit:828/0*UFZWUDY9t2NuAFu7 828w, https://miro.medium.com/v2/resize:fit:1100/0*UFZWUDY9t2NuAFu7 1100w, https://miro.medium.com/v2/resize:fit:1400/0*UFZWUDY9t2NuAFu7 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="" class="bh me oj c" width="700" height="496" loading="lazy" role="presentation"/></picture></div></div><figcaption class="px ff py nw nx pz qa bf b bg z du">Raspberry PI in action playing some music</figcaption></figure><h1 id="9c7f" class="ol om gu bf on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi bk">Wrapping up</h1><p id="9bff" class="pw-post-body-paragraph mx my gu mz b na pj nc nd ne pk ng nh ni pl nk nl nm pm no np nq pn ns nt nu gn bk">SlackOps and the music player were the last pieces in the puzzle. With the promise of each developer deploying independently without unnecessary waiting became a reality. Our team was able to truly embrace the “build it, you run it” principle, where developers can now fully own their features in production. And from this point onward, we never looked back.</p><p id="4bee" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">Our deployment pipeline has truly stood the test of time. It has evolved and improved over the years. It’s gone through bug fixes, numerous improvements, and even undergoing platform migrations to ensure we keep on using latest&greatest technologies.</p><p id="2a38" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">So what started as an idea inspired by the “The Phoenix Project” book came to life! Witnessing the successful automation of deployments was not only gratifying but also a reflection of our genuine DevOps culture.</p></div></div></div></div></section></div></div></article></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="qd qe ab ja"><div class="qf ab"><a class="qg ay am ao" rel="noopener follow" href="/tag/devops?source=post_page-----1a44213a12bf--------------------------------"><div class="qh fj cx qi ge qj qk bf b bg z bk ql">DevOps</div></a></div><div class="qf ab"><a class="qg ay am ao" rel="noopener follow" href="/tag/continuous-deployment?source=post_page-----1a44213a12bf--------------------------------"><div class="qh fj cx qi ge qj qk bf b bg z bk ql">Continuous Deployment</div></a></div><div class="qf ab"><a class="qg ay am ao" rel="noopener follow" href="/tag/continuous-delivery?source=post_page-----1a44213a12bf--------------------------------"><div class="qh fj cx qi ge qj qk bf b bg z bk ql">Continuous Delivery</div></a></div><div class="qf ab"><a class="qg ay am ao" rel="noopener follow" href="/tag/cloud?source=post_page-----1a44213a12bf--------------------------------"><div class="qh fj cx qi ge qj qk bf b bg z bk ql">Cloud</div></a></div><div class="qf ab"><a class="qg ay am ao" rel="noopener follow" href="/tag/continuous-integration?source=post_page-----1a44213a12bf--------------------------------"><div class="qh fj cx qi ge qj qk bf b bg z bk ql">Continuous Integration</div></a></div></div></div></div><div class="l"></div><footer class="qm qn qo qp qq qr qs qt qu ab q qv ik c"><div class="l ae"><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ab cp qw"><div class="ab q kv"><div class="qx l"><span class="l qy qz ra e d"><div class="ab q kv kw"><div class="pw-multi-vote-icon fj je kx ky kz"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerClapButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Foutfit7%2F1a44213a12bf&operation=register&redirect=https%3A%2F%2Fmedium.com%2Foutfit7%2Fcracking-the-monolith-a-journey-to-continuous-deployment-1a44213a12bf&user=Mitja+Bezen%C5%A1ek&userId=95ecd7ef38ba&source=---footer_actions--1a44213a12bf---------------------clap_footer-----------"><div><div class="bm" aria-hidden="false"><div class="la ao lb lc ld le am lf lg lh kz"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l li lj lk ll lm ln lo"><p class="bf b dv z du"><span class="lp">--</span></p></div></div></span><span class="l h g f rb rc"><div class="ab q kv kw"><div class="pw-multi-vote-icon fj je kx ky kz"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerClapButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Foutfit7%2F1a44213a12bf&operation=register&redirect=https%3A%2F%2Fmedium.com%2Foutfit7%2Fcracking-the-monolith-a-journey-to-continuous-deployment-1a44213a12bf&user=Mitja+Bezen%C5%A1ek&userId=95ecd7ef38ba&source=---footer_actions--1a44213a12bf---------------------clap_footer-----------"><div><div class="bm" aria-hidden="false"><div class="la ao lb lc ld le am lf lg lh kz"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l li lj lk ll lm ln lo"><p class="bf b dv z du"><span class="lp">--</span></p></div></div></span></div><div class="bq ab"><div><div class="bm" aria-hidden="false"><button class="ao la ls lt ab q fk lu lv" aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="lr"><path d="M18.006 16.803c1.533-1.456 2.234-3.325 2.234-5.321C20.24 7.357 16.709 4 12.191 4S4 7.357 4 11.482c0 4.126 3.674 7.482 8.191 7.482.817 0 1.622-.111 2.393-.327.231.2.48.391.744.559 1.06.693 2.203 1.044 3.399 1.044.224-.008.4-.112.486-.287a.49.49 0 0 0-.042-.518c-.495-.67-.845-1.364-1.04-2.057a4 4 0 0 1-.125-.598zm-3.122 1.055-.067-.223-.315.096a8 8 0 0 1-2.311.338c-4.023 0-7.292-2.955-7.292-6.587 0-3.633 3.269-6.588 7.292-6.588 4.014 0 7.112 2.958 7.112 6.593 0 1.794-.608 3.469-2.027 4.72l-.195.168v.255c0 .056 0 .151.016.295.025.231.081.478.154.733.154.558.398 1.117.722 1.659a5.3 5.3 0 0 1-2.165-.845c-.276-.176-.714-.383-.941-.59z"></path></svg><p class="bf b bg z du"><span class="pw-responses-count lq lr">1</span></p></button></div></div></div></div><div class="ab q"><div class="rd l ix"><div><div class="bm" aria-hidden="false"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerBookmarkButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fbookmark%2Fp%2F1a44213a12bf&operation=register&redirect=https%3A%2F%2Fmedium.com%2Foutfit7%2Fcracking-the-monolith-a-journey-to-continuous-deployment-1a44213a12bf&source=---footer_actions--1a44213a12bf---------------------bookmark_footer-----------"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="none" viewBox="0 0 25 25" class="du lx" aria-label="Add to list bookmark button"><path fill="currentColor" d="M18 2.5a.5.5 0 0 1 1 0V5h2.5a.5.5 0 0 1 0 1H19v2.5a.5.5 0 1 1-1 0V6h-2.5a.5.5 0 0 1 0-1H18zM7 7a1 1 0 0 1 1-1h3.5a.5.5 0 0 0 0-1H8a2 2 0 0 0-2 2v14a.5.5 0 0 0 .805.396L12.5 17l5.695 4.396A.5.5 0 0 0 19 21v-8.5a.5.5 0 0 0-1 0v7.485l-5.195-4.012a.5.5 0 0 0-.61 0L7 19.985z"></path></svg></a></span></div></div></div><div class="rd l ix"><div class="bm" aria-hidden="false" aria-describedby="postFooterSocialMenu" aria-labelledby="postFooterSocialMenu"><div><div class="bm" aria-hidden="false"><button aria-controls="postFooterSocialMenu" aria-expanded="false" aria-label="Share Post" data-testid="footerSocialShareButton" class="af fk ah ai aj ak al mf an ao ap ex mg mh lv mi"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M15.218 4.931a.4.4 0 0 1-.118.132l.012.006a.45.45 0 0 1-.292.074.5.5 0 0 1-.3-.13l-2.02-2.02v7.07c0 .28-.23.5-.5.5s-.5-.22-.5-.5v-7.04l-2 2a.45.45 0 0 1-.57.04h-.02a.4.4 0 0 1-.16-.3.4.4 0 0 1 .1-.32l2.8-2.8a.5.5 0 0 1 .7 0l2.8 2.79a.42.42 0 0 1 .068.498m-.106.138.008.004v-.01zM16 7.063h1.5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-11c-1.1 0-2-.9-2-2v-10a2 2 0 0 1 2-2H8a.5.5 0 0 1 .35.15.5.5 0 0 1 .15.35.5.5 0 0 1-.15.35.5.5 0 0 1-.35.15H6.4c-.5 0-.9.4-.9.9v10.2a.9.9 0 0 0 .9.9h11.2c.5 0 .9-.4.9-.9v-10.2c0-.5-.4-.9-.9-.9H16a.5.5 0 0 1 0-1" clip-rule="evenodd"></path></svg></button></div></div></div></div></div></div></div></div></div></footer><div class="re rf rg rh ri l bx"><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="rj l"><div class="ab rk rl rm iz iy"><div class="rn ro rp rq rr rs rt ru rv rw ab cp"><div class="h k"><a href="https://medium.com/outfit7?source=post_page---post_publication_info--1a44213a12bf--------------------------------" rel="noopener follow"><div class="fj ab"><img alt="Outfit7" class="rx ib ic cx" src="https://miro.medium.com/v2/resize:fill:96:96/1*dCIQWfMya9g57UUL2ZzrJQ.png" width="48" height="48" loading="lazy"/><div class="rx l ic ib fs n fr ry"></div></div></a></div><div class="j i d"><a href="https://medium.com/outfit7?source=post_page---post_publication_info--1a44213a12bf--------------------------------" rel="noopener follow"><div class="fj ab"><img alt="Outfit7" class="rx sa rz cx" src="https://miro.medium.com/v2/resize:fill:128:128/1*dCIQWfMya9g57UUL2ZzrJQ.png" width="64" height="64" loading="lazy"/><div class="rx l rz sa fs n fr ry"></div></div></a></div><div class="j i d sb ix"><div class="ab"></div></div></div><div class="ab co sc"><div class="sd se sf sg sh l"><a class="af ag ah aj ak al am an ao ap aq ar as at ab q" href="https://medium.com/outfit7?source=post_page---post_publication_info--1a44213a12bf--------------------------------" rel="noopener follow"><h2 class="pw-author-name bf sj sk sl sm sn so sp ni sq sr nm ss st nq su sv bk"><span class="gn si">Published in <!-- -->Outfit7</span></h2></a><div class="qf ab ia"><div class="l ix"><span class="pw-follower-count bf b bg z du"><a class="af ag ah ai aj ak al am an ao ap aq ar iq" rel="noopener follow" href="/outfit7/followers?source=post_page---post_publication_info--1a44213a12bf--------------------------------">53 Followers</a></span></div><div class="bf b bg z du ab jd"><span class="ir l" aria-hidden="true"><span class="bf b bg z du">·</span></span><a class="af ag ah ai aj ak al am an ao ap aq ar iq" rel="noopener follow" href="/outfit7/new-home-for-outfit7-tech-articles-b317a75e1447?source=post_page---post_publication_info--1a44213a12bf--------------------------------">Last published <span>Sep 26, 2024</span></a></div></div><div class="sw l"><p class="bf b bg z bk"><span class="gn">The inside scoop on development, engineering & tech innovation @ Outfit7.</span></p></div></div></div><div class="h k"><div class="ab"></div></div></div></div><div class="ab rk rl rm iz iy"><div class="rn ro rp rq rr rs rt ru rv rw ab cp"><div class="h k"><a tabindex="0" rel="noopener follow" href="/@mitja.bezensek_98237?source=post_page---post_author_info--1a44213a12bf--------------------------------"><div class="l fj"><img alt="Mitja Bezenšek" class="l fd by ic ib cx" src="https://miro.medium.com/v2/resize:fill:96:96/0*3VkJ01vMUfVDBJYX.jpg" width="48" height="48" loading="lazy"/><div class="fr by l ic ib fs n ay ry"></div></div></a></div><div class="j i d"><a tabindex="0" rel="noopener follow" href="/@mitja.bezensek_98237?source=post_page---post_author_info--1a44213a12bf--------------------------------"><div class="l fj"><img alt="Mitja Bezenšek" class="l fd by rz sa cx" src="https://miro.medium.com/v2/resize:fill:128:128/0*3VkJ01vMUfVDBJYX.jpg" width="64" height="64" loading="lazy"/><div class="fr by l rz sa fs n ay ry"></div></div></a></div><div class="j i d sb ix"><div class="ab"><span><button class="bf b bg z sx qh sy sz ta tb tc ev ew td te tf fa fb fc fd bm fe ff">Follow</button></span></div></div></div><div class="ab co sc"><div class="sd se sf sg sh l"><a class="af ag ah aj ak al am an ao ap aq ar as at ab q" rel="noopener follow" href="/@mitja.bezensek_98237?source=post_page---post_author_info--1a44213a12bf--------------------------------"><h2 class="pw-author-name bf sj sk sl sm sn so sp ni sq sr nm ss st nq su sv bk"><span class="gn si">Written by <!-- -->Mitja Bezenšek</span></h2></a><div class="qf ab ia"><div class="l ix"><span class="pw-follower-count bf b bg z du"><a class="af ag ah ai aj ak al am an ao ap aq ar iq" rel="noopener follow" href="/@mitja.bezensek_98237/followers?source=post_page---post_author_info--1a44213a12bf--------------------------------">1 Follower</a></span></div><div class="bf b bg z du ab jd"><span class="ir l" aria-hidden="true"><span class="bf b bg z du">·</span></span><a class="af ag ah ai aj ak al am an ao ap aq ar iq" rel="noopener follow" href="/@mitja.bezensek_98237/following?source=post_page---post_author_info--1a44213a12bf--------------------------------">1 Following</a></div></div><div class="sw l"></div></div></div><div class="h k"><div class="ab"><span><button class="bf b bg z sx qh sy sz ta tb tc ev ew td te tf fa fb fc fd bm fe ff">Follow</button></span></div></div></div><div class="tg bh th ti"></div></div></div><div class="h k j"><div class="tg bh th tj"></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="tk ab kv ja"><div class="tl tm l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://help.medium.com/hc/en-us?source=post_page-----1a44213a12bf--------------------------------" rel="noopener follow"><p class="bf b dv z du">Help</p></a></div><div class="tl tm l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://medium.statuspage.io/?source=post_page-----1a44213a12bf--------------------------------" rel="noopener follow"><p class="bf b dv z du">Status</p></a></div><div class="tl tm l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow" href="/about?autoplay=1&source=post_page-----1a44213a12bf--------------------------------"><p class="bf b dv z du">About</p></a></div><div class="tl tm l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow" href="/jobs-at-medium/work-at-medium-959d1a85284e?source=post_page-----1a44213a12bf--------------------------------"><p class="bf b dv z du">Careers</p></a></div><div class="tl tm l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="pressinquiries@medium.com?source=post_page-----1a44213a12bf--------------------------------" rel="noopener follow"><p class="bf b dv z du">Press</p></a></div><div class="tl tm l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://blog.medium.com/?source=post_page-----1a44213a12bf--------------------------------" rel="noopener follow"><p class="bf b dv z du">Blog</p></a></div><div class="tl tm l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://policy.medium.com/medium-privacy-policy-f03bf92035c9?source=post_page-----1a44213a12bf--------------------------------" rel="noopener follow"><p class="bf b dv z du">Privacy</p></a></div><div class="tl tm l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://policy.medium.com/medium-terms-of-service-9db0094a1e0f?source=post_page-----1a44213a12bf--------------------------------" rel="noopener follow"><p class="bf b dv z du">Terms</p></a></div><div class="tl tm l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://speechify.com/medium?source=post_page-----1a44213a12bf--------------------------------" rel="noopener follow"><p class="bf b dv z du">Text to speech</p></a></div><div class="tl l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow" href="/business?source=post_page-----1a44213a12bf--------------------------------"><p class="bf b dv z du">Teams</p></a></div></div></div></div></div></div></div></div></div></div><script>window.__BUILD_ID__="main-20241126-181518-0cb59a020f"</script><script>window.__GRAPHQL_URI__ = "https://medium.com/_/graphql"</script><script>window.__PRELOADED_STATE__ = {"algolia":{"queries":{}},"cache":{"experimentGroupSet":true,"reason":"","group":"enabled","tags":["group-edgeCachePosts","post-1a44213a12bf","user-95ecd7ef38ba","collection-6ec626d5ad62"],"serverVariantState":"44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a","middlewareEnabled":true,"cacheStatus":"DYNAMIC","shouldUseCache":true,"vary":[],"lohpSummerUpsellEnabled":false,"publicationHierarchyEnabledWeb":false,"postBottomResponsesEnabled":false},"client":{"hydrated":false,"isUs":false,"isNativeMedium":false,"isSafariMobile":false,"isSafari":false,"isFirefox":false,"routingEntity":{"type":"DEFAULT","explicit":false},"viewerIsBot":false},"debug":{"requestId":"25a6ed79-38a9-4272-962e-1a2e738ed46e","hybridDevServices":[],"originalSpanCarrier":{"traceparent":"00-ed3e2e0c308d44a829466e8ada5b5593-43670a052d962abd-01"}},"multiVote":{"clapsPerPost":{}},"navigation":{"branch":{"show":null,"hasRendered":null,"blockedByCTA":false},"hideGoogleOneTap":false,"hasRenderedAlternateUserBanner":null,"currentLocation":"https:\u002F\u002Fmedium.com\u002Foutfit7\u002Fcracking-the-monolith-a-journey-to-continuous-deployment-1a44213a12bf","host":"medium.com","hostname":"medium.com","referrer":"","hasSetReferrer":false,"susiModal":{"step":null,"operation":"register"},"postRead":false,"partnerProgram":{"selectedCountryCode":null},"queryString":"","currentHash":""},"config":{"nodeEnv":"production","version":"main-20241126-181518-0cb59a020f","target":"production","productName":"Medium","publicUrl":"https:\u002F\u002Fcdn-client.medium.com\u002Flite","authDomain":"medium.com","authGoogleClientId":"216296035834-k1k6qe060s2tp2a2jam4ljdcms00sttg.apps.googleusercontent.com","favicon":"production","glyphUrl":"https:\u002F\u002Fglyph.medium.com","branchKey":"key_live_ofxXr2qTrrU9NqURK8ZwEhknBxiI6KBm","algolia":{"appId":"MQ57UUUQZ2","apiKeySearch":"394474ced050e3911ae2249ecc774921","indexPrefix":"medium_","host":"-dsn.algolia.net"},"recaptchaKey":"6Lfc37IUAAAAAKGGtC6rLS13R1Hrw_BqADfS1LRk","recaptcha3Key":"6Lf8R9wUAAAAABMI_85Wb8melS7Zj6ziuf99Yot5","recaptchaEnterpriseKeyId":"6Le-uGgpAAAAAPprRaokM8AKthQ9KNGdoxaGUvVp","datadog":{"applicationId":"6702d87d-a7e0-42fe-bbcb-95b469547ea0","clientToken":"pub853ea8d17ad6821d9f8f11861d23dfed","rumToken":"pubf9cc52896502b9413b68ba36fc0c7162","context":{"deployment":{"target":"production","tag":"main-20241126-181518-0cb59a020f","commit":"0cb59a020f4453d0900f671f1a6576feecc55e74"}},"datacenter":"us"},"googleAnalyticsCode":"G-7JY7T788PK","googlePay":{"apiVersion":"2","apiVersionMinor":"0","merchantId":"BCR2DN6TV7EMTGBM","merchantName":"Medium","instanceMerchantId":"13685562959212738550"},"applePay":{"version":3},"signInWallCustomDomainCollectionIds":["3a8144eabfe3","336d898217ee","61061eb0c96b","138adf9c44c","819cc2aaeee0"],"mediumMastodonDomainName":"me.dm","mediumOwnedAndOperatedCollectionIds":["8a9336e5bb4","b7e45b22fec3","193b68bd4fba","8d6b8a439e32","54c98c43354d","3f6ecf56618","d944778ce714","92d2092dc598","ae2a65f35510","1285ba81cada","544c7006046e","fc8964313712","40187e704f1c","88d9857e584e","7b6769f2748b","bcc38c8f6edf","cef6983b292","cb8577c9149e","444d13b52878","713d7dbc99b0","ef8e90590e66","191186aaafa0","55760f21cdc5","9dc80918cc93","bdc4052bbdba","8ccfed20cbb2"],"tierOneDomains":["medium.com","thebolditalic.com","arcdigital.media","towardsdatascience.com","uxdesign.cc","codeburst.io","psiloveyou.xyz","writingcooperative.com","entrepreneurshandbook.co","prototypr.io","betterhumans.coach.me","theascent.pub"],"topicsToFollow":["d61cf867d93f","8a146bc21b28","1eca0103fff3","4d562ee63426","aef1078a3ef5","e15e46793f8d","6158eb913466","55f1c20aba7a","3d18b94f6858","4861fee224fd","63c6f1f93ee","1d98b3a9a871","decb52b64abf","ae5d4995e225","830cded25262"],"topicToTagMappings":{"accessibility":"accessibility","addiction":"addiction","android-development":"android-development","art":"art","artificial-intelligence":"artificial-intelligence","astrology":"astrology","basic-income":"basic-income","beauty":"beauty","biotech":"biotech","blockchain":"blockchain","books":"books","business":"business","cannabis":"cannabis","cities":"cities","climate-change":"climate-change","comics":"comics","coronavirus":"coronavirus","creativity":"creativity","cryptocurrency":"cryptocurrency","culture":"culture","cybersecurity":"cybersecurity","data-science":"data-science","design":"design","digital-life":"digital-life","disability":"disability","economy":"economy","education":"education","equality":"equality","family":"family","feminism":"feminism","fiction":"fiction","film":"film","fitness":"fitness","food":"food","freelancing":"freelancing","future":"future","gadgets":"gadgets","gaming":"gaming","gun-control":"gun-control","health":"health","history":"history","humor":"humor","immigration":"immigration","ios-development":"ios-development","javascript":"javascript","justice":"justice","language":"language","leadership":"leadership","lgbtqia":"lgbtqia","lifestyle":"lifestyle","machine-learning":"machine-learning","makers":"makers","marketing":"marketing","math":"math","media":"media","mental-health":"mental-health","mindfulness":"mindfulness","money":"money","music":"music","neuroscience":"neuroscience","nonfiction":"nonfiction","outdoors":"outdoors","parenting":"parenting","pets":"pets","philosophy":"philosophy","photography":"photography","podcasts":"podcast","poetry":"poetry","politics":"politics","privacy":"privacy","product-management":"product-management","productivity":"productivity","programming":"programming","psychedelics":"psychedelics","psychology":"psychology","race":"race","relationships":"relationships","religion":"religion","remote-work":"remote-work","san-francisco":"san-francisco","science":"science","self":"self","self-driving-cars":"self-driving-cars","sexuality":"sexuality","social-media":"social-media","society":"society","software-engineering":"software-engineering","space":"space","spirituality":"spirituality","sports":"sports","startups":"startup","style":"style","technology":"technology","transportation":"transportation","travel":"travel","true-crime":"true-crime","tv":"tv","ux":"ux","venture-capital":"venture-capital","visual-design":"visual-design","work":"work","world":"world","writing":"writing"},"defaultImages":{"avatar":{"imageId":"1*dmbNkD5D-u45r44go_cf0g.png","height":150,"width":150},"orgLogo":{"imageId":"7*V1_7XP4snlmqrc_0Njontw.png","height":110,"width":500},"postLogo":{"imageId":"bd978bb536350a710e8efb012513429cabdc4c28700604261aeda246d0f980b7","height":810,"width":1440},"postPreviewImage":{"imageId":"1*hn4v1tCaJy7cWMyb0bpNpQ.png","height":386,"width":579}},"collectionStructuredData":{"8d6b8a439e32":{"name":"Elemental","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F980\u002F1*9ygdqoKprhwuTVKUM0DLPA@2x.png","width":980,"height":159}}},"3f6ecf56618":{"name":"Forge","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F596\u002F1*uULpIlImcO5TDuBZ6lm7Lg@2x.png","width":596,"height":183}}},"ae2a65f35510":{"name":"GEN","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F264\u002F1*RdVZMdvfV3YiZTw6mX7yWA.png","width":264,"height":140}}},"88d9857e584e":{"name":"LEVEL","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*JqYMhNX6KNNb2UlqGqO2WQ.png","width":540,"height":108}}},"7b6769f2748b":{"name":"Marker","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F383\u002F1*haCUs0wF6TgOOvfoY-jEoQ@2x.png","width":383,"height":92}}},"444d13b52878":{"name":"OneZero","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*cw32fIqCbRWzwJaoQw6BUg.png","width":540,"height":123}}},"8ccfed20cbb2":{"name":"Zora","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*tZUQqRcCCZDXjjiZ4bDvgQ.png","width":540,"height":106}}}},"embeddedPostIds":{"coronavirus":"cd3010f9d81f"},"sharedCdcMessaging":{"COVID_APPLICABLE_TAG_SLUGS":[],"COVID_APPLICABLE_TOPIC_NAMES":[],"COVID_APPLICABLE_TOPIC_NAMES_FOR_TOPIC_PAGE":[],"COVID_MESSAGES":{"tierA":{"text":"For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":66,"end":73,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"tierB":{"text":"Anyone can publish on Medium per our Policies, but we don’t fact-check every story. For more info about the coronavirus, see cdc.gov.","markups":[{"start":37,"end":45,"href":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Fcategories\u002F201931128-Policies-Safety"},{"start":125,"end":132,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"paywall":{"text":"This article has been made free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":56,"end":70,"href":"https:\u002F\u002Fmedium.com\u002Fmembership"},{"start":138,"end":145,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"unbound":{"text":"This article is free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":45,"end":59,"href":"https:\u002F\u002Fmedium.com\u002Fmembership"},{"start":127,"end":134,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]}},"COVID_BANNER_POST_ID_OVERRIDE_WHITELIST":["3b31a67bff4a"]},"sharedVoteMessaging":{"TAGS":["politics","election-2020","government","us-politics","election","2020-presidential-race","trump","donald-trump","democrats","republicans","congress","republican-party","democratic-party","biden","joe-biden","maga"],"TOPICS":["politics","election"],"MESSAGE":{"text":"Find out more about the U.S. election results here.","markups":[{"start":46,"end":50,"href":"https:\u002F\u002Fcookpolitical.com\u002F2020-national-popular-vote-tracker"}]},"EXCLUDE_POSTS":["397ef29e3ca5"]},"embedPostRules":[],"recircOptions":{"v1":{"limit":3},"v2":{"limit":8}},"braintreeClientKey":"production_zjkj96jm_m56f8fqpf7ngnrd4","braintree":{"enabled":true,"merchantId":"m56f8fqpf7ngnrd4","merchantAccountId":{"usd":"AMediumCorporation_instant","eur":"amediumcorporation_EUR","cad":"amediumcorporation_CAD"},"publicKey":"ds2nn34bg2z7j5gd","braintreeEnvironment":"production","dashboardUrl":"https:\u002F\u002Fwww.braintreegateway.com\u002Fmerchants","gracePeriodDurationInDays":14,"mediumMembershipPlanId":{"monthly":"ce105f8c57a3","monthlyV2":"e8a5e126-792b-4ee6-8fba-d574c1b02fc5","monthlyWithTrial":"d5ee3dbe3db8","monthlyPremium":"fa741a9b47a2","yearly":"a40ad4a43185","yearlyV2":"3815d7d6-b8ca-4224-9b8c-182f9047866e","yearlyStaff":"d74fb811198a","yearlyWithTrial":"b3bc7350e5c7","yearlyPremium":"e21bd2c12166","monthlyOneYearFree":"e6c0637a-2bad-4171-ab4f-3c268633d83c","monthly25PercentOffFirstYear":"235ecc62-0cdb-49ae-9378-726cd21c504b","monthly20PercentOffFirstYear":"ba518864-9c13-4a99-91ca-411bf0cac756","monthly15PercentOffFirstYear":"594c029b-9f89-43d5-88f8-8173af4e070e","monthly10PercentOffFirstYear":"c6c7bc9a-40f2-4b51-8126-e28511d5bdb0","monthlyForStudents":"629ebe51-da7d-41fd-8293-34cd2f2030a8","yearlyOneYearFree":"78ba7be9-0d9f-4ece-aa3e-b54b826f2bf1","yearly25PercentOffFirstYear":"2dbb010d-bb8f-4eeb-ad5c-a08509f42d34","yearly20PercentOffFirstYear":"47565488-435b-47f8-bf93-40d5fbe0ebc8","yearly15PercentOffFirstYear":"8259809b-0881-47d9-acf7-6c001c7f720f","yearly10PercentOffFirstYear":"9dd694fb-96e1-472c-8d9e-3c868d5c1506","yearlyForStudents":"e29345ef-ab1c-4234-95c5-70e50fe6bc23","monthlyCad":"p52orjkaceei","yearlyCad":"h4q9g2up9ktt"},"braintreeDiscountId":{"oneMonthFree":"MONTHS_FREE_01","threeMonthsFree":"MONTHS_FREE_03","sixMonthsFree":"MONTHS_FREE_06","fiftyPercentOffOneYear":"FIFTY_PERCENT_OFF_ONE_YEAR"},"3DSecureVersion":"2","defaultCurrency":"usd","providerPlanIdCurrency":{"4ycw":"usd","rz3b":"usd","3kqm":"usd","jzw6":"usd","c2q2":"usd","nnsw":"usd","q8qw":"usd","d9y6":"usd","fx7w":"cad","nwf2":"cad"}},"paypalClientId":"AXj1G4fotC2GE8KzWX9mSxCH1wmPE3nJglf4Z2ig_amnhvlMVX87otaq58niAg9iuLktVNF_1WCMnN7v","paypal":{"host":"https:\u002F\u002Fapi.paypal.com:443","clientMode":"production","serverMode":"live","webhookId":"4G466076A0294510S","monthlyPlan":{"planId":"P-9WR0658853113943TMU5FDQA","name":"Medium Membership (Monthly) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"yearlyPlan":{"planId":"P-7N8963881P8875835MU5JOPQ","name":"Medium Membership (Annual) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"oneYearGift":{"name":"Medium Membership (1 Year, Digital Gift Code)","description":"Unlimited access to the best and brightest stories on Medium. Gift codes can be redeemed at medium.com\u002Fredeem.","price":"50.00","currency":"USD","sku":"membership-gift-1-yr"},"oldMonthlyPlan":{"planId":"P-96U02458LM656772MJZUVH2Y","name":"Medium Membership (Monthly)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"oldYearlyPlan":{"planId":"P-59P80963JF186412JJZU3SMI","name":"Medium Membership (Annual)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"monthlyPlanWithTrial":{"planId":"P-66C21969LR178604GJPVKUKY","name":"Medium Membership (Monthly) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"yearlyPlanWithTrial":{"planId":"P-6XW32684EX226940VKCT2MFA","name":"Medium Membership (Annual) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"oldMonthlyPlanNoSetupFee":{"planId":"P-4N046520HR188054PCJC7LJI","name":"Medium Membership (Monthly)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"oldYearlyPlanNoSetupFee":{"planId":"P-7A4913502Y5181304CJEJMXQ","name":"Medium Membership (Annual)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"sdkUrl":"https:\u002F\u002Fwww.paypal.com\u002Fsdk\u002Fjs"},"stripePublishableKey":"pk_live_7FReX44VnNIInZwrIIx6ghjl","log":{"json":true,"level":"info"},"imageUploadMaxSizeMb":25,"staffPicks":{"title":"Staff Picks","catalogId":"c7bc6e1ee00f"}},"session":{"xsrf":""}}</script><script>window.__APOLLO_STATE__ = {"ROOT_QUERY":{"__typename":"Query","viewer":null,"collectionByDomainOrSlug({\"domainOrSlug\":\"outfit7\"})":{"__ref":"Collection:6ec626d5ad62"},"postResult({\"id\":\"1a44213a12bf\"})":{"__ref":"Post:1a44213a12bf"}},"ImageMetadata:":{"__typename":"ImageMetadata","id":""},"Collection:6ec626d5ad62":{"__typename":"Collection","id":"6ec626d5ad62","favicon":{"__ref":"ImageMetadata:"},"customStyleSheet":null,"colorPalette":{"__typename":"ColorPalette","highlightSpectrum":{"__typename":"ColorSpectrum","backgroundColor":"#FFFFFFFF","colorPoints":[{"__typename":"ColorPoint","color":"#FFF5F2F1","point":0},{"__typename":"ColorPoint","color":"#FFF3F0EF","point":0.1},{"__typename":"ColorPoint","color":"#FFF1EEEE","point":0.2},{"__typename":"ColorPoint","color":"#FFEFECEC","point":0.3},{"__typename":"ColorPoint","color":"#FFEDEAEA","point":0.4},{"__typename":"ColorPoint","color":"#FFEBE8E8","point":0.5},{"__typename":"ColorPoint","color":"#FFE9E7E6","point":0.6},{"__typename":"ColorPoint","color":"#FFE7E5E4","point":0.7},{"__typename":"ColorPoint","color":"#FFE5E3E2","point":0.8},{"__typename":"ColorPoint","color":"#FFE3E1E0","point":0.9},{"__typename":"ColorPoint","color":"#FFE1DFDE","point":1}]},"defaultBackgroundSpectrum":{"__typename":"ColorSpectrum","backgroundColor":"#FFFFFFFF","colorPoints":[{"__typename":"ColorPoint","color":"#FF858484","point":0},{"__typename":"ColorPoint","color":"#FF7C7B7B","point":0.1},{"__typename":"ColorPoint","color":"#FF737171","point":0.2},{"__typename":"ColorPoint","color":"#FF696868","point":0.3},{"__typename":"ColorPoint","color":"#FF5F5E5E","point":0.4},{"__typename":"ColorPoint","color":"#FF555454","point":0.5},{"__typename":"ColorPoint","color":"#FF4A4949","point":0.6},{"__typename":"ColorPoint","color":"#FF3F3E3E","point":0.7},{"__typename":"ColorPoint","color":"#FF343333","point":0.8},{"__typename":"ColorPoint","color":"#FF272727","point":0.9},{"__typename":"ColorPoint","color":"#FF1A1A1A","point":1}]},"tintBackgroundSpectrum":{"__typename":"ColorSpectrum","backgroundColor":"#FF111111","colorPoints":[{"__typename":"ColorPoint","color":"#FF111111","point":0},{"__typename":"ColorPoint","color":"#FF313131","point":0.1},{"__typename":"ColorPoint","color":"#FF4D4C4C","point":0.2},{"__typename":"ColorPoint","color":"#FF666565","point":0.3},{"__typename":"ColorPoint","color":"#FF7D7C7C","point":0.4},{"__typename":"ColorPoint","color":"#FF939292","point":0.5},{"__typename":"ColorPoint","color":"#FFA9A7A7","point":0.6},{"__typename":"ColorPoint","color":"#FFBDBBBB","point":0.7},{"__typename":"ColorPoint","color":"#FFD2CFCF","point":0.8},{"__typename":"ColorPoint","color":"#FFE5E2E2","point":0.9},{"__typename":"ColorPoint","color":"#FFF8F5F5","point":1}]}},"domain":null,"slug":"outfit7","googleAnalyticsId":null,"editors":[{"__typename":"CollectionMastheadUserItem","user":{"__ref":"User:ebaddf6e1f2a"}}],"name":"Outfit7","avatar":{"__ref":"ImageMetadata:1*dCIQWfMya9g57UUL2ZzrJQ.png"},"description":"The inside scoop on development, engineering & tech innovation @ Outfit7.","subscriberCount":53,"latestPostsConnection({\"paging\":{\"limit\":1}})":{"__typename":"PostConnection","posts":[{"__ref":"Post:b317a75e1447"}]},"viewerEdge":{"__ref":"CollectionViewerEdge:collectionId:6ec626d5ad62-viewerId:lo_90b7aaaf408e"},"twitterUsername":null,"facebookPageId":null,"logo":{"__ref":"ImageMetadata:1*nTxl_7KgWQYo8PfVROUK_A.png"}},"User:ebaddf6e1f2a":{"__typename":"User","id":"ebaddf6e1f2a"},"ImageMetadata:1*dCIQWfMya9g57UUL2ZzrJQ.png":{"__typename":"ImageMetadata","id":"1*dCIQWfMya9g57UUL2ZzrJQ.png"},"User:3215f0e451af":{"__typename":"User","id":"3215f0e451af","customDomainState":null,"hasSubdomain":false,"username":"jure.gorinsek_80693"},"Post:b317a75e1447":{"__typename":"Post","id":"b317a75e1447","firstPublishedAt":1727352997939,"creator":{"__ref":"User:3215f0e451af"},"collection":{"__ref":"Collection:6ec626d5ad62"},"isSeries":false,"mediumUrl":"https:\u002F\u002Fmedium.com\u002Foutfit7\u002Fnew-home-for-outfit7-tech-articles-b317a75e1447","sequence":null,"uniqueSlug":"new-home-for-outfit7-tech-articles-b317a75e1447"},"LinkedAccounts:95ecd7ef38ba":{"__typename":"LinkedAccounts","mastodon":null,"id":"95ecd7ef38ba"},"UserViewerEdge:userId:95ecd7ef38ba-viewerId:lo_90b7aaaf408e":{"__typename":"UserViewerEdge","id":"userId:95ecd7ef38ba-viewerId:lo_90b7aaaf408e","isFollowing":false,"isUser":false,"isMuting":false},"User:95ecd7ef38ba":{"__typename":"User","id":"95ecd7ef38ba","linkedAccounts":{"__ref":"LinkedAccounts:95ecd7ef38ba"},"isSuspended":false,"imageId":"0*3VkJ01vMUfVDBJYX.jpg","mediumMemberAt":0,"verifications":{"__typename":"VerifiedInfo","isBookAuthor":false},"name":"Mitja Bezenšek","socialStats":{"__typename":"SocialStats","followerCount":1,"followingCount":1,"collectionFollowingCount":0},"username":"mitja.bezensek_98237","customDomainState":null,"hasSubdomain":false,"bio":"","isPartnerProgramEnrolled":false,"viewerEdge":{"__ref":"UserViewerEdge:userId:95ecd7ef38ba-viewerId:lo_90b7aaaf408e"},"viewerIsUser":false,"newsletterV3":null,"postSubscribeMembershipUpsellShownAt":0,"membership":null,"allowNotes":true,"twitterScreenName":""},"Paragraph:b85cc81595ea_0":{"__typename":"Paragraph","id":"b85cc81595ea_0","name":"34d2","type":"H3","href":null,"layout":null,"metadata":null,"text":"Cracking the Monolith: A Journey to Continuous Deployment","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_1":{"__typename":"Paragraph","id":"b85cc81595ea_1","name":"0d43","type":"P","href":null,"layout":null,"metadata":null,"text":"TL;DR: At the Outfit7 platform team we are strong believers in agile development principles and recognize that fast and automated deployments are essential. We’ll see how we made this happen by transforming our deployment process moving from a manual deployment pipeline to fully automated continuous deployment.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":0,"end":312,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*orCHpijf_4Az1U6IbPX0gQ.jpeg":{"__typename":"ImageMetadata","id":"1*orCHpijf_4Az1U6IbPX0gQ.jpeg","originalHeight":1005,"originalWidth":1920,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:b85cc81595ea_2":{"__typename":"Paragraph","id":"b85cc81595ea_2","name":"7df0","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:1*orCHpijf_4Az1U6IbPX0gQ.jpeg"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_3":{"__typename":"Paragraph","id":"b85cc81595ea_3","name":"8b29","type":"P","href":null,"layout":null,"metadata":null,"text":"Hi, I’m Mitja Bezenšek, the Principal Lead Software Engineer in the backend department. I’m the kind of person who finds pleasure in both coding and playing in the fascinating world of infrastructure — all to keep things engaging and exciting. In this post, I’d like to delve into one of my favorite topics that bridges the gap between infrastructure and code — continuous deployment pipelines.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_4":{"__typename":"Paragraph","id":"b85cc81595ea_4","name":"a725","type":"P","href":null,"layout":null,"metadata":null,"text":"The story starts with “The Phoenix Project”, a book I couldn’t put down — a must read for anyone in tech. The book explores various aspects of DevOps culture and practices, including the importance of automating and streamlining the deployment process to achieve faster and more reliable software delivery. In this blog post, we’ll dive into our journey of automating deployments for our flagship backend app. It got me wondering: could we achieve similar results through automation?","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":23,"end":42,"href":"https:\u002F\u002Fitrevolution.com\u002Fproduct\u002Fthe-phoenix-project\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_5":{"__typename":"Paragraph","id":"b85cc81595ea_5","name":"cd17","type":"H3","href":null,"layout":null,"metadata":null,"text":"The Journey","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_6":{"__typename":"Paragraph","id":"b85cc81595ea_6","name":"5e61","type":"P","href":null,"layout":null,"metadata":null,"text":"Although our team had already adopted many DevOps principles, there was still plenty of room for improvement, especially when it came to our deployment pipelines. At the time, we were using DevOps practices such as semi-automated deployments, CI pipelines triggered on git pushes, unit and integration tests, and Slack notifications for deployments and test failures. Our deployment process worked for us, but we saw the potential for even greater automation.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_7":{"__typename":"Paragraph","id":"b85cc81595ea_7","name":"d86b","type":"H3","href":null,"layout":null,"metadata":null,"text":"The Traditional Deployment Dance","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_8":{"__typename":"Paragraph","id":"b85cc81595ea_8","name":"88c6","type":"P","href":null,"layout":null,"metadata":null,"text":"Our traditional deployment was doing everything by hand by a single person on the team. The person followed the guide with these steps:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_9":{"__typename":"Paragraph","id":"b85cc81595ea_9","name":"b0ae","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Daily at 1 PM, whoever was on-call (let’s call them “deployer”) would shout out “Last call for deploy” on Slack.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_10":{"__typename":"Paragraph","id":"b85cc81595ea_10","name":"bfdc","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Developers who haven’t merged yet, but wanted to deploy, then rushed to complete their tasks and code reviews all sweating under time pressure.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_11":{"__typename":"Paragraph","id":"b85cc81595ea_11","name":"fdb7","type":"OLI","href":null,"layout":null,"metadata":null,"text":"After tasks were collected the deployer initiated a deployment process using an interactive pipeline.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_12":{"__typename":"Paragraph","id":"b85cc81595ea_12","name":"a630","type":"OLI","href":null,"layout":null,"metadata":null,"text":"The pipeline presented the deployer with a number of options, including which modules to deploy, whether to do traffic splitting, end-to-end testing preferences etc.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_13":{"__typename":"Paragraph","id":"b85cc81595ea_13","name":"f76a","type":"OLI","href":null,"layout":null,"metadata":null,"text":"The pipeline built the application, ran the tests, deployed a new version of the app (without user traffic), and ran pre-production end-to-end tests on it.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_14":{"__typename":"Paragraph","id":"b85cc81595ea_14","name":"0777","type":"OLI","href":null,"layout":null,"metadata":null,"text":"After test runs completed the deployer had a chance to move some user traffic to the new version and manually inspect application logs and metrics for any errors before migrating all user traffic.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_15":{"__typename":"Paragraph","id":"b85cc81595ea_15","name":"dddc","type":"OLI","href":null,"layout":null,"metadata":null,"text":"In the end, a full end-to-end test suite was executed to identify any remaining corner case bugs.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_16":{"__typename":"Paragraph","id":"b85cc81595ea_16","name":"2c8b","type":"P","href":null,"layout":null,"metadata":null,"text":"Steps are depicted in the following diagram:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*pst4mcU8cvJ9RV7i":{"__typename":"ImageMetadata","id":"0*pst4mcU8cvJ9RV7i","originalHeight":684,"originalWidth":1600,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:b85cc81595ea_17":{"__typename":"Paragraph","id":"b85cc81595ea_17","name":"6126","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*pst4mcU8cvJ9RV7i"},"text":"Manual deployment pipeline steps","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_18":{"__typename":"Paragraph","id":"b85cc81595ea_18","name":"c18f","type":"P","href":null,"layout":null,"metadata":null,"text":"Let’s now take a look why this process was problematic:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_19":{"__typename":"Paragraph","id":"b85cc81595ea_19","name":"a9a5","type":"ULI","href":null,"layout":null,"metadata":null,"text":"The daily “Last call for deploy” announcement added stress to developers, including both task owners and code reviewers.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_20":{"__typename":"Paragraph","id":"b85cc81595ea_20","name":"a512","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Deployments often faced delays, with deployers frequently waiting until the end of their shift for all code reviews to wrap up. Some deployers even resorted to funny, but somewhat annoying, messages to push for deployments. 🙂","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_21":{"__typename":"Paragraph","id":"b85cc81595ea_21","name":"2e26","type":"ULI","href":null,"layout":null,"metadata":null,"text":"The error checking process during the traffic split stage was not only tedious but also repetitive and error-prone.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_22":{"__typename":"Paragraph","id":"b85cc81595ea_22","name":"7c8f","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Interestingly, it was the deployer, not the developer, who conducted error checks. In essence, the deployer played the role of Ops, while the developer remained in the Dev role. You can see where I’m going with this. Clearly this is not DevOps.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_23":{"__typename":"Paragraph","id":"b85cc81595ea_23","name":"30eb","type":"P","href":null,"layout":null,"metadata":null,"text":"It became clear that we should do something. Relieve the deployers from manual tasks, reduce stress in the team, and enhance the reliability of the deployment process through automation. We had a strong belief that we could accomplish this, given that a majority of the deployment steps were already automated within our semi-automatic pipeline.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_24":{"__typename":"Paragraph","id":"b85cc81595ea_24","name":"2f3e","type":"H3","href":null,"layout":null,"metadata":null,"text":"Embracing CD 💿 (Continuous Deployment)","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_25":{"__typename":"Paragraph","id":"b85cc81595ea_25","name":"6fd8","type":"P","href":null,"layout":null,"metadata":null,"text":"The idea was simple: automate the entire deployment process and implement continuous deployment with a canary rollout update strategy. Basically the same process as depicted in the diagram above but fully automated.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*1lmdGyuNwHGaX9P2":{"__typename":"ImageMetadata","id":"0*1lmdGyuNwHGaX9P2","originalHeight":231,"originalWidth":667,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:b85cc81595ea_26":{"__typename":"Paragraph","id":"b85cc81595ea_26","name":"03fc","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*1lmdGyuNwHGaX9P2"},"text":"Continuous deployment high level idea","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_27":{"__typename":"Paragraph","id":"b85cc81595ea_27","name":"3796","type":"P","href":null,"layout":null,"metadata":null,"text":"The feature would go to production as soon as the developer would merge it into the main branch (for those who might be particular, we were using gitflow, so technically, it was the develop branch). So, we embarked on our CD journey, hoping for numerous benefits:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_28":{"__typename":"Paragraph","id":"b85cc81595ea_28","name":"d9ec","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Agility: Faster feature delivery with minimal process overhead.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_29":{"__typename":"Paragraph","id":"b85cc81595ea_29","name":"41be","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Ownership: Developers, being familiar with their code, became the primary owners responsible for taking features to production.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_30":{"__typename":"Paragraph","id":"b85cc81595ea_30","name":"d0fe","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Streamlined Deployments: By deploying only one feature at a time, we reduced complexity and made debugging easier through isolated changes.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_31":{"__typename":"Paragraph","id":"b85cc81595ea_31","name":"d6fb","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Accelerated Deployments: The elimination of waiting periods, or what I like to call “human I\u002FO”.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_32":{"__typename":"Paragraph","id":"b85cc81595ea_32","name":"a3e1","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Improved Reliability: A more robust and resilient automated pipeline compared to manual deployments.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_33":{"__typename":"Paragraph","id":"b85cc81595ea_33","name":"77e9","type":"P","href":null,"layout":null,"metadata":null,"text":"Fortunately, our existing culture and way of working provided us with a good head start:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_34":{"__typename":"Paragraph","id":"b85cc81595ea_34","name":"7cda","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Frequent Deployments: It wasn’t unusual for us to have deployments beyond the scheduled 1 PM slot, particularly when urgent bug fixes came up.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_35":{"__typename":"Paragraph","id":"b85cc81595ea_35","name":"7860","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Robust Testing: There were already automated tests with a high degree of confidence. Not to mention that features were also tested by QA in staging environments.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_36":{"__typename":"Paragraph","id":"b85cc81595ea_36","name":"0166","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Monitoring: Backend applications were monitored with countless metrics and an on-call rotation process was in place.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_37":{"__typename":"Paragraph","id":"b85cc81595ea_37","name":"9ae9","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Ownership: Embracing the “build it, you run it” principle, the developers were already responsible for their features after they hit production.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_38":{"__typename":"Paragraph","id":"b85cc81595ea_38","name":"efed","type":"H3","href":null,"layout":null,"metadata":null,"text":"Challenges","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_39":{"__typename":"Paragraph","id":"b85cc81595ea_39","name":"d95c","type":"P","href":null,"layout":null,"metadata":null,"text":"While CD seemed like a natural fit, it was not without its challenges:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_40":{"__typename":"Paragraph","id":"b85cc81595ea_40","name":"aedd","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Distributed Monolith: Our application is a monolith Java application consisting of multiple RESTful modules, where each module depends on the same common code. This often made it difficult to determine which modules required deployment when changes were made in the common code. So usually we would just deploy all of them.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_41":{"__typename":"Paragraph","id":"b85cc81595ea_41","name":"a127","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Deploy Time: Because there were 24 modules in total it took a while to deploy all of them.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_42":{"__typename":"Paragraph","id":"b85cc81595ea_42","name":"5c46","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Deployment Monitoring: The responsibility of the deployer included manually checking logs and metrics for errors. How do we automate this?","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_43":{"__typename":"Paragraph","id":"b85cc81595ea_43","name":"ad8d","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Contingency Plans: We needed a strategy for handling errors during deployment.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_44":{"__typename":"Paragraph","id":"b85cc81595ea_44","name":"3b66","type":"H3","href":null,"layout":null,"metadata":null,"text":"Deploy times","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_45":{"__typename":"Paragraph","id":"b85cc81595ea_45","name":"77d5","type":"P","href":null,"layout":null,"metadata":null,"text":"Addressing the deployment time was relatively straightforward. As mentioned earlier our application isn’t a conventional monolith; instead, it’s a collection of REST modules. By using the power of multi-threading, we were able to deploy these modules in parallel, resulting in a significant reduction in deployment time. This approach proved effective, as long as we had sufficient internet bandwidth and enough memory in the CD pipeline (not a problem because we run our CI\u002FCD pipeline in the cloud).","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_46":{"__typename":"Paragraph","id":"b85cc81595ea_46","name":"6e2a","type":"P","href":null,"layout":null,"metadata":null,"text":"In our initial proof of concept, we found that a complete deployment would take 30 minutes. While this duration was acceptable for deploying a monolith, we wondered if it would be too much for deploying just a single feature (especially considering that we were previously deploying batches of features). To gain a better understanding of the duration, let’s list the steps of the CD deployment pipeline with their duration:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_47":{"__typename":"Paragraph","id":"b85cc81595ea_47","name":"fe65","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Build and run unit tests: 5 minutes","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_48":{"__typename":"Paragraph","id":"b85cc81595ea_48","name":"fbe1","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Deploy canary version with 0% traffic: 5 minutes","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_49":{"__typename":"Paragraph","id":"b85cc81595ea_49","name":"bd62","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Pre-production tests on the canary version: 10 minutes","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_50":{"__typename":"Paragraph","id":"b85cc81595ea_50","name":"19ff","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Canary deployment with traffic split steps 1%, 5%, 15%, 25%: 10 minutes","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_51":{"__typename":"Paragraph","id":"b85cc81595ea_51","name":"e1f3","type":"P","href":null,"layout":null,"metadata":null,"text":"That’s a total duration of 30 minutes!","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_52":{"__typename":"Paragraph","id":"b85cc81595ea_52","name":"2b3f","type":"P","href":null,"layout":null,"metadata":null,"text":"To keep it short, although we initially had concerns about the 30 minute deployment duration, we decided to go on and address any issues later on. As it turned out, the 30-minute timeframe turned out just fine.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_53":{"__typename":"Paragraph","id":"b85cc81595ea_53","name":"f0ce","type":"H3","href":null,"layout":null,"metadata":null,"text":"Error detection and monitoring","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_54":{"__typename":"Paragraph","id":"b85cc81595ea_54","name":"3c36","type":"P","href":null,"layout":null,"metadata":null,"text":"In order to avoid catastrophes, there are several safeguards implemented:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_55":{"__typename":"Paragraph","id":"b85cc81595ea_55","name":"dd40","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Extensive Unit Testing: A strong culture of writing unit tests for every code component ensures unit tests are executed during every build deployment step, including pull requests.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":22,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_56":{"__typename":"Paragraph","id":"b85cc81595ea_56","name":"eb8b","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Pre-Production Integration Tests: Before migrating traffic to the canary version, we run a series of short integration tests to validate the core functionalities.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":32,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_57":{"__typename":"Paragraph","id":"b85cc81595ea_57","name":"0a78","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Canary Deployment Strategy: Gradual migration of production traffic allows for monitoring the error rate. In case error counts surges during the canary step, the deployment pipeline automatically reverts traffic to the previous version.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":26,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*14mwpSjale5GaQMx":{"__typename":"ImageMetadata","id":"0*14mwpSjale5GaQMx","originalHeight":231,"originalWidth":667,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:b85cc81595ea_58":{"__typename":"Paragraph","id":"b85cc81595ea_58","name":"7f2e","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*14mwpSjale5GaQMx"},"text":"Error detection notification","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_59":{"__typename":"Paragraph","id":"b85cc81595ea_59","name":"b07c","type":"P","href":null,"layout":null,"metadata":null,"text":"All of these steps drastically reduce the chance of errors.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_60":{"__typename":"Paragraph","id":"b85cc81595ea_60","name":"8455","type":"H3","href":null,"layout":null,"metadata":null,"text":"SlackOps","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_61":{"__typename":"Paragraph","id":"b85cc81595ea_61","name":"feb0","type":"P","href":null,"layout":null,"metadata":null,"text":"We heavily utilize Slack for our communication and transparency. When a feature is merged into the main branch, a message appears on our Slack channels, announcing an ongoing deployment, complete with a detailed change log. We ensure to tag the developer who authored the feature, keeping them informed about the progress. Every step of the pipeline is documented on Slack.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*6nj6O2xKQb8JSjZ8":{"__typename":"ImageMetadata","id":"0*6nj6O2xKQb8JSjZ8","originalHeight":231,"originalWidth":667,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:b85cc81595ea_62":{"__typename":"Paragraph","id":"b85cc81595ea_62","name":"a158","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*6nj6O2xKQb8JSjZ8"},"text":"Deployment progress notifications","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_63":{"__typename":"Paragraph","id":"b85cc81595ea_63","name":"be2f","type":"P","href":null,"layout":null,"metadata":null,"text":"Once the deployment successfully concludes the change is posted on our company-wide change log Slack channel. This approach improves transparency and ensures that everyone in the organization has visibility into the ongoing changes.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*2-kGv5WuS9s1HFMk":{"__typename":"ImageMetadata","id":"0*2-kGv5WuS9s1HFMk","originalHeight":231,"originalWidth":667,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:b85cc81595ea_64":{"__typename":"Paragraph","id":"b85cc81595ea_64","name":"d9ee","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*2-kGv5WuS9s1HFMk"},"text":"Change log notifications","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_65":{"__typename":"Paragraph","id":"b85cc81595ea_65","name":"6388","type":"H3","href":null,"layout":null,"metadata":null,"text":"Making Deployments Fun","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_66":{"__typename":"Paragraph","id":"b85cc81595ea_66","name":"7a97","type":"P","href":null,"layout":null,"metadata":null,"text":"It might seem unconventional, but that’s exactly what we did. Fun has always been at the core of our company. Even during the time of manual deployments, we made it a point to play music while deploying. This served 2 purposes: it notified everyone in the office that a deployment was underway, but it also brought a fun component into the process. We deliberately chose catchy and unconventional songs to lighten the atmosphere during what used to be a tense moment (a production deployment). So, we took the final step in our journey by automating the process of playing music during deployments. The task was truly exciting, involving coding a Slack bot, installing it on a Raspberry Pi, and setting up some speakers.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*UFZWUDY9t2NuAFu7":{"__typename":"ImageMetadata","id":"0*UFZWUDY9t2NuAFu7","originalHeight":1133,"originalWidth":1600,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:b85cc81595ea_67":{"__typename":"Paragraph","id":"b85cc81595ea_67","name":"2066","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*UFZWUDY9t2NuAFu7"},"text":"Raspberry PI in action playing some music","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_68":{"__typename":"Paragraph","id":"b85cc81595ea_68","name":"9c7f","type":"H3","href":null,"layout":null,"metadata":null,"text":"Wrapping up","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_69":{"__typename":"Paragraph","id":"b85cc81595ea_69","name":"9bff","type":"P","href":null,"layout":null,"metadata":null,"text":"SlackOps and the music player were the last pieces in the puzzle. With the promise of each developer deploying independently without unnecessary waiting became a reality. Our team was able to truly embrace the “build it, you run it” principle, where developers can now fully own their features in production. And from this point onward, we never looked back.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_70":{"__typename":"Paragraph","id":"b85cc81595ea_70","name":"4bee","type":"P","href":null,"layout":null,"metadata":null,"text":"Our deployment pipeline has truly stood the test of time. It has evolved and improved over the years. It’s gone through bug fixes, numerous improvements, and even undergoing platform migrations to ensure we keep on using latest&greatest technologies.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:b85cc81595ea_71":{"__typename":"Paragraph","id":"b85cc81595ea_71","name":"2a38","type":"P","href":null,"layout":null,"metadata":null,"text":"So what started as an idea inspired by the “The Phoenix Project” book came to life! Witnessing the successful automation of deployments was not only gratifying but also a reflection of our genuine DevOps culture.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"CollectionViewerEdge:collectionId:6ec626d5ad62-viewerId:lo_90b7aaaf408e":{"__typename":"CollectionViewerEdge","id":"collectionId:6ec626d5ad62-viewerId:lo_90b7aaaf408e","isEditor":false,"isMuting":false},"ImageMetadata:1*nTxl_7KgWQYo8PfVROUK_A.png":{"__typename":"ImageMetadata","id":"1*nTxl_7KgWQYo8PfVROUK_A.png","originalWidth":4566,"originalHeight":4566},"PostViewerEdge:postId:1a44213a12bf-viewerId:lo_90b7aaaf408e":{"__typename":"PostViewerEdge","shouldIndexPostForExternalSearch":true,"id":"postId:1a44213a12bf-viewerId:lo_90b7aaaf408e"},"Tag:devops":{"__typename":"Tag","id":"devops","displayTitle":"DevOps","normalizedTagSlug":"devops"},"Tag:continuous-deployment":{"__typename":"Tag","id":"continuous-deployment","displayTitle":"Continuous Deployment","normalizedTagSlug":"continuous-deployment"},"Tag:continuous-delivery":{"__typename":"Tag","id":"continuous-delivery","displayTitle":"Continuous Delivery","normalizedTagSlug":"continuous-delivery"},"Tag:cloud":{"__typename":"Tag","id":"cloud","displayTitle":"Cloud","normalizedTagSlug":"cloud"},"Tag:continuous-integration":{"__typename":"Tag","id":"continuous-integration","displayTitle":"Continuous Integration","normalizedTagSlug":"continuous-integration"},"Post:1a44213a12bf":{"__typename":"Post","id":"1a44213a12bf","collection":{"__ref":"Collection:6ec626d5ad62"},"content({\"postMeteringOptions\":{}})":{"__typename":"PostContent","isLockedPreviewOnly":false,"bodyModel":{"__typename":"RichText","sections":[{"__typename":"Section","name":"05f5","startIndex":0,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null}],"paragraphs":[{"__ref":"Paragraph:b85cc81595ea_0"},{"__ref":"Paragraph:b85cc81595ea_1"},{"__ref":"Paragraph:b85cc81595ea_2"},{"__ref":"Paragraph:b85cc81595ea_3"},{"__ref":"Paragraph:b85cc81595ea_4"},{"__ref":"Paragraph:b85cc81595ea_5"},{"__ref":"Paragraph:b85cc81595ea_6"},{"__ref":"Paragraph:b85cc81595ea_7"},{"__ref":"Paragraph:b85cc81595ea_8"},{"__ref":"Paragraph:b85cc81595ea_9"},{"__ref":"Paragraph:b85cc81595ea_10"},{"__ref":"Paragraph:b85cc81595ea_11"},{"__ref":"Paragraph:b85cc81595ea_12"},{"__ref":"Paragraph:b85cc81595ea_13"},{"__ref":"Paragraph:b85cc81595ea_14"},{"__ref":"Paragraph:b85cc81595ea_15"},{"__ref":"Paragraph:b85cc81595ea_16"},{"__ref":"Paragraph:b85cc81595ea_17"},{"__ref":"Paragraph:b85cc81595ea_18"},{"__ref":"Paragraph:b85cc81595ea_19"},{"__ref":"Paragraph:b85cc81595ea_20"},{"__ref":"Paragraph:b85cc81595ea_21"},{"__ref":"Paragraph:b85cc81595ea_22"},{"__ref":"Paragraph:b85cc81595ea_23"},{"__ref":"Paragraph:b85cc81595ea_24"},{"__ref":"Paragraph:b85cc81595ea_25"},{"__ref":"Paragraph:b85cc81595ea_26"},{"__ref":"Paragraph:b85cc81595ea_27"},{"__ref":"Paragraph:b85cc81595ea_28"},{"__ref":"Paragraph:b85cc81595ea_29"},{"__ref":"Paragraph:b85cc81595ea_30"},{"__ref":"Paragraph:b85cc81595ea_31"},{"__ref":"Paragraph:b85cc81595ea_32"},{"__ref":"Paragraph:b85cc81595ea_33"},{"__ref":"Paragraph:b85cc81595ea_34"},{"__ref":"Paragraph:b85cc81595ea_35"},{"__ref":"Paragraph:b85cc81595ea_36"},{"__ref":"Paragraph:b85cc81595ea_37"},{"__ref":"Paragraph:b85cc81595ea_38"},{"__ref":"Paragraph:b85cc81595ea_39"},{"__ref":"Paragraph:b85cc81595ea_40"},{"__ref":"Paragraph:b85cc81595ea_41"},{"__ref":"Paragraph:b85cc81595ea_42"},{"__ref":"Paragraph:b85cc81595ea_43"},{"__ref":"Paragraph:b85cc81595ea_44"},{"__ref":"Paragraph:b85cc81595ea_45"},{"__ref":"Paragraph:b85cc81595ea_46"},{"__ref":"Paragraph:b85cc81595ea_47"},{"__ref":"Paragraph:b85cc81595ea_48"},{"__ref":"Paragraph:b85cc81595ea_49"},{"__ref":"Paragraph:b85cc81595ea_50"},{"__ref":"Paragraph:b85cc81595ea_51"},{"__ref":"Paragraph:b85cc81595ea_52"},{"__ref":"Paragraph:b85cc81595ea_53"},{"__ref":"Paragraph:b85cc81595ea_54"},{"__ref":"Paragraph:b85cc81595ea_55"},{"__ref":"Paragraph:b85cc81595ea_56"},{"__ref":"Paragraph:b85cc81595ea_57"},{"__ref":"Paragraph:b85cc81595ea_58"},{"__ref":"Paragraph:b85cc81595ea_59"},{"__ref":"Paragraph:b85cc81595ea_60"},{"__ref":"Paragraph:b85cc81595ea_61"},{"__ref":"Paragraph:b85cc81595ea_62"},{"__ref":"Paragraph:b85cc81595ea_63"},{"__ref":"Paragraph:b85cc81595ea_64"},{"__ref":"Paragraph:b85cc81595ea_65"},{"__ref":"Paragraph:b85cc81595ea_66"},{"__ref":"Paragraph:b85cc81595ea_67"},{"__ref":"Paragraph:b85cc81595ea_68"},{"__ref":"Paragraph:b85cc81595ea_69"},{"__ref":"Paragraph:b85cc81595ea_70"},{"__ref":"Paragraph:b85cc81595ea_71"}]},"validatedShareKey":"","shareKeyCreator":null},"creator":{"__ref":"User:95ecd7ef38ba"},"inResponseToEntityType":null,"isLocked":false,"isMarkedPaywallOnly":false,"lockedSource":"LOCKED_POST_SOURCE_NONE","mediumUrl":"https:\u002F\u002Fmedium.com\u002Foutfit7\u002Fcracking-the-monolith-a-journey-to-continuous-deployment-1a44213a12bf","primaryTopic":null,"topics":[{"__typename":"Topic","slug":"programming"}],"isPublished":true,"latestPublishedVersion":"b85cc81595ea","visibility":"PUBLIC","postResponses":{"__typename":"PostResponses","count":1},"clapCount":35,"allowResponses":true,"isLimitedState":false,"title":"Cracking the Monolith: A Journey to Continuous Deployment","isSeries":false,"sequence":null,"uniqueSlug":"cracking-the-monolith-a-journey-to-continuous-deployment-1a44213a12bf","socialTitle":"","socialDek":"","canonicalUrl":"","metaDescription":"","latestPublishedAt":1697444311085,"readingTime":7.510377358490566,"previewContent":{"__typename":"PreviewContent","subtitle":"TL;DR: At the Outfit7 platform team we are strong believers in agile development principles and recognize that fast and automated…"},"previewImage":{"__ref":"ImageMetadata:1*orCHpijf_4Az1U6IbPX0gQ.jpeg"},"isShortform":false,"seoTitle":"","firstPublishedAt":1697444015805,"updatedAt":1697444314729,"shortformType":"SHORTFORM_TYPE_LINK","seoDescription":"","viewerEdge":{"__ref":"PostViewerEdge:postId:1a44213a12bf-viewerId:lo_90b7aaaf408e"},"isSuspended":false,"license":"ALL_RIGHTS_RESERVED","tags":[{"__ref":"Tag:devops"},{"__ref":"Tag:continuous-deployment"},{"__ref":"Tag:continuous-delivery"},{"__ref":"Tag:cloud"},{"__ref":"Tag:continuous-integration"}],"isNewsletter":false,"statusForCollection":"APPROVED","pendingCollection":null,"detectedLanguage":"en","wordCount":1712,"layerCake":0,"responsesLocked":false}}</script><script>window.__MIDDLEWARE_STATE__={"session":{"xsrf":""},"cache":{"cacheStatus":"MISS"}}</script><script src="https://cdn-client.medium.com/lite/static/js/manifest.aa9242f7.js"></script><script src="https://cdn-client.medium.com/lite/static/js/9865.1496d74a.js"></script><script src="https://cdn-client.medium.com/lite/static/js/main.e556b4ac.js"></script><script src="https://cdn-client.medium.com/lite/static/js/instrumentation.d9108df7.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/reporting.ff22a7a5.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/9120.5df29668.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5049.d1ead72d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/4810.6318add7.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6618.db187378.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2707.b0942613.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/9977.5b3eb23a.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8599.1ab63137.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5250.9f9e01d2.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5787.e66a3a4d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2648.26563adf.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8393.826a25fb.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/3104.c3413b66.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/3735.afb7e926.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5642.8ad8a900.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6546.cd03f950.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6834.08de95de.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/7346.72622eb9.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2420.2a5e2d95.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/839.ca7937c2.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/7975.d195c6f1.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2106.21ff89d3.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/7394.094844de.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2961.00a48598.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8204.c4082863.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/4391.59acaed3.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/PostPage.MainContent.1387c5dc.chunk.js"></script><script>window.main();</script><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'8e9606a8a98ba8da',t:'MTczMjc1MTQ4NS4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body></html>