Development Basics

What Is App Deployment? Steps and Best Practices

What Is App Deployment? Steps and Best Practices

Rolling back a bad web release takes one command or one click on platforms such as Heroku and Vercel. The App Store has no such option. As of October 2026, Apple’s App Store Connect Help states that an App Store version cannot be reverted, so the fix ships as a new version and waits for review like any other.

That gap is the quickest way to see what app deployment is. It is the stage of the software delivery process that installs, configures and activates a tested application in a target environment, whether that target is a server, a cloud platform, an app store or a managed device. The target decides what a mistake costs.

Teams measure the result with five DORA metrics, among them deployment frequency and change fail rate.

What Is App Deployment?

Once a build has passed testing, deployment covers everything needed to get it running where it will live. That might be a server, a cloud platform, an app store or a fleet of managed devices. What changes between them is who controls the last step.

Copying files is the smallest part of it. The tested build first gets packaged into a versioned, installable unit. Environment variables, secrets and connection strings are then set for the target. After the package lands and the new version starts serving requests, health checks and smoke tests confirm that it actually responds.

That’s why a copied folder isn’t a deployment. Installation alone puts files on a machine, and nobody has checked the configuration or proved that anything works.

Within the app lifecycle, deployment sits between testing and maintenance. It starts with a tested build and ends when the live version passes verification.

Monitoring, patches and the next update all come after that point, and they belong to post-deployment maintenance.

How Does App Deployment Differ From Release and Delivery?

Small projects deploy and release in the same breath, so people use the two words as synonyms. Once a team ships often, they come apart. Deployment puts a version into an environment. Release exposes it to users.

Deployment versus release

Deployment is the technical side. The code runs in production, whether or not anyone can see it. A release is a business decision about when users get access, usually on a date that product and marketing picked.

Teams that rely on feature flagging deploy code with a feature switched off and turn it on later, with no new deployment. Productive’s engineering blog reports about 200 active feature toggles in its codebase, which is how it keeps deployment and release on separate schedules.

Flags aren’t free, though. Every toggle adds a branch to the code that someone has to delete after the release.

Continuous integration, delivery and deployment

These practices share one pipeline. They differ in where the automation stops.

PracticeWhat it automatesHuman approval before production
Continuous integrationBuild and test on every commitNot part of this practice
Continuous deliveryBuild, test and staging deploys, so every build stays deployableYes
Continuous deploymentEvery step through to productionNo

Continuous delivery keeps a person in the loop at the production gate. With continuous deployment, every passing build reaches production on its own.

That second option demands strong automated test coverage, since nothing human catches what the tests miss. Teams in finance and healthcare often stay on continuous delivery because the approval step doubles as an audit record.

A common middle path is to deploy automatically to staging and keep a manual gate for production.

What Are the Stages of App Deployment?

YouTube player

Every deployment moves through build, test, package, release candidate, deploy, verify, and monitor, and each stage hands the next one a specific output.

  1. The build turns source code into a build artifact.
  2. Unit, integration and regression suites run, and the result is a pass or fail report.
  3. Packaging gives the artifact a version number and turns it into an image, a bundle or a store upload.
  4. One tagged version gets chosen as the release candidate for promotion.
  5. The candidate is deployed, to staging first and then to production.
  6. Health checks and smoke tests confirm the new version responds.
  7. Once real traffic arrives, error rates and latency get watched.

A deployment pipeline chains these stages and starts each one only when the previous gate passes. The gates are usually automated tests and smoke checks, with a manual approval added by some teams.

The same build artifact should travel through every stage. Rebuilding per environment is how a staging success turns into a production surprise.

When a stage fails, check configuration before code. A missing environment variable, or a secret that exists only in staging, is a common culprit.

Development, Staging, and Production Environments

YouTube player

An app moves through development, staging, and production, in that order. Teams with a QA group often add a test environment between the first two.

  • Development is where developers run and change features, locally or on a shared server.
  • Staging copies production for final validation, and that includes a dry run of the deployment scripts.
  • Production is what real users reach.

Staging earns its cost because it tests the deployment itself, not only the app. Skip it and the first real run of your scripts happens in front of users.

Traditionally, weeks pass between deploys. The Twelve-Factor App methodology aims for hours, which is the point of its dev/prod parity factor.

The tooling gap is the easiest to picture. The methodology’s own example is a developer on Nginx, SQLite and OS X while production runs Apache, MySQL and Linux.

