Design Deployment Dashboard

Medium35 min
1 / 30
understanding6 min read

Problem Statement: Unified Deployment Visibility

Problem Statement: Unified Deployment Visibility — deployment dashboard system design

Problem Statement: Unified Deployment Visibility

Enterprises run Spinnaker, Argo CD, GitHub Actions, and bespoke scripts in parallel. During an incident, on-call engineers waste minutes opening three UIs to learn what version is live in prod. Your design is a deployment dashboard: an aggregation control plane that normalizes CD events, materializes authoritative current state per (application, environment), and exposes guarded promote/rollback actions—without replacing underlying CD engines.

Who uses it and why now
  • Release engineers need a matrix: service × environment × cluster/region with git SHA, image digest, deploy status, and last change time.
  • Service owners want self-service visibility into their team's queue without paging platform for every question.
  • Incident commanders need a correlated timeline: commit → build → artifact → deploy stage → post-deploy health within one click path.
Core capabilities (in scope)
  1. Live deployment matrix with staleness indicators when a source stops emitting events.
  2. Immutable deployment timeline per application/environment (append-only events, not destructive updates).
  3. Multi-source ingestion from Spinnaker pipeline notifications, Argo CD application status, and CI workflow webhooks.
  4. Action façade that calls existing CD APIs (promote, rollback, cancel) behind RBAC and approval policies.
Explicit non-goals
  • Replacing Spinnaker Deck or Argo CD UI for deep manifest debugging.
  • Owning build systems or artifact storage (link out by digest/URL).
  • Running kubectl exec or shell access from the dashboard.
Scale anchors to state aloud

Assume 350 microservices, 8 clusters, 4 environments (dev/stage/canary/prod) → ~11,200 matrix cells. Ingest ~25 webhook events/sec peak (Friday deploy window), ~180k events/day retained 90 days (~16M rows). Dashboard read API target p95 < 250 ms for matrix slice; WebSocket fan-out < 2 s from event commit to UI.

javaOne Dark Pro
1public final class DeploymentEventNormalizer {
2 public NormalizedEvent fromArgoNotification(JsonNode payload) {
3 String app = payload.path("application").asText();
4 String phase = payload.path("status").path("operationState").path("phase").asText();
5 DeploymentStatus status = "Succeeded".equals(phase) ? DeploymentStatus.SUCCEEDED : DeploymentStatus.RUNNING;
6 return new NormalizedEvent(app, status, payload.path("commitSha").asText(), payload.path("id").asText());
7 }
8}
pythonOne Dark Pro
1from dataclasses import dataclass
2from typing import Literal
3
4@dataclass
5class CurrentDeployment:
6 application_id: str
7 environment_id: str
8 version: str
9 git_sha: str
10 artifact_digest: str
11 status: Literal["pending", "running", "succeeded", "failed", "rolled_back"]
12
13def is_stale(last_event_ts: float, now: float, threshold_sec: float = 300.0) -> bool:
14 return (now - last_event_ts) > threshold_sec
typescriptOne Dark Pro
1export interface DeploymentMatrixCell {
2 applicationId: string;
3 environmentId: string;
4 version: string;
5 gitSha: string;
6 artifactDigest: string;
7 status: "pending" | "running" | "succeeded" | "failed" | "rolled_back";
8 lastUpdatedAt: string;
9 sourceStale: boolean;
10}
11
12export function canRollback(role: string, env: string): boolean {
13 if (env === "prod") return role === "deploy-admin";
14 return role === "deploy-operator" || role === "deploy-admin";
15}
Opening line for the whiteboard

"I will optimize for trustworthy current state and fast incident triage: event-sourced timelines, idempotent webhook ingestion, and RBAC-wrapped actions on top of Spinnaker/Argo—not another CI runner."

How to open this one

The framing that signals depth on a deployment dashboard is a single pane that answers what is deployed where, right now, across every service and environment — sourced from the deploy controllers via event-sourced ingestion, not hand-maintained. Lead with the read model aggregated from many sources with explicit staleness indicators, and the failure story that proves it: during an incident a source stops emitting, the matrix goes stale, and on-call rolls back the wrong version. That shows you understand the dashboard is an operational tool whose value is correctness under pressure, not pretty charts.

Key Highlights

  • Idempotent ingestion on pipeline execution_id
  • Separate observed health from declared deploy success
  • Staleness banners when source CD API unreachable
State assumptions
Quantify verification duration and rollback SLO before drawing boxes.
Fail open trap
Passing deploys without metrics is how customer-impacting regressions slip through.

Section Rescue Kit

Buzzwords to use:

Deployment matrixIdempotent ingestion

Safe statements:

  • "I will separate event ingestion, current-state materialization, and action APIs before UI polish."
  • "Happy to deep dive Spinnaker vs Argo adapters or prod rollback RBAC—your choice."
Design Deployment Dashboard - System Design | WinJob | WinJob