Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[FIXED JENKINS-17576] [FIXED JENKINS-16870] support conditional build…
…step plugin
  • Loading branch information
imod committed Aug 21, 2013
1 parent f9336d9 commit 11b6d2e
Show file tree
Hide file tree
Showing 5 changed files with 168 additions and 37 deletions.
6 changes: 6 additions & 0 deletions pom.xml
Expand Up @@ -67,6 +67,12 @@
<artifactId>envinject</artifactId>
<version>1.83</version>
</dependency>

<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>conditional-buildstep</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>

<build>
Expand Down
Expand Up @@ -8,14 +8,13 @@
import hudson.model.ViewDescriptor;
import hudson.model.ViewGroup;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.Descriptor;
import hudson.model.Descriptor.FormException;
import hudson.model.ExternalJob;
import hudson.model.FreeStyleProject;

import hudson.model.Hudson;
import hudson.model.Job;
import hudson.model.ListView;
import hudson.tasks.BuildStep;
import hudson.tasks.Builder;
import hudson.util.DescribableList;
import hudson.util.FormValidation;
Expand All @@ -31,6 +30,8 @@

import javax.servlet.ServletException;

import org.jenkinsci.plugins.conditionalbuildstep.ConditionalBuilder;
import org.jenkinsci.plugins.conditionalbuildstep.singlestep.SingleConditionalBuilder;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
Expand Down Expand Up @@ -109,7 +110,6 @@ private void addTopLevelProject(MultiJobProject project,
addMultiProject(null, project, createBuildState(project), 0, null, out);
}

@SuppressWarnings("rawtypes")
private void addMultiProject(MultiJobProject parent,
MultiJobProject project, BuildState buildState, int nestLevel,
String phaseName, List<TopLevelItem> out) {
Expand All @@ -118,38 +118,59 @@ private void addMultiProject(MultiJobProject parent,
for (Builder builder : builders) {
int phaseNestLevel = nestLevel + 1;
if (builder instanceof MultiJobBuilder) {
MultiJobBuilder reactorBuilder = (MultiJobBuilder) builder;
List<PhaseJobsConfig> subProjects = reactorBuilder
.getPhaseJobs();
String currentPhaseName = reactorBuilder.getPhaseName();
PhaseWrapper phaseWrapper = new PhaseWrapper(phaseNestLevel,
currentPhaseName);
out.add(phaseWrapper);
for (PhaseJobsConfig projectConfig : subProjects) {
TopLevelItem tli = Hudson.getInstance().getItem(
projectConfig.getJobName());
if (tli instanceof MultiJobProject) {
MultiJobProject subProject = (MultiJobProject) tli;
BuildState jobBuildState = createBuildState(buildState,
project, subProject);
phaseWrapper.addChildBuildState(jobBuildState);
addMultiProject(project, subProject, jobBuildState,
phaseNestLevel + 1, currentPhaseName, out);
} else {
Job subProject = (Job) tli;
if(subProject == null)
continue;
BuildState jobBuildState = createBuildState(buildState,
project, subProject);
phaseWrapper.addChildBuildState(jobBuildState);
addSimpleProject(project, subProject, jobBuildState,
phaseNestLevel + 1, out);
}
}
}
addProjectFromBuilder(project, buildState, out, builder, phaseNestLevel, false);
}

else if (builder instanceof ConditionalBuilder) {
final List<BuildStep> conditionalbuilders = ((ConditionalBuilder)builder).getConditionalbuilders();
for (BuildStep buildStep : conditionalbuilders) {
if(buildStep instanceof MultiJobBuilder) {
addProjectFromBuilder(project, buildState, out, buildStep, phaseNestLevel, true);
}
}
}

else if (builder instanceof SingleConditionalBuilder) {
final BuildStep buildStep = ((SingleConditionalBuilder)builder).getBuildStep();
if(buildStep instanceof MultiJobBuilder) {
addProjectFromBuilder(project, buildState, out, buildStep, phaseNestLevel, true);
}
}
}
}

@SuppressWarnings("rawtypes")
private void addProjectFromBuilder(MultiJobProject project, BuildState buildState, List<TopLevelItem> out, BuildStep builder, int phaseNestLevel, boolean isConditional) {
MultiJobBuilder reactorBuilder = (MultiJobBuilder) builder;
List<PhaseJobsConfig> subProjects = reactorBuilder
.getPhaseJobs();
String currentPhaseName = reactorBuilder.getPhaseName();
PhaseWrapper phaseWrapper = new PhaseWrapper(phaseNestLevel,
currentPhaseName, isConditional);
out.add(phaseWrapper);
for (PhaseJobsConfig projectConfig : subProjects) {
TopLevelItem tli = Hudson.getInstance().getItem(
projectConfig.getJobName());
if (tli instanceof MultiJobProject) {
MultiJobProject subProject = (MultiJobProject) tli;
BuildState jobBuildState = createBuildState(buildState,
project, subProject);
phaseWrapper.addChildBuildState(jobBuildState);
addMultiProject(project, subProject, jobBuildState,
phaseNestLevel + 1, currentPhaseName, out);
} else {
Job subProject = (Job) tli;
if(subProject == null)
continue;
BuildState jobBuildState = createBuildState(buildState,
project, subProject);
phaseWrapper.addChildBuildState(jobBuildState);
addSimpleProject(project, subProject, jobBuildState,
phaseNestLevel + 1, out);
}
}
}

