diff --git a/.circleci/config.yml b/.circleci/config.yml index eaf0ee9cb384..c49af2a063b5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -341,6 +341,30 @@ jobs: paths: - sandbox/*/bench/*.json - sandbox/*/storybook-static + build-test-sandboxes: + parameters: + parallelism: + type: integer + executor: + class: large + name: sb_node_16_browsers + parallelism: << parameters.parallelism >> + steps: + - git-shallow-clone/checkout_advanced: + clone_options: '--depth 1 --verbose' + - attach_workspace: + at: . + - run: + name: Building Sandboxes + command: yarn task --task test-build --template $(yarn get-template --cadence << pipeline.parameters.workflow >> --task build) --no-link --start-from=never --junit + - report-workflow-on-failure: + template: $(yarn get-template --cadence << pipeline.parameters.workflow >> --task build) + - store_test_results: + path: test-results + - persist_to_workspace: + root: . + paths: + - sandbox/*/bench/test-build.json test-runner-production: parameters: parallelism: @@ -502,6 +526,10 @@ workflows: parallelism: 12 requires: - build + - build-test-sandboxes: + parallelism: 12 + requires: + - create-sandboxes - build-sandboxes: parallelism: 12 requires: @@ -526,6 +554,7 @@ workflows: parallelism: 3 requires: - build-sandboxes + - build-test-sandboxes # TODO: reenable once we find out the source of flakyness # - test-runner-dev: # requires: @@ -558,6 +587,10 @@ workflows: parallelism: 21 requires: - build + - build-test-sandboxes: + parallelism: 21 + requires: + - create-sandboxes - build-sandboxes: parallelism: 21 requires: @@ -582,6 +615,7 @@ workflows: parallelism: 3 requires: - build-sandboxes + - build-test-sandboxes # TODO: reenable once we find out the source of flakyness # - test-runner-dev: # parallelism: 4 @@ -615,6 +649,10 @@ workflows: # - smoke-test-sandboxes: # disabled for now # requires: # - create-sandboxes + - build-test-sandboxes: + parallelism: 36 + requires: + - create-sandboxes - build-sandboxes: parallelism: 36 requires: @@ -640,3 +678,4 @@ workflows: # parallelism: 4 # requires: # - create-sandboxes + diff --git a/code/frameworks/angular/src/builders/build-storybook/index.ts b/code/frameworks/angular/src/builders/build-storybook/index.ts index 9bbd4b53c3e1..114f626e57f6 100644 --- a/code/frameworks/angular/src/builders/build-storybook/index.ts +++ b/code/frameworks/angular/src/builders/build-storybook/index.ts @@ -33,6 +33,7 @@ addToGlobalContext('cliVersion', versions.storybook); export type StorybookBuilderOptions = JsonObject & { browserTarget?: string | null; tsConfig?: string; + test: boolean; docs: boolean; compodoc: boolean; compodocArgs: string[]; diff --git a/code/frameworks/angular/src/builders/build-storybook/schema.json b/code/frameworks/angular/src/builders/build-storybook/schema.json index 594038eeecca..6b614e574172 100644 --- a/code/frameworks/angular/src/builders/build-storybook/schema.json +++ b/code/frameworks/angular/src/builders/build-storybook/schema.json @@ -49,6 +49,11 @@ "description": "Starts Storybook in documentation mode. Learn more about it : https://storybook.js.org/docs/react/writing-docs/build-documentation#preview-storybooks-documentation.", "default": false }, + "test": { + "type": "boolean", + "description": "Build the static version of the sandbox optimized for testing purposes", + "default": false + }, "compodoc": { "type": "boolean", "description": "Execute compodoc before.", diff --git a/code/lib/cli/src/generate.ts b/code/lib/cli/src/generate.ts index fa52682ee278..76c00eca2d2a 100644 --- a/code/lib/cli/src/generate.ts +++ b/code/lib/cli/src/generate.ts @@ -259,6 +259,7 @@ command('build') ) .option('--force-build-preview', 'Build the preview iframe even if you are using --preview-url') .option('--docs', 'Build a documentation-only site using addon-docs') + .option('--test', 'Build stories optimized for testing purposes.') .action(async (options) => { process.env.NODE_ENV = process.env.NODE_ENV || 'production'; logger.setLevel(program.loglevel); diff --git a/scripts/bench/bench.schema b/scripts/bench/bench.schema index d459223136a0..bdee2f02fd56 100644 --- a/scripts/bench/bench.schema +++ b/scripts/bench/bench.schema @@ -18,6 +18,15 @@ buildSbPreviewSize: INTEGER, buildStaticSize: INTEGER, buildPrebuildSize: INTEGER, buildPreviewSize: INTEGER, +testBuildTime: INTEGER, +testBuildSize: INTEGER, +testBuildSbAddonsSize: INTEGER, +testBuildSbCommonSize: INTEGER, +testBuildSbManagerSize: INTEGER, +testBuildSbPreviewSize: INTEGER, +testBuildStaticSize: INTEGER, +testBuildPrebuildSize: INTEGER, +testBuildPreviewSize: INTEGER, devPreviewResponsive: INTEGER, devManagerResponsive: INTEGER, devManagerHeaderVisible: INTEGER, diff --git a/scripts/bench/types.ts b/scripts/bench/types.ts index da00af720ad2..0d86755ff8e5 100644 --- a/scripts/bench/types.ts +++ b/scripts/bench/types.ts @@ -38,6 +38,24 @@ export interface BenchResults { buildPrebuildSize: number; /** Total size of everything else (user's stories & components & CSS & assets etc.) */ buildPreviewSize: number; + /** Full `sb build` time */ + testBuildTime: number; + /** Size of the storybook-static directory in total */ + testBuildSize: number; + /** Size of the storybook-static/sb-addons in total */ + testBuildSbAddonsSize: number; + /** Size of the storybook-static/sb-common-assets */ + testBuildSbCommonSize: number; + /** Size of the storybook-static/sb-manager */ + testBuildSbManagerSize: number; + /** Size of storybook-static/sb-preview */ + testBuildSbPreviewSize: number; + /** Size of the `static` directory if it exists */ + testBuildStaticSize: number; + /** Total size of `sb-x` above */ + testBuildPrebuildSize: number; + /** Total size of everything else (user's stories & components & CSS & assets etc.) */ + testBuildPreviewSize: number; /** Time to wait-on iframe.html */ devPreviewResponsive: number; /** Time to wait-on index.html */ diff --git a/scripts/task.ts b/scripts/task.ts index 897957653413..6cf4fa7e9993 100644 --- a/scripts/task.ts +++ b/scripts/task.ts @@ -20,7 +20,7 @@ import { sandbox } from './tasks/sandbox'; import { syncDocs } from './tasks/sync-docs'; import { dev } from './tasks/dev'; import { smokeTest } from './tasks/smoke-test'; -import { build } from './tasks/build'; +import { build, testBuild } from './tasks/build'; import { serve } from './tasks/serve'; import { testRunnerBuild } from './tasks/test-runner-build'; import { testRunnerDev } from './tasks/test-runner-dev'; @@ -103,6 +103,7 @@ export const tasks = { dev, 'smoke-test': smokeTest, build, + 'test-build': testBuild, serve, 'test-runner': testRunnerBuild, 'test-runner-dev': testRunnerDev, diff --git a/scripts/tasks/build.ts b/scripts/tasks/build.ts index 38aadb15fda6..09324edac58d 100644 --- a/scripts/tasks/build.ts +++ b/scripts/tasks/build.ts @@ -48,3 +48,49 @@ export const build: Task = { ); }, }; + +export const testBuild: Task = { + description: 'Build the static version of the sandbox optimized for testing purposes', + dependsOn: ['sandbox'], + async ready({ builtSandboxDir }) { + return pathExists(builtSandboxDir); + }, + async run({ sandboxDir }, { dryRun, debug }) { + const start = now(); + + await exec(`yarn build-storybook --test --quiet`, { cwd: sandboxDir }, { dryRun, debug }); + + const testBuildTime = now() - start; + const dir = join(sandboxDir, 'storybook-static'); + const getSize = promisify(dirSize); + const testBuildSize = await getSize(dir); + const testBuildSbAddonsSize = await getSize(join(dir, 'sb-addons')); + const testBuildSbCommonSize = await getSize(join(dir, 'sb-common-assets')); + const testBuildSbManagerSize = await getSize(join(dir, 'sb-manager')); + const testBuildSbPreviewSize = await getSize(join(dir, 'sb-preview')); + const testBuildPrebuildSize = + testBuildSbAddonsSize + + testBuildSbCommonSize + + testBuildSbManagerSize + + testBuildSbPreviewSize; + + const testBuildStaticSize = await getSize(join(dir, 'static')).catch(() => 0); + const testBuildPreviewSize = testBuildSize - testBuildPrebuildSize - testBuildStaticSize; + + await saveBench( + 'test-build', + { + testBuildTime, + testBuildSize, + testBuildSbAddonsSize, + testBuildSbCommonSize, + testBuildSbManagerSize, + testBuildSbPreviewSize, + testBuildStaticSize, + testBuildPrebuildSize, + testBuildPreviewSize, + }, + { rootDir: sandboxDir } + ); + }, +}; diff --git a/scripts/upload-bench.ts b/scripts/upload-bench.ts index 1b0d570ee821..e841ec363c33 100644 --- a/scripts/upload-bench.ts +++ b/scripts/upload-bench.ts @@ -34,6 +34,15 @@ const defaults: Record = { buildStaticSize: null, buildPrebuildSize: null, buildPreviewSize: null, + testBuildTime: null, + testBuildSize: null, + testBuildSbAddonsSize: null, + testBuildSbCommonSize: null, + testBuildSbManagerSize: null, + testBuildSbPreviewSize: null, + testBuildStaticSize: null, + testBuildPrebuildSize: null, + testBuildPreviewSize: null, devPreviewResponsive: null, devManagerResponsive: null, devManagerHeaderVisible: null,