
hudson.plugins.im.bot.BuildCommand Maven / Gradle / Ivy
The newest version!
/*
* Created on Apr 22, 2007
*/
package hudson.plugins.im.bot;
import hudson.Extension;
import hudson.model.AbstractProject;
import hudson.model.BooleanParameterValue;
import hudson.model.Cause;
import hudson.model.Item;
import hudson.model.ParameterValue;
import hudson.model.ParametersAction;
import hudson.model.Queue;
import hudson.model.StringParameterValue;
import hudson.plugins.im.IMCause;
import hudson.plugins.im.Sender;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Build command for the instant messaging bot.
*
* @author Pascal Bleser
* @author kutzi
*/
@Extension
public class BuildCommand extends AbstractTextSendingCommand {
private static final Pattern NUMERIC_EXTRACTION_REGEX = Pattern.compile("^(\\d+)");
private static final String SYNTAX = " [now|[s|m|h]] [=]*";
private static final String HELP = SYNTAX + " - schedule a job build, with standard, custom or no quiet period";
@Override
public Collection getCommandNames() {
return Arrays.asList("build","schedule");
}
/**
* @return whether the build was actually scheduled
*/
private boolean scheduleBuild(Bot bot, AbstractProject, ?> project, int delaySeconds, Sender sender, List parameters) {
String senderId = sender.getId();
if (senderId == null) {
senderId = sender.getNickname();
}
Cause cause = new IMCause("Started by " + bot.getImId() + " on request of '" + senderId + "'");
if (parameters.isEmpty()) {
return project.scheduleBuild(delaySeconds, cause);
} else {
return project.scheduleBuild(delaySeconds, cause, new ParametersAction(parameters));
}
}
@Override
public String getReply(Bot bot, Sender sender, String args[]) {
if (args.length >= 2) {
String jobName = args[1];
jobName = jobName.replaceAll("\"", "");
AbstractProject, ?> project = getJobProvider().getJobByName(jobName);
if (project != null) {
String checkPermission = checkPermission(sender, project);
if (checkPermission != null) {
return checkPermission;
}
String msg = "";
if (!project.isBuildable()) {
return sender.getNickname() + ": job " + jobName + " is disabled";
} else {
int delay = project.getQuietPeriod();
List parameters = new ArrayList();
if (args.length >= 3) {
int parametersStartIndex = 2;
if (!args[2].contains("=")) { // otherwise looks like a parameter
parametersStartIndex = 3;
String delayStr = args[2].trim();
if ("now".equalsIgnoreCase(delayStr)) {
delay = 0;
} else {
int multiplicator = 1;
if (delayStr.endsWith("m") || delayStr.endsWith("min")) {
multiplicator = 60;
} else if (delayStr.endsWith("h")) {
multiplicator = 3600;
} else {
char c = delayStr.charAt(delayStr.length() - 1);
if (! (c == 's' || Character.isDigit(c))) {
return giveSyntax(sender.getNickname(), args[0]);
}
}
Matcher matcher = NUMERIC_EXTRACTION_REGEX.matcher(delayStr);
if (matcher.find()) {
int value = Integer.parseInt(matcher.group(1));
delay = multiplicator * value;
} else {
return giveSyntax(sender.getNickname(), args[0]);
}
}
}
// parse possible parameters:
for (int i=parametersStartIndex; i < args.length; i++) {
String[] split = args[i].split("=");
// TODO: guess ParameterValue type from ParametersDefintion of job?
if (split.length == 2) {
String value = split[1];
if ("true".equals(value) || "false".equals(value)) {
parameters.add(new BooleanParameterValue(split[0], Boolean.parseBoolean(split[1])));
} else {
parameters.add(new StringParameterValue(split[0], split[1]));
}
} else {
msg += "Unparseable parameter: " + args[i];
}
}
}
if (!parameters.isEmpty() && !project.isParameterized()) {
msg += "Ignoring parameters as project is not parametrized!\n";
}
if (scheduleBuild(bot, project, delay, sender, parameters)) {
if (delay == 0) {
return msg + sender.getNickname() + ": job " + jobName + " build scheduled now";
} else {
return msg + sender.getNickname() + ": job " + jobName + " build scheduled with a quiet period of " +
delay + " seconds";
}
} else {
// probably already queued
Queue.Item queueItem = project.getQueueItem();
if (queueItem != null) {
return sender.getNickname() + ": job " + jobName + " is already in the build queue (" + queueItem.getWhy() + ")";
} else {
// could be race condition (build left build-queue while we were checking) or other reason
return sender.getNickname() + ": job " + jobName + " scheduling failed or already in build queue";
}
}
}
} else {
return giveSyntax(sender.getNickname(), args[0]);
}
} else {
return sender.getNickname() + ": Error, syntax is: '" + args[0] + SYNTAX + "'";
}
}
private String checkPermission(Sender sender, AbstractProject, ?> project) {
if (!project.hasPermission(Item.BUILD)) {
return sender.getNickname() + ": you're not allowed to build job " + project.getDisplayName() + "!";
}
return null;
}
private String giveSyntax(String sender, String cmd) {
return sender + ": syntax is: '" + cmd + SYNTAX + "'";
}
public String getHelp() {
return HELP;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy