From 6ea7883fed497b68eec9f89ec89082edf1b39ce5 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Thu, 28 Jul 2016 16:09:21 +0100 Subject: [PATCH] [FIXED JENKINS-37041] Ensure that detached plugins are always at least their minimum version (cherry picked from commit 2a450e5ac2ecd83a54f05c83729852073601816e) --- .../java/hudson/ClassicPluginStrategy.java | 10 +++++++ core/src/main/java/hudson/PluginManager.java | 28 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/core/src/main/java/hudson/ClassicPluginStrategy.java b/core/src/main/java/hudson/ClassicPluginStrategy.java index 7164ffeef6..a1a1b57c49 100644 --- a/core/src/main/java/hudson/ClassicPluginStrategy.java +++ b/core/src/main/java/hudson/ClassicPluginStrategy.java @@ -401,6 +401,16 @@ public class ClassicPluginStrategy implements PluginStrategy { public VersionNumber getSplitWhen() { return splitWhen; } + + /** + * Gets the minimum required version for the current version of Jenkins. + * + * @return the minimum required version for the current version of Jenkins. + * @sice 2.16 + */ + public VersionNumber getRequireVersion() { + return new VersionNumber(requireVersion); + } } private static final List DETACHED_LIST = Collections.unmodifiableList(Arrays.asList( diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index 1ee23f30dd..793508aba4 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -715,6 +715,34 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas new Object[] {lastExecVersion, Jenkins.VERSION, loadedDetached}); InstallUtil.saveLastExecVersion(); + } else { + final Set forceUpgrade = new HashSet<>(); + for (ClassicPluginStrategy.DetachedPlugin p : ClassicPluginStrategy.getDetachedPlugins()) { + VersionNumber installedVersion = getPluginVersion(rootDir, p.getShortName()); + VersionNumber requireVersion = p.getRequireVersion(); + if (installedVersion != null && installedVersion.isOlderThan(requireVersion)) { + LOGGER.log(Level.WARNING, + "Detached plugin {0} found at version {1}, required minimum version is {2}", + new Object[]{p.getShortName(), installedVersion, requireVersion}); + forceUpgrade.add(p); + } + } + if (!forceUpgrade.isEmpty()) { + Set loadedDetached = loadPluginsFromWar("/WEB-INF/detached-plugins", new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + name = normalisePluginName(name); + for (ClassicPluginStrategy.DetachedPlugin detachedPlugin : forceUpgrade) { + if (detachedPlugin.getShortName().equals(name)) { + return true; + } + } + return false; + } + }); + LOGGER.log(INFO, "Upgraded detached plugins (and dependencies): {0}", + new Object[]{loadedDetached}); + } } }