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)
- Live deployment matrix with staleness indicators when a source stops emitting events.
- Immutable deployment timeline per application/environment (append-only events, not destructive updates).
- Multi-source ingestion from Spinnaker pipeline notifications, Argo CD application status, and CI workflow webhooks.
- 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.
1 public 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 }
1 from dataclasses import dataclass 2 from typing import Literal 3 4 @dataclass 5 class 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 13 def is_stale(last_event_ts: float, now: float, threshold_sec: float = 300.0) -> bool: 14 return (now - last_event_ts) > threshold_sec
1 export 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 12 export 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
Section Rescue Kit
Buzzwords to use:
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."