The fix is to run the same type and version of each backing service in every environment. That discipline is called environment parity, and it covers the database, the queue, the cache and the app itself.

The artifact stays identical from staging to production. Only configuration changes, supplied through environment variables.

Production is the only environment where mistakes cost users. A production environment usually has the strictest access controls, on top of real data and real traffic.

How App Deployment Differs by Delivery Channel

Who controls the final step depends on the target. You do on web and cloud. The app store does on mobile, and on managed devices an administrator does.

Web and cloud apps

Web deployments run on servers, containers, serverless functions or static hosting, and you pick the moment the new version goes live. That makes cloud-based apps the easiest case to automate end to end.

  • AWS CodeDeploy automates deployments to EC2 instances, on-premises servers, Lambda functions and ECS services.
  • With AWS Elastic Beanstalk you upload code, and it handles capacity provisioning, load balancing, auto scaling and health monitoring.
  • On Heroku, a git push to the Heroku remote deploys the main branch.
  • Vercel creates a preview deployment on every push, and a production deployment on each merge to the production branch.

The CodeDeploy documentation splits everything across EC2/on-premises, Lambda and ECS, its three compute platforms. Only EC2/on-premises supports in-place deployments, so Lambda and ECS releases go through traffic shifting instead.

Mobile apps

Mobile deployment ends at a store review, and review time sits outside your control. As of October 2026, Apple’s App Review Help states a goal of reviewing at least 50% of submissions in under 24 hours and 90% in under 48 hours.

Apple’s App Review overview page says something faster. On average, 90% of submissions are reviewed in under 24 hours. One page states a goal and the other states an outcome, so budget 48 hours and treat anything quicker as a bonus.

Google adds its own gate for new accounts. Anyone publishing an app on Google Play from a personal account created after November 13, 2023 must first run a closed test with at least 12 testers opted in for 14 continuous days, according to Google Play Console Help.

  • TestFlight takes up to 100 internal and 10,000 external testers per app, and each build expires after 90 days (Apple, App Store Connect Help).
  • Firebase App Distribution sends pre-release APK, AAB or IPA builds to trusted testers on both platforms.
  • Staged rollouts in the Google Play Console release to a percentage of users, which you raise by hand.

One limit to know about. Halting a staged rollout stops further users from receiving the build, but devices that already installed it keep that version until a fixed one ships.

Enterprise apps on managed devices

Microsoft Intune deploys apps by assigning them to groups of users or devices. The administrator, not the user, decides what gets installed.

An app assigned as required gets installed by Intune on devices in the selected groups, though only enrolled devices qualify. Available works the other way round. Users pick the app from the Company Portal, and the “available with or without enrollment” option extends that to unenrolled devices.

Not every app type supports every assignment option, according to Microsoft Learn. Reporting has limits too. For Android apps assigned as available with or without enrollment, status data exists only for enrolled devices.

App Deployment Tools and Automation

Automate any deployment you run more than a handful of times. Manual deployment only pays off for one-off internal apps, where writing the script costs more than the hand work it replaces.

Manual versus automated deployment

By hand, a person works through a checklist. Steps get skipped, and no two runs are guaranteed to match. A pipeline runs the same steps in the same order every time, and a failed gate stops the run before production.

Jenkins documents the pattern plainly. Its Deploy stage executes only if the Build and Test stages succeeded, otherwise the pipeline exits early.

CI/CD servers

YouTube player

Each of these servers keeps the pipeline definition as code, next to the application.

ToolPipeline defined inDeployment control
JenkinsJenkinsfile in source controlStages run in order, a failed stage stops the run
GitHub ActionsWorkflow files in the repositoryEnvironments with required reviewers and wait timers
GitLab CI/CD.gitlab-ci.ymlEnvironments with deployment history and manual deploy jobs
Azure DevOps PipelinesYAML pipelinesRelease gates, deploys to any platform or cloud

GitHub Actions adds an approval layer through environments. One reviewer from the required list is enough to release a job, and the environment’s secrets stay locked until every protection rule passes.

Pick the server that sits next to your repository. Moving hosts for one CI feature rarely pays back.

Containers, orchestration and infrastructure as code

YouTube player
  • Docker bundles the app and its dependencies into an image, and a container is a running instance of that image.
  • Kubernetes replaces running containers through Deployments, using rolling updates by default and a Recreate option that accepts downtime.
  • Helm packages Kubernetes manifests into releases, and every upgrade creates a revision.
  • Argo CD treats a Git repository as the source of truth and flags any cluster whose live state drifts from it.

