[CloudBees CI 2.277.1.2] JENKINS-56109: Change Jenkins configuration UI from tables to divs

Article ID:360058194871
7 minute readKnowledge base

Introduction

The CloudBees CI release 2.277.1.2 includes JENKINS-56109: Change Jenkins configuration UI from tables to divs. Jenkins core changed its layout form from 'table' to 'div' in 2.264.

Motivation

Jenkins’s jelly framework generated a lot of of tables, which sometimes do not render correctly when changing the window’s size. These tables are very mobile hostile. The UI it generates is also not in line with modern UIs. See JENKINS-56109 for more details.

Expected symptoms of regressions

All plugins which are tier 1, or tier 2 are expected to work properly. However, there might be tier 3 plugins which might not work correctly.

The main symptoms are tables not rendering correctly or form submission failures. In case that an affected plugin is configurable under Manage Jenkins » Configure System, you might not be able to save the Jenkins Global Configuration until the affected plugin is either updated, or disabled - depending on if there is already a plugin release compatible with the change. In the same way, if the plugin is configurable at Job level, jobs might not be able to be reconfigurable until the problem is fixed by either, disabling the plugin or updating the plugin to a compatible version.

Some plugins are known to be broken. The Jenkins Community is tracking the status of these plugins using this EPIC.

Some plugins are broken only in some edge cases. For example Ansible Jenkins plugin (1.1) causes form rendering issue when used via the PostBuildScript plugin (3.0.0) but not on its own. Also, Multijob Plugin (1.36) causes form rendering issues when used via the PostBuildScript plugin (3.0.0) but not on its own.

Apart from the effort from the Jenkins community, the CloudBees support team has gone through the full plugin list provided by the community and has verified the status of each plugin, providing a PR to fix the underlaying issue when possible.

The Appendix A of this document contains the status of each of the plugins which are impacted by this change and its current status at 23rd of April 2021.

Resolution

As a general rule, to avoid any issues related to this change, and any other problem in the March release, it is suggested to:

  1. Make sure Beekeeper is configured to upgrade CAP plugins. For this, ensure that the option Manage Jenkins » Beekeeper Upgrade Assistant » CAP Configuration » Allow automatic upgrades of plugins on restart is enabled

  2. Upgrade all the plugins listed under Manage Jenkins » Manage Plugins (Updates tab)

  3. Run the Groovy script from the Appendix B under Manage Jenkins » Script Console and check if there is still any plugin with a specific issue.

The Build Name and Description Setter is a special case that is resolved by an update of the core version of the product to version 2.332.3 or greater.

Appendix A. Plugins known to be incompatible with the tabs to divs change at the time of release

Plugin Status Provided PR Comments

analysis-core

OBSOLETE

INFRA-2487 This plugin reached end-of-life. All functionality has been integrated into the Warnings Next Generation Plugin and the Static Analysis Model and Parsers Library.

app-detector

INCOMPATIBLE

There is not currently a fix.

artifactory

COMPATIBLE

Compatible since 3.9.1

authorize-project

COMPATIBLE

Compatible since 1.4.0

aws-sqs

INCOMPATIBLE

JENKINS-65834

build-timeout

COMPATIBLE

Compatible since 1.33

checkstyle

INCOMPATIBLE

INFRA-2487 This plugin reached end-of-life. All functionality has been integrated into the Warnings Next Generation Plugin and the Static Analysis Model and Parsers Library.

coverity

OBSOLETE

JENKINS-62855 As per https://plugins.jenkins.io/coverity/ This plugin is no longer maintained. The functionality has been migrated onto the new Synopsys Coverity Jenkins plugin.

createjobadvanced

COMPATIBLE

Compatible since 1.9.0

custom-tools-plugin

COMPATIBLE

Compatible since 0.8

cvs

COMPATIBLE

Compatible since 2.18

deployit-plugin

INCOMPATIBLE

https://github.com/jenkinsci/xldeploy-plugin/pull/72

Not compatible until PR is merged and released by the maintainer.

dry

OBSOLETE

INFRA-2487 This plugin reached end-of-life. All functionality has been integrated into the Warnings Next Generation Plugin and the Static Analysis Model and Parsers Library.

findbugs

OBSOLETE

INFRA-2487 This plugin reached end-of-life. All functionality has been integrated into the Warnings Next Generation Plugin

fortify

COMPATIBLE

Compatible since 20.2.35

fstrigger

COMPATIBLE

Compatible since 0.40

gerrit-trigger

COMPATIBLE

Compatible since 2.32.1

github-sqs-plugin

INCOMPATIBLE

https://github.com/jenkinsci/github-sqs-plugin/pull/20

JENKINS-65729. Not compatible until PR is merged and released by the maintainer

gitlab-plugin

COMPATIBLE

Compatible since 1.5.20

google-container-registry-auth

INCOMPATIBLE

There is not currently a fix.

hp-application-automation-tools

COMPATIBLE

Compatible since 6.8

http_request

COMPATIBLE

Compatible since 1.8.27

job-direct-mail

INCOMPATIBLE

There is not currently a fix.

join

INCOMPATIBLE

https://github.com/jenkinsci/join-plugin/pull/16

JENKINS-64639 Not compatible until PR is released by the maintainer

mask-passwords

COMPATIBLE

Compatible since 3.0

multi-slave-config-plugin

OBSOLETE

Last time it was releases was 5 years ago. This plugin should not be used

multiple-scms

OBSOLETE

This plugin has been marked as deprecated. In general, this means that this plugin is either obsolete, no longer being developed, or may no longer work

neoload-jenkins-plugin

COMPATIBLE

Compatible since 2.2.10

notification

COMPATIBLE

Compatible since 1.14

openstack-cloud

COMPATIBLE

Compatible since 2.57

ownership

COMPATIBLE

Compatible since 0.13.0

perforce

OBSOLETE

This plugin is deprecated. It was superseded by P4 plugin

performance

COMPATIBLE

Compatible since 3.20

performance-signature-dynatrace

COMPATIBLE

Compatible since 3.2.1

performance-signature-dynatracesaas

COMPATIBLE

Compatible since 3.2.1

performance-signature-ui

COMPATIBLE

Compatible since 3.2.1

performance-signature-viewer

COMPATIBLE

Compatible since 3.2.1

plot

COMPATIBLE

Compatible since 2.1.9

pmd

OBSOLETE

INFRA-2487 This plugin reached end-of-life. All functionality has been integrated into the Warnings Next Generation Plugin

PrioritySorter

COMPATIBLE

Compatible since 4.0.0

publish-over-dropbox

COMPATIBLE

Compatible since 1.3.0

publish-over-ftp

COMPATIBLE

Compatible since 1.16

publish-over-ssh

COMPATIBLE

Compatible since 1.21

rebuild

COMPATIBLE

Compatible since 1.32

scriptler

COMPATIBLE

Compatible since 3.2

tasks

OBSOLETE

INFRA-2487 This plugin reached end-of-life. All functionality has been integrated into the Warnings Next Generation Plugin

teamconcert

COMPATIBLE

Compatible since 2.2.1

tfs

INCOMPATIBLE

There is not currently a fix. JENKINS-64241, and Distribution of this plugin has been suspended due to unresolved security vulnerabilities

vsphere-cloud

COMPATIBLE

Compatible since 2.25

warnings

OBSOLETE

INFRA-2487 This plugin reached end-of-life. All functionality has been integrated into the Warnings Next Generation Plugin

xldeploy-plugin

COMPATIBLE

Compatible since 10.0.0

android-emulator

COMPATIBLE

Compatible since 3.1.3

locks-and-latches

OBSOLETE

This plugin has been marked as deprecated. In general, this means that this plugin is either obsolete, no longer being developed, or may no longer work

Appendix B. Health check Groovy script

import hudson.util.VersionNumber

