Post

Deployment Anti-Patterns

Introduction

Deployment failures are rarely caused by a single bad commit. They are usually systemic: hidden coupling, manual steps, and inconsistent artifacts. This post catalogs anti-patterns that advanced teams should eliminate to keep deployment throughput high and risk low.

Anti-Pattern 1: Mutable Artifacts

Building a new artifact for each environment invalidates test results. A single immutable artifact should be promoted through environments with only configuration changes applied at runtime.

Anti-Pattern 2: SSH-Based Manual Deployments

Manual shell access breaks auditability and makes rollbacks unpredictable. Replace it with declarative deployment tools and tracked releases.

Anti-Pattern 3: Environment-Specific Branches

Branch-per-environment introduces merge conflicts and hidden drift. Use a single mainline and environment-specific configuration managed via sealed secrets and runtime settings.

Anti-Pattern 4: Configuration in Code

Hard-coded environment values lead to repeated redeployments and secrets exposure. Configuration should be externalized and injected at deployment time.

1
2
3
4
5
6
7
public sealed class DbOptions
{
    public string ConnectionString { get; init; } = string.Empty;
}

builder.Services.Configure<DbOptions>(
    builder.Configuration.GetSection("Database"));

The configuration values can now come from environment variables or a secret manager, not from a code change.

Anti-Pattern 5: Big-Bang Releases

Large releases reduce observability and make rollbacks dangerous. Progressive delivery, canary releases, and feature flags reduce impact radius.

Anti-Pattern 6: Ignoring Runtime Signals

Deployments should be gated on runtime telemetry. A release pipeline that ignores error rates and latency is equivalent to flying blind.

Replacement Patterns

  • Immutable artifacts with promotion-based deployment.
  • Infrastructure as Code for environments.
  • Progressive delivery with automated health checks.
  • Audit trails for every release action.

Summary

Eliminating deployment anti-patterns is mostly about consistency: build once, deploy consistently, and drive decisions using runtime signals. The payoff is lower change failure rate and faster incident recovery.

This post is licensed under CC BY 4.0 by the author.