From 94aefd5d71eb4db8dd2aeeb2318b0fb55cea9b05 Mon Sep 17 00:00:00 2001 From: heliocliu <59622401+heliocliu@users.noreply.github.com> Date: Wed, 28 Oct 2020 18:42:04 -0700 Subject: [PATCH 1/2] expose data/helpers to check for no changes --- .../src/ADO/AdoSizeComparator.ts | 31 ++++++++++--------- .../bundle-size-tools/src/BundleBuddyTypes.ts | 9 ++++++ tools/bundle-size-tools/src/compareBundles.ts | 19 ++++++++++++ 3 files changed, 44 insertions(+), 15 deletions(-) diff --git a/tools/bundle-size-tools/src/ADO/AdoSizeComparator.ts b/tools/bundle-size-tools/src/ADO/AdoSizeComparator.ts index d915d3f69adb..5b2c62f29118 100644 --- a/tools/bundle-size-tools/src/ADO/AdoSizeComparator.ts +++ b/tools/bundle-size-tools/src/ADO/AdoSizeComparator.ts @@ -6,6 +6,7 @@ import { WebApi } from 'azure-devops-node-api'; import JSZip from 'jszip'; import { join } from 'path'; +import { BundleComparison, BundleComparisonResult } from '../BundleBuddyTypes'; import { getBaselineCommit, getBuilds, getPriorCommit } from '../utilities'; import { BuildStatus, BuildResult } from 'azure-devops-node-api/interfaces/BuildInterfaces'; import { IADOConstants } from './Constants'; @@ -75,9 +76,10 @@ export class ADOSizeComparator { * Create a size comparison message that can be posted to a PR * @param tagWaiting - If the build should be tagged to be updated when the baseline * build completes (if it wasn't already complete when the comparison runs) - * @returns The size comparison message + * @returns The size comparison result with formatted message and raw data. In case + * of failure, the message contains the error message and the raw data will be undefined. */ - public async createSizeComparisonMessage(tagWaiting: boolean): Promise { + public async createSizeComparisonMessage(tagWaiting: boolean): Promise { let baselineCommit: string | undefined = getBaselineCommit(); console.log(`The baseline commit for this PR is ${baselineCommit}`); @@ -103,7 +105,7 @@ export class ADOSizeComparator { if (baselineBuild.id === undefined) { const message = `Baseline build does not have a build id`; console.log(message); - return message; + return { message, comparison: undefined }; } // Baseline build is pending @@ -115,7 +117,7 @@ export class ADOSizeComparator { this.tagBuildAsWaiting(baselineCommit); } - return message; + return { message, comparison: undefined }; } // Baseline build failed @@ -125,7 +127,7 @@ export class ADOSizeComparator { baselineCommit ); console.log(message); - return message; + return { message, comparison: undefined }; } // Baseline build succeeded @@ -153,12 +155,16 @@ export class ADOSizeComparator { if (baselineCommit === undefined || baselineZip === undefined) { const message = `Could not find a usable baseline build with search starting at CI ${getBaselineCommit()}`; console.log(message); - return message; + return { message, comparison: undefined }; } - const message = await this.createMessageFromZip(baselineCommit, baselineZip); + const comparison: BundleComparison[] = await this.createComparisonFromZip(baselineCommit, baselineZip); + console.log(JSON.stringify(comparison)); + + const message = getCommentForBundleDiff(comparison, baselineCommit); console.log(message); - return message; + + return { message, comparison }; } private async tagBuildAsWaiting(baselineCommit: string): Promise { @@ -173,7 +179,7 @@ export class ADOSizeComparator { } } - private async createMessageFromZip(baselineCommit: string, baselineZip: JSZip): Promise { + private async createComparisonFromZip(baselineCommit: string, baselineZip: JSZip): Promise { const baselineZipBundlePaths = getBundlePathsFromZipObject(baselineZip); const prBundleFileSystemPaths = await getBundlePathsFromFileSystem(this.localReportPath); @@ -198,11 +204,6 @@ export class ADOSizeComparator { statsProcessors: DefaultStatsProcessors }); - const bundleComparisons = compareBundles(baselineSummaries, prSummaries); - - console.log(JSON.stringify(bundleComparisons)); - - const message = getCommentForBundleDiff(bundleComparisons, baselineCommit); - return message; + return compareBundles(baselineSummaries, prSummaries); } } diff --git a/tools/bundle-size-tools/src/BundleBuddyTypes.ts b/tools/bundle-size-tools/src/BundleBuddyTypes.ts index f0b45d583f5b..722a06d4dd80 100644 --- a/tools/bundle-size-tools/src/BundleBuddyTypes.ts +++ b/tools/bundle-size-tools/src/BundleBuddyTypes.ts @@ -32,6 +32,15 @@ export interface BundleComparison { commonBundleMetrics: { [key: string]: { baseline: BundleMetric; compare: BundleMetric } }; } +/** + * The formatted message string of a bundle comparison along with the + * comparison data itself + */ +export type BundleComparisonResult = { + message: string, + comparison: BundleComparison[] | undefined, +}; + /** * Functions used to process a webpack stats file and produce a set of metrics. Some processors may choose * to work off a bundle specific config file. Note that these config files are optional, so not all bundles diff --git a/tools/bundle-size-tools/src/compareBundles.ts b/tools/bundle-size-tools/src/compareBundles.ts index fd139f62231a..a041b9f88a49 100644 --- a/tools/bundle-size-tools/src/compareBundles.ts +++ b/tools/bundle-size-tools/src/compareBundles.ts @@ -37,3 +37,22 @@ export function compareBundles(baseline: BundleSummaries, compare: BundleSummari return results; } + +/** + * Checks if a bundle comparison contains no size changes + * @param comparisons + */ +export function bundlesContainNoChanges(comparisons: BundleComparison[]): boolean { + for (let i = 0; i < comparisons.length; i++) { + const { commonBundleMetrics } = comparisons[i]; + let metrics = Object.entries(commonBundleMetrics); + for (let j = 0; j < metrics.length; j++) { + const [ , { baseline, compare }] = metrics[j]; + if (baseline.parsedSize !== compare.parsedSize) { + return false; + } + } + } + + return true; +} From 5bd7970b9fb9c07551a66ea9bc31a0a008bac4fb Mon Sep 17 00:00:00 2001 From: heliocliu <59622401+heliocliu@users.noreply.github.com> Date: Thu, 29 Oct 2020 14:15:21 -0700 Subject: [PATCH 2/2] fix bad looping --- tools/bundle-size-tools/src/compareBundles.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tools/bundle-size-tools/src/compareBundles.ts b/tools/bundle-size-tools/src/compareBundles.ts index a041b9f88a49..594429187291 100644 --- a/tools/bundle-size-tools/src/compareBundles.ts +++ b/tools/bundle-size-tools/src/compareBundles.ts @@ -43,11 +43,9 @@ export function compareBundles(baseline: BundleSummaries, compare: BundleSummari * @param comparisons */ export function bundlesContainNoChanges(comparisons: BundleComparison[]): boolean { - for (let i = 0; i < comparisons.length; i++) { - const { commonBundleMetrics } = comparisons[i]; - let metrics = Object.entries(commonBundleMetrics); - for (let j = 0; j < metrics.length; j++) { - const [ , { baseline, compare }] = metrics[j]; + for (const { commonBundleMetrics } of comparisons) { + let metrics = Object.values(commonBundleMetrics); + for (const { baseline, compare } of metrics) { if (baseline.parsedSize !== compare.parsedSize) { return false; }