Intuit is on the Argo CD project’s official list of users (USERS.md in the project repository).

Terraform provisions infrastructure from code. The plan command previews the changes, apply makes them, and a state file tracks what exists. Ansible configures servers over SSH with idempotent playbooks and installs no agent on the target.

Building environments from infrastructure as code keeps staging and production defined in one place, so they do not drift apart when the team changes.

On the mobile side, Fastlane scripts the store work, with gym for builds, deliver for App Store uploads and supply for Google Play.

Deployment Strategies and How to Choose One

YouTube player

Recreate, rolling, blue-green and canary cover most deployments. They differ mainly in how the old version leaves and what a rollback costs.

How the strategies compare

The table assumes a web service you control end to end.

StrategyDowntimeRollbackBreaks down when
RecreateYes, during the swapRedeploy the old versionUsers need the app during the swap
RollingNone, if health checks passRoll the old version out againOld and new versions cannot run together
Blue-greenNoneSwitch traffic backThe database cannot serve both versions
CanaryNoneReturn traffic to the old versionTraffic is too low to reveal a problem

In a blue-green deployment two identical environments run side by side, and traffic moves between them in one step. Rolling and canary releases move in slices instead.

Platform limits apply. In CodeDeploy’s EC2/on-premises platform, blue-green works with EC2 instances only, so servers in your own facility fall back to in-place updates.

Pros and cons of each strategy

Recreate

No two versions ever run together, so there’s no compatibility work. The cost is downtime while the old version stops and the new one starts.

Rolling

Availability holds because instances swap one batch at a time, and there’s no spare environment to pay for.

The catch is that a bad version reaches every batch unless health checks halt the rollout. Old and new versions also serve traffic together mid-rollout.

Blue-green

Rollback is a traffic switch back to the old environment. A second full environment costs money for as long as both exist.

Canary

A bad version hurts only a small share of users. You do need monitoring that spots problems, and enough traffic to show them.

Martin Fowler classes canary releases and blue-green as applications of one pattern, parallel change, where old and new versions run side by side while users move over. The price is that code and database must work with both versions at once.

Choosing a strategy

Pick by constraint, not by fashion.

  • Recreate suits an internal tool with few users, where a maintenance window is fine.
  • Rolling fits a stateless service with no spare budget.
  • Blue-green is the answer for zero downtime and fast rollback, if you can pay for two environments.
  • Canary needs high traffic and monitoring you trust.
  • Mobile apps should use the store’s staged release instead, such as Apple’s phased release, which spreads an update over 7 days and can be paused (App Store Connect Help).

A canary deployment sends a small share of traffic to the new version first and widens it while the metrics stay clean.

Canary is the fashionable choice, and for low-traffic apps it is the wrong one. A small slice of a small user base proves nothing.

Why Do App Deployments Fail, and How Does Rollback Work?

Deployments often fail for reasons that have little to do with the code itself.

A rollback returns the previous version when the cause is code or configuration. It cannot bring back deleted data or a destroyed release, and it cannot pull an installed mobile build off a user’s phone.

Plan rollback in deployment before the first release, and test it in staging like any other step.

Common causes of failed deployments

  • Configuration that exists in staging but not in production
  • A database migration that the previous version cannot read
  • A missing secret, token or permission
  • A dependency version that differs between environments
  • A manual step that was skipped or run out of order

Rollback methods by platform

On Kubernetes, kubectl rollout undo returns a Deployment to its previous revision. The rollback runs through the Deployment’s update strategy, a rolling update by default, so it is not instant.

Helm’s rollback command takes a release name and an optional revision, and with no revision it goes back one. Helm’s documentation lists a default of 10 saved revisions per release.

Running heroku rollback creates a new release that copies the slug and config vars of the older one.

Vercel’s Instant Rollback points the production domain back at an earlier deployment. On the Hobby plan, only the previous production deployment is eligible, per the Vercel docs.

When rollback does not work

Rollback restores code. It does not restore data.

  • A destructive schema change cannot be undone by redeploying the old version. Fowler’s parallel change pattern splits it into expand, migrate and contract phases, and removes the old structure only after every client has moved.
  • Heroku’s docs state that its rollback command does not restore everything, and should be used only when absolutely necessary.
  • The App Store has no revert. Apple’s App Store Connect Help says a previous version cannot be restored, so the fix ships as a new version submitted for review.
  • Helm drops revisions beyond its history limit, so a rollback target can disappear.

Rollback or fix forward?

