Skip to content

Commit

Permalink
Improved app deployment tools.
Browse files Browse the repository at this point in the history
  • Loading branch information
nmihajlovski committed Jan 29, 2017
1 parent 7c238ac commit 0b303fa
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 27 deletions.
59 changes: 39 additions & 20 deletions rapidoid-commons/src/main/java/org/rapidoid/deploy/AppDeployer.java
Expand Up @@ -41,46 +41,59 @@
@Since("5.3.0")
public class AppDeployer extends RapidoidThing {

private static final Processes DEPLOYED_PROCESSES = new Processes("deployed");
private static final Processes DEPLOYED = new Processes("deployed");

private static void runIfExists(String appJar) {
public static String defaultApp() {
return ClasspathUtil.appJar();
}

private static void runIfExists(String appId, String appJar) {
if (new File(appJar).exists()) {
Log.info("Deploying pre-existing application JAR", "filename", appJar);
Log.info("Deploying pre-existing application JAR", "id", appId, "filename", appJar);

runJar(appJar);
runJar(appId, appJar);
}
}

private static void runJar(String appJar) {
Proc.group(DEPLOYED_PROCESSES)
private static void runJar(String appId, String appJar) {
Proc.group(DEPLOYED)
.id(appId)
.printingOutput(true)
.linePrefix("[APP] ")
.run("java", "-jar", appJar);
}

public static void deploy(String appJar) {
Log.info("Deploying JAR...", "filename", appJar);
U.must(U.notEmpty(appJar), "Empty application jar name was provided!");
public static void deploy(String stagedAppJar, String appJar) {
U.must(U.notEmpty(stagedAppJar), "Empty application jar name was provided!");

String stagedAppJar = appJar + ".staged";
U.must(new File(stagedAppJar).exists(), "Cannot deploy, the application needs to be staged first!");
Log.info("Deploying staged JAR...", "filename", stagedAppJar);

U.must(new File(stagedAppJar).exists(), "Cannot deploy, the application needs to be staged first, cannot find: %s", stagedAppJar);

try {
Files.move(Paths.get(stagedAppJar), Paths.get(appJar), StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
throw U.rte("Deployment error!", e);
}

for (ProcessHandle handle : DEPLOYED_PROCESSES.items()) {
Log.info("Terminating the previously deployed application", "process", handle.params().command());
handle.destroy();
}

runJar(appJar);
startOrRestartApp("app", appJar);

Log.info("Deployed JAR", "filename", appJar);
}

public static void startOrRestartApp(String appId, String appJar) {
ProcessHandle proc = DEPLOYED.find(appId);

if (proc != null) {
Log.info("Restarting the previously deployed application", "id", proc.id(), "process", proc.params().command());
proc.restart();

} else {
Log.info("Starting the deployed application", "id", proc.id(), "process", proc.params().command());
runJar(appId, appJar);
}
}

public static void stageJar(String appJar, byte[] content) {
String stagedAppJar = appJar + ".staged";

Expand All @@ -92,14 +105,20 @@ public static void stageJar(String appJar, byte[] content) {
}

public static Processes processes() {
return DEPLOYED_PROCESSES;
return DEPLOYED;
}

public static void bootstrap() {
String appJar = ClasspathUtil.appJar();
String appJar = defaultApp();
if (U.notEmpty(appJar)) {
runIfExists(appJar);
runIfExists("app", appJar);
}
}

public static void stopApp(String appId) {
ProcessHandle proc = DEPLOYED.get(appId);

Log.info("Stopping application", "id", proc.id(), "process", proc.params().command());
proc.destroy();
}
}
Expand Up @@ -2,6 +2,7 @@

import org.rapidoid.annotation.Authors;
import org.rapidoid.annotation.Since;
import org.rapidoid.commons.Str;
import org.rapidoid.deploy.AppDeployer;
import org.rapidoid.gui.Btn;
import org.rapidoid.gui.GUI;
Expand Down Expand Up @@ -110,27 +111,30 @@ public Object execute(Req req) throws Exception {
.onSuccess(new Runnable() {
@Override
public void run() {
AppDeployer.deploy(filename);
AppDeployer.deploy(filename, Str.trimr(filename, ".staged"));
}
}) : null;

String cmd = staged ? "staged" : "deployed";
Btn delete = exists
? btn("Delete").command("delete_" + cmd)
.class_("btn btn-danger btn-xs")
.confirm("Do you want do delete the file '" + filename + "'?")
.confirm("Do you want to delete the file '" + filename + "'?")
: null;

if (delete != null) {
delete.onSuccess(new Runnable() {
@Override
public void run() {
AppDeployer.stopApp("app");
IO.delete(filename);
}
});
}

Btn details = null;
Btn restart = null;

if (!staged && exists) {

List<ProcessHandle> processes = AppDeployer.processes().items();
Expand All @@ -142,6 +146,15 @@ public void run() {
details = btn("Details")
.class_("btn btn-default btn-xs")
.go(processUrl);

restart = btn("Restart")
.class_("btn btn-warning btn-xs")
.onSuccess(new Runnable() {
@Override
public void run() {
AppDeployer.startOrRestartApp("app", AppDeployer.defaultApp());
}
});
}
}

Expand All @@ -151,7 +164,7 @@ public void run() {
"exists", exists,
"size", size,
"since", since,
"actions", multi(deploy, details, delete)
"actions", multi(deploy, details, restart, delete)
);
}

Expand Down
Expand Up @@ -7,7 +7,6 @@
import org.rapidoid.http.NiceResponse;
import org.rapidoid.http.Req;
import org.rapidoid.http.ReqHandler;
import org.rapidoid.scan.ClasspathUtil;

/*
* #%L
Expand Down Expand Up @@ -37,7 +36,7 @@ public class JarDeploymentHandler extends RapidoidThing implements ReqHandler {
public Object execute(Req req) {

try {
AppDeployer.deploy(ClasspathUtil.appJar());
AppDeployer.deploy(AppDeployer.defaultApp() + ".staged", AppDeployer.defaultApp());
} catch (Exception e) {
return NiceResponse.err(req, e);
}
Expand Down
Expand Up @@ -8,7 +8,6 @@
import org.rapidoid.http.Req;
import org.rapidoid.http.ReqHandler;
import org.rapidoid.io.Upload;
import org.rapidoid.scan.ClasspathUtil;

/*
* #%L
Expand Down Expand Up @@ -40,7 +39,7 @@ public Object execute(Req req) throws Exception {
Upload jar = req.file("file");

try {
AppDeployer.stageJar(ClasspathUtil.appJar(), jar.content());
AppDeployer.stageJar(AppDeployer.defaultApp(), jar.content());
} catch (Exception e) {
return NiceResponse.err(req, e);
}
Expand Down

0 comments on commit 0b303fa

Please sign in to comment.