Skip to content

Commit

Permalink
Merge from master
Browse files Browse the repository at this point in the history
  • Loading branch information
patbos committed Nov 27, 2013
1 parent 35f2217 commit 2dbd3e1
Show file tree
Hide file tree
Showing 22 changed files with 232 additions and 144 deletions.
9 changes: 2 additions & 7 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -137,11 +137,6 @@
</build>

<dependencies>
<!-- dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.1</version>
</dependency -->

<!-- Test Dependencies -->
<dependency>
Expand Down Expand Up @@ -179,7 +174,7 @@
<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>token-macro</artifactId>
<version>1.8.1</version>
<version>1.9</version>
</dependency>
<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
Expand All @@ -189,7 +184,7 @@
<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>parameterized-trigger</artifactId>
<version>2.17</version>
<version>2.21</version>
</dependency>

</dependencies>
Expand Down
16 changes: 10 additions & 6 deletions src/main/java/se/diabol/jenkins/pipeline/DeliveryPipelineView.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,14 @@ public class DeliveryPipelineView extends View {

public static final int DEFAULT_INTERVAL = 2;

public static final int DEFAULT_NO_OF_PIPELINES = 3;
private static final int MAX_NO_OF_PIPELINES = 10;

private static final String OLD_NONE_SORTER = "se.diabol.jenkins.pipeline.sort.NoOpComparator";
public static final String NONE_SORTER = "none";

private List<ComponentSpec> componentSpecs;
private int noOfPipelines = 3;
private int noOfPipelines = DEFAULT_NO_OF_PIPELINES;
private boolean showAggregatedPipeline = false;
private int noOfColumns = 1;
private String sorting = NONE_SORTER;
Expand Down Expand Up @@ -205,7 +208,7 @@ public List<Component> getPipelines() {
List<Component> components = new ArrayList<Component>();
if (componentSpecs != null) {
for (ComponentSpec componentSpec : componentSpecs) {
AbstractProject firstJob = ProjectUtil.getProject(componentSpec.getFirstJob());
AbstractProject firstJob = ProjectUtil.getProject(componentSpec.getFirstJob(), getOwnerItemGroup());
components.add(getComponent(componentSpec.getName(), firstJob, showAggregatedPipeline));
}
}
Expand All @@ -228,9 +231,10 @@ public List<Component> getPipelines() {
private Component getComponent(String name, AbstractProject firstJob, boolean showAggregatedPipeline) {
Pipeline prototype = PipelineFactory.extractPipeline(name, firstJob);
List<Pipeline> pipelines = new ArrayList<Pipeline>();
if (showAggregatedPipeline)
pipelines.add(PipelineFactory.createPipelineAggregated(prototype));
pipelines.addAll(PipelineFactory.createPipelineLatest(prototype, noOfPipelines));
if (showAggregatedPipeline) {
pipelines.add(PipelineFactory.createPipelineAggregated(prototype, getOwnerItemGroup()));
}
pipelines.addAll(PipelineFactory.createPipelineLatest(prototype, noOfPipelines, getOwnerItemGroup()));
return new Component(name, pipelines);
}

Expand All @@ -240,7 +244,7 @@ public Collection<TopLevelItem> getItems() {
Set<AbstractProject> projects = new HashSet<AbstractProject>();
if (componentSpecs != null) {
for (ComponentSpec componentSpec : componentSpecs) {
projects.add(ProjectUtil.getProject(componentSpec.getFirstJob()));
projects.add(ProjectUtil.getProject(componentSpec.getFirstJob(), getOwnerItemGroup()));
}
}
if (regexpFirstJob != null && !regexpFirstJob.trim().equals("")) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public void onStarted(Run run, TaskListener listener) {
List<ParametersAction> parameters = upstreamBuild.getActions(ParametersAction.class);
for (ParametersAction parameter : parameters) {
ParameterValue value = parameter.getParameter(PipelineVersionContributor.VERSION_PARAMETER);
if (value != null && value instanceof StringParameterValue) {
if (value instanceof StringParameterValue) {
String version = ((StringParameterValue) value).value;
ParametersAction action = new ParametersAction(
new StringParameterValue(PipelineVersionContributor.VERSION_PARAMETER, version));
Expand Down
65 changes: 36 additions & 29 deletions src/main/java/se/diabol/jenkins/pipeline/PipelineFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@

public abstract class PipelineFactory {

private static final int AVATAR_SIZE = 16;

/**
* Created a pipeline prototype for the supplied first project
*/
Expand All @@ -59,8 +61,9 @@ public static Pipeline extractPipeline(String name, AbstractProject<?, ?> firstP
String stageName = property != null && !isNullOrEmpty(property.getStageName())
? property.getStageName() : project.getDisplayName();
Stage stage = stages.get(stageName);
if (stage == null)
if (stage == null) {
stage = new Stage(stageName, Collections.<Task>emptyList());
}
stages.put(stageName,
new Stage(stage.getName(), newArrayList(concat(stage.getTasks(), singleton(task)))));
}
Expand All @@ -73,37 +76,37 @@ private static Task getPrototypeTask(AbstractProject project) {
String taskName = property != null && !isNullOrEmpty(property.getTaskName())
? property.getTaskName() : project.getDisplayName();
Status status = project.isDisabled() ? disabled() : idle();
return new Task(project.getName(), taskName, null, status, project.getUrl(), false, null);
return new Task(project.getRelativeNameFrom(Jenkins.getInstance()), taskName, null, status, project.getUrl(), false, null);
}

/**
* Helper method
*
* @see PipelineFactory#createPipelineLatest(se.diabol.jenkins.pipeline.model.Pipeline, int)
* @see PipelineFactory#createPipelineLatest(se.diabol.jenkins.pipeline.model.Pipeline, int, ItemGroup)
*/

public static Pipeline createPipelineLatest(Pipeline pipeline) {
List<Pipeline> pipelines = createPipelineLatest(pipeline, 1);
public static Pipeline createPipelineLatest(Pipeline pipeline, ItemGroup context) {
List<Pipeline> pipelines = createPipelineLatest(pipeline, 1, context);
return pipelines.size() > 0 ? pipelines.get(0) : null;
}

public static Pipeline createPipelineAggregated(Pipeline pipeline) {
public static Pipeline createPipelineAggregated(Pipeline pipeline, ItemGroup context) {

AbstractProject firstProject = getProject(pipeline.getStages().get(0).getTasks().get(0));
AbstractProject firstProject = getProject(pipeline.getStages().get(0).getTasks().get(0), context);
List<Stage> stages = new ArrayList<Stage>();
for (Stage stage : pipeline.getStages()) {

List<Task> tasks = new ArrayList<Task>();

//The version build for this stage is the highest first task build
AbstractBuild versionBuild = getHighestBuild(stage.getTasks(), firstProject);
AbstractBuild versionBuild = getHighestBuild(stage.getTasks(), firstProject, context);

String version = null;
if (versionBuild != null) {
version = versionBuild.getDisplayName();
}
for (Task task : stage.getTasks()) {
AbstractProject<?, ?> taskProject = getProject(task);
AbstractProject<?, ?> taskProject = getProject(task, context);
AbstractBuild currentBuild = match(taskProject.getBuilds(), versionBuild);

if (currentBuild != null) {
Expand All @@ -116,14 +119,13 @@ public static Pipeline createPipelineAggregated(Pipeline pipeline) {
}
stages.add(new Stage(stage.getName(), tasks, version));
}
//TODO add triggeredBy
return new Pipeline(pipeline.getName(), null, null, null, null, stages, true);
}

private static AbstractBuild getHighestBuild(List<Task> tasks, AbstractProject firstProject) {
private static AbstractBuild getHighestBuild(List<Task> tasks, AbstractProject firstProject, ItemGroup context) {
int highest = -1;
for (Task task : tasks) {
AbstractProject project = getProject(task);
AbstractProject project = getProject(task, context);
AbstractBuild firstBuild = getFirstUpstreamBuild(project, firstProject);
if (firstBuild != null && firstBuild.getNumber() > highest) {
highest = firstBuild.getNumber();
Expand All @@ -144,9 +146,9 @@ private static AbstractBuild getHighestBuild(List<Task> tasks, AbstractProject f
* @param pipeline the pipeline prototype
* @param noOfPipelines number of pipeline instances
*/
public static List<Pipeline> createPipelineLatest(Pipeline pipeline, int noOfPipelines) {
public static List<Pipeline> createPipelineLatest(Pipeline pipeline, int noOfPipelines, ItemGroup context) {
Task firstTask = pipeline.getStages().get(0).getTasks().get(0);
AbstractProject firstProject = getProject(firstTask);
AbstractProject firstProject = getProject(firstTask, context);

List<Pipeline> result = new ArrayList<Pipeline>();

Expand All @@ -159,9 +161,9 @@ public static List<Pipeline> createPipelineLatest(Pipeline pipeline, int noOfPip
for (Stage stage : pipeline.getStages()) {
List<Task> tasks = new ArrayList<Task>();
for (Task task : stage.getTasks()) {
AbstractProject<?, ?> taskProject = getProject(task);
AbstractProject<?, ?> taskProject = getProject(task, context);
AbstractBuild currentBuild = match(taskProject.getBuilds(), firstBuild);
tasks.add(getTask(task, currentBuild));
tasks.add(getTask(task, currentBuild, context));
}
stages.add(new Stage(stage.getName(), tasks));
}
Expand Down Expand Up @@ -194,8 +196,8 @@ protected static List<Change> getChanges(AbstractBuild<?, ?> build) {
}


private static Task getTask(Task task, AbstractBuild build) {
AbstractProject project = getProject(task);
private static Task getTask(Task task, AbstractBuild build, ItemGroup context) {
AbstractProject project = getProject(task, context);
Status status = resolveStatus(project, build);
String link = build == null || status.isIdle() || status.isQueued() ? task.getLink() : build.getUrl();
String buildId = build == null || status.isIdle() || status.isQueued() ? null : String.valueOf(build.getNumber());
Expand Down Expand Up @@ -236,7 +238,7 @@ private static UserInfo getUser(User user) {
private static String getAvatarUrl(User user) {
ExtensionList<UserAvatarResolver> resolvers = UserAvatarResolver.all();
for (UserAvatarResolver resolver : resolvers) {
String avatarUrl = resolver.findAvatarFor(user, 16, 16);
String avatarUrl = resolver.findAvatarFor(user, AVATAR_SIZE, AVATAR_SIZE);
if (avatarUrl != null) {
return avatarUrl;
}
Expand All @@ -259,18 +261,19 @@ private static AbstractBuild match(RunList<? extends AbstractBuild> runList, Abs
return null;
}

private static AbstractProject getProject(Task task) {
return Jenkins.getInstance().getItem(task.getId(), Jenkins.getInstance().getItemGroup(), AbstractProject.class);
private static AbstractProject getProject(Task task, ItemGroup context) {
return ProjectUtil.getProject(task.getId(), context);
}

protected static Status resolveStatus(AbstractProject project, AbstractBuild build) {
if (build == null) {
if (project.isInQueue())
if (project.isInQueue()) {
return StatusFactory.queued(project.getQueueItem().getInQueueSince());
else if (project.isDisabled())
} else if (project.isDisabled()) {
return StatusFactory.disabled();
else
} else {
return StatusFactory.idle();
}
}

if (build.isBuilding()) {
Expand All @@ -279,16 +282,20 @@ else if (project.isDisabled())
}

Result result = build.getResult();
if (ABORTED.equals(result))
if (ABORTED.equals(result)) {
return StatusFactory.cancelled(build.getTimeInMillis(), build.getDuration());
else if (SUCCESS.equals(result))
}
if (SUCCESS.equals(result)) {
return StatusFactory.success(build.getTimeInMillis(), build.getDuration());
else if (FAILURE.equals(result))
}
if (FAILURE.equals(result)) {
return StatusFactory.failed(build.getTimeInMillis(), build.getDuration());
else if (UNSTABLE.equals(result))
}
if (UNSTABLE.equals(result)) {
return StatusFactory.unstable(build.getTimeInMillis(), build.getDuration());
else
} else {
throw new IllegalStateException("Result " + result + " not recognized.");
}
}

/**
Expand Down
35 changes: 24 additions & 11 deletions src/main/java/se/diabol/jenkins/pipeline/PipelineProperty.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,14 @@
import hudson.Extension;
import hudson.model.*;
import hudson.util.FormValidation;
import jenkins.model.Jenkins;
import net.sf.json.JSONObject;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.export.Exported;
import se.diabol.jenkins.pipeline.util.ProjectUtil;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class PipelineProperty extends JobProperty<AbstractProject<?, ?>> {
Expand All @@ -51,16 +53,28 @@ public String getStageName() {
return stageName;
}

@SuppressWarnings("unused")
public void setTaskName(String taskName) {
public final void setTaskName(String taskName) {
this.taskName = taskName;
}

@SuppressWarnings("unused")
public void setStageName(String stageName) {
public final void setStageName(String stageName) {
this.stageName = stageName;
}

public static Set<String> getStageNames() {
List<AbstractProject> projects = Jenkins.getInstance().getAllItems(AbstractProject.class);
Set<String> result = new HashSet<String>();
for (AbstractProject project : projects) {
PipelineProperty property = (PipelineProperty) project.getProperty(PipelineProperty.class);
if (property != null && property.getStageName() != null) {
result.add(property.getStageName());
}

}
return result;
}


@Extension
public static final class DescriptorImpl extends JobPropertyDescriptor {
public String getDisplayName() {
Expand All @@ -72,27 +86,26 @@ public boolean isApplicable(Class<? extends Job> jobType) {
return true;
}

@SuppressWarnings("unused")
public AutoCompletionCandidates doAutoCompleteStageName(@QueryParameter String value) {
if (value != null) {
AutoCompletionCandidates c = new AutoCompletionCandidates();
Set<String> stages = ProjectUtil.getStageNames();
Set<String> stages = getStageNames();

for (String stage : stages)
if (stage.toLowerCase().startsWith(value.toLowerCase()))
for (String stage : stages) {
if (stage.toLowerCase().startsWith(value.toLowerCase())) {
c.add(stage);
}
}
return c;
} else {
return new AutoCompletionCandidates();
}
}

@SuppressWarnings("unused")
public FormValidation doCheckStageName(@QueryParameter String value) {
return checkValue(value);
}

@SuppressWarnings("unused")
public FormValidation doCheckTaskName(@QueryParameter String value) {
return checkValue(value);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,12 @@
/**
* This is the common abstraction for all the entities that makes a pipeline.
*/
@ExportedBean(defaultVisibility = 100)
@ExportedBean(defaultVisibility = AbstractItem.VISIBILITY)
public abstract class AbstractItem {
private final String name;

public static final int VISIBILITY = 100;

protected AbstractItem(String name) {
this.name = name;
}
Expand All @@ -50,10 +52,10 @@ public int hashCode() {

@Override
public boolean equals(Object o) {
return this == o || o instanceof AbstractItem && equals((AbstractItem) o);
return this == o || o instanceof AbstractItem && equalsSelf((AbstractItem) o);
}

private boolean equals(AbstractItem o) {
private boolean equalsSelf(AbstractItem o) {
return name.equals(o.name);
}
}
2 changes: 1 addition & 1 deletion src/main/java/se/diabol/jenkins/pipeline/model/Change.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;

@ExportedBean(defaultVisibility = 100)
@ExportedBean(defaultVisibility = AbstractItem.VISIBILITY)
public class Change {
private UserInfo author;
private String message;
Expand Down
Loading

0 comments on commit 2dbd3e1

Please sign in to comment.