Navigation Menu

Skip to content

Commit

Permalink
Merge pull request #732 from pjrt/JENKINS-10502
Browse files Browse the repository at this point in the history
[FIXED JENKINS-10502] Option to make the build not fail if there is nothing to archive
  • Loading branch information
jglick committed Mar 18, 2013
2 parents 77e011a + f43cde6 commit aeb887c
Show file tree
Hide file tree
Showing 8 changed files with 46 additions and 12 deletions.
27 changes: 22 additions & 5 deletions core/src/main/java/hudson/tasks/ArtifactArchiver.java
Expand Up @@ -41,6 +41,7 @@
import java.io.IOException;

import net.sf.json.JSONObject;
import javax.annotation.Nonnull;

/**
* Copies the artifacts into an archive directory.
Expand All @@ -63,15 +64,27 @@ public class ArtifactArchiver extends Recorder {
* Just keep the last successful artifact set, no more.
*/
private final boolean latestOnly;

private static final Boolean allowEmptyArchive =
Boolean.getBoolean(ArtifactArchiver.class.getName()+".warnOnEmpty");

/**
* Fail (or not) the build if archiving returns nothing.
*/
@Nonnull
private Boolean allowEmptyArchive;

@DataBoundConstructor
public ArtifactArchiver(String artifacts, String excludes, boolean latestOnly) {
public ArtifactArchiver(String artifacts, String excludes, boolean latestOnly, boolean allowEmptyArchive) {
this.artifacts = artifacts.trim();
this.excludes = Util.fixEmptyAndTrim(excludes);
this.latestOnly = latestOnly;
this.allowEmptyArchive = allowEmptyArchive;
}

// Backwards compatibility for older builds
public Object readResolve() {
if (allowEmptyArchive == null) {
this.allowEmptyArchive = Boolean.getBoolean(ArtifactArchiver.class.getName()+".warnOnEmpty");
}
return this;
}

public String getArtifacts() {
Expand All @@ -85,6 +98,10 @@ public String getExcludes() {
public boolean isLatestOnly() {
return latestOnly;
}

public boolean getAllowEmptyArchive() {
return allowEmptyArchive;
}

private void listenerWarnOrError(BuildListener listener, String message) {
if (allowEmptyArchive) {
Expand All @@ -101,7 +118,7 @@ public boolean perform(AbstractBuild<?,?> build, Launcher launcher, BuildListene
build.setResult(Result.FAILURE);
return true;
}

File dir = build.getArtifactsDir();
dir.mkdirs();

Expand Down
Expand Up @@ -31,8 +31,11 @@ THE SOFTWARE.
<f:entry title="${%Excludes}" field="excludes">
<f:textbox />
</f:entry>
<f:entry title="" field="latestOnly" >
<f:entry field="latestOnly" >
<f:checkbox title="${%lastBuildOnly}"/>
</f:entry>
<f:entry field="allowEmptyArchive" >
<f:checkbox title="${%allowEmptyArchive}"/>
</f:entry>
</f:advanced>
</j:jelly>
Expand Up @@ -21,3 +21,4 @@
# THE SOFTWARE.

lastBuildOnly=Discard all but the last successful/stable artifact to save disk space
allowEmptyArchive=Do not fail build if archiving returns nothing
@@ -0,0 +1,5 @@
<div>
Normally, a build fails if archiving returns zero artifacts.
This option allows the archiving process to return nothing without failing the build.
Instead, the build will simply throw a warning.
</div>
Expand Up @@ -164,7 +164,7 @@ public class MatrixProjectTest extends HudsonTestCase {
else
p.getBuildersList().add(new Shell("touch p"));

p.getPublishersList().add(new ArtifactArchiver("p",null,false));
p.getPublishersList().add(new ArtifactArchiver("p",null,false, false));
p.getPublishersList().add(new Fingerprinter("",true));
buildAndAssertSuccess(p);
}
Expand Down
2 changes: 1 addition & 1 deletion test/src/test/java/hudson/model/AbstractProjectTest.java
Expand Up @@ -280,7 +280,7 @@ public void testSymlinkForPostBuildFailure() throws Exception {
assertSymlinkForBuild(lastSuccessful, 1);
assertSymlinkForBuild(lastStable, 1);
// Archive artifacts that don't exist to create failure in post-build action
job.getPublishersList().add(new ArtifactArchiver("*.foo", "", false));
job.getPublishersList().add(new ArtifactArchiver("*.foo", "", false, false));
build = job.scheduleBuild2(0, new Cause.UserCause()).get();
assertEquals(Result.FAILURE, build.getResult());
// Links should not be updated since build failed
Expand Down
14 changes: 11 additions & 3 deletions test/src/test/java/hudson/tasks/ArtifactArchiverTest.java
Expand Up @@ -48,7 +48,7 @@ public class ArtifactArchiverTest extends HudsonTestCase {

public void testSuccessVsFailure() throws Exception {
FreeStyleProject project = createFreeStyleProject();
project.getPublishersList().replaceBy(Collections.singleton(new ArtifactArchiver("f", "", true)));
project.getPublishersList().replaceBy(Collections.singleton(new ArtifactArchiver("f", "", true, false)));
assertEquals("(no artifacts)", Result.FAILURE, build(project)); // #1
assertFalse(project.getBuildByNumber(1).getHasArtifacts());
project.getBuildersList().replaceBy(Collections.singleton(new CreateArtifact()));
Expand Down Expand Up @@ -86,7 +86,7 @@ public void testSuccessVsFailure() throws Exception {
@Bug(2417)
public void testStableVsUnstable() throws Exception {
FreeStyleProject project = createFreeStyleProject();
Publisher artifactArchiver = new ArtifactArchiver("f", "", true);
Publisher artifactArchiver = new ArtifactArchiver("f", "", true, false);
project.getPublishersList().replaceBy(Collections.singleton(artifactArchiver));
project.getBuildersList().replaceBy(Collections.singleton(new CreateArtifact()));
assertEquals(Result.SUCCESS, build(project)); // #1
Expand Down Expand Up @@ -123,7 +123,7 @@ public void testStableVsUnstable() throws Exception {
@Bug(3227)
public void testEmptyDirectories() throws Exception {
FreeStyleProject project = createFreeStyleProject();
Publisher artifactArchiver = new ArtifactArchiver("dir/", "", false);
Publisher artifactArchiver = new ArtifactArchiver("dir/", "", false, false);
project.getPublishersList().replaceBy(Collections.singleton(artifactArchiver));
project.getBuildersList().replaceBy(Collections.singleton(new TestBuilder() {
public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException {
Expand All @@ -148,6 +148,14 @@ public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListen
assertEquals("file", kids[0].getName());
}

@Bug(10502)
public void testAllowEmptyArchive() throws Exception {
FreeStyleProject project = createFreeStyleProject();
project.getPublishersList().replaceBy(Collections.singleton(new ArtifactArchiver("f", "", false, true)));
assertEquals("(no artifacts)", Result.SUCCESS, build(project));
assertFalse(project.getBuildByNumber(1).getHasArtifacts());
}

static class CreateArtifact extends TestBuilder {
public boolean perform(AbstractBuild<?,?> build, Launcher launcher, BuildListener listener) throws IOException, InterruptedException {
build.getWorkspace().child("f").write("content", "UTF-8");
Expand Down
2 changes: 1 addition & 1 deletion test/src/test/java/hudson/tasks/LogRotatorTest.java
Expand Up @@ -78,7 +78,7 @@ public void testStableVsUnstable() throws Exception {
public void testArtifactDelete() throws Exception {
FreeStyleProject project = createFreeStyleProject();
project.setLogRotator(new LogRotator(-1, 6, -1, 2));
project.getPublishersList().replaceBy(Collections.singleton(new ArtifactArchiver("f", "", true)));
project.getPublishersList().replaceBy(Collections.singleton(new ArtifactArchiver("f", "", true, false)));
assertEquals("(no artifacts)", Result.FAILURE, build(project)); // #1
assertFalse(project.getBuildByNumber(1).getHasArtifacts());
project.getBuildersList().replaceBy(Collections.singleton(new CreateArtifact()));
Expand Down

0 comments on commit aeb887c

Please sign in to comment.