Environments built and changed by hand drift apart, differ from one another and queue behind a central team, until no one can say with confidence what is deployed or reproduce it on demand. Infrastructure as code, GitOps and platform engineering answer this by treating infrastructure as a product: declared in code, reconciled continuously and offered to teams as self-service within guardrails.
This paper sets out the foundations of infrastructure as code (declarative desired state, idempotent apply, modules, immutability and a reviewed change workflow), the environments a change passes through and the promotion of one artifact toward production, GitOps and continuous reconciliation, and platform engineering with golden paths. It then covers guardrails, policy as code and cost, applies a small, medium and large size lens, describes the roles around a platform and the pitfalls that recur, and closes with a maturity path and a plan for the first 90 days.
Written for Platform and infrastructure leads, cloud architects, DevOps engineers and engineering managers deciding how environments are built, changed and offered to teams.
Executive summary
Most infrastructure trouble starts with a change made by hand: a console edit or an ad hoc script, applied under deadline and never written down. From that moment environments diverge, and every new environment becomes a negotiation with a central team through a ticket queue. Three shifts address the problem. Infrastructure as code (IaC) makes the desired state declarative, versioned and reviewable. GitOps keeps running systems continuously reconciled to that declared state. An internal platform packages both into golden paths that teams use to provision and change infrastructure themselves, within guardrails, instead of filing tickets.
- Infrastructure as code differs from scripting through four principles: declarative desired state, idempotent apply, modules and composition, and immutable infrastructure.
- Every change follows one workflow: write and plan, review, test in an ephemeral stack, apply through automation, and verify against the desired state.
- One artifact is built once and promoted through environments of rising fidelity; a preview environment for each change is among the earliest wins.
- GitOps, as defined by the OpenGitOps principles, is declarative, versioned and immutable, pulled automatically and continuously reconciled.
- Platform engineering treats the platform as a product with internal customers, grown from the thinnest viable platform toward paved paths that are easier to use than to bypass.
- Guardrails such as landing zones, policy as code, mandatory tagging and cost budgets let teams move quickly without moving dangerously, and leave an audit trail as a by-product.
The implementation differs with scale. A small organization lets its application team write infrastructure code; a large one runs a dedicated platform organization with a governed module catalog, enforced GitOps and a FinOps practice. The closing sections describe the operating model, the pitfalls that recur, a five-stage maturity path and a first 90 days aimed at working evidence rather than a strategy document.
Why hand-built environments fail
Manual change is the root of most infrastructure trouble. A console edit or a one-off script solves the problem in front of someone, but nothing records it, so the next environment is built without it. Repeated across months and people, these unrecorded changes produce drift (an environment that no longer matches any definition) and snowflakes (environments that are each slightly different, so a release that works in one fails in another). Recovery becomes archaeology, because rebuilding a system means rediscovering every change ever made to it.
Manual environments also queue. When only a central team can create or change infrastructure, every request becomes a ticket, the team becomes a bottleneck and a single point of knowledge, and delivery teams build shadow workarounds around the queue. The cost is paid twice: in slower delivery, and in risk that no one can see.
Hand-built environments drift, differ and queue behind tickets; code, GitOps and a platform turn infrastructure into a product.
Three shifts answer this, and each builds on the one before. Infrastructure as code turns a change into a reviewed commit rather than a quiet edit. GitOps keeps running systems reconciled to the committed state and corrects drift when it appears. An internal platform packages both into paved paths that teams use without waiting. Guardrails, policy and cost controls run underneath all three.
Infrastructure as code
Desired state declared, versioned and reviewed like application code
GitOps
Agents pull the declared state and reconcile running systems to it
Internal platform
Golden paths that let teams self-serve within guardrails
Infrastructure as code foundations
Infrastructure as code is the practice of defining servers, networks, databases, permissions and the rest of an environment in machine-readable files that are versioned, reviewed and applied by tools rather than by hand. Keeping files in a repository is not enough on its own: a folder of scripts that someone runs from a laptop is still manual change. Four principles separate genuine infrastructure as code from scripting that happens to live in version control; Kief Morris's Infrastructure as Code explores the ideas behind them in depth.
Four principles
Declarative desired state
Describe the end state, not the steps to reach it. The tool computes the difference between desired and actual and applies only that, so the same definition yields the same system.
Idempotent apply
Applying the same definition again converges on the same state instead of stacking side effects. A re-run is safe, which makes recovery and routine change predictable.
Modules and composition
Package infrastructure into reusable modules with clear inputs and outputs. Teams assemble environments from a shared library instead of copying configuration that later drifts.
Immutable infrastructure
Replace servers, images and containers rather than editing them in place. A new version is built, tested and rolled out, so no undocumented change survives.
The principles reinforce one another. Declarative definitions make idempotence possible, because the tool always works toward a target rather than replaying a sequence of steps. Modules keep definitions maintainable as the estate grows, and immutability closes the last loophole: if no one edits a running system, the running system can only be what the definition says. Together they turn infrastructure from something that is administered into something that is built and released.
Imperative scripts and declarative desired state
The distinction between imperative and declarative approaches is the heart of the practice. An imperative script lists commands to run in order. Re-running it may fail halfway or apply a change twice, drift is hard to see because nothing states what the result should be, and the intended outcome is scattered across the logic. A declarative definition states the outcome and leaves the tool to reach it: a plan shows the gap between desired and actual before anything changes, and a reviewer reads the intended state directly in the diff.
| Concern | Imperative scripts | Declarative infrastructure as code |
|---|---|---|
| Expressing change | Steps to run, in order | The end state required |
| Re-running | May fail or apply a change twice | Idempotent: converges on one state |
| Drift | Hard to detect or correct | A plan shows the gap from the desired state |
| Review | Intent hidden across scripts | Desired state read directly in a diff |
| Reuse | Copy and adapt scripts | Shared modules with inputs and outputs |
Declarative and imperative are not rival camps. Most estates combine a declarative provisioning tool with some procedural glue, and general-purpose programming languages can express declarative intent. What matters is that the definition, not the procedure, is the source of truth.
A safe change workflow
A safe workflow turns every infrastructure change into a reviewed, testable event. The author writes the desired state and generates a plan that shows exactly what will be created, changed or destroyed, so surprises surface before they reach a system. Peers review the code and the plan together while static analysis and policy checks run automatically. The change is then applied to a temporary, ephemeral stack where integration tests confirm that it behaves, after which the stack is destroyed so that no one keeps paying for it. Only then is it applied to the real environment, by automation using least-privilege credentials rather than by a person with standing access. Finally the result is verified against the desired state, and any drift is detected and corrected.
Write and plan
Author the desired state; generate a plan of the exact changes
Review
Peer-review code and plan; run static analysis and policy checks
Test
Apply to an ephemeral stack, run integration tests, destroy it
Apply
Apply by automation with least-privilege credentials and locked state
Verify
Confirm the system matches the desired state; correct any drift
The same workflow carries routine change, disaster recovery and experiments, and it runs in the delivery pipeline like any other code. Its value compounds: once every change passes through it, the repository history becomes a complete, reviewable record of how each environment came to be, and rebuilding an environment becomes a routine operation rather than a crisis.
Environments and promotion
Environments are where infrastructure as code pays off first, because the discipline that builds one environment from code can build any number of them. How an organization treats its environments, and how it moves changes between them, decides whether its path to production can be trusted.
Long-lived and ephemeral environments
Environments fall into two kinds. Long-lived environments such as staging and production persist, accumulate state and history, and are shared across teams, so changes need coordination, and drift creeps in unless every change goes through code. They also cost money whether or not anyone is using them. Ephemeral environments are created on demand from the same code and destroyed after use, typically one per change or pull request. Because each is built fresh, it cannot drift, and it costs money only while it exists.
Long-lived environments
- Persist and accumulate state and history
- Shared across teams, so changes need coordination
- Drift creeps in unless every change goes through code
- Cost continues whether or not they are used
Ephemeral environments
- Created on demand from code, destroyed after use
- One per change or pull request for preview and testing
- Always built the same way, so they cannot drift
- Paid for only while they exist, then cleaned up automatically
The two kinds are complementary rather than competing. Defining everything as code is what makes ephemeral environments possible, and the same discipline keeps long-lived environments from drifting. A preview environment for every pull request, where reviewers can see and exercise the change running, is one of the clearest early wins of infrastructure as code: it shortens review, catches integration problems before merge and demonstrates the value of the approach to people who will never read a module.
Environment types on the path to production
A typical path to production runs through several environment types, each with a purpose, a lifetime and a data policy. Parity with production matters most where a result must be trusted; lower environments trade fidelity for speed and cost.
| Environment | Purpose | Lifetime | Data |
|---|---|---|---|
| Local | Fast inner-loop development | Minutes to hours | Synthetic or sampled |
| Preview | Validate one change or pull request | Life of the change | Synthetic or masked |
| Integration | Test services together | Short-lived, rebuilt often | Masked and representative |
| Staging | Rehearse the release in production-like conditions | Long-lived | Masked and production-like |
| Production | Serve real users and traffic | Permanent | Real and protected |
Three rules hold across the path. First, the same artifact is promoted from one environment to the next rather than rebuilt for each. Only building binaries once is one of the deployment pipeline practices that Jez Humble and David Farley set out in Continuous Delivery, and it ensures that what was tested is what ships. Second, configuration is separated from code and injected per environment, and secrets come from a managed secrets store at run time rather than from images or repositories. Third, production-like data reaches lower environments only through masking or synthetic generation under the organization's data classification policy, so that realistic testing never becomes an uncontrolled copy of production data.
GitOps and continuous reconciliation
Infrastructure as code describes what an environment should be; GitOps keeps it that way. Rather than relying on a pipeline to push each change and hoping nothing changes afterward, GitOps places agents in each environment that continuously compare the running system with its declared state and correct any difference.
The four GitOps principles
GitOps has a precise, vendor-neutral definition rather than being a loose style. OpenGitOps, a Cloud Native Computing Foundation (CNCF) Sandbox project overseen by the GitOps Working Group, publishes the GitOps Principles (version 1.0.0), which name four properties. The term itself was coined at Weaveworks, the company that created the Flux project.
Declarative
A system managed by GitOps has its desired state expressed declaratively, as data rather than a sequence of commands, so it can be reviewed, tested and compared.
Versioned and immutable
The desired state is stored in a way that enforces immutability and versioning and retains a complete version history, so any earlier state can be recovered exactly.
Pulled automatically
Software agents automatically pull the desired state declarations from the source, rather than an outside system pushing changes in with standing access.
Continuously reconciled
Software agents continuously observe the actual system state and attempt to apply the desired state, correcting drift without waiting for the next deployment.
The principles do not mandate Git. They require a store that is versioned, immutable and keeps a complete history; Git is the most common choice, which is where the name comes from, but the definition is deliberately tool-agnostic. Together the four principles shape how repositories are laid out and how promotion and rollback work.
How reconciliation works
Reconciliation is the mechanism that makes GitOps more than version-controlled deployment scripts. The desired state lives in a repository as declarative manifests that are versioned and reviewed. A reconciliation controller running inside the environment, with Argo CD and Flux as widely used examples, pulls that state on a loop, compares it with what is running and applies the difference until the two converge. When someone changes the environment out of band, directly against a cluster or through a cloud console, the controller detects the divergence and reverts it, so drift cannot accumulate. Sync status and divergence are reported to teams and dashboards, which makes the health of every environment visible at a glance.
Declare
A reviewed change updates the desired state in the repository
Pull
A controller inside the environment fetches the desired state
Compare
It diffs the actual state against the desired state
Converge
It applies the difference and reverts out-of-band changes
Report
Sync status and drift are reported to teams and dashboards
Runs continuously, not only when something is deployed
Repository layout supports the loop. Application source code and deployment configuration usually live in separate repositories, so a configuration change does not trigger an application build and access to each can be controlled separately. Promotion between environments is a pull request that changes the configuration for the next environment, and rollback is a revert of that commit. Secrets are referenced rather than stored: the repository holds encrypted values or references to an external secrets manager, never secrets in clear text.
Pull and push deployment
Deployment can push or pull, and GitOps is the pull model. In a push model, a pipeline holds credentials for each environment and pushes changes in from outside. The pipeline must be able to reach every target, standing credentials for every environment accumulate in one place, and drift is corrected only when the pipeline next runs. In a pull model, a controller inside the environment pulls the desired state and reconciles continuously, so no external system needs standing access to the cluster and drift is corrected between deployments as well as during them.
Push-based deployment
- A pipeline holds credentials and pushes changes into the target
- The pipeline must reach every environment from outside
- Drift is corrected only when the pipeline next runs
- Credentials for every environment live in the pipeline
Pull-based deployment (GitOps)
- A controller inside the environment pulls the desired state
- It reconciles continuously and corrects drift on its own
- No external system needs standing access to the cluster
- The repository records what was intended, by whom and when
Pull is not always available or appropriate. Some targets, such as managed services configured through a provider's API or legacy platforms that cannot host an agent, are easier to drive from a pipeline, and many estates use both models. Where it fits, the pull model removes a class of credential exposure and keeps environments converged continuously rather than correct only at the moment of deployment.
Platform engineering and golden paths
Infrastructure as code and GitOps make environments repeatable; platform engineering makes them available. Without a platform, every delivery team must learn the same tools, write the same modules and solve the same problems, or wait for a central team to do it for them. A platform packages that shared work once and offers it as a product.
The internal platform as a product
The CNCF Platforms White Paper defines a platform as an integrated collection of capabilities defined and presented according to the needs of the platform's users. Platform engineering is the practice of planning, building and running such platforms for the teams that build products. In practice an internal platform gathers the capabilities that teams would otherwise each build or request: provisioning templates, environments on demand, pipelines and deployment, secrets and configuration, an observability baseline, policy and guardrails, a service catalog and cost visibility.
Internal platform
Shared capabilities offered as self-service
Provisioning templates
Modules and templates for common resources
Environments on demand
Preview and test stacks created from code
Pipelines and deploys
Build, test and promotion wired in
Secrets and configuration
Managed stores injected at run time
Observability baseline
Logs, metrics, traces and alerts by default
Policy and guardrails
Rules checked automatically, not by ticket
Service catalog
Owners, dependencies and documentation
Cost visibility
Spending attributed to teams and services
The point is not to centralize these capabilities behind a queue but to offer them as self-service, through a portal, an application programming interface (API) or a command-line tool, so a team takes what it needs without waiting. Team Topologies, by Matthew Skelton and Manuel Pais, describes the platform team as one that provides a compelling internal product to accelerate delivery by stream-aligned teams, and it recommends the thinnest viable platform: the smallest platform that removes real obstacles, grown from what teams actually need rather than from what the platform team can imagine. For some organizations the thinnest viable platform is a page of documentation and a handful of templates over a cloud provider's managed services, and that is a legitimate place to start.
From ticket queues to self-service
The contrast between ticket-driven operations and a self-service platform is the case for platform engineering. In ticket-driven operations, teams file a request and wait, each environment is built by hand so no two are alike, the central team becomes a bottleneck and a single point of knowledge, and change is slow enough that shadow workarounds grow around the queue. A self-service platform lets teams provision and change infrastructure through paved paths, templates produce consistent environments on demand, and guardrails enforce policy without a human gate on every change, so the platform team spends its time building capability rather than closing tickets.
Ticket-driven operations
- Teams file a request and wait in a queue
- Each environment built by hand, so no two match
- The central team is a bottleneck and single point of knowledge
- Shadow workarounds grow around the queue
Self-service platform
- Teams provision and change infrastructure through paved paths
- Templates produce consistent environments on demand
- Guardrails enforce policy without a human gate per change
- The platform team builds capability, not tickets
What the platform still owns
- The golden paths, templates and modules
- Guardrails, policy and landing-zone structure
- Shared services: identity, networking, observability
- Escape hatches for genuine exceptions
Self-service does not mean uncontrolled. What changes is where control is exercised: in the paths, templates and policies that every change passes through, rather than in a person reviewing each request. The paved path also stays optional, with escape hatches for teams whose genuine needs it does not yet meet, provided those teams meet the same guardrails by other means.
What a golden path provides
Spotify, which popularized the term in platform engineering, defines a golden path as the opinionated and supported path to build something, such as a backend service, a website or a data pipeline; others call the same idea a paved road. Its defining property is that teams choose it because it is the easiest route, not because it is mandated. What a golden path provides is concrete:
- A new service or environment created from a template, ready to run.
- Pipelines, deployment and rollback wired in from the first commit.
- Observability, logging and alerting present by default.
- Secrets and configuration drawn from managed stores, not baked into images.
- Policy and security guardrails applied automatically.
- An owner, a catalog entry and cost attribution from the first day.
- Documentation and sensible defaults, with escape hatches when a team needs to leave the path.
The CNCF Platforms White Paper lists the attributes that make such paths succeed: the platform is run as a product for its users, offers a consistent user experience, is self-service, reduces the cognitive load on product teams, is optional and composable rather than an impediment, is secure by default, and comes with documentation and onboarding. Camille Fournier and Ian Nowland's Platform Engineering develops the product approach behind these capabilities from the perspective of the leaders who fund, staff and run platforms.
Guardrails, policy and cost
Guardrails let teams move quickly without moving dangerously. Each guardrail prevents a specific failure and is enforced at a specific point, and expressing guardrails as code means that they are reviewed, versioned and tested like everything else.
| Guardrail | What it prevents | Where it is enforced |
|---|---|---|
| Landing zones | Unstructured, ungoverned accounts and projects | Account or project structure |
| Policy as code | Non-compliant resources | At plan time and at cluster admission |
| Tagging and ownership | Orphaned, untraceable resources | Plan and admission checks |
| Least-privilege identities | Over-broad pipeline access | Pipeline and cloud identity |
| Cost budgets and alerts | Silent cost overruns | Billing and tag-based reports |
| Drift detection | Undetected manual change | Reconciliation and scheduled scans |
Landing zones and policy as code
A landing zone is a baseline account or project structure with networking, identity, logging and guardrail policies in place before any workload arrives, so every environment starts from a governed foundation rather than an empty account. The major cloud providers each publish landing-zone guidance, and mature platforms vend new accounts or projects through the platform itself, already configured.
Policy as code expresses rules such as no public storage buckets, encryption at rest, approved regions only and images only from the trusted registry as code that is evaluated automatically. The checks run twice: at plan time, before a change is applied, so the author gets fast feedback in the pull request; and at admission, inside the cluster or the cloud control plane, so that nothing bypasses the rule. Open Policy Agent (OPA) is one widely used policy engine. Pipelines themselves run under least-privilege identities, and the supply chain behind infrastructure, from pinned modules to signed artifacts, should follow the practices of the NIST Secure Software Development Framework (SP 800-218).
Ownership, cost and audit evidence
Every resource should carry tags for its owner, environment and cost center, and plan and admission checks should reject resources that lack them, so that nothing runs without a traceable owner. Those tags make cost visible: spending is attributed to teams and services and reviewed regularly, with budgets and alerts catching overruns before the invoice does. The FinOps Foundation describes this shared practice as FinOps, an operational framework and cultural practice that creates financial accountability through collaboration between engineering, finance and business teams, rather than leaving cloud cost to a central budget that no engineer sees.
A further benefit arrives without extra effort. Because every infrastructure change is a reviewed commit applied by automation, the history of the repositories and pipelines is audit evidence: who changed what, when and under which review. Auditors can be given a query rather than a binder of screenshots.
Scale, operating model and maturity
What good looks like depends on size. This paper uses three size bands as a convention rather than as fixed categories. A small organization has one or two teams, a handful of deployable units and one production environment, with no dedicated platform function. A medium organization has several teams and tens of services, shared environments, and a platform or enablement team beginning to form. A large organization has many teams, hundreds of services, multiple platforms or regions, a dedicated platform organization, and formal change and audit obligations.
What changes with scale
| Dimension | Small | Medium | Large |
|---|---|---|---|
| Who writes infrastructure code | The application team | Teams plus a forming platform group | A platform organization, with teams contributing |
| Module library | A few shared modules | Curated internal modules | Versioned, governed catalog |
| Environments | One or two, long-lived | Shared, plus ephemeral previews | Many, mostly ephemeral |
| GitOps adoption | Optional or partial | Standard for new systems | Default and enforced |
| Platform team | None; the team self-serves | Forming, often part-time | Dedicated product team |
| Policy and cost | Manual review | Some policy as code; tagging | Policy as code; FinOps practice |
The table reads left to right as a direction of travel, not as a ranking. A small organization should not import the machinery of a large one: a governed module catalog and an enforced GitOps estate would cost more than they return. Equally, a large organization that still relies on manual review and hand-built environments carries risk that grows with every team it adds. Different systems within one organization often sit in different bands, and the right moment to adopt the next column's practice is when the current one starts to strain.
Roles around the platform
An operating model names who owns what. On the platform side, a platform product owner sets the roadmap and runs the platform as a product with internal customers, and platform engineers build and run the paved paths and shared services. The platform is staffed as a long-lived team, not a time-boxed project, because a product needs continued investment and a project ends. Around it, stream-aligned teams build products on the golden paths, and an enabling team coaches adoption and closes capability gaps rather than doing the work for others.
| Role | Responsibility | How it usually interacts |
|---|---|---|
| Platform product owner | Roadmap, prioritization from user demand, adoption and satisfaction | Works with users through research and feedback |
| Platform team | Builds and runs golden paths, modules and shared services | X-as-a-Service toward stream-aligned teams |
| Stream-aligned teams | Build and run products on the golden paths | Consume the platform as a service |
| Enabling team | Coaches adoption and closes capability gaps, then steps back | Facilitating |
| Platform team with a pilot team | Discover a new capability together before it becomes part of the product | Collaboration, for a defined period |
Team Topologies names four team types (stream-aligned, enabling, complicated-subsystem and platform) and three interaction modes: collaboration for a defined period to discover something new, X-as-a-Service in which one team provides and another consumes, and facilitating in which one team helps and mentors another. A platform team that falls into permanent collaboration with every team, or insists on approving each change, has become a new gatekeeper. The measures of a platform are best read as signals rather than targets to game: teams onboarded, time to a team's first deployment, latency from request to fulfillment, tickets avoided, and the satisfaction of the developers who use it.
Pitfalls to avoid
Each pitfall below is the easy path under pressure, which is why naming them is the first defense.
If a platform is easier to use than to bypass, teams adopt it by choice; if it is harder, they route around it.
A maturity path
A maturity path gives teams a shared sense of where they stand and what comes next. It runs from manual change at the base, through codified and modular infrastructure and continuous reconciliation, to an optimizing organization that offers golden paths as self-service.
- Stage 1
Manual
Console changes and snowflake environments
- Stage 2
Codified
Every change is reviewed code applied by automation
- Stage 3
Modular
Reusable modules; ephemeral, tested stacks
- Stage 4
Reconciled
Desired state versioned, pulled and continuously reconciled
- Stage 5
Optimizing
Golden paths as self-service; drift and cost governed continuously
No stage can be skipped, because each supplies what the next depends on: there is no useful reconciliation without codified, modular infrastructure beneath it, and no golden path worth offering without reconciled environments to deliver it. Maturity should be assessed per team and per system rather than for the organization as a whole, since different teams will sit at different stages and the next step differs for each.
Where to start: the first 90 days
The first 90 days should produce working evidence rather than a strategy document. Choose one system and one painful, repeated request, and prove the approach end to end before widening it.
- Days 1 to 30: codify and protect. Put all new infrastructure under code, establish remote, locked and encrypted state, and stop accepting new console changes to the target system.
- Days 1 to 30: choose the first golden path. Pick one painful, repeated request, such as a new service or a test environment, and agree with the teams who make it what good would look like.
- Days 31 to 60: build the path end to end. Let a team create a previewed, observable environment from a template, with pipeline, secrets and ownership wired in.
- Days 31 to 60: reconcile one system. Run GitOps reconciliation for one system, promote between environments by pull request, and rehearse a rollback by revert.
- Days 61 to 90: add guardrails and review adoption. Add policy as code and mandatory cost tags, run a real environment from the path, and review adoption and friction with the teams it serves.
After 90 days the organization should have one golden path in real use, one reconciled system, protected state and the first guardrails, together with evidence about what teams found easy and hard. That evidence, not a target architecture, should decide which path to build next. Make the paved path the easiest path, and teams will build on it by choice.
Glossary
- Infrastructure as code (IaC)
- The practice of defining infrastructure in machine-readable files that are versioned, reviewed and applied by tools rather than by hand.
- Desired state
- The declared description of what a system should be, from which a tool computes and applies the changes needed.
- Idempotent apply
- Applying the same definition repeatedly converges on the same state without additional side effects.
- Drift
- Divergence between a running system and its declared definition, usually caused by manual change.
- Immutable infrastructure
- An approach in which servers, images and containers are replaced with new versions rather than modified in place.
- State file
- A record that some declarative tools keep to map definitions to the real resources they manage.
- Ephemeral environment
- An environment created on demand from code for a specific purpose, such as a pull request, and destroyed after use.
- Promotion
- Moving the same built artifact through successive environments toward production, varying only configuration.
- GitOps
- An operating model in which the desired state is declarative, versioned and immutable, pulled automatically by software agents and continuously reconciled.
- Reconciliation
- The continuous loop in which an agent compares actual with desired state and applies the difference.
- Platform engineering
- The practice of planning, building and running internal platforms that offer shared capabilities to product teams as self-service.
- Internal developer platform
- The integrated set of capabilities, templates and APIs that product teams use to build, deploy and run software.
- Internal developer portal
- A user interface onto a platform, typically a service catalog with templates, documentation and scorecards.
- Golden path
- The opinionated and supported way to build and run something on a platform, chosen because it is the easiest route; also called a paved road.
- Thinnest viable platform
- The smallest platform that removes real obstacles for its users, grown from actual demand.
- Landing zone
- A baseline account or project structure with networking, identity, logging and guardrails in place before workloads arrive.
- Policy as code
- Rules expressed as code and evaluated automatically, for example at plan time and at admission.
- FinOps
- An operational framework and cultural practice that creates financial accountability for technology spending through collaboration between engineering, finance and business teams.
References and further reading
- Kief Morris, Infrastructure as Code, O'Reilly Media, third edition.
- Jez Humble and David Farley, Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation, Addison-Wesley.
- OpenGitOps, GitOps Principles, version 1.0.0 (opengitops.dev).
- Matthew Skelton and Manuel Pais, Team Topologies: Organizing Business and Technology Teams for Fast Flow, IT Revolution.
- Cloud Native Computing Foundation, CNCF Platforms White Paper.
- Camille Fournier and Ian Nowland, Platform Engineering: A Guide for Technical, Product, and People Leaders, O'Reilly Media.
- Spotify Engineering, How We Use Golden Paths to Solve Fragmentation in Our Software Ecosystem.
- FinOps Foundation, FinOps Framework (finops.org).
- National Institute of Standards and Technology, Secure Software Development Framework (SSDF), NIST SP 800-218.
- Open Policy Agent project documentation (openpolicyagent.org).
This paper offers general guidance and is not legal, regulatory or professional advice. Summaries of laws, regulations and standards are for orientation only; confirm the obligations that apply to your organization with qualified advisors. Product and vendor names are used for illustration and imply no endorsement.
© ByteCI, LLC. All rights reserved.