Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[FIXED JENKINS-22187] Supports multiple actions for a condition.
  • Loading branch information
ikedam committed Oct 25, 2014
1 parent 6b9f980 commit a8f232f
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 20 deletions.
Expand Up @@ -43,6 +43,7 @@
import hudson.tasks.Builder;
import hudson.tasks.Publisher;
import hudson.util.DescribableList;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.jenkins_ci.plugins.run_condition.BuildStepRunner;
Expand All @@ -52,6 +53,7 @@
import org.kohsuke.stapler.StaplerRequest;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
Expand All @@ -66,14 +68,17 @@ public class ConditionalPublisher implements Describable<ConditionalPublisher>,
private static final Logger LOGGER = Logger.getLogger(ConditionalPublisher.class.getName());

private final RunCondition condition;
private final BuildStep publisher;
@Deprecated
private transient BuildStep publisher;
private List<BuildStep> publisherList;
private BuildStepRunner runner;

// used for multiconfiguration projects with MatrixAggregatable.
// if null, used condition and publlisher.
private final RunCondition aggregationCondition;
private final BuildStepRunner aggregationRunner;

@Deprecated
public ConditionalPublisher(final RunCondition condition, final BuildStep publisher, final BuildStepRunner runner) {
this(condition, publisher, runner, false, null, null);
}
Expand All @@ -86,12 +91,27 @@ public ConditionalPublisher(final RunCondition condition, final BuildStep publis
* @param aggregationCondition
* @param aggregationRunner
* @see ConditionalPublisherDescriptor#newInstance(StaplerRequest, JSONObject)
* @deprecated use {@link #ConditionalPublisher(RunCondition, List, BuildStepRunner, boolean, RunCondition, BuildStepRunner)} instead
*/
@DataBoundConstructor
@Deprecated
public ConditionalPublisher(final RunCondition condition, final BuildStep publisher, final BuildStepRunner runner,
boolean configuredAggregation, final RunCondition aggregationCondition, final BuildStepRunner aggregationRunner) {
this(condition, Arrays.asList(publisher), runner, configuredAggregation, aggregationCondition, aggregationRunner);
}
/**
* @param condition
* @param publisherList
* @param runner
* @param configuredAggregation
* @param aggregationCondition
* @param aggregationRunner
* @see ConditionalPublisherDescriptor#newInstance(StaplerRequest, JSONObject)
*/
@DataBoundConstructor
public ConditionalPublisher(final RunCondition condition, final List<BuildStep> publisherList, final BuildStepRunner runner,
boolean configuredAggregation, final RunCondition aggregationCondition, final BuildStepRunner aggregationRunner) {
this.condition = condition;
this.publisher = publisher;
this.publisherList = publisherList;
this.runner = runner;
if (configuredAggregation) {
this.aggregationCondition = aggregationCondition;
Expand All @@ -106,8 +126,18 @@ public RunCondition getCondition() {
return condition;
}

/**
* @return
* @deprecated use {@link #getPublisherList()} instead
*/
@Deprecated
public BuildStep getPublisher() {
return publisher;
List<BuildStep> publisherList = getPublisherList();
return !publisherList.isEmpty()?publisherList.get(0):null;
}

public List<BuildStep> getPublisherList() {
return publisherList != null?publisherList:Collections.<BuildStep>emptyList();
}

public BuildStepRunner getRunner() {
Expand All @@ -131,19 +161,38 @@ public ConditionalPublisherDescriptor getDescriptor() {
}

public Collection<? extends Action> getProjectActions(final AbstractProject<?, ?> project) {
return publisher.getProjectActions(project);
Collection<Action> actions = new ArrayList<Action>();
for (BuildStep publisher: getPublisherList()) {
actions.addAll(publisher.getProjectActions(project));
}
return actions;
}

public boolean prebuild(final AbstractBuild<?, ?> build, final BuildListener listener) {
return runner.prebuild(condition, publisher, build, listener);
for (BuildStep publisher: getPublisherList()) {
if (!runner.prebuild(condition, publisher, build, listener)) {
return false;
}
}
return true;
}

public boolean perform(final AbstractBuild<?, ?> build, final Launcher launcher, final BuildListener listener)
throws InterruptedException, IOException {
return runner.perform(condition, publisher, build, launcher, listener);
for (BuildStep publisher: getPublisherList()) {
if (!runner.perform(condition, publisher, build, launcher, listener)) {
return false;
}
}
return true;
}

public Object readResolve() {
if (publisher != null) {
publisherList = new ArrayList<BuildStep>();
publisherList.add(publisher);
publisher = null;
}
if (runner == null)
runner = new BuildStepRunner.Fail();
return this;
Expand Down Expand Up @@ -212,7 +261,7 @@ public ConditionalPublisher newInstance(StaplerRequest req, JSONObject formData)
throws hudson.model.Descriptor.FormException {
RunCondition condition = null;
BuildStepRunner runner = null;
BuildStep publisher = null;
List<BuildStep> publisherList = null;
boolean configuredAggregation = false;
RunCondition aggregationCondition = null;
BuildStepRunner aggregationRunner = null;
Expand All @@ -226,11 +275,17 @@ public ConditionalPublisher newInstance(StaplerRequest req, JSONObject formData)
aggregationRunner = req.bindJSON(BuildStepRunner.class, formData.getJSONObject("aggregationRunner"));
}

publisher = bindJSONWithDescriptor(req, formData, "publisher");
JSONArray a = JSONArray.fromObject(formData.get("publisherList"));
if (a != null && !a.isEmpty()) {
publisherList = new ArrayList<BuildStep>(a.size());
for(int idx = 0; idx < a.size(); ++idx) {
publisherList.add(bindJSONWithDescriptor(req, a.getJSONObject(idx), "publisherList"));
}
}
}
return new ConditionalPublisher(
condition,
publisher,
publisherList,
runner,
configuredAggregation,
aggregationCondition,
Expand All @@ -246,13 +301,12 @@ public ConditionalPublisher newInstance(StaplerRequest req, JSONObject formData)
*
* @param req
* @param formData
* @param fieldName
* @param fieldName used for exception information.
* @return
* @throws hudson.model.Descriptor.FormException
*/
private BuildStep bindJSONWithDescriptor(StaplerRequest req, JSONObject formData, String fieldName)
throws hudson.model.Descriptor.FormException {
formData = formData.getJSONObject(fieldName);
if (formData == null || formData.isNullObject()) {
return null;
}
Expand Down Expand Up @@ -287,6 +341,7 @@ public void buildDependencyGraph(AbstractProject owner, DependencyGraph graph) {
// Instead, I use DescribableList#buildDependencyGraph, which is a part of
// Jenkins core and always work.
// See JENKINS-25017 for details.
for (BuildStep publisher: getPublisherList()) {
if (publisher instanceof Publisher) {
DescribableList<Publisher, Descriptor<Publisher>> lst = new DescribableList<Publisher, Descriptor<Publisher>>(
new Saveable() {
Expand Down Expand Up @@ -315,6 +370,7 @@ public void save() throws IOException {}
owner.getFullName()
});
}
}
}

}
Expand Up @@ -40,6 +40,7 @@
import hudson.model.Descriptor;
import hudson.model.Hudson;
import hudson.model.Result;
import hudson.tasks.BuildStep;
import hudson.tasks.BuildStepDescriptor;
import hudson.tasks.BuildStepMonitor;
import hudson.tasks.Publisher;
Expand Down Expand Up @@ -82,8 +83,11 @@ public List<ConditionalPublisher> getPublishers() {

public BuildStepMonitor getRequiredMonitorService() {
final Set<BuildStepMonitor> monitors = new HashSet<BuildStepMonitor>();
for (ConditionalPublisher cp : publishers)
monitors.add(cp.getPublisher().getRequiredMonitorService());
for (ConditionalPublisher cp : publishers) {
for (BuildStep publisher: cp.getPublisherList()) {
monitors.add(publisher.getRequiredMonitorService());
}
}
if (monitors.contains(BuildStepMonitor.BUILD)) return BuildStepMonitor.BUILD;
if (monitors.contains(BuildStepMonitor.STEP)) return BuildStepMonitor.STEP;
return BuildStepMonitor.NONE;
Expand Down Expand Up @@ -248,15 +252,16 @@ public MatrixAggregator createAggregator(
= new ArrayList<ConditionalMatrixAggregator>();

for (ConditionalPublisher cp: getPublishers()) {
if (!(cp.getPublisher() instanceof MatrixAggregatable)) {
for (BuildStep publisher: cp.getPublisherList()) {
if (!(publisher instanceof MatrixAggregatable)) {
if (cp.isConfiguredAggregation()) {
// Condition for Matrix Configuration is configured,
// but this publisher does not support aggregation!
if (cp.getPublisher() instanceof Describable<?>) {
if (publisher instanceof Describable<?>) {
listener.getLogger().println(String.format(
"[%s] WARNING: Condition for Matrix Aggregation is configured for %s which does not support aggregation",
getDescriptor().getDisplayName(),
((Describable<?>)cp.getPublisher()).getDescriptor().getDisplayName()
((Describable<?>)publisher).getDescriptor().getDisplayName()
));
} else {
listener.getLogger().println(String.format(
Expand Down Expand Up @@ -294,13 +299,14 @@ public MatrixAggregator createAggregator(
}

MatrixAggregator baseAggregator
= ((MatrixAggregatable)cp.getPublisher()).createAggregator(build, launcher, listener);
= ((MatrixAggregatable)publisher).createAggregator(build, launcher, listener);
if (baseAggregator == null) {
continue;
}
aggregatorList.add(new ConditionalMatrixAggregator(
build, launcher, listener, cp, baseAggregator
));
}
}

if (aggregatorList.isEmpty()) {
Expand Down
Expand Up @@ -46,8 +46,10 @@
</f:advanced>
</f:optionalBlock>
</j:if>
<f:dropdownDescriptorSelector title="${%publisher}" field="publisher" descriptors="${descriptor.getAllowedPublishers(it)}"
default="${descriptor.defaultPublisher}"/>
<f:entry title="${%publisher}" field="publisherList">
<f:hetero-list name="publisherList" hasHeader="true"
descriptors="${descriptor.getAllowedPublishers(it)}" items="${instance.publisherList}" />
</f:entry>
</j:scope>

</j:jelly>

0 comments on commit a8f232f

Please sign in to comment.