diff --git a/packages/grafana-toolkit/README.md b/packages/grafana-toolkit/README.md index a315e272ea7..3de9e990feb 100644 --- a/packages/grafana-toolkit/README.md +++ b/packages/grafana-toolkit/README.md @@ -93,6 +93,7 @@ Available options: - `-u`, `--updateSnapshot` - Performs snapshots update. - `--testNamePattern=` - Runs test with names that match provided regex (https://jestjs.io/docs/en/cli#testnamepattern-regex). - `--testPathPattern=` - Runs test with paths that match provided regex (https://jestjs.io/docs/en/cli#testpathpattern-regex). +- `--maxWorkers=|` - Limit number of Jest workers spawned (https://jestjs.io/docs/en/cli#--maxworkersnumstring) ### Build your plugin diff --git a/packages/grafana-toolkit/src/cli/index.ts b/packages/grafana-toolkit/src/cli/index.ts index 4dbcb0b9706..6ce928a80e8 100644 --- a/packages/grafana-toolkit/src/cli/index.ts +++ b/packages/grafana-toolkit/src/cli/index.ts @@ -138,10 +138,11 @@ export const run = (includeInternalScripts = false) => { program .command('plugin:build') + .option('--maxJestWorkers |', 'Limit number of Jest workers spawned') .description('Prepares plugin dist package') .option('--coverage', 'Run code coverage', false) .action(async cmd => { - await execTask(pluginBuildTask)({ coverage: cmd.coverage, silent: true }); + await execTask(pluginBuildTask)({ coverage: cmd.coverage, silent: true, maxJestWorkers: cmd.maxJestWorkers }); }); program @@ -164,6 +165,7 @@ export const run = (includeInternalScripts = false) => { .option('--watch', 'Run tests in interactive watch mode') .option('--testPathPattern ', 'Run only tests with a path that matches the regex') .option('--testNamePattern ', 'Run only tests with a name that matches the regex') + .option('--maxWorkers |', 'Limit number of workers spawned') .description('Executes plugin tests') .action(async cmd => { await execTask(pluginTestTask)({ @@ -172,6 +174,7 @@ export const run = (includeInternalScripts = false) => { watch: !!cmd.watch, testPathPattern: cmd.testPathPattern, testNamePattern: cmd.testNamePattern, + maxWorkers: cmd.maxWorkers, silent: true, }); }); @@ -179,10 +182,12 @@ export const run = (includeInternalScripts = false) => { program .command('plugin:ci-build') .option('--finish', 'move all results to the jobs folder', false) + .option('--maxJestWorkers |', 'Limit number of Jest workers spawned') .description('Build the plugin, leaving results in /dist and /coverage') .action(async cmd => { await execTask(ciBuildPluginTask)({ finish: cmd.finish, + maxJestWorkers: cmd.maxJestWorkers, }); }); diff --git a/packages/grafana-toolkit/src/cli/tasks/plugin.build.ts b/packages/grafana-toolkit/src/cli/tasks/plugin.build.ts index 155f1b15533..af81d5c38e4 100644 --- a/packages/grafana-toolkit/src/cli/tasks/plugin.build.ts +++ b/packages/grafana-toolkit/src/cli/tasks/plugin.build.ts @@ -16,6 +16,7 @@ const rimraf = promisify(rimrafCallback); interface PluginBuildOptions { coverage: boolean; + maxJestWorkers?: string; } interface Fixable { @@ -111,10 +112,10 @@ export const lintPlugin = ({ fix }: Fixable = {}) => } }); -export const pluginBuildRunner: TaskRunner = async ({ coverage }) => { +export const pluginBuildRunner: TaskRunner = async ({ coverage, maxJestWorkers }) => { await prepare(); await lintPlugin({ fix: false }); - await testPlugin({ updateSnapshot: false, coverage, watch: false }); + await testPlugin({ updateSnapshot: false, coverage, maxWorkers: maxJestWorkers, watch: false }); await bundlePlugin({ watch: false, production: true }); }; diff --git a/packages/grafana-toolkit/src/cli/tasks/plugin.ci.ts b/packages/grafana-toolkit/src/cli/tasks/plugin.ci.ts index 29b09c65055..07143d1a72e 100644 --- a/packages/grafana-toolkit/src/cli/tasks/plugin.ci.ts +++ b/packages/grafana-toolkit/src/cli/tasks/plugin.ci.ts @@ -27,6 +27,7 @@ export interface PluginCIOptions { finish?: boolean; upload?: boolean; signingAdmin?: boolean; + maxJestWorkers?: string; } /** @@ -40,7 +41,7 @@ export interface PluginCIOptions { * Anything that should be put into the final zip file should be put in: * ~/ci/jobs/build_xxx/dist */ -const buildPluginRunner: TaskRunner = async ({ finish }) => { +const buildPluginRunner: TaskRunner = async ({ finish, maxJestWorkers }) => { const start = Date.now(); if (finish) { @@ -58,7 +59,7 @@ const buildPluginRunner: TaskRunner = async ({ finish }) => { writeJobStats(start, workDir); } else { // Do regular build process with coverage - await pluginBuildRunner({ coverage: true }); + await pluginBuildRunner({ coverage: true, maxJestWorkers }); } }; diff --git a/packages/grafana-toolkit/src/cli/tasks/plugin/tests.ts b/packages/grafana-toolkit/src/cli/tasks/plugin/tests.ts index b7bd5124283..e50ae1dcdb7 100644 --- a/packages/grafana-toolkit/src/cli/tasks/plugin/tests.ts +++ b/packages/grafana-toolkit/src/cli/tasks/plugin/tests.ts @@ -8,9 +8,17 @@ export interface PluginTestOptions { watch: boolean; testPathPattern?: string; testNamePattern?: string; + maxWorkers?: string; } -export const testPlugin = ({ updateSnapshot, coverage, watch, testPathPattern, testNamePattern }: PluginTestOptions) => +export const testPlugin = ({ + updateSnapshot, + coverage, + watch, + testPathPattern, + testNamePattern, + maxWorkers, +}: PluginTestOptions) => useSpinner('Running tests', async () => { const testConfig = loadJestPluginConfig(); @@ -22,6 +30,7 @@ export const testPlugin = ({ updateSnapshot, coverage, watch, testPathPattern, t testPathPattern: testPathPattern ? [testPathPattern] : [], testNamePattern: testNamePattern ? [testNamePattern] : [], passWithNoTests: true, + maxWorkers, }; // @ts-ignore diff --git a/scripts/webpack/webpack.dev.js b/scripts/webpack/webpack.dev.js index 49428c19d5c..ff671686b1b 100644 --- a/scripts/webpack/webpack.dev.js +++ b/scripts/webpack/webpack.dev.js @@ -87,21 +87,21 @@ module.exports = (env = {}) => env.noTsCheck ? new webpack.DefinePlugin({}) // bogus plugin to satisfy webpack API : new ForkTsCheckerWebpackPlugin({ - eslint: { - enabled: true, - files: ['public/app/**/*.{ts,tsx}', 'packages/*/src/**/*.{ts,tsx}'], - options: { - cache: true, + eslint: { + enabled: true, + files: ['public/app/**/*.{ts,tsx}', 'packages/*/src/**/*.{ts,tsx}'], + options: { + cache: true, + }, }, - }, - typescript: { - mode: 'write-references', - diagnosticOptions: { - semantic: true, - syntactic: true, + typescript: { + mode: 'write-references', + diagnosticOptions: { + semantic: true, + syntactic: true, + }, }, - }, - }), + }), new MiniCssExtractPlugin({ filename: 'grafana.[name].[hash].css', }),