JENKINS-37104# Matrix project handling (#412)

* 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.
This commit is contained in:
vivek 2016-08-17 19:31:17 -07:00 committed by GitHub
parent 40c56c0801
commit 05537ffadc
5 changed files with 130 additions and 4 deletions

View File

@ -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,
@ -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(
@ -848,7 +848,7 @@ export const actions = {
));
};
},
resetTestDetails() {
return (dispatch) =>
dispatch({

View File

@ -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);
}
}

View File

@ -36,6 +36,7 @@ public class PipelineImpl extends AbstractPipelineImpl {
if(context == target && target instanceof WorkflowJob) {
return getPipeline(target,parent);
}
return null;
}
}

View File

@ -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;
@ -258,5 +261,26 @@ public class PipelineApiTest extends PipelineBaseTest {
);
}
@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);
}
}

View File

@ -184,7 +184,7 @@ public class AbstractRunImpl<T extends Run> extends BlueRun {
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){