The tools that keep every change releasable and control how it reaches production: pipelines, approval gates, GitOps, release orchestration, progressive delivery and feature flags.
Continuous delivery means every change that passes the pipeline is ready to go to production, and releasing it is a decision rather than a project. The tools behind it build one artifact, promote it through staging and production, hold it at the gates you define and give you a way back when a release goes wrong.
This guide groups continuous delivery tools by the job they do in that release pipeline. If you want every passing commit to ship with no human step, the continuous deployment tools guide covers that end of the spectrum, and Argo CD alternatives goes deep on GitOps for Kubernetes.
The continuous delivery idea is that changes of every kind, features, configuration and fixes, reach production safely and quickly in a way the team can sustain. In practice that breaks down into a few properties of the release pipeline:
The DORA research ties these to measurable outcomes: change lead time, deployment frequency, change fail rate and failed deployment recovery time. Most release pipelines combine two or three of the tool types below rather than one product.
CI systems are where most release pipelines start. GitHub Actions has deployment environments with required reviewers, wait timers and branch rules, so a job targeting production pauses until someone approves it. GitLab CI/CD offers protected environments with deployment approvals and manual jobs (when: manual). Jenkins pipelines use the input step to pause a stage until a person confirms it.
These cover the common case of "deploy to staging on merge, promote to production on approval" with tooling the team already has. The gaps show up around the deploy itself: the pipeline usually runs Terraform, Helm or a cloud CLI, so environment drift, rollback and infrastructure changes are whatever those scripts do. The CI/CD pipeline guide walks through the stages in more detail.
Argo CD and Flux run inside a Kubernetes cluster and keep it in sync with manifests in Git. Promotion becomes a pull request that bumps an image tag in the production overlay, so the approval is a code review and the audit trail is the Git history. Rolling back is a revert.
GitOps fits teams already on Kubernetes that want deploys to be pull-based and declarative. It does not build artifacts or run tests, so it sits after a CI pipeline, and it only manages what lives in the cluster, which leaves databases, queues and cloud IAM to another tool. The Argo CD alternatives article compares the options in this group.
Spinnaker and Harness model releases as pipelines of stages that span environments, regions and clouds. Spinnaker's Manual Judgment stage pauses a pipeline for a human decision, and both tools support canary analysis and automated rollback across several deployment targets.
They earn their place in organizations with many services, strict change management or multi-region releases where a release is a coordinated event. For a single product team they add a system to operate that can outweigh the problems it solves.
Argo Rollouts and Flagger replace a Kubernetes Deployment's rolling update with canary or blue-green strategies. A rollout shifts a small share of traffic to the new version, queries metrics such as error rate and latency, and continues or aborts based on the result. That turns the production gate from a person clicking approve into an automated check against real traffic.
Both need a traffic layer that can split requests, an ingress controller or service mesh, and good metrics. The canary deployment and blue-green deployment guides cover the strategies themselves.
Feature flags separate deploying code from releasing a feature. A change ships to production behind a flag that is off, then turns on for internal users, a percentage of customers and finally everyone. OpenFeature is the CNCF standard API for flag evaluation, so application code does not lock into one flag vendor.
Flags make a small, frequent release pipeline safer, since the risky part of a release becomes a toggle you can flip back in seconds. They also accumulate, so plan to remove flags once a feature is fully on.
Encore combines an open source infrastructure SDK with a platform that provisions and deploys into your own AWS or GCP account. The release pipeline comes from the application itself: services, databases, queues and secrets are declared in code, and each environment deploys from a Git branch or a manual trigger, with the same declarations exercised locally, in a preview environment per pull request and in production.

For a continuous delivery setup, production gets Infrastructure Approval: any deploy that changes infrastructure, including IAM, waits until an Admin reviews and approves it. Staging can keep deploying every push to main. Encore also sends webhooks for rollout events, signed with a per-webhook secret, so the approval step and the result of each release can land in your team's channel:
Run in your terminal to get started locally.
// releases/releases.go
package releases
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"go.encore.dev/webhooks"
)
var secrets struct {
EncoreWebhookSecret string // signs webhook requests from the Encore platform
SlackWebhookURL string // incoming webhook for the releases channel
}
// Rollouts receives rollout events and posts the ones people act on.
//
//encore:api public raw method=POST path=/webhooks/encore
func Rollouts(w http.ResponseWriter, req *http.Request) {
payload, err := io.ReadAll(req.Body)
if err != nil {
http.Error(w, "bad request", http.StatusBadRequest)
return
}
event, err := webhooks.ParseEvent(payload, req.Header.Get("X-Encore-Signature"), secrets.EncoreWebhookSecret)
if err != nil {
http.Error(w, "invalid signature", http.StatusUnauthorized)
return
}
var msg string
switch data := event.Data.(type) {
case *webhooks.RolloutAwaitingInfraApprovalEvent:
msg = fmt.Sprintf("%s: commit %s is waiting for infrastructure approval",
data.Env.Name, data.Rollout.Build.CommitHash)
case *webhooks.RolloutCompletedEvent:
msg = fmt.Sprintf("%s: rollout of %s finished with %s",
data.Env.Name, data.Rollout.Build.CommitHash, data.Rollout.Conclusion)
default:
w.WriteHeader(http.StatusNoContent)
return
}
body, _ := json.Marshal(map[string]string{"text": msg})
resp, err := http.Post(secrets.SlackWebhookURL, "application/json", bytes.NewReader(body))
if err != nil {
http.Error(w, "notify failed", http.StatusBadGateway)
return
}
resp.Body.Close()
w.WriteHeader(http.StatusNoContent)
}
Set both values per environment type with encore secret set --type prod,dev EncoreWebhookSecret and encore secret set --type prod,dev SlackWebhookURL, then add the endpoint URL under Settings, Webhooks in the dashboard. Secret values live in Encore's secrets manager rather than the repository, and on AWS they are stored in Secrets Manager in your account. Failed webhook deliveries are not retried, and each event carries a sequence ID so a consumer can tell when one was missed.
When a change adds a cache or a topic, the deploy that carries it provisions ElastiCache or SNS and SQS on AWS, or Memorystore or Pub/Sub on GCP, and Encore provisions an IAM role for the service on AWS or a service account on GCP, so the infrastructure diff the approver reviews comes from the same commit as the code. When preview environments are enabled for the app, a coding agent's pull request can get its own environment so a reviewer can try the change against cloud services before it is merged and promoted.
Best fit: product teams that want staging on every merge and an approved, recorded path to production in their own AWS or GCP account, with infrastructure changes reviewed alongside the code that needs them.
Product teams that want staging and an approved path to production with infrastructure reviewed in the same commit can start with Encore and connect their AWS or GCP account.
Start from the gate you need in front of production and the place your workloads run:
Track the DORA metrics before and after a change to the pipeline, so a new tool is judged by change lead time and change fail rate rather than by how much it automates.
Continuous delivery keeps every change in a releasable state and promotes it through environments, with production release as a deliberate step such as an approval. Continuous deployment removes that step, so every change that passes the pipeline goes to production automatically.
CI systems with environment approvals (GitHub Actions, GitLab CI/CD, Jenkins), GitOps controllers (Argo CD, Flux), release orchestrators (Spinnaker, Harness), progressive delivery controllers (Argo Rollouts, Flagger) and feature flag systems built on standards such as OpenFeature.
In Encore, turn on Infrastructure Approval in the production environment's settings, so an Admin must approve infrastructure changes before the deploy proceeds. To route that step to chat, add a raw endpoint that parses webhooks.RolloutAwaitingInfraApprovalEvent from go.encore.dev/webhooks and posts it to your channel.
The DORA metrics are the usual starting point: change lead time, deployment frequency, change fail rate and failed deployment recovery time. A release pipeline that improves throughput but raises the change fail rate is not delivering more.
Deploy to your cloud on AWS and Google Cloud
without managing infrastructure
Encore lets developers and agents define application infrastructure directly in code, then automatically provisions it from local development to production in your AWS or GCP account.