What we set up
The path from commit to production
Most DevOps engagements buy tools and change nothing, because the constraint was never the tooling. It was that nobody agreed who owns a release, what a rollback decision looks like, or which environment tells the truth.
Pipelines
Build, test, package and deploy through one defined path, on GitHub Actions, GitLab, Azure DevOps or Jenkins as your estate dictates.
Production is deployed by the same pipeline as every other environment, with approval gates rather than a separate manual route reserved for the important one.
One way to reach production, and everyone knows it.
Infrastructure as code
Terraform and configuration management for the environments, networking and platform services, held in version control with review on change.
Existing hand-built infrastructure is imported into state rather than rebuilt beside it, which is slower to start and avoids running two estates.
An environment you can recreate rather than restore.
Environments and test data
Consistent development, test and production environments, with provisioning automated and test data that can be recreated on demand.
Drift between environments is where releases go wrong. It works in test is nearly always a statement about configuration, not about code.
Environments that differ only where you intended.
Release and rollback
Deployment strategies matched to the application: blue and green, canary, phased rollout, feature flags, and database changes handled separately from code.
Schema changes are the part that resists rollback, so they are made backwards compatible and released ahead of the code that depends on them.
A release you can reverse without a restore.
Observability
Metrics, structured logs and traces wired in as the application is built, with alerts tied to the service the user experiences rather than to component health.
Every alert names an owner and an action. Dashboards that nobody has a decision to make from are quietly retired.
Signals a person on call can act on at 3am.
Ways of working
The unglamorous half: branching strategy, review expectations, definition of done, on-call rota, incident roles and blameless post-incident reviews.
This is where DevOps engagements succeed or fail. Pipelines are straightforward; agreeing that developers carry a pager is not.
A team that owns its releases rather than handing them over.