From f2071d39ec815381125683057201be536d78c82f Mon Sep 17 00:00:00 2001 From: Juan Ferrer Toribio Date: Sun, 4 Feb 2024 23:58:26 +0100 Subject: [PATCH] ci: refs#6706 Jenkinsfile tuning & parallel back test (unstable, disabled) --- Jenkinsfile | 4 +- back/tests-helper.js | 34 +++++++++++ back/tests.js | 136 +++++++++++++++++++++---------------------- package.json | 2 +- pnpm-lock.yaml | 14 ++--- 5 files changed, 111 insertions(+), 79 deletions(-) create mode 100644 back/tests-helper.js diff --git a/Jenkinsfile b/Jenkinsfile index 246fa94c2..07fac3034 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -53,7 +53,7 @@ pipeline { TZ = 'Europe/Madrid' } parallel { - stage('Backend') { + stage('Back') { stages { stage('Install') { environment { @@ -97,7 +97,7 @@ pipeline { } } } - stage('Frontend') { + stage('Front') { when { expression { FROM_GIT } } diff --git a/back/tests-helper.js b/back/tests-helper.js new file mode 100644 index 000000000..b88fa1fd6 --- /dev/null +++ b/back/tests-helper.js @@ -0,0 +1,34 @@ +/* eslint-disable no-console */ +const app = require('vn-loopback/server/server'); +let dataSources = require('../loopback/server/datasources.json'); + +async function init() { + console.log('Initializing backend.'); + + dataSources = JSON.parse(JSON.stringify(dataSources)); + Object.assign(dataSources.vn, { + host: process.env.DB_HOST, + port: process.env.DB_PORT + }); + + const bootOptions = {dataSources}; + await new Promise((resolve, reject) => { + app.boot(bootOptions, + err => err ? reject(err) : resolve()); + }); + // FIXME: Workaround to wait for loopback to be ready + await app.models.Application.status(); +} + +async function deinit() { + console.log('Stopping backend.'); + await app.disconnect(); +} + +module.exports = { + init, + deinit +}; + +if (require.main === module) + init(); diff --git a/back/tests.js b/back/tests.js index c4c477090..0fb4c76ea 100644 --- a/back/tests.js +++ b/back/tests.js @@ -2,30 +2,21 @@ const path = require('path'); const Myt = require('@verdnatura/myt/myt'); const Run = require('@verdnatura/myt/myt-run'); -let dataSources = require('../loopback/server/datasources.json'); +const helper = require('./tests-helper'); let server; +const isCI = process.argv[2] === 'ci'; +const PARALLEL = false; +const TIMEOUT = 900000; -process.on('warning', warning => { - console.log(warning.name); - console.log(warning.message); - console.log(warning.stack); -}); +process.on('SIGINT', teardown); +process.on('exit', teardown); +process.on('uncaughtException', onError); +process.on('unhandledRejection', onError); -process.on('SIGUSR2', rmServer); -process.on('exit', rmServer); - -async function rmServer() { - if (!server) return; - await server.rm(); - server = null; -} - -async function test() { +async function setup() { console.log('Building and running DB container.'); - const isCI = process.argv[2] === 'ci'; - const myt = new Myt(); await myt.init({ workspace: path.join(__dirname, '..'), @@ -36,69 +27,76 @@ async function test() { }); server = await myt.run(Run); await myt.deinit(); + const {dbConfig} = server; + process.env.DB_HOST = dbConfig.host; + process.env.DB_PORT = dbConfig.port; - console.log('Initializing backend.'); + if (!PARALLEL) + await helper.init(); +} - dataSources = JSON.parse(JSON.stringify(dataSources)); - Object.assign(dataSources.vn, { - host: dbConfig.host, - port: dbConfig.port - }); +async function teardown() { + if (!server) return; - const bootOptions = {dataSources}; - const app = require('vn-loopback/server/server'); - await new Promise((resolve, reject) => { - app.boot(bootOptions, - err => err ? reject(err) : resolve()); - }); - // FIXME: Workaround to wait for loopback to be ready - await app.models.Application.status(); + if (!PARALLEL) + await helper.deinit(); - console.log('Running tests.'); + console.log('Stopping and removing DB container.'); + await server.rm(); + server = null; +} - const Jasmine = require('jasmine'); - const jasmine = new Jasmine(); +async function onError(err) { + await teardown(); + console.error(err); +} - const SpecReporter = require('jasmine-spec-reporter').SpecReporter; - jasmine.addReporter(new SpecReporter({ - spec: { - displaySuccessful: isCI, - displayPending: isCI - }, - summary: { - displayPending: false, - } - })); +async function test() { + let runner; + const config = { + globalSetup: setup, + globalSetupTimeout: TIMEOUT, + globalTeardown: teardown, + globalTeardownTimeout: TIMEOUT, + spec_dir: '.', + spec_files: [ + 'back/**/*[sS]pec.js', + 'loopback/**/*[sS]pec.js', + 'modules/*/back/**/*.[sS]pec.js' + ], + helpers: [] + }; + + if (PARALLEL) { + const ParallelRunner = require('jasmine/parallel'); + runner = new ParallelRunner({numWorkers: 1}); + config.helpers.push(`back/tests-helper.js`); + } else { + const Jasmine = require('jasmine'); + runner = new Jasmine(); + + const SpecReporter = require('jasmine-spec-reporter').SpecReporter; + runner.addReporter(new SpecReporter({ + spec: { + displaySuccessful: isCI, + displayPending: isCI + }, + summary: { + displayPending: false, + } + })); + } if (isCI) { const JunitReporter = require('jasmine-reporters'); - jasmine.addReporter(new JunitReporter.JUnitXmlReporter()); - - jasmine.exitOnCompletion = true; - jasmine.jasmine.DEFAULT_TIMEOUT_INTERVAL = 900000; + runner.addReporter(new JunitReporter.JUnitXmlReporter()); + runner.jasmine.DEFAULT_TIMEOUT_INTERVAL = TIMEOUT; } - const backSpecs = [ - './back/**/*[sS]pec.js', - './loopback/**/*[sS]pec.js', - './modules/*/back/**/*.[sS]pec.js' - ]; - - jasmine.loadConfig({ - spec_dir: '.', - spec_files: backSpecs, - helpers: [], - }); - - await jasmine.execute(); - - console.log('Stopping.'); - - if (app) await app.disconnect(); - await rmServer(); - - console.log('Tests ended.\n'); + // runner.loadConfigFile('back/jasmine.json'); + runner.loadConfig(config); + await runner.execute(); } test(); diff --git a/package.json b/package.json index 76cb9ff50..7c6b0853b 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "html-loader-jest": "^0.2.1", "html-webpack-plugin": "^5.5.1", "identity-obj-proxy": "^3.0.0", - "jasmine": "^5.0.0", + "jasmine": "^5.0.2", "jasmine-reporters": "^2.4.0", "jasmine-spec-reporter": "^7.0.0", "jest": "^26.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3143626f6..81c7e0b94 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -206,8 +206,8 @@ devDependencies: specifier: ^3.0.0 version: 3.0.0 jasmine: - specifier: ^5.0.0 - version: 5.1.0 + specifier: ^5.0.2 + version: 5.0.2 jasmine-reporters: specifier: ^2.4.0 version: 2.5.2 @@ -8020,8 +8020,8 @@ packages: filelist: 1.0.4 minimatch: 3.1.2 - /jasmine-core@5.1.1: - resolution: {integrity: sha512-UrzO3fL7nnxlQXlvTynNAenL+21oUQRlzqQFsA2U11ryb4+NLOCOePZ70PTojEaUKhiFugh7dG0Q+I58xlPdWg==} + /jasmine-core@5.0.1: + resolution: {integrity: sha512-D4bRej8CplwNtNGyTPD++cafJlZUphzZNV+MSAnbD3er4D0NjL4x9V+mu/SI+5129utnCBen23JwEuBZA9vlpQ==} dev: true /jasmine-reporters@2.5.2: @@ -8037,12 +8037,12 @@ packages: colors: 1.4.0 dev: true - /jasmine@5.1.0: - resolution: {integrity: sha512-prmJlC1dbLhti4nE4XAPDWmfJesYO15sjGXVp7Cs7Ym5I9Xtwa/hUHxxJXjnpfLO72+ySttA0Ztf8g/RiVnUKw==} + /jasmine@5.0.2: + resolution: {integrity: sha512-fXgPcWfDhENJJVktFZc/JJ+TpdOQIMJTbn6BgSOIneBagrHtKvnyA8Ag6uD8eF2m7cSESG7K/Hfj/Hk5asAwNg==} hasBin: true dependencies: glob: 10.3.10 - jasmine-core: 5.1.1 + jasmine-core: 5.0.1 dev: true /jayson@2.1.2: