From 161d094c8c95d645bb751c522428f1c6d549d958 Mon Sep 17 00:00:00 2001 From: Arseniy Klempner Date: Mon, 20 Oct 2025 10:38:13 -0700 Subject: [PATCH] chore: use package version in container name --- packages/run/docker-compose.yml | 6 +++--- packages/run/package.json | 4 ++-- packages/run/scripts/info.ts | 14 ++++++++++---- packages/run/scripts/logs.ts | 8 ++++++-- packages/run/scripts/start.ts | 7 +++++-- packages/run/scripts/stop.ts | 8 ++++++-- packages/run/scripts/test.ts | 14 ++++++++++---- packages/run/src/utils.ts | 11 +++++++++++ packages/run/tests/basic.spec.ts | 21 +++++++++++++++++---- packages/run/tests/browser.spec.ts | 14 ++++++++++---- 10 files changed, 80 insertions(+), 27 deletions(-) create mode 100644 packages/run/src/utils.ts diff --git a/packages/run/docker-compose.yml b/packages/run/docker-compose.yml index 9a753c15f2..4634db9627 100644 --- a/packages/run/docker-compose.yml +++ b/packages/run/docker-compose.yml @@ -37,7 +37,7 @@ services: nwaku-1: <<: *nwaku-base - container_name: waku-local-node-1 + container_name: ${COMPOSE_PROJECT_NAME:-waku-run-0-0-1}-node-1 networks: default: ipv4_address: 172.20.0.10 @@ -84,7 +84,7 @@ services: nwaku-2: <<: *nwaku-base - container_name: waku-local-node-2 + container_name: ${COMPOSE_PROJECT_NAME:-waku-run-0-0-1}-node-2 networks: default: ipv4_address: 172.20.0.11 @@ -136,7 +136,7 @@ volumes: networks: default: - name: waku-local-network + name: ${COMPOSE_PROJECT_NAME:-waku-run-0-0-1}-network ipam: config: - subnet: 172.20.0.0/16 diff --git a/packages/run/package.json b/packages/run/package.json index 8ce883e4fe..66d92a01c1 100644 --- a/packages/run/package.json +++ b/packages/run/package.json @@ -35,9 +35,9 @@ "build:web": "esbuild web/index.ts --bundle --format=esm --platform=browser --outdir=dist/web && cp web/index.html dist/web/index.html", "prepublishOnly": "npm run build", "start": "tsx scripts/start.ts", - "stop": "docker compose down", + "stop": "tsx scripts/stop.ts", "restart": "npm run stop && npm run start", - "logs": "docker compose logs -f", + "logs": "tsx scripts/logs.ts", "info": "tsx scripts/info.ts", "test": "if [ \"$CI\" = \"true\" ]; then echo 'Skipping tests in CI'; exit 0; fi && NODE_ENV=test node ./src/run-tests.js \"tests/basic.spec.ts\"", "test:browser": "if [ \"$CI\" = \"true\" ]; then echo 'Skipping browser tests in CI'; exit 0; fi && npm run build:web && npx playwright test --reporter=line", diff --git a/packages/run/scripts/info.ts b/packages/run/scripts/info.ts index 93c4367e53..8513c871cf 100755 --- a/packages/run/scripts/info.ts +++ b/packages/run/scripts/info.ts @@ -5,6 +5,7 @@ import { dirname, join } from "path"; import { fileURLToPath } from "url"; import { NODE1_PEER_ID, NODE2_PEER_ID } from "../src/constants.js"; +import { getProjectName } from "../src/utils.js"; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); @@ -33,10 +34,15 @@ const colors: Colors = { try { // Check if containers are running - const output: string = execSync("docker compose ps --quiet", { - cwd: packageRoot, - encoding: "utf-8" - }).trim(); + const projectName = getProjectName(packageRoot); + const output: string = execSync( + `docker compose --project-name ${projectName} ps --quiet`, + { + cwd: packageRoot, + encoding: "utf-8", + env: { ...process.env, COMPOSE_PROJECT_NAME: projectName } + } + ).trim(); if (!output) { process.stdout.write( diff --git a/packages/run/scripts/logs.ts b/packages/run/scripts/logs.ts index fbfac91570..5c6ea74c07 100644 --- a/packages/run/scripts/logs.ts +++ b/packages/run/scripts/logs.ts @@ -4,6 +4,8 @@ import { execSync } from "child_process"; import { dirname, join } from "path"; import { fileURLToPath } from "url"; +import { getProjectName } from "../src/utils.js"; + const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); // In development: scripts are in packages/run/scripts @@ -13,9 +15,11 @@ const packageRoot = __dirname.includes("dist") : join(__dirname, ".."); try { - execSync("docker compose logs -f", { + const projectName = getProjectName(packageRoot); + execSync(`docker compose --project-name ${projectName} logs -f`, { cwd: packageRoot, - stdio: "inherit" + stdio: "inherit", + env: { ...process.env, COMPOSE_PROJECT_NAME: projectName } }); } catch (error: unknown) { const err = error as { message?: string }; diff --git a/packages/run/scripts/start.ts b/packages/run/scripts/start.ts index ea21510fb6..13f5786b50 100755 --- a/packages/run/scripts/start.ts +++ b/packages/run/scripts/start.ts @@ -5,6 +5,7 @@ import { dirname, join } from "path"; import { fileURLToPath } from "url"; import { NODE1_PEER_ID, NODE2_PEER_ID } from "../src/constants.js"; +import { getProjectName } from "../src/utils.js"; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); @@ -100,10 +101,12 @@ try { checkAndPullImages(); // Start docker compose from package root - execSync("docker compose up -d", { + const projectName = getProjectName(packageRoot); + execSync(`docker compose --project-name ${projectName} up -d`, { cwd: packageRoot, stdio: ["ignore", "ignore", "pipe"], - encoding: "utf-8" + encoding: "utf-8", + env: { ...process.env, COMPOSE_PROJECT_NAME: projectName } }); // Wait for nodes to be ready diff --git a/packages/run/scripts/stop.ts b/packages/run/scripts/stop.ts index 750b7e5f09..f1b0800ee1 100644 --- a/packages/run/scripts/stop.ts +++ b/packages/run/scripts/stop.ts @@ -4,6 +4,8 @@ import { execSync } from "child_process"; import { dirname, join } from "path"; import { fileURLToPath } from "url"; +import { getProjectName } from "../src/utils.js"; + const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); // In development: scripts are in packages/run/scripts @@ -13,9 +15,11 @@ const packageRoot = __dirname.includes("dist") : join(__dirname, ".."); try { - execSync("docker compose down", { + const projectName = getProjectName(packageRoot); + execSync(`docker compose --project-name ${projectName} down`, { cwd: packageRoot, - stdio: "inherit" + stdio: "inherit", + env: { ...process.env, COMPOSE_PROJECT_NAME: projectName } }); } catch (error: unknown) { const err = error as { message?: string }; diff --git a/packages/run/scripts/test.ts b/packages/run/scripts/test.ts index c52ca2b9b3..c66102fbe3 100644 --- a/packages/run/scripts/test.ts +++ b/packages/run/scripts/test.ts @@ -7,6 +7,7 @@ import { fileURLToPath } from "url"; import { Protocols } from "@waku/sdk"; import { WakuTestClient } from "../src/test-client.js"; +import { getProjectName } from "../src/utils.js"; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); @@ -38,10 +39,15 @@ async function main(): Promise { try { // Check if containers are running - const output: string = execSync("docker compose ps --quiet", { - cwd: packageRoot, - encoding: "utf-8" - }).trim(); + const projectName = getProjectName(packageRoot); + const output: string = execSync( + `docker compose --project-name ${projectName} ps --quiet`, + { + cwd: packageRoot, + encoding: "utf-8", + env: { ...process.env, COMPOSE_PROJECT_NAME: projectName } + } + ).trim(); if (!output) { process.stderr.write( diff --git a/packages/run/src/utils.ts b/packages/run/src/utils.ts new file mode 100644 index 0000000000..560cf543fb --- /dev/null +++ b/packages/run/src/utils.ts @@ -0,0 +1,11 @@ +import { readFileSync } from "fs"; +import { join } from "path"; + +export function getProjectName(packageRoot: string): string { + const packageJsonPath = join(packageRoot, "package.json"); + const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8")); + // Docker Compose project names must consist only of lowercase alphanumeric characters, hyphens, and underscores + const name = packageJson.name.replace("@", "").replace("/", "-"); + const version = packageJson.version.replace(/\./g, "-"); + return `${name}-${version}`; +} diff --git a/packages/run/tests/basic.spec.ts b/packages/run/tests/basic.spec.ts index c1837a8828..a09d5b8104 100644 --- a/packages/run/tests/basic.spec.ts +++ b/packages/run/tests/basic.spec.ts @@ -1,9 +1,16 @@ import { execSync } from "child_process"; +import { dirname, join } from "path"; +import { fileURLToPath } from "url"; import { Protocols } from "@waku/sdk"; import { expect } from "chai"; import { WakuTestClient } from "../src/test-client.js"; +import { getProjectName } from "../src/utils.js"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +const packageRoot = join(__dirname, ".."); describe("Waku Run - Basic Test", function () { this.timeout(90000); @@ -12,8 +19,11 @@ describe("Waku Run - Basic Test", function () { before(async function () { // Step 1: Start the nodes - execSync("docker compose up -d", { - stdio: "inherit" + const projectName = getProjectName(packageRoot); + execSync(`docker compose --project-name ${projectName} up -d`, { + cwd: packageRoot, + stdio: "inherit", + env: { ...process.env, COMPOSE_PROJECT_NAME: projectName } }); // Wait for nodes to be ready @@ -65,8 +75,11 @@ describe("Waku Run - Basic Test", function () { if (client) { await client.stop(); } - execSync("docker compose down", { - stdio: "inherit" + const projectName = getProjectName(packageRoot); + execSync(`docker compose --project-name ${projectName} down`, { + cwd: packageRoot, + stdio: "inherit", + env: { ...process.env, COMPOSE_PROJECT_NAME: projectName } }); }); diff --git a/packages/run/tests/browser.spec.ts b/packages/run/tests/browser.spec.ts index b669bbf4bb..2c53313f4d 100644 --- a/packages/run/tests/browser.spec.ts +++ b/packages/run/tests/browser.spec.ts @@ -5,11 +5,13 @@ import { fileURLToPath } from "url"; import { Browser, chromium, expect, Page, test } from "@playwright/test"; import { NODE1_PEER_ID, NODE2_PEER_ID } from "../src/constants.js"; +import { getProjectName } from "../src/utils.js"; import { startTestServer, stopTestServer } from "./test-server.js"; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); +const packageRoot = join(__dirname, ".."); test.describe.configure({ mode: "serial" }); @@ -24,9 +26,11 @@ test.describe("Waku Run - Browser Test", () => { await startTestServer(testPort); // Start docker compose - execSync("docker compose up -d", { + const projectName = getProjectName(packageRoot); + execSync(`docker compose --project-name ${projectName} up -d`, { stdio: "inherit", - cwd: join(__dirname, "..") + cwd: packageRoot, + env: { ...process.env, COMPOSE_PROJECT_NAME: projectName } }); // Wait for nodes to be ready @@ -100,9 +104,11 @@ test.describe("Waku Run - Browser Test", () => { await browser.close(); } - execSync("docker compose down", { + const projectName = getProjectName(packageRoot); + execSync(`docker compose --project-name ${projectName} down`, { stdio: "inherit", - cwd: join(__dirname, "..") + cwd: packageRoot, + env: { ...process.env, COMPOSE_PROJECT_NAME: projectName } }); await stopTestServer();