提交 c3eb1cac 编写于 作者: C christ66

If a project action fails to load we should log the project action and...

If a project action fails to load we should log the project action and continue to load the project.
上级 cd075243
...@@ -751,8 +751,13 @@ public abstract class AbstractProject<P extends AbstractProject<P,R>,R extends A ...@@ -751,8 +751,13 @@ public abstract class AbstractProject<P extends AbstractProject<P,R>,R extends A
for (JobProperty<? super P> p : Util.fixNull(properties)) for (JobProperty<? super P> p : Util.fixNull(properties))
ta.addAll(p.getJobActions((P)this)); ta.addAll(p.getJobActions((P)this));
for (TransientProjectActionFactory tpaf : TransientProjectActionFactory.all()) for (TransientProjectActionFactory tpaf : TransientProjectActionFactory.all()) {
ta.addAll(Util.fixNull(tpaf.createFor(this))); // be defensive against null try {
ta.addAll(Util.fixNull(tpaf.createFor(this))); // be defensive against null
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "Error loading transient project action factory.");
}
}
return ta; return ta;
} }
......
...@@ -30,6 +30,9 @@ import java.util.Collection; ...@@ -30,6 +30,9 @@ import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import jenkins.model.ModelObjectWithContextMenu; import jenkins.model.ModelObjectWithContextMenu;
import jenkins.model.TransientActionFactory; import jenkins.model.TransientActionFactory;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
...@@ -91,7 +94,11 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj ...@@ -91,7 +94,11 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj
List<Action> _actions = new ArrayList<Action>(getActions()); List<Action> _actions = new ArrayList<Action>(getActions());
for (TransientActionFactory<?> taf : ExtensionList.lookup(TransientActionFactory.class)) { for (TransientActionFactory<?> taf : ExtensionList.lookup(TransientActionFactory.class)) {
if (taf.type().isInstance(this)) { if (taf.type().isInstance(this)) {
_actions.addAll(createFor(taf)); try {
_actions.addAll(createFor(taf));
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "Error loading action.", e);
}
} }
} }
return Collections.unmodifiableList(_actions); return Collections.unmodifiableList(_actions);
...@@ -177,4 +184,6 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj ...@@ -177,4 +184,6 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj
@Override public ContextMenu doContextMenu(StaplerRequest request, StaplerResponse response) throws Exception { @Override public ContextMenu doContextMenu(StaplerRequest request, StaplerResponse response) throws Exception {
return new ContextMenu().from(this,request,response); return new ContextMenu().from(this,request,response);
} }
private static final Logger LOGGER = Logger.getLogger(Actionable.class.getName());
} }
...@@ -52,6 +52,9 @@ import java.util.List; ...@@ -52,6 +52,9 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
import java.util.logging.Level;
import java.util.logging.Logger;
import jenkins.triggers.SCMTriggerItem; import jenkins.triggers.SCMTriggerItem;
/** /**
...@@ -234,15 +237,37 @@ public abstract class Project<P extends Project<P,B>,B extends Build<P,B>> ...@@ -234,15 +237,37 @@ public abstract class Project<P extends Project<P,B>,B extends Build<P,B>>
protected List<Action> createTransientActions() { protected List<Action> createTransientActions() {
List<Action> r = super.createTransientActions(); List<Action> r = super.createTransientActions();
for (BuildStep step : getBuildersList()) for (BuildStep step : getBuildersList()) {
r.addAll(step.getProjectActions(this)); try {
for (BuildStep step : getPublishersList()) r.addAll(step.getProjectActions(this));
r.addAll(step.getProjectActions(this)); } catch (Exception e) {
for (BuildWrapper step : getBuildWrappers().values()) LOGGER.log(Level.SEVERE, "Error loading build step.", e);
r.addAll(step.getProjectActions(this)); }
for (Trigger trigger : triggers()) }
r.addAll(trigger.getProjectActions()); for (BuildStep step : getPublishersList()) {
try {
r.addAll(step.getProjectActions(this));
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "Error loading publisher.", e);
}
}
for (BuildWrapper step : getBuildWrappers().values()) {
try {
r.addAll(step.getProjectActions(this));
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "Error loading build wrapper.", e);
}
}
for (Trigger trigger : triggers()) {
try {
r.addAll(trigger.getProjectActions());
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "Error loading trigger.", e);
}
}
return r; return r;
} }
private static final Logger LOGGER = Logger.getLogger(Project.class.getName());
} }
...@@ -24,11 +24,15 @@ ...@@ -24,11 +24,15 @@
package hudson.model; package hudson.model;
import java.util.Collection;
import static org.junit.Assert.*;
import hudson.Extension; import hudson.Extension;
import hudson.tasks.BuildStepDescriptor;
import hudson.tasks.BuildStepMonitor;
import hudson.tasks.BuildTrigger;
import hudson.tasks.BuildWrapper; import hudson.tasks.BuildWrapper;
import hudson.tasks.BuildWrapperDescriptor; import hudson.tasks.BuildWrapperDescriptor;
import hudson.tasks.Builder;
import hudson.tasks.Publisher;
import hudson.triggers.Trigger;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
...@@ -39,8 +43,14 @@ import org.jvnet.hudson.test.TestExtension; ...@@ -39,8 +43,14 @@ import org.jvnet.hudson.test.TestExtension;
import org.jvnet.hudson.test.recipes.LocalData; import org.jvnet.hudson.test.recipes.LocalData;
import java.io.File; import java.io.File;
import java.util.Collection;
import java.util.Iterator;
import java.util.List; import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
public class ItemGroupMixInTest { public class ItemGroupMixInTest {
@Rule public JenkinsRule r = new JenkinsRule(); @Rule public JenkinsRule r = new JenkinsRule();
...@@ -103,12 +113,17 @@ public class ItemGroupMixInTest { ...@@ -103,12 +113,17 @@ public class ItemGroupMixInTest {
MockFolder d = r.jenkins.getItemByFullName("d", MockFolder.class); MockFolder d = r.jenkins.getItemByFullName("d", MockFolder.class);
assertNotNull(d); assertNotNull(d);
Collection<TopLevelItem> items = d.getItems(); Collection<TopLevelItem> items = d.getItems();
assertEquals(1, items.size()); assertEquals(5, items.size());
assertEquals("valid", items.iterator().next().getName()); Iterator<TopLevelItem> iterator = items.iterator();
assertEquals("badBuildStep", iterator.next().getName());
assertEquals("badBuildTrigger", iterator.next().getName());
assertEquals("badBuildWrapper", iterator.next().getName());
assertEquals("badPublisher", iterator.next().getName());
assertEquals("valid", iterator.next().getName());
} }
@TestExtension @TestExtension
public static class MockBuilderThrowsError extends BuildWrapper { public static class MockBuildWrapperThrowsError extends BuildWrapper {
@Override @Override
public Collection<? extends Action> getProjectActions(AbstractProject project){ public Collection<? extends Action> getProjectActions(AbstractProject project){
throw new NullPointerException(); throw new NullPointerException();
...@@ -127,4 +142,62 @@ public class ItemGroupMixInTest { ...@@ -127,4 +142,62 @@ public class ItemGroupMixInTest {
} }
} }
} }
@TestExtension
public static class MockBuilderThrowsError extends Builder {
@Override
public Collection<? extends Action> getProjectActions(AbstractProject project){
throw new NullPointerException();
}
@Extension public static final Descriptor DESCRIPTOR = new DescriptorImpl();
public static class DescriptorImpl extends BuildStepDescriptor {
@Override
public boolean isApplicable(Class jobType) {
return false;
}
@Override
public String getDisplayName() {
return null;
}
}
}
@TestExtension
public static class MockBuildTriggerThrowsError extends Trigger {
@Override
public Collection<? extends Action> getProjectActions() {
throw new NullPointerException();
}
@Extension public static final Descriptor DESCRIPTOR = new BuildTrigger.DescriptorImpl();
}
@TestExtension
public static class MockPublisherThrowsError extends Publisher {
@Override
public Collection<? extends Action> getProjectActions(AbstractProject project) {
throw new NullPointerException();
}
@Override
public BuildStepMonitor getRequiredMonitorService() {
return null;
}
@Extension public static final Descriptor DESCRIPTOR = new DescriptorImpl();
public static class DescriptorImpl extends BuildStepDescriptor {
@Override
public boolean isApplicable(Class jobType) {
return false;
}
@Override
public String getDisplayName() {
return null;
}
}
}
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册