The Pragmatic Engineer - CI/CD with Robert Erez
Episode Date: June 17, 2026Brought to You By:• Antithesis – verify your system’s correctness without human review or traditional integration tests – and avoid bugs or outages.• WorkOS – everything you need to make y...our app enterprise ready.• turbopuffer – a vector and full-text search engine built on object storage. It’s fast, cheap, and extremely scalable.—Robert Erez is a principal engineer at Octopus Deploy, and a longtime expert in CI/CD, deployment systems, and software delivery. Rob and I were also once colleagues on the Skype web team, working on large-scale deployments and release processes.In this episode of The Pragmatic Engineer, I sit down with Rob to discuss how teams deploy software safely and efficiently at scale. We cover Kubernetes, GitOps, platform engineering, progressive delivery, feature flags, cloud development environments, and the growing role of AI in CI/CD workflows. We also get into the tradeoffs in different deployment approaches, why self-hosted software still matters for some organizations, and the recent evolution of software delivery practices.—Timestamps00:00 Intro02:09 Canary deployments at Skype05:01 Joining at Octopus Deploy06:15 Continuous deployment10:26 Why Kubernetes won15:51 Kubernetes on-prem18:50 How GitOps works25:00 The uses and limitations of GitOps31:04 The rise of platform teams35:51 How AI is changing CI/CD39:49 Progressive delivery explained47:31 Rollbacks and roll-forwards50:14 Feature flags54:32 How development environments are evolving57:40 Cloud development environments (CDEs)1:03:45 Self-hosting CI/CD1:09:25 Getting started with progressive delivery1:11:15 Book recommendations—The Pragmatic Engineer deepdives relevant for this episode:• Kubernetes and retiring at the top with Kelsey Hightower• The past and future of modern backend practices• Microsoft is dogfooding AI dev tools’ future• How Kubernetes is built with Kat Cosgrove• How Linux is built with Greg KH—Production and marketing by https://penname.co/. For inquiries about sponsoring the podcast, email podcast@pragmaticengineer.com. Get full access to The Pragmatic Engineer at newsletter.pragmaticengineer.com/subscribe
Transcript
Discussion (0)
CICD remains one of the hardest things to get right in software engineering.
But why? Rob Errs is a CICD expert having worked in his field for more than a decade.
In the early 2010s we were teammates on the Skype for Webteam,
and then Rob joined Octopus Deploy as one of the first engineers 10 years ago.
In today's episode we cover progressive delivery and practice,
Canary deployments, blue-green, and why feature toggles are often still better.
What is GitOps and why it's not about Git,
and where that everything in Git mindset breaks down?
Why you should prioritize rollbacks less and focus on roll forwards, and many more.
If you want harder and lessons about CICD, progressive delivery, and what's coming as AI changes
how much code we ship to production, then this episode is for you.
This episode is presented by indices.
Verify your system's correctness without human review or traditional integration tests
and avoid bugs or outages.
Today's episode will be about CICD.
CICD at scale is one of the hardest infrastructure problems to get right, and the teams who nail it
know that the details very much matter.
This is where I need to mention our season sponsor, WorkOS.
WorkOS bring the same rigor as many of us use with CICD at scale to Enterprise Oath.
SSO skim are back, production ready, battle tested, and built to handle real load and real compliance
requirements.
To add Enterprise Auth without the infrastructure project, visit WorkOS.com.
Rob, it's awesome to have you here in the podcast.
Hello, Gugay.
It's good to be here.
Yeah, I'm loving Amsterdam.
Yeah, it's been like, what?
But 11, 12 years since we walked together.
Yeah, yeah, I think 2015, 2014, 2015, I think I left UK.
Yeah, it's a while.
And Skype, when there was still Skype,
our team somehow inherited the Outlog.com plugin,
which had like 400 million users per month or something like that.
Yeah, it was crazy.
It was a massive scale.
So this was an interesting, interesting job.
Deployments were very much a case of, you know,
you ship once a week and you have to go to a cab board,
you know, a change advisory board,
and you have to get sign off and approval.
And I always found that really weird, right?
Like we're building this piece of software.
It runs on the web.
We can ship it whenever we want.
It was running on Azure at the time.
And so, you know,
we've got full access to push whenever we want.
And we make these changes through the week,
but we'd kind of have to hold them back.
I guess to Adela, our manager,
both of our managers at the time,
we kind of, I guess, worked around the system.
When the code was ready,
we'd build it and ship it through the week.
and it was really sort of impressed and proud at this process that the whole team
had kind of put together, right, where we'd commit the code, the test would run,
several kind of layers of testing, it would go to staging, etc.
And then it would get shipped to production.
So we're kind of, I guess, executing a form of, I guess, continuous delivery at a time.
And we would then ship ourselves, you know, once a week.
I kind of always like to tell this story that at the time, you know,
when we'd have a build ready to go, you know, we do a form of canary deployments.
And so this is where you kind of roll out to a small percentage of your customer base.
And we always found that the customer base that would be our test subjects was New Zealand.
So New Zealand was always our canary.
Yep.
A bunch of reasons for that.
You know, they're in the first country kind of reached this, you know, new date.
So it's the first ones to kind of roll out into a time.
When it becomes like, you know, like midnight passes, it's like 1 a.m.
First country is New Zealand.
Bang, exactly.
So first country that's of, you know, significant size.
They speak English.
So if there's any bugs of issues or reports, it's kind of easy to understand.
But, you know, to be honest, New Zealand is small enough that no one really cared if we shipped a bug and had to fix it quickly.
So sorry to all the New Zealanders listening.
Yeah, I think that's kind of this good example of using a continuous delivery technique to, you know, ship the code fast than what we otherwise could have if we had these kind of big bang releases.
And this whole process, I guess, opened my eyes to, you know, what progressive delivery,
what good CICD could be.
And yeah, I guess from there, I spent a few years there at Skype.
And eventually, wife and I decided it was sort of time to come home to Australia.
And then back in Australia, you went to start to work at Octopus deploy?
Yeah, eventually I came back and actually worked at a place with a friend of mine just for a little while,
just to kind of get back on the feet.
And I remember they were using Octopus Deploy there.
And so Octopus Deploy, for those who don't know, is a deployment tool that's built and sort of developed originally in Brisbane.
So there was a strong kind of Brisbane attachment to it.
Yeah, that's right.
So when I found out that they were hiring, I thought, okay, why not I'll give a go?
I like C-I-C-D.
I like this space.
I think there's a lot of interesting problems in this space.
So we're polite and joined.
And at the time, I was employee, I think, employee number eight or nine or something like that.
So it was very much still a bit of a startup culture.
Definitely not start up in the sense of, you know, Silicon Valley wild parties and, you know,
ridiculous spending, but start up in the sense that everyone who I worked with was an engineer.
Now, even Paul Stavelle, the CEO, he's an engineer.
This is kind of where it started from.
And so we'd all be working on code together.
You'd have someone had an idea, you'd have a bit of a chat about it and ship it.
So we were the marketing, we were support, we were done a bit of everything.
And yeah, obviously the company has grown alive.
since then. The company was focused,
Octav was deployed from the start. They were focused
on deployments, right?
Can we talk a little bit on
whenever I think about
deployment, I always say CICD,
continuous integration, continuous delivery.
Why was there a focus on
deployments? And is that the same as continuous
delivery? Yeah, interesting. So
you're right, like quite often people talk about
CI and CD as this kind of interchangeable.
They're either interchangeable or the word is
CICD. It's like the name.
attached to itself. It's hard for me to imagine a CD without a CI continuous integration.
That's, that's right. And I guess the way to look at it is, you know, you've got sort of multiple
stages of maturity of software teams as they kind of move on their way from, you know, initially
CI, which continuous integration. This is the idea that...
Well, initially it's YOLO. Initially, it's Ollo. Yeah, that's right. Initially, to be there,
initially... You're only in Luns, you just deployed to prod or SSAG into broad. Or you used to.
We've all worked in places where we've done that, and that's the starting point.
So you're right.
YOLO is the first stage.
The second stage is continuous integration.
And so this is this idea where you want to keep integrating, merging your code changes
into a single branch, and you want to be continually running tests against it.
Now, continuous delivery is kind of the next stage where we talk about testing our code
and there's unit test and integration tests, et cetera.
But what you also really need to test is your deployment process itself, right?
So continuous delivery is this idea
that, okay, you want to make sure that at any
point in time, when I click
the button to deploy, I want it to go to
production once we kind of get to this
place. The next
stage beyond that, which, you know,
not all companies necessarily reach,
is continuous deployment.
Right. So this is the idea that
not only your changes
being merged and merged together
at the same time and ready to go, but they're also being
shipped to production, essentially.
So the stages we have is
first ULO, then continuous integration, then continuous delivery and continuous deployment.
That's right.
What is the difference between continuous delivery and continuous deployment?
The big difference, I guess, is the question of, do your changes go out to production automated?
Does it kind of flow through without any intervention, I guess?
And then for continuous delivery, they go out, but not necessarily to production, right?
That's right.
So that's why you'll have environments like, you know, dev environment or testing or stage.
or whatever. Now, it's possible that, you know, some parts of that process may also still be
manual. Maybe you only update the test environment once a week so the tests can play around with
it again. But the key principle is that you could. You can kind of push it through sort of
automatically the whole way through if you want. And what teams would not want to do continuous
deployment, right? Because it seems to me continuous delivery, you kind of want to get to because
then you just get more and more feedback, right? But then it is a kind of good question, like, should it
go out immediately?
This is the question, you know, everyone always
ask, like, it's almost ready to go out.
Why can't we just push your production?
As engineers, you want to push you go out as soon as possible it's ready, right?
The reality is it doesn't really suit every company, right?
So, you know, it may be the case that, you know,
some companies really do still have, you know,
review boards where you need to validate, is this good to go out?
Particularly if you're in an industry that has a lot of regulation and compliance,
and compliance problems,
problems, compliance requirements,
and they need to make sure that when it does go out to production,
it's sort of done at the right time,
with the right people available, et cetera, et cetera.
It's not necessarily true to say that everyone should be going to
continuous deployment,
because that's, you know,
sometimes just not viable for various reasons.
But if you at least got to that point where you're sort of continually seeing
your changes go through all the testing,
you know, you're promoting it through the different environments,
which is, you know, you're therefore testing the process itself.
If you can only click that button to go to production once a week or whatever,
okay, that's fine.
You know, you've done a lot of that hard work.
You've mitigated risk, which is what a lot of this process is about, right,
is fill the pain as soon as possible and de-risk anything that could go wrong
right up until that last point.
So I know you're deep into CICD,
where continuous integration, contingentious delivery,
continuous deployment. You've been doing this for like, what, 10 plus years now. But I was pretty surprised to see
that when I checked Octopus deploy, it's at deployment. It says continuous delivery, but it also says
Kubernetes. How has Kubernetes kind of arrived in the topic of CICD and in general infrastructure? What happened
there? Yeah, Kubernetes is the platform of the moment. If we take a bit of a step back, Kubernetes came out of
Google, I guess they originally had Borg, you know, they were using it to host and run their infrastructure.
ended up releasing Kubernetes, partly, I'm not going to pretend I can read their minds and know
exactly why, but partly as a way of helping to level the playing field between them and some of the
other cloud vendors. Yeah, so like before Kubernetes, AWS was a clear leader, and I talk
with Kat Kohl's growth who came to the podcast, who works on the Kubernetes team. And again,
she speculated that by releasing Kubernetes, it was a lot easier to move workloads.
from between AWS and Google Cloud.
So it kind of leveled the playing field,
and now there was a reason to,
like choosing Google Cloud was no longer as big of a risk
or choosing Azure was not as big a risk and so on.
Yeah, that's right.
It made it simple to move between vendors.
And so as a customer of one of these platforms,
if you wanted to move to ADOS and you're using containers,
no problem.
You just sort of putting it in a new place.
And so Kubernetes came along at the time when
there was a bunch of plays in the field,
for container orchestration.
So you know you had, you know, Nomad, even DockerSform.
From Hashikorp, that's right.
A bunch of other options are out there because...
At CoreOS, Kelsey Hightower, just on the podcast,
they built Fleet, which was another container orchestration.
And this was all around like 2012, 2013, 2014.
And then Kubernetes came out and somehow it started to win market share.
Yeah, yeah.
I mean, I think some of the mechanics that,
it provided, kind of really appealed to engineers and, I guess, DevOps teams out there.
And eventually, I think particularly because it was so easy to use cross-platform,
because some of the cloud vendors then did end up picking it up,
it kind of as ended up now being essentially the winner in this space.
I know even back then, even non-container orchestration tools like Azure service fabric
was another kind of attempt to handle the fact that, you know,
this well everyone's building microservices and they want to host them in a single platform and how do you
orchestrate that and do with dependencies etc but tribunities has become the clear winner and when you say winner
I understand that for example when you have a bunch of backend servers on a service like you know we have a
website there's a large backend okay I'll use Kubernetes for that but you're talking about you're talking with
infrastructure right or you're talking about even things like build servers that's right so it's kind of funny
you know, we talk about Kubernetes as being, you know, cloud native.
This is what, this is the term you always here.
It's cloud native.
That's what they say.
That's what they say.
And, you know, you look at the vendors that picked it up.
It's Azure and AWS and kind of the made it available on their platforms.
The reality is a lot of customers actually use Kubernetes for running on premise.
So, you know, a non-insignificant number of our customers who are doing Kubernetes
are running on potentially their own VMs on their own server farms.
And maybe they're running VMs in AWS or Azure, but they're maintaining Kubernetes.
itself. The idea being that they have a lot more control then over exactly what's running. It's
particularly common you'll find in things like financial industry and things like that, where again,
wanting to fully sort of control the process and manage the whole sort of piece of infrastructure
from end to end is kind of one of their goals, but they want to leverage the capabilities that
Kubernetes provides by, you know, allowing the application team and the ops teams to just build
and define kind of in that declarative fashion that Kubernetes provides exactly what runs and
how does it run, et cetera.
So they chose Kubernetes because this is the best tool they can manage their on-prem
infrastructure and say like, okay, I have like these physical machines and I want this many
virtual machines and I want to run a database on this many nodes and a internal web server
or like whatever.
So it just won this area as well?
Yeah, yeah.
I mean, so there's around the same time that Kubernetes came out,
actually before that, there was a lot of these other kind of declarative type tools, right?
So you have, you know, Terraform, which is a really popular one.
You can define kind of exactly what infrastructure you want
and what you're doing is you're essentially defining the desired state.
And then the tool kind of applies it.
And, you know, you've got puppet, et cetera.
And so Kubernetes has this similar concept, right,
where you define what you want your sort of infrastructure to look like,
and the internal Kubernetes controllers and operators will basically ensure that whatever you've asked for always applies.
So if you say you want three replicas of something, it will ensure that there's three of like replicas of something.
And so if one of those pods dies, for example, it will spin another one up.
And so it simplifies this process of being able to find declarative, declaratively, kind of exactly what you as a sort of application team need to run your system.
It's fascinating because I always assumed that Kubernetes has won the,
the cloud native space and cypher scalers.
Can you tell them a bit more about how is being used on-prem?
Some interesting stories.
You must have seen some because you said that you're working with companies
who are managing large on-prem Kubernetes or like interesting situations.
Yeah, this is one of the nice things about working at a company like Octopus.
We talk to and deal with so many different customers.
And yeah, everyone's doing things a little bit different.
Although they've got slightly different needs and requirements.
And you kind of get exposed to a lot of different
problems and patterns. And it's easy to sometimes to get lost in, you know, what people are
talking about in conferences and everyone's saying it's all about cloud and this is the, you know,
best practice and you should be doing this. And the reality is, you know, everyone's kind
of got their own little problems and they just want to solve them why they kind of need to solve
them. And so some of our customers, in fact, a lot of our customers will run Kubernetes,
kind of, you know, quite unquote on premise. So for example, I was actually talking with one.
When you say on premise, can you just be bit more clear, is this a data center where they're
like renting and co-located?
is this actually like I have my own data center or is this like I actually have my own machines in my closet?
Yes and yes, I guess.
What?
Even in a closet?
I was trying to joke there.
I'm sure there are still teams out there that they're running, you know, the core accounting tools and etc.
You know, under Steve's desk.
But even when we talk about, you know, small computers, some of our customers have Kubernetes classes basically in their point of sale systems.
So they have hundreds and hundreds of stores and they have little, um,
Kubernetes classes are essentially running them and each one's independent.
They run into their own problems with that because particularly at scale,
when you've got thousands and thousands of clusters and you know,
these customers are, you know, following various GitOps practices, etc.,
where they're pulling the actual state from a Git repository.
So the Git repository itself becomes the bottleneck or they start getting throttled.
And so they have to sort of resort to other mechanics to try to mitigate and work around that.
I was talking to another one of our customers, actually just the other day at Kukum there,
who they are deploying, they've got Kubernetes clusters running on research vessels.
And those research vessels, as in boats, as in ships, like on the ocean.
That's right.
I'm not going to pretend to know exactly what they're doing on those ships.
We didn't quite get into that detail.
But they've got Kubernetes classes out in the open sea, right, which is apps given Kubernetes name.
The problems they run into, though, are a little bit different, right?
for them, you know, those boats might be out at sea for, I don't know, weeks, months
of a time, whatever that might be. So when you want to do a deployment, that the ship's not
available. So when that ship comes back into port, it needs to get the update, right? So they'd be
talking to how you would, how you'd achieve this, right, and how that process would work.
This is super interesting. And I love how you kind of get a peek into so many different types
of teams through the fact that, you know, like, you're talking with them with how they do the
deployments, but you're, you probably see some other things that they're doing or things
you're struggling with. What are some trends you're seeing across the industry in terms of
this wide range of companies you work from startups to like finance companies to like these
research vessels? Yeah, I guess one of the one of the big trends these days is a lot of focus on
on GitOps. So GitOps is what is get ops? That's a good question, Gerege. Let's take a
step back for a minute. So, you know, we mentioned we talked about Kubernetes earlier. We talked about
the fact that it's kind of got this internal continuous reconciliation process where you say
to the cluster, please spin up, you know, five pods and it takes that desired state and ensures
it always sort of is true in the world. And so there was a lot of products around them that were
doing similar thing, you know, Terraform does that for infrastructure, etc. And a bunch of people
started wondering, why can't we sort of take that process and pull it back further so that not only is
Kubernetes just dealing with desired state, but we can pull it sort of directly out of Git.
And so, you know, I can, as an engineer, make changes to that, that Git definition, that desired state.
And I'd have some process that essentially pushes that to the cluster and ensures that it remains in line with what I'm asking, what I'm expecting.
And so the term GitOps was coined by Weaveworks in, I think it was 2017 or so.
And as a general practice, it sort of started picking up Steam, particularly in tandem with Kubernetes, because at its core,
Kubernetes is very declarative, right?
Later on, sort of in early 2020s,
it was kind of formalized a bit more,
and there was sort of four key pillars of GitOps.
The first being essentially declare,
you want your state to be declarative.
So this is the idea that you want to define
what you want the state of your infrastructure to look like.
This is to basically makes things a lot,
I guess, simpler to understand
what the state of the world is going to be
when a deployment takes place.
So if you think about
deployments that are a bit more imperative that has sort of a process, the end result is sort of
the result of multiple steps. But when you're wanting to just update some infrastructure, that
desired state kind of works really well at, particularly in the Kubernetes space.
And then in GitOps, the desire state will be just describing like how many nodes I want
or like how many, I don't know, replicas do I want on a database or how many web servers or
like low balance or how to be connected, that kind of stuff.
That's right.
Yeah.
So it's basically a way of being able to say,
I want my infrastructure to have whatever state it is.
And then the GitOps agents, the GitOps products,
basically ensure that remains the case.
So they'll keep applying it to Kubernetes.
So you've kind of got this situation where Kubernetes keeps its internal status
in sync with reality.
And now you've got these GitOps tools that take the declarative configuration
in sync with what Kubernetes is.
So they will take the,
whatever I put in Git and whatever format I use and they kind of translate it into something
that makes sense for Kubernetes and now Kubernetes can apply it.
Yeah, I mean, ideally you want it as close as possible to what sort of, I guess, Kubernetes
is expecting because...
Or it allows, yeah.
That's right.
And so what you're describing there, I guess, is the continuous reconciliation.
And so this is the idea that these GitOps apps will essentially, as we said, sort of take
that state and apply it.
And if there's any drift from Kubernetes side, so, for example, someone...
you know, runs crew control, you know, delete pod or a delete deployment or whatever the case might be,
because your desired state is now stored in in Gid in this case, that will kind of self-repair.
The second pillar of GitOps is that that desired set you've sort of defined
should be stored somewhere that's immutable and versioned. And so this is the idea that once I say that I want to have this state,
I want to have sort of something I can point to, a pointer, and that might be a tag or a commit share or whatever.
And I want to basically use that to define what that actual state should be.
And I don't want that to be able to change, right, because otherwise that kind of defeats half the point.
By having it versioned and immutable, it also makes things like auditing a lot simpler, right?
You can see the transition of that, that desired state over time.
What's interesting, though, is a lot of people will point to that and go, yes, version and immutable, I know what that is, that's good.
I was about to say that because Git gives you,
it definitely gives you versioning or it gives you commit history.
I'm not sure if it gives you versioning and immutable in the sense that,
I mean, the past cannot be changed.
That's right.
Or actually, can it?
Because you can rewrite the history.
You're right.
So depending on how you sort of configure your GitOps agent,
you know, you certainly can rewrite history.
If you have it pointing in a tag, for example, you can change tags.
And so it's why there's best practices around that,
I guess kind of, you know, wiggle the finger a bit if you're using tags to manage that sort of state.
But what's interesting, though, is really nothing in these pillars.
And very quickly, the third one being pull versus push.
And so this is the idea that your GitOps agent will pull the state from GitHub and put,
or Git, I should say, and put it into the cluster.
And the fourth being continuous reconciliation.
But nothing in any of these sort of pillars actually talks about Git.
And I think that the naming of GitOps is kind of, kind of gets people to already have this expectation that everything has to be in Git.
I mean, why would you not have that expectation? That's what I assumed.
That's right. I think the problem, though, is not everything should be in Git, right?
So you've got this constant kind of conversation within that community about, you know, where do you put secrets, for example?
So no one would say.
Not a Git. We know that, right? Do not put it in Git.
And so that's the thing. So, you know, there's been a little.
all these solutions to try to put it in Git.
So there's things like sealed secrets where you encrypt it and put it in Git.
Sounds like a terrible idea.
But I guess what's really, this is highlighting is the reality that some things don't
need to be in Git, right?
As long as you can have this sort of control over the versioning or immutability of it,
then that's completely fun.
And then the trend around GitOps is what you're seeing that a lot more infartheims
are moving from, okay, a few years ago they might have just like made definitions for
Kubernetes and now they're moving over to GitOps, so saying, okay, we'd like to control
Infra in a tool in a way that's described that's in version control. Is that the trend or what
is the trend around GitOps? I guess it's more just the trend of the growth in general of GitOps
in enterprises, right? So not every company out there is using Kubernetes today. And as they sort of
approach Kubernetes and they're looking at, well, how do I, how do I perform the deployments? How do I manage
that process? GitOps becomes the sort of de facto.
process. And to some extent, it is giving rise to this idea of using it to manage other things
outside of Kubernetes. And there are a few examples of projects and experiments that will use
things like Terraform and there's a continuous reconciliation service that keeps your actual state
outside in sync. At the moment, it's really about the focus is on, I guess, Kubernetes, is it the
core place where it lives. And I guess it's more the growth of Kubernetes itself means that
GitOps is coming along for the ride.
And you mentioned enterprises, which means like these large companies with oftentimes thousands of people or in regulated environments.
That's what I think of enterprises.
Are you also seeing smaller teams pick up things like GitOps?
Is it like everywhere?
Or is it more there's certain types of teams that seem to be just more interested in?
That's a good question.
So I guess sometimes what we see is a lot of people go to conferences or they read blog posts and they hear that GitOps is what you should do.
So I guess what I want to point out here is get ops is.
potentially not necessary for all locations, all environment, all teams, right?
There's certainly a bunch of benefits to it.
But the reality is there's some things you need to do outside of just GitOps.
You might use GitOps principles in parts of your process,
but some of this absolutism, I think, that sometimes exists, may not be necessary.
So there's often a bunch of other processes you do around your actual sort of, you know,
quote-unquote deployment.
So things like maybe you run smoke tests, or maybe you want to send a notification when it's
complete or maybe you want to do a database update or something like that.
These kind of steps don't really lend themselves very well to kind of this declarative
everything is in Git kind of process, right?
And so that's why you get things like Argo workflows and rollouts and things come out
to try to kind of get opsify this process.
And that works for some people.
But the reality, I guess, is that I think some people get really hung up on this idea that
that everything is Git.
So therefore they've found the tool.
And so therefore everything is a nail.
Yeah.
I think that's just not the case.
And this is the thing like talking with customers,
when we go through this process of,
you know,
you can use GitOps in Octopus and, you know,
we've got a bunch of support for various mechanics
that integrate well with Kubernetes and Argo.
But there's a bunch of other sort of operations you do around that process that doesn't.
And when you talk to them about it,
you know,
they realize that what they're trying to do is ultimately just ship software.
So again, that difference between what you hear when you talk at conferences and things where, you know, everything is, everything is good and everything must be, you know, in this particular format or whatever the case might be, the realities for most customers, they're just trying to ship software, right?
And they don't care what name you give it if it's GitOps and it works end to end and solves everything.
Good.
If they want to use GitOps as part of the process, but then have other mechanics that are more sort of imperative than good.
It's just sort of the reality of, you know, there's tens and tens of thousands of companies out there in the world that are doing software delivery.
And not all them that are at conferences and not all them are at the forefront, I guess.
As Rob says, most teams don't care whether you call it get ops or anything else.
They just want to ship software and know that it works.
Our presenting sponsor, Anticist says exactly that, is less you ship knowing that it works.
Antisyses goes beyond code review.
It runs your whole system inside a hostile simulation.
By doing so, it finds every bug before your users do.
And because the simulation is fully deterministic, antithesis doesn't only find bugs,
it gives you a perfect reproduction of every issue.
I know this sounds like science fiction, but it's actually hardcore engineering under the hood.
Jane Street, fly.io, and the Etsy the community ship agent written code with full confidence
because they know it's been verified by Antisysic.
To see more case studies and details, head to antithesis.com slash pragmatic.
That's antithesis.com slash pragmatic.
I also want to mention our season sponsor, Turbo Buffer.
TurboPuffer is exactly the thing that just works.
A vector and fultex search engine built on object storage.
Fast, cheap and extremely scalable, no exotic architecture required.
Here's something I find interesting.
The teams building the smartest AI products out there, cursor, notion, cognition, anthropic,
they all run on Turbo Buffer.
But why?
Let's think about it.
And L and without context, it can feel pretty.
I can still remember shortly after Chad DPT launched early 2023 how it felt both incredibly
smart but also frustratingly stupid.
If you asked it a question that was outside its training data, it just made things up.
Fast forward to today and the models and their tools for retrieving contexts are much better,
but hallucinations still happen frequently.
Here's a typical way to integrate turbopuffer with an LM.
Plug it behind your search tools, get faster responses, and relevant context back.
The neat thing is how it gives you the perfect blend of low-cost storage.
fast retrieval, and a bunch of different search tools like vector,
full text and filtering.
You can afford to index billions of documents,
and then you can query it with different tools
to get the most relevant handful of documents in milliseconds.
This is how your LLM feels smart.
It gets the right context really fast
without blowing through a bunch of tokens.
Of course, you can use TurboPuffer to search anything, not just code.
If you're building AI products,
check out TurboPuffer at turbopuffer.com slash pragmatic.
With this, let's get back to Rob and talk about progressive delivery.
Yeah. Another trend that we talked about just before is the rise of platform teams. Can you talk about what you're seeing?
So platform teams are kind of, I guess in the past several years, they've become this sort of new standard organizational structure to help teams manage their, I guess, deployment workflows, a bunch of the infrastructure around it.
And it's kind of come out of this evolution of DevOps, right?
So, you know, we mentioned before in the old days, you'd write a bit of code and you'd throw it over the wall to the ops team.
So there was dev teams and ops teams.
And this was like in the 2010s, 2000s.
Back in the long, long ago.
And then DevOps became, you know, the practice that everyone sort of realized that actually
we want to have the engineering teams be involved in and have ownership of part of that operational process.
Idea being, you know, you get faster feedback loops.
You are able to kind of, if you feel the pain, you sort of fix it.
You know, it's that saying, you fix it, you ship it.
You know, we've all kind of heard that.
And so a lot of teams, you know, took that to heart.
That's good, great, good practice.
But as things start to scale up, what you'd find is that there would end up being like a DevOps team again.
And sometimes separate to another ops team.
And so there'd be the separation of development and DevOps.
And it kind of goes against some of the principles of what DevOps was, you know, trying to destroy.
But not only that, these teams then end up,
having lots of different ways of doing their deployment.
So, you know, you've got every single, you know,
a whole bunch of application teams,
and they've all got slightly different requirements,
and they're all building it from scratch.
And so you'd end up with these teams,
either whether you had the DevOps teams
or it was still within the application teams,
where there was just this, this large number of different ways of doing things, right?
And that becomes difficult at scale.
So, you know, you can't really move between teams.
And by scale, you mean typically when there's a lot of teams, right?
That's the easiest thing.
Yeah, that's right.
If you got lots of lots of teams and each one is kind of owning that process end-to-end,
you know, you sort of get this bifurcation of processes.
And not only that, the application teams themselves start kind of getting this context overload,
right?
They now need to think about what's best practices of the different cloud tools.
Yeah, and there's a job of devs rarely want to configure the deployment scripts and test
them and testing is hard.
You can't not get unit testable.
So it's now a different job.
I remember when I was on earlier teams where, you know, like typically on a mobile team,
like you have a mobile team of five people.
And one of them, one of us had to kind of specialize in Jenkins configurations because
Jenkins is oftentimes the or used to be the mobile CICD.
And it's kind of like half a person dedicated to that.
And it was more like draw, you know, like we had to draw a stick on who's going to do it.
Because we want to build stuff.
You want to write code, right?
You just want to focus on writing code.
And so if you're spending a bunch of time sort of managing infrastructure and
pipelines and things, you know, that's no fun for anyone. And so platform teams have come about
as a new way of solving that problem where it's different to kind of, you know, this idea of
a DevOps team or ops team that kind of own the whole process. They more sort of define best
practices and they provide a ideally a self-service mechanism where application teams can
essentially use, often what's called as an IDP and internal development portal. And they'll be
able to essentially self-service and maybe they want to spin up a new project and they're
able to use a template for the platform team generated. And so the platform team are able to
sort of create these standards throughout the, throughout the company. And they can be
responsible for sort of, I guess, the definitions of those processes and the best practices and
how to achieve that. But the ownership of the actual running operational sort of element is
still within the teams. Right. So they still get those benefits of, you know, DevOps being close
to the close to the real code and feeling the pain if there's a problem and et cetera,
et cetera, et cetera,
but they'd only to spend all that time becoming experts in, you know,
all the different ways that you can deploy the software they've got.
And so this has become really common now where particularly as you sort of get to a larger
size, platform teams are a great way of solving that problem.
Now, that's not to say that every company everywhere should have a platform team.
I mean, if you're a smaller company, sometimes you've just got the apps team and they sort of are doing, you know, quote unquote DevOps.
But this is certainly something that as you sort of start seeing larger organizations with multiple teams and multiple projects,
these platform teams are a way of basically bringing some sanity and control and focus, I guess, to the whole space.
One trend across the industry, of course, is AI. Everyone's, it's hard to see any teams where devs are not using.
AI agents specifically to code,
product managers will be using these things.
And of course, we have a lot more code produced as a result.
When it comes to CICD systems,
what are you seeing changing there because of AI?
This is the elephant in the room, right?
That is AI affecting service.
But the reality is, I think, to be honest,
it's still very early.
I think what will happen is the impacts of CICD
are really tightly coupled to how development teams end up using AI.
So there's going to be some sort of like a, I guess, a lagging process there.
But we're finding a lot of people, a lot of teams are starting to use AI in the development
process.
And so we're starting this process of going out and looking and talking to customers and learning
what's the way that they're handling AI in their teams and their application teams.
And then how we can best leverage sort of the CI side to support that.
in addition to that, use AI within the pipeline itself, again, in the right place.
So one of the things we've been, I think, pretty keen on at Octopus is this idea that,
you know, at KubeCon, we were probably one of the few companies there that didn't have,
you know, AI plastered all over it.
Like, we tried to be very, you know, that's what gets the sales.
Yeah, that's what you stand out now these days.
That's right, by not having AI.
I mean, we've got AI in Octopus.
But what we've been trying to do is think about, well, how do we actually use it in a way that's
actually useful for our customers, right, for engineers, et cetera.
And so we've been slowly adding capabilities within Octopus to provide, you know,
AI support, whether it's a MCP server, whether it's a recovery agent that can review logs
and tasks and all that sort of thing.
But that's within the product itself.
Some of the bigger changes will depend on, like I said, how actual application teams use AI.
what I think, you know, we're talking about it, we'll find is there's going to be a lot more velocity.
I think that's one of the big changes, right?
There's just going to be a lot more code coming through.
I think one of the questions is, okay, what does that mean for your pipeline?
One of the things you often talk about when, you know, human, there's a human element to the pipeline is speeding up the cycle to get that feedback quicker.
You know, if you got engineers sitting there waiting for their code to run tests, they can get back to it and fix it.
the shorter and shorter you can make that feedback loop,
the better it becomes because I don't need a context pitch, et cetera.
I think in a world where the majority of your code is being developed by AI,
that becomes perhaps less important.
You know, if you can kick out your build and test process
and it takes 30 minutes versus 20 minutes,
does it really matter if the engineer's already long gone,
moved on to the next problem,
and the actual AI agent itself can kind of babysit the process
and review the problem that came up
and issue a new fix. I guess there'll be a de-emphasis, I think, on some of the speed of the pipeline
itself and more on increasing sort of, or decreasing risk, right, the risk that comes from
having AI agents generate code. And so exactly what that process looks like, I guess, remains to be
seen. I think what we'll see a lot more use of is things like progressive delivery and I think
particularly feature toggles are going to be a really common tool in the tool belt of application
teams, partly because it allows you to ship that code as fast as you can or as fast as you
want, but manage the rollout of the actual feature set or changes sort of independent of the
deployment. So it decouples your deployment from your release. And so in a world where, you know,
we've got a lot more AI agents generating code and being involved in perhaps part of the build
process, those agents themselves being able to use toggles to react to it quickly, I think then
become a lot more important than perhaps what we see today.
Can we talk about progressive delivery, what it is and what are the most common ways to, you know, like to de-risk getting your code or your software out there?
The progressive delivery is the next evolution beyond continuous delivery.
So, you know, with continuous delivery, it's this idea that, you know, I've made a change to this system and I want to ship it to dev or stage, or typically, you know, if it gets to production, sort of in one hit, right?
With progressive delivery, what you're trying to do is basically release those changes in a little bit more of a controlled way,
typically through things like a Canary deployment.
So this is where you might deploy some subset of your instances that are out there.
So what is a Canary?
What is a Canary deployment is, this is New Zealand, basically.
New Zealand's our Canary.
So this is, as we said before, this idea where you select some subset of your customer base.
or whatever that might be.
And you would typically route traffic to a new instance.
So you'd ship, you know, you've got version one running and you want to release version two.
You essentially ship version two side by side and you might use, you know,
most common one would be some sort of network traffic manager to route some percentage of your traffic to,
to that new instance.
And you gradually roll that up.
Typically, you know, as you do, sort of do this process properly, you should have a fairly
mature observability mechanisms in place to see that you can roll up or roll down.
And I guess this whole thing comes from a canary in a coal mine, right?
That's right.
Yeah, so the idea being that in the old days when you'd be in a coal mine digging away
and it would release all sorts of toxic fumes and things like that.
Canaries were a lot more sensitive to it.
So they have a little canary in a cage.
And if that canary sort of died, I guess, got knocked down.
I think the canaries, as I understand, they were like chirping.
And then...
Okay.
I'll have that sound better.
But when it stopped chirping, well, it also died.
Oh, okay.
So, all right.
Same ending, but just, you know, a nicer way to go out.
They need to get out.
Yeah, so it's this idea that you get that advanced warning, I guess, that, you know,
rather than you're getting knocked out by the toxic gases, etc., you know, you can get out of it sooner.
So it's that same principle, I guess, brought to the software.
There's various other mechanisms like blue-green deployments.
So you've got your first version, they're still receiving.
traffic and your second version is up and running and you can now do some tests against it, validate it.
Maybe you've got sort of the, you know, the IP details to access it directly.
You can basically validate it.
It's working.
Sometimes there may be a way of avoiding cold starts and things because that process may need to,
you know, initialize a bunch of stuff.
But then when you've sort of done that validation and you're ready, you can essentially swap traffic around.
So all the new traffic goes the other.
In some ways, it's like doing a canary, but straight to 100%, but you're doing a bunch of validation
sort of on the side before it actually reaches customers.
In my view, probably the more useful progressive delivery strategy is feature doggles.
So this is the idea that you've got some sort of feature flags, feature toggles.
Yeah, that's right.
Yeah, often use interchangeably.
So this is the idea that you've got, you know, some sort of variable in your system
and it's linked to typically some sort of external service.
And through the state of that particular variable being sort of true or false on or off,
you can essentially have different code paths essentially take effect.
And there's a bunch of benefits that feature toggles have over, I say, Canary releases,
particularly for application delivery,
where your unit of change with a feature toggle is very granular.
It can be single lines of code.
And so everything else remains the same,
and all you're doing is tweaking that single line of code.
With a canary or any sort of versioned sort of delivery deployment mechanism,
your unit of change is the entire app.
So if you've had 20 commits since the last sort of release went out,
then you're essentially testing all 20 things in that one hit.
Your ability to sort of target the actual customers,
it's a lot more precise when you're using feature toggled.
So you can use all sorts of complex rules and say that,
I don't know,
everyone from Germany who has this particular product in the basket
has this kind of experience.
And that's, you know,
really hard to do via network,
traffic rules, right? The other is your ability then to actually roll back. So to sort of roll back from
a canary, hopefully you're still in the process where you're sort of going through that canary
process and you can roll it back. That could take, you know, minutes. Maybe you have to redeploy the
whole old version. That could be minutes or more with a feature toggle. You know, you can do that in
seconds. That's pressing a button and it happens immediately. Not only that, but you've kind of, you've got more
control, I guess, on when you sort of do that. So
With a deployment that you're doing via a standard version release,
you're sort of tied to when that deployment takes place.
Because when it takes place, that's when essentially your new feature is available.
And as an application team, that means you need to know about exactly when it's taking place
and make sure you're watching the logs at that point.
And maybe you and 10 other teams who are shipping things at the same time
are all doing the same thing.
Whereas with feature flags, you're basically got control over when that takes place.
So you might ship the actual, you know, the assemblies and not sort of
thing on the Monday, but you release your feature on Tuesday when you come in and you can,
you've got the logs ready and you've kind of reviewed what the next steps are. So it really
makes things a lot easier to decouple releasing a feature from deploying software. You know,
version deployments through Canary, etc., they're really useful, particularly if you're doing like
infrastructure type changes where there is no kind of application toggle that's disrelevant there,
but you want to violate some changes to your infrastructure or your, your, your process.
process or potentially, you know, things like things that will involve schema changes.
And schema changes are the big difficult. Data by schema changes. This is the big problem
in any, like to be fair, in any progressive delivery. And this is why, you know, the question
always is, are you ready for progressive delivery? To do schema changes, I guess this is the point
that application teams kind of need to be really mature. And I don't mature in terms of, you know,
not telling silly jokes, but mature in terms of understand all the problems are in place with this
and know how to release these sort of changes in a gradual controlled fashion and do it over
multiple stages. That, you know, ironically, is actually quite hard for us. And Octavours,
because our software is both SaaS hosted. So we have a SaaS offering that customers can use
and we have an on-premise version. And it's kind of, because we have both sides,
we kind of have the best and worst of both worlds.
In the cloud system, if you've got a SaaS product,
you have complete control over what versions go where.
So if you want to do an expand and contract,
you can stage the whole process,
you know that it's all been updated before you kind of move for the next stage.
On the other hand, for a self-hosted application,
where they go in and they install it on their own infrastructure somewhere,
you don't know what version they're running and what they're coming from.
So they might upgrade from version 1 straight to version 6.
And so you're not really forcing them to go for that expanding.
in contract phase. On the other hand, they've got a lot more control over when they upgrade.
And so you can kind of be a little bit more deliberate about, you know, making sure that they do
backups before they change and, and, you know, maybe the down, maybe they can manage that migration
and accept a little bit more downtime during migrations and updates and things like that,
then would actually be, you know, acceptable in a SaaS product.
So one thing about, you know, we talk about progressive delivery, and you're kind of doing this
to avoid surprises.
You know, if a regression goes out, a new bug or something doesn't work,
you kind of want to catch it early, hopefully only a few customers have experienced it,
or even if it's not 100%, you kind of, and you have a way to go back.
All you do is if it's a feature flag, you hide it.
If it's a canary deployment, you go back to the other one.
But there's also this thing where like when things do go wrong, at some point you want to do a rollback.
Can we talk about how have you seen rollbacks done well?
And what does it take to actually have a real rollback strategy?
A bunch of people talk about CICD, some people talk about feature flags.
I don't hear too much chatter about rollbacks.
Yeah, rollbacks.
This is always a spicy one.
We get a lot of customers you say, why don't you have a rollback button?
I want to roll things back.
Why can't we roll things back?
As in the deployment software, like octopus or anything else, they're like, okay, if it can deploy,
I want to like do checkpoints and like just do a rollback.
Sorry, how hard could it be?
Just do what you did.
How hard could it be?
How hard could it be?
Well, this is the problem, right?
So in a completely stateless system, that's pretty straightforward.
If you've got a completely stateless system and, you know, this is something that GitOps is really good at where you'll have that definition.
So it's somewhere in repo.
If it's completely stateless, you can do a Git revert and push it and it'll go back.
The reality is for most systems out there, you've probably got some state.
State being databases.
It could be, you know, any sort of.
any sort of information that you can't necessarily just kind of undo, I guess,
because if you roll it back and now you've got your code talking with the schema of the database
that's not in sync, you can provide schema.
If you've got a schema migration, let's say in a normal deployment,
you can provide alongside that a secondary sort of anti-migration that kind of undoes the change.
But again, that's not always possible.
You need to do with what are you going to do with that data?
We've gotten pretty far in basically trying to advise.
customers that you never want you want to avoid ever talking about roll back it's always roll
forward so if there's a bug okay roll forward get a change yeah get your change in um as soon as possible
this is where fast feedback loops are important right you know this is what the hot fix processes
of for right like so we all know that in a standard process you want to go dev staging prod and
maybe it's maybe you've got you know um approval processes and slows down etc but if you've got a
significant significant bug that you need to kind of quote unquote roll back sometimes
the safest thing to do is actually make a hot fix to that version and push it out
sort of as quick as possible. And your bottleneck might be the build pipeline or whatever,
but depending on sort of your appetite for risk there, you can resolve that sort of a lot quicker.
Now, obviously, if the failure itself is just from some mechanism in the deployment process
itself or somewhere further down that chain, then your time to recover is going to be a lot
quicker. But it's this idea that, you know, if I've got a failure in version, version two, my
my rollback isn't to go to version one,
it's to go to version three
and make sure I've got that fix in version three.
It's a sort of thing that
when we talk to customers
and some of them go, yeah, yeah, we roll back
all the time if there's a problem.
And then when you ask them,
what do you do if you've got a schema change?
They kind of stop and realize that they've never,
it's just sheer luck that they've never
run into that, right?
Is it fair to say that you want to roll forward
if it involves business logic
or something that is not stateless?
because if it is stateless or if it's application logic,
you know, you have a code that says if this else then
and you realize there's a bug there,
you can just revert it as long as it doesn't, you know,
touch the schema or the data.
Yeah, I mean, in an ideal world,
you're reverting is through a feature flag, right,
that you click and you're essentially reverting
by changing the code path.
And this is why I always say feature flags
are kind of a nice tool to use for doing this progressive delivery
because, you know, it's just as easy,
just as easy as to roll out.
feature, you can typically roll it back. Now, you're still going to have some of those problems
with schema issues, et cetera. If you're making a change, you've got parts of your code path that
expect one and not the other, you're going to need to account for that. But you can even account
for that inside the feature flag. That's right. Yeah, so that that's the way you sort of ideally
manage that. So that within regardless of which path you go down the feature flag, it's kind of
self-consistent with whatever version of the actual database schema that's out there.
So I guess the more feature flags do you use, the fewer surprises you might have. But
it's a bit of extra work both to build and also to remove.
Yeah.
You get stuck with still feature flags all across your code base once you start to use it a lot.
I saw this at Uber.
Yes, yes, 100 times yes.
So when you're adding a feature toggle to your app itself,
so we eat Octopus, we obviously use feature toggles in our code quite a lot.
And we use Open Feature as like the framework, the SDK to interact with it.
But we essentially have built a wrapper around it where the toggle itself,
within the code is sort of we provide some details about which team owns it and that team sets an
expiry on it. Now the expiry itself when that time passes, nothing bad will happen. But through
parts of the CI process, if that time has passed, we can send an notification to that team and say,
hey, it looks like this toggle is no longer used. So the specific mechanics don't matter as much,
but it's more a matter of making sure that, you know, if you're adding feature toggles, it's really
easy to forget about it because you start rolling it out and you kind of forget about it and
you know you want to keep it in there just in case for a while in case you need to roll it back
and having the ability to understand how long a toggle has been there um is it is kind of a key part
of helping to maintain that that hygiene now the reality is even at octaus we've got a bunch in
i know i've got a bunch in there that um i'm sure if i was to log in i'd probably get a bunch of
notifications to remove it's you know when we use that gardening metaphor in code right this is
this is one of those sort of operations this is weeding right you need to
just kind of keep on top of it. There are some mechanisms around, even in lieu of the AI side,
which will, you know, ideally if you're using feature toggles, you've probably got a bunch of
observability and metrics and logging around it. And there are some tools out there that will
allow you to keep track of when the last time a toggle was kind of evaluated. And that kind of gives
you that signal. Similarly, you know, you might remove it from the code, because typically when you
want to remove a feature toggle, you want to remove from the code first before you touch your actual
sort of toggle system. And so having, you know, you might remove it from the code first, you know,
a mechanism so that once you remove it from the code, you know, it might take two weeks before
it makes all the way out into production. So you don't want to delete it before then. By that time,
you've kind of forgotten about the fact you removed it. Oh, yeah. And so having mechanisms that
will keep track of that change, I guess, going through the system. And when it reaches the environment
where, you know, production where it's actually being used, can kind of show, okay, that code's
gone out that's, you know, remove the toggle. It's fine and safe to actually remove the configuration.
Because you've got that feature toggle information in two places, right? You've
got it in the code and you've got it in your your your platform can we talk about how developing environments
evolve we talked about c i cd but i'm interested more in you know you you go from like you have one
environment later you might have staging or something and what evolution have you seen across the
all the teams that you work with all these hundreds or thousands of teams yeah i'm not sure if
there is one particular pattern there.
I mean, I think, you know, most common is, you know, dev test prod.
So these three different environments.
Yeah, and I mean, even that, I think it's probably a gross simplification of all the different kind of mechanism.
And dev meaning my local machine.
Dev, in the case of CD is often like the first point of integration.
So it's kind of test often customers will keep test kind of reasonably in sync with, let's say, production or some sort of sanitized.
of source. So that way that whether it's the QA testers or the product team or whatever,
it can go and review the code, dev is almost like the first point of integration that is
it actually, is the deployment process just at its core actually working or is anything fundamentally
broken at all? I think more or more now, we're finding that dev is less useful in that respect.
And what we're seeing is more the growth of things like ephemeral environments. And so this is the
idea that you know I as an engineer I'm running some sort of feature on a feature branch
and I want to kind of evaluate that it's actually doing what it's what we're expecting to do it but
not only that I need I want the rest of my team to be able to see it working and you know if I've
got it running on my machine it's not exactly easy to sort of you know give other people access I
guess and then I want to I may want to you know completely context change move on to something
something completely different so our femoral environments is this idea
idea from my my branch pre-merge, I want to spin up a whole environment, essentially from
scratch, ideally with whatever dependencies are required to sort of run this particular component
of an building. And then I want to basically deploy my app into that as if it was a normal
full-fledged environment. Once that's available, I want to sort of have access to, you know, if it's a
web app, maybe it gives me the URL and I can poke around it and hand it around and other people can
kind of evaluate.
And then the moment I kind of merge that PR, tear it down again.
You know, it's quite common to have multiple test environments
because, you know, I've got a lot of stuff going through my pipeline
and I've got three testers, so let's have three environments.
So they can all sort of have one at once or often you'll see a single test environment
and a bunch of tests.
And they all kind of need to collaborate to see who's got access to the system at the moment,
etc, etc.
Whereas with the femoral environments, it doesn't roll off the tongue.
With the femoral environments, you can,
essentially have a full-fledged deployment per feature.
And so again, that's about speeding up that feedback process, right?
Again, all of these processes are all about speeding up that feedback process
to get the catch those failures or issues or bugs or whatever sooner.
There was a time a few years ago where cloud development environments
were really talked about a lot, which was the idea as a developer,
you have an environment spit up in the cloud,
your let's say your visual studio code connects to it or maybe you just log in online and it spins up all the dependencies, oftentimes done with containers, which reminds me of this as well. And there's also like preview environments. But somehow it feels that both that discussion and this one kind of died down. Maybe it's a. Maybe it's something else. But I mean, the technology is there, right? We have containers. It's so you can you can package things together. I'm sure it depends, but it's all doable. Yeah, it does get tricky. It's, this.
This is again one of those sort of things that's really easy to talk about for simple cases.
It can get tricky when, you know, what if I've got more than just a single app in my kind of quote-unquote environment?
And how do I make sure it's got all the data I need to validate?
So it can get tricky.
Or if you have a bunch of services that have state.
That's right, exactly.
So there are sort of complications that it does bring.
But I guess the benefits that you get as an application team, particularly application team where you've still got engineers writing code.
is sort of speeding up that feedback process, I guess.
Well, now with AI agents everywhere, that's even better
because in the sense that if one of the best ways to validate,
you know, we have code reviews and an agent generates
and you look at the code,
but isn't it not better to just confirm that this thing works,
especially when it has the UI?
That's right.
I think even in that world where you've got AI agents
kind of building the code and validating the code,
any sort of scenario where you want that AI agent
to kind of validate what it's done,
you're essentially talking about effemeral environments,
even if it's not exposed to people
because it's doing its own testing and poking around
in whatever shape or form that it's doing,
that still is, I guess, one of these kind of environments, right?
It's a femoral, it spins up.
You've got some sort of provisioning process,
and then ideally, once the jobs down, you kind of tear it down.
I'm interested in learning more about the reality
of operating a large infrastructure platform.
And, you know, one big one you're working on
is actually Octopus deploys.
SaaS offering, how does that look like? And what are the challenges of, you know, like running something
where you're running all of these deploy processes, all these CD, you probably have a bunch of
different things? What is it like? So at the moment, at the moment I'm not on the team that
sort of builds up, but I can give some of the context, I guess, from history and kind of context there.
Originally when we first sort of decided to sort of provide a octopus SaaS offering, I think it was 2020 or something like that.
It was all VMs. So every customer would basically get a VM spun up and we would have a virtual machine.
Yep. And the octopus self-installed would basically get installed onto that VM and they'd get a whole VM for running workloads on, etc.
And that was very much not cost effective. It was costing us something like 100.
bucks per customer per month and they were paying, I don't know, $20 a month or whatever it was.
But this whole process was more an experiment to see, was there a demand?
And to his credit, Paul was happy to sort of pass out the credit card to kind of go through
this process to see that is this actually the direction we want to go?
Is there a, is this something that's going to turn into a viable sort of direction for the
company?
Because it's a big step, right, going from building software that you can kind of hand out and
people then download and manage themselves to it.
It was like pretty much self-holstered or like run on your own infrastructure.
Exactly.
Yeah, that's right.
And so the demand was there.
So not long after that sort of first experiment, we basically started from scratch again.
And I worked with a couple of the other engineers back then to start building it on Kubernetes.
And so Octopus itself in that space, we have what we call kind of a reef.
So what you find is everything in Octopus, we've always got sort of octopus or nautical kind of names around it.
So a reef is basically a way of, it's, it's.
It's this cell-based architecture where contains all the resources that are needed for that particular customer's instance.
Well, some of it's shared, but it's kind of broken down into individual cells.
And so a reef will contain, you know, the cluster and Azure database, etc.
And each customer instance is running now in a pod in that cluster.
And so as part of that project, that was when I think I was working on converting it so it could run on Linux and inside containers
and someone else was building the dynamic worker infrastructure.
So there were a couple of us that kind of just got in and, yeah, really just got it up and running
so that way we could kind of start moving forward and I guess stop losing money.
Fast forward to today, now there's an entire team that's kind of backs that and we've got,
you know, several thousand customers on it and we run, you know, many, many thousands of deployments
every, every month.
And so now what we're trying to do is there's a project at the moment to basically
make the octopus deployment process itself more resilient.
So what that means is at the moment when a deployment kicks off,
a bunch of the process, so it's kind of an imperative set of steps,
a bunch of that is stored in memory,
which means that whenever we want to do an upgrade,
we need to essentially stop running tasks for some period of time
so we can kill their instance and spit another one back up.
Octopus itself at the moment doesn't sort of have,
of zero downtime between upgrades.
So there's a bit of downtime between that.
We kind of want to reduce that and get that as close to as close to zero as possible
with the realization that, you know, going from downtime of five minutes to one,
that's, that's just work, right?
That's, you know, you can move things around.
You can maybe change the architecture.
Going from 10 seconds to zero is, is a much bigger shift.
I'm not sure if, if and when we'll get there.
But yeah, there's definitely this, this big effort at the moment to make the whole process
a lot more resilient to basically improve and reduce the amount of downtime it takes place
so we can kind of perform upgrades quicker, et cetera.
One interesting thing you do is you have a SaaS, but you also have an on-prem offering.
What are interesting engineering challenges that come from that?
A lot of companies have decided to just like honestly just move to SaaS because now they
control everything centrally.
I think Jira that this or maybe they're doing it, which is a well-known one, but clearly it's
just a lot more work and a lot more headache to have both.
Yeah, and we touched on one of the big problems here a little earlier is that when we want to push out any updates, you know, to cloud, because we control the whole process, we can push it out.
And so we have a sort of a gradual rollout process there because each customer is on their own instance.
We can sort of deploy each one individually.
And that may take, I don't know, a few days to, let's say, roll out a change.
On prem, though, is kind of another matter.
So actually, I was digging into some of the stats around this a little while ago and found it took about 200 days,
average, 50% of our customers on-prem to get, let's say, let's say, ship the new change today,
takes about 200 days for on average 50%.
It's half a year.
But then there's kind of like almost an exponential decay there where it takes 400 and something
days for 75% to get it.
So just, it's kind of this curve where, I mean, we've got customers that are still running,
you know, versions of Octopus from five, six, seven years ago.
And so whenever we ship a new change, we need to basically make sure Octopus will work from
version, you know, 20203.1 to 2026.4. And so there's a bunch more baggage, I guess, that we have
in terms of like scheme upgrades and making sure that that whole process actually is achievable.
But why do you do it? A lot of startups will be like, screw it, let's not support all versions.
This even happens on mobile. What's the benefit? And this, it feels like you're kind of
swimming against the crowd with this one. The majority of our customers are still on-prem. And so this
is, you know, you're talking about banks, financial institutions, governments, things like that,
where they want full control over the system. They want to run it on their own hardware.
Now, they may use their own cloud or whatever to run it, but they want to manage the whole process
and be in control of, let's see, upgrades or downtime or things like that. So it's certainly not,
it's certainly not uncommon, and I don't think that's going away anytime soon. As for the upgrade
support, we're kind of going through this process, actually in the past couple years,
we've been getting a lot more, I guess,
confident with deprecating features and things like that
and just kind of cutting loose old capabilities.
And part of that has come from, you know,
fully embracing feature doggles as part of that process.
I think we're getting a little bit braver in terms of, you know,
removing capabilities that perhaps older customers may, may miss.
But I don't think that in the long term,
self-hosted will kind of go away.
This is one of the sort of things, again,
where I think it's really common to hear
everything's in the cloud, we're all in the cloud.
Again, the reality is there's a lot of companies out there
where for them it just doesn't make sense
or it's not viable or it doesn't meet compliance requirements
or whatever case may be.
Also, it's kind of a reminder, I think,
that you actually might have a lot of this competition
if you build infrastructure software
that also runs on-prem
because it sounds like there's a demand
where companies are like, we want to give you money
in order for us to run on-prem.
And I'm sure some of them would do SaaS
if there's no other alternative, but for SaaS, it's easier to build anyway.
So there'll be more competition.
So if you're an entrepreneur or if you're soft-range, you're thinking to do a business
or start a business, it might give you an edge.
Yeah, that's right.
It sounds like a lot of your customers, you know, the ones who have not upgraded your software
for, let's say, five years on one end you, I say, oh, my gosh, what are they doing?
But they might just be happy with it.
And if they keep paying you as a business, those are some of your most loyal customers.
You see what I mean?
That's right.
And this is a thing.
I mean, I remember when I worked in, like when I worked in the previous job that used
Octopus or any of us who have any other sort of, you know, software that you've got running,
potentially you've got running locally, if it just works, why touch it, I guess?
And so it's kind of the bane of our existence because it annoys us if we want to ship
the features and give them all these great new things.
But on the flip side, you know, particularly for something as critical as, you know,
their deployment system, a lot of customers, once they've got it running, they kind of step away
and go, okay, let's just let it be.
And it keeps happening with AI as well in the sense that, for example,
I just read that cursor, their latest coding model,
it's updated like, I think, every five hours,
which is amazing, it keeps getting better.
However, you know, there are customers who,
once you have an LLM and it works for you,
you kind of tuned it, you have the instructions, great.
But oftentimes what happens, a new version comes out of a model
or major version and it stops working.
And I assume that there will be more,
teams, companies, businesses who are like, look, it would be worth for me money to kind of pin
this thing or to run it on my own infra and just have it stay as is and then I will decide when
I want to change it as long as it, you know, if it's, if it's, if it ain't broken, don't fix it.
That's right. And I think to Octopus's credit, I think we have a really good history
at sort of helping customers even when they're kind of on those older, sometimes to the
extent of wanting to say the support team, just they're on old incident.
tell them to get the figs upgrade.
But support team are second to none
in terms of their willingness to help.
And as he said, if they're willing to pay us,
who am I to say no?
Yeah, I mean, it's a business strategy,
but I think it's just a nice reminder
that it's not just one size.
And even though I think SaaS is eating the world
and we're hearing it and we're seeing it,
it's nice to see that.
It's not just that.
As closing,
if I'm a software engineer
and I would like to
move beyond continuous delivery, continuous deployment and go into progressive delivery, what
pointers can you give me? Yeah, I guess just start with something, right? So start with adding
one feature toggle. It may be scary at first to kind of go, oh, it's in production. If I, you know,
toggle this, I'm going to break something in production. It's nice and comfortable to know that you're
kind of well to the left of the running systems. And if you ship code, everything will be caught by the
test. But, you know, if I toggle it, what will happen? It's kind of like a drug, right?
Once you start doing it, you don't want to stop.
And that's, that's why we've got this, this hygiene problem for things like feature toggles, right?
It's really easy to add them and actually end up with the opposite problem of how do you,
and you kind of control yourself.
How do you stop?
So I'd say just, just kind of start doing it.
Add one and keep an eye on kind of as you roll it out and you look at the results from it.
And the reality is, you know, I've shipped features behind feature toggles where I've shipped a bug, right?
And it's one thing to ship something and turn on a feature and go, okay, cool, customers have it.
it's a very different thing when you do the opposite,
if you ship something,
there's a problem,
and you can reach immediately for the toggle and switch it back off.
You know,
the amount of times you kind of,
in the past,
you have this kind of panic of,
I know,
I've shipped something.
It's,
I don't know what's going wrong.
And particularly when you're in that state,
you know,
maybe you've got called up at 2 a.m.
because you've got an on call and,
you know,
you don't know what the next step is to do
and you kind of got to panic mine,
and should I,
you know,
build a new thing or do I somehow force a redeployment?
So having the capability of being able to sort of flick that switch,
just allows you then come right down and go, okay, I've stemmed the bleeding, now come back and
reanalyze it and understand what's wrong. So having that capability, once you sort of experience
that and realize the value that not just rolling things out, but I guess rolling that individual
feature back off, yeah, you'll want to use it for everything. What's one or two books you would
recommend and why? I'll give two kind of, I guess, technical ones and more of a fun. Phoenix project
is still, for me, a good one. This is one that...
Gene Kim, yeah.
Yeah, and I can see, you know, you kind of remember that.
We got that in Skype.
This was one that Abdullah kind of gave to everyone.
Yeah, our manager gave it to everyone.
Yeah, and, you know, it's, you know, parts of it may be a little bit outdated.
And, you know, some of the practices have changed a little bit.
But at its core, this idea of as an engineer being involved in that whole sort of operation
side of what you're shipping.
And the value that gives to not just the company, but to you is amazing.
So I think that book is kind of a core, it's one of those cool foundation ones that sets the,
sets the context for everything we talked about today.
The other one from a more, I guess, organizational and communication side of things,
Radical Cander by Kim Scott.
Pleasure to communicate more efficiently with more compassion with your peers and other people around you.
It's, you know, really common, you know, I'm an engineer, so I know sometimes it's really,
you kind of look back on what you said and you feel like, okay, maybe I'm, I can be a little bit blunt,
Whereas radical candor teaches us to think about, you know, you want to have those communications that are both sharing that you're caring and empathetic, but also direct and, you know, the benefits of that and kind of the inverse of that where, you know, you're perhaps, like I said, you're very blunt. You sort of being honest about it, but you're missing that empathy.
So I found that book really useful and interesting as, I guess not even just as an engineer, but as a person working with other people.
from the more fun side basically anything by Greg Egan he's an Australian sci-fi author he writes
some pretty crazy mind-bending hard um hard sci-fi so if you're really into that i'd say read um like
diaspora or um charles letter they're the sort of books that actually took a second read to get through
and he's he's a mathematician as well so you know he's got a whole bunch of background and mathematics
on why a certain part of his story goes the way it is he,
he very entire story on the premise of,
what if the speed of light wasn't absolute or something like.
There's one premise and it kind of breaks out into it.
And then this is what happens to energy and therefore molecules work like this and da-da-da-da.
And as a, you know, I'm a tech nerd.
That sort of science stuff really appeals.
Say it same.
When sci-fi, there's some science involved that's actually way,
I find it way more fun.
Rob, thanks very much.
Thank you, Gaggett.
It's great.
That's great.
What an interesting conversation.
I hope you enjoyed having someone like Rob who has been building and thinking about
CICD at scale for a decade.
It was such a fun blast from the past story as he talked about how it's Skype.
Our team basically did continue his delivery years before most of the industry caught up.
And how we did it by quietly shipping new bills to New Zealand every week using this as our Canary Country.
It's a reminder that a lot of modern software practices were already being run in the wild by
deaths who just wanted to ship software faster than our change advisory board.
would allow us to do so.
One other thing I took a note is Rob's take on rollbacks.
Lots of engineering teams talk about rollbacks as if they're a safety net.
But the moment you have a database schema change in the mix,
what safety net?
Rob's advice is to roll forward, not back,
and use feature toggles as a way to turn features off or on.
This is also a reminder that investing feature flags is usually really helpful.
But if you have feature flags,
be sure to clean them after them after you've rolled them out.
Otherwise, they become a big mess.
Finally, a part where I learned something,
they knew was on GitOps.
I've always assumed that Git offs was about, well, Git.
But as Rob pointed out, none of the four actual pillars of GitOps require Git at all.
The four pillars are number one declarative, number two version and immutable, number three,
pulled not pushed, number four continuously reconciled.
The name GitOps has caused the whole industry to get a bit dogmatic about putting everything
into Git repo, even things like secrets, which absolutely should not be there.
Rob's take is that most teams just want to ship software.
If GitOps helps with that part, great.
But if a more practical process works better, just use that.
Do check out the show notes below for related the Primatic Engineering Deep Dives on backend technologies and other related topics.
If you've enjoyed this podcast, please just subscribe on your favorite podcast platform and on YouTube.
A special thank you if you also leave a rating on the show.
Thanks and see you in the next one.
