Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master' into JENKINS-38670
Browse files Browse the repository at this point in the history
Conflicts:
	src/main/java/au/com/centrumsystems/hudson/plugin/buildpipeline/extension/PipelineHeaderExtension.java
	src/test/java/au/com/centrumsystems/hudson/plugin/buildpipeline/BuildPipelineViewTest.java
  • Loading branch information
Dan Alvizu committed Dec 8, 2016
2 parents d0d2352 + c08cb85 commit c12811d
Show file tree
Hide file tree
Showing 18 changed files with 462 additions and 130 deletions.
13 changes: 12 additions & 1 deletion pom.xml
Expand Up @@ -6,7 +6,7 @@
<version>1.619</version>
</parent>
<artifactId>build-pipeline-plugin</artifactId>
<version>1.5.5-SNAPSHOT</version>
<version>1.5.7-SNAPSHOT</version>
<packaging>hpi</packaging>
<name>Build Pipeline Plugin</name>
<description>This plugin provides build pipeline functionality to Hudson and Jenkins. This allows a chain of jobs to be visualised in a new view. Manual jobs in the pipeline can be triggered by a user with the appropriate permissions manually confirming.</description>
Expand Down Expand Up @@ -398,4 +398,15 @@
</pluginRepository>
</pluginRepositories>

<distributionManagement>
<repository>
<id>repo.jenkins-ci.org</id>
<url>https://repo.jenkins-ci.org/releases</url>
</repository>
<snapshotRepository>
<id>maven.jenkins-ci.org</id>
<url>https://repo.jenkins-ci.org/snapshots</url>
</snapshotRepository>
</distributionManagement>

</project>
Expand Up @@ -28,6 +28,7 @@
import au.com.centrumsystems.hudson.plugin.buildpipeline.extension.NullColumnHeader;
import au.com.centrumsystems.hudson.plugin.buildpipeline.extension.PipelineHeaderExtension;
import au.com.centrumsystems.hudson.plugin.buildpipeline.extension.BuildVariablesHeader;
import au.com.centrumsystems.hudson.plugin.buildpipeline.extension.PipelineHeaderExtensionDescriptor;
import au.com.centrumsystems.hudson.plugin.buildpipeline.extension.SimpleColumnHeader;
import au.com.centrumsystems.hudson.plugin.buildpipeline.extension.SimpleRowHeader;
import au.com.centrumsystems.hudson.plugin.buildpipeline.extension.StandardBuildCard;
Expand Down Expand Up @@ -187,6 +188,8 @@ public BuildPipelineView(final String name, final String buildViewTitle,
this.noOfDisplayedBuilds = noOfDisplayedBuilds;
this.triggerOnlyLatestJob = triggerOnlyLatestJob;
this.cssUrl = cssUrl;
this.rowHeaders = new NullColumnHeader();
this.columnHeaders = new SimpleRowHeader();
}

