A way to seperate plugin configuration from system?

Hello there atm were migrating our older jenkins installations and we are using an extensive list of plugins.

Iam quite new to jenkins administration and i find it very diffcult/annoying that every plugin configuration is integrated into the normal jenkins ui.

Often i cant see what iam currently configuring is it a plugin or an function thats build in?

Other tools that provide plugins let you configure plugins on a one by one basis in an seperate dialog.

Like you select the plugin in the plugin manager where you can also install/update them and then you have an config button for it and then can configure this one plugin only.

But for jenkins you get one large continous configure website where you can scroll for a long time.

Is there any setting/plugin or something i can do to unclutter/seperate/sort my jenkins config ui?

Even just splitting plugin configuration from builtin functions would help a lot.

Thanks in advance :slight_smile:

Jenkins setup:

Jenkins: 2.452.3
OS: Linux - 5.14.0-362.18.1.el9_3.x86_64
Java: 21.0.2 - Red Hat, Inc. (OpenJDK 64-Bit Server VM)
---
ansicolor:1.0.4
ant:497.v94e7d9fffa_b_9
antisamy-markup-formatter:162.v0e6ec0fcfcf6
apache-httpcomponents-client-4-api:4.5.14-208.v438351942757
asm-api:9.7-33.v4d23ef79fcc8
atlassian-bitbucket-server-integration:4.0.0
authentication-tokens:1.119.v50285141b_7e1
bitbucket:241.v6d24a_57f9359
bitbucket-pullrequest-builder:1.5.0
blueocean:1.27.14
blueocean-autofavorite:1.2.5
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-jira: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
caffeine-api:3.1.8-133.v17b_1ff2e0599
checks-api:2.2.0
cloudbees-bitbucket-branch-source:888.v8e6d479a_1730
cloudbees-folder:6.928.v7c780211d66e
command-launcher:107.v773860566e2e
commons-compress-api:1.26.1-2
commons-lang3-api:3.14.0-76.vda_5591261cfe
commons-text-api:1.12.0-119.v73ef73f2345d
config-file-provider:973.vb_a_80ecb_9a_4d0
credentials:1371.vfee6b_095f0a_3
credentials-binding:681.vf91669a_32e45
data-tables-api:2.0.8-1
display-url-api:2.204.vf6fddd8a_8b_e9
docker-commons:439.va_3cb_0a_6a_fb_29
docker-workflow:580.vc0c340686b_54
durable-task:555.v6802fe0f0b_82
echarts-api:5.5.0-1
eddsa-api:0.3.0-4.v84c6f0f4969e
email-ext:1814.v404722f34263
emailext-template:1.5
favorite:2.218.vd60382506538
font-awesome-api:6.5.2-1
git:5.2.2
git-client:5.0.0
git-parameter:0.9.19
git-server:126.v0d945d8d2b_39
github:1.39.0
github-api:1.321-468.v6a_9f5f2d5a_7e
github-branch-source:1793.v1831e9c68d77
gson-api:2.11.0-41.v019fcf6125dc
h2-api:11.1.4.199-30.v1c64e772f3a_c
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
javadoc:243.vb_b_503b_b_45537
javax-activation-api:1.2.0-7
javax-mail-api:1.6.2-10
jaxb:2.3.9-1
jdk-tool:73.vddf737284550
jenkins-design-language:1.27.14
jersey2-api:2.42-147.va_28a_44603b_d5
jira:3.13
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:1280.v310a_78b_9a_1e0
ldap:725.v3cb_b_711b_1a_ef
locale:519.v4e20f313cfa_f
lockable-resources:1255.vf48745da_35d0
m2release:0.16.4
mailer:472.vf7c289a_4b_420
matrix-auth:3.2.2
matrix-project:832.va_66e270d2946
maven-plugin:3.23
mercurial:1260.vdfb_723cdcc81
mina-sshd-api-common:2.13.1-117.v2f1a_b_66ff91d
mina-sshd-api-core:2.13.1-117.v2f1a_b_66ff91d
nodejs:1.6.1
okhttp-api:4.11.0-172.vda_da_1feeb_c6e
pam-auth:1.11
parameterized-scheduler:277.v61a_4b_a_49a_c5c
pipeline-build-step:540.vb_e8849e1a_b_d8
pipeline-graph-analysis:216.vfd8b_ece330ca_
pipeline-groovy-lib:727.ve832a_9244dfa_
pipeline-input-step:495.ve9c153f6067b_
pipeline-maven:1421.v610fa_b_e2d60e
pipeline-maven-api:1421.v610fa_b_e2d60e
pipeline-milestone-step:119.vdfdc43fc3b_9a_
pipeline-model-api:2.2205.vc9522a_9d5711
pipeline-model-definition:2.2205.vc9522a_9d5711
pipeline-model-extensions:2.2205.vc9522a_9d5711
pipeline-npm:204.v4dc4c2202625
pipeline-rest-api:2.34
pipeline-stage-step:312.v8cd10304c27a_
pipeline-stage-tags-metadata:2.2205.vc9522a_9d5711
pipeline-stage-view:2.34
pipeline-utility-steps:2.17.0
plain-credentials:183.va_de8f1dd5a_2b_
plugin-util-api:4.1.0
publish-over:0.22
publish-over-ftp:1.17
pubsub-light:1.18
resource-disposer:0.23
robot:3.5.2
saferestart:0.7
scm-api:696.v778d637b_a_762
script-security:1341.va_2819b_414686
snakeyaml-api:2.2-111.vc6598e30cc65
sse-gateway:1.27
ssh-credentials:343.v884f71d78167
ssh-slaves:2.973.v0fa_8c0dea_f9f
sshd:3.330.vc866a_8389b_58
stashNotifier:1.492.v1b_33f185ee18
structs:338.v848422169819
test-results-analyzer:0.4.1
token-macro:400.v35420b_922dcb_
trilead-api:2.147.vb_73cc728a_32e
uno-choice:2.8.3
variant:60.v7290fc0eb_b_cd
versioncolumn:243.vda_c20eea_a_8a_f
workflow-aggregator:600.vb_57cdd26fdd7
workflow-api:1322.v857eeeea_9902
workflow-basic-steps:1058.vcb_fc1e3a_21a_9
workflow-cps:3922.va_f73b_7c4246b_
workflow-durable-task-step:1364.v2fd76fb_6fd41
workflow-job:1400.v7fd111b_ec82f
workflow-multibranch:783.787.v50539468395f
workflow-scm-step:427.v4ca_6512e7df1
workflow-step-api:678.v3ee58b_469476
workflow-support:920.v59f71ce16f04
ws-cleanup:0.46
xvfb:1.2

