96 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
		
			Executable File
		
	
	
	
	
| // @ts-check
 | |
| 
 | |
| import http from "http";
 | |
| import path from "path";
 | |
| import childProcess, { ChildProcess } from "child_process";
 | |
| const { spawn, spawnSync, execSync } = childProcess;
 | |
| 
 | |
| require("dotenv").config({
 | |
|     path: path.resolve(__dirname, "../.env"),
 | |
| });
 | |
| 
 | |
| const environment = process.env.NODE_ENVIRONMENT;
 | |
| 
 | |
| const workingDirectory = path.resolve(__dirname, "../");
 | |
| 
 | |
| // process.stdin.addListener("data", (message) => {
 | |
| //     console.log("MEssage received =>", message);
 | |
| // });
 | |
| 
 | |
| process.on("message", (message) => {
 | |
|     console.log("Message received =>", message);
 | |
|     if (message == "exit") {
 | |
|         process.exit();
 | |
|     }
 | |
| });
 | |
| 
 | |
| const args = environment?.match(/prod/i) ? ["start"] : ["run", "dev"];
 | |
| 
 | |
| let child: ChildProcess = spawn("bun", args, {
 | |
|     cwd: workingDirectory,
 | |
|     stdio: "inherit",
 | |
|     shell: environment?.match(/prod/i) ? undefined : "bash.exe",
 | |
| });
 | |
| 
 | |
| const PORT = process.env.DSQL_DEPLOY_SERVER_PORT || 1276;
 | |
| 
 | |
| // deepcode ignore NoRateLimitingForExpensiveWebOperation: <Web Server is only accessible locally>, deepcode ignore HttpToHttps: <Server is not exposed to the web>
 | |
| http.createServer((req, res) => {
 | |
|     if (req.url == "/" + process.env.DEPLOY_ROUTE) {
 | |
|         async function redeploy() {
 | |
|             /** @type {import("child_process").SpawnSyncOptionsWithBufferEncoding} */
 | |
|             const options: import("child_process").SpawnSyncOptionsWithBufferEncoding =
 | |
|                 {
 | |
|                     cwd: workingDirectory,
 | |
|                     stdio: "inherit",
 | |
|                 };
 | |
| 
 | |
|             if (process.platform?.match(/win/i)) {
 | |
|                 options.shell = "bash.exe";
 | |
|             }
 | |
| 
 | |
|             if (environment?.match(/prod/i)) {
 | |
|                 spawnSync("git", ["checkout", "."], options);
 | |
|                 spawnSync("git", ["pull"], options);
 | |
|                 spawnSync("bun", ["install"], options);
 | |
|                 spawnSync("bun", ["run", "build"], options);
 | |
| 
 | |
|                 try {
 | |
|                     child.kill();
 | |
|                     const existingProcessId = execSync(
 | |
|                         `lsof -i :2763 | grep LISTEN | awk '{print $2}'`
 | |
|                     );
 | |
|                     console.log(
 | |
|                         "Existing Process Id GREPED",
 | |
|                         existingProcessId.toString()
 | |
|                     );
 | |
|                     execSync(`kill ${existingProcessId.toString()}`);
 | |
|                     // spawnSync("kill", [existingProcessId.toString()], options);
 | |
|                     // spawnSync("kill", [`${child.pid}`], options);
 | |
|                 } catch (/** @type {any} */ error: any) {
 | |
|                     console.log("Error killing child process", error.message);
 | |
|                 }
 | |
| 
 | |
|                 child = spawn("bun", args, {
 | |
|                     cwd: workingDirectory,
 | |
|                     stdio: "inherit",
 | |
|                     shell: environment?.match(/prod/i) ? undefined : "bash.exe",
 | |
|                 });
 | |
|             } else {
 | |
|                 spawnSync("git", ["status"], options);
 | |
|                 spawnSync("bun", ["list", "next"], options);
 | |
| 
 | |
|                 console.log("Not in production, Continuing ...");
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         redeploy();
 | |
| 
 | |
|         res.statusCode = 200;
 | |
|         res.end("Deployed");
 | |
|     } else {
 | |
|         res.statusCode = 402;
 | |
|         res.end("Unauthorized");
 | |
|     }
 | |
| }).listen(PORT, () => console.log("Deployment Server Started on Port", PORT));
 | 
