Mismatched Java versions between Controller and Agents in Docker

I am currently running a Jenkins controller inside a docker container which uses JDK11. As this is reaching EOL in the next few weeks I have started trying to migrate to using JDK21. To do this I have cloned the server and run a docker image with the latest JDK using the same volume for the jenkins data and this is now recognising the previous pipelines and settings.

For running jobs I have configured the system to run docker containers with custom images using the docker plugin, and these docker agent templates are configured to attach to the controller, rather than connect over SSH or with JNLP.

I expected that once I had updated the controller to JDK21 that my currently configured pipelines would start to fail, as the docker based Jenkins agents are running older versions of Java, but to my surprise they continued to function.

Digging into it further I found that on the latest versions of the docker based jenkins agents they are actually running JDK17, so don’t match my previous controller version of JDK11 or my new version of JDK21. My hypothesis is that because the docker plugin is attaching the containers I am effectively sidestepping the requirement for the agents and controller to use the same version of Java, but I’m not sure I want to rely on this hypothesis in a production environment.

Has anyone else encountered a similar issue (or non-issue, since things are actually working)? I do have a conventional agent running on a machine with JDK11 and that is connected to my existing controller, but fails to connect to my updated controller as I would expect from the documentation, so it does appear to be isolated to agents in attached docker containers.

The information below is the output of the code found here on the updated Jenkins controller

Jenkins setup:

