-
Notifications
You must be signed in to change notification settings - Fork 129
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[JENKINS-54078] JEP-210 compatibility #74
Changes from 7 commits
2ad8c70
11c9999
746f455
f66bb29
128f7d2
5d8c464
0918918
46433e1
3af06c9
066e961
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -28,7 +28,7 @@ | |
<parent> | ||
<groupId>org.jenkins-ci.plugins</groupId> | ||
<artifactId>plugin</artifactId> | ||
<version>3.19</version> | ||
<version>3.25</version> | ||
<relativePath /> | ||
</parent> | ||
<groupId>org.jenkins-ci.plugins.workflow</groupId> | ||
|
@@ -67,10 +67,12 @@ | |
<jenkins.version>2.121.1</jenkins.version> | ||
<java.level>8</java.level> | ||
<workflow-step-api-plugin.version>2.15</workflow-step-api-plugin.version> | ||
<workflow-cps-plugin.version>2.32</workflow-cps-plugin.version> | ||
<workflow-support-plugin.version>2.14</workflow-support-plugin.version> | ||
<workflow-api-plugin.version>2.28</workflow-api-plugin.version> | ||
<workflow-cps-plugin.version>2.58</workflow-cps-plugin.version> | ||
<workflow-support-plugin.version>2.21</workflow-support-plugin.version> | ||
<workflow-api-plugin.version>2.30</workflow-api-plugin.version> | ||
<useBeta>true</useBeta> | ||
<git-plugin.version>4.0.0-beta3</git-plugin.version> | ||
<scm-api-plugin.version>2.2.6</scm-api-plugin.version> | ||
</properties> | ||
<dependencies> | ||
<dependency> | ||
|
@@ -98,7 +100,7 @@ | |
<dependency> | ||
<groupId>org.jenkins-ci.plugins</groupId> | ||
<artifactId>structs</artifactId> | ||
<version>1.14</version> | ||
<version>1.17</version> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.jenkins-ci.plugins</groupId> | ||
|
@@ -121,13 +123,13 @@ | |
<dependency> | ||
<groupId>org.jenkins-ci.plugins.workflow</groupId> | ||
<artifactId>workflow-job</artifactId> | ||
<version>2.10</version> | ||
<version>2.26</version> | ||
<scope>test</scope> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.jenkins-ci.plugins.workflow</groupId> | ||
<artifactId>workflow-durable-task-step</artifactId> | ||
<version>2.3</version> | ||
<version>2.24</version> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. FTR this was to pick up the fix of JENKINS-28822. |
||
<scope>test</scope> | ||
</dependency> | ||
<dependency> | ||
|
@@ -182,7 +184,7 @@ | |
<dependency> | ||
<groupId>org.jenkins-ci.plugins</groupId> | ||
<artifactId>script-security</artifactId> | ||
<version>1.28</version> | ||
<version>1.46</version> | ||
<scope>test</scope> | ||
</dependency> | ||
<dependency> | ||
|
@@ -204,5 +206,34 @@ | |
<classifier>tests</classifier> | ||
<scope>test</scope> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.jenkins-ci.plugins</groupId> | ||
<artifactId>git</artifactId> | ||
<version>${git-plugin.version}</version> | ||
<scope>test</scope> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.jenkins-ci.plugins</groupId> | ||
<artifactId>scm-api</artifactId> | ||
<version>${scm-api-plugin.version}</version> | ||
<classifier>tests</classifier> | ||
<scope>test</scope> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.jenkins-ci.plugins</groupId> | ||
<artifactId>git</artifactId> | ||
<version>${git-plugin.version}</version> | ||
<classifier>tests</classifier> | ||
<scope>test</scope> | ||
</dependency> | ||
</dependencies> | ||
<dependencyManagement> | ||
<dependencies> | ||
<dependency> | ||
<groupId>org.jenkins-ci.plugins</groupId> | ||
<artifactId>scm-api</artifactId> | ||
<version>${scm-api-plugin.version}</version> | ||
</dependency> | ||
</dependencies> | ||
</dependencyManagement> | ||
</project> |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -10,17 +10,21 @@ | |
import hudson.model.Result; | ||
import hudson.model.Run; | ||
import hudson.model.TaskListener; | ||
import hudson.remoting.Callable; | ||
import hudson.remoting.Channel; | ||
import java.io.IOException; | ||
import java.io.OutputStream; | ||
import java.io.Serializable; | ||
import java.util.List; | ||
import java.util.UUID; | ||
import java.util.concurrent.ExecutionException; | ||
import java.util.concurrent.ScheduledFuture; | ||
import java.util.concurrent.TimeUnit; | ||
import java.util.logging.Level; | ||
import java.util.logging.Logger; | ||
import javax.annotation.CheckForNull; | ||
import jenkins.model.CauseOfInterruption; | ||
import jenkins.security.SlaveToMasterCallable; | ||
import jenkins.util.Timer; | ||
import org.jenkinsci.plugins.workflow.flow.FlowExecution; | ||
import org.jenkinsci.plugins.workflow.graph.FlowNode; | ||
|
@@ -46,10 +50,14 @@ public class TimeoutStepExecution extends AbstractStepExecutionImpl { | |
/** whether we are forcing the body to end */ | ||
private boolean forcible; | ||
|
||
/** Token for {@link #activity} callbacks. */ | ||
private final String id; | ||
|
||
TimeoutStepExecution(TimeoutStep step, StepContext context) { | ||
super(context); | ||
this.step = step; | ||
this.activity = step.isActivity(); | ||
id = activity ? UUID.randomUUID().toString() : null; | ||
} | ||
|
||
@Override | ||
|
@@ -62,7 +70,7 @@ public boolean start() throws Exception { | |
bodyInvoker = bodyInvoker.withContext( | ||
BodyInvoker.mergeConsoleLogFilters( | ||
context.get(ConsoleLogFilter.class), | ||
new ConsoleLogFilterImpl(new ResetCallbackImpl()) | ||
new ConsoleLogFilterImpl(id) | ||
) | ||
); | ||
} | ||
|
@@ -230,29 +238,42 @@ public String getShortDescription() { | |
} | ||
} | ||
|
||
public interface ResetCallback extends Serializable { | ||
void logWritten(); | ||
} | ||
private static final class ResetTimer extends SlaveToMasterCallable<Void, RuntimeException> { | ||
|
||
private class ResetCallbackImpl implements ResetCallback { | ||
private static final long serialVersionUID = 1L; | ||
@Override public void logWritten() { | ||
resetTimer(); | ||
|
||
/** non-null unless running from an old deserialized ConsoleLogFilterImpl */ | ||
private final @CheckForNull String id; | ||
|
||
ResetTimer(String id) { | ||
dwnusbaum marked this conversation as resolved.
Show resolved
Hide resolved
|
||
this.id = id; | ||
} | ||
|
||
@Override public Void call() throws RuntimeException { | ||
StepExecution.applyAll(TimeoutStepExecution.class, e -> { | ||
if (id == null || id.equals(e.id)) { | ||
e.resetTimer(); | ||
} | ||
return null; | ||
}); | ||
return null; | ||
} | ||
|
||
} | ||
|
||
private static class ConsoleLogFilterImpl extends ConsoleLogFilter implements /* TODO Remotable */ Serializable { | ||
private static final long serialVersionUID = 1L; | ||
|
||
private final ResetCallback callback; | ||
private final @CheckForNull String id; | ||
private transient @CheckForNull Channel channel; | ||
|
||
ConsoleLogFilterImpl(ResetCallback callback) { | ||
this.callback = callback; | ||
ConsoleLogFilterImpl(String id) { | ||
this.id = id; | ||
} | ||
|
||
private Object writeReplace() { | ||
Channel ch = Channel.current(); | ||
return ch == null ? this : new ConsoleLogFilterImpl(ch.export(ResetCallback.class, callback)); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe the issue is that only the marshaller holds the reference to the exported object, so after the object is completely serialized it is free to be garbage collected? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. AFAICT the issue was that this code released all exported objects when a |
||
private Object readResolve() { | ||
channel = Channel.current(); | ||
return this; | ||
} | ||
|
||
@Override | ||
|
@@ -262,7 +283,12 @@ public OutputStream decorateLogger(@SuppressWarnings("rawtypes") Run build, fina | |
@Override | ||
protected void eol(byte[] b, int len) throws IOException { | ||
logger.write(b, 0, len); | ||
callback.logWritten(); | ||
Callable<Void, RuntimeException> resetTimer = new ResetTimer(id); | ||
if (channel != null) { | ||
channel.callAsync(resetTimer); | ||
} else { | ||
resetTimer.call(); | ||
} | ||
} | ||
|
||
@Override | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -24,6 +24,7 @@ | |
|
||
package org.jenkinsci.plugins.workflow.steps; | ||
|
||
import hudson.Functions; | ||
import hudson.model.Result; | ||
import hudson.model.TaskListener; | ||
import hudson.model.listeners.RunListener; | ||
|
@@ -33,6 +34,7 @@ | |
import java.util.concurrent.TimeUnit; | ||
import jenkins.model.CauseOfInterruption; | ||
import jenkins.model.InterruptedBuildAction; | ||
import jenkins.plugins.git.GitSampleRepoRule; | ||
import org.jenkinsci.plugins.workflow.actions.ErrorAction; | ||
import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition; | ||
import org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode; | ||
|
@@ -43,6 +45,7 @@ | |
import org.jenkinsci.plugins.workflow.test.steps.SemaphoreStep; | ||
import org.junit.*; | ||
import static org.junit.Assert.assertEquals; | ||
import static org.junit.Assume.*; | ||
import org.junit.runners.model.Statement; | ||
import org.jvnet.hudson.test.BuildWatcher; | ||
import org.jvnet.hudson.test.Issue; | ||
|
@@ -57,6 +60,8 @@ public class TimeoutStepTest extends Assert { | |
|
||
@Rule public RestartableJenkinsRule story = new RestartableJenkinsRule(); | ||
|
||
@Rule public GitSampleRepoRule git = new GitSampleRepoRule(); | ||
|
||
@Test public void configRoundTrip() { | ||
story.addStep(new Statement() { | ||
@Override public void evaluate() throws Throwable { | ||
|
@@ -239,6 +244,42 @@ public void evaluate() throws Throwable { | |
}); | ||
} | ||
|
||
@Test | ||
public void activityRemote() { | ||
assumeFalse(Functions.isWindows()); // TODO create analogue using bat | ||
story.then(r -> { | ||
r.createSlave(); | ||
WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); | ||
p.setDefinition(new CpsFlowDefinition("" + | ||
"node('!master') {\n" + | ||
" timeout(time:5, unit:'SECONDS', activity: true) {\n" + | ||
" sh 'set +x; echo NotHere; sleep 3; echo NotHereYet; sleep 3; echo JustHere; sleep 10; echo ShouldNot'\n" + | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Cannot use |
||
" }\n" + | ||
"}\n", true)); | ||
WorkflowRun b = r.assertBuildStatus(Result.ABORTED, p.scheduleBuild2(0)); | ||
story.j.assertLogContains("JustHere", b); | ||
story.j.assertLogNotContains("ShouldNot", b); | ||
}); | ||
} | ||
|
||
@Issue("JENKINS-54078") | ||
@Test public void activityGit() { | ||
story.then(r -> { | ||
r.createSlave(); | ||
git.init(); | ||
git.write("file", "content"); | ||
git.git("commit", "--all", "--message=init"); | ||
WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); | ||
p.setDefinition(new CpsFlowDefinition("" + | ||
"node('!master') {\n" + | ||
" timeout(time: 5, unit: 'MINUTES', activity: true) {\n" + | ||
" git($/" + git + "/$)\n" + | ||
" }\n" + | ||
"}\n", true)); | ||
r.buildAndAssertSuccess(p); | ||
}); | ||
} | ||
|
||
@Issue("JENKINS-26163") | ||
@Test | ||
public void restarted() throws Exception { | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Various changes to pick up JEP-210 binaries.