diff --git a/core/src/main/java/hudson/model/AbstractProject.java b/core/src/main/java/hudson/model/AbstractProject.java index 4a8e3dd901087490ace0d33414d07520f081a2ca..dab18dc8dd219d70d237a81fdbc63e40f71e72ee 100644 --- a/core/src/main/java/hudson/model/AbstractProject.java +++ b/core/src/main/java/hudson/model/AbstractProject.java @@ -323,7 +323,11 @@ public abstract class AbstractProject

,R extends A builds = buildMixIn.getRunMap(); triggers().setOwner(this); for (Trigger t : triggers()) { - t.start(this, Items.currentlyUpdatingByXml()); + try { + t.start(this, Items.currentlyUpdatingByXml()); + } catch (Throwable e) { + LOGGER.log(Level.WARNING, "could not start trigger while loading project '" + getFullName() + "'", e); + } } if(scm==null) scm = new NullSCM(); // perhaps it was pointing to a plugin that no longer exists. diff --git a/test/src/test/groovy/hudson/model/AbstractProjectTest.groovy b/test/src/test/groovy/hudson/model/AbstractProjectTest.groovy index 2db8384a9a243ae064790177b58e244942b5503b..f40a32ed3aaf43ebe1229a61b6d2b32a71caf45a 100644 --- a/test/src/test/groovy/hudson/model/AbstractProjectTest.groovy +++ b/test/src/test/groovy/hudson/model/AbstractProjectTest.groovy @@ -48,6 +48,7 @@ import hudson.Util; import hudson.tasks.ArtifactArchiver import hudson.triggers.SCMTrigger; import hudson.triggers.TimerTrigger +import hudson.triggers.Trigger import hudson.triggers.TriggerDescriptor; import hudson.util.StreamTaskListener; import hudson.util.OneShotEvent @@ -58,6 +59,7 @@ import org.jvnet.hudson.test.HudsonTestCase import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.MemoryAssert import org.jvnet.hudson.test.SequenceLock; +import org.jvnet.hudson.test.TestExtension; import org.jvnet.hudson.test.recipes.PresetData; import org.jvnet.hudson.test.recipes.PresetData.DataSet import org.apache.commons.io.FileUtils; @@ -592,4 +594,36 @@ public class AbstractProjectTest extends HudsonTestCase { } return con } + + @Issue("JENKINS-27549") + public void testLoadingWithNPEOnTriggerStart() { + AbstractProject project = jenkins.createProjectFromXML("foo", getClass().getResourceAsStream("AbstractProjectTest/npeTrigger.xml")) + + assert project.triggers().size() == 1 + } + + static class MockBuildTriggerThrowsNPEOnStart extends Trigger { + @Override + public void start(hudson.model.Item project, boolean newInstance) { throw new NullPointerException(); } + + @Override + public TriggerDescriptor getDescriptor() { + return DESCRIPTOR; + } + + public static final TriggerDescriptor DESCRIPTOR = new DescriptorImpl() + + @TestExtension("testLoadingWithNPEOnTriggerStart") + static class DescriptorImpl extends TriggerDescriptor { + + public boolean isApplicable(hudson.model.Item item) { + return false; + } + + @Override + String getDisplayName() { + return "test"; + } + } + } } diff --git a/test/src/test/resources/hudson/model/AbstractProjectTest/npeTrigger.xml b/test/src/test/resources/hudson/model/AbstractProjectTest/npeTrigger.xml new file mode 100644 index 0000000000000000000000000000000000000000..5c3a74c42663e314cc8577f94f796e292f5c6017 --- /dev/null +++ b/test/src/test/resources/hudson/model/AbstractProjectTest/npeTrigger.xml @@ -0,0 +1,8 @@ + + + + + + + +