Checkpoint Lab — LTS Upgrades, Java Runtime Transitions, Plugin Upgrade Strategy, Compatibility Testing, and Rollback Planning
Plan and execute a disposable Jenkins LTS/Java/plugin upgrade, prove acceptance gates, trigger and classify one compatibility failure, and demonstrate recovery from known-good pre-upgrade state.
Learning objectives
- Produce a signed-off current/target compatibility inventory.
- Read and record every skipped LTS guide item that affects the path.
- Create and verify a pre-upgrade recovery artifact.
- Cross the Java/core/plugin boundary on an isolated clone.
- Trigger one controlled compatibility failure and diagnose its layer.
- Run functional, security, agent and performance acceptance checks.
- Demonstrate recovery without naive downgrade of mutated state.
1. Mission
Use only disposable local resources. Start from a synthetic Jenkins 2.541.3 / Java 17 controller, migrate an isolated copy to 2.568.3 / Java 21, reconcile security-sensitive plugins, verify representative behavior, intentionally expose one Java-17 agent incompatibility, and prove you can return to the known-good pre-upgrade controller state.
2. Write the change record before execution
Jenkins upgrade checkpoint
==========================
Current core/runtime: 2.541.3 / Java 17
Target core/runtime: 2.568.3 / Java 21
Crossed LTS guides: 2.555.x, 2.568.x
Current plugin manifest: <path>
Target security-sensitive plugin minimums:
script-security >= 1422.v06869826dd9b_
pipeline-groovy-lib >= 806.v408277b_33d1d
workflow-multibranch >= 842.v3a_b_59b_57b_e6e
Backup ID/checksum: <fill after snapshot>
Representative jobs: upgrade-lab/smoke + optional library/multibranch
Agent pools: lab-java17 -> lab-java21
Acceptance owner: <name/role>
Rollback trigger: <explicit criteria>
Rollback method: restore pre-upgrade state; never downgrade mutated target volume
3. Predict state changes before you perform them
Prediction A — Java boundary
The 2.568.3 controller will run on Java 21; any Jenkins agent process still on Java 17
will be rejected/offline until its runtime is upgraded. Application build JDK selection
is independent and must be tested separately.
Prediction B — persisted controller state
The target clone may migrate plugin/core configuration in its own volume. Therefore the
old controller must never be pointed at that upgraded volume during rollback; recovery
must use the preserved pre-upgrade volume/archive.
Prediction C — plugin security baseline
If Script Security / Groovy Libraries / Multibranch are installed below the 16 Sep fixed
versions, the compatibility gate remains failed even when smoke jobs execute successfully.
4. Execute the staged rehearsal
Follow Lesson 2 exactly: start loopback-only old controller, create representative synthetic state, capture inventory, read guides/advisories, stop, snapshot and checksum, restore to a separate target volume, then start 2.568.3/JDK21 on the clone.
Preserve these identifiers:
| Evidence | Required value |
|---|---|
| Old image | Tag + image digest |
| Target image | Tag + image digest |
| Backup | UTC timestamp + SHA-256 |
| Job | Full name + last known-good build |
| Source | Jenkinsfile/library SHA |
| Plugins | Before + after manifests |
| Agents | Node names + Java + launcher/labels |
| Target startup | First startup log path |
5. Trigger one controlled compatibility failure
Create or retain one disposable inbound agent whose Jenkins agent JVM is Java 17. Attempt connection after the target controller is running. Capture the node/agent log and classify the failure as an agent runtime compatibility problem. Then rebuild/relaunch the same disposable agent on Java 21 and verify it reconnects.
Do not use a production node, do not weaken controller security, and do not include the inbound secret in the evidence packet.
6. Acceptance suite
| Gate | Pass evidence |
|---|---|
| Core/runtime | Controller reports 2.568.3 and Java 21; no startup migration failure |
| Plugins | No failed dependencies; security-sensitive installed plugins meet current fixed versions |
| Configuration | Expected JCasC/system settings present; no unowned drift |
| Authentication/authorization | Synthetic user/admin behavior matches policy |
| Pipeline | Same smoke Jenkinsfile revision completes and artifact digest is retained |
| Agent | Java 21 replacement node online with intended labels/tools |
| SCM/library | Optional representative branch/library path uses exact expected revisions |
| External integrations | Optional staging endpoints verified independently |
| Performance | Chapter 38 bounded workload remains within defined queue/build/JVM envelope |
| Recovery | Old pre-upgrade state can still start separately from untouched snapshot |
7. Demonstrate rollback/recovery
- Stop the upgraded target controller.
- Do not attach the old image to the target volume.
- Start the old controller from the untouched old volume or a fresh restore of the pre-upgrade archive.
- Verify core/Java/job/build identity.
- Record the recovery timestamp and whether external state would require reconciliation in a real incident.
- Stop the recovery controller and retain evidence until the checkpoint report is complete.
8. Make an explicit decision
Decision: ACCEPT / ROLLBACK / FORWARD-FIX / INCONCLUSIVE
Acceptance evidence:
- core/runtime:
- plugins/security advisories:
- configuration:
- pipelines/libraries:
- agents/remoting:
- external integrations:
- performance comparison:
- recovery proof:
Compatibility failure injected:
Root cause layer:
Repair evidence:
Residual risks / unsupported assumptions:
Rollback source retained until:
9. Required evidence packet
- Current and target core/Java versions plus installation/image identity.
- Before/after plugin manifests with security advisory note.
- Skipped LTS guide checklist.
- Backup archive ID/checksum and restore-test result.
- JCasC/configuration source revision or UI ownership note.
- Representative job/build/source/library revisions.
- Controller startup and acceptance logs, redacted.
- Agent names, JVM/launcher/labels and failure/recovery timestamps.
- Artifact/report digest from smoke test.
- Matched Chapter 38 performance snapshot.
- Rollback/recovery proof and residual external-state note.
10. Cleanup
After grading/review, remove only the exact disposable containers/volumes and guarded evidence directory. Keep a copy of the written upgrade report if it is your learning artifact, but strip secrets and ephemeral connection material.
set -euo pipefail
for c in jenkins-upgrade-old jenkins-upgrade-target jenkins-upgrade-rollback; do
docker rm -f "$c" 2>/dev/null || true
done
for v in jenkins-upgrade-home-old jenkins-upgrade-home-target; do
docker volume rm "$v" 2>/dev/null || true
done
LAB='/tmp/jenkins-upgrade-lab'
case "$LAB" in /tmp/jenkins-upgrade-lab) rm -rf -- "$LAB" ;; *) echo 'refusing cleanup' >&2; exit 70 ;; esac
11. What Chapter 39 adds to a production Jenkins operating model
You now have a repeatable upgrade discipline that treats Jenkins LTS, Java, plugins, agent runtimes, Pipeline code, external integrations, security advisories and recovery state as one governed compatibility system. A production upgrade becomes a rehearsed change with measurable gates rather than a maintenance-window experiment.
Chapter 40 uses the same evidence discipline during live incidents: thread dumps, support bundles, stuck builds, agent failures and production playbooks must preserve first-failure evidence before corrective action.
Knowledge check
Answer before revealing the explanation.
1. What is the key proof that rollback is real?
A known-good pre-upgrade snapshot has been restored and started independently with the compatible old core/runtime.
2. Why inject a Java 17 agent failure?
It proves the learner can distinguish controller success from agent runtime compatibility and repair the correct layer.
3. Why can the plugin gate fail even when smoke Pipeline passes?
Installed plugins may still be below current security fixes or have unresolved dependency/health risk.
4. What must remain unchanged for the performance comparison?
The bounded workload, source/tool identity and measurement method; otherwise the comparison is not causal.
5. When should the old recovery source be destroyed?
Only after the target is formally accepted and the organization’s rollback window/recovery policy allows it.
Official references and version notes
Upgrade behavior is version-specific. Always read every skipped LTS guide and the current security advisories for the exact day you plan an upgrade.
- Jenkins LTS Upgrade Guide
- Upgrading to Jenkins LTS 2.555.x
- Upgrading to Jenkins LTS 2.568.x
- Jenkins Java Support Policy
- Upgrade Jenkins runtime to Java 21
- Managing Jenkins plugins
- Using Jenkins agents
- Backing up Jenkins
- Jenkins LTS changelog
- Jenkins Security Advisories
- Jenkins Security Advisory 2026-09-16
- Jenkins Plugin Index
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.