From acf716af98076d20979baafca0e47d3c2442eab0 Mon Sep 17 00:00:00 2001 From: Yoann Dubreuil Date: Mon, 23 Mar 2015 17:11:17 +0100 Subject: [PATCH] [FIXED JENKINS-27549] log job full name and catch Throwable (+1 squashed commit) Squashed commits: [73308b5] [FIXED JENKINS-27549] job loading can be broken by a NPE in a build trigger (cherry picked from commit 4c0d3ac6230300c369bc68878ea32c33a23c399a) --- .../java/hudson/model/AbstractProject.java | 6 +++- .../hudson/model/AbstractProjectTest.groovy | 34 +++++++++++++++++++ .../model/AbstractProjectTest/npeTrigger.xml | 8 +++++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 test/src/test/resources/hudson/model/AbstractProjectTest/npeTrigger.xml diff --git a/core/src/main/java/hudson/model/AbstractProject.java b/core/src/main/java/hudson/model/AbstractProject.java index 4a8e3dd901..dab18dc8dd 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 2db8384a9a..f40a32ed3a 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 0000000000..5c3a74c426 --- /dev/null +++ b/test/src/test/resources/hudson/model/AbstractProjectTest/npeTrigger.xml @@ -0,0 +1,8 @@ + + + + + + + + -- GitLab