diff --git a/src/creevey.ts b/src/creevey.ts index 0c0fc03e..73fe42cb 100644 --- a/src/creevey.ts +++ b/src/creevey.ts @@ -13,7 +13,6 @@ process.on('unhandledRejection', (reason) => { if (cluster.isWorker) return emitMessage({ type: 'error', payload: { status: 'failed', error } }); if (cluster.isMaster) { shutdownWorkers(); - emitMessage<'shutdown'>('shutdown'); } }); diff --git a/src/server/master/index.ts b/src/server/master/index.ts index 96753016..ec585c64 100644 --- a/src/server/master/index.ts +++ b/src/server/master/index.ts @@ -5,7 +5,7 @@ import master from './master'; import creeveyServer from './server'; import creeveyApi from './api'; import { Config, Options, isDefined } from '../../types'; -import { shutdownWorkers, emitMessage } from '../../utils'; +import { shutdownWorkers } from '../../utils'; const copyFileAsync = promisify(copyFile); const readdirAsync = promisify(readdir); @@ -55,7 +55,6 @@ export default async function (config: Config, options: Options): Promise // TODO output summary process.exitCode = isSuccess ? 0 : -1; shutdownWorkers(); - emitMessage<'shutdown'>('shutdown'); }); // TODO grep runner.start(Object.keys(runner.status.tests)); diff --git a/src/server/master/master.ts b/src/server/master/master.ts index 8eed0247..e0565da7 100644 --- a/src/server/master/master.ts +++ b/src/server/master/master.ts @@ -3,7 +3,7 @@ import { Config, Test, isDefined, ServerTest } from '../../types'; import { loadTestsFromStories } from '../../stories'; import Runner from './runner'; import { startWebpackCompiler } from './stories'; -import { shutdownWorkers, emitMessage } from '../../utils'; +import { shutdownWorkers } from '../../utils'; function mergeTests( testsWithReports: Partial<{ [id: string]: Test }>, @@ -50,12 +50,10 @@ export default async function master(config: Config): Promise { new Promise((resolve) => runner.once('stop', resolve)), ]).then(() => { shutdownWorkers(); - emitMessage<'shutdown'>('shutdown'); }); runner.stop(); } else { shutdownWorkers(); - emitMessage<'shutdown'>('shutdown'); } }); diff --git a/src/server/master/pool.ts b/src/server/master/pool.ts index 98e6a556..2012f62a 100644 --- a/src/server/master/pool.ts +++ b/src/server/master/pool.ts @@ -144,8 +144,8 @@ export default class Pool extends EventEmitter { private gracefullyKill(worker: Worker): void { const timeout = setTimeout(() => worker.kill(), 10000); + worker.on('disconnect', () => clearTimeout(timeout)); worker.send('shutdown'); worker.disconnect(); - worker.on('disconnect', () => clearTimeout(timeout)); } } diff --git a/src/server/master/webpack.ts b/src/server/master/webpack.ts index 3c462d23..d1fee982 100644 --- a/src/server/master/webpack.ts +++ b/src/server/master/webpack.ts @@ -141,8 +141,6 @@ export default async function compile(config: Config, { debug }: Options): Promi const watcher = storybookWebpackCompiler.watch({}, handleWebpackBuild); subscribeOn('shutdown', () => { - console.log('[CreeveyWebpack]: Stop watching and shuting down'); watcher.close(noop); - process.on('exit', () => console.log('[CreeveyWebpack]: process exiting')); }); } diff --git a/src/server/worker/selenium.ts b/src/server/worker/selenium.ts index e8188196..8ecb67c9 100644 --- a/src/server/worker/selenium.ts +++ b/src/server/worker/selenium.ts @@ -280,8 +280,7 @@ export async function getBrowser(config: Config, browserConfig: BrowserConfig): const browser = await new Builder().usingServer(gridUrl).withCapabilities(capabilities).build(); subscribeOn('shutdown', () => { - console.log('[CreeveyWorker]:', `Closing browser session ${process.pid}`); - browser.quit().then(() => console.log('[CreeveyWorker]:', `Browser session closed ${process.pid}`)); + browser.quit(); }); if (viewport) { diff --git a/src/utils.ts b/src/utils.ts index 7f8ca7f7..8648ae24 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -117,13 +117,17 @@ export function subscribeOn( } export function shutdownWorkers(): void { - Object.values(cluster.workers) - .filter(isDefined) - .filter((worker) => worker.isConnected()) - .forEach((worker) => { - const timeout = setTimeout(() => worker.kill(), 10000); - worker.send('shutdown'); - worker.disconnect(); - worker.on('disconnect', () => clearTimeout(timeout)); - }); + emitMessage<'shutdown'>('shutdown'); + // NOTE Some workers exit on SIGINT, we need to wait a little to kill the remaining + setTimeout(() => + Object.values(cluster.workers) + .filter(isDefined) + .filter((worker) => worker.isConnected()) + .forEach((worker) => { + const timeout = setTimeout(() => worker.kill(), 10000); + worker.on('disconnect', () => clearTimeout(timeout)); + worker.send('shutdown'); + worker.disconnect(); + }), + ); }