How to use `.jenkins-table` css in Jenkins build page

Hello everyone,

I’m trying to create a table with .jenkins-table css in build summary, by following the example in design-library/Table , here is the sample Jenkinsfile ( with badge plugin ):

#!/usr/bin/env groovy

addSummary icon: 'symbol-terminal',
           text: '''
                   <h2>PIPELINE DETAILS</h2>
                    <table class="jenkins-table sortable jenkins-!-margin-bottom-0">
                      <thead>
                        <th>NAME</th>
                        <th>STATUS</th>
                        <th>REASON</th>
                      </thead>
                      <tbody>
                      <tr>
                        <td><a href="#">Link 1</a></td>
                        <td>Success <a href="#">#7</a></td>
                        <td>No Errors</td>
                      </tr>
                      <tr>
                        <td><a href="#">Link 2</a></td>
                        <td>Failure</td>
                        <td>Can't compile</td>
                      </tr>
                      <tr>
                        <td><a href="#">Link 3</a></td>
                        <td>Unstable</td>
                        <td>Test Failed</td>
                      </tr>
                      </tbody>
                    </table>
                 '''.stripIndent()

However, the class of table tag ( class="jenkins-table sortable jenkins-!-margin-bottom-0" ) have been stripped after build the pipeline ( as below )

So, I’ve tried to manual added the official table class in HTML, and find out it actually works:

  • dark theme

    css-jenkins-table

  • light theme

    css-jenkins-table-light-theme

I’d like to know how to enable this the “official” css in the pipeline build page ?


BTW, the hudson.model.DirectoryBrowserSupport.CSP has been set to "" ( empty ), and here is the system info

Jenkins Info

