diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5e53e6db9a..61d4c46aa3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,7 +12,6 @@ on: branches: - master pull_request: - branches: '*' jobs: api: @@ -60,27 +59,63 @@ jobs: with: name: actual-web path: packages/desktop-client/build - - electron: - # As electron builds take longer, we only run them in master. - strategy: - matrix: - os: - - ubuntu-latest - - windows-latest - - macos-latest - runs-on: ${{ matrix.os }} - steps: - - uses: actions/checkout@v3 - - name: Set up environment - uses: ./.github/actions/setup - - name: Build Electron - run: ./bin/package-electron - - name: Upload Build + - name: Upload Build Stats uses: actions/upload-artifact@v3 with: - name: actual-electron-${{ matrix.os }} - path: | - packages/desktop-electron/dist/*.dmg - packages/desktop-electron/dist/*.exe - packages/desktop-electron/dist/*.AppImage + name: build-stats + path: packages/desktop-client/build-stats + + size-compare: + runs-on: ubuntu-latest + needs: [web] + if: github.event_name == 'pull_request' + permissions: + pull-requests: write + steps: + - name: Wait for ${{github.base_ref}} build to succeed + uses: fountainhead/action-wait-for-check@v1.1.0 + id: master-build + with: + token: ${{ secrets.GITHUB_TOKEN }} + checkName: web + ref: ${{github.base_ref}} + + - name: Report build failure + if: steps.master-build.outputs.conclusion == 'failure' + run: | + echo "Build failed on ${{github.base_ref}}" + exit 1 + + - name: Download build artifact from ${{github.base_ref}} + uses: dawidd6/action-download-artifact@v2 + id: pr-build + with: + branch: ${{github.base_ref}} + workflow: build.yml + name: build-stats + path: base + + - name: Download build artifact from PR + uses: actions/download-artifact@v2 + with: + name: build-stats + path: head + + - name: Strip content hashes from stats files + run: | + sed -i -E 's/\.[0-9a-f]{8,}\././g' ./head/*.json + sed -i -E 's/\.[0-9a-f]{8,}\././g' ./base/*.json + + - uses: github/webpack-bundlesize-compare-action@v1.8.1 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + current-stats-json-path: ./head/desktop-client-stats.json + base-stats-json-path: ./base/desktop-client-stats.json + title: desktop-client + + - uses: github/webpack-bundlesize-compare-action@v1.8.1 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + current-stats-json-path: ./head/loot-core-stats.json + base-stats-json-path: ./base/loot-core-stats.json + title: loot-core diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index a840807b27..ff8be9702a 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -5,7 +5,6 @@ on: branches: - master pull_request: - branches: '*' jobs: lint: diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index e8acaedaa5..cd03f44366 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -4,7 +4,6 @@ on: push: branches: [master] pull_request: - branches: [master] schedule: - cron: '23 11 * * 6' diff --git a/.github/workflows/electron.yml b/.github/workflows/electron.yml new file mode 100644 index 0000000000..795b398d40 --- /dev/null +++ b/.github/workflows/electron.yml @@ -0,0 +1,38 @@ +name: Electron + +defaults: + run: + shell: bash + +env: + CI: true + +on: + push: + branches: + - master + pull_request: + +jobs: + build: + strategy: + matrix: + os: + - ubuntu-latest + - windows-latest + - macos-latest + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v3 + - name: Set up environment + uses: ./.github/actions/setup + - name: Build Electron + run: ./bin/package-electron + - name: Upload Build + uses: actions/upload-artifact@v3 + with: + name: actual-electron-${{ matrix.os }} + path: | + packages/desktop-electron/dist/*.dmg + packages/desktop-electron/dist/*.exe + packages/desktop-electron/dist/*.AppImage diff --git a/.github/workflows/release-notes.yml b/.github/workflows/release-notes.yml index c8e6b9896c..bfe2707c46 100644 --- a/.github/workflows/release-notes.yml +++ b/.github/workflows/release-notes.yml @@ -2,7 +2,6 @@ name: Release notes on: pull_request: - branches: '*' jobs: release-notes: diff --git a/packages/desktop-client/.gitignore b/packages/desktop-client/.gitignore index 652b554f3f..01f23e014c 100644 --- a/packages/desktop-client/.gitignore +++ b/packages/desktop-client/.gitignore @@ -9,6 +9,7 @@ test-results # production build +build-stats # misc .DS_Store diff --git a/packages/desktop-client/bin/build-browser b/packages/desktop-client/bin/build-browser index 140b981bbd..605fe52448 100755 --- a/packages/desktop-client/bin/build-browser +++ b/packages/desktop-client/bin/build-browser @@ -15,3 +15,8 @@ export REACT_APP_BACKEND_WORKER_HASH=`ls "$ROOT"/../public/kcab/kcab.worker.*.js export REACT_APP_ACTUAL_VERSION="$VERSION" yarn build + +rm -fr build-stats +mkdir build-stats +mv build/kcab/stats.json build-stats/loot-core-stats.json +mv build/stats.json build-stats/desktop-client-stats.json diff --git a/packages/desktop-client/config-overrides.js b/packages/desktop-client/config-overrides.js index 68e9ad7b2d..360c870318 100644 --- a/packages/desktop-client/config-overrides.js +++ b/packages/desktop-client/config-overrides.js @@ -1,11 +1,13 @@ const path = require('path'); const { + addWebpackPlugin, addWebpackResolve, + babelInclude, override, overrideDevServer, - babelInclude, } = require('customize-cra'); +const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer'); if (process.env.CI) { process.env.DISABLE_ESLINT_PLUGIN = 'true'; @@ -27,6 +29,12 @@ module.exports = { '.tsx', ], }), + addWebpackPlugin( + new BundleAnalyzerPlugin({ + analyzerMode: 'disabled', + generateStatsFile: true, + }), + ), config => { config.cache = false; return config; diff --git a/packages/desktop-client/package.json b/packages/desktop-client/package.json index 231b030ac2..3c331da7c2 100644 --- a/packages/desktop-client/package.json +++ b/packages/desktop-client/package.json @@ -21,6 +21,7 @@ "@types/react-dom": "^18.2.1", "@types/react-modal": "^3.16.0", "@types/react-router-dom": "^5.3.3", + "@types/webpack-bundle-analyzer": "^4.6.0", "cross-env": "^7.0.3", "customize-cra": "^1.0.0", "date-fns": "^2.29.3", @@ -49,7 +50,8 @@ "react-virtualized-auto-sizer": "^1.0.2", "redux": "^4.0.5", "redux-thunk": "^2.3.0", - "victory": "^36.6.8" + "victory": "^36.6.8", + "webpack-bundle-analyzer": "^4.9.0" }, "scripts": { "start": "cross-env PORT=3001 react-app-rewired start", diff --git a/packages/loot-core/package.json b/packages/loot-core/package.json index 4624668f58..2abe13dc74 100644 --- a/packages/loot-core/package.json +++ b/packages/loot-core/package.json @@ -51,6 +51,7 @@ "@types/jlongster__sql.js": "npm:@types/sql.js@latest", "@types/pegjs": "^0.10.3", "@types/webpack": "^5.28.0", + "@types/webpack-bundle-analyzer": "^4.6.0", "adm-zip": "^0.5.9", "babel-loader": "^9.1.2", "buffer": "^6.0.3", @@ -75,6 +76,7 @@ "typescript": "^4.6.4", "uuid": "3.3.2", "webpack": "^5.86.0", + "webpack-bundle-analyzer": "^4.9.0", "webpack-cli": "^5.1.3", "ws": "^4.1.0", "yargs": "^9.0.1" diff --git a/packages/loot-core/webpack/webpack.browser.config.js b/packages/loot-core/webpack/webpack.browser.config.js index e11b057af1..61fd1c294b 100644 --- a/packages/loot-core/webpack/webpack.browser.config.js +++ b/packages/loot-core/webpack/webpack.browser.config.js @@ -1,6 +1,7 @@ let path = require('path'); let webpack = require('webpack'); +const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer'); /** @type {webpack.Configuration} */ module.exports = { @@ -85,5 +86,9 @@ module.exports = { new webpack.IgnorePlugin({ resourceRegExp: /worker_threads|original-fs/, }), + new BundleAnalyzerPlugin({ + analyzerMode: 'disabled', + generateStatsFile: true, + }), ], }; diff --git a/packages/loot-core/webpack/webpack.desktop.config.js b/packages/loot-core/webpack/webpack.desktop.config.js index 4e66f01f99..9a509a45d2 100644 --- a/packages/loot-core/webpack/webpack.desktop.config.js +++ b/packages/loot-core/webpack/webpack.desktop.config.js @@ -1,6 +1,7 @@ let path = require('path'); let webpack = require('webpack'); +const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer'); let browser = require('./webpack.browser.config'); @@ -39,6 +40,10 @@ module.exports = { new webpack.IgnorePlugin({ resourceRegExp: /original-fs/, }), + new BundleAnalyzerPlugin({ + analyzerMode: 'disabled', + generateStatsFile: true, + }), ], node: { __dirname: false, diff --git a/upcoming-release-notes/1205.md b/upcoming-release-notes/1205.md new file mode 100644 index 0000000000..897ba878dd --- /dev/null +++ b/upcoming-release-notes/1205.md @@ -0,0 +1,6 @@ +--- +category: Maintenance +authors: [j-f1] +--- + +Display bundle size changes in comments on opened PRs diff --git a/yarn.lock b/yarn.lock index ef6aa30d69..337413a52d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -84,6 +84,7 @@ __metadata: "@types/react-dom": ^18.2.1 "@types/react-modal": ^3.16.0 "@types/react-router-dom": ^5.3.3 + "@types/webpack-bundle-analyzer": ^4.6.0 cross-env: ^7.0.3 customize-cra: ^1.0.0 date-fns: ^2.29.3 @@ -113,6 +114,7 @@ __metadata: redux: ^4.0.5 redux-thunk: ^2.3.0 victory: ^36.6.8 + webpack-bundle-analyzer: ^4.9.0 languageName: unknown linkType: soft @@ -1964,7 +1966,7 @@ __metadata: languageName: node linkType: hard -"@discoveryjs/json-ext@npm:^0.5.0": +"@discoveryjs/json-ext@npm:0.5.7, @discoveryjs/json-ext@npm:^0.5.0": version: 0.5.7 resolution: "@discoveryjs/json-ext@npm:0.5.7" checksum: 2176d301cc258ea5c2324402997cf8134ebb212469c0d397591636cea8d3c02f2b3cf9fd58dcb748c7a0dade77ebdc1b10284fa63e608c033a1db52fddc69918 @@ -2801,6 +2803,13 @@ __metadata: languageName: node linkType: hard +"@polka/url@npm:^1.0.0-next.20": + version: 1.0.0-next.21 + resolution: "@polka/url@npm:1.0.0-next.21" + checksum: c7654046d38984257dd639eab3dc770d1b0340916097b2fac03ce5d23506ada684e05574a69b255c32ea6a144a957c8cd84264159b545fca031c772289d88788 + languageName: node + linkType: hard + "@reach/auto-id@npm:0.18.0": version: 0.18.0 resolution: "@reach/auto-id@npm:0.18.0" @@ -4467,6 +4476,17 @@ __metadata: languageName: node linkType: hard +"@types/webpack-bundle-analyzer@npm:^4.6.0": + version: 4.6.0 + resolution: "@types/webpack-bundle-analyzer@npm:4.6.0" + dependencies: + "@types/node": "*" + tapable: ^2.2.0 + webpack: ^5 + checksum: 1cd5baa621a1dbe820bacf981d6e48f3423b733fb5e33c1356347e73d5e3e880ae6ebacf8f43d9e47e135d3ed2653ec5e40e12c6ce187f2eb3f548d9c949f6aa + languageName: node + linkType: hard + "@types/webpack@npm:^5.28.0": version: 5.28.1 resolution: "@types/webpack@npm:5.28.1" @@ -4940,7 +4960,7 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^8.1.1": +"acorn-walk@npm:^8.0.0, acorn-walk@npm:^8.1.1": version: 8.2.0 resolution: "acorn-walk@npm:8.2.0" checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 @@ -4956,6 +4976,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.0.4": + version: 8.9.0 + resolution: "acorn@npm:8.9.0" + bin: + acorn: bin/acorn + checksum: 25dfb94952386ecfb847e61934de04a4e7c2dc21c2e700fc4e2ef27ce78cb717700c4c4f279cd630bb4774948633c3859fc16063ec8573bda4568e0a312e6744 + languageName: node + linkType: hard + "acorn@npm:^8.2.4, acorn@npm:^8.4.1, acorn@npm:^8.5.0, acorn@npm:^8.7.1, acorn@npm:^8.8.0": version: 8.8.2 resolution: "acorn@npm:8.8.2" @@ -12307,6 +12336,7 @@ __metadata: "@types/jlongster__sql.js": "npm:@types/sql.js@latest" "@types/pegjs": ^0.10.3 "@types/webpack": ^5.28.0 + "@types/webpack-bundle-analyzer": ^4.6.0 absurd-sql: 0.0.53 adm-zip: ^0.5.9 assert: ^2.0.0 @@ -12346,6 +12376,7 @@ __metadata: typescript: ^4.6.4 uuid: 3.3.2 webpack: ^5.86.0 + webpack-bundle-analyzer: ^4.9.0 webpack-cli: ^5.1.3 ws: ^4.1.0 yargs: ^9.0.1 @@ -12839,6 +12870,13 @@ __metadata: languageName: node linkType: hard +"mrmime@npm:^1.0.0": + version: 1.0.1 + resolution: "mrmime@npm:1.0.1" + checksum: cc979da44bbbffebaa8eaf7a45117e851f2d4cb46a3ada6ceb78130466a04c15a0de9a9ce1c8b8ba6f6e1b8618866b1352992bf1757d241c0ddca558b9f28a77 + languageName: node + linkType: hard + "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" @@ -13374,6 +13412,15 @@ __metadata: languageName: node linkType: hard +"opener@npm:^1.5.2": + version: 1.5.2 + resolution: "opener@npm:1.5.2" + bin: + opener: bin/opener-bin.js + checksum: 33b620c0d53d5b883f2abc6687dd1c5fd394d270dbe33a6356f2d71e0a2ec85b100d5bac94694198ccf5c30d592da863b2292c5539009c715a9c80c697b4f6cc + languageName: node + linkType: hard + "optionator@npm:^0.8.1": version: 0.8.3 resolution: "optionator@npm:0.8.3" @@ -16308,6 +16355,17 @@ __metadata: languageName: node linkType: hard +"sirv@npm:^1.0.7": + version: 1.0.19 + resolution: "sirv@npm:1.0.19" + dependencies: + "@polka/url": ^1.0.0-next.20 + mrmime: ^1.0.0 + totalist: ^1.0.0 + checksum: c943cfc61baf85f05f125451796212ec35d4377af4da90ae8ec1fa23e6d7b0b4d9c74a8fbf65af83c94e669e88a09dc6451ba99154235eead4393c10dda5b07c + languageName: node + linkType: hard + "sisteransi@npm:^1.0.5": version: 1.0.5 resolution: "sisteransi@npm:1.0.5" @@ -17327,6 +17385,13 @@ __metadata: languageName: node linkType: hard +"totalist@npm:^1.0.0": + version: 1.1.0 + resolution: "totalist@npm:1.1.0" + checksum: dfab80c7104a1d170adc8c18782d6c04b7df08352dec452191208c66395f7ef2af7537ddfa2cf1decbdcfab1a47afbbf0dec6543ea191da98c1c6e1599f86adc + languageName: node + linkType: hard + "tough-cookie@npm:^4.0.0": version: 4.1.2 resolution: "tough-cookie@npm:4.1.2" @@ -18503,6 +18568,26 @@ __metadata: languageName: node linkType: hard +"webpack-bundle-analyzer@npm:^4.9.0": + version: 4.9.0 + resolution: "webpack-bundle-analyzer@npm:4.9.0" + dependencies: + "@discoveryjs/json-ext": 0.5.7 + acorn: ^8.0.4 + acorn-walk: ^8.0.0 + chalk: ^4.1.0 + commander: ^7.2.0 + gzip-size: ^6.0.0 + lodash: ^4.17.20 + opener: ^1.5.2 + sirv: ^1.0.7 + ws: ^7.3.1 + bin: + webpack-bundle-analyzer: lib/bin/analyzer.js + checksum: e439aea4e88e18bfdc16eb69782c1bb17b2e581905a5cfa8d34058dc6677f6e202f896189268e58b49fa14ae12f5ef4c25cdca9f98f3de7e6699ac62def2f0af + languageName: node + linkType: hard + "webpack-cli@npm:^5.1.3": version: 5.1.3 resolution: "webpack-cli@npm:5.1.3" @@ -19164,7 +19249,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^7.4.6": +"ws@npm:^7.3.1, ws@npm:^7.4.6": version: 7.5.9 resolution: "ws@npm:7.5.9" peerDependencies: