提交 e55f356e 编写于 作者: J Jesse Glick

Merged #1771.

......@@ -94,17 +94,39 @@ public abstract class ParameterizedJobMixIn<JobT extends Job<JobT, RunT> & Param
}
/**
* Convenience method to schedule a build with the ability to wait for its result.
* Often used during functional tests ({@code JenkinsRule.assertBuildStatusSuccess}).
* Provides a standard implementation of an optional method of the same name in a {@link Job} type to schedule a build with the ability to wait for its result.
* That job method is often used during functional tests ({@code JenkinsRule.assertBuildStatusSuccess}).
* @param quietPeriod seconds to wait before starting (normally 0)
* @param actions various actions to associate with the scheduling, such as {@link ParametersAction} or {@link CauseAction}
* @return a handle by which you may wait for the build to complete (or just start); or null if the build was not actually scheduled for some reason
*/
public final @CheckForNull QueueTaskFuture<RunT> scheduleBuild2(int quietPeriod, Action... actions) {
return scheduleBuild2(quietPeriod, Arrays.asList(actions));
Queue.Item i = scheduleBuild2(quietPeriod, Arrays.asList(actions));
return i != null ? (QueueTaskFuture) i.getFuture() : null;
}
/**
* Convenience method to schedule a build.
* Useful for {@link Trigger} implementations, for example.
* If you need to wait for the build to start (or finish), use {@link Queue.Item#getFuture}.
* @param job a job which might be schedulable
* @param quietPeriod seconds to wait before starting; use {@code -1} to use the job’s default settings
* @param actions various actions to associate with the scheduling, such as {@link ParametersAction} or {@link CauseAction}
* @return a newly created, or reused, queue item if the job could be scheduled; null if it was refused for some reason (e.g., some {@link Queue.QueueDecisionHandler} rejected it), or if {@code job} is not a {@link ParameterizedJob} or it is not {@link Job#isBuildable})
* @since 1.621
*/
public static @CheckForNull Queue.Item scheduleBuild2(final Job<?,?> job, int quietPeriod, Action... actions) {
if (!(job instanceof ParameterizedJob)) {
return null;
}
return new ParameterizedJobMixIn() {
@Override protected Job asJob() {
return job;
}
}.scheduleBuild2(quietPeriod == -1 ? ((ParameterizedJob) job).getQuietPeriod() : quietPeriod, Arrays.asList(actions));
}
private @CheckForNull QueueTaskFuture<RunT> scheduleBuild2(int quietPeriod, List<Action> actions) {
@CheckForNull Queue.Item scheduleBuild2(int quietPeriod, List<Action> actions) {
if (!asJob().isBuildable())
return null;
......@@ -112,8 +134,7 @@ public abstract class ParameterizedJobMixIn<JobT extends Job<JobT, RunT> & Param
if (isParameterized() && Util.filter(queueActions, ParametersAction.class).isEmpty()) {
queueActions.add(new ParametersAction(getDefaultParametersValues()));
}
Queue.Item i = Jenkins.getInstance().getQueue().schedule2(asJob(), quietPeriod, queueActions).getItem();
return i != null ? (QueueTaskFuture) i.getFuture() : null;
return Jenkins.getInstance().getQueue().schedule2(asJob(), quietPeriod, queueActions).getItem();
}
private List<ParameterValue> getDefaultParametersValues() {
......@@ -244,11 +265,31 @@ public abstract class ParameterizedJobMixIn<JobT extends Job<JobT, RunT> & Param
* Suggested implementation of {@link ParameterizedJob#getBuildNowText}.
*/
public final String getBuildNowText() {
// TODO is it worthwhile to define a replacement for AbstractProject.BUILD_NOW_TEXT?
// TODO JENKINS-26147 use replacement for AbstractProject.BUILD_NOW_TEXT
// TODO move these messages (& translations) to this package
return isParameterized() ? hudson.model.Messages.AbstractProject_build_with_parameters() : hudson.model.Messages.AbstractProject_BuildNow();
}
/**
* Checks for the existence of a specific trigger on a job.
* @param <T> a trigger type
* @param job a job
* @param clazz the type of the trigger
* @return a configured trigger of the requested type, or null if there is none such, or {@code job} is not a {@link ParameterizedJob}
* @since 1.621
*/
public static @CheckForNull <T extends Trigger<?>> T getTrigger(Job<?,?> job, Class<T> clazz) {
if (!(job instanceof ParameterizedJob)) {
return null;
}
for (Trigger<?> t : ((ParameterizedJob) job).getTriggers().values()) {
if (clazz.isInstance(t)) {
return clazz.cast(t);
}
}
return null;
}
/**
* Marker for job using this mixin.
*/
......@@ -265,6 +306,7 @@ public abstract class ParameterizedJobMixIn<JobT extends Job<JobT, RunT> & Param
* Gets currently configured triggers.
* You may use {@code <p:config-trigger/>} to configure them.
* @return a map from trigger kind to instance
* @see #getTrigger
*/
Map<TriggerDescriptor,Trigger<?>> getTriggers();
......
......@@ -32,6 +32,7 @@ import hudson.model.AbstractProject;
import hudson.model.Action;
import hudson.model.AutoCompletionCandidates;
import hudson.model.Cause;
import hudson.model.CauseAction;
import hudson.model.DependencyGraph;
import hudson.model.Item;
import hudson.model.ItemGroup;
......@@ -237,11 +238,7 @@ public final class ReverseBuildTrigger extends Trigger<Job> implements Dependenc
continue;
}
String name = ModelHyperlinkNote.encodeTo(trigger.job) + " #" + trigger.job.getNextBuildNumber();
if (new ParameterizedJobMixIn() {
@Override protected Job asJob() {
return trigger.job;
}
}.scheduleBuild(new Cause.UpstreamCause(r))) {
if (ParameterizedJobMixIn.scheduleBuild2(trigger.job, -1, new CauseAction(new Cause.UpstreamCause(r))) != null) {
listener.getLogger().println(hudson.tasks.Messages.BuildTrigger_Triggering(name));
} else {
listener.getLogger().println(hudson.tasks.Messages.BuildTrigger_InQueue(name));
......@@ -257,10 +254,9 @@ public final class ReverseBuildTrigger extends Trigger<Job> implements Dependenc
if (jenkins == null) {
return;
}
for (ParameterizedJobMixIn.ParameterizedJob p : jenkins.getAllItems(ParameterizedJobMixIn.ParameterizedJob.class)) {
Trigger<?> _t = p.getTriggers().get(jenkins.getDescriptorByType(DescriptorImpl.class));
if (_t instanceof ReverseBuildTrigger) {
ReverseBuildTrigger t = (ReverseBuildTrigger) _t;
for (Job<?,?> p : jenkins.getAllItems(Job.class)) {
ReverseBuildTrigger t = ParameterizedJobMixIn.getTrigger(p, ReverseBuildTrigger.class);
if (t != null) {
String revised = Items.computeRelativeNamesAfterRenaming(oldFullName, newFullName, t.upstreamProjects, p.getParent());
if (!revised.equals(t.upstreamProjects)) {
t.upstreamProjects = revised;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册