Skip to content

Commit

Permalink
[FIXED JENKINS-12923] Fixed infinite loop, when
Browse files Browse the repository at this point in the history
"Block until the triggered projects finish their builds" option is used and
triggered projects are disabled. Also added test cases.
  • Loading branch information
fredg02 committed Mar 25, 2012
1 parent 207c7b7 commit 0a24f07
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 9 deletions.
Expand Up @@ -65,7 +65,10 @@ protected Future schedule(AbstractBuild<?, ?> build, AbstractProject project, Li
// if we fail to add the item to the queue, wait and retry.
// it also means we have to force quiet period = 0, or else it'll never leave the queue
Future f = project.scheduleBuild2(0, new UpstreamCause((Run) build), list.toArray(new Action[list.size()]));
if (f!=null) return f;
//when a project is disabled or the configuration is not yet saved f will always be null and we'ure caught in a loop, therefore we need to check for it
if (f!=null || (f==null && !project.isBuildable())){
return f;
}
Thread.sleep(1000);
}
} else {
Expand Down
Expand Up @@ -104,6 +104,11 @@ public boolean perform(AbstractBuild<?, ?> build, Launcher launcher,
}
//handle blocking configs
for (AbstractProject p : projectList) {
//handle non-buildable projects
if(!p.isBuildable()){
listener.getLogger().println("Skipping " + HyperlinkNote.encodeTo('/'+ p.getUrl(), p.getFullDisplayName()) + ". The project is either disabled or the configuration has not been saved yet.");
continue;
}
for (Future<AbstractBuild> future : futures.get(p)) {
try {
listener.getLogger().println("Waiting for the completion of " + HyperlinkNote.encodeTo('/'+ p.getUrl(), p.getFullDisplayName()));
Expand Down
Expand Up @@ -24,23 +24,20 @@
package hudson.plugins.parameterizedtrigger.test;

import hudson.model.Cause.UserCause;
import hudson.model.ParametersAction;
import hudson.model.Project;
import hudson.model.StringParameterValue;
import hudson.model.Result;
import hudson.plugins.parameterizedtrigger.AbstractBuildParameterFactory;
import hudson.plugins.parameterizedtrigger.AbstractBuildParameters;
import hudson.plugins.parameterizedtrigger.BlockableBuildTriggerConfig;
import hudson.plugins.parameterizedtrigger.BlockingBehaviour;
import hudson.plugins.parameterizedtrigger.BuildTrigger;
import hudson.plugins.parameterizedtrigger.BuildTriggerConfig;
import hudson.plugins.parameterizedtrigger.CurrentBuildParameters;
import hudson.plugins.parameterizedtrigger.ResultCondition;
import hudson.plugins.parameterizedtrigger.CounterBuildParameterFactory;
import hudson.plugins.parameterizedtrigger.TriggerBuilder;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.jvnet.hudson.test.HudsonTestCase;
import org.jvnet.hudson.test.CaptureEnvironmentBuilder;
import com.google.common.collect.ImmutableList;

public class TriggerBuilderTest extends HudsonTestCase {

Expand Down Expand Up @@ -126,4 +123,61 @@ public void testNonBlockingTrigger() throws Exception {
assertEquals("Triggering projects: project1, project2, project3", log.get(1));
}

public void testConsoleOutputWithCounterParameters() throws Exception{
createFreeStyleProject("project1");
createFreeStyleProject("project2");
createFreeStyleProject("project3");

Project<?,?> triggerProject = createFreeStyleProject();

BlockingBehaviour blockingBehaviour = new BlockingBehaviour(Result.FAILURE, Result.UNSTABLE, Result.FAILURE);
ImmutableList<AbstractBuildParameterFactory> buildParameter = ImmutableList.<AbstractBuildParameterFactory>of(new CounterBuildParameterFactory("0","2","1", "TEST=COUNT$COUNT"));
List<AbstractBuildParameters> emptyList = Collections.<AbstractBuildParameters>emptyList();

BlockableBuildTriggerConfig bBTConfig = new BlockableBuildTriggerConfig("project1, project2, project3", blockingBehaviour, buildParameter, emptyList);

triggerProject.getBuildersList().add(new TriggerBuilder(bBTConfig));

triggerProject.scheduleBuild2(0, new UserCause()).get();

List<String> log = triggerProject.getLastBuild().getLog(20);
for (String string : log) {
System.out.println(string);
}

assertEquals("project1 #1 completed. Result was SUCCESS", log.get(2));
assertEquals("project1 #2 completed. Result was SUCCESS", log.get(4));
assertEquals("project1 #3 completed. Result was SUCCESS", log.get(6));
assertEquals("project2 #1 completed. Result was SUCCESS", log.get(8));
assertEquals("project2 #2 completed. Result was SUCCESS", log.get(10));
assertEquals("project2 #3 completed. Result was SUCCESS", log.get(12));
assertEquals("project3 #1 completed. Result was SUCCESS", log.get(14));
assertEquals("project3 #2 completed. Result was SUCCESS", log.get(16));
assertEquals("project3 #3 completed. Result was SUCCESS", log.get(18));
}


public void testBlockingTriggerWithDisabledProjects() throws Exception {
createFreeStyleProject("project1");
Project p2 = createFreeStyleProject("project2");
p2.disable();
createFreeStyleProject("project3");

Project<?, ?> triggerProject = createFreeStyleProject("projectA");

TriggerBuilder triggerBuilder = new TriggerBuilder(createTriggerConfig("project1, project2, project3"));

triggerProject.getBuildersList().add(triggerBuilder);

triggerProject.scheduleBuild2(0, new UserCause()).get();

List<String> log = triggerProject.getLastBuild().getLog(20);
for (String string : log) {
System.out.println(string);
}
assertEquals("Waiting for the completion of project1", log.get(1));
assertEquals("Skipping project2. The project is either disabled or the configuration has not been saved yet.", log.get(3));
assertEquals("Waiting for the completion of project3", log.get(4));

}
}

0 comments on commit 0a24f07

Please sign in to comment.