Groovy: 2.4.21
Jenkins: 2.479.2
OS: Linux - 4.19.12-1.el7.elrepo.x86_64
Java: 17.0.13 - Eclipse Adoptium (OpenJDK 64-Bit Server VM)
---
PrioritySorter:5.2.0
analysis-model-api:12.9.1
ansicolor:1.0.5
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.4-124.v31e2987e48f4
artifactory:4.0.8
asm-api:9.7.1-97.v4cc844130d97
atlassian-bitbucket-server-integration:4.1.2
authentication-tokens:1.119.v50285141b_7e1
badge:2.5
blueocean:1.27.16
blueocean-autofavorite:1.2.5
blueocean-bitbucket-pipeline:1.27.16
blueocean-commons:1.27.16
blueocean-config:1.27.16
blueocean-core-js:1.27.16
blueocean-dashboard:1.27.16
blueocean-display-url:2.4.3
blueocean-events:1.27.16
blueocean-git-pipeline:1.27.16
blueocean-github-pipeline:1.27.16
blueocean-i18n:1.27.16
blueocean-jira:1.27.16
blueocean-jwt:1.27.16
blueocean-personalization:1.27.16
blueocean-pipeline-api-impl:1.27.16
blueocean-pipeline-editor:1.27.16
blueocean-pipeline-scm-api:1.27.16
blueocean-rest:1.27.16
blueocean-rest-impl:1.27.16
blueocean-web:1.27.16
bootstrap5-api:5.3.3-1
bouncycastle-api:2.30.1.78.1-248.ve27176eb_46cb_
branch-api:2.1202.vc51412f3ed84
build-timeout:1.33
buildtriggerbadge:251.vdf6ef853f3f5
caffeine-api:3.1.8-133.v17b_1ff2e0599
categorized-view:164.v1c1b_dd4cdb_62
checks-api:2.2.1
cloud-stats:336.v788e4055508b_
cloudbees-bitbucket-branch-source:933.0.2
cloudbees-disk-usage-simple:232.v713eeed2e1f4
cloudbees-folder:6.975.v4161e479479f
cobertura:1.17
code-coverage-api:4.99.0
command-launcher:116.vd85919c54a_d6
commons-compress-api:1.26.1-2
commons-lang3-api:3.17.0-84.vb_b_938040b_078
commons-text-api:1.12.0-129.v99a_50df237f7
config-file-provider:980.v88956a_a_5d6a_d
configuration-as-code:1903.v004d55388f30
confluence-publisher:163.vf906edb_73cce
copyartifact:757.v05365583a_455
coverage:1.16.1
credentials:1393.v6017143c1763
credentials-binding:687.v619cb_15e923f
custom-checkbox-parameter:1.4
custom-folder-icon:2.17
customizable-header:143.v6cb_d4e85f9d5
dark-theme:514.va_3ea_73d65dc1
data-tables-api:2.1.8-1
discard-old-build:1.07
display-url-api:2.209.v582ed814ff2f
docker-commons:445.v6b_646c962a_94
docker-workflow:580.vc0c340686b_54
downstream-build-cache:1.7
durable-task:581.v299a_5609d767
dynamic_extended_choice_parameter:1.0.1
echarts-api:5.5.1-4
eddsa-api:0.3.0-4.v84c6f0f4969e
email-ext:1866.v14fa_6d201654
emoji-symbols-api:13.v723a_b_8e234d1
envinject:2.919.v009a_a_1067cd0
envinject-api:1.199.v3ce31253ed13
extended-choice-parameter:382.v5697b_32134e8
extended-read-permission:53.v6499940139e5
favorite:2.221.v19ca_666b_62f5
file-leak-detector:1.13
file-parameters:339.v4b_cc83e11455
flatpickr-api:4.6.13-5.v534d8025a_a_59
font-awesome-api:6.6.0-2
forensics-api:2.7.0
gerrit-code-review:0.4.9
gerrit-trigger:2.42.0
git:5.6.0
git-client:6.1.0
git-forensics:2.2.1
github:1.40.0
github-api:1.321-478.vc9ce627ce001
github-branch-source:1807.v50351eb_7dd13
gradle:2.14
groovy:457.v99900cb_85593
groovy-postbuild:267.va_df06de9fa_fa_
gson-api:2.11.0-85.v1f4e87273c33
handy-uri-templates-2-api:2.1.8-30.v7e777411b_148
hashicorp-vault-pipeline:1.4
hashicorp-vault-plugin:371.v884a_4dd60fb_6
htmlpublisher:1.37
instance-identity:201.vd2a_b_5a_468a_a_6
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:280.v050b_5c849f69
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.16
jersey2-api:2.44-151.v6df377fff741
jfrog:1.5.6
jira:3.13
jira-steps:2.0.165.v8846cf59f3db
jjwt-api:0.11.5-112.ve82dfb_224b_a_d
job-dsl:1.90
jobConfigHistory:1283.veb_dfb_00b_5ec0
joda-time-api:2.13.0-93.v9934da_29b_a_e9
jqs-monitoring:37.vf50a_82a_0b_f32
jquery:1.12.4-3
jquery3-api:3.7.1-2
jsch:0.2.16-86.v42e010d9484b_
json-api:20240303-101.v7a_8666713110
json-path-api:2.9.0-118.v7f23ed82a_8b_8
junit:1311.v39e1716e4eb_e
klocwork:2023.3.1
kubernetes:4304.v1b_39d4f98210
kubernetes-cli:1.12.1
kubernetes-client-api:6.10.0-240.v57880ce8b_0b_2
kubernetes-credentials:190.v03c305394deb_
ldap:770.vb_455e934581a_
lockable-resources:1327.ved786b_a_197e0
login-theme:244.vd67c77f0c4c8
logstash:2.5.0218.v0a_ff8fefc12b_
mail-watcher-plugin:1.19
mailer:489.vd4b_25144138f
mapdb-api:1.0.9-40.v58107308b_7a_7
markdown-formatter:235.v2b_16f8e14918
material-theme:0.5.2-rc100.6121925fe229
matrix-auth:3.2.3
matrix-project:840.v812f627cb_578
maven-plugin:3.24
metrics:4.2.21-458.vcf496cb_839e4
mina-sshd-api-common:2.14.0-136.v4d2b_0853615e
mina-sshd-api-core:2.14.0-136.v4d2b_0853615e
monitoring:2.4.0
nested-view:1.36
nodejs:1.6.2
okhttp-api:4.11.0-181.v1de5b_83857df
oss-symbols-api:289.v2453d7c1591d
pam-auth:1.11
parameter-separator:258.vc2a_4c51b_de4c
parameterized-scheduler:277.v61a_4b_a_49a_c5c
parameterized-trigger:806.vf6fff3e28c3e
people-view:1.2
permissive-script-security:0.7
pipeline-build-step:540.vb_e8849e1a_b_d8
pipeline-graph-analysis:216.vfd8b_ece330ca_
pipeline-graph-view:382.vb_9a_27b_7b_ea_71
pipeline-groovy-lib:744.v5b_556ee7c253
pipeline-input-step:495.ve9c153f6067b_
pipeline-milestone-step:119.vdfdc43fc3b_9a_
pipeline-model-api:2.2218.v56d0cda_37c72
pipeline-model-definition:2.2218.v56d0cda_37c72
pipeline-model-extensions:2.2218.v56d0cda_37c72
pipeline-rest-api:2.34
pipeline-stage-step:312.v8cd10304c27a_
pipeline-stage-tags-metadata:2.2218.v56d0cda_37c72
pipeline-stage-view:2.34
pipeline-timeline:1.0.3
pipeline-utility-steps:2.18.0
plain-credentials:183.va_de8f1dd5a_2b_
plugin-usage-plugin:4.8
plugin-util-api:5.1.0
prism-api:1.29.0-18
promoted-builds:965.vcda_c6a_e0998f
pubsub-light:1.18
rebuild:332.va_1ee476d8f6d
resource-disposer:0.25
role-strategy:743.v142ea_b_d5f1d3
scm-api:698.v8e3b_c788f0a_6
script-security:1369.v9b_98a_4e95b_2d
sectioned-view:1.29
simple-theme-plugin:196.v96d9592f4efa_
slack:751.v2e44153c8fe1
snakeyaml-api:2.3-123.v13484c65210a_
sse-gateway:1.27
ssh-agent:376.v8933585c69d3
ssh-credentials:349.vb_8b_6b_9709f5b_
ssh-slaves:2.1010.v64ec48721231
sshd:3.330.vc866a_8389b_58
structs:338.v848422169819
subversion:1281.vc8837f91a_07a_
theme-manager:262.vc57ee4a_eda_5d
timestamper:1.28
token-macro:400.v35420b_922dcb_
trilead-api:2.147.vb_73cc728a_32e
uno-choice:2.8.6
validating-string-parameter:251.vc34e592b_8a_4d
variant:60.v7290fc0eb_b_cd
versioncolumn:243.vda_c20eea_a_8a_f
warnings-ng:11.12.0
workflow-aggregator:600.vb_57cdd26fdd7
workflow-api:1336.vee415d95c521
workflow-basic-steps:1058.vcb_fc1e3a_21a_9
workflow-cps:4000.v5198556e9cea_
workflow-durable-task-step:1398.vf6c9e89e5988
workflow-job:1472.ve4d5eca_143c4
workflow-multibranch:795.ve0cb_1f45ca_9a_
workflow-scm-step:427.v4ca_6512e7df1
workflow-step-api:678.v3ee58b_469476
workflow-support:936.v9fa_77211ca_e1
ws-cleanup:0.48
yet-another-build-visualizer:1.17
  

I think this is not possible. The badge plugin must apply security mechanism to avoid that people can inject malicious code on the page. This implies calling the owasp markup formatter that removes classes from html elements