Announcing Fleet Management for Kargo Enterprise Learn More →

Announcing Fleet Management for Kargo Enterprise Learn More →

Announcing Fleet Management for Kargo Enterprise Learn More →

GitOps Promotion: How Kargo Moves Artifacts from Dev to Production

Carolyn King

Published April 29, 2026 · Updated October 2026 by Carolyn King

Updated October 2026 to cover Kargo v1.10 through v1.12 and Kargo Enterprise 1.11 and 1.12.

TL;DR

  • Continuous promotion moves a verified, versioned artifact from one environment to the next. Deployment syncs a single environment to its desired state. A healthy GitOps setup keeps the two layers separate.

  • CI pipelines make poor promotion engines. Custom scripts break when conditions change, rollbacks lack a clean path, and the audit trail lives in build logs.

  • Kargo, an open source project from the creators of Argo CD, handles promotion while Argo CD handles deployment. 

  • Teams assign each stage one of four promotion modes, from fully automated to emergency bypass. Kargo records who promoted what and when, and since v1.11 a manual rollback holds instead of being overridden by auto-promotion.

  • Kargo Enterprise adds automated rollback, promotion windows and approvals, Terraform and OpenTofu promotion, change management, and Fleet Management, now in closed beta.

Argo CD solved the first mile of GitOps: it watches a Git repository and continuously reconciles Kubernetes clusters to match the declared state. Teams that reach production scale hit a second problem. Moving a verified artifact from dev to staging to production needs to be controlled, auditable, and repeatable, and most pipelines still handle it with CI scripts and manual steps.

That second mile is continuous promotion, and Kargo exists to solve it. This post covers what continuous promotion is, why it belongs outside CI, how to structure environments for it, and how Kargo and Kargo Enterprise bring the same repeatability and control to promotion that Argo CD brought to deployment.

What is GitOps continuous promotion?

GitOps continuous promotion is the process of moving a verified, versioned artifact from one environment to the next, such as dev to staging or staging to production. A promotion layer decides which artifact moves forward, under what conditions, and with how much human oversight. Deployment then applies that artifact to the target environment.

GitOps uses Git as the source of truth for infrastructure and application state. Teams declare the desired state in a repository, and automated tooling reconciles live workloads to match it. Changes happen by updating Git, not by running imperative commands against a cluster. Promotion extends that model across environments.

For a deeper walkthrough, see Continuous Promotion with Kargo: A Guide for Platform Teams.

Figure: GitOps Continuous Promotion

Figure: GitOps Environment Promotion

What's the difference between promotion and deployment?

Deployment keeps one environment in sync with its desired state. Promotion governs which artifact moves between environments and what must happen before it does.



Deployment

Promotion

Scope

One environment or cluster

The whole pipeline, across environments

Question it answers

Does this cluster match Git?

Is this artifact ready for the next stage?

Typical gates

Sync status, health checks

Tests, metrics checks, approvals, change tickets

Tool

Argo CD, Flux, or another GitOps agent

Kargo

The two layers work together. The promotion layer feeds the right artifact to the deployment tool at the right time, and the deployment tool reconciles it within each environment. Keeping them separate makes each part of the pipeline easier to reason about, change, and audit on its own.

Figure: Kargo + Argo CD: Promotion & Deployment Layers

Should CI pipelines handle environment promotion?

No. CI systems exist to build and test code, not to govern state across environments. In a typical setup, CI builds an image, runs tests, and on success updates a manifest, opens a pull request, or pushes a tag to trigger a downstream pipeline. That works for one environment. Across many environments and teams, it becomes a hard-to-maintain web of jobs and scripts. Promotion becomes a side effect of the build and four problems follow.

#1: Promotion scripts break when conditions change

Each promotion script reflects the assumptions of its author and the state of the repository when it was written. When those conditions change, the script breaks. New team members inherit logic they can't easily read or safely modify.

#2:Manual promotion introduces human error at the worst moment

Under pressure, during a late-night incident, a hotfix window, or a release crunch, the engineer running the promotion becomes the control plane. That makes manual promotion a correctness problem, not only a process problem.

#3: CI logs make a poor audit trail

When CI artifacts serve as the record of what runs where, basic questions get hard to answer. Which version is in staging right now? Was it promoted automatically or by hand? Did it meet its conditions first? Without a promotion layer, teams reconstruct these answers from build logs.

#4: Rollbacks lack a clean path

Because the promotion happened inside a build, no first-class operation exists to reverse it. Rolling back means rerunning or hand-editing pipeline steps under the same pressure that caused the problem.

How should GitOps environments be structured for promotion?

Most teams organize environments in Git one of three ways, and each trades off audit trail, drift risk, and rollback cost. None of the three solves promotion on its own.

Structure

How it works

Strength

Main risk

Rollback

Branch per environment

A Git branch per stage; PRs move changes between them

PRs provide an audit trail

Gets unwieldy as stages multiply

Revert a merge

Folder per environment

One branch, a directory per environment

Simple to manage

Config drift between folders

Revert the folder change

Repository per environment

A separate repo per environment

Strongest access control boundaries

Coordination overhead across repos

