From f14e396de7d2ee66640a94f76e39e997603f3ee3 Mon Sep 17 00:00:00 2001 From: hsrvms <59848940+hsrvms@users.noreply.github.com> Date: Thu, 26 Dec 2024 20:27:16 +0300 Subject: [PATCH 1/4] update 'docker-compose' to 'docker compose' --- cli/commands/run/index.js | 22 ++++++++++++++-------- cli/utils/runMySQLContainer.js | 33 ++++++++++++++++++--------------- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/cli/commands/run/index.js b/cli/commands/run/index.js index 7bcfa95..3c4265f 100644 --- a/cli/commands/run/index.js +++ b/cli/commands/run/index.js @@ -12,10 +12,11 @@ const updateDatabaseMetadata = require("./utils/updateDatabaseMetadata"); const isAppleSilicon = require("../../utils/isAppleSilicon"); const run = async () => { + console.log("--Run--"); const projectDetails = findProjectRoot(); if (!projectDetails) { console.log( - chalk.red`You are not within a Xest project directory. Please check your current path directory.` + chalk.red`You are not within a Xest project directory. Please check your current path directory.`, ); return; } @@ -34,7 +35,7 @@ const run = async () => { const checkDatabaseSchemaAppliedQuery = `select count(*) as count from migrations where name = '/20211107064304-database-schema';`; const mySQLConnectionString = `mysql -h localhost -u root -ppassword ${snakeCase( - projectName + projectName, )}_db`; const checkDatabaseSchema = `printf "${checkDatabaseSchemaAppliedQuery}" | docker exec -i ${mySQLContainerId} ${mySQLConnectionString}`; // insert database schema @@ -73,7 +74,7 @@ const run = async () => { }); const checkMigrationsQuery = `select count(*) as count from migrations where name='/${latestMigrationFile.replace( ".js", - "" + "", )}';`; const checkMigrations = `printf "${checkMigrationsQuery}" | docker exec -i ${mySQLContainerId} ${mySQLConnectionString}`; ({ error, output } = await runSqlQueryWithinContainer(checkMigrations)); @@ -101,7 +102,7 @@ const run = async () => { if (error && error.includes("ERROR")) { console.log( - chalk.red`Failed to populate database with seed data. This might happen if you have recently updated your migrations, please modify your seed data to match new schema changes.` + chalk.red`Failed to populate database with seed data. This might happen if you have recently updated your migrations, please modify your seed data to match new schema changes.`, ); console.log(chalk.red`Error: ${error.split("ERROR")[1]}`); @@ -112,10 +113,15 @@ const run = async () => { process.stdin.resume(); let isExiting = false; - let dockerComposeCommand = `docker-compose --project-name ${projectName} down`; const usingAppleSiliconChipset = isAppleSilicon(); - if (usingAppleSiliconChipset) { - dockerComposeCommand = `docker-compose --project-name ${projectName} -f docker-compose.apple-silicon.yml down`; + + // Since Docker Compose V2, docker compose is preferred over docker-compose + let dockerComposeCommand = `docker compose --project-name ${projectName}${usingAppleSiliconChipset ? " -f docker-compose.apple-silicon.yml" : ""} down`; + // Fallback to legacy docker-compose command if docker compose fails + try { + execSync("docker compose version"); + } catch (err) { + dockerComposeCommand = `docker-compose --project-name ${projectName}${usingAppleSiliconChipset ? " -f docker-compose.apple-silicon.yml" : ""} down`; } // shutdown procedure @@ -141,7 +147,7 @@ const run = async () => { { cwd: path.join(rootPath, "database") }, () => { process.exit(0); - } + }, ); } }); diff --git a/cli/utils/runMySQLContainer.js b/cli/utils/runMySQLContainer.js index 04f4d54..f04268c 100644 --- a/cli/utils/runMySQLContainer.js +++ b/cli/utils/runMySQLContainer.js @@ -16,7 +16,7 @@ const runMySQLContainer = async (rootPath, projectName) => { } catch (err) { if (err.toString().includes("Error")) { console.log( - chalk.red`Docker is currently not running. Please start Docker and repeat ${chalk.green`xx run`} again.` + chalk.red`Docker is currently not running. Please start Docker and repeat ${chalk.green`xx run`} again.`, ); return false; } @@ -26,7 +26,7 @@ const runMySQLContainer = async (rootPath, projectName) => { `docker ps --format "table {{.ID}}\t{{.Names}}" | grep ${projectName}-mysql-db | cut -d ' ' -f 1`, { cwd: path.join(rootPath, "database"), - } + }, ).toString(); let ready = false; @@ -41,7 +41,7 @@ const runMySQLContainer = async (rootPath, projectName) => { "database", usingAppleSiliconChipset ? "docker-compose.apple-silicon.yml" - : "docker-compose.yml" + : "docker-compose.yml", ); const dockerComposeFile = fs.readFileSync(dockerComposeFilePath, "utf8"); @@ -52,7 +52,7 @@ const runMySQLContainer = async (rootPath, projectName) => { // Regex pattern to extract the host port const pattern = new RegExp( `${serviceName}:\\s*\\n(?:\\s*\\w+:.*\\n)*\\s*ports:\\s*\\n(?:\\s*-\\s*"?(\\d+):\\d+"?\\n)*`, - "gm" + "gm", ); const match = pattern.exec(dockerComposeFile); let mysqlHostPort = 3306; @@ -64,12 +64,15 @@ const runMySQLContainer = async (rootPath, projectName) => { let mySQLContainerId = isDockerMySQLContainerRunning.trim(); if (!Boolean(isDockerMySQLContainerRunning)) { // check if mysql port is available for use - await resolvePortConflict(mysqlHostPort, "MySQL Docker Container", false, ); - - let dockerComposeCommand = `docker-compose --project-name ${projectName} up -d`; - - if (usingAppleSiliconChipset) { - dockerComposeCommand = `docker-compose --project-name ${projectName} -f docker-compose.apple-silicon.yml up -d`; + await resolvePortConflict(mysqlHostPort, "MySQL Docker Container", false); + + // Since Docker Compose V2, docker compose is preferred over docker-compose + let dockerComposeCommand = `docker compose --project-name ${projectName}${usingAppleSiliconChipset ? " -f docker-compose.apple-silicon.yml" : ""} up -d`; + // Fallback to legacy docker-compose command if docker compose fails + try { + execSync("docker compose version"); + } catch (err) { + dockerComposeCommand = `docker-compose --project-name ${projectName}${usingAppleSiliconChipset ? " -f docker-compose.apple-silicon.yml" : ""} up -d`; } const runMySQLContainer = execSync(dockerComposeCommand, { @@ -81,21 +84,21 @@ const runMySQLContainer = async (rootPath, projectName) => { `docker ps --format "table {{.ID}}\t{{.Names}}" | grep ${projectName}-mysql-db | cut -d ' ' -f 1`, { cwd: path.join(rootPath, "database"), - } + }, ).toString(); mySQLContainerId = isDockerMySQLContainerRunningAgain.trim(); // check whether mysql is ready console.log( - chalk.yellow`Waiting for MySQL Container to become ready. This should only take a few seconds.` + chalk.yellow`Waiting for MySQL Container to become ready. This should only take a few seconds.`, ); while (!ready && retryCount < 60) { const query = `SELECT COUNT(*) as tbl_count FROM information_schema.tables WHERE table_schema = '${snakeCase( - projectName + projectName, )}_db';`; const mySQLConnectionString = `mysql -h localhost -u root -ppassword ${snakeCase( - projectName + projectName, )}_db`; const checkDatabaseSchema = `printf "${query}" | docker exec -i ${mySQLContainerId} ${mySQLConnectionString}`; ({ error, output } = await runSqlQueryWithinContainer(checkDatabaseSchema)); @@ -113,7 +116,7 @@ const runMySQLContainer = async (rootPath, projectName) => { } if (!ready) { console.log( - chalk.red`MySQL instance is not ready yet. Try running ${chalk.green`xx run`} again.` + chalk.red`MySQL instance is not ready yet. Try running ${chalk.green`xx run`} again.`, ); return false; } From ac8f437309c501bfbc910c647515960a1c7b7174 Mon Sep 17 00:00:00 2001 From: hsrvms <59848940+hsrvms@users.noreply.github.com> Date: Thu, 26 Dec 2024 20:35:31 +0300 Subject: [PATCH 2/4] remove debug logs --- cli/commands/run/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/cli/commands/run/index.js b/cli/commands/run/index.js index 3c4265f..10eb8c2 100644 --- a/cli/commands/run/index.js +++ b/cli/commands/run/index.js @@ -12,7 +12,6 @@ const updateDatabaseMetadata = require("./utils/updateDatabaseMetadata"); const isAppleSilicon = require("../../utils/isAppleSilicon"); const run = async () => { - console.log("--Run--"); const projectDetails = findProjectRoot(); if (!projectDetails) { console.log( From a8b6cdc2e0c0211a7f6a50fa31dd12d1009ac8e4 Mon Sep 17 00:00:00 2001 From: hsrvms <59848940+hsrvms@users.noreply.github.com> Date: Mon, 30 Dec 2024 14:23:27 +0300 Subject: [PATCH 3/4] refactor containerRunner, delete version line from compose files --- .../database/docker-compose.apple-silicon.yml | 1 - api-sample/database/docker-compose.yml | 3 +-- cli/utils/runMySQLContainer.js | 15 +++++++++------ 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/api-sample/database/docker-compose.apple-silicon.yml b/api-sample/database/docker-compose.apple-silicon.yml index 21ebbcd..cdfd231 100644 --- a/api-sample/database/docker-compose.apple-silicon.yml +++ b/api-sample/database/docker-compose.apple-silicon.yml @@ -1,4 +1,3 @@ -version: "3.3" services: {{PROJECT_NAME_KEBAPCASE}}-db: container_name: {{PROJECT_NAME_KEBAPCASE}}-mysql-db diff --git a/api-sample/database/docker-compose.yml b/api-sample/database/docker-compose.yml index 742c937..3797239 100644 --- a/api-sample/database/docker-compose.yml +++ b/api-sample/database/docker-compose.yml @@ -1,8 +1,7 @@ -version: "3.3" services: {{PROJECT_NAME_KEBAPCASE}}-db: container_name: {{PROJECT_NAME_KEBAPCASE}}-mysql-db - image: mysql:5.7 + image: mysql:latest restart: always command: --sql_mode="NO_ENGINE_SUBSTITUTION" environment: diff --git a/cli/utils/runMySQLContainer.js b/cli/utils/runMySQLContainer.js index f04268c..902faca 100644 --- a/cli/utils/runMySQLContainer.js +++ b/cli/utils/runMySQLContainer.js @@ -36,12 +36,13 @@ const runMySQLContainer = async (rootPath, projectName) => { // read from docker-compose file the PORT number const usingAppleSiliconChipset = isAppleSilicon(); + const composeFileName = usingAppleSiliconChipset + ? "docker-compose.apple-silicon.yml" + : "docker-compose.yml"; const dockerComposeFilePath = path.join( rootPath, "database", - usingAppleSiliconChipset - ? "docker-compose.apple-silicon.yml" - : "docker-compose.yml", + composeFileName, ); const dockerComposeFile = fs.readFileSync(dockerComposeFilePath, "utf8"); @@ -67,13 +68,15 @@ const runMySQLContainer = async (rootPath, projectName) => { await resolvePortConflict(mysqlHostPort, "MySQL Docker Container", false); // Since Docker Compose V2, docker compose is preferred over docker-compose - let dockerComposeCommand = `docker compose --project-name ${projectName}${usingAppleSiliconChipset ? " -f docker-compose.apple-silicon.yml" : ""} up -d`; - // Fallback to legacy docker-compose command if docker compose fails + let dockerComposePrefixByVersion = "docker compose"; try { execSync("docker compose version"); } catch (err) { - dockerComposeCommand = `docker-compose --project-name ${projectName}${usingAppleSiliconChipset ? " -f docker-compose.apple-silicon.yml" : ""} up -d`; + // Fallback to legacy docker-compose command if docker compose fails + dockerComposePrefixByVersion = "docker-compose"; } + let dockerComposeCommand = `${dockerComposePrefixByVersion} --project-name ${projectName} -f ${composeFileName} up -d`; + console.log(dockerComposeCommand); const runMySQLContainer = execSync(dockerComposeCommand, { cwd: path.join(rootPath, "database"), From eb5f4245983547ccdd93776efff794468e95ec98 Mon Sep 17 00:00:00 2001 From: hsrvms <59848940+hsrvms@users.noreply.github.com> Date: Mon, 30 Dec 2024 14:35:29 +0300 Subject: [PATCH 4/4] refactor compose up/down strings --- cli/commands/run/index.js | 13 +++++++++---- cli/utils/runMySQLContainer.js | 1 - 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/cli/commands/run/index.js b/cli/commands/run/index.js index 10eb8c2..a5d314d 100644 --- a/cli/commands/run/index.js +++ b/cli/commands/run/index.js @@ -113,16 +113,21 @@ const run = async () => { let isExiting = false; const usingAppleSiliconChipset = isAppleSilicon(); + const composeFileName = usingAppleSiliconChipset + ? "docker-compose.apple-silicon.yml" + : "docker-compose.yml"; + + let dockerComposePrefixByVersion = "docker compose"; - // Since Docker Compose V2, docker compose is preferred over docker-compose - let dockerComposeCommand = `docker compose --project-name ${projectName}${usingAppleSiliconChipset ? " -f docker-compose.apple-silicon.yml" : ""} down`; - // Fallback to legacy docker-compose command if docker compose fails try { execSync("docker compose version"); } catch (err) { - dockerComposeCommand = `docker-compose --project-name ${projectName}${usingAppleSiliconChipset ? " -f docker-compose.apple-silicon.yml" : ""} down`; + // Fallback to legacy docker-compose command if docker compose fails + dockerComposePrefixByVersion = "docker-compose"; } + let dockerComposeCommand = `${dockerComposePrefixByVersion} --project-name ${projectName} -f ${composeFileName} down`; + // shutdown procedure [ `exit`, diff --git a/cli/utils/runMySQLContainer.js b/cli/utils/runMySQLContainer.js index 902faca..80e67cc 100644 --- a/cli/utils/runMySQLContainer.js +++ b/cli/utils/runMySQLContainer.js @@ -76,7 +76,6 @@ const runMySQLContainer = async (rootPath, projectName) => { dockerComposePrefixByVersion = "docker-compose"; } let dockerComposeCommand = `${dockerComposePrefixByVersion} --project-name ${projectName} -f ${composeFileName} up -d`; - console.log(dockerComposeCommand); const runMySQLContainer = execSync(dockerComposeCommand, { cwd: path.join(rootPath, "database"),