feat(admin): moved server build/update to full app
All checks were successful
Build and Push LST Docker Image / docker (push) Successful in 2m27s
All checks were successful
Build and Push LST Docker Image / docker (push) Successful in 2m27s
This commit is contained in:
123
backend/utils/deployApp.ts
Normal file
123
backend/utils/deployApp.ts
Normal file
@@ -0,0 +1,123 @@
|
||||
import { spawn } from "node:child_process";
|
||||
import { eq, sql } from "drizzle-orm";
|
||||
import { db } from "../db/db.controller.js";
|
||||
import { serverData } from "../db/schema/serverData.schema.js";
|
||||
import { appStats } from "../db/schema/stats.schema.js";
|
||||
//import { createLogger } from "../logger/logger.controller.js";
|
||||
import { emitBuildLog } from "./build.utils.js";
|
||||
import { returnFunc } from "./returnHelper.utils.js";
|
||||
|
||||
// const log = createLogger({ module: "utils", subModule: "deploy" });
|
||||
export let updating = false;
|
||||
|
||||
const updateServerBuildNumber = async (token: string) => {
|
||||
// get the current build
|
||||
const buildNum = await db.select().from(appStats);
|
||||
|
||||
// update the build now
|
||||
|
||||
await db
|
||||
.update(serverData)
|
||||
.set({ buildNumber: buildNum[0]?.currentBuild, lastUpdated: sql`NOW()` })
|
||||
.where(eq(serverData.plantToken, token));
|
||||
};
|
||||
export const runUpdate = ({
|
||||
server,
|
||||
destination,
|
||||
token,
|
||||
}: {
|
||||
server: string;
|
||||
destination: string;
|
||||
token: string;
|
||||
}) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
updating = true;
|
||||
const scriptPath = process.env.UPDATE_SCRIPT_PATH;
|
||||
if (!scriptPath) {
|
||||
return returnFunc({
|
||||
success: true,
|
||||
level: "error",
|
||||
module: "utils",
|
||||
subModule: "deploy",
|
||||
message: "UPDATE_SCRIPT_PATH please make sure you have this set.",
|
||||
data: [],
|
||||
notify: true,
|
||||
room: "admin",
|
||||
});
|
||||
}
|
||||
|
||||
const args = [
|
||||
"-ExecutionPolicy",
|
||||
"Bypass",
|
||||
"-File",
|
||||
scriptPath,
|
||||
"-Server",
|
||||
server,
|
||||
"-Destination",
|
||||
destination,
|
||||
"-Token",
|
||||
token,
|
||||
"-ADM_USER",
|
||||
process.env.DEV_USER ?? "",
|
||||
"-ADM_PASSWORD",
|
||||
process.env.DEV_PASSWORD ?? "",
|
||||
"-AppDir",
|
||||
process.env.DEV_DIR ?? "",
|
||||
];
|
||||
|
||||
emitBuildLog(`Starting update for ${server}`);
|
||||
|
||||
const child = spawn("powershell.exe", args, {
|
||||
shell: false,
|
||||
});
|
||||
|
||||
child.stdout.on("data", (data) => {
|
||||
const lines = data.toString().split(/\r?\n/);
|
||||
for (const line of lines) {
|
||||
if (line.trim()) {
|
||||
emitBuildLog(line);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
child.stderr.on("data", (data) => {
|
||||
const lines = data.toString().split(/\r?\n/);
|
||||
for (const line of lines) {
|
||||
if (line.trim()) {
|
||||
emitBuildLog(line, "error");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
child.on("close", (code) => {
|
||||
if (code === 0) {
|
||||
emitBuildLog(`Update completed for ${server}`);
|
||||
updating = false;
|
||||
updateServerBuildNumber(token);
|
||||
resolve({
|
||||
success: true,
|
||||
message: `Update completed for ${server}`,
|
||||
data: [],
|
||||
});
|
||||
} else {
|
||||
emitBuildLog(`Update failed for ${server} (code ${code})`, "error");
|
||||
updating = false;
|
||||
reject({
|
||||
success: false,
|
||||
message: `Update failed for ${server} (code ${code})`,
|
||||
data: [],
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
child.on("error", (err) => {
|
||||
emitBuildLog(`Process error: ${err.message}`, "error");
|
||||
updating = false;
|
||||
reject({
|
||||
success: false,
|
||||
message: `${server}: Encountered an error while processing: ${err.message} `,
|
||||
data: err,
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
Reference in New Issue
Block a user