Coordinate reverts across repos

A fourth pattern, preview environments, provisions a temporary environment for a specific pull request and tears it down when the PR closes.

Whichever structure a team picks, it still needs a layer that governs how artifacts move between environments. The goal is promotions-as-code: promotion logic that is version-controlled, reviewable, and enforced the same way every time, the properties GitOps already brought to deployment. Kargo adapts to the existing structure rather than requiring a reorganization around it.

Figure: Three Structures for GitOps Promotion Environments

Figure: Three Structures for GitOps Promotion Environments

What is Kargo and how does it work?

Kargo is an open source continuous promotion tool for GitOps, created and maintained by Akuity, whose founders created Argo CD. Kargo watches registries and repositories for new artifacts, bundles them into versioned units, and moves those units through environments according to rules each team defines. It complements GitOps deployment tools rather than replacing them.

Kargo is an Apache 2.0 project that Akuity co-founders and the co-creators of Argo CD launched in September 2023. It reached v1.0 in 2024, has 3,700+ GitHub stars and 200+ contributors, and runs in production at Deutsche Telekom, Cisco ThousandEyes, and JumpCloud.  

Kargo models promotion around three core concepts:

  • Warehouses subscribe to artifact sources, including Git repositories, container registries, and Helm charts, and detect new versions.

  • Stages represent environments such as dev, staging, or production. Each Stage defines the conditions an artifact must meet before Kargo promotes it there.

  • Freight is the unit of promotion: a specific, versioned set of artifacts that moves through the pipeline as one bundle.

Figure: Kargo Core Concepts

Figure: Kargo Core Concepts

This model maps onto each environment structure above. A folder-per-environment setup gets a Stage per folder, and a multi-cluster setup gets Stages that target specific clusters. Because the Git structure and the promotion pipeline stay separate, either can change without breaking the other.

How do teams run promotions with Kargo?

Teams assign each stage a promotion mode, and Kargo handles rollbacks and records each promotion along the way. Match the promotion mode to each stage's risk, the team's tolerance for manual steps, and any compliance requirements. A dev environment that receives dozens of commits a day needs different rules than production. Kargo supports four modes natively, and teams can set a different mode for each stage in the same pipeline.

Mode

How it works

Typical stage

Example

Fully automated

Kargo promotes Freight to the next stage as soon as it passes defined conditions, with no human step

Dev

A new backend image reaches the shared dev cluster after end-to-end tests, integration tests, and health checks pass

Policy-gated automated

Promotion runs automatically once verification gates pass: tests, security scans, or metrics thresholds

Staging, canary

A canary version advances only after a low-traffic rollout shows acceptable error rates and stable business metrics

Manual self-service

An engineer triggers the promotion, and Kargo enforces the required conditions before it proceeds

UAT, production

An engineer promotes a build to UAT once the change ticket is approved and test sign-offs are in place

Emergency bypass

A team approves Freight directly for a stage, skipping the standard chain while Kargo records who did what

Production hotfix

An on-call engineer approves a hotfix for production without waiting on staging

Kargo Enterprise 1.12 adds two production controls on top of these modes: promotion windows, which limit promotions to set release hours or block them during a freeze, and approval steps, which pause a promotion until designated reviewers approve it.

How does Kargo handle rollbacks?

In open source Kargo, a rollback is a manual promotion of older Freight to the affected stage. Before v1.11, auto-promotion on that stage would immediately promote the newest Freight again and undo the rollback.

Kargo v1.11 introduced auto-promotion holds. When an engineer manually promotes Freight other than the current auto-promotion candidate, Kargo records a hold that pauses auto-promotion from that Freight's origin. The stage stays where the engineer put it. To resume, the team promotes the current candidate again, and the UI shows a Resume button on held stages.

Kargo Enterprise 1.11 adds automated rollback: when a stage fails verification, Kargo restores the last verified Freight through the same promotion path, with no manual step.

How does Kargo make promotions auditable?

Kargo records each promotion as a Kubernetes resource that captures the Freight, the stage, the steps that ran, the outcome, and the actor who triggered it. That record answers the questions CI logs leave open: what version runs where, how it got there, and who moved it. Releases v1.11 and v1.12 extend the record:

  • Queryable by stage (v1.11): Kargo labels every promotion with its stage, so kubectl get promotions -l kargo.akuity.io/stage=prod returns a stage's full history.

  • Kargo metrics in Prometheus (v1.12): Kargo exports metrics for completed promotions, promotion duration, step duration, and stage readiness.

  • Actor on every API request (v1.12): API server logs name the user or service account behind each request, and Kargo records an event when someone creates or deletes an API token.

  • Lifecycle events (v1.11 and v1.12): Kargo emits an event when a Warehouse creates Freight and when a pending promotion gets discarded before it runs.

  • Deep links from promotion steps (v1.11): Steps can output links to the PRs, Jira tickets, or dashboards a promotion touched, and the UI shows them inline.

Kargo Enterprise 1.12 adds custom audit events, which write release details and decisions, such as change-request numbers, to Akuity's central audit log.

The result: promotion history lives in the cluster and in standard observability tools, not in build logs.

