Skip to content

Commit

Permalink
JENKINS-37104# Matrix project handling (#412)
Browse files Browse the repository at this point in the history
* JENKINS-37104# Matrix project handling

- Bare minimum support for Matrix project. Ensures it doesn't break.
- For matrix project, self href points to classic URL path ("/job/:name")
- Adds hudson.matrix.MatrixProject capability
- UI to check hudson.matrix.MatrixProject capability and if present create a link using returned self href,
  so that when user clicks on it, he gets redirected to classic Matrix job page.

* Reverting removal of matrix project test dependency, favorite tests fail as Favorite plugin idepends on matrix project plugin and has reference to MatrixConfiguration.
  • Loading branch information
vivek authored Aug 18, 2016
1 parent 40c56c0 commit 05537ff
Show file tree
Hide file tree
Showing 5 changed files with 130 additions and 4 deletions.
6 changes: 3 additions & 3 deletions blueocean-dashboard/src/main/js/redux/actions.js
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ export const actions = {
return (dispatch) => {
const baseUrl = config.getAppURLBase();
// TODO: update this code to call /search with organizationName once JENKINS-36273 is ready
const url = `${baseUrl}/rest/search/?q=type:pipeline;excludedFromFlattening:jenkins.branch.MultiBranchProject`;
const url = `${baseUrl}/rest/search/?q=type:pipeline;excludedFromFlattening:jenkins.branch.MultiBranchProject,hudson.matrix.MatrixProject`;

return dispatch(actions.generateData(
url,
Expand All @@ -281,7 +281,7 @@ export const actions = {
const pipelines = getState().adminStore.pipelines;
const baseUrl = config.getAppURLBase();
// TODO: update this code to call /search with organizationName once JENKINS-36273 is ready
const url = `${baseUrl}/rest/search/?q=type:pipeline;excludedFromFlattening:jenkins.branch.MultiBranchProject`;
const url = `${baseUrl}/rest/search/?q=type:pipeline;excludedFromFlattening:jenkins.branch.MultiBranchProject,hudson.matrix.MatrixProject`;

if (!pipelines) {
return dispatch(actions.generateData(
Expand Down Expand Up @@ -848,7 +848,7 @@ export const actions = {
));
};
},

resetTestDetails() {
return (dispatch) =>
dispatch({
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package io.jenkins.blueocean.rest.impl.pipeline;

/**
* @author Vivek Pandey
*/

import hudson.Extension;
import hudson.matrix.MatrixProject;
import hudson.model.Item;
import io.jenkins.blueocean.rest.Reachable;
import io.jenkins.blueocean.rest.annotation.Capability;
import io.jenkins.blueocean.rest.hal.Link;
import io.jenkins.blueocean.rest.model.BluePipeline;
import io.jenkins.blueocean.rest.model.BluePipelineContainer;
import io.jenkins.blueocean.rest.model.BlueRun;
import io.jenkins.blueocean.rest.model.BlueRunContainer;
import io.jenkins.blueocean.rest.model.Resource;
import io.jenkins.blueocean.service.embedded.rest.AbstractRunImpl;
import io.jenkins.blueocean.service.embedded.rest.BluePipelineFactory;
import io.jenkins.blueocean.service.embedded.rest.PipelineFolderImpl;

/**
* @author Vivek Pandey
*/
@Capability("hudson.matrix.MatrixProject")
public class MatrixProjectImpl extends PipelineFolderImpl {

private final MatrixProject matrixProject;

public MatrixProjectImpl(MatrixProject folder, Link parent) {
super(folder, parent);
this.matrixProject = folder;
}

@Extension(ordinal = 1)
public static class PipelineFactoryImpl extends BluePipelineFactory{

@Override
public MatrixProjectImpl getPipeline(Item item, Reachable parent) {
if (item instanceof MatrixProject) {
return new MatrixProjectImpl((MatrixProject) item, parent.getLink());
}
return null;
}

@Override
public Resource resolve(Item context, Reachable parent, Item target) {
MatrixProjectImpl project = getPipeline(context, parent);
if (project!=null) {
if(context == target){
return project;
}
Item nextChild = findNextStep(project.matrixProject,target);
for (BluePipelineFactory f : all()) {
Resource answer = f.resolve(nextChild, project, target);
if (answer!=null)
return answer;
}
}
return null;
}
}

@Override
public BluePipeline getDynamic(String name) {
return null;
}

@Override
public BluePipelineContainer getPipelines() {
return null;
}

@Override
public Integer getNumberOfFolders() {
return 0;
}

@Override
public Integer getNumberOfPipelines() {
return 0;
}

@Override
public Link getLink() {
return new Link("/"+ matrixProject.getUrl());
}

@Override
public BlueRunContainer getRuns() {
return null; //TODO: matrix build have run but we are not returning any for now. to be fixed when full matrix build support is defined.
}

@Override
public BlueRun getLatestRun() {
if(matrixProject.getLastBuild() == null){
return null;
}
return AbstractRunImpl.getBlueRun(matrixProject.getLastBuild(), this);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public Resource resolve(Item context, Reachable parent, Item target) {
if(context == target && target instanceof WorkflowJob) {
return getPipeline(target,parent);
}

return null;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package io.jenkins.blueocean.rest.impl.pipeline;

import com.mashape.unirest.http.HttpResponse;
import hudson.matrix.Axis;
import hudson.matrix.MatrixBuild;
import hudson.matrix.MatrixProject;
import hudson.model.FreeStyleBuild;
import hudson.model.FreeStyleProject;
import hudson.model.Result;
Expand Down Expand Up @@ -258,5 +261,26 @@ public void pipelineJobCapabilityTest() throws Exception {
);
}

@Test
public void matrixProjectTest() throws Exception{
MatrixProject mp = j.jenkins.createProject(MatrixProject.class, "mp1");
mp.getAxes().add(new Axis("os", "linux", "windows"));
mp.getAxes().add(new Axis("jdk", "1.7", "1.8"));

MatrixBuild matrixBuild = mp.scheduleBuild2(0).get();
j.assertBuildStatusSuccess(matrixBuild);

List<Map> pipelines = get("/search/?q=type:pipeline;excludedFromFlattening:jenkins.branch.MultiBranchProject,hudson.matrix.MatrixProject", List.class);
Assert.assertEquals(1, pipelines.size());

Map p = pipelines.get(0);

Assert.assertEquals("mp1", p.get("name"));

String href = getHrefFromLinks(p, "self");

Assert.assertEquals("/job/mp1/", href);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ public Collection<BlueActionProxy> getActions() {
return AbstractPipelineImpl.getActionProxies(run.getAllActions(), this);
}

protected static BlueRun getBlueRun(Run r, Reachable parent){
public static BlueRun getBlueRun(Run r, Reachable parent){
for(BlueRunFactory runFactory:BlueRunFactory.all()){
BlueRun blueRun = runFactory.getRun(r,parent);
if(blueRun != null){
Expand Down

0 comments on commit 05537ff

Please sign in to comment.