package org.jenkinsci.plugins.dockerbuildstep.cmd;
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.exception.DockerException;
import com.github.dockerjava.api.model.Frame;
import com.github.dockerjava.core.command.ExecStartResultCallback;
import hudson.Extension;
import hudson.model.AbstractBuild;
import org.jenkinsci.plugins.dockerbuildstep.log.ConsoleLogger;
import org.jenkinsci.plugins.dockerbuildstep.util.Resolver;
import org.kohsuke.stapler.DataBoundConstructor;
import java.util.Arrays;
import java.util.List;
public class ExecStartCommand extends DockerCommand {
private final String commandIds;
@DataBoundConstructor
public ExecStartCommand(String commandIds) {
this.commandIds = commandIds;
}
public String getCommandIds() {
return commandIds;
}
@Override
public void execute(@SuppressWarnings("rawtypes") AbstractBuild build, final ConsoleLogger console)
throws DockerException {
if (commandIds == null || commandIds.isEmpty()) {
console.logError("Command ID cannot be empty");
throw new IllegalArgumentException("Command ID cannot be empty");
}
String commandIdsRes = Resolver.buildVar(build, commandIds);
List<String> cmdIds = Arrays.asList(commandIdsRes.split(","));
DockerClient client = getClient(build, null);
// TODO execute async on containers
for (String cmdId : cmdIds) {
console.logInfo(String.format("Executing command with ID '%s'", cmdId));
ExecStartResultCallback callback = new ExecStartResultCallback() {
@Override
public void onNext(Frame item) {
console.logInfo(item.toString());
super.onNext(item);
}
@Override
public void onError(Throwable throwable) {
console.logError("Failed to exec start:" + throwable.getMessage());
super.onError(throwable);
}
};
try {
client.execStartCmd(cmdId).exec(callback).awaitCompletion();
} catch (InterruptedException e) {
console.logError("Failed to exec start:" + e.getMessage());
}
}
}
@Extension
public static class ExecStartCommandDescriptor extends DockerCommandDescriptor {
@Override
public String getDisplayName() {
return "Start exec instance in container(s)";
}
}
}