What does Kargo Enterprise add?

Kargo Enterprise, part of the Akuity Platform, adds governance, automation, and operational controls on top of open source Kargo.

Capability

What it does

Automated rollback (1.11)

Restores the last verified Freight when a stage fails verification

Promotion windows and approval steps(1.12)

Limits promotions to set release hours, blocks them during freezes, and pauses a promotion until designated reviewers approve it

Custom audit events (1.12)

Writes release details and decisions to Akuity's central audit log

Terraform and OpenTofu promotion

Promotes infrastructure and application changes together, under the same promotion policies

Jira and ServiceNow change management

Builds formal change requirements into promotion pipelines without custom scripts

Embedded Argo CD visibility

Shows application state, diffs, and logs in the Kargo UI during a promotion

Promotion Advisor

Summarizes the commits in a release and assigns an inferred risk score before promotion

Custom Steps

Runs team-defined promotion logic, packaged as containers, next to built-in steps

Fleet Management (closed beta)

Coordinates one release across hundreds or thousands of targets with ordered waves, per-target verification, and failure thresholds

Get started with GitOps continuous promotion

CI scripts produce promotion pipelines that are fragile, opaque, and hard to audit. Treating promotion as a first-class concern, version-controlled, policy-driven, and separate from the build, brings the practices GitOps established for deployment to the second mile. Kargo makes that the default.

Frequently asked questions

What is the difference between Kargo and Argo CD?

Argo CD handles deployment: it keeps each Kubernetes cluster in sync with the state declared in Git. Kargo handles promotion: it decides which verified artifact moves to which environment, and when. Most teams run them together, with Kargo feeding Argo CD the right artifact for each stage.

Does Kargo require Argo CD?

No, though most teams run Kargo with Argo CD, and the two integrate most closely. Kargo can also hand off to Flux, a homegrown GitOps controller, or legacy deployment tooling, so teams can adopt its promotion model without changing how they deploy.

Which promotion mode should a production stage use?

It depends on the stage’s risk and any compliance requirements. Manual self-service fits production stages where a person should decide when a release goes out, with Kargo enforcing conditions such as an approved change ticket before the promotion runs. Policy-gated automation fits teams whose tests, security scans, and metrics checks are strong enough to gate production on their own. Emergency bypass is for hotfixes, and Kargo records who approved the Freight. In Kargo Enterprise 1.12, promotion windows and approval steps can sit on top of either mode.

Does Kargo work with a branch-per-environment Git setup?

Yes. Kargo doesn’t require a particular repository layout. Each Stage defines the promotion steps that write to its environment, so a Stage can commit to an environment branch, a folder in a shared branch, or a separate repository. Teams can keep their existing structure and add Kargo on top of it.

How can I see every promotion to a specific stage?

Since v1.11, Kargo labels each promotion with its stage, so kubectl get promotions -l kargo.akuity.io/stage=<stage> lists that stage’s full history, including the Freight, the steps that ran, the outcome, and who triggered it. From v1.12, Kargo also exports promotion metrics to Prometheus.

Can Kargo enforce release freezes and approvals?

Yes, in Kargo Enterprise 1.12 and later. Promotion windows block promotions outside set release hours or during a freeze, and the wait-for-approval step pauses a promotion until designated reviewers approve it. Kargo records each approval with the reviewer, timestamp, and reason.

How does Kargo handle rollbacks?

In open source Kargo, a team rolls back by manually promoting older Freight. Since v1.11, that manual promotion places a hold so auto-promotion doesn't override it. Kargo Enterprise 1.11 adds automated rollback, which restores the last verified Freight when a stage fails verification.

Ready to simplify delivery with Akuity?

Deploy, promote, and operate applications reliably, powered by OSS you trust and Intelligence you control.

Ready to simplify delivery with Akuity?

Deploy, promote, and operate applications reliably, powered by OSS you trust and Intelligence you control.

Ready to simplify delivery with Akuity?

Deploy, promote, and operate applications reliably, powered by OSS you trust and Intelligence you control.

Sign Up for Akuity Updates

Practical guidance on MTTR reduction, GitOps at scale, and safe automation, with product updates from the Argo CD and Kargo team.

@2026 Akuity Inc. All rights reserved.

Akuity Inc. 440 N. Wolfe Road, Sunnyvale, CA 94085-3869 US +1-510-771-7837

SOC2 Type 2 Compliant

Sign Up for Akuity Updates

Practical guidance on MTTR reduction, GitOps at scale, and safe automation, with product updates from the Argo CD and Kargo team.

@2026 Akuity Inc. All rights reserved.

Akuity Inc. 440 N. Wolfe Road, Sunnyvale, CA 94085-3869 US +1-510-771-7837

SOC2 Type 2 Compliant

Sign Up for Akuity Updates

Practical guidance on MTTR reduction, GitOps at scale, and safe automation, with product updates from the Argo CD and Kargo team.

@2026 Akuity Inc. All rights reserved.

Akuity Inc. 440 N. Wolfe Road, Sunnyvale, CA 94085-3869 US +1-510-771-7837

SOC2 Type 2 Compliant