From 0311b2dffa76ba01748b1be6a18fc7c1955e65fe Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Sun, 21 Jan 2018 08:38:52 +0100 Subject: [PATCH] [FIXES JENKINS-47406] Milestone JOB_LOADED is now attained after cleaning up obsolete items (#3078) * [FIXES JENKINS-47406] Milestone JOB_LOADED is now attained after cleaning up obsolete items This allows @Initializer(after=InitMilestone.JOB_LOADED) implementations to create items safely without risking them to be removed. * [JENKINS-47406] Add test with an initializer creating a job * Revert "[FIXES JENKINS-47406] Milestone JOB_LOADED is now attained after cleaning up obsolete items" This reverts commit 79ce796b00fde11fda586c9c9e2b8e93a53e2b31. * [JENKINS-47406] Reinstate the test with Jesse's solution * Reverted this commit by mistake Revert "Revert "[FIXES JENKINS-47406] Milestone JOB_LOADED is now attained after cleaning up obsolete items"" This reverts commit 36c499c58c83427c7b8a6d3cc5902ec26732b2c7. * Add link to hpi sources * Fix Mix-up after the previous merge --- core/src/main/java/jenkins/model/Jenkins.java | 7 ++++--- .../src/test/java/jenkins/model/JenkinsTest.java | 11 +++++++++++ .../src/test/resources/plugins/jenkins-47406.hpi | Bin 0 -> 5022 bytes 3 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 test/src/test/resources/plugins/jenkins-47406.hpi diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 5de956996b..01951e03f9 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -3054,8 +3054,9 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve } }); + List loadJobs = new ArrayList<>(); for (final File subdir : subdirs) { - g.requires(loadJenkins).attains(JOB_LOADED).notFatal().add("Loading item " + subdir.getName(), new Executable() { + loadJobs.add(g.requires(loadJenkins).attains(JOB_LOADED).notFatal().add("Loading item " + subdir.getName(), new Executable() { public void run(Reactor session) throws Exception { if(!Items.getConfigFile(subdir).exists()) { //Does not have job config file, so it is not a jenkins job hence skip it @@ -3065,10 +3066,10 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve items.put(item.getName(), item); loadedNames.add(item.getName()); } - }); + })); } - g.requires(JOB_LOADED).attains(COMPLETED).add("Cleaning up obsolete items deleted from the disk", new Executable() { + g.requires(loadJobs.toArray(new Handle[loadJobs.size()])).attains(JOB_LOADED).add("Cleaning up obsolete items deleted from the disk", new Executable() { public void run(Reactor reactor) throws Exception { // anything we didn't load from disk, throw them away. // doing this after loading from disk allows newly loaded items diff --git a/test/src/test/java/jenkins/model/JenkinsTest.java b/test/src/test/java/jenkins/model/JenkinsTest.java index a68ee0a4d6..833230dbe8 100644 --- a/test/src/test/java/jenkins/model/JenkinsTest.java +++ b/test/src/test/java/jenkins/model/JenkinsTest.java @@ -23,6 +23,7 @@ */ package jenkins.model; +import static hudson.init.InitMilestone.*; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.greaterThan; @@ -44,6 +45,7 @@ import com.gargoylesoftware.htmlunit.WebResponse; import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlPage; +import hudson.init.Initializer; import hudson.maven.MavenModuleSet; import hudson.maven.MavenModuleSetBuild; import hudson.model.Computer; @@ -72,6 +74,7 @@ import org.jvnet.hudson.test.ExtractResourceSCM; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.JenkinsRule.WebClient; import org.jvnet.hudson.test.TestExtension; +import org.jvnet.hudson.test.recipes.WithPlugin; import org.kohsuke.stapler.HttpResponse; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; @@ -83,6 +86,7 @@ import java.net.URL; import java.util.Collections; import java.util.HashSet; import java.util.Set; +import java.util.logging.Logger; import org.jvnet.hudson.test.MockAuthorizationStrategy; import javax.annotation.CheckForNull; @@ -683,4 +687,11 @@ public class JenkinsTest { VersionNumber nullVersion = Jenkins.getStoredVersion(); assertNull(nullVersion); } + + @Issue("JENKINS-47406") + @Test + @WithPlugin("jenkins-47406.hpi") // Sources: https://github.com/Vlatombe/jenkins-47406 + public void jobCreatedByInitializerIsRetained() { + assertNotNull("JENKINS-47406 should exist", j.jenkins.getItem("JENKINS-47406")); + } } diff --git a/test/src/test/resources/plugins/jenkins-47406.hpi b/test/src/test/resources/plugins/jenkins-47406.hpi new file mode 100644 index 0000000000000000000000000000000000000000..747db946fdd0f53d965e98f40abf6555adbe6871 GIT binary patch literal 5022 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 literal 0 HcmV?d00001