Jenkins: 2.476
OS: Linux - 5.4.0-193-generic
Java: 21.0.4 - Eclipse Adoptium (OpenJDK 64-Bit Server VM)
---
analysis-model-api:12.5.0
ant:511.v0a_a_1a_334f41b_
antisamy-markup-formatter:162.v0e6ec0fcfcf6
apache-httpcomponents-client-4-api:4.5.14-208.v438351942757
apache-httpcomponents-client-5-api:5.3.1-117.v4d95117cd34f
asm-api:9.7-33.v4d23ef79fcc8
atlassian-jira-software-cloud:2.0.15
authentication-tokens:1.119.v50285141b_7e1
blueocean:1.27.14
blueocean-bitbucket-pipeline:1.27.14
blueocean-commons:1.27.14
blueocean-config:1.27.14
blueocean-core-js:1.27.14
blueocean-dashboard:1.27.14
blueocean-display-url:2.4.3
blueocean-events:1.27.14
blueocean-git-pipeline:1.27.14
blueocean-github-pipeline:1.27.14
blueocean-i18n:1.27.14
blueocean-jwt:1.27.14
blueocean-personalization:1.27.14
blueocean-pipeline-api-impl:1.27.14
blueocean-pipeline-editor:1.27.14
blueocean-pipeline-scm-api:1.27.14
blueocean-rest:1.27.14
blueocean-rest-impl:1.27.14
blueocean-web:1.27.14
bootstrap5-api:5.3.3-1
bouncycastle-api:2.30.1.78.1-248.ve27176eb_46cb_
branch-api:2.1178.v969d9eb_c728e
build-timeout:1.33
caffeine-api:3.1.8-133.v17b_1ff2e0599
checks-api:2.2.1
cloud-stats:336.v788e4055508b_
cloudbees-bitbucket-branch-source:888.v8e6d479a_1730
cloudbees-folder:6.951.v5f91d88d76b_b_
cobertura:1.17
code-coverage-api:4.99.0
command-launcher:115.vd8b_301cc15d0
commons-lang3-api:3.17.0-84.vb_b_938040b_078
commons-text-api:1.12.0-129.v99a_50df237f7
coverage:1.16.1
credentials:1371.vfee6b_095f0a_3
credentials-binding:681.vf91669a_32e45
dashboard-view:2.517.v776a_b_811a_b_4e
data-tables-api:2.1.6-1
display-url-api:2.204.vf6fddd8a_8b_e9
docker-commons:443.v921729d5611d
docker-java-api:3.3.6-90.ve7c5c7535ddd
docker-plugin:1.6.2
docker-workflow:580.vc0c340686b_54
durable-task:568.v8fb_5c57e8417
echarts-api:5.5.1-1
eddsa-api:0.3.0-4.v84c6f0f4969e
email-ext:1814.v404722f34263
embeddable-build-status:487.va_0ef04c898a_2
favorite:2.221.v19ca_666b_62f5
font-awesome-api:6.6.0-2
forensics-api:2.5.0
git:5.4.1
git-client:5.0.0
github:1.40.0
github-api:1.321-478.vc9ce627ce001
github-branch-source:1797.v86fdb_4d57d43
github-oauth:611.v70d151e60ec4
gradle:2.12.1
gson-api:2.11.0-41.v019fcf6125dc
handy-uri-templates-2-api:2.1.8-30.v7e777411b_148
htmlpublisher:1.36
instance-identity:185.v303dc7c645f9
ionicons-api:74.v93d5eb_813d5f
jackson2-api:2.17.0-379.v02de8ec9f64c
jakarta-activation-api:2.1.3-1
jakarta-mail-api:2.1.3-1
javax-activation-api:1.2.0-7
javax-mail-api:1.6.2-10
jaxb:2.3.9-1
jdk-tool:80.v8a_dee33ed6f0
jenkins-design-language:1.27.14
jjwt-api:0.11.5-112.ve82dfb_224b_a_d
joda-time-api:2.12.7-29.v5a_b_e3a_82269a_
jquery3-api:3.7.1-2
jsch:0.2.16-86.v42e010d9484b_
json-api:20240303-41.v94e11e6de726
json-path-api:2.9.0-58.v62e3e85b_a_655
junit:1300.v03d9d8a_cf1fb_
ldap:733.vd3700c27b_043
mailer:472.vf7c289a_4b_420
matrix-auth:3.2.2
matrix-project:832.va_66e270d2946
mina-sshd-api-common:2.13.2-125.v200281b_61d59
mina-sshd-api-core:2.13.2-125.v200281b_61d59
okhttp-api:4.11.0-181.v1de5b_83857df
pam-auth:1.11
pipeline-build-step:540.vb_e8849e1a_b_d8
pipeline-github-lib:61.v629f2cc41d83
pipeline-graph-analysis:216.vfd8b_ece330ca_
pipeline-groovy-lib:730.ve57b_34648c63
pipeline-input-step:495.ve9c153f6067b_
pipeline-milestone-step:119.vdfdc43fc3b_9a_
pipeline-model-api:2.2214.vb_b_34b_2ea_9b_83
pipeline-model-definition:2.2214.vb_b_34b_2ea_9b_83
pipeline-model-extensions:2.2214.vb_b_34b_2ea_9b_83
pipeline-rest-api:2.34
pipeline-stage-step:312.v8cd10304c27a_
pipeline-stage-tags-metadata:2.2214.vb_b_34b_2ea_9b_83
pipeline-stage-view:2.34
plain-credentials:183.va_de8f1dd5a_2b_
plugin-util-api:4.1.0
prism-api:1.29.0-17
publish-over:0.22
publish-over-ssh:1.25
pubsub-light:1.18
resource-disposer:0.23
scm-api:696.v778d637b_a_762
script-security:1361.v913100720139
slack:741.v00f9591c586d
snakeyaml-api:2.3-123.v13484c65210a_
sse-gateway:1.27
ssh-credentials:343.v884f71d78167
ssh-slaves:2.973.v0fa_8c0dea_f9f
sshd:3.330.vc866a_8389b_58
structs:338.v848422169819
timestamper:1.27
token-macro:400.v35420b_922dcb_
trilead-api:2.147.vb_73cc728a_32e
variant:60.v7290fc0eb_b_cd
warnings-ng:11.5.0
workflow-aggregator:600.vb_57cdd26fdd7
workflow-api:1336.vee415d95c521
workflow-basic-steps:1058.vcb_fc1e3a_21a_9
workflow-cps:3961.ve48ee2c44a_b_3
workflow-durable-task-step:1371.vb_7cec8f3b_95e
workflow-job:1436.vfa_244484591f
workflow-multibranch:795.ve0cb_1f45ca_9a_
workflow-scm-step:427.v4ca_6512e7df1
workflow-step-api:678.v3ee58b_469476
workflow-support:920.v59f71ce16f04
ws-cleanup:0.46
xcode-plugin:2.0.17-565.v1c48051d46ef

There is no strict requirement that controller and agents must run the same Java version but it is recommended. Agents must run at least the minimum required Java version for a given controller version.
Starting 2.463 Jenkins requires Java 17 for the controller so any agent that wants to connect to such a Jenkins also needs Java 17.
For version 2.462.x and older you need at least Java 11 for controller and agents.
The way how agents connect to the controller (ssh, jnlp or websocket, docker also uses either jnlp or websocket) doesn’t matter.

1 Like

Ah, I see! That makes sense, I was going in circles thinking that matching Java versions was a requirement rather than a recommendation. Thanks for clarifying and putting my mind at ease!