Chapter 26Lesson 01~130 minutes

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.

PluginsSupply chainCompatibilityRollbackOperations

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.

Plugin lifecycle causality
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.
Marketplace is not a security attestation. Current Sonar documentation says plugins are not provided by Sonar and are installed at your own risk. A Marketplace/version-matrix compatibility match is useful evidence about supported versions; it does not replace publisher identity, release provenance, license review, dependency review, checksum/signature evidence, or a rollback plan.

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?

Which server state should exist before a plugin is copied into extensions/plugins?

Why does a scanner-side plugin still create server availability risk?

Can a Data Center application node be upgraded with a plugin while its peers keep a different plugin set?

What is the safest response when a publisher provides no signature?

Next lesson

Govern one reversible plugin lifecycle

Lesson 2 turns provenance and compatibility into an isolated install → verify → remove → baseline-recovery workflow.

Official references and version notes

Version and compatibility note

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.

Ethereum / ERC-20
0x716c4Ab160C4B66F31a28AE2448BfF68fc3a2ef0Send only Ethereum/ERC-20 compatible assets to this address.