/*******************************************************************************
*
* Copyright (c) 2010, InfraDNA, Inc.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*
*
*
*
*******************************************************************************/
package hudson.cli;
import hudson.model.Hudson;
import hudson.model.Job;
import hudson.model.Run;
import hudson.remoting.Callable;
import org.kohsuke.args4j.CmdLineException;
import java.io.IOException;
/**
* Base class for those commands that are valid only during a build.
*
* @author Kohsuke Kawaguchi
*/
public abstract class CommandDuringBuild extends CLICommand {
/**
* This method makes sense only when called from within the build kicked by
* Hudson. We use the environment variables that Hudson sets to determine
* the build that is being run.
*/
protected Run getCurrentlyBuilding() throws CmdLineException {
try {
CLICommand c = CLICommand.getCurrent();
if (c == null) {
throw new IllegalStateException("Not executing a CLI command");
}
String[] envs = c.channel.call(new GetCharacteristicEnvironmentVariables());
if (envs[0] == null || envs[1] == null) {
throw new CmdLineException("This CLI command works only when invoked from inside a build");
}
Job j = Hudson.getInstance().getItemByFullName(envs[0], Job.class);
if (j == null) {
throw new CmdLineException("No such job: " + envs[0]);
}
try {
Run r = j.getBuildByNumber(Integer.parseInt(envs[1]));
if (r == null) {
throw new CmdLineException("No such build #" + envs[1] + " in " + envs[0]);
}
return r;
} catch (NumberFormatException e) {
throw new CmdLineException("Invalid build number: " + envs[1]);
}
} catch (IOException e) {
throw new CmdLineException("Failed to identify the build being executed", e);
} catch (InterruptedException e) {
throw new CmdLineException("Failed to identify the build being executed", e);
}
}
/**
* Gets the environment variables that points to the build being executed.
*/
private static final class GetCharacteristicEnvironmentVariables implements Callable<String[], IOException> {
public String[] call() throws IOException {
return new String[]{
System.getenv("JOB_NAME"),
System.getenv("BUILD_NUMBER")
};
}
}
}