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

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.

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.

Environment

This change is present since the 2.277.1 line in all products listed below. And issues might be seen when you upgrade from a version prior to CloudBees CI 2.277.1.

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.

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

PluginStatusProvided PRComments
analysis-coreOBSOLETE 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-detectorINCOMPATIBLE There is not currently a fix.
artifactoryCOMPATIBLE Compatible since 3.9.1
authorize-projectCOMPATIBLE Compatible since 1.4.0
aws-sqsINCOMPATIBLE JENKINS-65834
build-name-setter-pluginINCOMPATIBLE JENKINS-65549
checkstyleINCOMPATIBLE 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.
coverityOBSOLETE 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.
createjobadvancedCOMPATIBLE Compatible since 1.9.0
custom-tools-pluginCOMPATIBLE Compatible since 0.8
cvsCOMPATIBLE Compatible since 2.18
deployit-pluginINCOMPATIBLEhttps://github.com/jenkinsci/xldeploy-plugin/pull/72Not compatible until PR is merged and released by the maintainer.
dryOBSOLETE 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.
findbugsOBSOLETE INFRA-2487 This plugin reached end-of-life. All functionality has been integrated into the Warnings Next Generation Plugin
fortifyCOMPATIBLE Compatible since 20.2.35
fstriggerCOMPATIBLE Compatible since 0.40
gerrit-triggerCOMPATIBLE Compatible since 2.32.1
github-sqs-pluginINCOMPATIBLEhttps://github.com/jenkinsci/github-sqs-plugin/pull/20JENKINS-65729. Not compatible until PR is merged and released by the maintainer
gitlab-pluginCOMPATIBLE Compatible since 1.5.20
google-container-registry-authINCOMPATIBLE There is not currently a fix.
hp-application-automation-toolsCOMPATIBLE Compatible since 6.8
http_requestCOMPATIBLE Compatible since 1.8.27
job-direct-mailINCOMPATIBLE There is not currently a fix.
joinINCOMPATIBLEhttps://github.com/jenkinsci/join-plugin/pull/16JENKINS-64639 Not compatible until PR is released by the maintainer
mask-passwordsCOMPATIBLE Compatible since 3.0
multi-slave-config-pluginOBSOLETE Last time it was releases was 5 years ago. This plugin should not be used
multiple-scmsOBSOLETE 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-pluginCOMPATIBLE Compatible since 2.2.10
notificationCOMPATIBLE Compatible since 1.14
openstack-cloudCOMPATIBLE Compatible since 2.57
ownershipCOMPATIBLE Compatible since 0.13.0
perforceOBSOLETE This plugin is deprecated. It was superseded by P4 plugin
performanceCOMPATIBLE Compatible since 3.20
performance-signature-dynatraceCOMPATIBLE Compatible since 3.2.1
performance-signature-dynatracesaasCOMPATIBLE Compatible since 3.2.1
performance-signature-uiCOMPATIBLE Compatible since 3.2.1
performance-signature-viewerCOMPATIBLE Compatible since 3.2.1
plotCOMPATIBLE Compatible since 2.1.9
pmdOBSOLETE INFRA-2487 This plugin reached end-of-life. All functionality has been integrated into the Warnings Next Generation Plugin
PrioritySorterCOMPATIBLE Compatible since 4.0.0
publish-over-dropboxCOMPATIBLE Compatible since 1.3.0
publish-over-ftpCOMPATIBLE Compatible since 1.16
publish-over-sshCOMPATIBLE Compatible since 1.21
rebuildCOMPATIBLE Compatible since 1.32
scriptlerCOMPATIBLE Compatible since 3.2
tasksOBSOLETE INFRA-2487 This plugin reached end-of-life. All functionality has been integrated into the Warnings Next Generation Plugin
teamconcertCOMPATIBLE Compatible since 2.2.1
tfsINCOMPATIBLE There is not currently a fix. JENKINS-64241, and Distribution of this plugin has been suspended due to unresolved security vulnerabilities
vsphere-cloudCOMPATIBLE Compatible since 2.25
warningsOBSOLETE INFRA-2487 This plugin reached end-of-life. All functionality has been integrated into the Warnings Next Generation Plugin
xldeploy-pluginCOMPATIBLE Compatible since 10.0.0

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: ''],
        'build-name-setter-plugin': [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'],
]

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.

Have more questions?

0 Comments

Please sign in to leave a comment.