@SuppressWarnings("rawtypes")
private void addSimpleProject(MultiJobProject parent,
Job project, BuildState buildState, int nestLevel,
Expand Down
Expand Up @@ -5,7 +5,6 @@
import hudson.model.ItemGroup;
import hudson.model.Result;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.Hudson;
import hudson.model.Job;

Expand All @@ -20,10 +19,13 @@ public class PhaseWrapper extends AbstractWrapper {
final int nestLevel;

final String phaseName;

final boolean isConditional;

public PhaseWrapper(int nestLevel, String phaseName) {
public PhaseWrapper(int nestLevel, String phaseName, boolean isConditional) {
this.nestLevel = nestLevel;
this.phaseName = phaseName;
this.isConditional = isConditional;
}

@SuppressWarnings("unchecked")
Expand Down Expand Up @@ -51,6 +53,10 @@ public int getNestLevel() {
return nestLevel;
}

public boolean isConditional() {
return isConditional;
}

// public AbstractProject getProject() {
// return project;
// }
Expand Down
Expand Up @@ -4,10 +4,10 @@
<td style="${job.getCss()}">
<j:choose>
<j:when test="${job.phase}">
${job.displayName}
${job.isConditional() ? "[?]" : ""} ${job.displayName}
</j:when>
<j:when test="${!job.phase}">
<a href="${jobBaseUrl}${job.shortUrl}"> ${job.displayName}</a>
<a href="${jobBaseUrl}${job.shortUrl}">${job.displayName}</a>
</j:when>
</j:choose>
</td>
Expand Down
@@ -0,0 +1,98 @@
package com.tikal.jenkins.plugins.multijob.test;

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

import hudson.model.Result;
import hudson.model.TopLevelItem;
import hudson.model.Cause.UserCause;
import hudson.model.FreeStyleProject;
import hudson.tasks.BuildStep;
import hudson.tasks.Shell;

import org.jenkins_ci.plugins.run_condition.BuildStepRunner;
import org.jenkins_ci.plugins.run_condition.core.AlwaysRun;
import org.jenkinsci.plugins.conditionalbuildstep.ConditionalBuilder;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.JenkinsRule;

import com.tikal.jenkins.plugins.multijob.MultiJobBuilder;
import com.tikal.jenkins.plugins.multijob.MultiJobBuilder.ContinuationCondition;
import com.tikal.jenkins.plugins.multijob.views.PhaseWrapper;
import com.tikal.jenkins.plugins.multijob.views.ProjectWrapper;
import com.tikal.jenkins.plugins.multijob.MultiJobProject;
import com.tikal.jenkins.plugins.multijob.PhaseJobsConfig;

/**
* @author Bartholdi Dominik (imod)
*/
public class ConditionalPhaseTest {
@Rule
public JenkinsRule j = new JenkinsRule();

@Test
public void testConditionalPhase() throws Exception {
j.jenkins.getInjector().injectMembers(this);

// MultiTop
// |_ FirstPhase
// |_ free
// |_ [?] SecondPhase
// |_ free2

final FreeStyleProject free = j.jenkins.createProject(FreeStyleProject.class, "Free");
free.getBuildersList().add(new Shell("echo hello"));
final FreeStyleProject free2 = j.jenkins.createProject(FreeStyleProject.class, "Free2");
free2.getBuildersList().add(new Shell("echo hello2"));

final MultiJobProject multi = j.jenkins.createProject(MultiJobProject.class, "MultiTop");

// create 'FirstPhase' containing job 'free'
PhaseJobsConfig firstPhase = new PhaseJobsConfig("free", null, true, null);
List<PhaseJobsConfig> configTopList = new ArrayList<PhaseJobsConfig>();
configTopList.add(firstPhase);
MultiJobBuilder firstPhaseBuilder = new MultiJobBuilder("FirstPhase", configTopList, ContinuationCondition.SUCCESSFUL);


// create 'SecondPhase' containing job 'free2'
PhaseJobsConfig secondPhase = new PhaseJobsConfig("free2", null, true, null);
List<PhaseJobsConfig> configTopList2 = new ArrayList<PhaseJobsConfig>();
configTopList.add(secondPhase);
MultiJobBuilder secondPhaseBuilder = new MultiJobBuilder("SecondPhase", configTopList2, ContinuationCondition.SUCCESSFUL);

multi.getBuildersList().add(new Shell("echo dude"));
multi.getBuildersList().add(firstPhaseBuilder);

// wrap second phase in condition
List<BuildStep> blist = new ArrayList<BuildStep>();
blist.add(secondPhaseBuilder);
multi.getBuildersList().add(new ConditionalBuilder(new AlwaysRun(), new BuildStepRunner.Run(), blist));

j.assertBuildStatus(Result.SUCCESS, multi.scheduleBuild2(0, new UserCause()).get());
Assert.assertTrue("shell task writes 'hello' to log", free.getLastBuild().getLog(10).contains("hello"));
Assert.assertTrue("shell task writes 'dude' to log", multi.getLastBuild().getLog(10).contains("dude"));

// check for correct number of items to be displayed
int numberOfPhases = 0;
int numberOfConditionalPhases = 0;
int numberOfProjects = 0;
for (TopLevelItem item : multi.getView().getRootItem(multi)) {
if(item instanceof ProjectWrapper) {
++numberOfProjects;
}else if (item instanceof PhaseWrapper) {
++numberOfPhases;
if(((PhaseWrapper)item).isConditional()) {
++numberOfConditionalPhases;
}
}
}
Assert.assertEquals("there should be two phases and three projects", 5, multi.getView().getRootItem(multi).size());
Assert.assertEquals("there should be two phases", 2, numberOfPhases);
Assert.assertEquals("there should be three projects", 3, numberOfProjects);
Assert.assertEquals("there should be 1 conditional phase", 1, numberOfConditionalPhases);

}

}

0 comments on commit 11b6d2e

Please sign in to comment.