2014 lines
146 KiB
HTML
2014 lines
146 KiB
HTML
<!DOCTYPE html><html dir="ltr" lang="en" class="initial"> <head><meta charset="utf-8"><title>Modern Rollback Strategies | Octopus blog</title><meta name="robots" content="max-image-preview:large, index, follow"><meta name="keywords"><meta name="description" content="Bob walks you through 3 modern rollback strategies: the 10-minute recovery, 3-minute recovery, and immediate rollback strategy."><link rel="preconnect" href="https://octopus.com" crossorigin><link rel="preload" as="image" href="/blog/i/x/cover/rollback-rocket.png" imagesrcset="/blog/i/600/cover/rollback-rocket.webp 600w, /blog/i/1000/cover/rollback-rocket.webp 1000w, /blog/i/2000/cover/rollback-rocket.webp 1500w" imagesizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" fetchpriority="high"><link rel="stylesheet" href="https://octopus.com/octopus-public/assets/pu-vars.css"><link rel="stylesheet" href="https://octopus.com/octopus-public/assets/navbar-pu-styles.css"><link rel="stylesheet" href="https://octopus.com/octopus-public/assets/footer-pu-styles.css" media="print" onload="this.media='all';this.onload=null"><link rel="stylesheet" href="https://octopus.com/octopus-public/assets/marketo-pu-styles.css" media="print" onload="this.media='all';this.onload=null"><noscript><link rel="stylesheet" href="https://octopus.com/octopus-public/assets/footer-pu-styles.css"><link rel="stylesheet" href="https://octopus.com/octopus-public/assets/marketo-pu-styles.css"></noscript><link rel="stylesheet" href="/blog/css/vars.css"><link rel="stylesheet" href="/blog/css/main.css"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#311e3e"><link rel="canonical" href="https://octopus.com/blog/modern-rollback-strategies"><link rel="alternate" type="application/atom+xml" title="Octopus blog" href="/blog/feed.xml"><link rel="alternate" href="/blog/sitemap.xml" type="application/rss+xml"><link rel="shortcut icon" href="/blog/icons/favicon.ico" type="image/x-icon"><link rel="apple-touch-icon" href="/blog/icons/apple-touch-icon.png"><meta property="og:type" content="website"><meta property="og:url" content="https://octopus.com/blog/modern-rollback-strategies"><meta property="og:title" content="Modern rollback strategies"><meta property="og:description" content="Bob walks you through 3 modern rollback strategies: the 10-minute recovery, 3-minute recovery, and immediate rollback strategy."><meta property="og:image" content="https://octopus.com/blog/img/cover/rollback-rocket.png"><meta property="og:image:alt" content="4 release boxes labelled 1.1 to 1.4, the 3rd with a green tick, 4th on fire with a red cross. A rocket travels back from 1.4 to 1.3."><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Modern rollback strategies"><meta name="twitter:description" content="Bob walks you through 3 modern rollback strategies: the 10-minute recovery, 3-minute recovery, and immediate rollback strategy."><meta name="twitter:image" content="https://octopus.com/blog/img/cover/rollback-rocket.png"><meta name="twitter:image:alt" content="4 release boxes labelled 1.1 to 1.4, the 3rd with a green tick, 4th on fire with a red cross. A rocket travels back from 1.4 to 1.3."><meta name="view-transition" content="same-origin"><!-- Icons are decorative and used on ~10% of pages - load off the critical path -->
|
||
<link href="/blog/css/fa/css/fontawesome.css" rel="stylesheet" media="print" onload="this.media='all';this.onload=null">
|
||
<link href="/blog/css/fa/css/brands.css" rel="stylesheet" media="print" onload="this.media='all';this.onload=null">
|
||
<link href="/blog/css/fa/css/solid.css" rel="stylesheet" media="print" onload="this.media='all';this.onload=null">
|
||
<noscript>
|
||
<link href="/blog/css/fa/css/fontawesome.css" rel="stylesheet">
|
||
<link href="/blog/css/fa/css/brands.css" rel="stylesheet">
|
||
<link href="/blog/css/fa/css/solid.css" rel="stylesheet">
|
||
</noscript>
|
||
<meta name="google-site-verification" content="nIbWsTU_ELqMnLNxIexH_s6ch3m-s_MaFnl5u8WoaRM" />
|
||
|
||
<!-- Inline Script to set the initial theme -->
|
||
<script>
|
||
(() => {
|
||
const theme = localStorage.getItem('theme') || (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
|
||
document.documentElement.setAttribute('data-theme', theme);
|
||
})();
|
||
</script>
|
||
|
||
<script defer>
|
||
const whenActivated = new Promise((resolve) => {
|
||
if (document.prerendering) {
|
||
document.addEventListener('prerenderingchange', resolve);
|
||
} else {
|
||
resolve();
|
||
}
|
||
});
|
||
|
||
async function add_gtm(w,d,s,l,i) {
|
||
// Only add analytics if the page is not "pre-rendering"
|
||
await whenActivated;
|
||
|
||
w[l] = w[l]||[];w[l].push({'gtm.start': new Date().getTime(), event:'gtm.js'});
|
||
var f = d.getElementsByTagName(s)[0],
|
||
j = d.createElement(s),
|
||
dl = l != 'dataLayer'
|
||
? '&l=' + l
|
||
: '';
|
||
j.defer=true;
|
||
j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;
|
||
f.parentNode.insertBefore(j, f);
|
||
}
|
||
|
||
if (document.location.hostname === 'octopus.com'
|
||
|| document.location.hostname === 'www.octopus.com') {
|
||
// Only add analytics to production site
|
||
add_gtm(window, document, 'script', 'dataLayer', 'GTM-MQ943TFN');
|
||
}
|
||
</script><script type="application/ld+json">{
|
||
"@context": "https://schema.org",
|
||
"@type": "NewsArticle",
|
||
"headline": "Modern rollback strategies",
|
||
"description": "Bob walks you through 3 modern rollback strategies: the 10-minute recovery, 3-minute recovery, and immediate rollback strategy.",
|
||
"author": {
|
||
"@type": "Person",
|
||
"name": "Bob Walker"
|
||
},
|
||
"datePublished": "2023-10-02T00:00:00.000Z",
|
||
"dateModified": "2023-10-02T00:00:00.000Z",
|
||
"publisher": {
|
||
"@type": "Organization",
|
||
"name": "Octopus Deploy",
|
||
"logo": {
|
||
"@type": "ImageObject",
|
||
"url": "/blog/img/octopus-glyph.png",
|
||
"width": 32,
|
||
"height": 32
|
||
}
|
||
},
|
||
"mainEntityOfPage": {
|
||
"@type": "WebPage",
|
||
"@id": "https://octopus.com/blog/modern-rollback-strategies"
|
||
},
|
||
"image": {
|
||
"@type": "ImageObject",
|
||
"url": "https://octopus.com/blog/img/cover/rollback-rocket.png",
|
||
"width": 1200,
|
||
"height": 800
|
||
},
|
||
"articleSection": "DevOps, Rollbacks"
|
||
}</script><script type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://octopus.com/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https://octopus.com/blog"},{"@type":"ListItem","position":3,"name":"Modern rollback strategies","item":"https://octopus.com/blog/modern-rollback-strategies"}]}</script></head> <body data-theme="dark"> <nav class="skip-links" aria-label="Skip Links" id="site-top"> <a href="#site-nav">Skip to navigation</a> <a href="#site-main">Skip to main content</a> <a href="#site-footer">Skip to footer</a> </nav> <div data-shared-source="live" data-shared-fragment="navbar" data-shared-note="fetched https://octopus.com/fragments/navbar at 2026-09-11T10:55:57.546Z">
|
||
|
||
|
||
<nav class="navbar navbar-pu site-header" aria-label="Main" data-navbar-pu itemscope itemtype="https://schema.org/SiteNavigationElement">
|
||
<div class="nav-container">
|
||
<div class="navbar-content">
|
||
<a class="navbar__logo" href="https://octopus.com/" aria-label="Octopus Deploy homepage" data-navbar-logo itemprop="url">
|
||
<svg id="glyph-icon" class="icon icon--octopus" xmlns="http://www.w3.org/2000/svg" width="144.4" height="154.6" version="1.1" viewBox="0 0 144.4 154.6">
|
||
<!-- Generator: Adobe Illustrator 29.3.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 151) -->
|
||
<defs>
|
||
<style>
|
||
.logo-color {
|
||
fill: #0d80d8;
|
||
}
|
||
</style>
|
||
</defs>
|
||
<path id="glyph-icon1" data-name="glyph-icon" class="logo-color" d="M9.5,117.2c11.5-7.6,24.9-20.4,20-35.4-2.8-8.3-6.6-15.2-7.3-24.2-.5-7.6.7-15.2,3.3-22.1C35.8,7.4,66.6-5.9,94.4,2.4c25.6,7.8,43.2,38,32.7,64.1-6.1,15.2-8.9,27.1,4.7,38.7,3.8,3.1,12.7,8.1,12.7,13.8s-14.6-1.7-16-2.8c1.9,3.3,20,22.3,8.5,23.8-10.6,1.2-20-13.8-26.3-20.2-10.8-10.9-8.9,13.1-8.9,18.1,0,7.8-5.6,23.8-15.3,13.3-8-8.6-4.9-22.1-10.6-31.6-6.1-10.5-16.5,10.5-19,14.3-2.8,4.3-17.2,24.7-22.8,13.8-4.7-8.8,2.8-22.8,6.3-30.9-1.4,2.8-10.8,7.1-13.4,8.6-5.9,3.3-12.7,5-19.5,4.5-14.8-1-3.8-8.8,2.1-12.6Z"/>
|
||
</svg>
|
||
<svg id="wordmark-octopus-deploy" class="icon icon--octopus-deploy-wordmark" xmlns="http://www.w3.org/2000/svg" width="751.5" height="98.9" version="1.1" viewBox="0 0 751.5 98.9">
|
||
<!-- Generator: Adobe Illustrator 29.3.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 151) -->
|
||
<defs>
|
||
<style>
|
||
.logo-wordmark-color {
|
||
fill: #0a151e;
|
||
}
|
||
</style>
|
||
</defs>
|
||
<path id="wordmark-octopus-deploy1" data-name="wordmark-octopus-deploy" class="logo-wordmark-color" d="M70.2,39.2c0,8.2-1.5,15.3-4.6,21.2-3.1,5.8-7.2,10.3-12.5,13.4-5.3,3.1-11.3,4.7-17.9,4.7s-12.7-1.6-18-4.7c-5.3-3.1-9.4-7.6-12.5-13.5C1.5,54.5,0,47.5,0,39.2s1.5-15.3,4.6-21.1c3.1-5.9,7.3-10.4,12.5-13.5C22.4,1.6,28.4,0,35.1,0s12.7,1.6,17.9,4.7c5.3,3.1,9.5,7.6,12.5,13.5,3.1,5.8,4.6,12.9,4.6,21.1ZM56.3,39.2c0-5.8-.9-10.7-2.7-14.7-1.8-4-4.3-7-7.5-9.1-3.2-2.1-6.9-3.1-11-3.1s-7.8,1-11,3.1c-3.2,2-5.7,5.1-7.5,9.1-1.8,4-2.7,8.9-2.7,14.7s.9,10.7,2.7,14.7c1.8,4,4.3,7,7.5,9.1,3.2,2,6.9,3.1,11,3.1s7.8-1,11-3.1c3.2-2.1,5.7-5.1,7.5-9.1,1.8-4,2.7-8.9,2.7-14.7ZM103.6,78.6c-5.7,0-10.6-1.3-14.7-3.8-4.1-2.5-7.2-6-9.4-10.4-2.2-4.5-3.3-9.6-3.3-15.4s1.1-11,3.4-15.4c2.2-4.5,5.4-8,9.5-10.4,4.1-2.5,9-3.8,14.5-3.8s8.8.9,12.3,2.6c3.6,1.7,6.5,4.1,8.6,7.2,2.1,3.1,3.4,6.7,3.7,10.8h-12.9c-.5-2.8-1.8-5.1-3.7-6.9-1.9-1.9-4.5-2.8-7.8-2.8s-5.2.7-7.3,2.2c-2.1,1.5-3.7,3.6-4.9,6.3-1.1,2.8-1.7,6.1-1.7,9.9s.6,7.3,1.7,10.1c1.1,2.8,2.7,4.9,4.8,6.5,2.1,1.5,4.5,2.2,7.4,2.2s3.8-.4,5.3-1.1c1.6-.8,2.9-1.9,4-3.3,1.1-1.4,1.8-3.2,2.2-5.3h12.9c-.3,4.1-1.5,7.6-3.6,10.8-2.1,3.1-4.9,5.5-8.4,7.3-3.6,1.7-7.7,2.6-12.5,2.6ZM163.8,20.1v10.4h-32.9v-10.4h32.9ZM139,6.4h13.5v53.8c0,1.8.3,3.2.8,4.2.6.9,1.3,1.6,2.2,1.9.9.3,1.9.5,3.1.5s1.6,0,2.3-.2c.7-.1,1.3-.2,1.6-.3l2.3,10.6c-.7.2-1.8.5-3.1.8-1.3.3-2.9.5-4.8.5-3.4.1-6.4-.4-9.1-1.5-2.7-1.1-4.9-2.9-6.5-5.3-1.6-2.4-2.3-5.4-2.3-9V6.4ZM195.4,78.6c-5.6,0-10.4-1.2-14.5-3.7-4.1-2.5-7.3-5.9-9.6-10.3-2.2-4.4-3.4-9.6-3.4-15.5s1.1-11.1,3.4-15.6c2.3-4.5,5.4-7.9,9.6-10.4,4.1-2.5,9-3.7,14.5-3.7s10.4,1.2,14.6,3.7c4.1,2.5,7.3,5.9,9.5,10.4,2.3,4.5,3.4,9.6,3.4,15.6s-1.1,11.1-3.4,15.5c-2.2,4.4-5.4,7.9-9.5,10.3-4.1,2.5-9,3.7-14.6,3.7ZM195.5,67.7c3,0,5.6-.8,7.6-2.5,2-1.7,3.6-4,4.6-6.8,1-2.8,1.5-6,1.5-9.5s-.5-6.7-1.5-9.5c-1-2.9-2.5-5.1-4.6-6.8-2-1.7-4.6-2.5-7.6-2.5s-5.7.8-7.8,2.5c-2,1.7-3.6,4-4.6,6.8-1,2.8-1.5,6-1.5,9.5s.5,6.6,1.5,9.5c1,2.8,2.5,5.1,4.6,6.8,2.1,1.7,4.7,2.5,7.8,2.5ZM230.3,98.9V20.1h13.3v9.5h.8c.7-1.4,1.7-2.9,2.9-4.4,1.3-1.6,3-2.9,5.1-4.1,2.2-1.1,4.9-1.7,8.3-1.7s8.4,1.1,12,3.4c3.6,2.2,6.4,5.6,8.5,10,2.1,4.4,3.2,9.7,3.2,16.1s-1,11.6-3.1,16c-2.1,4.4-4.9,7.8-8.4,10.1-3.6,2.3-7.6,3.5-12.1,3.5s-6-.5-8.2-1.6c-2.2-1.1-3.9-2.4-5.2-4-1.3-1.6-2.3-3-3-4.4h-.6v30.5h-13.5ZM243.5,48.8c0,3.7.5,7,1.6,9.7,1.1,2.8,2.6,5,4.6,6.5,2,1.5,4.5,2.3,7.3,2.3s5.5-.8,7.5-2.4c2-1.6,3.5-3.8,4.6-6.6,1-2.8,1.6-6,1.6-9.6s-.5-6.7-1.5-9.5c-1-2.8-2.5-4.9-4.6-6.5-2-1.6-4.5-2.4-7.5-2.4s-5.3.8-7.3,2.3c-2,1.5-3.5,3.6-4.6,6.4-1,2.7-1.5,6-1.5,9.7ZM328.4,53.3V20.1h13.5v57.3h-13.1v-10.2h-.6c-1.3,3.2-3.4,5.8-6.4,7.9-2.9,2-6.6,3.1-10.9,3.1s-7.1-.8-10-2.5c-2.9-1.7-5.1-4.1-6.7-7.3-1.6-3.2-2.4-7.1-2.4-11.7V20.1h13.5v34.4c0,3.6,1,6.5,3,8.7,2,2.1,4.6,3.2,7.8,3.2s3.9-.5,5.8-1.5c1.9-1,3.4-2.4,4.6-4.3,1.2-1.9,1.8-4.4,1.8-7.3ZM397,35.3l-12.3,1.3c-.3-1.2-1-2.4-1.8-3.5-.8-1.1-2-2-3.4-2.6-1.4-.7-3.2-1-5.3-1s-5.2.6-7.1,1.8c-1.9,1.2-2.8,2.8-2.8,4.7,0,1.7.6,3,1.8,4.1,1.3,1,3.4,1.9,6.3,2.6l9.8,2.1c5.4,1.2,9.5,3,12.1,5.6,2.7,2.5,4,5.9,4,10,0,3.6-1.1,6.8-3.2,9.6-2.1,2.7-4.9,4.9-8.6,6.4-3.7,1.5-7.9,2.3-12.7,2.3-7,0-12.7-1.5-16.9-4.4-4.3-3-6.8-7.1-7.6-12.3l13.2-1.3c.6,2.6,1.9,4.5,3.8,5.9,1.9,1.3,4.5,2,7.6,2s5.8-.7,7.7-2c2-1.3,2.9-2.9,2.9-4.9s-.6-3-1.9-4.1c-1.2-1.1-3.2-1.9-5.8-2.5l-9.8-2.1c-5.5-1.1-9.6-3.1-12.2-5.8-2.6-2.7-3.9-6.2-3.9-10.4,0-3.5.9-6.6,2.9-9.2,2-2.6,4.7-4.6,8.2-6,3.5-1.4,7.5-2.2,12.1-2.2,6.7,0,12,1.4,15.9,4.3,3.9,2.9,6.3,6.7,7.2,11.6ZM453.8,77.4h-25.9V1h26.4c7.6,0,14.1,1.5,19.5,4.6,5.5,3,9.7,7.4,12.6,13.1,2.9,5.7,4.4,12.5,4.4,20.4s-1.5,14.8-4.4,20.5c-2.9,5.7-7.2,10.1-12.7,13.2-5.5,3.1-12.2,4.6-19.9,4.6ZM441.7,65.5h11.4c5.3,0,9.8-1,13.3-2.9,3.6-2,6.2-4.9,8-8.8,1.8-3.9,2.7-8.8,2.7-14.6s-.9-10.7-2.7-14.5c-1.8-3.9-4.4-6.8-7.9-8.7-3.5-1.9-7.8-2.9-13-2.9h-11.8v52.5ZM524.7,78.6c-5.7,0-10.7-1.2-14.9-3.6-4.2-2.4-7.3-5.8-9.6-10.2-2.2-4.4-3.4-9.6-3.4-15.6s1.1-11.1,3.4-15.5c2.3-4.5,5.4-8,9.5-10.4,4.1-2.5,8.8-3.8,14.3-3.8s6.9.6,10,1.7c3.2,1.1,5.9,2.9,8.4,5.2,2.4,2.4,4.4,5.4,5.7,9,1.4,3.6,2.1,8,2.1,13v4.1h-47v-9.1h34c0-2.6-.6-4.9-1.7-6.9-1.1-2-2.6-3.6-4.6-4.8-1.9-1.2-4.2-1.8-6.8-1.8s-5.2.7-7.3,2c-2.1,1.3-3.7,3.1-4.9,5.2-1.1,2.1-1.7,4.5-1.8,7.1v7.9c0,3.3.6,6.2,1.8,8.6,1.2,2.4,2.9,4.2,5.1,5.4,2.2,1.2,4.8,1.9,7.7,1.9s3.7-.3,5.3-.8c1.6-.6,3-1.4,4.1-2.5,1.2-1.1,2.1-2.4,2.6-4.1l12.6,1.4c-.8,3.3-2.3,6.2-4.6,8.7-2.2,2.5-5,4.4-8.5,5.7-3.5,1.3-7.4,2-11.9,2ZM557.5,98.9V20.1h13.3v9.5h.8c.7-1.4,1.7-2.9,2.9-4.4,1.3-1.6,3-2.9,5.1-4.1,2.2-1.1,4.9-1.7,8.3-1.7s8.4,1.1,12,3.4c3.6,2.2,6.4,5.6,8.5,10,2.1,4.4,3.2,9.7,3.2,16.1s-1,11.6-3.1,16c-2.1,4.4-4.9,7.8-8.4,10.1-3.6,2.3-7.6,3.5-12.1,3.5s-6-.5-8.2-1.6c-2.2-1.1-3.9-2.4-5.2-4-1.3-1.6-2.3-3-3-4.4h-.6v30.5h-13.5ZM570.8,48.8c0,3.7.5,7,1.6,9.7,1.1,2.8,2.6,5,4.6,6.5,2,1.5,4.5,2.3,7.3,2.3s5.5-.8,7.5-2.4c2-1.6,3.5-3.8,4.6-6.6,1-2.8,1.6-6,1.6-9.6s-.5-6.7-1.5-9.5c-1-2.8-2.5-4.9-4.6-6.5-2-1.6-4.5-2.4-7.5-2.4s-5.3.8-7.3,2.3c-2,1.5-3.5,3.6-4.6,6.4-1,2.7-1.5,6-1.5,9.7ZM632.6,1v76.4h-13.5V1h13.5ZM667.4,78.6c-5.6,0-10.4-1.2-14.5-3.7-4.1-2.5-7.3-5.9-9.5-10.3-2.2-4.4-3.4-9.6-3.4-15.5s1.1-11.1,3.4-15.6c2.3-4.5,5.4-7.9,9.5-10.4s9-3.7,14.5-3.7,10.4,1.2,14.5,3.7c4.1,2.5,7.3,5.9,9.5,10.4,2.3,4.5,3.4,9.6,3.4,15.6s-1.1,11.1-3.4,15.5c-2.2,4.4-5.4,7.9-9.5,10.3-4.1,2.5-9,3.7-14.5,3.7ZM667.5,67.7c3,0,5.6-.8,7.6-2.5,2-1.7,3.6-4,4.6-6.8,1-2.8,1.5-6,1.5-9.5s-.5-6.7-1.5-9.5c-1-2.9-2.5-5.1-4.6-6.8-2-1.7-4.6-2.5-7.6-2.5s-5.7.8-7.8,2.5c-2,1.7-3.6,4-4.6,6.8-1,2.8-1.5,6-1.5,9.5s.5,6.6,1.5,9.5c1,2.8,2.5,5.1,4.6,6.8,2.1,1.7,4.7,2.5,7.8,2.5ZM708.7,98.9c-1.8,0-3.5-.1-5.1-.4-1.5-.3-2.8-.6-3.7-1l3.1-10.5c2,.6,3.7.8,5.3.8s2.9-.5,4.1-1.5c1.2-.9,2.2-2.5,3-4.6l1.2-3.1-20.8-58.5h14.3l13.2,43.3h.6l13.2-43.3h14.4l-22.9,64.2c-1.1,3-2.5,5.6-4.3,7.8-1.8,2.2-3.9,3.9-6.5,5-2.5,1.2-5.6,1.8-9.1,1.8Z"/>
|
||
</svg>
|
||
<span class="visually-hidden" itemprop="name">Octopus Deploy</span>
|
||
</a>
|
||
|
||
<div id="main-navbar" class="navbar__menu" data-navbar-menu>
|
||
<ul class="navbar__sections">
|
||
<li class="navbar__section">
|
||
<button type="button" class="navbar__button" aria-expanded="false" aria-controls="dropdown-solutions"
|
||
data-navbar-section-toggle data-target="dropdown-solutions"
|
||
aria-label="Solutions menu">
|
||
<span>Solutions</span>
|
||
<svg class="icon icon--chevron-navbar" width="13" height="8" viewBox="0 0 13 8" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<path d="M1.98755 1.5L6.98755 6.5L11.9875 1.5" stroke="#303E49" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||
</svg>
|
||
|
||
</button>
|
||
</li>
|
||
<li class="navbar__section">
|
||
<a class="navbar__button" href="https://octopus.com/pricing/overview" itemprop="url">
|
||
<span itemprop="name">Pricing</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__section">
|
||
<a class="navbar__button" href="https://octopus.com/docs" target="_blank" rel="noopener noreferrer" itemprop="url">
|
||
<span itemprop="name">Docs</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__section">
|
||
<button type="button" class="navbar__button" aria-expanded="false" aria-controls="dropdown-resources"
|
||
data-navbar-section-toggle data-target="dropdown-resources"
|
||
aria-label="Resources menu">
|
||
<span>Resources</span>
|
||
<svg class="icon icon--chevron-navbar" width="13" height="8" viewBox="0 0 13 8" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<path d="M1.98755 1.5L6.98755 6.5L11.9875 1.5" stroke="#303E49" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||
</svg>
|
||
|
||
</button>
|
||
</li>
|
||
<li class="navbar__section">
|
||
<button type="button" class="navbar__button" aria-expanded="false" aria-controls="dropdown-company"
|
||
data-navbar-section-toggle data-target="dropdown-company"
|
||
aria-label="Company menu">
|
||
<span>Company</span>
|
||
<svg class="icon icon--chevron-navbar" width="13" height="8" viewBox="0 0 13 8" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<path d="M1.98755 1.5L6.98755 6.5L11.9875 1.5" stroke="#303E49" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||
</svg>
|
||
|
||
</button>
|
||
</li>
|
||
</ul>
|
||
|
||
<ul class="navbar__sections navbar__sections--secondary" data-navbar-secondary>
|
||
<li class="navbar__section" data-navbar-signin>
|
||
<a class="navbar__button" href="https://octopus.com/signin" rel="nofollow" itemprop="url">
|
||
<span itemprop="name">Sign in</span>
|
||
</a>
|
||
</li>
|
||
|
||
<li class="navbar__section navbar__section--contact">
|
||
<a class="navbar__button navbar__button--contact button button--secondary" href="https://octopus.com/company/contact" itemprop="url">
|
||
<span itemprop="name">Contact us</span>
|
||
</a>
|
||
</li>
|
||
|
||
<li class="navbar__section" data-navbar-signup>
|
||
<a class="navbar__button navbar__button--signup button button--primary" href="https://octopus.com/free-signup?location=nav-bar" rel="nofollow" itemprop="url">
|
||
<span itemprop="name">Start for free</span>
|
||
</a>
|
||
</li>
|
||
|
||
<li class="navbar__section navbar__section--user" data-navbar-profile hidden>
|
||
<div class="navbar__user-menu">
|
||
<button type="button" class="navbar__button navbar__user-toggle" data-navbar-profile-link
|
||
aria-expanded="false" aria-controls="dropdown-user" data-target="dropdown-user"
|
||
aria-label="User profile menu">
|
||
<span class="navbar__profile-image" data-navbar-profile-image>
|
||
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACw=" alt="" loading="lazy" hidden />
|
||
</span>
|
||
<span class="personal" data-navbar-profile-name>User</span>
|
||
<svg class="icon icon--chevron-navbar" width="13" height="8" viewBox="0 0 13 8" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<path d="M1.98755 1.5L6.98755 6.5L11.9875 1.5" stroke="#303E49" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||
</svg>
|
||
|
||
</button>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
<button class="navbar__toggler" type="button" aria-label="Open navigation menu" aria-controls="main-navbar" aria-expanded="false" data-navbar-toggler>
|
||
<span class="hamburger" aria-hidden="true">
|
||
<span class="hamburger__bar"></span>
|
||
<span class="hamburger__bar"></span>
|
||
<span class="hamburger__bar"></span>
|
||
</span>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="navbar__panels" data-navbar-panels>
|
||
<nav class="navbar__dropdown" id="dropdown-solutions" data-navbar-dropdown aria-label="Solutions">
|
||
<button type="button" class="navbar__back-btn" data-navbar-back aria-label="Back to menu">
|
||
<svg class="icon icon--chevron-navbar" width="13" height="8" viewBox="0 0 13 8" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<path d="M1.98755 1.5L6.98755 6.5L11.9875 1.5" stroke="#303E49" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||
</svg>
|
||
|
||
<span>Back</span>
|
||
</button>
|
||
|
||
|
||
|
||
<div class="navbar__subsection">
|
||
|
||
<ul class="navbar__subsection-items">
|
||
<li class="navbar__item">
|
||
<span class="navbar__item-sub-category">Octopus Deploy</span>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/use-case/kubernetes" itemprop="url">
|
||
<span class="navbar__item-icon" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/45x45/c234e77f86/icon-kubernetes.svg" alt="Kubernetes icon logo steer blue gradient" loading="lazy" width="45" height="45" />
|
||
</span>
|
||
|
||
</span>
|
||
<span class="navbar__item-label" itemprop="name">Kubernetes deployments</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/use-case/platform-hub" itemprop="url">
|
||
<span class="navbar__item-icon" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/45x45/cc44e17bdf/icon-platform-hub.svg" alt="Blue boxes stacked on top of each other" loading="lazy" width="45" height="45" />
|
||
</span>
|
||
|
||
</span>
|
||
<span class="navbar__item-label" itemprop="name">Platform Hub</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/use-case/environment-promotion" itemprop="url">
|
||
<span class="navbar__item-icon" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/45x45/e2c09018a3/icon-environment-promotion.svg" alt="icon environment promotion gear blue gradient" loading="lazy" width="45" height="45" />
|
||
</span>
|
||
|
||
</span>
|
||
<span class="navbar__item-label" itemprop="name">Environment promotion</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/ai-tools" itemprop="url">
|
||
<span class="navbar__item-icon" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/45x45/bd93d826d3/icon-ai.svg" alt="AI icon" loading="lazy" width="45" height="45" />
|
||
</span>
|
||
|
||
</span>
|
||
<span class="navbar__item-label" itemprop="name">AI tools</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/use-case/argo-cd-in-octopus" itemprop="url">
|
||
<span class="navbar__item-icon" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/45x45/d42ce2a726/icon-argo.svg" alt="Argo icon" loading="lazy" width="45" height="45" />
|
||
</span>
|
||
|
||
</span>
|
||
<span class="navbar__item-label" itemprop="name">Argo CD in Octopus</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/use-case/runbooks" itemprop="url">
|
||
<span class="navbar__item-icon" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/45x45/d9ab08e6a3/icon-runbooks.svg" alt="runbooks running book with a wrench on it blue gradient" loading="lazy" width="45" height="45" />
|
||
</span>
|
||
|
||
</span>
|
||
<span class="navbar__item-label" itemprop="name">Automate operations tasks</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/use-case/tenanted-deployments" itemprop="url">
|
||
<span class="navbar__item-icon" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/45x45/c89e19472b/icon-tenanted-deployments.svg" alt="icon tenanted deployments blue gradient three people" loading="lazy" width="45" height="45" />
|
||
</span>
|
||
|
||
</span>
|
||
<span class="navbar__item-label" itemprop="name">Tenanted deployments</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<div class="navbar__subsection">
|
||
|
||
<ul class="navbar__subsection-items">
|
||
<li class="navbar__item">
|
||
<span class="navbar__item-sub-category">Explore</span>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/downloads" itemprop="url">
|
||
<span class="navbar__item-label" itemprop="name">Install Octopus self-hosted</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/downloads/compare" itemprop="url">
|
||
<span class="navbar__item-label" itemprop="name">Compare releases</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/integrations" itemprop="url">
|
||
<span class="navbar__item-label" itemprop="name">Integrations</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://roadmap.octopus.com/tabs/2-planned" itemprop="url">
|
||
<span class="navbar__item-label" itemprop="name">Octopus Roadmap</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/free" itemprop="url">
|
||
<span class="navbar__item-label" itemprop="name">Start for free</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
<svg class="icon icon--marker-navbar" xmlns="http://www.w3.org/2000/svg" width="32" height="15" viewBox="0 0 32 15" fill="none">
|
||
<path d="M13.8787 1.12132L0 15H32L18.1213 1.12132C16.9497 -0.0502526 15.0503 -0.050255 13.8787 1.12132Z" fill="white"/>
|
||
</svg>
|
||
</nav>
|
||
<nav class="navbar__dropdown" id="dropdown-resources" data-navbar-dropdown aria-label="Resources">
|
||
<button type="button" class="navbar__back-btn" data-navbar-back aria-label="Back to menu">
|
||
<svg class="icon icon--chevron-navbar" width="13" height="8" viewBox="0 0 13 8" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<path d="M1.98755 1.5L6.98755 6.5L11.9875 1.5" stroke="#303E49" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||
</svg>
|
||
|
||
<span>Back</span>
|
||
</button>
|
||
|
||
|
||
|
||
<div class="navbar__subsection">
|
||
<p class="navbar__subsection-title" id="dropdown-resources-explore">Explore</p>
|
||
|
||
<ul class="navbar__subsection-items" aria-labelledby="dropdown-resources-explore">
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/company/customers" itemprop="url">
|
||
<span class="navbar__item-icon" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/45x45/00525c876d/icon-customer-stories.svg" alt="icon customer stories success example graduate" loading="lazy" width="45" height="45" />
|
||
</span>
|
||
|
||
</span>
|
||
<span class="navbar__item-label" itemprop="name">Customer stories</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/webinars" itemprop="url">
|
||
<span class="navbar__item-icon" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/45x45/a7c01192c7/icon-webinars.svg" alt="icon camera webinars videos capture" loading="lazy" width="45" height="45" />
|
||
</span>
|
||
|
||
</span>
|
||
<span class="navbar__item-label" itemprop="name">Webinars</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/publications" itemprop="url">
|
||
<span class="navbar__item-icon" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/45x45/1845d0555a/icon-nav-publications.svg" alt="Publications icon" loading="lazy" width="45" height="45" />
|
||
</span>
|
||
|
||
</span>
|
||
<span class="navbar__item-label" itemprop="name">Publications</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/downloads" itemprop="url">
|
||
<span class="navbar__item-icon" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/45x45/0008b1a75e/nav-icon-downloads.svg" alt="Downloads icon" loading="lazy" width="45" height="45" />
|
||
</span>
|
||
|
||
</span>
|
||
<span class="navbar__item-label" itemprop="name">Downloads</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<div class="navbar__subsection">
|
||
<p class="navbar__subsection-title" id="dropdown-resources-support-and-services">Support and services</p>
|
||
|
||
<ul class="navbar__subsection-items" aria-labelledby="dropdown-resources-support-and-services">
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/docs" itemprop="url">
|
||
<span class="navbar__item-icon" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/45x45/0724935a2e/icon-devops-handbook.svg" alt="icon book devops DevOps handbook ci cd cycle" loading="lazy" width="45" height="45" />
|
||
</span>
|
||
|
||
</span>
|
||
<span class="navbar__item-label" itemprop="name">Documentation</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/support" itemprop="url">
|
||
<span class="navbar__item-icon" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/45x45/ecb140a3aa/icon-partners.svg" alt="icon support partners handshake trust" loading="lazy" width="45" height="45" />
|
||
</span>
|
||
|
||
</span>
|
||
<span class="navbar__item-label" itemprop="name">Customer support</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://learning.octopus.com/" target="_blank" rel="noopener noreferrer" itemprop="url">
|
||
<span class="navbar__item-icon" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/45x45/7802cd7dd7/icon-certificates-1.svg" alt="Certification icon" loading="lazy" width="45" height="45" />
|
||
</span>
|
||
|
||
</span>
|
||
<span class="navbar__item-label" itemprop="name">Certification</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/company/trust" itemprop="url">
|
||
<span class="navbar__item-icon" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/45x45/d01a1b10a9/icon-trust-security.svg" alt="icon trust and security lock pad" loading="lazy" width="45" height="45" />
|
||
</span>
|
||
|
||
</span>
|
||
<span class="navbar__item-label" itemprop="name">Trust and security</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<div class="navbar__subsection">
|
||
<p class="navbar__subsection-title" id="dropdown-resources-publications">Publications</p>
|
||
|
||
<ul class="navbar__subsection-items" aria-labelledby="dropdown-resources-publications">
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/publications/ai-pulse-report" itemprop="url">
|
||
<span class="navbar__item-label" itemprop="name">AI Pulse report</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/publications/compliance-through-continuous-delivery" itemprop="url">
|
||
<span class="navbar__item-label" itemprop="name">Compliance through CD</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/publications/platform-engineering-pulse" itemprop="url">
|
||
<span class="navbar__item-label" itemprop="name">Platform Engineering Pulse report</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/publications/state-of-gitops-report" itemprop="url">
|
||
<span class="navbar__item-label" itemprop="name">State of GitOps report</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/publications/argo-cd-best-practices" itemprop="url">
|
||
<span class="navbar__item-label" itemprop="name">Argo CD best practices</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/whitepapers/kubernetes-delivery-unlocked" itemprop="url">
|
||
<span class="navbar__item-label" itemprop="name">Kubernetes delivery unlocked</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/publications" itemprop="url">
|
||
<span class="navbar__item-label" itemprop="name">View all publications</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
<svg class="icon icon--marker-navbar" xmlns="http://www.w3.org/2000/svg" width="32" height="15" viewBox="0 0 32 15" fill="none">
|
||
<path d="M13.8787 1.12132L0 15H32L18.1213 1.12132C16.9497 -0.0502526 15.0503 -0.050255 13.8787 1.12132Z" fill="white"/>
|
||
</svg>
|
||
</nav>
|
||
<nav class="navbar__dropdown" id="dropdown-company" data-navbar-dropdown aria-label="Company">
|
||
<button type="button" class="navbar__back-btn" data-navbar-back aria-label="Back to menu">
|
||
<svg class="icon icon--chevron-navbar" width="13" height="8" viewBox="0 0 13 8" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<path d="M1.98755 1.5L6.98755 6.5L11.9875 1.5" stroke="#303E49" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||
</svg>
|
||
|
||
<span>Back</span>
|
||
</button>
|
||
|
||
|
||
|
||
<div class="navbar__subsection">
|
||
<p class="navbar__subsection-title" id="dropdown-company-careers">Careers</p>
|
||
|
||
<ul class="navbar__subsection-items" aria-labelledby="dropdown-company-careers">
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/company/careers" itemprop="url">
|
||
<span class="navbar__item-icon" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/45x45/91b747265a/icon-careers-join-us.svg" alt="icon person plus career join us" loading="lazy" width="45" height="45" />
|
||
</span>
|
||
|
||
</span>
|
||
<span class="navbar__item-label" itemprop="name">Join us</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://handbook.octopus.com/" target="_blank" rel="noopener noreferrer" itemprop="url">
|
||
<span class="navbar__item-icon" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/45x45/94e4d7a548/icon-company-handbook.svg" alt="icon octopus handbook book" loading="lazy" width="45" height="45" />
|
||
</span>
|
||
|
||
</span>
|
||
<span class="navbar__item-label" itemprop="name">Company handbook</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<div class="navbar__subsection">
|
||
<p class="navbar__subsection-title" id="dropdown-company-explore">Explore</p>
|
||
|
||
<ul class="navbar__subsection-items" aria-labelledby="dropdown-company-explore">
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/company" itemprop="url">
|
||
<span class="navbar__item-label" itemprop="name">About us</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/company/contact" itemprop="url">
|
||
<span class="navbar__item-label" itemprop="name">Contact us</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/news" itemprop="url">
|
||
<span class="navbar__item-label" itemprop="name">News and media</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/events" itemprop="url">
|
||
<span class="navbar__item-label" itemprop="name">Events</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/partners" itemprop="url">
|
||
<span class="navbar__item-label" itemprop="name">Our partners</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://shop.octopus.com/" target="_blank" rel="noopener noreferrer" itemprop="url">
|
||
<span class="navbar__item-label" itemprop="name">Swag</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
<svg class="icon icon--marker-navbar" xmlns="http://www.w3.org/2000/svg" width="32" height="15" viewBox="0 0 32 15" fill="none">
|
||
<path d="M13.8787 1.12132L0 15H32L18.1213 1.12132C16.9497 -0.0502526 15.0503 -0.050255 13.8787 1.12132Z" fill="white"/>
|
||
</svg>
|
||
</nav>
|
||
|
||
|
||
<nav class="navbar__dropdown" id="dropdown-user" data-navbar-profile-dropdown aria-label="User profile">
|
||
<button type="button" class="navbar__back-btn" data-navbar-back aria-label="Back to menu">
|
||
<svg class="icon icon--chevron-navbar" width="13" height="8" viewBox="0 0 13 8" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<path d="M1.98755 1.5L6.98755 6.5L11.9875 1.5" stroke="#303E49" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||
</svg>
|
||
|
||
<span>Back</span>
|
||
</button>
|
||
<p class="navbar__panel-title" data-navbar-user-title>User</p>
|
||
<div class="navbar__subsection">
|
||
<ul class="navbar__subsection-items">
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://billing.octopus.com" itemprop="url">
|
||
<span class="navbar__item-icon" aria-hidden="true">
|
||
<span class="image-wrapper">
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45"><rect width="45" height="45" rx="8.9" fill="#f4f6f8"/><path d="M29.4 20.7l-.3.5c-.1.2-.3.3-.5.2-.4-.2-.8-.4-1.2-.7-.2-.1-.2-.4-.1-.6l.3-.5-.6-1h-.6c-.2 0-.4-.2-.4-.4v-1.3c0-.2.2-.4.4-.4h.6c.1-.4.3-.7.6-1l-.3-.5c-.1-.2 0-.4.1-.6.3-.3.7-.5 1.2-.7.2 0 .4 0 .5.2l.3.5h1.1l.3-.5c.1-.2.3-.3.5-.2.4.2.8.4 1.2.7.2.1.2.4.1.6l-.3.5.6 1h.6c.2 0 .4.2.4.4v1.3c0 .2-.2.4-.4.4h-.6c-.1.4-.3.7-.6 1l.3.5c.1.2 0 .4-.1.6-.3.3-.7.5-1.2.7-.2 0-.4 0-.5-.2l-.3-.5h-1.1zm-.4-2.1c1.4 1 3-.5 1.9-1.9-1.4-1-3 .5-1.9 1.9zm-4.1 5.5l1.2.6c.4.2.5.6.4 1-.3.9-.9 1.6-1.5 2.3-.3.3-.7.4-1.1.2l-1-.6c-.6.5-1.2.9-2 1.1v1.2c0 .4-.3.8-.7.8-.9.1-1.8.2-2.7 0-.4 0-.7-.4-.7-.8v-1.2c-.7-.3-1.4-.6-2-1.1l-1 .6c-.4.2-.8.1-1.1-.2-.6-.7-1.2-1.5-1.5-2.3-.1-.4 0-.8.4-1l1.2-.6c-.1-.7-.1-1.5 0-2.2l-1.2-.6c-.4-.2-.5-.6-.4-1 .3-.9.9-1.6 1.5-2.3.3-.3.7-.4 1.1-.2l1 .6c.6-.5 1.2-.9 2-1.1v-1.2c0-.4.3-.8.7-.8.9-.1 1.8-.2 2.7 0 .4 0 .7.4.7.8v1.2c.7.3 1.4.6 2 1.1l1-.6c.4-.2.8-.1 1.1.2.6.7 1.2 1.5 1.5 2.3.1.4 0 .8-.4 1l-1.2.6c.1.7.1 1.5 0 2.2zm-4.2.7c2.1-2.7-1-5.8-3.8-3.7-2.1 2.7 1 5.8 3.8 3.7zm8.7 6.4l-.3.5c-.1.2-.3.3-.5.2-.4-.2-.8-.4-1.2-.7-.2-.1-.2-.4-.1-.6l.3-.5-.6-1h-.6c-.2 0-.4-.2-.4-.4v-1.3c0-.2.2-.4.4-.4h.6c.1-.4.3-.7.6-1l-.3-.5c-.1-.2 0-.4.1-.6.3-.3.7-.5 1.2-.7.2 0 .4 0 .5.2l.3.5h1.1l.3-.5c.1-.2.3-.3.5-.2.4.2.8.4 1.2.7.2.1.2.4.1.6l-.3.5.6 1h.6c.2 0 .4.2.4.4v1.3c0 .2-.2.4-.4.4h-.6c-.1.4-.3.7-.6 1l.3.5c.1.2 0 .4-.1.6-.3.3-.7.5-1.2.7-.2 0-.4 0-.5-.2l-.3-.5h-1.1zm-.4-2c1.4 1 3-.5 1.9-1.9-1.4-1-3 .5-1.9 1.9z" fill="#282f38"/></svg>
|
||
</span>
|
||
</span>
|
||
<span class="navbar__item-label" itemprop="name">Control Center</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/profile" itemprop="url">
|
||
<span class="navbar__item-icon" aria-hidden="true">
|
||
<span class="image-wrapper">
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45"><rect width="45" height="45" rx="8.9" fill="#f4f6f8"/><path d="M22.5 9C15 9 9 15 9 22.5S15 36 22.5 36 36 30 36 22.5 30 9 22.5 9zm0 5.2c2.6 0 4.8 2.1 4.8 4.8s-2.1 4.8-4.8 4.8-4.8-2.1-4.8-4.8 2.1-4.8 4.8-4.8zm0 18.8c-3.2 0-6.1-1.4-8-3.7 1-1.9 3-3.3 5.4-3.3h.4c.7.2 1.4.4 2.2.4s1.5-.1 2.2-.4h.4c2.3 0 4.3 1.3 5.4 3.3-1.9 2.3-4.8 3.7-8 3.7z" fill="#282f38"/></svg>
|
||
</span>
|
||
</span>
|
||
<span class="navbar__item-label" itemprop="name">Profile</span>
|
||
</a>
|
||
</li>
|
||
<li class="navbar__item">
|
||
<a class="navbar__item-link" href="https://octopus.com/signout" data-navbar-signout itemprop="url">
|
||
<span class="navbar__item-icon" aria-hidden="true">
|
||
<span class="image-wrapper">
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45"><rect width="45" height="45" rx="8.9" fill="#f4f6f8"/><path d="M33.5,23.1l-7.7,7.4c-.7.7-1.9.2-1.9-.8v-4.2h-6.2c-.6,0-1.1-.5-1.1-1.1v-4.2c0-.6.5-1.1,1.1-1.1h6.2v-4.2c0-.9,1.2-1.4,1.9-.8l7.7,7.4c.4.4.4,1.1,0,1.5ZM19.6,30.3v-1.8c0-.3-.2-.5-.5-.5h-3.8c-.8,0-1.5-.6-1.5-1.4v-8.5c0-.8.7-1.4,1.5-1.4h3.8c.3,0,.5-.2.5-.5v-1.8c0-.3-.2-.5-.5-.5h-3.8c-2.4,0-4.4,1.9-4.4,4.2v8.5c0,2.3,2,4.2,4.4,4.2h3.8c.3,0,.5-.2.5-.5Z" fill="#282f38"/></svg>
|
||
</span>
|
||
</span>
|
||
<span class="navbar__item-label" itemprop="name">Sign out</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
<svg class="icon icon--marker-navbar" xmlns="http://www.w3.org/2000/svg" width="32" height="15" viewBox="0 0 32 15" fill="none">
|
||
<path d="M13.8787 1.12132L0 15H32L18.1213 1.12132C16.9497 -0.0502526 15.0503 -0.050255 13.8787 1.12132Z" fill="white"/>
|
||
</svg>
|
||
</nav>
|
||
</div>
|
||
</nav>
|
||
|
||
</div> <div class="content-group anim-show-parent"> <main id="site-main"> <nav class="site-breadcrumbs" aria-label="Breadcrumb"> <ol> <li> <a href="/blog" aria-current="false"> <span>Blog</span> </a> </li> <li> <a href="/blog/modern-rollback-strategies" aria-current="page"> <span>Modern rollback strategies</span> </a> </li> </ol> </nav> <article itemscope itemtype="https://schema.org/Article"> <header class="header__wrapper"> <figure class="image" data-image> <img src="/blog/i/x/cover/rollback-rocket.png" srcset="/blog/i/600/cover/rollback-rocket.webp 600w, /blog/i/1000/cover/rollback-rocket.webp 1000w, /blog/i/2000/cover/rollback-rocket.webp 1500w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" alt="4 release boxes labelled 1.1 to 1.4, the 3rd with a green tick, 4th on fire with a red cross. A rocket travels back from 1.4 to 1.3." class="image__img" width="1500" height="801" loading="eager" fetchpriority="high" decoding="sync"> </figure> <div class="header"> <h1 class="header__title">Modern rollback strategies</h1> </div> </header> <div class="page-content anim-show-parent" itemprop="articleBody"> <div class="author"> <a href="/blog/authors/bob-walker/1/" class="author__image-link"> <img class="author__image" srcset="/blog/i/600/authors/bob-walker.webp 140w" sizes="170px" src="/blog/i/x/authors/bob-walker.png" alt="Bob Walker" width="140" height="140"> </a> <div class="author__info"> <span class="author__name"> <a href="/blog/authors/bob-walker/1/"> <span> Bob Walker </span> </a> </span> <time class="author__time" datetime="Mon Oct 02 2023 00:00:00 GMT+0000 (Coordinated Universal Time)"> October 2, 2023 </time> </div> </div> <p>Rollbacks are the escape hatch everyone wants.</p>
|
||
<p>Harmful code made it to production. The website refuses to start. Users get error messages when browsing. It’s time to roll back. Yet, the rollback scripts weren’t tested. You last rolled back 4 years ago. The last 20 production deployments took less than 30 minutes. Will this rollback work? You don’t know.</p>
|
||
<p>In this post, I walk through 3 modern rollback strategies based on recovery time. Recovery time is how long it takes to go from “problem found” to “restored.”</p>
|
||
<h2 id="a-brief-primer-on-rollbacks">A brief primer on rollbacks</h2>
|
||
<p>Before getting started, let’s define rollbacks.</p>
|
||
<p><strong>A rollback is reverting to a previous version of the application.</strong></p>
|
||
<p>There is nuance in reverting to an application’s previous version. The reversion could involve redeploying the previous version. Or, the reversion could update a load balancer. The strategies presented in this post will cover both.</p>
|
||
<h3 id="why-roll-back">Why roll back?</h3>
|
||
<p>There are many reasons to roll back.</p>
|
||
<ul>
|
||
<li>The application won’t start</li>
|
||
<li>Users can’t sign in or use the application</li>
|
||
<li>Incorrect username, password, or token for database authentication</li>
|
||
<li>Expired credentials</li>
|
||
<li>Missing or incorrect configuration entries</li>
|
||
<li>During verification, testers find a “showstopping” bug</li>
|
||
<li>You need to deploy one or more external services on schedule</li>
|
||
<li>The database migration scripts failed</li>
|
||
</ul>
|
||
<p>That is not an exhaustive list. I’m sure you have many more reasons why you’ve rolled back.</p>
|
||
<h3 id="rollbacks-can-be-a-symptom-of-a-bigger-problem">Rollbacks can be a symptom of a bigger problem</h3>
|
||
<p>Many of the reasons listed above are a result of human error. That occurs when the software delivery pipeline relies on too much manual intervention. Manually building code, deploying build artifacts, and verifying changes is a recipe for disaster. I can’t count how often a configuration was the result of human error.</p>
|
||
<p>I recommend you follow the principles in Dave Farley and Jez Humble’s book <a href="https://continuousdelivery.com/">Continuous Delivery.</a> Doing so will force you to automate many manual tasks. Also, you’ll follow the same deployment process for all environments. That will prevent many of the reasons to roll back.</p>
|
||
<h3 id="rollback-risks">Rollback risks</h3>
|
||
<p>No rollback is risk-free. Part of the rollback process is deciding to roll back. Often, it’s a question of which option is riskier. Sometimes, a roll-forward is less risky than a rollback. Other times, a rollback is less risky than a roll-forward.</p>
|
||
<p>Even if your deployment schedule is once a week, each deployment will have a mix of fixes and features. The fixes could squash a critical bug or close a security vulnerability. You cannot choose to roll back a specific change when rolling back. All the changes roll back, or nothing rolls back.</p>
|
||
<h3 id="theres-no-magic-bullet-or-one-size-fits-all-solution">There’s no magic bullet, or one size fits all solution</h3>
|
||
<p>I often talk to prospective customers looking for an “easy” rollback solution. They want a tool or process that will immediately roll back their application. A process that covers all their rollback scenarios with a minimal amount of work.</p>
|
||
<p><em>Such a solution does not exist.</em></p>
|
||
<p>The 10-minute strategy detailed below should take less than a day to configure. It covers the majority of rollback scenarios. Having an automated deployment process removes many of the reasons rollbacks occur. But, the process only covers some possible rollback scenarios.</p>
|
||
<p><em>Implementing an immediate rollback strategy for all scenarios requires architectural and process changes. It goes beyond the deployment tool.</em></p>
|
||
<p>I’m not referring to deployment process changes. An immediate rollback strategy changes how you make code and database changes in your application. It requires a robust automated suite of tests. That all takes time and money to create.</p>
|
||
<h2 id="dont-rollback-the-database">Don’t rollback the database</h2>
|
||
<p>The database is a critical component of your application. It stores all your user data. Unless a catastrophic event happens, data loss is unacceptable. Data loss has real-world impacts. Imagine losing a lifesaving prescription from a patient database in a hospital. Or a loan entry to save a family farm.</p>
|
||
<p>There are 2 ways to roll back a database—both of which will likely result in data loss:</p>
|
||
<ol>
|
||
<li>Run rollback scripts</li>
|
||
<li>Restore a database backup</li>
|
||
</ol>
|
||
<h3 id="rollback-script-pitfalls">Rollback script pitfalls</h3>
|
||
<p>Missing or corrupted data impacts your users. Relational databases are responsible for referential integrity. The code base handles business rules.</p>
|
||
<p>Despite that, we write rollback scripts to remove or manipulate data. For example, you add a column to an existing table. You need to roll back that change. The rollback script removes that added column. Simple. But, that script may not take into account nuances.</p>
|
||
<ul>
|
||
<li>Was there any data in that column? If so, who added it, the users or the migration script?</li>
|
||
<li>Will users have to re-key the data after that column is re-added?</li>
|
||
<li>Is that column used as a foreign key to other tables?</li>
|
||
</ul>
|
||
<h3 id="restore-database-backup-pitfalls">Restore database backup pitfalls</h3>
|
||
<p>A database backup has a finite useful lifespan. A database backup from 15 minutes ago is much more useful than one 24 hours old.</p>
|
||
<p>Restoring a database backup will result in data loss. The restoration will remove any data changed since that backup. If you’re lucky, no users used the application since the database backup creation. But luck isn’t a strategy.</p>
|
||
<h3 id="restore-databases-as-a-last-resort">Restore databases as a last resort</h3>
|
||
<p>Restoring database backups should be a last resort. It’s not the default option. Only do it when a catastrophic error occurs and there’s no other option. For example when:</p>
|
||
<ul>
|
||
<li>Several disks on a SAN fail</li>
|
||
<li>A hurricane hits the data center hosting the database</li>
|
||
<li>The database file gets corrupted due to a bug</li>
|
||
</ul>
|
||
<h3 id="take-the-database-out-of-the-rollback-process">Take the database out of the rollback process</h3>
|
||
<p>The 3 rollback strategies below rely on never rolling back a database. They rely on every database change being a roll forward.</p>
|
||
<p>The risk of data loss or something going wrong is too high. With enough time and effort, you can mitigate those risks. But how often do you plan on rolling back? It should be an exception, not the norm. You’ll end up spending a tremendous amount of time and money working on a script that will never run. That time and effort could be better spent on improving the rollout process.</p>
|
||
<p>Taking the database out of the rollback process makes rollbacks more workable. You’ll still have challenges, but they won’t be “data lost” challenges.</p>
|
||
<h2 id="10-minute-recovery-rollback-strategy">10-minute recovery rollback strategy</h2>
|
||
<p>The 10-minute recovery rollback strategy redeploys the previous application version. But during the redeployment, it skips any database steps.</p>
|
||
<figure>
|
||
<p><img src="/blog/i/x/modern-rollback-strategies/10-minute-rollback-strategy-overview.png" alt="Skipping steps with the 10 minute overview strategy" loading="lazy" srcset="/blog/i/600/modern-rollback-strategies/10-minute-rollback-strategy-overview.webp 600w, /blog/i/1000/modern-rollback-strategies/10-minute-rollback-strategy-overview.webp 1000w, /blog/i/2000/modern-rollback-strategies/10-minute-rollback-strategy-overview.webp 1603w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="1603" height="1227"></p>
|
||
</figure>
|
||
<h3 id="how-it-works">How it works</h3>
|
||
<p>The post-deployment verification discovers a catastrophic problem. Should you roll back? Should you roll forward? Before deciding, review the database migration scripts.</p>
|
||
<ul>
|
||
<li>No schema changes = Safe to rollback.</li>
|
||
<li>Existing column added to a select stored procedure or view = Safe to rollback.</li>
|
||
<li>New nullable columns added = Developers must review before rolling back.</li>
|
||
<li>Significant schema changes = Unsafe to rollback.</li>
|
||
</ul>
|
||
<p>The next decision is how long it will take to fix the issue. Is it a configuration issue? Is it an undiscovered bug?</p>
|
||
<p>Assuming it’s safe to roll back, you redeploy the previous code version. The deployment process detects it’s a rollback and skips the database steps.</p>
|
||
<h3 id="octopus-deploy-configuration">Octopus Deploy configuration</h3>
|
||
<p>Of the 3 rollback strategies, this requires the most configuration.</p>
|
||
<p>Step 1. Add the community library step template <strong><a href="https://library.octopus.com/step-templates/d166457a-1421-4731-b143-dd6766fb95d5/actiontemplate-calculate-deployment-mode">Calculate Deployment Mode</a></strong> to your process.</p>
|
||
<p>Step 2. Move that step to the start of the deployment process.</p>
|
||
<figure>
|
||
<p><img src="/blog/i/x/modern-rollback-strategies/10-minute-strategy-calc-deployment-mode.png" alt="Adding the calculate deployment mode step." loading="lazy" srcset="/blog/i/600/modern-rollback-strategies/10-minute-strategy-calc-deployment-mode.webp 600w, /blog/i/1000/modern-rollback-strategies/10-minute-strategy-calc-deployment-mode.webp 1000w, /blog/i/2000/modern-rollback-strategies/10-minute-strategy-calc-deployment-mode.webp 1274w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="1274" height="798"></p>
|
||
</figure>
|
||
<p>Step 3. Set the run condition to <strong>Variable</strong> for each step to skip during rollback. Set the value to: <code>#{unless Octopus.Deployment.Error}#{Octopus.Action[Calculate Deployment Mode].Output.RunOnDeploy}#{/unless}.</code> I’m skipping steps 2, 3, 4, 5, and 6 for my example application.</p>
|
||
<figure>
|
||
<p><img src="/blog/i/x/modern-rollback-strategies/10-minute-strategy-run-conditions.png" alt="Adding the variable run condition to each database step" loading="lazy" srcset="/blog/i/600/modern-rollback-strategies/10-minute-strategy-run-conditions.webp 600w, /blog/i/1000/modern-rollback-strategies/10-minute-strategy-run-conditions.webp 1000w, /blog/i/2000/modern-rollback-strategies/10-minute-strategy-run-conditions.webp 1497w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="1497" height="1007"></p>
|
||
</figure>
|
||
<p>Step 4. Test the changes. Create a release and deploy it to a test environment. You’ll see the skipped steps run for the deployment.</p>
|
||
<figure>
|
||
<p><img src="/blog/i/x/modern-rollback-strategies/10-minute-strategy-first-release.png" alt="creating the first release to test." loading="lazy" srcset="/blog/i/600/modern-rollback-strategies/10-minute-strategy-first-release.webp 600w, /blog/i/1000/modern-rollback-strategies/10-minute-strategy-first-release.webp 1000w, /blog/i/2000/modern-rollback-strategies/10-minute-strategy-first-release.webp 1486w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="1486" height="1158"></p>
|
||
</figure>
|
||
<p>Step 5. Create another release and deploy it to the same environment.</p>
|
||
<figure>
|
||
<p><img src="/blog/i/x/modern-rollback-strategies/10-minute-strategy-second-release.png" alt="Creating the second release to test." loading="lazy" srcset="/blog/i/600/modern-rollback-strategies/10-minute-strategy-second-release.webp 600w, /blog/i/1000/modern-rollback-strategies/10-minute-strategy-second-release.webp 1000w, /blog/i/2000/modern-rollback-strategies/10-minute-strategy-second-release.webp 1482w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="1482" height="820"></p>
|
||
</figure>
|
||
<p>Step 6. Redeploy the first release.</p>
|
||
<figure>
|
||
<p><img src="/blog/i/x/modern-rollback-strategies/10-minute-strategy-redeploy.png" alt="Redeploying the previous release via the overflow menu." loading="lazy" srcset="/blog/i/600/modern-rollback-strategies/10-minute-strategy-redeploy.webp 600w, /blog/i/1000/modern-rollback-strategies/10-minute-strategy-redeploy.webp 1000w, /blog/i/2000/modern-rollback-strategies/10-minute-strategy-redeploy.webp 1907w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="1907" height="699"></p>
|
||
</figure>
|
||
<p>Step 7. In the deployment, you’ll see all the database steps skipped.</p>
|
||
<figure>
|
||
<p><img src="/blog/i/x/modern-rollback-strategies/10-minute-strategy-skipped-steps.png" alt="All the database steps are skipped on rollback." loading="lazy" srcset="/blog/i/600/modern-rollback-strategies/10-minute-strategy-skipped-steps.webp 600w, /blog/i/1000/modern-rollback-strategies/10-minute-strategy-skipped-steps.webp 1000w, /blog/i/2000/modern-rollback-strategies/10-minute-strategy-skipped-steps.webp 1494w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="1494" height="1072"></p>
|
||
</figure>
|
||
<h3 id="recovery-time-explained">Recovery time explained</h3>
|
||
<p>The redeployment will not take long unless you have a complex process. That’s because you are skipping the most time-consuming steps. It’s common to see a redeployment take one-third to half of the time.</p>
|
||
<p>You spend the majority of the recovery time reviewing database migration scripts. Is it safe to roll back? Would a rollback introduce too much risk and unknowns?</p>
|
||
<h3 id="who-the-strategy-is-for">Who the strategy is for</h3>
|
||
<p>Anyone not doing rollbacks today should consider this strategy first.</p>
|
||
<ul>
|
||
<li>You only need to change the deployment process, not how you make database changes.</li>
|
||
<li>With minimal effort, you have covered most use cases.</li>
|
||
</ul>
|
||
<p>After I implemented automated deployments, the vast majority of rollback requests came from QA. Development and test environments are unstable during normal software development. An unexpected bug can slip through despite pull requests, code reviews, and automated tests.</p>
|
||
<p>There are far more code changes than database changes. Especially in development and testing environments. It’s common to see 20 code check-ins for every database check-in. There’s a high likelihood you can roll back a showstopping bug.</p>
|
||
<h3 id="downsides-and-pitfalls">Downsides and pitfalls</h3>
|
||
<p>The primary downside of this strategy is you can only roll back in some situations. A breaking schema change prevents rollbacks. The only course of recovery is to roll forward. That could take hours or days.</p>
|
||
<h3 id="deployment-automation-removes-a-lot-of-reasons-to-rollback">Deployment automation removes a lot of reasons to rollback</h3>
|
||
<p>Don’t dismiss this strategy because of the potential for multi-hour recovery. That’s looking at this strategy through the lens of manual deployments. Look at it through the lens of automated deployments. Many scenarios requiring a rollback don’t apply with automated deployments.</p>
|
||
<ul>
|
||
<li>Source control houses all the application configurations. The deployment tool automatically applies those configurations.</li>
|
||
<li>Code is automatically built following the same process. No steps are accidentally skipped.</li>
|
||
<li>The same build artifact gets deployed to all environments. What passed testing, automated or manual, goes to production.</li>
|
||
<li>The build artifacts are automatically deployed using the same process for all environments. The process gets tested at least once before production.</li>
|
||
<li>Most automated deployments take 10–15 minutes to complete. Pushing a fix through all the required environments can take less than an hour.</li>
|
||
<li>Most failures requiring a rollback will now occur in testing environments, not production.</li>
|
||
</ul>
|
||
<p>This strategy requires minimum effort but has a significant pay-off.</p>
|
||
<h2 id="3-minute-recovery-strategy">3-minute recovery strategy</h2>
|
||
<p>The 3-minute recovery strategy decouples the database changes from the code changes. You need to deploy the database changes hours or days before code changes. The previous application version will work with the current database changes. That removes a significant risk when rolling back.</p>
|
||
<figure>
|
||
<p><img src="/blog/i/x/modern-rollback-strategies/3-minute-overview.png" alt="Screenshot of the deployment processes for 3-minute recovery." loading="lazy" srcset="/blog/i/600/modern-rollback-strategies/3-minute-overview.webp 600w, /blog/i/1000/modern-rollback-strategies/3-minute-overview.webp 1000w, /blog/i/2000/modern-rollback-strategies/3-minute-overview.webp 1902w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="1902" height="857"></p>
|
||
</figure>
|
||
<h3 id="how-it-works-1">How it works</h3>
|
||
<p>Decouple the deployment processes for the code and database:</p>
|
||
<ol>
|
||
<li>Hours or days before deploying the application, deploy the database changes</li>
|
||
<li>After a period of time, deploy the code changes</li>
|
||
<li>Roll back the code changes when you discover a showstopping bug</li>
|
||
</ol>
|
||
<p>There’s no need to check database migration scripts before rolling back. You already know the previous application version works with the current database.</p>
|
||
<p>Automated testing is a must for this strategy. The only way you know database changes are backward compatible is via testing. The only way to test everything is via automation. Without an automated testing suite, you’ll miss something.</p>
|
||
<h3 id="expand-and-contract-pattern">Expand and contract pattern</h3>
|
||
<p>This strategy requires the adoption of the expand and contract pattern.</p>
|
||
<figure>
|
||
<p><img src="/blog/i/x/modern-rollback-strategies/3-minute-expand-and-contract-pattern.png" alt="The expand and contract pattern with deployments" loading="lazy" srcset="/blog/i/600/modern-rollback-strategies/3-minute-expand-and-contract-pattern.webp 600w, /blog/i/1000/modern-rollback-strategies/3-minute-expand-and-contract-pattern.webp 1000w, /blog/i/2000/modern-rollback-strategies/3-minute-expand-and-contract-pattern.webp 1245w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="1245" height="611"></p>
|
||
</figure>
|
||
Image Source: https://openpracticelibrary.com/practice/expand-and-contract-pattern/
|
||
<p>Unlike the previous rollback strategy, the expand and contract pattern requires 4 deployments. Using the example from the diagram, change the colorName column name to <code>colorCode</code>.</p>
|
||
<ol>
|
||
<li>The first deployment adds the new column <code>colorCode</code> to the database. That is the expansion.</li>
|
||
<li>The second deployment updates the source code to write to both columns. Also, backfill <code>colorCode</code> if possible.</li>
|
||
<li>The third deployment removes the code that writes to <code>colorName</code>.</li>
|
||
<li>The fourth deployment removes the <code>colorName</code> column from the database.</li>
|
||
</ol>
|
||
<p>It’s an iterative approach to making database changes. Each deployment makes small changes that you can roll back. But you can’t roll back after the fourth deployment occurs.</p>
|
||
<h3 id="octopus-deploy-configuration-1">Octopus Deploy configuration</h3>
|
||
<p>Of the 3 strategies, this strategy requires the least amount of configuration. Move the database deployment process into a separate project. Note: this process does not have the <strong>Calculate Deployment Mode</strong> step.</p>
|
||
<figure>
|
||
<p><img src="/blog/i/x/modern-rollback-strategies/3-minute-database-process.png" alt="The database deployment process in a separate project." loading="lazy" srcset="/blog/i/600/modern-rollback-strategies/3-minute-database-process.webp 600w, /blog/i/1000/modern-rollback-strategies/3-minute-database-process.webp 1000w, /blog/i/2000/modern-rollback-strategies/3-minute-database-process.webp 1392w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="1392" height="912"></p>
|
||
</figure>
|
||
<p>None of the steps in this process have a variable run condition. They’re all set to run when the previous step succeeds.</p>
|
||
<figure>
|
||
<p><img src="/blog/i/x/modern-rollback-strategies/3-minute-run-condition.png" alt="The run condition set to success for all steps." loading="lazy" srcset="/blog/i/600/modern-rollback-strategies/3-minute-run-condition.webp 600w, /blog/i/1000/modern-rollback-strategies/3-minute-run-condition.webp 1000w, /blog/i/2000/modern-rollback-strategies/3-minute-run-condition.webp 1358w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="1358" height="946"></p>
|
||
</figure>
|
||
<p>Remove any database steps from the application project.</p>
|
||
<figure>
|
||
<p><img src="/blog/i/x/modern-rollback-strategies/3-minute-website-process.png" alt="The web application deployment process in a separate project." loading="lazy" srcset="/blog/i/600/modern-rollback-strategies/3-minute-website-process.webp 600w, /blog/i/1000/modern-rollback-strategies/3-minute-website-process.webp 1000w, /blog/i/2000/modern-rollback-strategies/3-minute-website-process.webp 1395w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="1395" height="666"></p>
|
||
</figure>
|
||
<p>If you need to share variables between projects, use the Octopus Deploy <a href="https://octopus.com/docs/projects/variables/library-variable-sets">library variable sets</a>.</p>
|
||
<h3 id="recovery-time-explained-1">Recovery time explained</h3>
|
||
<p>Like the 10-minute strategy, this strategy involves a redeployment. Unlike the 10-minute strategy, this 3-minute strategy doesn’t need a migration script review. Because of that, this strategy makes it quicker to recover.</p>
|
||
<h3 id="who-the-strategy-is-for-1">Who the strategy is for</h3>
|
||
<p>This is the strategy for anyone looking to improve their automated deployment process. This strategy will speed up both recovery and deployment time.</p>
|
||
<ul>
|
||
<li>Only deploy the application code during the deployment window.</li>
|
||
<li>All the database work occurs hours or days before the application deployment.</li>
|
||
<li>The database changes are small incremental changes that are backward compatible.</li>
|
||
</ul>
|
||
<p>That improvement is not free. You have to commit to changing how you make your code changes.</p>
|
||
<h3 id="downsides-and-pitfalls-1">Downsides and pitfalls</h3>
|
||
<p>Decoupling database and code changes is a challenging task. There’s more work outside of implementing the expand and contract pattern. That includes moving the database schema to a separate Git repository and creating a new delivery pipeline.</p>
|
||
<p>There’ll be a lot more deployments with this strategy. Everyone has to be on board with the expansion and contract pattern. That includes developers, database developers, QA, DBAs, web admins, and support staff. One person not on board can de-rail the whole process.</p>
|
||
<p>Building out the testing suite to test database changes will take time. The application may not support automated testing. If it does not, it will need extra work to rearchitect the application to support automated testing. That alone is a monumental effort.</p>
|
||
<p>All that extra work can be overkill, depending on the application.</p>
|
||
<h2 id="immediate-rollback-strategy">Immediate rollback strategy</h2>
|
||
<p>This strategy builds on the 3-minute recovery strategy. It adds blue/green or a staging deployment pattern. It involves:</p>
|
||
<ul>
|
||
<li>Running 2 versions of your application in production</li>
|
||
<li>Using a load balancer or ingress controller to control traffic</li>
|
||
<li>Deploying the code to production the load balancer isn’t pointing to</li>
|
||
<li>Testing the code before releasing it to users</li>
|
||
</ul>
|
||
<figure>
|
||
<p><img src="/blog/i/x/modern-rollback-strategies/immediate-strategy-overview.png" alt="Screenshot of the blue/green overview" loading="lazy" srcset="/blog/i/600/modern-rollback-strategies/immediate-strategy-overview.webp 600w, /blog/i/1000/modern-rollback-strategies/immediate-strategy-overview.webp 1000w, /blog/i/2000/modern-rollback-strategies/immediate-strategy-overview.webp 1605w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="1605" height="854"></p>
|
||
</figure>
|
||
<h3 id="how-it-works-2">How it works</h3>
|
||
<p>This strategy is like the 3-minute rollback strategy, but has a couple of extra steps.</p>
|
||
<ul>
|
||
<li>Deploy the database changes hours or days before the code changes.</li>
|
||
<li>Deploy the latest version of the application to a “staging” or “blue/green” set of servers in production. All users will continue to use the older version of the application.</li>
|
||
<li>Verify the latest version of the application. The verification process can take anywhere from 15 minutes to 4 hours.</li>
|
||
<li>Assuming verification passes, update the load balancer to redirect all traffic to the new version.</li>
|
||
<li>Don’t update the load balancer if verification fails.</li>
|
||
<li>Update the load balancer back to the previous version in the event of a showstopping bug.</li>
|
||
</ul>
|
||
<h3 id="modeling-in-octopus-deploy">Modeling In Octopus Deploy</h3>
|
||
<p>Like the 3-minute recovery strategy, the database and application are in different projects. The critical difference is the application deployment process will deploy to a blue or green environment.</p>
|
||
<p>Step 1. Create 2 new environments, <code>Production-Blue</code> and <code>Production-Green</code>.</p>
|
||
<figure>
|
||
<p><img src="/blog/i/x/modern-rollback-strategies/immediate-strategy-environments.png" alt="Production-Blue and Production-Green added as environments." loading="lazy" srcset="/blog/i/600/modern-rollback-strategies/immediate-strategy-environments.webp 600w, /blog/i/1000/modern-rollback-strategies/immediate-strategy-environments.webp 1000w, /blog/i/2000/modern-rollback-strategies/immediate-strategy-environments.webp 1646w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="1646" height="685"></p>
|
||
</figure>
|
||
<p>Step 2. Create a new lifecycle called <code>Blue/Green Deployments</code>. Create a phase called <code>Production</code> and add both environments to it.</p>
|
||
<figure>
|
||
<p><img src="/blog/i/x/modern-rollback-strategies/immediate-strategy-lifecycle.png" alt="The new lifecycle with the production phase including the new environments." loading="lazy" srcset="/blog/i/600/modern-rollback-strategies/immediate-strategy-lifecycle.webp 600w, /blog/i/1000/modern-rollback-strategies/immediate-strategy-lifecycle.webp 1000w, /blog/i/2000/modern-rollback-strategies/immediate-strategy-lifecycle.webp 1622w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="1622" height="1360"></p>
|
||
</figure>
|
||
<p>Step 3. In the application’s project, update the channel to use the new lifecycle.</p>
|
||
<figure>
|
||
<p><img src="/blog/i/x/modern-rollback-strategies/immediate-strategy-channel.png" alt="Updating the channel to use the new lifecycle" loading="lazy" srcset="/blog/i/600/modern-rollback-strategies/immediate-strategy-channel.webp 600w, /blog/i/1000/modern-rollback-strategies/immediate-strategy-channel.webp 1000w, /blog/i/2000/modern-rollback-strategies/immediate-strategy-channel.webp 1296w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="1296" height="604"></p>
|
||
</figure>
|
||
<p>Step 4. In the project variables, review the variable values scoped to Production. Add scoping for Production-Blue and Production-Green. Repeat for any library variable sets.</p>
|
||
<figure>
|
||
<p><img src="/blog/i/x/modern-rollback-strategies/immediate-strategy-variables.png" alt="Updating the variable scoping for any production variables." loading="lazy" srcset="/blog/i/600/modern-rollback-strategies/immediate-strategy-variables.webp 600w, /blog/i/1000/modern-rollback-strategies/immediate-strategy-variables.webp 1000w, /blog/i/2000/modern-rollback-strategies/immediate-strategy-variables.webp 2000w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="2181" height="894"></p>
|
||
</figure>
|
||
<p>Step 5. Create new targets for your application for Production-Blue OR Production-Green. You can re-use existing ones, but you must choose either blue or green for the environment.</p>
|
||
<figure>
|
||
<p><img src="/blog/i/x/modern-rollback-strategies/immediate-strategy-targets.png" alt="Adding new blue/green production deployment targets." loading="lazy" srcset="/blog/i/600/modern-rollback-strategies/immediate-strategy-targets.webp 600w, /blog/i/1000/modern-rollback-strategies/immediate-strategy-targets.webp 1000w, /blog/i/2000/modern-rollback-strategies/immediate-strategy-targets.webp 1611w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="1611" height="939"></p>
|
||
</figure>
|
||
<p>Step 6. In the project, create a runbook to update the load balancer.</p>
|
||
<figure>
|
||
<p><img src="/blog/i/x/modern-rollback-strategies/immediate-strategy-runbook.png" alt="The new runbook to change the load balancer." loading="lazy" srcset="/blog/i/600/modern-rollback-strategies/immediate-strategy-runbook.webp 600w, /blog/i/1000/modern-rollback-strategies/immediate-strategy-runbook.webp 932w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="932" height="684"></p>
|
||
</figure>
|
||
<p>Step 7. Add the appropriate steps to the runbook process to update your load balancer to Production-Blue or Production-Green.</p>
|
||
<figure>
|
||
<p><img src="/blog/i/x/modern-rollback-strategies/immediate-strategy-runbook-process.png" alt="The runbook process to change the load balancer." loading="lazy" srcset="/blog/i/600/modern-rollback-strategies/immediate-strategy-runbook-process.webp 600w, /blog/i/1000/modern-rollback-strategies/immediate-strategy-runbook-process.webp 1000w, /blog/i/2000/modern-rollback-strategies/immediate-strategy-runbook-process.webp 1351w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="1351" height="638"></p>
|
||
</figure>
|
||
<p>Step 8. <strong>Optional:</strong> Add the <strong><a href="https://library.octopus.com/step-templates/0444b0b3-088e-4689-b755-112d1360ffe3/actiontemplate-run-octopus-deploy-runbook">Run Octopus Deploy Runbook</a></strong> step to your deployment process to invoke that runbook. This step is optional; you may invoke that runbook manually.</p>
|
||
<figure>
|
||
<p><img src="/blog/i/x/modern-rollback-strategies/immediate-strategy-invoke-runbook.png" alt="Adding the optional run a runbook step in the deployment process." loading="lazy" srcset="/blog/i/600/modern-rollback-strategies/immediate-strategy-invoke-runbook.webp 600w, /blog/i/1000/modern-rollback-strategies/immediate-strategy-invoke-runbook.webp 1000w, /blog/i/2000/modern-rollback-strategies/immediate-strategy-invoke-runbook.webp 1344w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="1344" height="706"></p>
|
||
</figure>
|
||
<div class="warning"><p>Please note: The database won’t get deployed to Production-Blue or Production-Green. There is one copy of the database. That database lives in the Production environment. Your dashboard will look like the screenshot below.</p></div>
|
||
<figure>
|
||
<p><img src="/blog/i/x/modern-rollback-strategies/immediate-strategy-database-environment.png" alt="Dashboard comparing the database production environment with the web applications." loading="lazy" srcset="/blog/i/600/modern-rollback-strategies/immediate-strategy-database-environment.webp 600w, /blog/i/1000/modern-rollback-strategies/immediate-strategy-database-environment.webp 1000w, /blog/i/2000/modern-rollback-strategies/immediate-strategy-database-environment.webp 1834w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="1834" height="255"></p>
|
||
</figure>
|
||
<h3 id="recovery-time-explained-2">Recovery time explained</h3>
|
||
<p>Unlike the previous strategies, there are no redeployments. Two versions of the application run in Production. A rollback involves updating a load balancer or a configuration. With automation, it takes seconds to go from “problem found” to “recovered.”</p>
|
||
<h3 id="who-the-strategy-is-for-2">Who the strategy is for</h3>
|
||
<p>This strategy is for anyone who has implemented the expand and contract pattern and wants to take the next step. This strategy has several benefits:</p>
|
||
<ul>
|
||
<li>Like the 3-minute strategy, deploy database changes hours or days before the application.</li>
|
||
<li>Deployments can occur in the middle of the day.</li>
|
||
<li>You can take as much time as needed to verify the latest application version. No users are using it.</li>
|
||
<li>Updating the load balancer can occur during off hours via a scheduled task or runbook.</li>
|
||
</ul>
|
||
<h3 id="downsides-and-pitfalls-2">Downsides and pitfalls</h3>
|
||
<p>You need all the work of the 3-minute strategy with this approach. Also, you must figure out how to run 2 application versions in production. That’s a challenging task.</p>
|
||
<ul>
|
||
<li>Create or configure additional application hosts.</li>
|
||
<li>Verify how data from the old version interacts with data from the new version. Write more automated tests when fixing issues.</li>
|
||
<li>Verify how the application behaves after updating the load balancer. Expect cross-talk between the old UI version and the new API version. Especially with modern SPA JavaScript applications.</li>
|
||
</ul>
|
||
<p>Of all the rollback strategies, this requires the most time and money. Depending on the application, it can be overkill. For example, an internal application used by a dozen people doesn’t need a blue/green strategy.</p>
|
||
<h3 id="feature-flags">Feature flags</h3>
|
||
<p>It’s common to use feature flags and tools like LaunchDarkly with the immediate rollback strategy. Releasing a new feature to <em>everyone</em> has its own pitfalls. It’s common to see blue/green and feature flags used together.</p>
|
||
<ul>
|
||
<li>Update the load balancer for users to use the new application version.</li>
|
||
<li>But prevent users from using a new feature.</li>
|
||
<li>Release the new feature to a subset of users using a feature flag and gather feedback.</li>
|
||
<li>Continue to release the feature to more users.</li>
|
||
<li>Stop releasing the feature when encountering an issue.</li>
|
||
</ul>
|
||
<h2 id="the-perfect-roll-forward-strategy">The perfect roll forward strategy</h2>
|
||
<p>Ironically, the immediate rollback strategy is the perfect roll-forward scenario.</p>
|
||
<ul>
|
||
<li>You deploy to production on an isolated set of application hosts.</li>
|
||
<li>You verify that new version while users continue to use the old application version.</li>
|
||
<li>Keep the users on the old application version if you find any issues.</li>
|
||
<li>Take the necessary time to fix the issues.</li>
|
||
<li>Deploy the fixes to those same set of application hosts from before.</li>
|
||
<li>Verify the fixes.</li>
|
||
<li>Assuming verification is successful, redirect the traffic to the new application version.</li>
|
||
</ul>
|
||
<p>Adding feature flags makes rolling forward more workable. With feature flags, you can restrict how many users can access a new feature. You can enable the feature flag for a subset of users. If you find any new issues, you don’t enable the feature flag for other users. You fix the issue, verify it, and then enable the feature flag for other users.</p>
|
||
<p>The point is the immediate rollback strategy created several “gates”. Those gates prevent bad code from reaching your entire user base. Fixing an issue impacting a limited number of users is much easier and less stressful.</p>
|
||
<h2 id="automatically-rolling-back">Automatically rolling back</h2>
|
||
<p>Automated rollbacks are possible with the 3-minute and immediate rollback strategies. Decoupling the database changes from the application changes makes automated rollbacks possible. They’re not possible with the 10-minute rollback strategy.</p>
|
||
<ul>
|
||
<li>For the 3-minute rollback strategy, add a step after the application is deployed that looks for specific errors. If those errors are found, automatically redeploy the previous version of the code.</li>
|
||
<li>For the immediate rollback strategy, add 2 scripts:
|
||
<ul>
|
||
<li>In the deployment process, add a step that looks for specific errors prior to invoking the change load balancer runbook. If those errors are found, fail the deployment and don’t update the load balancer.</li>
|
||
<li>Add a step in the change load balancer runbook that looks for specific errors. If those errors are found, undo the load balancer change.</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<p>That said, you need to be careful with an automatic rollback process. There is a finite amount of time an automatic rollback is feasible. That window closes after 30 minutes of users using the new application version. Adding a feature for a couple of days before removing it confuses users. Limit the automatic rollbacks to check for specific conditions during deployment or runbook processes.</p>
|
||
<p>Evaluate your software delivery pipeline to prevent needing an automated rollback. For example, the application does not start up. If you follow the principle of “build once, deploy everywhere” what are the chances that happens? It will be the same exact code and configuration from the lower environments.</p>
|
||
<ul>
|
||
<li>Is it an expired password or incorrect credentials?</li>
|
||
<li>Is it because you have to update the secret store and Octopus Deploy?</li>
|
||
<li>How can Octopus reach out to your secret store for that information instead?</li>
|
||
</ul>
|
||
<h2 id="conclusion">Conclusion</h2>
|
||
<p>Creating a zero-downtime, immediate rollback process is one of the most challenging tasks in DevOps. It involves many changes. And not just in the software delivery pipeline. Many internal processes and development practices need to change.</p>
|
||
<p>Unless you’re prepared to make all those changes, I’d push that scenario down your to-do list. Solve the more significant problems first. A rollback happens when an unexpected issue occurs. Typically, humans and manual processes are the cause of those issues.</p>
|
||
<p>The first step to creating a rollback process is to automate your software delivery pipeline. The software delivery pipeline should deploy all the components, including code and databases. That will resolve many issues causing rollbacks in the first place. Then you can start with the 10-minute recovery strategy. You’ll cover most of the possible rollback scenarios that way.</p>
|
||
<p>Next, implement the expand and contract pattern. Making small, incremental, backward-compatible changes to the database is always a win. That will prepare you for the 3-minute and immediate rollback strategies.</p>
|
||
<p>Implement the 3-minute and immediate rollback strategies strategically. They’re not needed for every application. Discuss it with your team, business owner, and product owner, and get a consensus.</p>
|
||
<p>Happy deployments!</p> <!-- <Feedback
|
||
frontmatter={frontmatter}
|
||
headings={headings}
|
||
lang={lang}
|
||
/> --> <div class="post-taxonomy"> <div class="post-tag"> <h2>Tags: </h2> <ul itemprop="keywords"> <li> <a href="/blog/tag/devops/1/">DevOps</a> </li><li> <a href="/blog/tag/rollbacks/1/">Rollbacks</a> </li> </ul> </div> </div> <div class="author"> <a href="/blog/authors/bob-walker/1/" class="author__image-link"> <img class="author__image" srcset="/blog/i/600/authors/bob-walker.webp 140w" sizes="170px" src="/blog/i/x/authors/bob-walker.png" alt="Bob Walker" width="140" height="140"> </a> <div class="author__info"> <span class="author__name" itemprop="author" itemscope itemtype="https://schema.org/Person"> <a href="/blog/authors/bob-walker/1/" itemprop="url"> <span itemprop="name"> Bob Walker </span> </a> </span> <time class="author__time" datetime="Mon Oct 02 2023 00:00:00 GMT+0000 (Coordinated Universal Time)" itemprop="datePublished"> Published: October 2, 2023 </time> <div class="author__description-container"> <p class="author__description"> Bob Walker is the Field CTO at Octopus Deploy acting as a liaison for internal and external stakeholders, providing thought leadership, and elevating Octopus's brand. </p> <ul class="author__social-links"> <li> <a href="https://www.linkedin.com/in/bobjwalker/" rel="me"><i class="fa-brands fa-linkedin" aria-label="LinkedIn"></i></a> </li> </ul> </div> </div> </div> </div> <h3>Related posts</h3> <div class="simple-grid-3"> <article class="card card--padded"> <a href="/blog/octo-easy-mode-23-runbookwebhooks" class="card__link" role="link" aria-label="Open Octopus Easy Mode - Runbook Webhooks"> <div class="card__image-wrapper"> <img srcset="/blog/i/600/cover/blog-ai-introducing-octopus-ai-assistant.webp 600w, /blog/i/1000/cover/blog-ai-introducing-octopus-ai-assistant.webp 750w" sizes="254px" src="/blog/i/x/cover/blog-ai-introducing-octopus-ai-assistant.png" width="750" height="400" alt="The image shows an isometric illustration of a central octopus-like icon connected to multiple brain icons in a hub-and-spoke network pattern against a purple-to-blue gradient background." class="card__image" onerror="this.src='https://i.octopus.com/library/step-templates/other.png';" loading="lazy"> </div> <div class="card__copy"> <p class="card__title">Octopus Easy Mode - Runbook Webhooks</p> <p class="card__description">Learn how to create runbook webhook triggers</p> <div class="card__meta"> <div class="card__authors"> <div class="author"> <img class="author__image" srcset="/blog/i/600/authors/matthew-casperson.webp 140w" sizes="170px" src="/blog/i/x/authors/matthew-casperson.png" alt="Matthew Casperson" width="140" height="140"> <div class="author__info"> <span class="author__name"> <span> Matthew Casperson </span> </span> <time class="author__time" datetime="2026-09-01"> September 1, 2026 </time> </div> </div> </div> </div> </div> </a> </article><article class="card card--padded"> <a href="/blog/the-hotfix-myth" class="card__link" role="link" aria-label="Open Debunking the hotfix pipeline myth"> <div class="card__image-wrapper"> <img srcset="/blog/i/600/cover/devops-golden-paths.webp 600w, /blog/i/1000/cover/devops-golden-paths.webp 750w" sizes="254px" src="/blog/i/x/cover/devops-golden-paths.png" width="750" height="400" alt="Stylized image of DevOps infinity symbol with a car driving on it and increasing speed over golden arrows." class="card__image" onerror="this.src='https://i.octopus.com/library/step-templates/other.png';" loading="lazy"> </div> <div class="card__copy"> <p class="card__title">Debunking the hotfix pipeline myth</p> <p class="card__description">Why it is more important to making the default pipelines as fast and as efficient as possible over hotfix pipelines.</p> <div class="card__meta"> <div class="card__authors"> <div class="author"> <img class="author__image" srcset="/blog/i/600/authors/bob-walker.webp 140w" sizes="170px" src="/blog/i/x/authors/bob-walker.png" alt="Bob Walker" width="140" height="140"> <div class="author__info"> <span class="author__name"> <span> Bob Walker </span> </span> <time class="author__time" datetime="2026-08-27"> August 27, 2026 </time> </div> </div> </div> </div> </div> </a> </article><article class="card card--padded"> <a href="/blog/inside-platform-engineering-nigel-douglas" class="card__link" role="link" aria-label="Open Inside Platform Engineering with Nigel Douglas"> <div class="card__image-wrapper"> <img srcset="/blog/i/600/cover/blog-img-inside-platform-engineering-nigel-douglas.webp 600w, /blog/i/1000/cover/blog-img-inside-platform-engineering-nigel-douglas.webp 750w" sizes="254px" src="/blog/i/x/cover/blog-img-inside-platform-engineering-nigel-douglas.png" width="750" height="400" alt="A photograph of Nigel Douglas surrounded by a circular blue and purple frame." class="card__image" onerror="this.src='https://i.octopus.com/library/step-templates/other.png';" loading="lazy"> </div> <div class="card__copy"> <p class="card__title">Inside Platform Engineering with Nigel Douglas</p> <p class="card__description">A conversation with Nigel Douglas on dependencies, supply chain attacks, and why most teams can't list everything holding their software together.</p> <div class="card__meta"> <div class="card__authors"> <div class="author"> <img class="author__image" srcset="/blog/i/600/authors/matthew-allford.webp 512w" sizes="170px" src="/blog/i/x/authors/matthew-allford.png" alt="Matthew Allford" width="512" height="512"> <div class="author__info"> <span class="author__name"> <span> Matthew Allford </span> </span> <time class="author__time" datetime="2026-08-21"> August 21, 2026 </time> </div> </div> </div> </div> </div> </a> </article> </div> <div class="newsletter"> <h2>Newsletter</h2> <p>
|
||
Join ~80,000 DevOps professionals and sign up for the latest Octopus news,
|
||
events, and opinions. No spam. Unsubscribe at any time.
|
||
</p> <form id="mktoForm_1062" class="newsletter__form"></form> <script>(function(){const formId = 1062;
|
||
const dreamdataTrackingId = undefined;
|
||
|
||
(() => {
|
||
const formEl = document.getElementById(`mktoForm_${formId}`);
|
||
if (!formEl) {
|
||
return;
|
||
}
|
||
|
||
// Load the 134 KB Marketo library once per page, shared across every form
|
||
const loadMarketo = () => {
|
||
if (!window.__marketoLoader) {
|
||
window.__marketoLoader = new Promise((resolve, reject) => {
|
||
const script = document.createElement('script');
|
||
script.src = 'https://get.octopus.com/js/forms2/js/forms2.min.js';
|
||
script.onload = resolve;
|
||
script.onerror = () => reject(new Error('Failed to load MktoForms2'));
|
||
document.head.appendChild(script);
|
||
});
|
||
}
|
||
return window.__marketoLoader;
|
||
};
|
||
|
||
const initForm = async () => {
|
||
try {
|
||
await loadMarketo();
|
||
} catch (error) {
|
||
console.error(error);
|
||
// Drop the cached rejected promise so a later form instance can retry
|
||
window.__marketoLoader = undefined;
|
||
// Collapse any space reserved for this form so a blocked or failed
|
||
// load does not leave an empty box (no-op when there is no wrapper)
|
||
formEl.closest('.newsletter')?.style.setProperty('display', 'none');
|
||
return;
|
||
}
|
||
|
||
// @ts-ignore - no global type for MktoForms2
|
||
if (typeof MktoForms2 === 'undefined' || !MktoForms2.loadForm) {
|
||
console.error('MktoForms2 is not available after loading.');
|
||
return;
|
||
}
|
||
|
||
// @ts-ignore
|
||
MktoForms2.loadForm(
|
||
'//get.octopus.com',
|
||
'271-BEX-827',
|
||
formId,
|
||
(form) => {
|
||
const formElem = form.getFormElem()[0];
|
||
|
||
if (!(formElem instanceof HTMLElement)) {
|
||
console.error(
|
||
'Expected a DOM element but got something else',
|
||
formElem
|
||
);
|
||
return;
|
||
}
|
||
|
||
formElem.querySelectorAll('style').forEach((style) => style.remove());
|
||
|
||
const baseStyle = document.getElementById('mktoForms2BaseStyle');
|
||
if (baseStyle) {
|
||
baseStyle.remove();
|
||
}
|
||
|
||
formElem.removeAttribute('style');
|
||
|
||
formElem
|
||
.querySelectorAll('.mktoTextField')
|
||
.forEach((el) => el.classList.add('form-control'));
|
||
formElem
|
||
.querySelectorAll('.mktoEmailField')
|
||
.forEach((el) => el.classList.add('form-control'));
|
||
formElem
|
||
.querySelectorAll('.mktoButton')
|
||
.forEach((el) => el.classList.add('button', 'button--primary'));
|
||
|
||
formElem
|
||
.querySelectorAll('.mktoAsterix')
|
||
.forEach((el) => el.remove());
|
||
formElem.querySelectorAll('.mktoOffset').forEach((el) => el.remove());
|
||
formElem
|
||
.querySelectorAll('.mktoFormCol, .mktoField, .mktoLabel')
|
||
.forEach((el) => el.removeAttribute('style'));
|
||
|
||
// Add Dreamdata tracking if configured
|
||
if (dreamdataTrackingId) {
|
||
form.onSuccess(function (values, followUpUrl) {
|
||
const email = values.Email || values.email;
|
||
|
||
if (typeof dreamdata !== 'undefined') {
|
||
try {
|
||
dreamdata.track(dreamdataTrackingId);
|
||
if (email) {
|
||
dreamdata.identify(null, { email: email });
|
||
}
|
||
} catch (error) {
|
||
console.warn('Dreamdata tracking failed:', error);
|
||
}
|
||
} else {
|
||
console.warn(
|
||
'Dreamdata not available for tracking:',
|
||
dreamdataTrackingId
|
||
);
|
||
}
|
||
|
||
if (followUpUrl) {
|
||
location.href = followUpUrl;
|
||
}
|
||
|
||
return followUpUrl ? false : true;
|
||
});
|
||
}
|
||
}
|
||
);
|
||
};
|
||
|
||
// The form is below the fold, so defer the library until the reader
|
||
// scrolls near it - keeps 134 KB off the critical path on every page.
|
||
// 600px of rootMargin starts the download early enough that the form is
|
||
// usually ready when it enters the viewport.
|
||
if ('IntersectionObserver' in window) {
|
||
const observer = new IntersectionObserver(
|
||
(entries) => {
|
||
if (entries.some((entry) => entry.isIntersecting)) {
|
||
observer.disconnect();
|
||
initForm();
|
||
}
|
||
},
|
||
{ rootMargin: '600px' }
|
||
);
|
||
observer.observe(formEl);
|
||
} else {
|
||
initForm();
|
||
}
|
||
})();
|
||
})();</script> </div> <meta itemprop="image" content="/blog/i/x/cover/rollback-rocket.png"> </article> </main> <nav class="site-nav" id="site-nav" aria-label="Site"> <div class="theme-switcher" data-theme-toggle> <input id="theme-switcher" type="checkbox" aria-checked="false" role="switch" aria-label="Toggle theme between light and dark mode" tabindex="-1" data-theme-toggle-checkbox> <label for="theme-switcher" class="theme-switcher__label" tabindex="0"> <span class="theme-switcher__icon theme-switcher__icon--light" aria-hidden="true"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"> <path d="M12 2.40002C11.475 2.40002 11.1 2.81252 11.1 3.30002V5.70002C11.1 6.22502 11.475 6.60002 12 6.60002C12.4875 6.60002 12.9 6.22502 12.9 5.70002V3.30002C12.9 2.81252 12.4875 2.40002 12 2.40002ZM12 17.4C11.475 17.4 11.1 17.8125 11.1 18.3V20.7C11.1 21.225 11.475 21.6 12 21.6C12.4875 21.6 12.9 21.225 12.9 20.7V18.3C12.9 17.8125 12.4875 17.4 12 17.4ZM20.7 12.9C21.1875 12.9 21.6 12.525 21.6 12C21.6 11.5125 21.1875 11.1 20.7 11.1H18.3C17.775 11.1 17.4 11.5125 17.4 12C17.4 12.525 17.775 12.9 18.3 12.9H20.7ZM6.60002 12C6.60002 11.5125 6.18752 11.1 5.70002 11.1H3.30002C2.77502 11.1 2.40002 11.5125 2.40002 12C2.40002 12.525 2.77502 12.9 3.30002 12.9H5.70002C6.18752 12.9 6.60002 12.525 6.60002 12ZM18.7875 6.48752C19.125 6.15002 19.125 5.58752 18.7875 5.21252C18.4125 4.87502 17.85 4.87502 17.5125 5.21252L15.7875 6.93752C15.45 7.27502 15.45 7.83752 15.7875 8.21252C16.1625 8.55002 16.725 8.55002 17.0625 8.21252L18.7875 6.48752ZM8.17502 15.825C7.80002 15.4875 7.23752 15.4875 6.90002 15.825L5.21252 17.55C4.83752 17.8875 4.83752 18.45 5.21252 18.7875C5.55002 19.1625 6.11252 19.1625 6.45002 18.7875L8.17502 17.1C8.51252 16.7625 8.51252 16.2 8.17502 15.825ZM17.5125 18.7875C17.85 19.1625 18.4125 19.1625 18.7875 18.7875C19.125 18.45 19.125 17.8875 18.7875 17.55L17.0625 15.825C16.725 15.4875 16.1625 15.4875 15.7875 15.825C15.45 16.2 15.45 16.7625 15.7875 17.1L17.5125 18.7875ZM8.17502 8.21252C8.51252 7.83752 8.51252 7.27502 8.17502 6.93752L6.45002 5.21252C6.11252 4.87502 5.55002 4.87502 5.21252 5.21252C4.83752 5.58752 4.83752 6.15002 5.21252 6.48752L6.90002 8.21252C7.23752 8.55002 7.80002 8.55002 8.17502 8.21252ZM12 16.2C14.2875 16.2 16.2 14.325 16.2 12C16.2 9.71252 14.2875 7.80002 12 7.80002C9.67502 7.80002 7.80002 9.71252 7.80002 12C7.80002 14.325 9.67502 16.2 12 16.2Z" fill="white"></path> </svg>
|
||
Light
|
||
</span> <span class="switch-slider"></span> <span class="theme-switcher__icon theme-switcher__icon--dark" aria-hidden="true"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"> <path d="M13.1625 3.59998C8.55005 3.59998 4.80005 7.38748 4.80005 12C4.80005 16.65 8.55005 20.4 13.1625 20.4C15.45 20.4 17.5125 19.5 19.0125 18.0375C19.2 17.85 19.2375 17.5875 19.125 17.325C19.0125 17.1 18.75 16.9875 18.4875 17.025C18.1125 17.1 17.7375 17.1 17.3625 17.1C13.725 17.1 10.7625 14.175 10.7625 10.5C10.7625 8.06248 12.1125 5.88748 14.1375 4.76248C14.3625 4.64998 14.475 4.38748 14.4 4.12498C14.3625 3.86248 14.1375 3.67498 13.875 3.63748C13.65 3.63748 13.3875 3.63748 13.1625 3.63748V3.59998Z" fill="white"></path> </svg>
|
||
Dark
|
||
</span> </label> </div> <h2 class="site-nav-title">Navigation</h2> <ul class="site-nav__list"> <li class="site-nav__list-item"> <a href="/blog" aria-current="false"> Blog home </a> </li> <li class="site-nav__list-item"> <a href="/blog/tag/product/1" aria-current="false"> Product </a> </li> <li class="site-nav__list-item"> <a href="/blog/tag/engineering/1" aria-current="false"> Engineering </a> </li> <li class="site-nav__list-item"> <a href="/blog/tag/devops/1" aria-current="false"> DevOps </a> </li> <li class="site-nav__list-item"> <a href="/blog/tag/company/1" aria-current="false"> Company </a> </li> <li class="site-nav__list-item"> <a href="/blog/search" aria-current="false"> Search </a> </li> </ul> </nav> <script type="module">
|
||
import { ThemeSwitcher } from '/blog/js/modules/theme-switcher.js';
|
||
|
||
document.addEventListener('DOMContentLoaded', function () {
|
||
const themeSwitchers = document.querySelectorAll('[data-theme-toggle]');
|
||
themeSwitchers.forEach((switcher) => new ThemeSwitcher(switcher));
|
||
});
|
||
</script> <div class="side-nav"> <nav class="article-nav" data-article-nav aria-label="Table of contents"> <details class="article-nav__details" open> <summary class="article-nav__title"> On this page </summary> <hr class="separator"> <ol class="article-nav__list"> <li class="article-nav__item article-nav__item--level-2"> <a href="#a-brief-primer-on-rollbacks" class="article-nav__link" data-article-link> A brief primer on rollbacks </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#why-roll-back" class="article-nav__link" data-article-link> Why roll back? </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#rollbacks-can-be-a-symptom-of-a-bigger-problem" class="article-nav__link" data-article-link> Rollbacks can be a symptom of a bigger problem </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#rollback-risks" class="article-nav__link" data-article-link> Rollback risks </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#theres-no-magic-bullet-or-one-size-fits-all-solution" class="article-nav__link" data-article-link> There’s no magic bullet, or one size fits all solution </a> </li><li class="article-nav__item article-nav__item--level-2"> <a href="#dont-rollback-the-database" class="article-nav__link" data-article-link> Don’t rollback the database </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#rollback-script-pitfalls" class="article-nav__link" data-article-link> Rollback script pitfalls </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#restore-database-backup-pitfalls" class="article-nav__link" data-article-link> Restore database backup pitfalls </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#restore-databases-as-a-last-resort" class="article-nav__link" data-article-link> Restore databases as a last resort </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#take-the-database-out-of-the-rollback-process" class="article-nav__link" data-article-link> Take the database out of the rollback process </a> </li><li class="article-nav__item article-nav__item--level-2"> <a href="#10-minute-recovery-rollback-strategy" class="article-nav__link" data-article-link> 10-minute recovery rollback strategy </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#how-it-works" class="article-nav__link" data-article-link> How it works </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#octopus-deploy-configuration" class="article-nav__link" data-article-link> Octopus Deploy configuration </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#recovery-time-explained" class="article-nav__link" data-article-link> Recovery time explained </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#who-the-strategy-is-for" class="article-nav__link" data-article-link> Who the strategy is for </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#downsides-and-pitfalls" class="article-nav__link" data-article-link> Downsides and pitfalls </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#deployment-automation-removes-a-lot-of-reasons-to-rollback" class="article-nav__link" data-article-link> Deployment automation removes a lot of reasons to rollback </a> </li><li class="article-nav__item article-nav__item--level-2"> <a href="#3-minute-recovery-strategy" class="article-nav__link" data-article-link> 3-minute recovery strategy </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#how-it-works-1" class="article-nav__link" data-article-link> How it works </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#expand-and-contract-pattern" class="article-nav__link" data-article-link> Expand and contract pattern </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#octopus-deploy-configuration-1" class="article-nav__link" data-article-link> Octopus Deploy configuration </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#recovery-time-explained-1" class="article-nav__link" data-article-link> Recovery time explained </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#who-the-strategy-is-for-1" class="article-nav__link" data-article-link> Who the strategy is for </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#downsides-and-pitfalls-1" class="article-nav__link" data-article-link> Downsides and pitfalls </a> </li><li class="article-nav__item article-nav__item--level-2"> <a href="#immediate-rollback-strategy" class="article-nav__link" data-article-link> Immediate rollback strategy </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#how-it-works-2" class="article-nav__link" data-article-link> How it works </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#modeling-in-octopus-deploy" class="article-nav__link" data-article-link> Modeling In Octopus Deploy </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#recovery-time-explained-2" class="article-nav__link" data-article-link> Recovery time explained </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#who-the-strategy-is-for-2" class="article-nav__link" data-article-link> Who the strategy is for </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#downsides-and-pitfalls-2" class="article-nav__link" data-article-link> Downsides and pitfalls </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#feature-flags" class="article-nav__link" data-article-link> Feature flags </a> </li><li class="article-nav__item article-nav__item--level-2"> <a href="#the-perfect-roll-forward-strategy" class="article-nav__link" data-article-link> The perfect roll forward strategy </a> </li><li class="article-nav__item article-nav__item--level-2"> <a href="#automatically-rolling-back" class="article-nav__link" data-article-link> Automatically rolling back </a> </li><li class="article-nav__item article-nav__item--level-2"> <a href="#conclusion" class="article-nav__link" data-article-link> Conclusion </a> </li> </ol> </details> </nav> <script type="module">document.addEventListener(`DOMContentLoaded`,function(){let e=document.querySelector(`.article-nav__details`),t=()=>{e&&(window.innerWidth>=1130?e.setAttribute(`open`,``):e.removeAttribute(`open`))};t(),window.addEventListener(`resize`,t)});</script> </div> </div> <div data-shared-source="live" data-shared-fragment="footer" data-shared-note="fetched https://octopus.com/fragments/footer at 2026-09-11T10:55:57.544Z">
|
||
|
||
|
||
<footer class="footer footer-pu" itemscope itemtype="https://schema.org/WPFooter">
|
||
<div class="footer__content container">
|
||
<section class="footer__row footer__row--first" aria-label="Product and resource links">
|
||
<div class="footer__column">
|
||
<h3 class="footer__column-title" id="footer-first-platform" itemprop="name">Platform</h3>
|
||
|
||
<ul class="footer__items" aria-labelledby="footer-first-platform">
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://octopus.com/"
|
||
aria-label="Continuous Delivery platform"
|
||
itemprop="url">
|
||
<span class="footer__item-label" itemprop="name">
|
||
Continuous Delivery platform
|
||
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://octopus.com/use-case/platform-hub"
|
||
aria-label="Platform Hub"
|
||
itemprop="url">
|
||
<span class="footer__item-label" itemprop="name">
|
||
Platform Hub
|
||
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://octopus.com/ai-tools"
|
||
aria-label="AI tools"
|
||
itemprop="url">
|
||
<span class="footer__item-label" itemprop="name">
|
||
AI tools
|
||
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://octopus.com/use-case/tenanted-deployments"
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
aria-label="Tenanted deployments (opens in new tab)"
|
||
itemprop="url">
|
||
<span class="footer__item-label" itemprop="name">
|
||
Tenanted deployments
|
||
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
<div class="footer__column">
|
||
<h3 class="footer__column-title" id="footer-first-resources" itemprop="name">Resources</h3>
|
||
|
||
<ul class="footer__items" aria-labelledby="footer-first-resources">
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://octopus.com/docs"
|
||
aria-label="Documentation"
|
||
itemprop="url">
|
||
<span class="footer__item-label" itemprop="name">
|
||
Documentation
|
||
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://octopus.com/downloads"
|
||
aria-label="Download Octopus"
|
||
itemprop="url">
|
||
<span class="footer__item-label" itemprop="name">
|
||
Download Octopus
|
||
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://octopus.com/publications"
|
||
aria-label="Publications"
|
||
itemprop="url">
|
||
<span class="footer__item-label" itemprop="name">
|
||
Publications
|
||
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://octopus.com/blog"
|
||
aria-label="Blog"
|
||
itemprop="url">
|
||
<span class="footer__item-label" itemprop="name">
|
||
Blog
|
||
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
<div class="footer__column">
|
||
<h3 class="footer__column-title" id="footer-first-our-company" itemprop="name">Our company</h3>
|
||
|
||
<ul class="footer__items" aria-labelledby="footer-first-our-company">
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://octopus.com/company"
|
||
aria-label="About us"
|
||
itemprop="url">
|
||
<span class="footer__item-label" itemprop="name">
|
||
About us
|
||
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://octopus.com/company/careers"
|
||
aria-label="Careers"
|
||
itemprop="url">
|
||
<span class="footer__item-label" itemprop="name">
|
||
Careers
|
||
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://roadmap.octopus.com/tabs/1-under-consideration"
|
||
rel="noopener noreferrer"
|
||
aria-label="Roadmap (opens in new tab)"
|
||
itemprop="url">
|
||
<span class="footer__item-label" itemprop="name">
|
||
Roadmap
|
||
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://ir.octopus.com/"
|
||
rel="noopener noreferrer"
|
||
aria-label="Investor relations (opens in new tab)"
|
||
itemprop="url">
|
||
<span class="footer__item-label" itemprop="name">
|
||
Investor relations
|
||
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://octopus.com/company/brand"
|
||
aria-label="Brand guidelines"
|
||
itemprop="url">
|
||
<span class="footer__item-label" itemprop="name">
|
||
Brand guidelines
|
||
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
<div class="footer__column">
|
||
<h3 class="footer__column-title" id="footer-first-help-and-support" itemprop="name">Help and support</h3>
|
||
|
||
<ul class="footer__items" aria-labelledby="footer-first-help-and-support">
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://octopus.com/company/contact"
|
||
aria-label="Contact Sales"
|
||
itemprop="url">
|
||
<span class="footer__item-label" itemprop="name">
|
||
Contact Sales
|
||
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://octopus.com/support"
|
||
aria-label="Support"
|
||
itemprop="url">
|
||
<span class="footer__item-label" itemprop="name">
|
||
Support
|
||
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://octopus.com/upgrade"
|
||
aria-label="Upgrade"
|
||
itemprop="url">
|
||
<span class="footer__item-label" itemprop="name">
|
||
Upgrade
|
||
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://octopus.com/company/trust"
|
||
aria-label="Security and legal"
|
||
itemprop="url">
|
||
<span class="footer__item-label" itemprop="name">
|
||
Security and legal
|
||
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://oc.to/CommunitySlack"
|
||
rel="noopener noreferrer"
|
||
aria-label="Community Slack (opens in new tab)"
|
||
itemprop="url">
|
||
<span class="footer__item-label" itemprop="name">
|
||
Community Slack
|
||
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="footer__row footer__row--second" aria-label="Community and partners">
|
||
<div class="footer__column">
|
||
<h3 class="footer__column-title" id="footer-second-our-awards" itemprop="name">Our awards</h3>
|
||
|
||
<ul class="footer__items" aria-labelledby="footer-second-our-awards">
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://www.g2.com/products/octopus-deploy/reviews"
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
aria-label="Image link"
|
||
itemprop="url">
|
||
<span class="footer__item-image" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/868x1000/ff9d5240db/continuousintegration_bestmeetsrequirements_meetsrequirements.png/m/fit-in/1200x0/filters:quality(85):format(webp)" alt="Award badge for "Best Meets Requirements" from G2, Summer 2026." loading="lazy" width="868" height="1000" srcset="https://a.storyblok.com/f/185929/868x1000/ff9d5240db/continuousintegration_bestmeetsrequirements_meetsrequirements.png/m/fit-in/400x0/filters:quality(85):format(webp) 400w, https://a.storyblok.com/f/185929/868x1000/ff9d5240db/continuousintegration_bestmeetsrequirements_meetsrequirements.png/m/fit-in/600x0/filters:quality(85):format(webp) 600w, https://a.storyblok.com/f/185929/868x1000/ff9d5240db/continuousintegration_bestmeetsrequirements_meetsrequirements.png/m/fit-in/800x0/filters:quality(85):format(webp) 800w, https://a.storyblok.com/f/185929/868x1000/ff9d5240db/continuousintegration_bestmeetsrequirements_meetsrequirements.png/m/fit-in/1200x0/filters:quality(85):format(webp) 1200w, https://a.storyblok.com/f/185929/868x1000/ff9d5240db/continuousintegration_bestmeetsrequirements_meetsrequirements.png/m/fit-in/1600x0/filters:quality(85):format(webp) 1600w, https://a.storyblok.com/f/185929/868x1000/ff9d5240db/continuousintegration_bestmeetsrequirements_meetsrequirements.png/m/fit-in/2000x0/filters:quality(85):format(webp) 2000w" sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 70vw" />
|
||
</span>
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://www.gartner.com/reviews/market/devops-platforms/vendor/octopus-deploy-125263461/product/octopus-deploy"
|
||
rel="noopener noreferrer"
|
||
aria-label="Image link"
|
||
itemprop="url">
|
||
<span class="footer__item-image" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/86x101/dd0724c752/gartner-users-love-us-badge.png/m/fit-in/1200x0/filters:quality(85):format(webp)" alt="Gartner badge - Users love us" loading="lazy" width="86" height="101" srcset="https://a.storyblok.com/f/185929/86x101/dd0724c752/gartner-users-love-us-badge.png/m/fit-in/400x0/filters:quality(85):format(webp) 400w, https://a.storyblok.com/f/185929/86x101/dd0724c752/gartner-users-love-us-badge.png/m/fit-in/600x0/filters:quality(85):format(webp) 600w, https://a.storyblok.com/f/185929/86x101/dd0724c752/gartner-users-love-us-badge.png/m/fit-in/800x0/filters:quality(85):format(webp) 800w, https://a.storyblok.com/f/185929/86x101/dd0724c752/gartner-users-love-us-badge.png/m/fit-in/1200x0/filters:quality(85):format(webp) 1200w, https://a.storyblok.com/f/185929/86x101/dd0724c752/gartner-users-love-us-badge.png/m/fit-in/1600x0/filters:quality(85):format(webp) 1600w, https://a.storyblok.com/f/185929/86x101/dd0724c752/gartner-users-love-us-badge.png/m/fit-in/2000x0/filters:quality(85):format(webp) 2000w" sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 70vw" />
|
||
</span>
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://www.g2.com/products/octopus-deploy/reviews"
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
aria-label="Image link"
|
||
itemprop="url">
|
||
<span class="footer__item-image" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/868x1000/f647e2f3bc/configurationmanagement_highperformer_enterprise_highperformer.png/m/fit-in/1200x0/filters:quality(85):format(webp)" alt="Badge displaying "High Performer Enterprise" for Summer 2026 with G2 logo." loading="lazy" width="868" height="1000" srcset="https://a.storyblok.com/f/185929/868x1000/f647e2f3bc/configurationmanagement_highperformer_enterprise_highperformer.png/m/fit-in/400x0/filters:quality(85):format(webp) 400w, https://a.storyblok.com/f/185929/868x1000/f647e2f3bc/configurationmanagement_highperformer_enterprise_highperformer.png/m/fit-in/600x0/filters:quality(85):format(webp) 600w, https://a.storyblok.com/f/185929/868x1000/f647e2f3bc/configurationmanagement_highperformer_enterprise_highperformer.png/m/fit-in/800x0/filters:quality(85):format(webp) 800w, https://a.storyblok.com/f/185929/868x1000/f647e2f3bc/configurationmanagement_highperformer_enterprise_highperformer.png/m/fit-in/1200x0/filters:quality(85):format(webp) 1200w, https://a.storyblok.com/f/185929/868x1000/f647e2f3bc/configurationmanagement_highperformer_enterprise_highperformer.png/m/fit-in/1600x0/filters:quality(85):format(webp) 1600w, https://a.storyblok.com/f/185929/868x1000/f647e2f3bc/configurationmanagement_highperformer_enterprise_highperformer.png/m/fit-in/2000x0/filters:quality(85):format(webp) 2000w" sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 70vw" />
|
||
</span>
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
<div class="footer__column">
|
||
<h3 class="footer__column-title" id="footer-second-sign-up-to-our-newsletter" itemprop="name">Sign up to our newsletter</h3>
|
||
|
||
<ul class="footer__items" aria-labelledby="footer-second-sign-up-to-our-newsletter">
|
||
<li class="footer__item footer__item--component">
|
||
<div class="mktoFormWrapper"> <form id="mktoForm_2139" class="newsletter__form"></form> <script>(function(){const formId = 2139;
|
||
const dreamdataTrackingId = "Newsletter Signup (Footer)";
|
||
|
||
(() => {
|
||
const formEl = document.getElementById(`mktoForm_${formId}`);
|
||
if (!formEl) {
|
||
return;
|
||
}
|
||
|
||
// Load the 134 KB Marketo library once per page, shared across every form
|
||
const loadMarketo = () => {
|
||
if (!window.__marketoLoader) {
|
||
window.__marketoLoader = new Promise((resolve, reject) => {
|
||
const script = document.createElement('script');
|
||
script.src = 'https://get.octopus.com/js/forms2/js/forms2.min.js';
|
||
script.onload = resolve;
|
||
script.onerror = () => reject(new Error('Failed to load MktoForms2'));
|
||
document.head.appendChild(script);
|
||
});
|
||
}
|
||
return window.__marketoLoader;
|
||
};
|
||
|
||
const initForm = async () => {
|
||
try {
|
||
await loadMarketo();
|
||
} catch (error) {
|
||
console.error(error);
|
||
// Drop the cached rejected promise so a later form instance can retry
|
||
window.__marketoLoader = undefined;
|
||
// Collapse any space reserved for this form so a blocked or failed
|
||
// load does not leave an empty box (no-op when there is no wrapper)
|
||
formEl.closest('.newsletter')?.style.setProperty('display', 'none');
|
||
return;
|
||
}
|
||
|
||
// @ts-ignore - no global type for MktoForms2
|
||
if (typeof MktoForms2 === 'undefined' || !MktoForms2.loadForm) {
|
||
console.error('MktoForms2 is not available after loading.');
|
||
return;
|
||
}
|
||
|
||
// @ts-ignore
|
||
MktoForms2.loadForm(
|
||
'//get.octopus.com',
|
||
'271-BEX-827',
|
||
formId,
|
||
(form) => {
|
||
const formElem = form.getFormElem()[0];
|
||
|
||
if (!(formElem instanceof HTMLElement)) {
|
||
console.error(
|
||
'Expected a DOM element but got something else',
|
||
formElem
|
||
);
|
||
return;
|
||
}
|
||
|
||
formElem.querySelectorAll('style').forEach((style) => style.remove());
|
||
|
||
const baseStyle = document.getElementById('mktoForms2BaseStyle');
|
||
if (baseStyle) {
|
||
baseStyle.remove();
|
||
}
|
||
|
||
formElem.removeAttribute('style');
|
||
|
||
formElem
|
||
.querySelectorAll('.mktoTextField')
|
||
.forEach((el) => el.classList.add('form-control'));
|
||
formElem
|
||
.querySelectorAll('.mktoEmailField')
|
||
.forEach((el) => el.classList.add('form-control'));
|
||
formElem
|
||
.querySelectorAll('.mktoButton')
|
||
.forEach((el) => el.classList.add('button', 'button--primary'));
|
||
|
||
formElem
|
||
.querySelectorAll('.mktoAsterix')
|
||
.forEach((el) => el.remove());
|
||
formElem.querySelectorAll('.mktoOffset').forEach((el) => el.remove());
|
||
formElem
|
||
.querySelectorAll('.mktoFormCol, .mktoField, .mktoLabel')
|
||
.forEach((el) => el.removeAttribute('style'));
|
||
|
||
// Add Dreamdata tracking if configured
|
||
if (dreamdataTrackingId) {
|
||
form.onSuccess(function (values, followUpUrl) {
|
||
const email = values.Email || values.email;
|
||
|
||
if (typeof dreamdata !== 'undefined') {
|
||
try {
|
||
dreamdata.track(dreamdataTrackingId);
|
||
if (email) {
|
||
dreamdata.identify(null, { email: email });
|
||
}
|
||
} catch (error) {
|
||
console.warn('Dreamdata tracking failed:', error);
|
||
}
|
||
} else {
|
||
console.warn(
|
||
'Dreamdata not available for tracking:',
|
||
dreamdataTrackingId
|
||
);
|
||
}
|
||
|
||
if (followUpUrl) {
|
||
location.href = followUpUrl;
|
||
}
|
||
|
||
return followUpUrl ? false : true;
|
||
});
|
||
}
|
||
}
|
||
);
|
||
};
|
||
|
||
// The form is below the fold, so defer the library until the reader
|
||
// scrolls near it - keeps 134 KB off the critical path on every page.
|
||
// 600px of rootMargin starts the download early enough that the form is
|
||
// usually ready when it enters the viewport.
|
||
if ('IntersectionObserver' in window) {
|
||
const observer = new IntersectionObserver(
|
||
(entries) => {
|
||
if (entries.some((entry) => entry.isIntersecting)) {
|
||
observer.disconnect();
|
||
initForm();
|
||
}
|
||
},
|
||
{ rootMargin: '600px' }
|
||
);
|
||
observer.observe(formEl);
|
||
} else {
|
||
initForm();
|
||
}
|
||
})();
|
||
})();</script> </div>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
<div class="footer__column">
|
||
<h3 class="footer__column-title" id="footer-second-marketplaces" itemprop="name">Marketplaces</h3>
|
||
|
||
<ul class="footer__items" aria-labelledby="footer-second-marketplaces">
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://marketplace.microsoft.com/en-us/product/saas/octopusdeployptyltd1664464418055.octopus_cloud_saas_offer?tab=overview"
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
aria-label="Azure marketplace (opens in new tab)"
|
||
itemprop="url">
|
||
<span class="footer__item-image" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/43x43/01bd95458d/azure-marketplace-logo.png/m/fit-in/1200x0/filters:quality(85):format(webp)" alt="Azure marketplace logo" loading="lazy" width="43" height="43" srcset="https://a.storyblok.com/f/185929/43x43/01bd95458d/azure-marketplace-logo.png/m/fit-in/400x0/filters:quality(85):format(webp) 400w, https://a.storyblok.com/f/185929/43x43/01bd95458d/azure-marketplace-logo.png/m/fit-in/600x0/filters:quality(85):format(webp) 600w, https://a.storyblok.com/f/185929/43x43/01bd95458d/azure-marketplace-logo.png/m/fit-in/800x0/filters:quality(85):format(webp) 800w, https://a.storyblok.com/f/185929/43x43/01bd95458d/azure-marketplace-logo.png/m/fit-in/1200x0/filters:quality(85):format(webp) 1200w, https://a.storyblok.com/f/185929/43x43/01bd95458d/azure-marketplace-logo.png/m/fit-in/1600x0/filters:quality(85):format(webp) 1600w, https://a.storyblok.com/f/185929/43x43/01bd95458d/azure-marketplace-logo.png/m/fit-in/2000x0/filters:quality(85):format(webp) 2000w" sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 70vw" />
|
||
</span>
|
||
|
||
</span>
|
||
<span class="footer__item-label" itemprop="name">
|
||
Azure marketplace
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://aws.amazon.com/marketplace/pp/prodview-rsv6rann3nbsu?sr=0-2&ref_=beagle&applicationId=AWSMPContessa"
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
aria-label="AWS marketplace (opens in new tab)"
|
||
itemprop="url">
|
||
<span class="footer__item-image" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/1500x1200/8959e687b4/aws-white.webp/m/fit-in/1200x0/filters:quality(85):format(webp)" alt="AWS logo with bold white letters "aws" and an orange curved arrow below on a black background." loading="lazy" width="1500" height="1200" srcset="https://a.storyblok.com/f/185929/1500x1200/8959e687b4/aws-white.webp/m/fit-in/400x0/filters:quality(85):format(webp) 400w, https://a.storyblok.com/f/185929/1500x1200/8959e687b4/aws-white.webp/m/fit-in/600x0/filters:quality(85):format(webp) 600w, https://a.storyblok.com/f/185929/1500x1200/8959e687b4/aws-white.webp/m/fit-in/800x0/filters:quality(85):format(webp) 800w, https://a.storyblok.com/f/185929/1500x1200/8959e687b4/aws-white.webp/m/fit-in/1200x0/filters:quality(85):format(webp) 1200w, https://a.storyblok.com/f/185929/1500x1200/8959e687b4/aws-white.webp/m/fit-in/1600x0/filters:quality(85):format(webp) 1600w, https://a.storyblok.com/f/185929/1500x1200/8959e687b4/aws-white.webp/m/fit-in/2000x0/filters:quality(85):format(webp) 2000w" sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 70vw" />
|
||
</span>
|
||
|
||
</span>
|
||
<span class="footer__item-label" itemprop="name">
|
||
AWS marketplace
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="footer__row footer__row--third" aria-label="Legal and social media">
|
||
<div class="footer__column">
|
||
|
||
<ul class="footer__items"
|
||
aria-labelledby="footer-third-">
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<span class="footer__item-image" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/150x150/61efa58c5f/octopus-blue-logo.svg" alt="Octopus blue logo" loading="lazy" width="150" height="150" />
|
||
</span>
|
||
|
||
</span>
|
||
<span class="footer__item-label">© 2026 Octopus Deploy</span>
|
||
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
<div class="footer__column">
|
||
|
||
<ul class="footer__items"
|
||
aria-labelledby="footer-third-">
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://octopus.com/legal/privacy"
|
||
aria-label="Privacy Policy"
|
||
itemprop="url">
|
||
<span class="footer__item-label" itemprop="name">
|
||
Privacy Policy
|
||
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://octopus.com/legal/gdpr"
|
||
aria-label="GDPR"
|
||
itemprop="url">
|
||
<span class="footer__item-label" itemprop="name">
|
||
GDPR
|
||
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://octopus.com/legal/customer-agreement"
|
||
aria-label="Terms"
|
||
itemprop="url">
|
||
<span class="footer__item-label" itemprop="name">
|
||
Terms
|
||
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://status.octopus.com/"
|
||
rel="noopener noreferrer"
|
||
aria-label="Status (opens in new tab)"
|
||
itemprop="url">
|
||
<span class="footer__item-label" itemprop="name">
|
||
Status
|
||
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
<div class="footer__column">
|
||
|
||
<ul class="footer__items"
|
||
aria-labelledby="footer-third-">
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://octopus.com/company/trust"
|
||
aria-label="Image link"
|
||
itemprop="url">
|
||
<span class="footer__item-image" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/121x28/f5e12a77a5/soc2-1.png/m/fit-in/1200x0/filters:quality(85):format(webp)" alt="SOC 2 Type II compliance" loading="lazy" width="121" height="28" srcset="https://a.storyblok.com/f/185929/121x28/f5e12a77a5/soc2-1.png/m/fit-in/400x0/filters:quality(85):format(webp) 400w, https://a.storyblok.com/f/185929/121x28/f5e12a77a5/soc2-1.png/m/fit-in/600x0/filters:quality(85):format(webp) 600w, https://a.storyblok.com/f/185929/121x28/f5e12a77a5/soc2-1.png/m/fit-in/800x0/filters:quality(85):format(webp) 800w, https://a.storyblok.com/f/185929/121x28/f5e12a77a5/soc2-1.png/m/fit-in/1200x0/filters:quality(85):format(webp) 1200w, https://a.storyblok.com/f/185929/121x28/f5e12a77a5/soc2-1.png/m/fit-in/1600x0/filters:quality(85):format(webp) 1600w, https://a.storyblok.com/f/185929/121x28/f5e12a77a5/soc2-1.png/m/fit-in/2000x0/filters:quality(85):format(webp) 2000w" sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 70vw" />
|
||
</span>
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://octopus.com/support/enterprise-argo-support"
|
||
aria-label="Image link"
|
||
itemprop="url">
|
||
<span class="footer__item-image" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/81x46/95d9bb1ded/property-1-argo-logo-color.png/m/fit-in/1200x0/filters:quality(85):format(webp)" alt="Argo logo" loading="lazy" width="81" height="46" srcset="https://a.storyblok.com/f/185929/81x46/95d9bb1ded/property-1-argo-logo-color.png/m/fit-in/400x0/filters:quality(85):format(webp) 400w, https://a.storyblok.com/f/185929/81x46/95d9bb1ded/property-1-argo-logo-color.png/m/fit-in/600x0/filters:quality(85):format(webp) 600w, https://a.storyblok.com/f/185929/81x46/95d9bb1ded/property-1-argo-logo-color.png/m/fit-in/800x0/filters:quality(85):format(webp) 800w, https://a.storyblok.com/f/185929/81x46/95d9bb1ded/property-1-argo-logo-color.png/m/fit-in/1200x0/filters:quality(85):format(webp) 1200w, https://a.storyblok.com/f/185929/81x46/95d9bb1ded/property-1-argo-logo-color.png/m/fit-in/1600x0/filters:quality(85):format(webp) 1600w, https://a.storyblok.com/f/185929/81x46/95d9bb1ded/property-1-argo-logo-color.png/m/fit-in/2000x0/filters:quality(85):format(webp) 2000w" sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 70vw" />
|
||
</span>
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
<div class="footer__column">
|
||
|
||
<ul class="footer__items"
|
||
aria-labelledby="footer-third-">
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://x.com/OctopusDeploy"
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
aria-label="Image link"
|
||
itemprop="url">
|
||
<span class="footer__item-image" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/35x35/6f5c80f250/x-logo.png/m/fit-in/1200x0/filters:quality(85):format(webp)" alt="X logo" loading="lazy" width="35" height="35" srcset="https://a.storyblok.com/f/185929/35x35/6f5c80f250/x-logo.png/m/fit-in/400x0/filters:quality(85):format(webp) 400w, https://a.storyblok.com/f/185929/35x35/6f5c80f250/x-logo.png/m/fit-in/600x0/filters:quality(85):format(webp) 600w, https://a.storyblok.com/f/185929/35x35/6f5c80f250/x-logo.png/m/fit-in/800x0/filters:quality(85):format(webp) 800w, https://a.storyblok.com/f/185929/35x35/6f5c80f250/x-logo.png/m/fit-in/1200x0/filters:quality(85):format(webp) 1200w, https://a.storyblok.com/f/185929/35x35/6f5c80f250/x-logo.png/m/fit-in/1600x0/filters:quality(85):format(webp) 1600w, https://a.storyblok.com/f/185929/35x35/6f5c80f250/x-logo.png/m/fit-in/2000x0/filters:quality(85):format(webp) 2000w" sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 70vw" />
|
||
</span>
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://www.linkedin.com/company/octopus-deploy"
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
aria-label="Image link"
|
||
itemprop="url">
|
||
<span class="footer__item-image" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/35x35/d628eb60c7/linkedin-logo.png/m/fit-in/1200x0/filters:quality(85):format(webp)" alt="LinkedIn logo" loading="lazy" width="35" height="35" srcset="https://a.storyblok.com/f/185929/35x35/d628eb60c7/linkedin-logo.png/m/fit-in/400x0/filters:quality(85):format(webp) 400w, https://a.storyblok.com/f/185929/35x35/d628eb60c7/linkedin-logo.png/m/fit-in/600x0/filters:quality(85):format(webp) 600w, https://a.storyblok.com/f/185929/35x35/d628eb60c7/linkedin-logo.png/m/fit-in/800x0/filters:quality(85):format(webp) 800w, https://a.storyblok.com/f/185929/35x35/d628eb60c7/linkedin-logo.png/m/fit-in/1200x0/filters:quality(85):format(webp) 1200w, https://a.storyblok.com/f/185929/35x35/d628eb60c7/linkedin-logo.png/m/fit-in/1600x0/filters:quality(85):format(webp) 1600w, https://a.storyblok.com/f/185929/35x35/d628eb60c7/linkedin-logo.png/m/fit-in/2000x0/filters:quality(85):format(webp) 2000w" sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 70vw" />
|
||
</span>
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://github.com/OctopusDeploy"
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
aria-label="Image link"
|
||
itemprop="url">
|
||
<span class="footer__item-image" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/35x35/6d993f391c/github-logo.png/m/fit-in/1200x0/filters:quality(85):format(webp)" alt="GitHub logo" loading="lazy" width="35" height="35" srcset="https://a.storyblok.com/f/185929/35x35/6d993f391c/github-logo.png/m/fit-in/400x0/filters:quality(85):format(webp) 400w, https://a.storyblok.com/f/185929/35x35/6d993f391c/github-logo.png/m/fit-in/600x0/filters:quality(85):format(webp) 600w, https://a.storyblok.com/f/185929/35x35/6d993f391c/github-logo.png/m/fit-in/800x0/filters:quality(85):format(webp) 800w, https://a.storyblok.com/f/185929/35x35/6d993f391c/github-logo.png/m/fit-in/1200x0/filters:quality(85):format(webp) 1200w, https://a.storyblok.com/f/185929/35x35/6d993f391c/github-logo.png/m/fit-in/1600x0/filters:quality(85):format(webp) 1600w, https://a.storyblok.com/f/185929/35x35/6d993f391c/github-logo.png/m/fit-in/2000x0/filters:quality(85):format(webp) 2000w" sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 70vw" />
|
||
</span>
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
<li class="footer__item">
|
||
|
||
|
||
|
||
<a class="footer__item-link"
|
||
href="https://www.youtube.com/c/Octopusdeploy"
|
||
rel="noopener noreferrer"
|
||
aria-label="Image link"
|
||
itemprop="url">
|
||
<span class="footer__item-image" aria-hidden="true">
|
||
|
||
|
||
|
||
|
||
<span class="image-wrapper">
|
||
<img src="https://a.storyblok.com/f/185929/35x35/944072d610/youtube-logo.png/m/fit-in/1200x0/filters:quality(85):format(webp)" alt="YouTube logo" loading="lazy" width="35" height="35" srcset="https://a.storyblok.com/f/185929/35x35/944072d610/youtube-logo.png/m/fit-in/400x0/filters:quality(85):format(webp) 400w, https://a.storyblok.com/f/185929/35x35/944072d610/youtube-logo.png/m/fit-in/600x0/filters:quality(85):format(webp) 600w, https://a.storyblok.com/f/185929/35x35/944072d610/youtube-logo.png/m/fit-in/800x0/filters:quality(85):format(webp) 800w, https://a.storyblok.com/f/185929/35x35/944072d610/youtube-logo.png/m/fit-in/1200x0/filters:quality(85):format(webp) 1200w, https://a.storyblok.com/f/185929/35x35/944072d610/youtube-logo.png/m/fit-in/1600x0/filters:quality(85):format(webp) 1600w, https://a.storyblok.com/f/185929/35x35/944072d610/youtube-logo.png/m/fit-in/2000x0/filters:quality(85):format(webp) 2000w" sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 70vw" />
|
||
</span>
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
</footer>
|
||
</div> <script>(function(){const site_url = "https://octopus.com";
|
||
const site_features = {"stickyNav":{"top":75.2},"codeBlocks":["copy"],"figures":["enlarge"],"youTubeLinks":["embed"],"headers":["link"],"details":["tabs"],"search":["dialog"]};
|
||
|
||
window.site_url = site_url;
|
||
window.site_features = site_features;
|
||
})();</script><script src="/blog/js/main.js" type="module" async></script><script>
|
||
document.addEventListener('searched', (e) => {
|
||
if (typeof plausible != 'undefined') {
|
||
plausible('Search', { props: e.detail });
|
||
}
|
||
});
|
||
</script> <script defer src="https://octopus.com/octopus-public/assets/navbarPU.js"></script> <script defer src="https://octopus.com/octopus-public/assets/buttonHoverEffect.js"></script> </body> </html> |