diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index cc4dbadce9c2973115149b25c37e80c97a68ae85..8c294c6da1b9c6cb6c9ac32071bcec2f8022426c 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -21,6 +21,9 @@ jobs: node-version: [18, 20] python-version: ["3.11"] os: [macos-latest, windows-latest] + defaults: + run: + shell: bash runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 diff --git a/packages/create-llama/e2e/basic.spec.ts b/packages/create-llama/e2e/basic.spec.ts index ee4ba33b64b0006828477a0b5c65edf30a486971..70ec0b0736853b31b7d2d85156b9fb4e4b445ade 100644 --- a/packages/create-llama/e2e/basic.spec.ts +++ b/packages/create-llama/e2e/basic.spec.ts @@ -124,7 +124,7 @@ for (const templateType of templateTypes) { // clean processes test.afterAll(async () => { - appProcess.kill(); + appProcess?.kill(); }); }); } diff --git a/packages/create-llama/e2e/utils.ts b/packages/create-llama/e2e/utils.ts index 9e2c8ddee97f20d0bd3f0720f1e79e7690867c52..e03ec73c7434d56f0d000e9cc54797fe53c20f90 100644 --- a/packages/create-llama/e2e/utils.ts +++ b/packages/create-llama/e2e/utils.ts @@ -110,15 +110,18 @@ export async function runCreateLlama( console.log(`running command '${command}' in ${cwd}`); let appProcess = exec(command, { cwd, + env: { + ...process.env, + }, }); - appProcess.on("error", (err) => { - console.error(err); - appProcess.kill(); - }); - // Show log from cp - appProcess.stdout?.on("data", (data) => { + appProcess.stderr?.on("data", (data) => { console.log(data.toString()); }); + appProcess.on("exit", (code) => { + if (code !== 0 && code !== null) { + throw new Error(`create-llama command was failed!`); + } + }); // Wait for app to start if (postInstallAction === "runApp") { diff --git a/packages/create-llama/helpers/run-app.ts b/packages/create-llama/helpers/run-app.ts index b77da58bfab133431c6004e9435d551731a4ab76..dbadda0badb6102b9a0d9efe076b2f720f23f5be 100644 --- a/packages/create-llama/helpers/run-app.ts +++ b/packages/create-llama/helpers/run-app.ts @@ -1,8 +1,28 @@ -import { ChildProcess, spawn } from "child_process"; -import { log } from "console"; +import { ChildProcess, SpawnOptions, spawn } from "child_process"; import path from "path"; import { TemplateFramework } from "./types"; +const createProcess = ( + command: string, + args: string[], + options: SpawnOptions, +) => { + return spawn(command, args, { + ...options, + shell: true, + }) + .on("exit", function (code) { + if (code !== 0) { + console.log(`Child process exited with code=${code}`); + process.exit(1); + } + }) + .on("error", function (err) { + console.log("Error when running chill process: ", err); + process.exit(1); + }); +}; + // eslint-disable-next-line max-params export async function runApp( appPath: string, @@ -17,13 +37,10 @@ export async function runApp( let backendPort = externalPort || 8000; // Callback to kill app processes - const killAppProcesses = () => { - log("Killing app processes..."); + process.on("exit", () => { + console.log("Killing app processes..."); backendAppProcess.kill(); frontendAppProcess?.kill(); - }; - process.on("exit", () => { - killAppProcesses(); }); let backendCommand = ""; @@ -35,7 +52,7 @@ export async function runApp( "uvicorn", "main:app", "--host=0.0.0.0", - "--port=" + (externalPort || backendPort), + "--port=" + backendPort, ]; } else if (framework === "nextjs") { backendCommand = "npm"; @@ -48,30 +65,24 @@ export async function runApp( if (frontend) { return new Promise((resolve, reject) => { - backendAppProcess = spawn(backendCommand, backendArgs, { + backendAppProcess = createProcess(backendCommand, backendArgs, { stdio: "inherit", cwd: path.join(appPath, "backend"), env: { ...process.env, PORT: `${backendPort}` }, }); - frontendAppProcess = spawn("npm", ["run", "dev"], { + frontendAppProcess = createProcess("npm", ["run", "dev"], { stdio: "inherit", cwd: path.join(appPath, "frontend"), env: { ...process.env, PORT: `${frontendPort}` }, }); - }).catch((err) => { - console.error(err); - killAppProcesses(); }); } else { return new Promise((resolve, reject) => { - backendAppProcess = spawn(backendCommand, backendArgs, { + backendAppProcess = createProcess(backendCommand, backendArgs, { stdio: "inherit", - cwd: appPath, + cwd: path.join(appPath), env: { ...process.env, PORT: `${backendPort}` }, }); - }).catch((err) => { - console.log(err); - killAppProcesses(); }); } }