From a126b09c96c3d7e7e2eb3f89737ec4e47701034d Mon Sep 17 00:00:00 2001 From: Patrick Hulce Date: Mon, 12 Apr 2021 16:11:13 -0500 Subject: [PATCH] fix(server): reject on server initialization errors (#584) --- packages/server/src/api/storage/sql/sql.js | 5 +++++ packages/server/src/server.js | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/server/src/api/storage/sql/sql.js b/packages/server/src/api/storage/sql/sql.js index ef4fb9501..72275f81c 100644 --- a/packages/server/src/api/storage/sql/sql.js +++ b/packages/server/src/api/storage/sql/sql.js @@ -225,8 +225,10 @@ class SqlStorageMethod { if (!statisticModelDefn.attributes.projectId.references) throw new Error('Invalid runModel'); if (!statisticModelDefn.attributes.buildId.references) throw new Error('Invalid runModel'); + log('[initialize] initializing database connection'); const sequelize = createSequelize(options); + log('[initialize] defining models'); const projectModel = sequelize.define(projectModelDefn.tableName, projectModelDefn.attributes); buildModelDefn.attributes.projectId.references.model = projectModel; @@ -245,10 +247,13 @@ class SqlStorageMethod { const umzug = createUmzug(sequelize, options); if (options.sqlDangerouslyResetDatabase) { + log('[initialize] resetting database'); await umzug.down({to: 0}); } + log('[initialize] running migrations'); await umzug.up(); + log('[initialize] migrations performed'); this._sequelize = {sequelize, projectModel, buildModel, runModel, statisticModel}; } diff --git a/packages/server/src/server.js b/packages/server/src/server.js index cca8ebf24..d2dfb1baa 100644 --- a/packages/server/src/server.js +++ b/packages/server/src/server.js @@ -7,6 +7,7 @@ /** @typedef {{port: number, close: () => Promise, storageMethod: StorageMethod}} ServerInstance */ +const log = require('debug')('lhci:server:sql'); const path = require('path'); const createHttpServer = require('http').createServer; const express = require('express'); @@ -30,9 +31,11 @@ const DIST_FOLDER = path.join(__dirname, '../dist'); async function createApp(options) { const {storage} = options; + log('[createApp] initializing storage method'); const storageMethod = StorageMethod.from(storage); await storageMethod.initialize(storage); + log('[createApp] creating express app'); const context = {storageMethod, options}; const app = express(); if (options.logLevel !== 'silent') app.use(morgan('short')); @@ -58,6 +61,7 @@ async function createApp(options) { app.get('/app/*', (_, res) => res.sendFile(path.join(DIST_FOLDER, 'index.html'))); app.use(errorMiddleware); + log('[createApp] launching cron jobs'); startPsiCollectCron(storageMethod, options); startDeleteOldBuildsCron(storageMethod, options); @@ -71,7 +75,7 @@ async function createApp(options) { async function createServer(options) { const {app, storageMethod} = await createApp(options); - return new Promise(resolve => { + return new Promise((resolve, reject) => { const server = createHttpServer(app); // Node default socket timeout is 2 minutes. @@ -88,6 +92,8 @@ async function createServer(options) { }); }); + server.on('error', err => reject(err)); + server.listen(options.port, () => { const serverAddress = server.address(); const listenPort =