Skip to content
This repository was archived by the owner on Feb 13, 2020. It is now read-only.

Commit

Permalink
Enable to build with parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
ikikko committed Jan 2, 2015
1 parent c0befd8 commit 8e459d3
Show file tree
Hide file tree
Showing 8 changed files with 287 additions and 46 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ work/
.settings/
classes/
src/test/resources/config.properties
target
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ public class TypetalkWebhookAction implements RootAction {
// FIXME check authentication

// TODO handle response back ( if Typetalk supports it )
// TODO add list executor ( with regexp filter )
// TODO add help executor

// TODO enable alias job name

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
package org.jenkinsci.plugins.typetalk.webhookaction;

import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public abstract class WebhookExecutor {
protected HttpServletRequest req;
protected HttpServletResponse rsp;
protected StaplerRequest req;
protected StaplerResponse rsp;
protected String command;
protected PrintWriter writer;

protected WebhookExecutor(HttpServletRequest req, HttpServletResponse rsp, String command) {
protected WebhookExecutor(StaplerRequest req, StaplerResponse rsp, String command) {
this.req = req;
this.rsp = rsp;
this.command = command;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,24 @@

import org.jenkinsci.plugins.typetalk.webhookaction.executorimpl.BuildExecutor;
import org.jenkinsci.plugins.typetalk.webhookaction.executorimpl.UndefinedExecutor;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class WebhookExecutorFactory {
public static WebhookExecutor create(HttpServletRequest req, HttpServletResponse rsp, String message) {
String[] splitMessage = message.split("\\s");
String command = splitMessage[1];
public static WebhookExecutor create(StaplerRequest req, StaplerResponse rsp, String message) {
LinkedList<String> messageList = new LinkedList<>(Arrays.asList(message.split("\\s")));
String botUser = messageList.poll(); // not used
String command = messageList.poll();

switch (command) {
case "build":
String job = splitMessage[2];
return new BuildExecutor(req, rsp, job);
String job = messageList.poll();
return new BuildExecutor(req, rsp, job, messageList);
default:
return new UndefinedExecutor(req, rsp, command);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package org.jenkinsci.plugins.typetalk.webhookaction.executorimpl;

import hudson.model.AbstractProject;
import hudson.model.Cause;
import hudson.model.TopLevelItem;
import hudson.model.*;
import jenkins.model.Jenkins;
import org.jenkinsci.plugins.typetalk.webhookaction.WebhookExecutor;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

public class BuildExecutor extends WebhookExecutor {
Expand All @@ -16,11 +19,32 @@ public class BuildExecutor extends WebhookExecutor {

private String job;

public BuildExecutor(HttpServletRequest req, HttpServletResponse rsp, String job) {
private List<String> parameters;

private Map<String, String> parameterMap = new HashMap<>();

public BuildExecutor(StaplerRequest req, StaplerResponse rsp, String job, List<String> parameters) {
super(req, rsp, "build");
this.job = job;
this.parameters = parameters;

parseParameters();
}

private void parseParameters() {
for (String parameter : parameters) {
String[] splitParameter = parameter.split("=");

if (splitParameter.length == 2) {
parameterMap.put(splitParameter[0], splitParameter[1]);
}
}
}

/**
* @see hudson.model.AbstractProject#doBuild
* @see hudson.model.AbstractProject#doBuildWithParameters
*/
@Override
public void execute() {
TopLevelItem item = Jenkins.getInstance().getItemMap().get(job);
Expand All @@ -34,13 +58,65 @@ public void execute() {
return;
}

Cause.RemoteCause cause = new Cause.RemoteCause(req.getRemoteAddr(), "by Typetalk Webhook");
((AbstractProject) item).scheduleBuild(cause);
AbstractProject project = ((AbstractProject) item);
Jenkins.getInstance().getQueue().schedule(project, project.getQuietPeriod(), getParametersAction(project), getCauseAction());

String message = "'" + job + "' has been scheduled";
LOGGER.info(message);

rsp.setStatus(HttpServletResponse.SC_OK);
writer.println(message);
}

private Action getParametersAction(AbstractProject project) {
ParametersDefinitionProperty property = (ParametersDefinitionProperty) project.getProperty(ParametersDefinitionProperty.class);
if (property == null) {
return null;
}

List<ParameterValue> values = new ArrayList<>();
List<ParameterDefinition> pds = property.getParameterDefinitions();

if (isOnlySingleParameter(pds)) {

ParameterDefinition pd = pds.get(0);
if (!(pd instanceof SimpleParameterDefinition)) {
return null;
}
SimpleParameterDefinition spd = (SimpleParameterDefinition) pd;
values.add(spd.createValue(parameters.get(0)));

} else {

for (ParameterDefinition pd : pds) {
if (!(pd instanceof SimpleParameterDefinition)) {
continue;
}
SimpleParameterDefinition spd = (SimpleParameterDefinition) pd;

if (parameterMap.containsKey(spd.getName())) {
String parameterValue = parameterMap.get(spd.getName());
values.add(spd.createValue(parameterValue));
} else {
ParameterValue defaultValue = spd.getDefaultParameterValue();
if (defaultValue != null) {
values.add(defaultValue);
}
}
}

}

return new ParametersAction(values);
}

private boolean isOnlySingleParameter(List<ParameterDefinition> pds) {
return pds.size() == 1 && parameters.size() == 1 &&
!parameters.get(0).contains("="); // when parameter contains '=', parameter is handled at the other code
}

private Action getCauseAction() {
return new CauseAction(new Cause.RemoteCause(req.getRemoteAddr(), "by Typetalk Webhook"));
}

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package org.jenkinsci.plugins.typetalk.webhookaction.executorimpl;

import org.jenkinsci.plugins.typetalk.webhookaction.WebhookExecutor;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
Expand All @@ -10,7 +12,7 @@ public class UndefinedExecutor extends WebhookExecutor {

private static final Logger LOGGER = Logger.getLogger(UndefinedExecutor.class.getName());

public UndefinedExecutor(HttpServletRequest req, HttpServletResponse rsp, String command) {
public UndefinedExecutor(StaplerRequest req, StaplerResponse rsp, String command) {
super(req, rsp, command);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,40 @@ package org.jenkinsci.plugins.typetalk.webhookaction

import org.jenkinsci.plugins.typetalk.webhookaction.executorimpl.BuildExecutor
import org.jenkinsci.plugins.typetalk.webhookaction.executorimpl.UndefinedExecutor
import org.kohsuke.stapler.StaplerRequest
import org.kohsuke.stapler.StaplerResponse
import spock.lang.Specification
import spock.lang.Unroll

import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse

class WebhookExecutorFactorySpec extends Specification {

def req = Mock(StaplerRequest)
def res = Mock(StaplerResponse)

@Unroll
def "create with message : #message"() {
setup:
def req = Mock(HttpServletRequest)
def res = Mock(HttpServletResponse)
def "create UndefinedExecutor"() {
when:
def executor = WebhookExecutorFactory.create(req, res, "@jenkins+ dummy")

then:
executor.class == UndefinedExecutor
}

@Unroll
def "create BuildExecutor with : #message"() {
when:
def executor = WebhookExecutorFactory.create(req, res, message)

then:
executor.class == result
executor.class == BuildExecutor
executor.job == "typetalk-plugin"
executor.parameters == parameters

where:
message || result
"@jenkins+ dummy" || UndefinedExecutor
"@jenkins+ build typetalk-plugin" || BuildExecutor
message || parameters
"@jenkins+ build typetalk-plugin" || []
"@jenkins+ build typetalk-plugin 1.0.0" || ["1.0.0"]
"@jenkins+ build typetalk-plugin version=1.0.0" || ["version=1.0.0"]
"@jenkins+ build typetalk-plugin version=1.0.0 env=stage" || ["version=1.0.0", "env=stage"]
}
}
Loading

0 comments on commit 8e459d3

Please sign in to comment.