/**
Expand Down Expand Up @@ -529,28 +532,25 @@ public ListBoxModel doFillNoOfDisplayedBuildsItems() {
* @return
* a filtered and ordered list of descriptors matching the condition
*/
public List<Descriptor<PipelineHeaderExtension>> filter(Function<PipelineHeaderExtension, Boolean> condition) {
final List<Descriptor<PipelineHeaderExtension>> result = new ArrayList<Descriptor<PipelineHeaderExtension>>();
public List<PipelineHeaderExtensionDescriptor> filter(Function<PipelineHeaderExtensionDescriptor, Boolean> condition) {
final List<PipelineHeaderExtensionDescriptor> result = new ArrayList<PipelineHeaderExtensionDescriptor>();
final List<PipelineHeaderExtension> applicableExtensions = new ArrayList<PipelineHeaderExtension>();
for (PipelineHeaderExtension extension : PipelineHeaderExtension.all()) {
if (condition.apply(extension)) {
applicableExtensions.add(extension);
for (PipelineHeaderExtensionDescriptor descriptor : PipelineHeaderExtensionDescriptor.all()) {
if (condition.apply(descriptor)) {
result.add(descriptor);
}
}
Collections.sort(applicableExtensions);
for (PipelineHeaderExtension extension : applicableExtensions) {
result.add(extension.getDescriptor());
}
Collections.sort(result);
return result;
}

/**
* @return a list of PipelineHeaderExtension descriptors which can be used as a row header
*/
public List<Descriptor<PipelineHeaderExtension>> getRowHeaderDescriptors() {
return filter(new Function<PipelineHeaderExtension, Boolean>() {
public List<PipelineHeaderExtensionDescriptor> getRowHeaderDescriptors() {
return filter(new Function<PipelineHeaderExtensionDescriptor, Boolean>() {
@Override
public Boolean apply(PipelineHeaderExtension extension) {
public Boolean apply(PipelineHeaderExtensionDescriptor extension) {
return extension.appliesToRows();
}
});
Expand All @@ -559,11 +559,11 @@ public Boolean apply(PipelineHeaderExtension extension) {
/**
* @return a list of PipelineHeaderExtension descriptors which can be used as column headers
*/
public List<Descriptor<PipelineHeaderExtension>> getColumnHeaderDescriptors() {
return filter(new Function<PipelineHeaderExtension, Boolean>() {
public List<PipelineHeaderExtensionDescriptor> getColumnHeaderDescriptors() {
return filter(new Function<PipelineHeaderExtensionDescriptor, Boolean>() {

@Override
public Boolean apply(PipelineHeaderExtension extension) {
public Boolean apply(PipelineHeaderExtensionDescriptor extension) {
return extension.appliesToColumns();
}
});
Expand Down Expand Up @@ -773,8 +773,7 @@ public boolean hasPermission(final Permission p) {
boolean display = true;
//tester la liste vide seulement en lecture
if (READ.name.equals(p.name)) {
final Collection<TopLevelItem> items = this.getItems();
if (items == null || items.isEmpty()) {
if (isEmpty()) {
display = false;
}
} else {
Expand All @@ -783,5 +782,16 @@ public boolean hasPermission(final Permission p) {
}

return display;
}
}

/**
* determine if this view is empty
* @return true if this view contains zero items
*/
private boolean isEmpty() {
if (noOfDisplayedBuilds == null || gridBuilder == null) {
return true;
}
return gridBuilder.build(this).isEmpty();
}
}
@@ -1,5 +1,6 @@
package au.com.centrumsystems.hudson.plugin.buildpipeline;

import au.com.centrumsystems.hudson.plugin.buildpipeline.extension.PipelineHeaderExtension;
import hudson.Extension;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
Expand Down Expand Up @@ -67,14 +68,16 @@ private static final class GridImpl extends DefaultProjectGridImpl {
private final ItemGroup context;

/**
* @param columnHeaders
* column headers to get build parameters from
* @param context
* item group pipeline view belongs to, used to compute relative item names
* @param start The first project to lead the pipeline.
*/
private GridImpl(ItemGroup context, AbstractProject<?, ?> start) {
private GridImpl(PipelineHeaderExtension columnHeaders, ItemGroup context, AbstractProject<?, ?> start) {
this.context = context;
this.start = start;
placeProjectInGrid(0, 0, ProjectForm.as(start));
placeProjectInGrid(0, 0, ProjectForm.as(start, columnHeaders));
}

/**
Expand Down Expand Up @@ -224,7 +227,7 @@ public ProjectGrid build(BuildPipelineView owner) {
} else {
this.firstJobLink = "";
}
return new GridImpl(owner.getOwnerItemGroup(), getFirstJob(owner));
return new GridImpl(owner.getColumnHeaders(), owner.getOwnerItemGroup(), getFirstJob(owner));
}

@Override
Expand Down
@@ -1,6 +1,6 @@
package au.com.centrumsystems.hudson.plugin.buildpipeline;

import au.com.centrumsystems.hudson.plugin.util.BuildUtil;
import au.com.centrumsystems.hudson.plugin.buildpipeline.extension.PipelineHeaderExtension;
import hudson.Util;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
Expand Down Expand Up @@ -82,19 +82,24 @@ public ProjectForm(final String name) {

/**
* @param project
* project
* project\
* @param columnHeaders
* the column headers describing how to get build parameters
*/
public ProjectForm(final AbstractProject<?, ?> project) {
this(project, new LinkedHashSet<AbstractProject<?, ?>>(Arrays.asList(project)));
public ProjectForm(final AbstractProject<?, ?> project, final PipelineHeaderExtension columnHeaders) {
this(project, columnHeaders, new LinkedHashSet<AbstractProject<?, ?>>(Arrays.asList(project)));
}

/**
* @param project
* project
* @param columnHeaders
* column headers to get build parameters from
* @param parentPath
* already traversed projects
*/
private ProjectForm(final AbstractProject<?, ?> project, final Collection<AbstractProject<?, ?>> parentPath) {
private ProjectForm(final AbstractProject<?, ?> project, final PipelineHeaderExtension columnHeaders,
final Collection<AbstractProject<?, ?>> parentPath) {
final PipelineBuild pipelineBuild = new PipelineBuild(project.getLastBuild(), project, null);

name = pipelineBuild.getProject().getFullName();
Expand All @@ -105,7 +110,7 @@ private ProjectForm(final AbstractProject<?, ?> project, final Collection<Abstra
for (final AbstractProject<?, ?> dependency : project.getDownstreamProjects()) {
final Collection<AbstractProject<?, ?>> forkedPath = new LinkedHashSet<AbstractProject<?, ?>>(parentPath);
if (forkedPath.add(dependency)) {
dependencies.add(new ProjectForm(dependency, forkedPath));
dependencies.add(new ProjectForm(dependency, columnHeaders, forkedPath));
}
}
if (Hudson.getInstance().getPlugin("parameterized-trigger") != null) {
Expand All @@ -114,7 +119,7 @@ private ProjectForm(final AbstractProject<?, ?> project, final Collection<Abstra
for (final AbstractProject<?, ?> dependency : config.getProjectList(project.getParent(), null)) {
final Collection<AbstractProject<?, ?>> forkedPath = new LinkedHashSet<AbstractProject<?, ?>>(parentPath);
if (forkedPath.add(dependency)) {
final ProjectForm candidate = new ProjectForm(dependency, forkedPath);
final ProjectForm candidate = new ProjectForm(dependency, columnHeaders, forkedPath);
// if subprojects come back as downstreams someday, no duplicates wanted
if (!dependencies.contains(candidate)) {
dependencies.add(candidate);
Expand All @@ -128,7 +133,7 @@ private ProjectForm(final AbstractProject<?, ?> project, final Collection<Abstra

final AbstractBuild<?, ?> lastSuccessfulBuild = pipelineBuild.getProject().getLastSuccessfulBuild();
lastSuccessfulBuildNumber = (null == lastSuccessfulBuild) ? "" : "" + lastSuccessfulBuild.getNumber();
lastSuccessfulBuildParams = BuildUtil.getUnsensitiveParameters(lastSuccessfulBuild);
lastSuccessfulBuildParams = columnHeaders.getParameters(lastSuccessfulBuild);

this.project = project;
}
Expand All @@ -138,11 +143,13 @@ private ProjectForm(final AbstractProject<?, ?> project, final Collection<Abstra
*
* @param p
* project to be wrapped.
* @param columnHeaders
* column headers to grab build parameters from
* @return
* possibly null.
*/
public static ProjectForm as(AbstractProject<?, ?> p) {
return p != null ? new ProjectForm(p) : null;
public static ProjectForm as(AbstractProject<?, ?> p, PipelineHeaderExtension columnHeaders) {
return p != null ? new ProjectForm(p, columnHeaders) : null;
}

public String getName() {
Expand Down Expand Up @@ -243,7 +250,7 @@ public int getId() {
*/
@JavaScriptMethod
public String asJSON() {
return ProjectJSONBuilder.asJSON(new ProjectForm(project));
return ProjectJSONBuilder.asJSON(this);
}

}
Expand Up @@ -26,7 +26,6 @@

import hudson.Extension;
import hudson.model.AbstractBuild;
import hudson.model.Descriptor;
import org.kohsuke.stapler.DataBoundConstructor;

import java.util.HashMap;
Expand All @@ -38,7 +37,6 @@
*
* @author dalvizu
*/
@Extension
public class BuildVariablesHeader extends AbstractNameValueHeader {

/**
Expand All @@ -59,25 +57,25 @@ public Map<String, String> getParameters(AbstractBuild<?, ?> build) {
if (retval.containsKey(paramName)) {
// We have the choice to hide the parameter or to replace it with special characters
retval.put(paramName, "********");
//retval.remove(paramName);
}
}
}

return retval;
}

@Override
public long getIndex() {
return 2000;
}

/**
* Descriptor, since we're in the UI
*/
@Extension
public static class DescriptorImpl
extends Descriptor<PipelineHeaderExtension> {
extends PipelineHeaderExtensionDescriptor {

@Override
public long getIndex() {
return 2000;
}

@Override
public String getDisplayName() {
Expand Down

0 comments on commit c12811d

Please sign in to comment.