From 5c13ff3b2ecc28e0d7b8090986c838268ea0fd60 Mon Sep 17 00:00:00 2001 From: Feiyang1 Date: Fri, 6 Mar 2020 13:28:31 -0800 Subject: [PATCH 1/6] size presubmit check --- .github/workflows/test-all.yml | 2 + .github/workflows/test-changed.yml | 2 + package.json | 3 +- scripts/report_binary_size.js | 93 ++++++++++++++++++++++++++++++ 4 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 scripts/report_binary_size.js diff --git a/.github/workflows/test-all.yml b/.github/workflows/test-all.yml index 97849d8e41c..f026581403c 100644 --- a/.github/workflows/test-all.yml +++ b/.github/workflows/test-all.yml @@ -40,6 +40,8 @@ jobs: github-token: ${{ secrets.GITHUB_TOKEN }} path-to-lcov: ./lcov-all.info continue-on-error: true + - name: Generate Size Report + run: yarn size-report deploy: name: Canary Deploy runs-on: ubuntu-latest diff --git a/.github/workflows/test-changed.yml b/.github/workflows/test-changed.yml index ffe2e9aa4eb..afca6c3b1ee 100644 --- a/.github/workflows/test-changed.yml +++ b/.github/workflows/test-changed.yml @@ -28,3 +28,5 @@ jobs: run: yarn build - name: Run tests on changed packages run: xvfb-run yarn test:changed + - name: Generate Size Report + run: yarn size-report diff --git a/package.json b/package.json index ef85fc379c4..eea6e573bf1 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,8 @@ "docgen:node": "node scripts/docgen/generate-docs.js --api node", "docgen": "yarn docgen:js; yarn docgen:node", "prettier": "prettier --config .prettierrc --write '**/*.{ts,js}'", - "lint": "lerna run --scope @firebase/* --scope rxfire lint" + "lint": "lerna run --scope @firebase/* --scope rxfire lint", + "size-report": "node scripts/report_binary_size.js" }, "repository": { "type": "git", diff --git a/scripts/report_binary_size.js b/scripts/report_binary_size.js new file mode 100644 index 00000000000..ed09c221b1c --- /dev/null +++ b/scripts/report_binary_size.js @@ -0,0 +1,93 @@ +const { resolve } = require('path'); +const fs = require('fs'); +const { execSync } = require('child_process'); + +const repoRoot = resolve(__dirname, '..'); + +const commitHash = process.env.GITHUB_SHA || execSync('git rev-parse HEAD').toString(); +const runId = process.env.GITHUB_RUN_ID || 'local-run-id'; + +// CDN scripts +function generateReportForCDNScripts() { + const reports = []; + const firebaseRoot = resolve(__dirname, '../packages/firebase'); + const pkgJson = require(`${firebaseRoot}/package.json`); + + const special_files = [ + 'firebase-performance-standalone.es2017.js', + 'firebase-performance-standalone.js', + 'firebase.js' + ]; + + const files = [ + ...special_files.map(file => `${firebaseRoot}/${file}`), + ...pkgJson.components.map(component => `${firebaseRoot}/firebase-${component}.js`) + ]; + + for (const file of files) { + const { size } = fs.statSync(file); + const fileName = file.split('/').slice(-1)[0] + reports.push(makeReportObject('firebase', fileName, size)) + } + + return reports; +} + +// @firebase/* +function generateReportForNPMPacakges() { + const reports = []; + const fields = [ + 'main', + 'module', + 'esm2017', + 'browser', + 'react-native', + 'lite', + 'lite-esm2017' + ]; + + const packageInfo = JSON.parse( + execSync('npx lerna ls --json --scope @firebase/*', { cwd: repoRoot }).toString() + ); + + for (const package of packageInfo) { + const packageJson = require(`${package.location}/package.json`); + + for (const field of fields) { + if (packageJson[field]) { + const filePath = `${package.location}/${packageJson[field]}`; + const { size } = fs.statSync(filePath); + reports.push(makeReportObject(packageJson.name, field, size)); + } + } + } + + return reports; +} + +function makeReportObject(sdk, type, value) { + return { + sdk, + type, + value + }; +} + +function generateSizeReport() { + const reports = [ + ...generateReportForCDNScripts(), + ...generateReportForNPMPacakges() + ]; + + for (const r of reports) { + console.log(r.sdk, r.type, r.value); + } + + return { + log: "https://www.goog.com", + metric: "BinarySize", + results: reports + }; +} + +generateSizeReport(); From c06eea00089a09dbb109263012fd34b3a32ebd4b Mon Sep 17 00:00:00 2001 From: Feiyang1 Date: Mon, 9 Mar 2020 14:44:33 -0700 Subject: [PATCH 2/6] add missing semicolons --- scripts/report_binary_size.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/report_binary_size.js b/scripts/report_binary_size.js index ed09c221b1c..3b6f98acc51 100644 --- a/scripts/report_binary_size.js +++ b/scripts/report_binary_size.js @@ -26,8 +26,8 @@ function generateReportForCDNScripts() { for (const file of files) { const { size } = fs.statSync(file); - const fileName = file.split('/').slice(-1)[0] - reports.push(makeReportObject('firebase', fileName, size)) + const fileName = file.split('/').slice(-1)[0]; + reports.push(makeReportObject('firebase', fileName, size)); } return reports; From 1c34983906824951eab6be9d44dc725fa374ed83 Mon Sep 17 00:00:00 2001 From: Feiyang1 Date: Mon, 9 Mar 2020 14:51:54 -0700 Subject: [PATCH 3/6] report github action url --- scripts/report_binary_size.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/scripts/report_binary_size.js b/scripts/report_binary_size.js index 3b6f98acc51..32a5c1212e3 100644 --- a/scripts/report_binary_size.js +++ b/scripts/report_binary_size.js @@ -33,8 +33,8 @@ function generateReportForCDNScripts() { return reports; } -// @firebase/* -function generateReportForNPMPacakges() { +// NPM packages +function generateReportForNPMPackages() { const reports = []; const fields = [ 'main', @@ -76,15 +76,17 @@ function makeReportObject(sdk, type, value) { function generateSizeReport() { const reports = [ ...generateReportForCDNScripts(), - ...generateReportForNPMPacakges() + ...generateReportForNPMPackages() ]; for (const r of reports) { console.log(r.sdk, r.type, r.value); } + console.log(`Github Action URL: https://github.com/firebase/firebase-js-sdk/actions/runs/${runId}`); + return { - log: "https://www.goog.com", + log: `https://github.com/firebase/firebase-js-sdk/actions/runs/${runId}`, metric: "BinarySize", results: reports }; From 6266328e0c6dfcbfc8ede5eebfd2bcc63436ed96 Mon Sep 17 00:00:00 2001 From: Yifan Yang Date: Tue, 10 Mar 2020 20:19:35 -0700 Subject: [PATCH 4/6] Upload size report to the metrics service. --- .github/workflows/test-all.yml | 4 +- .github/workflows/test-changed.yml | 26 ++++++++++- scripts/report_binary_size.js | 69 ++++++++++++++++++++++++++---- 3 files changed, 86 insertions(+), 13 deletions(-) diff --git a/.github/workflows/test-all.yml b/.github/workflows/test-all.yml index f026581403c..5365dbc6f3a 100644 --- a/.github/workflows/test-all.yml +++ b/.github/workflows/test-all.yml @@ -1,6 +1,6 @@ name: Run All Tests -on: +on: pull_request: branches: - master @@ -40,8 +40,6 @@ jobs: github-token: ${{ secrets.GITHUB_TOKEN }} path-to-lcov: ./lcov-all.info continue-on-error: true - - name: Generate Size Report - run: yarn size-report deploy: name: Canary Deploy runs-on: ubuntu-latest diff --git a/.github/workflows/test-changed.yml b/.github/workflows/test-changed.yml index afca6c3b1ee..71859e21ab2 100644 --- a/.github/workflows/test-changed.yml +++ b/.github/workflows/test-changed.yml @@ -28,5 +28,27 @@ jobs: run: yarn build - name: Run tests on changed packages run: xvfb-run yarn test:changed - - name: Generate Size Report - run: yarn size-report + + health-metrics-test: + name: Health Metrics Test + runs-on: ubuntu-latest + env: + METRICS_SERVICE_URL: ${{ secrets.METRICS_SERVICE_URL }} + GITHUB_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} + GITHUB_PULL_REQUEST_BASE_SHA: ${{ github.event.pull_request.base.sha }} + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: 10.x + - uses: GoogleCloudPlatform/github-actions/setup-gcloud@master + with: + service_account_key: ${{ secrets.GCP_SA_KEY }} + - run: cp config/ci.config.json config/project.json + - run: yarn install + - run: yarn build + + - name: Run health-metrics/binary-size test + run: yarn size-report + + # TODO(yifany): Enable startup times testing on CI. diff --git a/scripts/report_binary_size.js b/scripts/report_binary_size.js index 32a5c1212e3..6a9b11bfd36 100644 --- a/scripts/report_binary_size.js +++ b/scripts/report_binary_size.js @@ -1,29 +1,31 @@ const { resolve } = require('path'); const fs = require('fs'); const { execSync } = require('child_process'); +const https = require('https'); const repoRoot = resolve(__dirname, '..'); -const commitHash = process.env.GITHUB_SHA || execSync('git rev-parse HEAD').toString(); const runId = process.env.GITHUB_RUN_ID || 'local-run-id'; +const METRICS_SERVICE_URL = process.env.METRICS_SERVICE_URL; + // CDN scripts function generateReportForCDNScripts() { const reports = []; const firebaseRoot = resolve(__dirname, '../packages/firebase'); const pkgJson = require(`${firebaseRoot}/package.json`); - + const special_files = [ 'firebase-performance-standalone.es2017.js', 'firebase-performance-standalone.js', 'firebase.js' ]; - + const files = [ - ...special_files.map(file => `${firebaseRoot}/${file}`), + ...special_files.map(file => `${firebaseRoot}/${file}`), ...pkgJson.components.map(component => `${firebaseRoot}/firebase-${component}.js`) ]; - + for (const file of files) { const { size } = fs.statSync(file); const fileName = file.split('/').slice(-1)[0]; @@ -83,13 +85,64 @@ function generateSizeReport() { console.log(r.sdk, r.type, r.value); } - console.log(`Github Action URL: https://github.com/firebase/firebase-js-sdk/actions/runs/${runId}`); + console.log(`Github Action URL: https://github.com/${process.env.GITHUB_REPOSITORY}/actions/runs/${runId}`); return { - log: `https://github.com/firebase/firebase-js-sdk/actions/runs/${runId}`, + log: `https://github.com/${process.env.GITHUB_REPOSITORY}/actions/runs/${runId}`, metric: "BinarySize", results: reports }; } -generateSizeReport(); +function constructRequestPath() { + const repo = process.env.GITHUB_REPOSITORY; + const commit = process.env.GITHUB_SHA; + let path = `/repos/${repo}/commits/${commit}/reports`; + if (process.env.GITHUB_EVENT_NAME === 'pull_request') { + const pullRequestNumber = process.env.GITHUB_PULL_REQUEST_NUMBER; + const pullRequestBaseSha = process.env.GITHUB_PULL_REQUEST_BASE_SHA; + path += `?pull_request=${pullRequestNumber}&base_commit=${pullRequestBaseSha}`; + } + return path; +} + +function constructRequestOptions(path) { + const accessToken = execSync('gcloud auth print-identity-token', { encoding: 'utf8' }).trim(); + return { + path: path, + method: 'POST', + headers: { + 'Authorization': `Bearer ${accessToken}`, + 'Content-Type': 'application/json' + } + }; +} + +function upload(report) { + if (!process.env.GITHUB_ACTIONS) { + console.log('Metrics upload is only enabled on CI.'); + return; + } + + const path = constructRequestPath(); + const options = constructRequestOptions(path); + + console.log(`${report.metric} report:`, report); + console.log(`Posting to metrics service endpoint: ${path} ...`); + + const request = https.request(METRICS_SERVICE_URL, options, response => { + response.setEncoding('utf8'); + console.log(`Response status code: ${response.statusCode}`); + response.on('data', console.log); + response.on('end', () => { + if (response.statusCode !== 202) { + process.exit(1); + } + }) + }); + request.write(JSON.stringify(report)); + request.end(); +} + +const report = generateSizeReport(); +upload(report); From 7b129c91f0ce838dffd63009462e5885752a5ff3 Mon Sep 17 00:00:00 2001 From: Yifan Yang Date: Thu, 19 Mar 2020 16:10:05 -0700 Subject: [PATCH 5/6] Cosmetic change. --- .github/workflows/health-metrics-test.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/health-metrics-test.yml b/.github/workflows/health-metrics-test.yml index 1ac954dc7ef..b10eb498ad2 100644 --- a/.github/workflows/health-metrics-test.yml +++ b/.github/workflows/health-metrics-test.yml @@ -1,10 +1,10 @@ -name: Health Metrics Test +name: Health Metrics on: [push, pull_request] jobs: - health-metrics-test: - name: Health Metrics Test + binary-size-test: + name: Binary Size runs-on: ubuntu-latest env: METRICS_SERVICE_URL: ${{ secrets.METRICS_SERVICE_URL }} @@ -25,4 +25,4 @@ jobs: - name: Run health-metrics/binary-size test run: yarn size-report - # TODO(yifany): Enable startup times testing on CI. + # TODO(yifany): Enable startup times testing on CI. From 573e4f20f9df24cd55b157bdfd9622e2c9f4c00a Mon Sep 17 00:00:00 2001 From: Feiyang Date: Mon, 23 Mar 2020 17:13:05 -0700 Subject: [PATCH 6/6] get size without comments and whitespaces for NPM scripts (#2777) * get size without comments and whitespaces for NPM scripts * use single quotes * update lock file --- package.json | 3 ++- scripts/report_binary_size.js | 15 ++++++++++++++- yarn.lock | 17 ++++------------- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index fa2977081af..b608077c290 100644 --- a/package.json +++ b/package.json @@ -122,6 +122,7 @@ "watch": "1.0.2", "webpack": "4.42.0", "yargs": "15.3.1", - "lodash": "4.17.15" + "lodash": "4.17.15", + "terser": "4.6.7" } } diff --git a/scripts/report_binary_size.js b/scripts/report_binary_size.js index 6a9b11bfd36..bdb01c92664 100644 --- a/scripts/report_binary_size.js +++ b/scripts/report_binary_size.js @@ -2,6 +2,7 @@ const { resolve } = require('path'); const fs = require('fs'); const { execSync } = require('child_process'); const https = require('https'); +const terser = require('terser'); const repoRoot = resolve(__dirname, '..'); @@ -58,7 +59,19 @@ function generateReportForNPMPackages() { for (const field of fields) { if (packageJson[field]) { const filePath = `${package.location}/${packageJson[field]}`; - const { size } = fs.statSync(filePath); + + const rawCode = fs.readFileSync(filePath, 'utf-8'); + + // remove comments and whitespaces, then get size + const { code } = terser.minify(rawCode, { + output: { + comments: false + }, + mangle: false, + compress: false + }); + + const size = Buffer.byteLength(code, 'utf-8') reports.push(makeReportObject(packageJson.name, field, size)); } } diff --git a/yarn.lock b/yarn.lock index 9781aff41bf..6c4011c919d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13986,19 +13986,10 @@ terser-webpack-plugin@^1.4.3: webpack-sources "^1.4.0" worker-farm "^1.7.0" -terser@^4.1.2: - version "4.3.8" - resolved "https://registry.npmjs.org/terser/-/terser-4.3.8.tgz#707f05f3f4c1c70c840e626addfdb1c158a17136" - integrity sha512-otmIRlRVmLChAWsnSFNO0Bfk6YySuBp6G9qrHiJwlLDd4mxe2ta4sjI7TzIR+W1nBMjilzrMcPOz9pSusgx3hQ== - dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" - -terser@^4.6.2: - version "4.6.6" - resolved "https://registry.npmjs.org/terser/-/terser-4.6.6.tgz#da2382e6cafbdf86205e82fb9a115bd664d54863" - integrity sha512-4lYPyeNmstjIIESr/ysHg2vUPRGf2tzF9z2yYwnowXVuVzLEamPN1Gfrz7f8I9uEPuHcbFlW4PLIAsJoxXyJ1g== +terser@4.6.7, terser@^4.1.2, terser@^4.6.2: + version "4.6.7" + resolved "https://registry.npmjs.org/terser/-/terser-4.6.7.tgz#478d7f9394ec1907f0e488c5f6a6a9a2bad55e72" + integrity sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g== dependencies: commander "^2.20.0" source-map "~0.6.1"