Skip to content

Commit 14f2ffe

Browse files
committed
Merge branch 'master' of https://github.com/jenkinsci/workflow-cps-plugin into isComplete
2 parents 1d19172 + 63bc17e commit 14f2ffe

File tree

3 files changed

+77
-0
lines changed

3 files changed

+77
-0
lines changed

plugin/src/main/java/org/jenkinsci/plugins/workflow/cps/CpsFlowExecution.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1720,6 +1720,7 @@ public void pause(final boolean v) throws IOException {
17201720
LOGGER.log(Level.WARNING, null, t);
17211721
}
17221722
});
1723+
cpsExec.getOwner().getListener().getLogger().close();
17231724
}
17241725
} catch (Exception ex) {
17251726
LOGGER.log(Level.WARNING, "Error persisting Pipeline execution at shutdown: "+((CpsFlowExecution) execution).owner, ex);

plugin/src/main/java/org/jenkinsci/plugins/workflow/cps/CpsGroovyShell.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@
1414
import java.util.logging.Logger;
1515
import edu.umd.cs.findbugs.annotations.CheckForNull;
1616
import edu.umd.cs.findbugs.annotations.NonNull;
17+
import java.io.File;
18+
import java.io.InputStream;
19+
import java.net.MalformedURLException;
20+
import java.net.URI;
21+
import java.net.URLConnection;
22+
import java.net.URLStreamHandler;
23+
import java.util.regex.Matcher;
24+
import java.util.regex.Pattern;
1725
import org.codehaus.groovy.control.CompilationFailedException;
1826
import org.codehaus.groovy.control.CompilationUnit;
1927
import org.codehaus.groovy.control.CompilerConfiguration;
@@ -76,6 +84,46 @@ private static final class CleanGroovyClassLoader extends GroovyClassLoader {
7684
return new CleanClassCollector(unit, su);
7785
}
7886

87+
private static final Pattern JAR_URL = Pattern.compile("jar:(file:/.+[.]jar)!/.+");
88+
89+
// Avoid expensive and (JDK-6956385) leaky implementations of certain JarURLConnection methods:
90+
@Override public URL findResource(String name) {
91+
URL url = super.findResource(name);
92+
if (url != null && url.getProtocol().equals("jar")) {
93+
try {
94+
return new URL(url.getProtocol(), url.getHost(), url.getPort(), url.getFile(), new URLStreamHandler() {
95+
@Override protected URLConnection openConnection(URL url2) throws IOException {
96+
URLConnection delegate = url.openConnection();
97+
return new URLConnection(url2) {
98+
@Override public void connect() throws IOException {
99+
delegate.connect();
100+
}
101+
@Override public InputStream getInputStream() throws IOException {
102+
return delegate.getInputStream();
103+
}
104+
@Override public String getHeaderField(String name) {
105+
return delegate.getHeaderField(name);
106+
}
107+
@Override public long getLastModified() {
108+
Matcher m = JAR_URL.matcher(url.toString());
109+
if (m.matches()) {
110+
return new File(URI.create(m.group(1))).lastModified();
111+
}
112+
return delegate.getLastModified();
113+
}
114+
@Override public String getContentEncoding() {
115+
return null;
116+
}
117+
};
118+
}
119+
});
120+
} catch (MalformedURLException x) {
121+
LOGGER.log(Level.WARNING, null, x);
122+
}
123+
}
124+
return url;
125+
}
126+
79127
private final class CleanClassCollector extends ClassCollector {
80128

81129
CleanClassCollector(CompilationUnit unit, SourceUnit su) {

plugin/src/test/java/org/jenkinsci/plugins/workflow/cps/CpsFlowDefinitionRJRTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package org.jenkinsci.plugins.workflow.cps;
22

3+
import hudson.Functions;
4+
import java.util.logging.Level;
35
import org.jenkinsci.plugins.workflow.job.WorkflowJob;
6+
import org.jenkinsci.plugins.workflow.job.WorkflowRun;
7+
import org.junit.Assume;
48
import org.junit.Rule;
59
import org.junit.Test;
610
import org.jvnet.hudson.test.JenkinsRule;
@@ -21,4 +25,28 @@ private static void doesItSmoke(JenkinsRule r) throws Exception {
2125
p.setDefinition(new CpsFlowDefinition("print Jenkins.get().getRootDir().toString()", false));
2226
r.assertBuildStatusSuccess(p.scheduleBuild2(0));
2327
}
28+
29+
@Test
30+
public void flushLogsOnShutdown() throws Throwable {
31+
Assume.assumeFalse("RealJenkinsRule does not shut down Jenkins cleanly on Windows, see https://github.com/jenkinsci/jenkins-test-harness/pull/559", Functions.isWindows());
32+
rjr.withLogger(CpsFlowExecution.class, Level.FINER);
33+
rjr.then(CpsFlowDefinitionRJRTest::flushLogsOnShutdownPreRestart);
34+
rjr.then(CpsFlowDefinitionRJRTest::flushLogsOnShutdownPostRestart);
35+
}
36+
37+
private static void flushLogsOnShutdownPreRestart(JenkinsRule r) throws Exception {
38+
WorkflowJob p = r.createProject(WorkflowJob.class, "p");
39+
p.setDefinition(new CpsFlowDefinition("sleep 10\n", true));
40+
WorkflowRun b = p.scheduleBuild2(0).waitForStart();
41+
r.waitForMessage("Sleeping for 10 sec", b);
42+
r.jenkins.doQuietDown();
43+
}
44+
45+
private static void flushLogsOnShutdownPostRestart(JenkinsRule r) throws Exception {
46+
WorkflowJob p = r.jenkins.getItemByFullName("p", WorkflowJob.class);
47+
WorkflowRun b = p.getLastBuild();
48+
r.assertBuildStatusSuccess(r.waitForCompletion(b));
49+
r.assertLogContains("Resuming build at ", b);
50+
r.assertLogContains("Pausing (Preparing for shutdown)", b);
51+
}
2452
}

0 commit comments

Comments
 (0)