Files
magnus919_agent-skills/release-engineering/references/release-operations-and-triage.md
T
usernameandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> 2b906565d4 fix(release-engineering): address review findings in DORA asset, cadence, link, metrics script
- Correct the DORA 2024 thresholds table (Elite/High/Medium/Low) and the
  2025 caveat (seven archetypes, report rename; DRR added in 2024) in
  assets/dora-metrics-reference.md to match references/metrics-and-dora.md
- Fix Firefox cadence to the 2-week train and align GitLab's release day
  with the third-Thursday fact in references/release-process-models.md and
  references/release-operations-and-triage.md
- Fix the dead versioning-decision-table.md link in templates/release-plan.md
  to point at ../assets/versioning-decision-table.md
- Scope the deployment-frequency observation window to the selected
  environment, clamp negative change lead time at 0, and require a recovery
  deployment to start at or after the failed deployment finished in
  scripts/dora_metrics.py
- Make the metrics-and-dora.md worked example internally consistent
  (21 total deploys, DRR = 3/21 = 14.3%)
- Reword the version_bump.py docstring to describe the implemented
  pre-release behavior instead of unimplemented graduation
- Add tests for environment-scoped window, CLT clamp, and recovery
  candidate ordering (114 tests pass under pytest and unittest)

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-01 23:07:49 -04:00

24 KiB
Raw Blame History

Release Operations and Triage

How large projects actually run releases: the ceremony mechanics of four well-documented release trains (Chromium, Firefox, GitLab, Ubuntu), the shared patterns behind them, coordination roles, pipeline debugging, release-infrastructure reliability, environment parity, and the state of AI/agent-assisted release automation in 20252026.

Release Train Ceremony Mechanics

Chromium: 4-Week Milestones with Weekly Security Refreshes

