Plugin Ecosystem, Plugin Dependencies, Update Center, Compatibility, Pinning, Removal, and Plugin Governance: Concepts, Architecture, and Mental Model
Jenkins plugins execute inside the controller and can change its APIs, persistence model, UI, security surface and Pipeline behavior. This lesson builds a precise mental model for provenance, dependency resolution, minimum-core compatibility, update-center metadata, security advisories, restart/load semantics and rollback evidence before any plugin is changed.
Learning objectives
- Explain why a plugin is privileged controller code rather than just another Pipeline dependency.
- Trace capability → update-center metadata → dependency graph → minimum core → loaded extension state.
- Separate plugin archive/version identity from plugin-owned configuration and runtime state.
- Use read-only inspection before installation, update, disable or removal.
- Define a governance evidence set that makes plugin changes reviewable and recoverable.
1. The practical problem: a plugin change can change the whole controller
Jenkins is intentionally extensible. Credentials stores, SCM integrations, Pipeline steps, authorization strategies, cloud agents, report publishers and UI features are commonly delivered by plugins. That convenience creates a platform-management obligation: plugin code loads into the controller JVM, participates in startup, can persist configuration, contributes extension points and can affect every job that uses those extensions.
Therefore, “install plugin X” is not equivalent to adding an application library. Before mutation, operators need to know which artifact, from which update source, for which Jenkins core, with which transitive dependencies, whether there is a current security warning, and what exact snapshot would restore the accepted state.
2. Mental model: from capability request to governed runtime
The causal chain is: requested capability → plugin/update-center metadata → dependency graph and minimum Jenkins core → reviewed archive set → install and possible restart → runtime extension points and plugin-owned data → later update/security advisory → tested retirement or rollback.
flowchart TD A[Required capability] --> B[Plugin short name + update-center metadata] B --> C[Dependency graph + minimum core] C --> D[Review provenance, health, advisories] D --> E[Stage exact plugin set on clone] E --> F[Restart / load extensions] F --> G[Jobs, config and persisted plugin data] G --> H[Update / advisory / retirement event] H --> I[Test upgrade, disable or restore] I --> J[Manifest + logs + snapshot evidence]
Capability → metadata: begin with the outcome you
need, not a familiar plugin name.
Metadata → graph: one plugin may require several
others at minimum versions.
Graph → install: compatibility must be resolved
against the controller core before files reach JENKINS_HOME.
Install → runtime: a plugin is not useful merely
because its .jpi exists; Jenkins must load it and its
dependencies successfully. Runtime → data: jobs and
controller configuration may then contain plugin-defined
classes/settings.
Update/retirement → evidence: later changes must
account for both binaries and persisted data.
3. State that must remain distinct
| Layer | Examples | Evidence |
|---|---|---|
| Controller/core | Jenkins 2.568.3, Java 21, JENKINS_HOME | About page, startup log, image digest |
| Plugin artifact | short name, version, .jpi, SHA-256 |
Installed list, filesystem hash |
| Resolution metadata | Update Center, minimum core, required/optional dependencies | update-center/plugin-site metadata |
| Runtime extension state | loaded/disabled/failed, contributed descriptors/steps | Plugin Manager + startup log |
| Plugin-owned data | job XML, global config, credentials/provider settings | snapshot + configuration inventory |
| Security/maintenance | advisory, health score, maintenance status | security advisory + plugin page timestamp |
| Recovery | previous manifest/image/JENKINS_HOME snapshot | hash, restore test and owner |
A controller can have the plugin file present but disabled; it can have a candidate plugin version compatible with core but incompatible with another plugin; and it can boot after uninstall while preserving unrecognized old configuration. Those are different states.
4. Read-only inspection comes first
Before changing anything on the disposable controller, record:
# Host-side evidence for the disposable lab only
docker image inspect jenkins/jenkins:2.568.3-lts-jdk21 \
--format '{{json .RepoDigests}}'
docker logs ch25-jenkins 2>&1 | head -n 80
# After local setup, inspect Installed/Updates in Manage Jenkins → Plugins.
# If using authenticated local CLI with a fake lab token:
java -jar jenkins-cli.jar -s http://127.0.0.1:8080 \
-auth lab-admin:LAB_ONLY_TOKEN list-plugins
Do not print real API tokens in shared terminals or logs. The example token is synthetic; an actual lab token should be stored locally and passed through a protected variable/file.
5. Update Center is a resolver input, not a blind approval oracle
The default Jenkins update site publishes metadata and binaries. Jenkins adds its core version to update-site requests so normal version-specific metadata can avoid offering releases that require a newer core. That is a compatibility aid, not a guarantee that an update is safe for your jobs or plugin-owned data.
Experimental update centers intentionally expose alpha/beta releases and may offer versions incompatible with your controller. They do not belong in a routine production update path.
6. Dependency graphs: direct and transitive
As a concrete example, Dark Theme
652.vea_da_dfea_e769 requires Theme Manager ≥
327.v780d7096ec29. The current Theme Manager release in
turn requires API plugins such as Ionicons API and Jackson 3 API.
Installing “one” feature therefore changes a graph.
Required dependencies affect boot/load viability. Optional dependencies may activate integration behavior when present. Jenkins also documents implied dependencies created historically when features were detached from core. Never decide removal from a direct-plugin list alone.
7. Minimum core is a hard compatibility gate
A plugin release can require a newer Jenkins core than your controller. For this chapter, Dark Theme 652 requires Jenkins 2.528.3 and Theme Manager 346 requires Jenkins 2.504.3, both below the 2.568.3 lab core. If a candidate required 2.580.1, the correct result on this controller would be reject before installation, not “try it and see.”
8. Security advisories and health scores answer different questions
Jenkins security advisories identify specific affected/fixed versions. The 2 September 2026 advisory is a current example: it fixed Jenkins core in 2.568.3 and also named fixed plugin versions for several plugins. A plugin health score is useful maintenance metadata, but Jenkins documents that the score reflects current/latest plugin data and is not a security attestation for your installed historical release.
9. “Pinning” today means reproducible desired state
Modern controller governance should store explicit plugin versions
in a reviewed manifest or controller image, then test the resolved
dependency set. Do not confuse this with the old bundled-plugin
.jpi.pinned mechanism; Jenkins documentation states
that pinned plugins as a product feature were removed with Jenkins
2.0.
--latest option defaults to true. If exact
minimum/pinned dependency behavior is required, use an explicit
strategy such as --latest=false, inspect the resolved
set, and promote the exact tested manifest rather than relying on
future “latest” resolution.
10. Product boundary
A plugin is justified when Jenkins truly needs controller extension points or a maintained integration. A compiler, linter, package client or deployment CLI that can run on a trusted agent usually belongs outside the controller. Keeping work agent-side reduces controller attack surface, classpath complexity and plugin lifecycle obligations.
11. DevOps connection: provenance + compatibility + recoverability
A reproducible Jenkins automation path now includes not just source SHA and build number, but also the plugin runtime that interpreted the job. Critical build evidence should be attributable to a controller/core/Java/plugin baseline. That baseline becomes part of incident diagnosis, upgrade approval and disaster recovery.
Knowledge check
Answer before revealing the explanation.
1. Why are Jenkins plugins more privileged than ordinary Pipeline code?
Plugins are loaded into the Jenkins controller JVM and extend controller APIs and runtime behavior. They are not confined by the Pipeline sandbox, so a plugin defect or compromise can affect the whole controller.
2. What does the Update Center contribute to a plugin decision?
It provides version-specific metadata such as available releases, dependencies and compatibility information. Jenkins includes its core version when requesting metadata so the normal update site can filter offers for that controller version.
3. Why is a plugin short name important?
The short name is the stable machine identity used by plugin archives, dependency metadata, manifests, CLI commands and JENKINS_HOME plugin filenames. A display name alone is not enough for reproducible automation.
4. What is the modern meaning of “pinning” in this course?
Record explicit plugin versions in a reviewed manifest or controller image. The old bundled-plugin .jpi.pinned mechanism is legacy; Jenkins documentation notes the pinned-plugin feature was removed with Jenkins 2.0.
5. Why is an old plugin archive alone not a complete rollback plan?
A newer plugin may have changed persisted configuration or data, dependencies, or minimum-core expectations. Safe rollback needs a compatible full controller/JENKINS_HOME snapshot plus the exact prior plugin set and a tested restore path.
Official references and version notes
- Jenkins — Managing Plugins — installation/update/removal, dependency safety, disable/uninstall behavior, old-data handling and legacy pinning semantics.
- Jenkins Update Sites — default and version-specific update-center behavior.
- Jenkins Plugin Site — exact releases, minimum core, dependency pages, health and security warnings.
- Jenkins Security Advisories — active/historical core and plugin advisories.
- Jenkins Security Advisory 2026-09-02 — current chapter-era example showing why exact plugin/core versions matter.
-
Plugin Installation Manager Tool
— reproducible plugin resolution, dependency/security reporting
and
jenkins-plugin-cli. - Dark Theme plugin and dependency page — maintained disposable lifecycle example.
- Theme Manager plugin — Dark Theme dependency and secondary dependency chain.
2.568.3 LTS with Java 21; Jenkins
2.568.3 is tested with Java 21 and 25. The disposable controller
image is jenkins/jenkins:2.568.3-lts-jdk21; record its
platform-specific digest before execution. Dark Theme is
652.vea_da_dfea_e769 (requires Jenkins 2.528.3) and
requires Theme Manager ≥ 327.v780d7096ec29; current
Theme Manager is 346.v06cca_64c6a_37 (requires Jenkins
2.504.3). Current upstream Plugin Installation Manager Tool is
2.15.0; verify the exact
jenkins-plugin-cli --version bundled in the selected
controller image. Re-check all of these before reuse because plugin
releases, dependency graphs and advisories change independently.
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.