Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • ask-user-to-delete-exercises-on-duplicates
  • jw_sonar
  • jw_sonar_backup
  • main
  • move-to-esm-only
  • open_tool_for_self_hosting
  • v5.0
  • v6.0
  • v4.1
  • v4.2
10 results

Target

Select target project
  • dojo_project/projects/shared/nodeclientsharedcode
1 result
Select Git revision
  • ask-user-to-delete-exercises-on-duplicates
  • jw_sonar
  • jw_sonar_backup
  • main
  • move-to-esm-only
  • open_tool_for_self_hosting
  • v5.0
  • v6.0
  • v4.1
  • v4.2
10 results
Show changes
Commits on Source (2)
......@@ -67,7 +67,7 @@ class AssignmentValidator {
// Check requirements
this.events.emit('subStep', 'DOCKER_RUNNING', 'Checking if Docker daemon is running');
try {
await execAsync(`cd "${ this.folderAssignment }";docker ps`);
await execAsync(`docker ps`);
} catch ( error ) {
emitError('DOCKER_RUNNING', `Docker daemon isn't running`, 'REQUIREMENTS_CHECKING', `Some requirements are not satisfied.`, AssignmentCheckerError.DOCKER_DAEMON_NOT_RUNNING);
return;
......
......@@ -3,6 +3,7 @@ import { TypedEmitter } from 'tiny-typed-emitter';
import ExerciseRunningEvents from '../../types/Dojo/ExerciseRunningEvents';
import { spawn } from 'child_process';
import ExerciseCheckerError from '../../../shared/types/Dojo/ExerciseCheckerError';
import { ChildProcessWithoutNullStreams } from 'node:child_process';
class ExerciseDockerCompose {
......@@ -28,6 +29,20 @@ class ExerciseDockerCompose {
});
}
private registerChildProcess(childProcess: ChildProcessWithoutNullStreams, resolve: (value: (number | PromiseLike<number>)) => void, reject: (reason?: unknown) => void) {
childProcess.stdout.on('data', (data) => {
this.events.emit('logs', data.toString(), false, false);
});
childProcess.stderr.on('data', (data) => {
this.events.emit('logs', data.toString(), true, false);
});
childProcess.on('exit', (code) => {
code !== null ? resolve(code) : reject();
});
}
run(doDown: boolean = false) {
(async () => {
let containerExitCode: number = -1;
......@@ -52,17 +67,7 @@ class ExerciseDockerCompose {
}
});
dockerCompose.stdout.on('data', (data) => {
this.events.emit('logs', data.toString(), false, true);
});
dockerCompose.stderr.on('data', (data) => {
this.events.emit('logs', data.toString(), true, true);
});
dockerCompose.on('exit', (code) => {
code !== null ? resolve(code) : reject();
});
this.registerChildProcess(dockerCompose, resolve, reject);
});
} catch ( error ) {
this.events.emit('endStep', 'COMPOSE_RUN', `Error while running the docker compose file`, true);
......@@ -77,7 +82,7 @@ class ExerciseDockerCompose {
try {
this.events.emit('step', 'COMPOSE_LOGS', 'Linked services logs acquisition');
await new Promise<void>((resolve, reject) => {
await new Promise<number>((resolve, reject) => {
this.events.emit('logs', '####################################################### Other Services Logs #######################################################\n', false, false);
......@@ -86,17 +91,7 @@ class ExerciseDockerCompose {
shell: true
});
dockerCompose.stdout.on('data', (data) => {
this.events.emit('logs', data.toString(), false, false);
});
dockerCompose.stderr.on('data', (data) => {
this.events.emit('logs', data.toString(), true, false);
});
dockerCompose.on('exit', (code) => {
code !== null ? resolve() : reject();
});
this.registerChildProcess(dockerCompose, resolve, reject);
});
} catch ( error ) {
this.events.emit('endStep', 'COMPOSE_LOGS', `Error while getting the linked services logs`, true);
......@@ -112,33 +107,49 @@ class ExerciseDockerCompose {
try {
this.events.emit('step', 'COMPOSE_DOWN', 'Stopping and removing containers');
await new Promise<void>((resolve, reject) => {
await new Promise<number>((resolve, reject) => {
this.events.emit('logs', '####################################################### Stop and remove containers #######################################################\n', false, false);
const dockerCompose = spawn(`${ dockerComposeCommand } down --volumes`, {
const dockerCompose = spawn(`${ dockerComposeCommand } down --volumes --rmi`, {
cwd : this.executionFolder,
shell: true
});
dockerCompose.stdout.on('data', (data) => {
this.events.emit('logs', data.toString(), false, false);
this.registerChildProcess(dockerCompose, resolve, reject);
});
} catch ( error ) {
this.events.emit('endStep', 'COMPOSE_DOWN', `Error stop and remove containers`, true);
this.events.emit('finished', false, ExerciseCheckerError.DOCKER_COMPOSE_DOWN_ERROR);
return;
}
this.events.emit('endStep', 'COMPOSE_DOWN', `Containers stopped and removed`, false);
}
}
dockerCompose.stderr.on('data', (data) => {
this.events.emit('logs', data.toString(), true, false);
});
// Remove images if asked
{
if ( doDown ) {
try {
this.events.emit('step', 'COMPOSE_REMOVE_DANGLING', 'Removing dangling images');
dockerCompose.on('exit', (code) => {
code !== null ? resolve() : reject();
await new Promise<number>((resolve, reject) => {
this.events.emit('logs', '####################################################### Remove dangling images #######################################################\n', false, false);
const dockerCompose = spawn(`docker image prune --force`, {
cwd : this.executionFolder,
shell: true
});
this.registerChildProcess(dockerCompose, resolve, reject);
});
} catch ( error ) {
this.events.emit('endStep', 'COMPOSE_DOWN', `Error stop and remove containers`, true);
this.events.emit('finished', false, ExerciseCheckerError.DOCKER_COMPOSE_DOWN_ERROR);
this.events.emit('endStep', 'COMPOSE_REMOVE_DANGLING', `Error while removing dangling images`, true);
this.events.emit('finished', false, ExerciseCheckerError.DOCKER_COMPOSE_REMOVE_DANGLING_ERROR);
return;
}
this.events.emit('endStep', 'COMPOSE_DOWN', `Containers stopped and removed`, false);
this.events.emit('endStep', 'COMPOSE_REMOVE_DANGLING', `Dangling images removed`, false);
}
}
......