def plugins = [
        'analysis-core': [version: null, status: 'obsolete', fix: ''],
        'app-detector': [version: null, status: 'incompatible', fix: ''],
        'artifactory': [version: new VersionNumber('3.9.1'), status: 'incompatible', fix: ''],
        'authorize-project': [version: new VersionNumber('1.4.0'), status: 'incompatible', fix: ''],
        'aws-sqs': [version: null, status: 'incompatible', fix: ''],
        'checkstyle': [version: null, status: 'incompatible', fix: ''],
        'coverity': [version: null, status: 'obsolete', fix: ''],
        'createjobadvanced': [version: new VersionNumber('1.9.0'), status: 'incompatible', fix: ''],
        'custom-tools-plugin': [version: new VersionNumber('0.8'), status: 'incompatible', fix: ''],
        'cvs': [version: new VersionNumber('2.18'), status: 'incompatible', fix: ''],
        'deployit-plugin': [version: null, status: 'incompatible', fix: 'https://github.com/jenkinsci/xldeploy-plugin/pull/72'],
        'dry': [version: null, status: 'obsolete', fix: ''],
        'findbugs': [version: null, status: 'incompatible', fix: ''],
        'fortify': [version: new VersionNumber('20.2.35'), status: 'incompatible', fix: ''],
        'fstrigger': [version: new VersionNumber('0.40'), status: 'incompatible', fix: ''],
        'gerrit-trigger': [version: new VersionNumber('2.32.1'), status: 'incompatible', fix: ''],
        'github-sqs-plugin': [version: null, status: 'incompatible', fix: ''],
        'gitlab-plugin': [version: new VersionNumber('1.5.20'), status: 'incompatible', fix: 'https://github.com/jenkinsci/gitlab-plugin/pull/1109'],
        'google-container-registry-auth': [version: null, status: 'incompatible', fix: ''],
        'hp-application-automation-tools-plugin': [version: new VersionNumber('6.8'), status: 'incompatible', fix: ''],
        'http_request': [version: new VersionNumber('1.8.27'), status: 'incompatible', fix: ''],
        'job-direct-mail': [version: null, status: 'incompatible', fix: ''],
        'join': [version: null, status: 'incompatible', fix: 'https://github.com/jenkinsci/join-plugin/pull/16'],
        'mask-passwords': [version: new VersionNumber('3.0'), status: 'incompatible', fix: ''],
        'multi-slave-config-plugin': [version: null, status: 'obsolete', fix: ''],
        'multiple-scms': [version: null, status: 'obsolete', fix: ''],
        'neoload-jenkins-plugin': [version: new VersionNumber('2.2.10'), status: 'incompatible', fix: 'https://github.com/jenkinsci/neoload-plugin/pull/18'],
        'notification': [version: new VersionNumber('1.14'), status: 'incompatible', fix: ''],
        'openstack-cloud': [version: new VersionNumber('2.57'), status: 'incompatible', fix: ''],
        'ownership': [version: new VersionNumber('0.13.0'), status: 'incompatible', fix: ''],
        'perforce': [version: null, status: 'obsolete', fix: ''],
        'performance': [version: new VersionNumber('3.20'), status: 'incompatible', fix: ''],
        'performance-signature-dynatrace': [version: new VersionNumber('3.2.1'), status: 'incompatible', fix: ''],
        'performance-signature-dynatracesaas': [version: new VersionNumber('3.2.1'), status: 'incompatible', fix: ''],
        'performance-signature-ui': [version: new VersionNumber('3.2.1'), status: 'incompatible', fix: ''],
        'performance-signature-viewer': [version: new VersionNumber('3.2.1'), status: 'incompatible', fix: ''],
        'plot': [version: new VersionNumber('2.1.9'), status: 'incompatible', fix: ''],
        'pmd': [version: null, status: 'incompatible', fix: ''],
        'PrioritySorter': [version: new VersionNumber('4.0.0'), status: 'incompatible', fix: 'https://github.com/jenkinsci/priority-sorter-plugin/pull/53'],
        'publish-over-dropbox': [version: new VersionNumber('1.3.0'), status: 'incompatible', fix: 'https://github.com/jenkinsci/publish-over-dropbox-plugin/pull/4'],
        'publish-over-ftp': [version: new VersionNumber('1.16'), status: 'incompatible', fix: 'https://github.com/jenkinsci/publish-over-ftp-plugin/pull/9'],
        'publish-over-ssh': [version: new VersionNumber('1.21'), status: 'incompatible', fix: ''],
        'rebuild': [version: new VersionNumber('1.32'), status: 'incompatible', fix: ''],
        'scriptler': [version: new VersionNumber('3.2'), status: 'incompatible', fix: ''],
        'tasks': [version: null, status: 'incompatible', fix: ''],
        'teamconcert': [version: new VersionNumber('2.2.1'), status: 'incompatible', fix: ''],
        'tfs': [version: null, status: 'incompatible', fix: ''],
        'vsphere-cloud': [version: new VersionNumber('2.25'), status: 'incompatible', fix: ''],
        'warnings': [version: null, status: 'incompatible', fix: ''],
        'xldeploy-plugin': [version: new VersionNumber('10.0.0'), status: 'incompatible', fix: 'https://github.com/jenkinsci/xldeploy-plugin/pull/72/files'],
        'android-emulator': [version: new VersionNumber('3.1.3'), status: 'incompatible', fix: 'https://github.com/jenkinsci/android-emulator-plugin/pull/83/'],
        'locks-and-latches': [version: null, status: 'obsolete', fix: '']
]

println "------------------------- Legend -------------------------"
println "obsolete: The plugin should not be used anymore. No test was performed at all."
println "incompatible: The plugin is not compatible and should be removed"
println "------------------------- List of issues -------------------------"

Jenkins.get().pluginManager.plugins.findAll({plugins.containsKey(it.shortName)}).each {
    def pluginIssue = plugins.get(it.shortName)

    if (pluginIssue.version == null || it.isOlderThan(pluginIssue.version)) {
        print "[WARNING] '${it.displayName}' status is ${pluginIssue.status}"
        if (pluginIssue.version) {
            print " but there is new version with a fix ${pluginIssue.version}"
        } else if (!pluginIssue.fix.isEmpty()) {
            print " but there is PR with the fix ${pluginIssue.fix}"
        }
        println()
    }
}

println "-------------------------"

Appendix C. List of all tabs to divs reported issue

All issues that were reported and related to tabs to divs are available in this table.