1782 lines
111 KiB
HTML
1782 lines
111 KiB
HTML
<!DOCTYPE html><html dir="ltr" lang="en" class="initial"> <head><meta charset="utf-8"><title>Database Migrations Lessons Learned | Octopus blog</title><meta name="robots" content="max-image-preview:large, index, follow"><meta name="keywords"><meta name="description" content="Learn about database migrations and some lessons learned from using them in the Octopus Deploy codebase."><link rel="preconnect" href="https://octopus.com" crossorigin><link rel="preload" as="image" href="/blog/i/x/cover/database-migrations-2020.png" imagesrcset="/blog/i/600/cover/database-migrations-2020.webp 600w, /blog/i/1000/cover/database-migrations-2020.webp 750w" 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/database-migrations-lessons-learned"><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/database-migrations-lessons-learned"><meta property="og:title" content="Database migrations lessons learned"><meta property="og:description" content="Learn about database migrations and some lessons learned from using them in the Octopus Deploy codebase."><meta property="og:image" content="https://octopus.com/blog/img/cover/database-migrations-2020.png"><meta property="og:image:alt" content="Database migrations lessons learned"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Database migrations lessons learned"><meta name="twitter:description" content="Learn about database migrations and some lessons learned from using them in the Octopus Deploy codebase."><meta name="twitter:image" content="https://octopus.com/blog/img/cover/database-migrations-2020.png"><meta name="twitter:image:alt" content="Database migrations lessons learned"><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": "Database migrations lessons learned",
|
||
"description": "Learn about database migrations and some lessons learned from using them in the Octopus Deploy codebase.",
|
||
"author": {
|
||
"@type": "Person",
|
||
"name": "Frank Lin"
|
||
},
|
||
"datePublished": "2020-09-15T00:00:00.000Z",
|
||
"dateModified": "2020-09-15T00: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/database-migrations-lessons-learned"
|
||
},
|
||
"image": {
|
||
"@type": "ImageObject",
|
||
"url": "https://octopus.com/blog/img/cover/database-migrations-2020.png",
|
||
"width": 1200,
|
||
"height": 800
|
||
},
|
||
"articleSection": "Engineering"
|
||
}</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":"Database migrations lessons learned","item":"https://octopus.com/blog/database-migrations-lessons-learned"}]}</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/database-migrations-lessons-learned" aria-current="page"> <span>Database migrations lessons learned</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/database-migrations-2020.png" srcset="/blog/i/600/cover/database-migrations-2020.webp 600w, /blog/i/1000/cover/database-migrations-2020.webp 750w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" alt="Database migrations lessons learned" class="image__img" width="750" height="400" loading="eager" fetchpriority="high" decoding="sync"> </figure> <div class="header"> <h1 class="header__title">Database migrations lessons learned</h1> </div> </header> <div class="page-content anim-show-parent" itemprop="articleBody"> <div class="author"> <a href="/blog/authors/frank-lin/1/" class="author__image-link"> <img class="author__image" srcset="/blog/i/600/authors/frank-lin.webp 150w" sizes="170px" src="/blog/i/x/authors/frank-lin.png" alt="Frank Lin" width="150" height="150"> </a> <div class="author__info"> <span class="author__name"> <a href="/blog/authors/frank-lin/1/"> <span> Frank Lin </span> </a> </span> <time class="author__time" datetime="Tue Sep 15 2020 00:00:00 GMT+0000 (Coordinated Universal Time)"> September 15, 2020 </time> </div> </div> <p>Database migrations are a popular way to update application databases in a controlled way that keeps the risk to a minimum. This approach is also known as schema migrations, database upgrade scripts, change driven, or script based updates. Octopus Deploy has used database migrations since the beginning of the product, and we’ve learned a lot as Octopus has grown in size and complexity.</p>
|
||
<p>In this post, I’ll introduce database migrations, share some common frameworks and cover our lessons learned from nearly ten years of experience.</p>
|
||
<h2 id="what-are-database-migrations">What are database migrations?</h2>
|
||
<p>Most applications need to persist information about the state of the application, either in files or databases. The shape of the objects almost always evolves and changes over time, which means some kind of migration code or script is required to keep the shape of the persisted data in-sync (or consistent). Without them, the application code would need to deal with all possible versions of the documents from the beginning of time.</p>
|
||
<p>Most frameworks support this concept by providing a way for you to supply migration scripts to manipulate the database. Some even let you specify a rollback action. Typically, they keep track of the scripts that have been applied in a table.</p>
|
||
<p>There are numerous options for almost every platform and each one generally has some unique attributes:</p>
|
||
<p><strong>NodeJS</strong></p>
|
||
<ul>
|
||
<li><a href="https://github.com/db-migrate/node-db-migrate">db-migrate</a></li>
|
||
<li><a href="https://sequelize.org/">Sequelize</a></li>
|
||
<li><a href="http://knexjs.org/">Knex.js</a></li>
|
||
</ul>
|
||
<p><strong>Python</strong></p>
|
||
<ul>
|
||
<li><a href="https://docs.djangoproject.com/en/3.1/topics/migrations/">Django migrations</a></li>
|
||
<li><a href="https://github.com/sqlalchemy/alembic">alembic</a></li>
|
||
<li><a href="https://flask-migrate.readthedocs.io/en/latest/#">Flask-Migrate</a></li>
|
||
</ul>
|
||
<p><strong>Ruby</strong></p>
|
||
<ul>
|
||
<li><a href="https://guides.rubyonrails.org/v3.2/migrations.html">Rails migrations</a></li>
|
||
<li><a href="https://github.com/ilyakatz/data-migrate">Data Migrate</a></li>
|
||
</ul>
|
||
<p><strong>.NET</strong></p>
|
||
<ul>
|
||
<li><a href="https://github.com/dbup/dbup">DbUp</a></li>
|
||
<li><a href="https://github.com/StackExchange/Dapper">Dapper</a></li>
|
||
<li><a href="https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/">Entity Framework Code First</a></li>
|
||
<li><a href="https://github.com/fluentmigrator/fluentmigrator">Fluent Migrator</a></li>
|
||
</ul>
|
||
<p><strong>Java</strong></p>
|
||
<ul>
|
||
<li><a href="https://flywaydb.org/">Flyway</a></li>
|
||
<li><a href="https://www.liquibase.org/">liquibase</a></li>
|
||
</ul>
|
||
<h2 id="lessons-learned">Lessons Learned</h2>
|
||
<h3 id="keep-your-scripts-separate">Lesson 1: Keep your migration scripts away from your production code</h3>
|
||
<p>As software developers, we’ve been trained to reuse and avoid duplicating code. This is the one time where we <em>want</em> to duplicate code, since we want the behavior of our migration script to be <em>snapshotted in time</em>.</p>
|
||
<p>An example is described in the following illustrations. Each script (numbered 001 to 005) is responsible for changing the database state from <strong>A</strong> to <strong>B</strong>. If the script references a constant or function (say a function that generates the default value of a new property) that is in production code, that script will still work as expected at the time of writing.</p>
|
||
<figure>
|
||
<p><img src="/blog/i/x/database-migrations-lessons-learned/upgrade-script-now.png" alt="It might work now..." loading="lazy" srcset="/blog/i/600/database-migrations-lessons-learned/upgrade-script-now.webp 600w, /blog/i/1000/database-migrations-lessons-learned/upgrade-script-now.webp 1000w, /blog/i/2000/database-migrations-lessons-learned/upgrade-script-now.webp 1412w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="1412" height="660"></p>
|
||
</figure>
|
||
_It might work now..._
|
||
<p>If the referenced code changes in a few months time (say the constant’s value changes), then the script is actually taking a dependency on the future. This change in behavior is subtle and hard to detect, <em>only surfacing when a customer upgrades directly from an old version before the script was first introduced</em>.</p>
|
||
<figure>
|
||
<p><img src="/blog/i/x/database-migrations-lessons-learned/upgrade-script-later.png" alt="But will it work later?" loading="lazy" srcset="/blog/i/600/database-migrations-lessons-learned/upgrade-script-later.webp 600w, /blog/i/1000/database-migrations-lessons-learned/upgrade-script-later.webp 1000w, /blog/i/2000/database-migrations-lessons-learned/upgrade-script-later.webp 2000w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="2032" height="560"></p>
|
||
</figure>
|
||
_But will it work later?_
|
||
<h3 id="keep-it-low-tech">Lesson 2: Keep it low-tech, don’t deserialize</h3>
|
||
<div class="hint"><p>This step applies to teams using object relational mappers (ORM) or document databases (i.e., NoSQL). Octopus uses a micro-ORM called <a href="https://github.com/OctopusDeploy/Nevermore">Nevermore</a> that treats SQL Server as a document store.</p></div>
|
||
<p>You might be tempted to deserialize database records so that you can work with objects where code completion (i.e., IntelliSense) or type safety are available. In reality, you’re exposing yourself to complexities around serialization and type converters.</p>
|
||
<p>The upgrade script will be simpler if you work directly with the text or document model. This often means you need to work with abstractions for different formats. For example, Octopus is written using .NET Core and this means we work directly with <code>JObject</code> for <code>JSON</code> documents or <code>XElement</code> for <code>XML</code> documents. Other platforms use the equivalent concepts and frameworks.</p>
|
||
<h3 id="write-tests">Lesson 3: Write tests to exercise each migration script individually</h3>
|
||
<p>Having tests that exercise a single script greatly increases the confidence in the migration script. Migrations are a pain to test manually because you need to take a snapshot of the database and restore it after testing.</p>
|
||
<p>You might also want to run the complete migration over backups of a sample of old databases to catch any unexpected data or bad assumptions that won’t be covered by the individual test.</p>
|
||
<h3 id="consider-running-long-migrations-online">4. Consider running long migrations online</h3>
|
||
<p>Octopus Server runs its migration scripts synchronously during startup. This has the benefit of leaving the database in a known predictable state when the application starts. The downside of course, is that running migrations over large tables incurs a long downtime, and this has meant we avoid certain structural changes involving large tables.</p>
|
||
<p>We have started experimenting with running large migration jobs asynchronously in the background when the application is up and running. This means there is less downtime and customers can resume using the application sooner, but it also introduces new problems:</p>
|
||
<ol>
|
||
<li>The application has to support the database in both the old and new state</li>
|
||
<li>The upgrade job might be affected when you introduce subsequent changes to the same table. You will then need to either support the database in all three possible states or force the customer to upgrade to an intermediate version.</li>
|
||
</ol>
|
||
<p>This is something we don’t have concrete advice on yet but we’re continuing to evaluate.</p>
|
||
<h3 id="consider-versioning-your-documents">5. Consider versioning your documents</h3>
|
||
<div class="hint"><p>Similar to <a href="/blog/database-migrations-lessons-learned#keep-it-low-tech">Lesson 2 (Keep it low-tech)</a>, this step applies to teams using object relational mappers (ORM) or document databases.</p></div>
|
||
<p>Although it’s convenient to use migration scripts to update database schema changes as well as document properties, you will gain some flexibility if you separate the two concerns. For example, if you versioned your documents and upgraded the document structure separately, then you can reuse that same upgrade code to import those same documents from a file.</p>
|
||
<h2 id="conclusion">Conclusion</h2>
|
||
<p>The crucial takeaway from these lessons is to isolate your upgrade scripts from the main production code so that its behavior is <em>snapshotted in time</em>.</p>
|
||
<p>In summary, our database migration lessons learned are:</p>
|
||
<ul>
|
||
<li>Keep your migration scripts away from your production code.</li>
|
||
<li>Keep it low-tech, don’t deserialize.</li>
|
||
<li>Write tests to exercise each migration script individually.</li>
|
||
<li>Consider running long migrations online.</li>
|
||
<li>Consider versioning your documents.</li>
|
||
</ul> <!-- <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/engineering/1/">Engineering</a> </li> </ul> </div> </div> <div class="author"> <a href="/blog/authors/frank-lin/1/" class="author__image-link"> <img class="author__image" srcset="/blog/i/600/authors/frank-lin.webp 150w" sizes="170px" src="/blog/i/x/authors/frank-lin.png" alt="Frank Lin" width="150" height="150"> </a> <div class="author__info"> <span class="author__name" itemprop="author" itemscope itemtype="https://schema.org/Person"> <a href="/blog/authors/frank-lin/1/" itemprop="url"> <span itemprop="name"> Frank Lin </span> </a> </span> <time class="author__time" datetime="Tue Sep 15 2020 00:00:00 GMT+0000 (Coordinated Universal Time)" itemprop="datePublished"> Published: September 15, 2020 </time> </div> </div> </div> <h3>Related posts</h3> <div class="simple-grid-3"> <article class="card card--padded"> <a href="/blog/slack-integration" class="card__link" role="link" aria-label="Open Act faster with our new Slack integration"> <div class="card__image-wrapper"> <img srcset="/blog/i/600/cover/slack-integration.webp 600w, /blog/i/1000/cover/slack-integration.webp 1000w, /blog/i/2000/cover/slack-integration.webp 2000w" sizes="254px" src="/blog/i/x/cover/slack-integration.png" width="3000" height="1600" alt="Slack and Octopus logos with a connection between them" 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">Act faster with our new Slack integration</p> <p class="card__description">Octopus now posts to Slack. Send scoped event notifications to the channels your teams already watch, or fire a message from any point in a deployment process.</p> <div class="card__meta"> <div class="card__authors"> <div class="author"> <img class="author__image" srcset="/blog/i/600/authors/michelle-obrien.webp 140w" sizes="170px" src="/blog/i/x/authors/michelle-obrien.png" alt="Michelle O'Brien" width="140" height="140"> <div class="author__info"> <span class="author__name"> <span> Michelle O'Brien </span> </span> <time class="author__time" datetime="2026-08-13"> August 13, 2026 </time> </div> </div> </div> </div> </div> </a> </article><article class="card card--padded"> <a href="/blog/octopus-cloud-connection-agent" class="card__link" role="link" aria-label="Open Connecting Octopus Cloud to your internal systems — without opening a single port"> <div class="card__image-wrapper"> <img srcset="/blog/i/600/cover/img-blog-connector-agent-2026-1500x800.webp 600w, /blog/i/1000/cover/img-blog-connector-agent-2026-1500x800.webp 1000w, /blog/i/2000/cover/img-blog-connector-agent-2026-1500x800.webp 1500w" sizes="254px" src="/blog/i/x/cover/img-blog-connector-agent-2026-1500x800.png" width="1500" height="800" alt="Connecting Octopus Cloud to your internal systems" 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">Connecting Octopus Cloud to your internal systems — without opening a single port</p> <p class="card__description">The Octopus Connection Agent lets enterprises reach their on-premises tooling from Octopus Cloud securely, with no inbound firewall rules and no VPN.</p> <div class="card__meta"> <div class="card__authors"> <div class="author"> <img class="author__image" srcset="/blog/i/600/authors/mark-lamprecht.webp 200w" sizes="170px" src="/blog/i/x/authors/mark-lamprecht.png" alt="Mark Lamprecht" width="200" height="210"> <div class="author__info"> <span class="author__name"> <span> Mark Lamprecht </span> </span> <time class="author__time" datetime="2026-08-03"> August 3, 2026 </time> </div> </div> </div> </div> </div> </a> </article><article class="card card--padded"> <a href="/blog/tag-sets-new-functionality" class="card__link" role="link" aria-label="Open Target tags are now managed with tag sets"> <div class="card__image-wrapper"> <img srcset="/blog/i/600/tag-sets-new-functionality/blog-deploy-to-targets-by-tag.webp 600w, /blog/i/1000/tag-sets-new-functionality/blog-deploy-to-targets-by-tag.webp 1000w, /blog/i/2000/tag-sets-new-functionality/blog-deploy-to-targets-by-tag.webp 1500w" sizes="254px" src="/blog/i/x/tag-sets-new-functionality/blog-deploy-to-targets-by-tag.png" width="1500" height="800" alt="Cartoon instance of Octopus Deploy showing how to deploy to target tags." 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">Target tags are now managed with tag sets</p> <p class="card__description">More control over your target tags and how you can use them at deployment time.</p> <div class="card__meta"> <div class="card__authors"> <div class="author"> <img class="author__image" srcset="/blog/i/600/authors/michelle-obrien.webp 140w" sizes="170px" src="/blog/i/x/authors/michelle-obrien.png" alt="Michelle O'Brien" width="140" height="140"> <div class="author__info"> <span class="author__name"> <span> Michelle O'Brien </span> </span> <time class="author__time" datetime="2026-07-07"> July 7, 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/database-migrations-2020.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="#what-are-database-migrations" class="article-nav__link" data-article-link> What are database migrations? </a> </li><li class="article-nav__item article-nav__item--level-2"> <a href="#lessons-learned" class="article-nav__link" data-article-link> Lessons Learned </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#keep-your-scripts-separate" class="article-nav__link" data-article-link> Lesson 1: Keep your migration scripts away from your production code </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#keep-it-low-tech" class="article-nav__link" data-article-link> Lesson 2: Keep it low-tech, don’t deserialize </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#write-tests" class="article-nav__link" data-article-link> Lesson 3: Write tests to exercise each migration script individually </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#consider-running-long-migrations-online" class="article-nav__link" data-article-link> 4. Consider running long migrations online </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#consider-versioning-your-documents" class="article-nav__link" data-article-link> 5. Consider versioning your documents </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> |