diff --git a/plugin-management-cli/src/main/java/io/jenkins/tools/pluginmanager/cli/CliOptions.java b/plugin-management-cli/src/main/java/io/jenkins/tools/pluginmanager/cli/CliOptions.java index bcfe0bd3..f27fc97e 100644 --- a/plugin-management-cli/src/main/java/io/jenkins/tools/pluginmanager/cli/CliOptions.java +++ b/plugin-management-cli/src/main/java/io/jenkins/tools/pluginmanager/cli/CliOptions.java @@ -155,6 +155,9 @@ class CliOptions { handler = MultiCredentialsOptionHandler.class) private List credentials; + @Option(name = "--skip-broken", usage = "Lists skipped plugins when enabled", handler = BooleanOptionHandler.class) + private boolean skipBroken; + /** * Creates a configuration class with configurations specified from the CLI and/or environment variables. * @@ -184,6 +187,7 @@ Config setup() { .withSkipFailedPlugins(isSkipFailedPlugins()) .withCredentials(credentials) .withHashFunction(getHashFunction()) + .withSkipBroken(isSkipBroken()) .build(); } @@ -343,6 +347,15 @@ public boolean isVerbose() { return verbose; } + /** + * Gets the value corresponding to if user selected to list skipped plugins + * + * @return true if user selected CLI Option to list skipped plugins + */ + private boolean isSkipBroken() { + return skipBroken; + } + /** * Determines the update center url string. If a value is set via CLI option, it will override a value set via * environment variable. If neither are set, the default in the Settings class will be used. diff --git a/plugin-management-library/src/main/java/io/jenkins/tools/pluginmanager/config/Config.java b/plugin-management-library/src/main/java/io/jenkins/tools/pluginmanager/config/Config.java index fe499c9f..19b27800 100644 --- a/plugin-management-library/src/main/java/io/jenkins/tools/pluginmanager/config/Config.java +++ b/plugin-management-library/src/main/java/io/jenkins/tools/pluginmanager/config/Config.java @@ -56,6 +56,7 @@ public class Config { private final List credentials; private final Path cachePath; private final LogOutput logOutput; + private final boolean skipBroken; private Config( File pluginDir, @@ -80,7 +81,8 @@ private Config( HashFunction hashFunction, List credentials, Path cachePath, - boolean hideWarnings) { + boolean hideWarnings, + boolean skipBroken) { this.pluginDir = pluginDir; this.cleanPluginDir = cleanPluginDir; this.showWarnings = showWarnings; @@ -105,6 +107,7 @@ private Config( this.cachePath = cachePath; this.logOutput = new LogOutput(verbose); this.hideWarnings = hideWarnings; + this.skipBroken = skipBroken; } public File getPluginDir() { @@ -213,6 +216,10 @@ public LogOutput getLogOutput() { return logOutput; } + public boolean isSkipBroken(){ + return skipBroken; + } + public static class Builder { private File pluginDir; private boolean cleanPluginDir; @@ -237,6 +244,7 @@ public static class Builder { private List credentials = Collections.emptyList(); private HashFunction hashFunction = Settings.DEFAULT_HASH_FUNCTION; private Path cachePath = Settings.DEFAULT_CACHE_PATH; + private boolean skipBroken; private Builder() { } @@ -368,6 +376,11 @@ public Builder withCachePath(@NonNull Path cachePath) { return this; } + public Builder withSkipBroken(Boolean skipBroken){ + this.skipBroken = skipBroken; + return this; + } + public Config build() { return new Config( pluginDir, @@ -392,7 +405,8 @@ public Config build() { hashFunction, credentials, cachePath, - hideWarnings + hideWarnings, + skipBroken ); } diff --git a/plugin-management-library/src/main/java/io/jenkins/tools/pluginmanager/impl/PluginManager.java b/plugin-management-library/src/main/java/io/jenkins/tools/pluginmanager/impl/PluginManager.java index c5be5a14..c1a82ac5 100644 --- a/plugin-management-library/src/main/java/io/jenkins/tools/pluginmanager/impl/PluginManager.java +++ b/plugin-management-library/src/main/java/io/jenkins/tools/pluginmanager/impl/PluginManager.java @@ -236,6 +236,18 @@ public void start(boolean downloadUc) { listPlugins(); showSpecificSecurityWarnings(pluginsToBeDownloaded); checkVersionCompatibility(jenkinsVersion, pluginsToBeDownloaded, exceptions); + if(cfg.isSkipBroken()){ + List failedPlugins = getFailedPlugins(); + if(failedPlugins.isEmpty()){ + System.out.println("No plugin is skipped"); + } + else{ + System.out.println("Following plugins are skipped due to failure:"); + for(Plugin failedPlugin: failedPlugins){ + System.out.println(failedPlugin.getName()); + } + } + } if (!exceptions.isEmpty()) { throw new AggregatePluginPrerequisitesNotMetException(exceptions); }