Post

State of DevOps: Product Planning

Roadmap, MVP and milestones for State of DevOps: a solo build for 8-10 months, then a team, then the enterprise-wide health scorecard.

State of DevOps: Product Planning

State of DevOps was planned by one person for most of its first year. I built it as an individual contributor, and the DevOps team started contributing after 8 to 10 months of continued development. That shaped every planning decision: the plan had to fit one person’s evenings and gaps between other work, and the code had to be easy enough for a team to pick up later without a rewrite.

Product roadmap

The roadmap has three horizons. Only the first is done.

HorizonWhat it deliversStatus
1. DevOps scorecardDaily analysis of repos, pipelines, IaC, GHAS, enterprise policies and cost across four GitHub orgs; dashboard; trends; Jira integrationLive
2. Team-owned and hardenedDevOps team contributing; HA dashboard with autoscaling; dependency-based scheduling; data retentionIn progress (this playbook proposes several items)
3. Enterprise health scorecardBest practices of SRE, CloudOps, platform architecture, database and other teams mapped against real infrastructure; one score and progress card covering best practices, security and compliancePlanned

Horizon 3 is the reason the architecture is a set of independent analyzers writing to a common storage layout. A database-practices analyzer or an SRE analyzer is “just another cronjob” plus a dashboard tab.

TODO: Is there a target date or funding decision for the enterprise scorecard phase, and which team’s best practices will be onboarded first?

MVP definition

For a solo build, the MVP has to be the smallest thing that changes a conversation. My definition for a project like this:

  • One collector that caches repository data for all orgs.
  • One analyzer (repo hygiene) with a handful of checks people already argue about: branch protection or rulesets, CODEOWNERS, README.
  • A dashboard with an org list and a repo detail page.
  • Daily runs on the cluster, output stored by date so history starts accumulating on day one.

Everything else (trends, cost, GHAS, Jira) is valuable, but none of it is needed to replace “I think most repos have branch protection” with a number.

TODO: What exactly was in the first version that went live, and when did it go live?

Release milestones

Releases are per component, not per product. Each cronjob and the dashboard has its own image tag, recorded in versions.yaml at the repo root, and its own Helm chart version in Chart.yaml. A release-versioning workflow bumps versions.yaml when a chart is promoted.

That gives two kinds of milestone:

KindExampleMarked by
Component releasedevops-ghas-analyzer adds Dependabot coverageNew image tag + chart version
Product milestone“All daily analyzers live”, “Trends live”, “Team onboarded”A set of component releases

TODO: Add the real product milestones with dates (first analyzer live, dashboard live, trends, cost, DevOps team onboarding).

Backlog structure

Jira is already in the picture: the dashboard creates Jira stories from findings, and Jira epics map to applications in the Applications tab. I’d structure the backlog in three layers to match:

  • Platform epics, one per component (devops-repo-analyzer, devops-state-dashboard, …) for features and bugs in the tool itself.
  • Remediation stories, created from the dashboard against the owning team’s backlog: “Add CODEOWNERS to repo X”. These are the point of the whole project.
  • Scorecard epics for horizon 3, one per participating team.

Keeping remediation work out of the platform backlog matters. The DevOps team owns the measuring; the repo owners own the fixing.

Prioritization approach

Two questions decide what comes next:

  1. How many people ask this question today? A check that answers a weekly question beats a clever check nobody asked for.
  2. Is it audit or security relevant? Anything that produces HIPAA, PCI or IT audit evidence moves up, because it saves the most painful manual work.

For the tool’s own backlog, reliability beats features once people depend on it. A missed nightly run the week before an audit costs more trust than a missing chart.

Budget and resource planning

The running cost is small because the design avoids always-on compute:

ItemCost driver
13 cronjobsShort-lived pods once a day or week on a shared AKS cluster
DashboardOne pod at 100m CPU / 128 Mi request (more once autoscaling is on)
Azure FilesStorage for daily JSON outputs kept indefinitely
RedisAzure Cache for Redis in AKS
JFrog, GitHubExisting enterprise subscriptions; images and API calls only

People were the real budget: one engineer for 8 to 10 months, then a share of the DevOps team.

TODO: What was the budget or time allocation (for example “20% of one engineer”), and what does the stack cost per month on Azure?

Risk and dependency management

RiskLikelihoodImpactMitigation
One person knows everything (first 8-10 months)HighHighDocs per component, Taskfile for every operation, team onboarding
GitHub API rate limitsMediumMediumCentral collector with ETag caching, per-org GitHub Apps, retries with backoff
Jobs chained by clock, not by dependencyMediumMediumMove to dependency-based triggers (see Continuous Improvement)
Shared Azure Files outageLowHighAnalyzers re-run idempotently; dashboard falls back to its Redis cache; share snapshots for restore
Scope creep from the enterprise scorecardHighMediumKeep horizon 3 as a separate phase with its own sponsor
Wrong numbers erode trustMediumHighTest fixtures per analyzer, metadata.json with versions and timestamps

Dependencies on other teams are few but critical: GitHub org admins (App installs), the AKS platform team (cluster, Azure Files, External Secrets, ArgoCD), and JFrog and Azure billing owners for cost data.

Change-control process

Change control is GitOps. Every change goes through a pull request; CI builds the image, runs SonarQube, and the chart is promoted; ArgoCD syncs it to AKS. Nobody kubectl applys to production.

Two escape hatches exist for fast iteration in the cloud, and both keep Git as the source of truth:

1
2
3
task dev-pause -- devops-ghas-analyzer   # pause ArgoCD auto-sync for one app
task dev-push  -- devops-ghas-analyzer   # build + push to JFrog, update chart, resume sync
task dev-status                          # check sync status

Changes to what is measured (a new check, a changed threshold such as the 365-day stale rule) deserve more care than code changes, because they move the numbers executives watch. I’d announce them with the release notes and mark the date on the trend charts, so a sudden jump isn’t read as progress.

Checklist

  • Roadmap horizons written down, with the enterprise scorecard as a separate phase
  • MVP scope and go-live date recorded
  • versions.yaml and chart versions bumped by the release workflow on every promotion
  • Platform backlog separated from remediation stories
  • Risk register reviewed each quarter
  • Rule changes (thresholds, new checks) announced and annotated on trend charts
  • Bus-factor risk closed: at least two people can release every component

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