Rolling back makes sense when the cause is unknown, the fix still needs review, and the previous version works with the current data.

Fixing forward wins once a migration has already changed the data, the build sits on user devices, or the patch is a one-line change.

A feature flag is the third option. Switch the change off and leave the deployment in place. Unplanned fix deployments also feed deployment rework rate, a DORA metric.

How Is App Deployment Performance Measured?

YouTube player

Teams measure deployment performance against the DORA metrics, which are change lead time, deployment frequency, failed deployment recovery time, change fail rate, and deployment rework rate. DORA is a DevOps research program that now publishes through dora.dev as part of Google Cloud.

What each metric measures

Three of them cover throughput. Change lead time runs from commit to successful production deployment, deployment frequency is how often you ship, and failed deployment recovery time is how long it takes to get back to normal.

The other two cover instability. Change fail rate is the share of deployments that need immediate intervention, and deployment rework rate counts unplanned deployments that respond to production incidents.

Older guides still file recovery time under stability, a holdover from the four-metric model. As of October 2026, dora.dev places it under throughput.

Benchmarks and why they disagree

Benchmark figures get mixed up constantly, so each one below is tied to its report year.

  • dora.dev currently lists five metrics.
  • In 2019, elite teams had a change failure rate under 15%, against 46-60% for low performers (Martin Fowler’s summary of the 2019 State of DevOps Report).
  • The 2024 report put elite teams at 182 times more deployments and an 8 times lower change failure rate than low performers (Octopus Deploy’s analysis of the 2024 DORA report).
  • The 2025 report moved to distributions of survey responses for each metric and seven team profiles, not four fixed tiers (DORA, State of AI-assisted Software Development).

Vendor guides mix these years freely. One quotes 0-15% as the elite change failure rate, another quotes 5%, and both attribute the number to DORA.

The gap is real, because thresholds moved between report years. In the 2024 clusters the high cluster showed a higher change failure rate than medium, according to Octopus Deploy.

Quote a threshold only with its report year. Better still, track your own trend first and treat the tiers as context.

How to count them

  • Count deployments per service, not per repository, so busy services do not hide slow ones.
  • Define a failed deployment before collecting any data (an incident, a rollback or a hotfix).
  • Divide failed by total, so 1 failed deployment out of 4 is a 25% change fail rate.

Read speed and stability together. Raising deployment frequency by cutting tests shows up fast as a higher change fail rate.

DORA’s 2025 report adds a warning of its own. AI adoption now links to higher throughput but still has a negative relationship with delivery stability. Rising frequency alone proves little.

App Deployment FAQ

Who is responsible for app deployment?

The developers who wrote the app share the job with operations. In small teams one person does both.

The Twelve-Factor App methodology asks developers to stay closely involved in deploying their code, which makes collaboration between dev and ops teams matter more than any job title.

What is shadow deployment?

A shadow deployment copies live production traffic to a new version while users keep getting responses from the old one. The shadow version’s responses are discarded.

It suits read-heavy traffic. Writes need isolated data, because a duplicated request would otherwise run twice against the same records.

What belongs on a deployment checklist?

A workable checklist has a tested build artifact, environment variables and secrets set for the target, a rollback path tested in staging, health checks with smoke tests, and monitoring of error rate and latency.

Add an approval step wherever the production gate is manual.

Can a small team deploy without a CI/CD pipeline?

Yes. A script, or a platform that deploys on push, covers a small team.

Heroku deploys with a git push to its remote, and Vercel creates a production deployment on every merge to the production branch. Add a pipeline once manual steps start getting skipped.

What a Team Deploying by Hand Should Change First

A team that runs app deployment by hand should script it first, so every run executes the same steps against the same build artifact. A script turns each failure into something repeatable and therefore diagnosable.

The order after that matters.

  1. Script the deploy.
  2. Rehearse the rollback in staging.
  3. Add a pipeline with health checks and approval gates.

Rollback comes before the pipeline because a pipeline raises release frequency, and more releases produce more failures that need a way back. The pipeline comes last because automating an unrepeatable process only repeats its errors faster.

The trade-off is upkeep. Scripts and pipelines need an owner, and the first releases run slower while smoke tests and gates are written.

This order holds for services you control. Store-distributed apps swap step two for a staged release and a prepared hotfix, until Apple adds a revert option to App Store Connect (verified October 2026).

Bogdan Sandu

Stay sharp. Ship better code.

Every week: one curated article, one tool worth knowing, one tip you can use tomorrow. No noise, no padding.