Marketplace, Plugins, Extension Risks, and Compatibility Management: Core Concepts and Mental Model
Treat SonarQube plugins as executable supply-chain dependencies: identify who built them, what they extend, which core/API versions they require, and how the server returns to a known-good baseline.
Learning objectives
- Explain why a SonarQube plugin is executable server/scanner supply-chain code rather than a harmless dashboard add-on.
- Trace SonarQube core/version + plugin artifact/dependencies → extension loading → new analyzer/integration behavior → compatibility/availability risk.
- Distinguish Community Build Marketplace installation from current commercial SonarQube Server manual installation.
- Build a plugin provenance record containing identity, version, canonical source, checksum, license, maintainer, compatibility evidence, rollback artifact, and change owner.
- Separate compatibility evidence from security/provenance evidence: “listed as compatible” does not mean “reviewed or trusted.”
- Explain why Data Center application nodes must carry the same plugin set and why plugin changes require coordinated application-node handling.
1. The practical problem: one JAR can change three execution planes
Chapter 25 moved from individual project evidence to governance views. Chapter 26 moves in the opposite direction: it examines a small artifact that can have a very large operational blast radius. A plugin is Java bytecode loaded by SonarQube. Depending on its extension points, it can participate in the web process, Compute Engine, or scanner bootstrap. That makes it part of both the software supply chain and the availability boundary of the SonarQube service.
Installing an analyzer because an old tutorial says “drop this JAR into the plugins folder” is therefore not equivalent to adding a static configuration file. The plugin may depend on a particular Sonar Plugin API, bundle third-party libraries, add rules or languages, change scanner downloads, alter Compute Engine behavior, expose web endpoints, or fail during startup. The correct unit of governance is the complete pair SonarQube core release + exact plugin artifact.
core version + plugin JAR + bundled dependencies + configuration
→ startup/plugin loading → scanner/web/CE extensions → project
behavior → operational and governance outcome
2. Mental model: artifact loading creates executable trust
Start from a known server build. Before an extension is introduced, record the server version, installed-plugin inventory, startup health, database/search health, and the projects that depend on the server. Then introduce one exact plugin artifact whose provenance and compatibility have already been checked. Only after a restart and clean startup may the new capability be considered available.
flowchart TD
A[SonarQube core + Plugin API] --> B[Exact plugin JAR]
P[Publisher/source + SHA-256 + license] --> B
B --> C[extensions/plugins + restart]
C --> D{Extension plane}
D -->|Scanner| E[Analyzer / sensor behavior]
D -->|Compute Engine| F[Post-processing behavior]
D -->|Web| G[Administration / integration behavior]
E --> H[Project result]
F --> H
G --> H
H --> I[Availability / governance evidence]
R[Preserved rollback artifact + baseline] --> C
The diagram is causal, not decorative. A capability cannot be attributed to the plugin unless the exact JAR was loaded by the intended server version and the server successfully returned to an operational state. Conversely, a startup failure must not be “fixed” by deleting logs or editing the database; preserve the artifact and startup evidence first.
3. What a plugin can extend
The Sonar Plugin API exposes extension points across the scanner, Compute Engine, and web application stacks. Scanner-side extensions can add sensors, rules, languages, or report processing. Compute Engine extensions participate after an analysis report is uploaded. Web-side extensions can add administrative or integration behavior. A plugin declares its entry point and metadata in its manifest and is loaded into an isolated classloader, but isolation does not eliminate operational risk: incompatible APIs or bundled libraries can still cause runtime failures.
| Plane | Typical effect | Evidence to preserve |
|---|---|---|
| Scanner | Rules, sensors, language/report processing downloaded to analysis clients | Scanner bootstrap log, downloaded analyzer/plugin versions, indexed files, resulting issues/measures |
| Compute Engine | Post-processing or server-side extension behavior |
ceTaskId, CE logs/task status, resulting
analysis state
|
| Web application | Administration, integration, pages/services | Startup/web logs, route/UI availability, permission boundary |
4. Current installation model is edition-sensitive
| Product path | Current plugin installation behavior | Operational meaning |
|---|---|---|
| Community Build 26.9 | Marketplace installation is available when the instance has internet access; manual JAR installation is also supported. | Marketplace can discover compatible versions, but third-party code remains an operator-owned risk decision. |
| Commercial SonarQube Server | Current documentation requires manual plugin installation; Marketplace is not the installation mechanism. |
Download, version selection, copying to
extensions/plugins, and restart are explicitly
governed operations.
|
| Data Center Edition | Manual plugin state must be identical on every application node. All application nodes are stopped for install/uninstall/upgrade; search nodes do not receive the plugin. | A “one-node test in production” creates an invalid cluster state and is not a safe canary. |
5. Provenance packet before installation
A plugin governance record should be reproducible by a second operator. Store enough information to retrieve and identify the same bytes without trusting a mutable “latest” URL.
plugin_key: <manifest Plugin-Key>
plugin_name: <manifest Plugin-Name>
plugin_version: <exact immutable version>
artifact_file: <exact .jar name>
canonical_release_url: <publisher/repository release URL>
download_url: <immutable artifact URL>
sha256: <locally computed expected digest>
publisher_signature_or_attestation: <verified / not provided>
license: <SPDX/name + source>
source_repository: <canonical repository>
maintainer_owner: <team or publisher>
last_release_date: <date>
sonarqube_compatibility: <version-matrix/release evidence>
plugin_api_min_version: <manifest Sonar-Version when present>
transitive_dependency_review: <record / limitations>
rollback_artifact: <baseline copy or removal plan>
change_owner: <lab operator/team>
If the publisher supplies a cryptographic signature, provenance attestation, or SBOM, verify it and preserve the result. If none is supplied, say not provided; do not fabricate a signature claim. At minimum, pin the source and verify SHA-256 locally.
6. Compatibility has multiple layers
The Plugin version matrix answers one important question: which plugin version is declared compatible with a SonarQube release. The plugin manifest can also expose the plugin API minimum version. But compatibility is broader than either field. You still need to consider Java/runtime requirements, other plugin dependencies, the analyzer/language state of the server, license terms, and the upgrade path to the next SonarQube release.
Core/API
Can this plugin load against the Plugin API bundled with the exact SonarQube release?
Dependency
Does it require another analyzer/plugin or bundle libraries whose versions/licensing/security matter?
Operational
Does the server start cleanly, and do scanner/CE/web behavior remain healthy under the intended workload?
Lifecycle
Is the project maintained, is an upgrade version available for the next SonarQube release, and can you roll back?
7. Read-only inventory before touching
extensions/plugins
# Disposable/local instance examples. No mutation yet.
curl -fsS http://localhost:9000/api/system/status
curl -fsS http://localhost:9000/api/server/version
# Filesystem inventory (ZIP/Docker paths differ by deployment):
ls -lah "$SONARQUBE_HOME/extensions/plugins"
sha256sum "$SONARQUBE_HOME"/extensions/plugins/*.jar 2>/dev/null || true
# Current API can expose installed plugin inventory. Authenticate if your
# instance forces authentication; never print the token itself.
curl -fsS -H "Authorization: Bearer $SONAR_API_TOKEN" \
http://localhost:9000/api/plugins/installed \
| python -m json.tool > evidence/plugins-before.json
# Preserve startup evidence before any extension change.
cp "$SONARQUBE_HOME/logs/web.log" evidence/web-before.log
cp "$SONARQUBE_HOME/logs/sonar.log" evidence/sonar-before.log
Do not remove an “old” JAR simply because its filename looks obsolete. First map each file to the server’s installed-plugin inventory and the owner/change record. A manually installed plugin may be the only provider of a language or rule population used by many projects.
8. Governance boundary: built-in first, extension only when justified
Before accepting plugin risk, ask whether the capability already exists in the current built-in analyzers, can be produced by a CI-side tool and imported as an external report, or can stay entirely outside the SonarQube server. Every server plugin increases the set of binaries that must be compatible during upgrades and available during startup. “Plugin available” is therefore not the same as “plugin should be installed.”
Knowledge check
Why is a compatible Marketplace entry not enough to approve a plugin?
Compatibility does not prove publisher identity, artifact integrity, license acceptability, dependency safety, maintenance health, or operational rollback readiness.
Which server state should exist before a plugin is copied into
extensions/plugins?
A baseline server version, installed-plugin inventory/checksums, startup/health evidence, ownership record, exact plugin provenance/compatibility evidence, and rollback plan.
Why does a scanner-side plugin still create server availability risk?
The server must load/manage the plugin and may distribute it to scanners; incompatibility can break startup or analysis bootstrap even when the plugin’s primary logic executes scanner-side.
Can a Data Center application node be upgraded with a plugin while its peers keep a different plugin set?
No. Current guidance requires the same plugin operations across application nodes, with all application nodes stopped during plugin install/uninstall/upgrade.
What is the safest response when a publisher provides no signature?
Record that no signature is provided, pin the canonical immutable source, verify a SHA-256 digest locally, review provenance/license/dependencies, and do not invent an attestation.
Official references and version notes
-
Community Build — Installing a plugin
— Marketplace/manual paths, compatible JAR requirement,
extensions/plugins, Docker/Kubernetes guidance, restart and uninstall behavior. - Community Build — Using Marketplace — installed/compatible plugin discovery, internet/proxy behavior, Administer System requirement, pending install/update/uninstall and restart.
- Community Build — Plugin version matrix — current plugin-to-Community-Build compatibility table.
-
Community Build — Plugin basics
— Plugin API, scanner/Compute Engine/web extension points,
manifest metadata, dependencies and
Plugin-RequiredForLanguages. - Community Build — Performing the update — install compatible third-party plugins for the target release instead of blindly copying old plugin folders.
- SonarQube Server — Installing a plugin — current commercial manual-install model and Data Center application-node consistency/maintenance rules.
- Sonar Plugin API repository — independent Plugin API release stream and SonarQube ↔ Plugin API compatibility mappings.
-
Official SonarQube Docker image tags
— exact
26.9.0.129388-communityimage used by the checkpoint.
Rechecked 2026-09-08. Mandatory examples target SonarQube
Community Build 26.9.0.129388 using the official
sonarqube:26.9.0.129388-community Docker image.
Community Build supports Marketplace and manual plugin
installation; current commercial SonarQube Server documentation
requires manual installation. Third-party plugins are not provided
by Sonar and are installed at the operator’s risk. Compatibility
must be checked against the current Plugin version matrix and
plugin release documentation before every install/upgrade. The
checkpoint deliberately chooses the plugin at run time rather than
hard-coding a third-party version that may become abandoned. The
server image contains its supported Java runtime; outside the
image, current Community Build 26.x requires Java 21+. No external
database, production cluster, identity provider, reverse proxy, or
paid capability is required. Data Center plugin consistency is
taught as an optional/simulated commercial path.
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.