You have two basic approaches available (others may may additional approaches) …

The preferred option is to leverage Jenkins Configuration as Code by installing the JCasC plugin. You can break up the configurations into files within a given configuration directory,

( Path to a folder containing a set of config files. For example, /var/jenkins_home/casc_configs)

The easiest approach is to install the plugin, export the configuration, review it, edit it for missing details, load it into a new Jenkins instance to validate, then work on splitting the single casc_config.yml for the various plugins, and repeat the validation.

JCasc also supports the Jenkins system configuration parameters.

You need not break it up into 1:1 as it may make sense to group some configurations together. Some plugins may not be supported yet by JCasC, so you’ll need to resort to an alternative (eg: plugin-config.xml file or init.groovy.d). Be aware that some plugins actually support loading multiple configurations and aggregate, while some others will overwrite the last loaded file, if you wanted to break down beyond 1:1.

Where JCasC is not supported, you can generally use the legacy configuration approach using a Groovy Hook script. Some examples

The alternative is to dig under the covers. Originally, the plugins all saved their configuration details within a single file ${JENKINS_HOME/config.xml. The current preferred approach is plugins write to their own plugin-config.xml (name corresponding to plugin or classpath).

Thanks for the reply J

Configuration as code is an interesting option.

That may be the solution if we need to install a decent number of machines using ansible.

Two other things i found out that help me to „get around“ are:

1: Having jenkins set to your native language

Basically all plugins use english text.

So if i see english text in my otherwise german jenkins i directly know that belongs to an plugin

2: The little „?“ button next to a config box.

Shows further information about that configuration and also often shows the full jenkins plugin name that box belongs to.

Also you can rearange the config boxes alltogether using drag and drop to your liking.