Shell(SH) νμΌμ μ€ννμ¬ μ»¨ν μΈ λ₯Ό μλμΌλ‘ λ°°ν¬νλ κΈ°λ₯μ κ°λ°νλ€.
SH νμΌμ λμ μΌλ‘ μ½κ³ μ€ννμ¬ μλ²μ 컨ν μΈ λ₯Ό λ°°ν¬νλ λ°©μμ΄λ©°, μ΄λ₯Ό ν΅ν΄ λ°°ν¬ νλ‘μΈμ€λ₯Ό κ°μνν μ μλ€.
λ°°ν¬ μμ²μ΄ λ€μ΄μ€λ©΄ SH νμΌμ μ€ννλ APIλ₯Ό μμ±νλ€.
server_host, server_port λ±μ κ°μ λμ μΌλ‘ μ€μ @PostMapping("content/deploy")
public ResponseEntity<GResponse> deployContent(HttpServletResponse response, @RequestBody DeployParam param) {
response.setHeader("Job-Log", "컨ν
μΈ λ°°ν¬ μ€ν");
String basePath = System.getProperty("user.dir") + "/deploy_scripts/";
String shFileName = "deploy_" + param.getName() + "_" + param.getProductName() + ".sh";
File shFile = new File(basePath, shFileName);
if (!shFile.exists()) {
log.error("SH νμΌμ΄ μ‘΄μ¬νμ§ μμ΅λλ€: {}", shFile.getAbsolutePath());
return ResponseEntity.ok(new GResponse("404", "λ°°ν¬μ νμν SH νμΌμ΄ μμ΅λλ€."));
}
try {
ProcessBuilder processBuilder = new ProcessBuilder("/bin/bash", "-c",
"server_host=\\"" + param.getServerHost().replaceFirst("https?://", "") + "\\" " +
"server_port=\\"" + param.getServerPort() + "\\" " +
"bash " + shFile.getAbsolutePath()
);
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder output = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
output.append(line).append("\\n");
}
int exitCode = process.waitFor();
if (exitCode == 0) {
log.info("SH νμΌ μ€ν μ±κ³΅: {}", shFileName);
return ResponseEntity.ok(new GResponse("0000", "λ°°ν¬ μ±κ³΅:\\n" + output));
} else {
log.error("SH νμΌ μ€ν μ€ν¨ (exitCode: {}): {}", exitCode, shFileName);
return ResponseEntity.ok(new GResponse("500", "λ°°ν¬ μ€ν¨:\\n" + output));
}
} catch (IOException | InterruptedException e) {
log.error("SH νμΌ μ€ν μ€ μ€λ₯ λ°μ: {}", shFileName, e);
return ResponseEntity.ok(new GResponse("500", "SH νμΌ μ€ν μ€ μ€λ₯ λ°μ."));
}
}
λ°°ν¬ μμ²μ λ³΄λΌ μ μλλ‘ JavaScriptλ‘ ν΄λΌμ΄μΈνΈ μμ²μ μ²λ¦¬νλ€.
$("#deploy_content").click(function () {
let selectedRow = $table.bootstrapTable('getSelections');
if (selectedRow.length === 0) {
return alert('λ°°ν¬ν νλͺ©μ μ ννμΈμ.');
}
let params = {
name: selectedRow[0].name,
product_name: selectedRow[0].product_name,
server_host: selectedRow[0].server_host,
server_port: selectedRow[0].server_port.startsWith(":") ? selectedRow[0].server_port : ":" + selectedRow[0].server_port
};
if (confirm("λ°°ν¬νμκ² μ΅λκΉ?")) {
$.post("/api/content/deploy", params, function (response) {
alert(response.code === '0000' ? "λ°°ν¬ μ±κ³΅" : "λ°°ν¬ μ€ν¨: " + response.message);
});
}
});