Chrome ships a new milestone to stable every 4 weeks: 4 weeks of development on main (starting at the previous milestone's branch point), a branch cut, then 4 weeks of stabilization on the milestone branch, then staged rollout to stable. Key mechanics:

  • Channels: Canary (daily, most unstable) → Dev → Beta → Stable, plus Extended Stable — every other milestone maintained for 4 extra weeks with backported security fixes (8-week cadence, Windows/Mac enterprise only, biweekly refreshes).
  • Weekly stable "refreshes" carry security fixes forward to keep the patch gap short.
  • Staged rollout: a release generally reaches all users within 12 weeks unless major issues arise; staged rollouts compare two identical builds that differ only in build number for statistical signal.
  • Cycle checkpoints: Branch Point (features must be code-complete, strings landed, beta blockers addressed; incomplete features are punted) → Beta Promotion (4 weeks in beta with weekly builds) → Early Stable Cut (early release candidate to a small % of stable users; all stable blockers fixed) → Stable Cut/Promotion → weekly Stable Refresh.
  • Dates flex for coverage: branch-point dates are fixed but adjusted to avoid shipping around major holidays so coverage is maintained.
  • Merge (cherry-pick) governance: all code lands on trunk; every merge to a release branch is gated because it "introduces risk and costs time." Release managers (and security delegates) review all merges, with criteria that tighten as the stable date approaches: beta phase (Finch-gated fixes, new regressions, release blockers, security issues, emergency string changes) → stable phase (urgent regressions, release blockers, medium+ security) → extended phase (medium+ security only). Automation (Blintz) does first-pass triage and may auto-approve; release managers answer within 2 business days; missed merges of release-blocking fixes are flagged.

Firefox: 2-Week Trains with Flag-Driven Uplifts

  • Cadence: the standard release interval is two weeks (may be lengthened around holidays). Nightly builds flow from firefox-main roughly every 12 hours; every 2 weeks, main merges to firefox-beta, after which the beta branch takes stabilization patches only.
  • Beta releases ship ~3x/week for Desktop → about 5 betas per cycle, unless emergency "chemspills" (unplanned betas) are needed. At cycle end, the final build is QA-validated and tagged into firefox-release.
  • Channels/repos: firefox-main (Nightly), firefox-beta (+ Devedition), firefox-release, firefox-esr (ESR for enterprises).
  • Uplift process is flag-driven: a developer sets tracking-firefoxXX: ? to nominate; Release Management sets tracking-firefoxXX: + if it should block the release; the patch is nominated with approval-mozilla-beta/release: ?; on +, sheriffs or release managers land it on the branch and ensure Treeherder is green. relnote-firefox nominates release-note changes; "nag emails" chase owners of tracked blockers.
  • Merge day: at the end of the beta cycle, release management emails release-drivers requesting the main→release merge; anything needing uplift must be nominated before the RC build. Security bugs follow a separate security-approval process.
  • Mobile: Android RC builds push to production at 5% rollout after QA signoff, bumped to 25% on the official release date to match Desktop.

GitLab: Monthly Self-Managed Releases Off Continuous Delivery

  • Two-part model: a monthly self-managed release (XX.YY.0) plus continuous delivery on GitLab.com, where auto-deploy packages built from master deploy multiple times per day.
  • Release day: the self-managed release ships on the third Thursday of each month (with a one-week delay if needed); patches land twice a month (scheduled) plus unplanned critical patches as needed; the stated priority of both processes is "GitLab availability & security."
  • Flow: engineer merge → pipeline packages an auto-deploy package (multiple/day) → deployed to GitLab.com if no Production Change Locks or unhealthy environments → changes that succeed on GitLab.com become the release candidate for self-managed → RC runs automated QA in test environments → RC tagged and published. All changes must deploy to GitLab.com before they are considered for a self-managed release — dogfooding is the gate.
  • Patch ceremony: e.g., an Early Merge Phase on Mondays where release managers deploy security fixes to GitLab.com; MRs labeled ~"security-target" link to the security tracking issue.

Ubuntu: 6-Month Cycle with a Graduated Freeze Ladder

  • Cadence: strict time-based release every 6 months (since 2004), LTS every ~2 years. The freeze ladder is a sequence of progressively tighter gates, with exceptions granted only by the Release Team:
    1. Debian Import Freeze — automatic imports from Debian unstable stop; imports must be explicitly requested.
    2. Feature Freeze — no new features, packages, or API/ABI changes; bug-fix-only uploads allowed if documented.
    3. UI Freeze — default-app UI, artwork, and user-visible strings frozen (for docs/translation).
    4. Documentation String Freeze and Kernel Feature Freeze — docs frozen for translation; kernel feature-complete.
    5. Hardware Enablement FreezeBeta Freeze — all uploads queued and subject to manual Release Team approval; after beta ships, the archive rolls back to Feature + UI freeze status.
    6. Kernel Freeze → translation deadlines → Final Freeze — "extremely high-caution": only release-critical, security-critical, or exceptional fixes, confirmed by the Release Team; near release, uploads go to the -proposed pocket and the Release Team cherry-picks into -release.
    7. Release Candidate — images built Monday of release week; ideally RC == final release.
  • Post-release: the SRU (Stable Release Update) process governs fixes; each upload must reference at least one bug.

Shared Mechanics Across All Four

Lever Pattern
Cadence choice Time-based (fixed calendar) beats feature-based: Chromium 4w, Firefox 2w, GitLab monthly, Ubuntu 6m. Dates fixed; scope flexes
Branch cut A cut from the development line creates a stabilization branch (Chromium milestone branch, Firefox firefox-beta, GitLab RC tag, Ubuntu archive freezes). New features stop at the cut
Stabilization window Dedicated period where only bug-fix/stabilization patches land, gated by criteria that tighten over time (Chromium beta→stable→extended; Ubuntu graduated freezes; Firefox beta uplift rules)
Backport approval Formal nomination + approval gate with named approvers (Chromium release managers + Blintz automation; Firefox tracking/approval flags + sheriffs; Ubuntu Release Team exceptions; GitLab security-target label + release managers). Criteria escalate with risk and branch age
Readiness / go-no-go Staged rollout with explicit signoffs (Chromium Stable Cut, Firefox QA on RC, Ubuntu Final Freeze + RC, GitLab automated QA + Production Change Locks)
Staged rollout Ship to a fraction first, monitor, expand (Chromium staged %, Firefox Android 5%→25%, GitLab.com before self-managed)
Coverage awareness Dates adjusted for holidays and staffing coverage (Chromium explicit; Firefox "lengthened for holidays")

Coordination Roles and Ceremonies

  • Release Manager (RM) / DRI: the operational single-threaded owner. GitLab runs RMs on a rotation/schedule with explicit escalation paths and public permissions; Chromium release managers review/approve/reject every branch merge within 2 business days; Firefox Release Management sets tracking flags and lands approved uplifts via sheriffs.
  • Sheriffs / release drivers: Firefox sheriffs land approved patches and keep Treeherder green; a release-drivers channel and mailing lists coordinate across teams.
  • Delegates: the security team acts as a merge-approval delegate for security fixes (Chromium).
  • Ceremonies: milestone kickoff/planning → recurring status (GitLab's weekly delivery-metrics review — MTTP, deployment blockers, Deployment SLO, DORA metrics, auto-deploy dashboards; Firefox channel meetings and nag emails) → branch cut → stabilization with readiness tracking → go/no-go (cut/RC signoff) → staged promotion → refresh/patch cadence.
  • Communication surfaces: Slack/Matrix channels (#releases, #release-drivers), dashboards (Chromium Dash, GitLab Grafana + DORA analytics, Firefox release calendar), and issue-tracker queries for blockers.

The recurring roles across all four projects:

Role What they do Example
Release Manager (RM) / DRI Single-threaded owner of a given release; approves backports, drives go/no-go, owns escalation GitLab rotating RMs; Chromium RMs approving every branch merge; Firefox Release Management
Sheriff / release driver Lands approved patches, keeps the tree green, chases blockers Firefox sheriffs; Chromium build sheriffs
Security delegate Approves/lands security fixes on release branches under a faster path Chromium security team as merge delegates
QA sign-off Validates the RC before promotion Firefox final-build QA; GitLab automated QA on RC
Automation (first-pass triage) Screens merge requests against criteria, flags missed merges Chromium Blintz (formerly Sheriffbot)

Ceremony lifecycle (the recurring rhythm): kickoff/milestone planning → recurring status (metrics review, channel meetings) → branch cut (feature-complete gate) → stabilization with readiness tracking → go/no-go (cut/RC signoff) → staged promotion → refresh/patch cadence → next cycle kickoff.

Debugging Release Pipelines

Failure Taxonomy

Failure mode Symptom First response
Flaky tests Intermittent pass/fail unrelated to the change — the #1 time sink Quarantine, retry-with-backoff, root-cause (timing, shared state, resource contention)
Cache poisoning / stale cache Corrupt or stale build/dependency cache produces failures or wrong artifacts Invalidate and rebuild; pin cache keys
Version / dependency drift Unpinned deps or toolchains resolve differently across runs ("works on my machine") Pin versions; enforce lockfiles
Secret rotation Expired/rotated tokens cause auth failures mid-pipeline Scoped tokens, rotation runbooks, secret lifecycle management
Runner exhaustion Saturated runner pool, pod timeouts, resource contention Capacity planning, queue observability, autoscaling
Registry/rate limits Docker Hub/registry pull limits, API timeouts Proxy/mirror registries, retry policy, quota monitoring
Environment mismatch / permissions Env vars, file permissions, OS differences between runner and prod Enforce parity (see below); CI matrix vs. prod

Change-vs-Pipeline Triage

The core question for any pipeline failure: is it the change or the pipeline? Workflow:

  1. Reproduce/replay the run; compare against a known-green baseline run.
  2. Read logs first — find the first failure (earliest level=error), trace backward via correlation IDs / job IDs.
  3. Bisectgit bisect for code; re-run individual jobs/stages to isolate the failing step.
  4. Correlate across systems — match CI logs → container logs → deploy logs with shared correlation IDs.
  5. Classify transient vs. systemic — roughly 60% of CI failures are transient (timeouts, rate limits, network, resource contention) → retry-with-backoff and record the rationale; systemic → fix.
  6. Watch intermittent signals — warnings/retries/degraded performance preceding a failure often point to environment/config issues.
  7. Check external dependencies — third-party API and cloud timeouts.

Rerun vs. fix: rerun only when the failure is transient/flaky and isolated; fix when systemic, reproducible, or tied to the change. Never blind-rerun — classify with observability first. The observability substrate: structured JSON logs (timestamp/level/service/message/correlation_id) shipped to Loki/Promtail or ELK; Prometheus metrics + Grafana dashboards; OpenTelemetry traces; and exemplars that jump from a metrics spike straight to the relevant log lines. Retention and rotation (logrotate, Loki retention, ES ILM) are part of the design, not an afterthought — you will need history when a release incident surfaces days later.

Deploy-Time Failure Recovery

When a deployment fails in production, the recovery options in rough preference order:

  1. Revert / roll back — simplest, when a viable rollback target exists. Disable the feature flag, remove the new version from the load-balancer pool, restore the previous artifact. "Wherever possible, reverting a change causing a customer incident should be the initial plan of attack."
  2. Failover to secondary/DR environment — when there is no change in play (external cause) or rollback is onerous: promote the DB leader, reroute traffic.
  3. Fix forward — last resort: customers stay impacted until you diagnose, remediate, and redeploy.

Why rollback fails (and what to design around): protocol changes clients cannot revert from; destructive DB schema changes; components that do not blue-green well (databases, message brokers). Identify non-rollback-able areas in advance and redesign them; keep the previous version retained until the next deploy so a half-complete rollout can be reverted. Timebox fix-forward attempts (e.g., 30 minutes) then roll back; document the decision path in runbooks so tribal knowledge becomes institutional steps.

The emergency release path deserves the same rigor as the normal path, not less: model a hotfix as a near-identical production pipeline that fetches the artifact earlier (skipping full promotion), kept paused with strict trigger controls and break-glass approvals. If your pipeline is fast enough, prefer committing the fix through the whole pipeline so it is fully tested — then do RCA on how the bad build reached production in the first place. The "shortcut" should be the exception with a post-implementation review attached, never the routine.

Release Infrastructure Reliability and DR

The release toolchain — CI servers, artifact storage, registries, deploy tooling — is critical infrastructure. Treat it that way:

  • Artifact storage: a checksum-deduplicated store (e.g., Artifactory's SHA1 filestore + metadata DB) requires backing up both the filestore and the metadata DB, or the filestore is "just a folder with files named after their checksum" — unidentifiable. Snapshot the DB before copying the filestore to avoid dangling references; use federated/replicated second sites and restore drills.
  • Signing keys and master keys are the crown jewels: loss of the master key means loss of all encrypted secrets/passwords at recovery time; treat key escrow, rotation, and a recovery runbook as a top DR item. Same logic applies to artifact signing keys — losing them bricks future releases and undermines supply-chain trust.
  • Runner fleet: capacity planning, autoscaling, multi-region, queue observability; treat runners as cattle.
  • DR fundamentals: multi-region deployment, automated failover, IaC for reproducible recovery, defined RTO/RPO, and tested failover. DR is also the enabler for safe maintenance windows.

Disaster scenarios and mitigations:

Scenario Mitigation
Registry/artifact corruption Checksum-based dedup + federated/replicated second site + regular restore drills
Signing/master-key loss Key escrow and backup; loss of the master key means loss of all encrypted secrets at recovery; rotation + recovery runbook
Build-cache loss Cache is regenerable but expensive: pin cache keys, keep warm caches in multiple regions, budget cold-rebuild capacity
CI server / runner fleet outage Fleet capacity planning, autoscaling, multi-region, queue observability; treat runners as cattle
Compliance/tamper challenge Immutable/WORM artifact storage for tamper evidence and retention
Maintenance windows Active-passive DR enables taking the registry/CI down for hardware maintenance safely

Config Drift and Environment Parity

Despite decades of best practices, teams still hit the "repro gap": features work locally but break in staging/prod because environments are maintained separately and drift in service versions, configurations, and environment variables. Key failure drivers: the shared "staging queue" (manual hotfixes applied to staging that never flow back), Docker being insufficient (Compose handles local service relationships but not cloud routing/lifecycle), and stale or stubbed data — the leading cause of late-stage deployment failures.

Mitigations: generate every environment (local, preview, prod) from one declarative, version-controlled manifest so drift is structurally impossible; branch the whole environment on git branch; use byte-for-byte production clones into isolated preview environments with automated sanitization; manage secrets with scoped tokens and runtime injection (never store real secrets in non-prod configs); audit rollback data for environment-diff-caused failures; tear ephemeral preview environments down after merge.

AI/Agent-Assisted Release Automation (20252026)

The CI/CD layer is where agentic adoption lags most: AI adoption among individual developers crossed 90% by early 2026, but only ~13% of organizations have AI across the full delivery lifecycle. The emerging paradigm is CA/CD (Continuous Agentic/Continuous Deployment): agents observe pipeline state, reason about whether failures are transient vs. systemic and whether a deploy window is safe, act autonomously on low-risk decisions, and escalate high-risk ones — "risk-aware releases rather than pass/fail gates."

What exists today:

  • GitHub Agentic Workflows (technical preview, 2026): automation written in plain Markdown instead of YAML, compiled to standard Actions running coding agents; handles issue triage, PR review, CI failure root-cause analysis, and repo maintenance. Security-first: read-only by default, sandboxed, network-isolated, SHA-pinned dependencies, sanitized writes. GitHub's Copilot Coding Agent opens PRs, and CI checks do not run on agent-authored PRs until a human approves.
  • MCP as the integration standard: CircleCI ships a production MCP server exposing pipeline graphs, build history, and failure logs to agents; Dagger agents monitor pipelines, generate patches, and submit them through the same review process as human code with a "rationale diff"; Nx offers AI self-healing CI (analyze → propose fix → apply → re-run affected checks, with a decision trace).
  • Self-healing is the most mature capability: failure classification (high reported F1 on flaky tests, runner pod timeouts, dependency install failures), transient-vs-systemic routing (~60% transient → auto retry), policy-gated fix generation, and outcome learning.

Governance: tiered autonomy is the dominant architecture — match agent authority to action risk:

Tier Actions Authority
Low Retry transient failures, update docs, reorder tests Fully autonomous
Medium Revert a failing deploy, scale ahead of predicted load Autonomous + logging + notify
High Merge to main, modify security policy, infra changes Human approval required
Critical Architectural changes, prod data migrations Formal review gate

Companion controls: immutable audit trails (what/when/why/what-changed, for debugging and compliance), policy-as-code validation of agent decisions (quotas, security, blast radius), confidence-gated autonomy (low-confidence/high-impact → human), and human checkpoints at high-blast-radius transitions (merge to release branch, deploy to prod, access-control changes).

Gotcha — agents amplify whatever exists: "High-velocity, high-confidence mistakes." Fragile pipelines get broken faster; thin test coverage ships untested code at higher velocity. The teams advancing fastest defined their autonomy tiers clearly, built observable audit trails, and expanded agent authority only as confidence grew. Trust calibration, not tooling, is the bottleneck — and governance must be built in from the start, not retrofitted after agents run autonomously. Vendor-reported numbers (e.g., ~94% automatic failure resolution, ROI figures) should be attributed, not treated as independently validated.

Implication for release engineers: the job shifts from executing releases to defining autonomy tiers, reviewing agent rationale diffs, owning audit trails, and calibrating trust. Routine toil (retrying flakes, triaging failures, drafting changelogs, dependency updates) is delegated; humans concentrate on go/no-go judgment, security, and high-blast-radius approvals. The human gate is deliberately preserved.

Running a Release Train: The Operational Checklist

Synthesis of the four projects' mechanics into a reusable operating rhythm for any train-based release:

  1. Publish the calendar first. Fixed dates for branch cut, RC, and stable; adjust for holidays/coverage; communicate in a shared channel.
  2. Set the feature-complete gate at the branch cut. Code-complete, strings landed, blockers addressed; anything incomplete is punted, not carried.
  3. Publish merge criteria that tighten over time. Permissive early (beta phase), restrictive as stable approaches; named approvers with an SLA; automation for first-pass triage.
  4. Run a dedicated stabilization window. Only bug-fix/stabilization patches land; track readiness on a shared dashboard.
  5. Gate promotion with explicit signoffs. RC validated by QA, staged rollout to a small cohort, monitor, expand.
  6. Keep a refresh/patch cadence (weekly security refreshes, scheduled patches) so fixes don't wait for the next milestone.
  7. Review delivery metrics weekly (deployment frequency, lead time, blockers) and use the review to improve tooling and process, not to blame.

Gotchas

  • Cadence values move: Chromium moved from 6-week to 4-week milestones; Firefox from 4-week to 2-week releases. Teach cadence as a design choice (fixed calendar, flexible scope) and cite current values as examples, not doctrine.
  • A branch cut is a feature-complete gate, not a suggestion: every project above that enforces it (Chromium punts incomplete features; Ubuntu freezes; Firefox stops features at beta).
  • Merge criteria must tighten over time: permissive early, restrictive as the stable date approaches — the opposite order is how regressions ship.
  • Never treat your registry/CI as disposable: they are critical infrastructure with backup, DR, and key-escrow requirements; see toolchain-landscape.md and metrics-and-dora.md for adjacent operational context.

Sources and Further Reading