Checkpoint Lab — Capstone: Operate a Governed Production SonarQube Quality Platform
Deliver a production-readiness evidence packet for a disposable SonarQube quality platform with explicit residual risks and recovery proof.
Learning objectives
- Operate one complete review cycle on the disposable capstone platform and predict important state changes before action.
- Assemble architecture, version, source, scanner, Compute Engine, policy, security/RBAC, API/CI/IDE, observability, recovery, upgrade, capacity and governance evidence.
- Prove a restore/reindex path and one incident recovery without hiding first-failure evidence.
- State commercial/edition assumptions and free/local fallbacks explicitly.
- Publish residual risks, owners and follow-up criteria instead of declaring the platform “production ready” without qualifications.
1. Final checkpoint mission
Deliver a reviewable production-readiness dossier for the disposable
sq34:capstone platform. The assessor should be able to
reconstruct the operating model without trusting your memory: what
version ran, what source was analyzed, how the report/task/result
connected, which policy decided, what credential/trust boundary
existed, how the database was backed up/restored, how
updates/capacity are governed and which risks remain.
Generation date: 2026-09-08. Mandatory executable
work uses
SonarQube Community Build 26.9.0.129388 and the
official sonarqube:26.9.0.129388-community image. The
recorded scanner baseline is
SonarScanner CLI 8.1.0.6389. When scanner JRE
auto-provisioning is unavailable or disabled, use Java 21 or
newer. The local database family is PostgreSQL 17.x; the 2026.1
Server LTA documentation supports PostgreSQL 14–18. Commercial
references are SonarQube Server 2026 Release 4.1 and 2026.1.5 LTA.
Record the exact image digest, scanner output and database image
digest you actually run.
The checkpoint passes when evidence is internally consistent and limitations are explicit—not when every metric is green. A failed gate or documented residual risk can be a stronger production artifact than a cosmetically perfect dashboard with missing provenance.
2. Exact assumptions and resource/credential preflight
Freeze the environment you are assessing. If your actual version differs from the baseline, do not falsify it—record the real version and rerun the compatibility checks.
| Category | Required assumption/preflight | Evidence file |
|---|---|---|
| Platform | Community Build 26.9.0.129388 image tag + actual digest; local URL 9000 | 00-sonarqube-image.txt |
| Database | PostgreSQL 17.x image/digest; local fake credential; supported DB family | 00-database.txt |
| Scanner | CLI 8.1.0.6389 baseline or actual recorded version; JRE mode recorded | 00-scanner-version.txt |
| Source |
Synthetic repo only; stable sq34:capstone key;
exact Git SHA
|
00-revision.txt |
| Test evidence | pytest/coverage producer runs before scan |
coverage.xml, junit.xml, producer
log
|
| Credential | fake local analysis/read token; no value in evidence; revoke after lab | governance/token-record.md |
| Plugins | none required for mandatory path; inventory current extensions directory/system info | server/plugin-inventory.txt |
| CI/provider | local shell workflow is mandatory; hosted CI/decoration may be simulated | ci/pipeline-evidence.md |
| Identity | local built-in users/tokens only; enterprise SSO optional/simulated | governance/identity-boundary.md |
| API | documented instance API only; bearer auth; V2 migration noted | api/api-contract.md |
3. Write predictions before actions
Predict at least two state changes. This is a capstone control: you must know which layer should change before you touch it, then verify using a different evidence source.
# evidence/governance/predictions.yaml
predictions:
- id: P1
before: project sq34:capstone has the currently recorded gate assignment
action: run a new analysis of the exact recorded revision with coverage.xml present
expected_change: a new CE task/analysis record is created; source revision/project key stay unchanged
independent_verification:
- scanner report-task.txt
- CE task status/API or UI
- project analysis timestamp/result
- id: P2
before: backup artifact exists but restore target does not
action: restore database to isolated sq34restore stack with fresh search/data volume
expected_change: isolated server reconstructs project/config from restored durable state and builds usable indexes
independent_verification:
- restore logs + system status
- project/config inspection
- fresh equivalent analysis task
- id: P3
before: fake bounded exception SQ34-EX-001 is active in external governance ledger
action: reach its review/expiry decision
expected_change: exception closes or is explicitly renewed with new evidence; Sonar technical result is not silently suppressed
independent_verification:
- governance ledger diff
- unchanged issue/gate evidence unless separately remediated
4. Required production-readiness evidence packet
Use a stable packet structure so review is mechanical instead of anecdotal.
evidence/
├── 00-generated-at.txt
├── 00-revision.txt
├── 00-sonarqube-image.txt
├── 00-database.txt
├── 00-scanner-version.txt
├── architecture/
│ ├── platform.mmd
│ ├── trust-boundaries.md
│ └── edition-matrix.md
├── scanner/
│ ├── effective-inputs.md
│ ├── analysis.log
│ └── report-task.txt
├── server/
│ ├── startup.log
│ ├── ce-task.json
│ ├── health.json
│ └── plugin-inventory.txt
├── policy/
│ ├── profile.md
│ ├── quality-gate.json
│ ├── new-code.md
│ └── exception-ledger.yaml
├── api/
│ ├── api-contract.md
│ ├── measures.json
│ └── permission-check.md
├── ci/
│ ├── producer.log
│ ├── pipeline-evidence.md
│ └── ide-or-provider-simulation.md
├── backup/
│ ├── sonarqube.dump
│ ├── sonarqube.dump.sha256
│ ├── restore.log
│ └── restore-verification.md
├── operations/
│ ├── upgrade-plan.md
│ ├── compatibility-matrix.md
│ ├── capacity-baseline.csv
│ └── incident-SQ34-INC-001.yaml
└── governance/
├── owners.md
├── predictions.yaml
├── review-decision.md
├── residual-risks.yaml
└── assumptions-limitations.md
5. Execute the production-readiness review cycle
The checkpoint is intentionally broad, but each step is small. Reuse the runnable commands from Lessons 2 and 4 rather than inventing a second, inconsistent platform.
- Architecture/version inventory: capture container image digests, database/scanner/JRE mode, deployment topology, ports, persistence paths and trust boundaries.
- Build/test: run the synthetic tests and coverage producer; preserve producer log and reports before analysis.
-
Analysis: run scanner with stable project key and
revision; preserve effective inputs, indexing/import log and
report-task.txt. - Compute/result: verify referenced CE task, then capture current measures/issues/analysis identity.
- Policy: capture active profile, gate conditions/status and New Code definition; document any bounded exception separately.
- Security/RBAC: prove token ownership/purpose and a permission outcome without recording secret value; verify TLS/trust assumptions for any non-local adaptation.
- Automation/developer feedback: save a bearer-auth API read and either a local CI/Connected Mode artifact or clearly labeled provider simulation.
- Observability: capture health/startup/CE/search-relevant logs and the capacity baseline from an equivalent analysis.
- Recovery: verify DB backup checksum, isolated restore, fresh index/reindex behavior and a fresh validation analysis.
- Upgrade: write current→target compatibility/update plan including Java/database/scanner/plugin/API prerequisites and recovery boundary.
- Incident: run the bounded auth/report-path incident or interpret the synthetic CE case, preserve first failure, apply one correction and prove same-input rerun.
- Governance: review owners, exception expiry, adoption/remediation evidence and residual risks; sign the review decision with limitations.
6. One dossier, many independent evidence chains
The diagram is not architecture decoration. Each edge says which evidence must exist before the next conclusion is valid.
7. Production-readiness acceptance matrix
A “pass” means the minimum evidence exists and is internally consistent. Residual risk is expected; hiding it is failure.
| Domain | Minimum pass evidence | Residual-risk examples |
|---|---|---|
| Architecture/version | exact edition/version/digests + DB/scanner/JRE + topology/trust boundaries | single-node availability; local-only TLS model |
| Analysis | revision + producer reports + effective scanner inputs + indexed/report/task evidence | language-specific analyzer limits; synthetic source |
| Policy | profile/gate/New Code assignment and result + exception ledger | gate policy needs broader organizational validation |
| Security/RBAC | least-privilege token record + permission response + fake-secret discipline | enterprise SSO not exercised locally |
| Automation/feedback | API contract/read + CI/IDE/provider artifact | hosted provider decoration simulated |
| Observability/capacity | health/log correlation + bounded scanner/CE/host baseline/headroom note | small synthetic workload cannot predict enterprise scale |
| Recovery | DB backup checksum + isolated restore + fresh analysis | site-level DR not tested |
| Upgrade | supported-path/compatibility matrix + recovery prerequisite | no live production plugin estate |
| Governance | owners + exception expiry + review decision + non-gaming metrics | external audit/compliance mapping requires organization-specific evidence |
8. Capacity evidence: enough to reason, not enough to overclaim
Record a small baseline from several equivalent local analyses. The purpose is to show the method from Chapter 31—not to extrapolate this tiny project into an enterprise sizing guarantee. Capture scanner time, CE/task time/queue wait where observable, host CPU/RAM, database/search/disk/network notes, concurrent activity and explicit headroom assumptions.
timestamp_utc,revision,loc,scanner_seconds,ce_seconds,queue_wait_seconds,host_cpu_peak_pct,host_ram_peak_mb,db_observation,disk_observation,notes
2026-09-08T00:00:00Z,<sha>,<nloc>,<measured>,<measured>,<measured>,<measured>,<measured>,<record>,<record>,bounded local synthetic run
Reference architectures and synthetic benchmarks are planning anchors. Production sizing requires measured real workload shape: project/language mix, arrival burstiness, CE duration, database/search pressure, disk IOPS/latency, users/API calls and growth.
9. Edition-aware simulation ledger
Commercial simulation is not a fake screenshot. It states the real control, the product/edition boundary and the free evidence that proves the underlying concept.
| Optional capability | Commercial/product boundary | Mandatory free/local proof |
|---|---|---|
| Branch/PR analysis + provider decoration | commercial edition/provider integration dependent | same revision/task/gate/CI-state separation; provider decoration simulated |
| Advanced security/taint | edition/language dependent | synthetic basic vulnerability/hotspot boundaries + external security-control note |
| Applications/Portfolios/reports | Developer/Enterprise dependent | external project inventory + evidence packet + non-gaming trend aggregation |
| Enterprise SSO/SCIM | commercial/IdP dependent | local users/groups/tokens + trust/least-privilege model + simulated identity mapping |
| Data Center HA/autoscaling | Data Center licensed | single-node recovery/capacity evidence + documented DCE architecture simulation |
| Managed DB/Kubernetes/paid CI | external service/provider choices | local PostgreSQL/Docker/shell CI equivalent control |
10. Residual risks and final operating decision
Production readiness is a risk decision, not a score. Name what the lab cannot prove, assign an owner and define the next evidence needed.
residual_risks:
- id: RR-01
risk: single-node Community Build lab does not prove high availability
owner: platform-operations
disposition: accepted-for-course-lab
next_evidence: licensed DCE failure test if business availability requires it
- id: RR-02
risk: synthetic repository does not represent enterprise language/project mix
owner: quality-platform-team
disposition: requires-production-measurement
next_evidence: 30-day workload/capacity baseline
- id: RR-03
risk: hosted CI/provider decoration and enterprise identity were simulated
owner: devops-integration-team
disposition: test-before-production
next_evidence: provider sandbox + least-privilege integration test
- id: RR-04
risk: compliance/security reports do not prove secure software
owner: security-governance
disposition: retain-complementary-controls
next_evidence: threat model + SCA/SBOM/DAST/runtime controls as applicable
Prefer: “The disposable platform demonstrates the required control chain under the recorded assumptions; the residual risks above must be addressed before applying the design to production.” Avoid: “SonarQube is secure/compliant/production ready because the dashboard is green.”
11. Verification checklist and cleanup
-
Every result is tied to the exact
sq34:capstonerevision and recorded effective inputs. - At least two predicted changes were independently verified from different evidence sources.
- Scanner/upload, CE, durable analysis, gate, CI and provider/IDE states are not collapsed.
- No token/password/private key is present in the packet; fake credential metadata is clearly labeled.
- Database backup has checksum and an isolated restore/reindex/fresh-analysis verification.
- Upgrade plan records current/target compatibility and does not rely on arbitrary downgrade.
- Capacity numbers are bounded by explicit workload assumptions.
- Commercial features are optional/simulated and never required for core completion.
- Exceptions have owner/rationale/scope/expiry; metrics do not rank developers or reward exclusions.
- Residual risks name owners and next evidence instead of being hidden.
# Finalize and hash the evidence packet before cleanup.
find evidence -type f -print0 | sort -z | xargs -0 sha256sum > evidence/SHA256SUMS.txt
tar -czf ../sq34-production-readiness-evidence.tgz evidence
sha256sum ../sq34-production-readiness-evidence.tgz > ../sq34-production-readiness-evidence.tgz.sha256
# Revoke the fake/local token in the UI before destroying the lab.
unset SONAR_TOKEN SONAR_HOST_URL
# Remove only owned lab stacks after evidence archive exists.
docker compose -f compose.restore.yaml -p sq34restore down -v 2>/dev/null || true
docker compose down -v
12. Knowledge check
Your scanner log is clean, CE task is successful, gate is green, but CI is red. What is the next layer?
Inspect the CI job/provider integration and revision mapping. Do not change scanner/project/policy state because those upstream states are already verified.
A restore target shows the old project after the database restore. Is recovery proven?
Not yet. Verify configuration/result state, ensure search is correctly rebuilt/reindexed for the restored database, and run a fresh equivalent analysis. Recovery must prove usable service, not just UI visibility.
Why is a green security report not proof that the application is secure?
Static analysis/reporting has scope and detection limits. Security assurance also depends on threat modeling, dependency/supply-chain controls, dynamic/runtime testing, secure configuration and human review as applicable.
What should happen if the capstone needs a commercial feature to demonstrate a concept?
Label the exact edition/version prerequisite, make the commercial path optional, and provide a faithful Community/local simulation that proves the underlying state/trust/evidence concept.
What is the final artifact of the course?
A governed operating model and evidence packet: exact versions/revision/inputs, task/result/policy chain, security/RBAC, automation, observability, recovery, upgrade/capacity evidence, governance records and explicit residual risks—not merely five green lesson pages.
13. What Chapter 34 adds—and post-course production practice
Chapter 34 converts the course from a collection of SonarQube skills into an operating discipline. You can now trace a source revision through build/test evidence, scanner indexing and report upload, Compute Engine processing, persistent results, profiles/New Code/gates, CI/API/IDE/provider outcomes, operations, recovery, upgrades, capacity and governance—while keeping ownership and edition boundaries explicit.
Post-course practice should be cyclical: re-verify releases and compatibility; review permissions/tokens; sample analysis evidence; test backups/restores; inspect API deprecations; measure capacity; rehearse incidents; expire exceptions; review remediation trends and developer feedback; and update the operating model when the platform or organization changes. The durable skill is not remembering a screen. It is preserving causality and evidence as the system evolves.
A governed SonarQube platform is one where the exact revision, effective analysis inputs, asynchronous task/result, policy context, trust boundary, owning system, recovery path and residual risks can be independently verified.
Official references and version notes
Further reading
Verify version-sensitive behavior against primary documentation before using these patterns outside the disposable lab.
- SonarQube downloads — current Community Build, commercial release and LTA identities
- SonarQube Server documentation — server, administration, security and operations
- SonarQube Community Build documentation — free/local product behavior
- Web API — authentication and the ongoing Web API V2 migration
- Backup and restore — database backup/restore and reindex guidance
- Official SonarQube Docker image — current image tags and deployment notes
- LTA to LTA release notes — current Java/database/scanner compatibility changes
- Scanner environment requirements — scanner runtime and JRE auto-provisioning boundary
- Performance issues — performance troubleshooting and edition-aware CE scaling guidance
SonarQube product names, editions, release trains, scanner runtimes, APIs, authentication options, and platform prerequisites can change independently. Re-check the linked SonarSource primary documentation for the exact target release before applying version-sensitive commands or operational guidance outside the disposable course environment.
Keep the academy open
Support free, practical DevOps education.
Every lesson is designed to remain readable in a browser, downloadable from GitHub, and usable without a paid learning platform. Contributions help expand and maintain the curriculum.
0x716c4Ab160C4B66F31a28AE2448BfF68fc3a2ef0Send only Ethereum/ERC-20 compatible assets to this
address.