diff --git a/core/src/main/java/hudson/tasks/ArtifactArchiver.java b/core/src/main/java/hudson/tasks/ArtifactArchiver.java index 11e5d908cec7b68d6a12bbc169c2790f5246c2bf..5f47ce243f7dbb46acb5404a10be4f75960f1c01 100644 --- a/core/src/main/java/hudson/tasks/ArtifactArchiver.java +++ b/core/src/main/java/hudson/tasks/ArtifactArchiver.java @@ -170,17 +170,19 @@ public class ArtifactArchiver extends Recorder { AbstractBuild b = build.getProject().getLastCompletedBuild(); Result bestResultSoFar = Result.NOT_BUILT; while(b!=null) { - if (b.getResult().isBetterThan(bestResultSoFar)) { - bestResultSoFar = b.getResult(); - } else { - // remove old artifacts - File ad = b.getArtifactsDir(); - if(ad.exists()) { - listener.getLogger().println(Messages.ArtifactArchiver_DeletingOld(b.getDisplayName())); - try { - Util.deleteRecursive(ad); - } catch (IOException e) { - e.printStackTrace(listener.error(e.getMessage())); + if(b.getResult()!=null){ + if (b.getResult().isBetterThan(bestResultSoFar)) { + bestResultSoFar = b.getResult(); + } else { + // remove old artifacts + File ad = b.getArtifactsDir(); + if(ad.exists()) { + listener.getLogger().println(Messages.ArtifactArchiver_DeletingOld(b.getDisplayName())); + try { + Util.deleteRecursive(ad); + } catch (IOException e) { + e.printStackTrace(listener.error(e.getMessage())); + } } } } diff --git a/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java b/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java index cb951e2c25bfb90676ef5a108c0e12aeb1348c01..db8f6299626eb72f0b68ca015d0c29c834c6404c 100644 --- a/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java +++ b/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java @@ -24,30 +24,39 @@ package hudson.tasks; +import hudson.model.AbstractProject; +import org.junit.Test; import hudson.FilePath; import hudson.Launcher; import hudson.model.AbstractBuild; import hudson.model.BuildListener; import hudson.model.FreeStyleProject; import hudson.model.Result; +import hudson.model.StreamBuildListener; import hudson.tasks.LogRotatorTest.TestsFail; import java.io.File; import static hudson.tasks.LogRotatorTest.build; import java.io.IOException; +import java.nio.charset.Charset; import java.util.Arrays; import java.util.Collections; +import org.junit.Rule; import org.jvnet.hudson.test.Bug; import org.jvnet.hudson.test.FailureBuilder; -import org.jvnet.hudson.test.HudsonTestCase; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestBuilder; +import static org.junit.Assert.*; /** * Verifies that artifacts from the last successful and stable builds of a job will be kept if requested. */ -public class ArtifactArchiverTest extends HudsonTestCase { +public class ArtifactArchiverTest { + + @Rule public JenkinsRule j = new JenkinsRule(); + @Test public void testSuccessVsFailure() throws Exception { - FreeStyleProject project = createFreeStyleProject(); + FreeStyleProject project = j.createFreeStyleProject(); project.getPublishersList().replaceBy(Collections.singleton(new ArtifactArchiver("f", "", true, false))); assertEquals("(no artifacts)", Result.FAILURE, build(project)); // #1 assertFalse(project.getBuildByNumber(1).getHasArtifacts()); @@ -83,9 +92,10 @@ public class ArtifactArchiverTest extends HudsonTestCase { assertTrue(project.getBuildByNumber(7).getHasArtifacts()); } + @Test @Bug(2417) public void testStableVsUnstable() throws Exception { - FreeStyleProject project = createFreeStyleProject(); + FreeStyleProject project = j.createFreeStyleProject(); Publisher artifactArchiver = new ArtifactArchiver("f", "", true, false); project.getPublishersList().replaceBy(Collections.singleton(artifactArchiver)); project.getBuildersList().replaceBy(Collections.singleton(new CreateArtifact())); @@ -120,9 +130,10 @@ public class ArtifactArchiverTest extends HudsonTestCase { assertTrue(project.getBuildByNumber(6).getHasArtifacts()); } + @Test @Bug(3227) public void testEmptyDirectories() throws Exception { - FreeStyleProject project = createFreeStyleProject(); + FreeStyleProject project = j.createFreeStyleProject(); Publisher artifactArchiver = new ArtifactArchiver("dir/", "", false, false); project.getPublishersList().replaceBy(Collections.singleton(artifactArchiver)); project.getBuildersList().replaceBy(Collections.singleton(new TestBuilder() { @@ -148,13 +159,57 @@ public class ArtifactArchiverTest extends HudsonTestCase { assertEquals("file", kids[0].getName()); } + @Test @Bug(10502) public void testAllowEmptyArchive() throws Exception { - FreeStyleProject project = createFreeStyleProject(); + FreeStyleProject project = j.createFreeStyleProject(); project.getPublishersList().replaceBy(Collections.singleton(new ArtifactArchiver("f", "", false, true))); assertEquals("(no artifacts)", Result.SUCCESS, build(project)); assertFalse(project.getBuildByNumber(1).getHasArtifacts()); } + + private void runNewBuildAndStartUnitlIsCreated(AbstractProject project) throws InterruptedException{ + int buildNumber = project.getNextBuildNumber(); + project.scheduleBuild2(0); + int count = 0; + while(project.getBuildByNumber(buildNumber)==null && count<30){ + Thread.sleep(100); + count ++; + } + if(project.getBuildByNumber(buildNumber)==null) + fail("Build " + buildNumber + " did not created."); + } + + @Test + public void testPrebuildWithConcurrentBuilds() throws IOException, Exception{ + FreeStyleProject project = j.createFreeStyleProject(); + j.jenkins.setNumExecutors(4); + //logest build + project.getBuildersList().add(new Shell("sleep 100")); + project.setConcurrentBuild(true); + Publisher artifactArchiver = new ArtifactArchiver("dir/", "", true, false); + runNewBuildAndStartUnitlIsCreated(project); + //shortest build + project.getBuildersList().clear(); + j.buildAndAssertSuccess(project); + //longest build + project.getBuildersList().add(new Shell("sleep 100")); + runNewBuildAndStartUnitlIsCreated(project); + AbstractBuild build = project.getLastBuild(); + BuildListener listner = new StreamBuildListener(BuildListener.NULL.getLogger(), Charset.defaultCharset()); + try{ + System.out.println("last build is " + project.getLastBuild()); + for(AbstractBuild b: project.getBuilds()){ + System.out.println(" build " + b + " sttus " + b.getResult()); + } + boolean ok = artifactArchiver.prebuild(build, listner); + assertTrue("Artefact archiver should not have any problem.", ok); + } + catch(Exception e){ + fail("Artefact archiver should not throw exception " + e + " for concurrent builds"); + } + + } static class CreateArtifact extends TestBuilder { public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws IOException, InterruptedException {