Compare commits

...

7 Commits

Author SHA1 Message Date
Uladzimir Havenchyk
e406d303c3 disable caching 2025-11-17 22:11:10 +03:00
Uladzimir Havenchyk
50a62844d6 Merge branch 'master' into caching-for-build 2025-11-17 17:29:56 +03:00
Uladzimir Havenchyk
6009ba9021 test caching 2025-11-17 14:15:59 +03:00
Uladzimir Havenchyk
dea2dad41a test caching 2025-11-17 14:05:09 +03:00
Uladzimir Havenchyk
a427a40cbf test caching 2025-11-17 13:50:24 +03:00
Uladzimir Havenchyk
0451433801 setup wireit caching 2025-11-17 13:34:45 +03:00
Uladzimir Havenchyk
089ee1a4a9 chore(build): implement build caching layers 2025-11-17 13:17:21 +03:00
6 changed files with 234 additions and 24 deletions

View File

@@ -6,7 +6,7 @@ inputs:
apply-patches:
description: "Whether to patch frontend dependencies with patch-package."
required: true
default: 'true'
default: "true"
runs:
using: "composite"
steps:

View File

@@ -136,7 +136,7 @@ jobs:
with:
java-version: "${{ needs.get-build-requirements.outputs.java_version || 21 }}"
- name: Build
run: ./bin/build.sh
run: yarn build:uberjar
- name: Prepare uberjar artifact
uses: ./.github/actions/prepare-uberjar-artifact
with:

3
.gitignore vendored
View File

@@ -163,3 +163,6 @@ CLAUDE.local.md
/logs
/.clojure-mcp
# wireit cache
.wireit

View File

@@ -26,24 +26,17 @@
(let [mb-edition (case edition
:ee "ee"
:oss "oss")]
(u/step (format "Build frontend with MB_EDITION=%s" mb-edition)
(u/step (format "Build frontend with MB_EDITION=%s (using wireit cache)" mb-edition)
(when-not (env/env :ci)
(u/step "Run 'yarn' to download JavaScript dependencies"
(u/sh {:dir u/project-root-directory} "yarn")))
(u/step "Build frontend"
(u/step "Build frontend (wireit-cached)"
(u/sh {:dir u/project-root-directory
:env {"PATH" (env/env :path)
"HOME" (env/env :user-home)
"WEBPACK_BUNDLE" "production"
"MB_EDITION" mb-edition}}
"yarn" "build-release"))
(u/step "Build static viz"
(u/sh {:dir u/project-root-directory
:env {"PATH" (env/env :path)
"HOME" (env/env :user-home)
"WEBPACK_BUNDLE" "production"
"MB_EDITION" mb-edition}}
"yarn" "build-release:static-viz"))
(u/announce "Frontend built successfully."))))
(defn- build-licenses!
@@ -74,6 +67,23 @@
"resources"
"license-frontend-third-party.txt") license-text)))))
(defn build-licenses-direct!
"Build licenses without requiring edition parameter. Used for yarn/wireit caching."
[_options]
(build-licenses! (edition-from-env-var)))
(defn build-version-direct!
"Generate version properties file without requiring explicit parameters. Used for yarn/wireit caching."
[_options]
(let [edition (edition-from-env-var)
version (version-properties/current-snapshot-version edition)]
(version-properties/generate-version-properties-file! edition version)))
(defn build-drivers-direct!
"Build drivers without requiring edition parameter. Used for yarn/wireit caching."
[_options]
(build-drivers/build-drivers! (edition-from-env-var)))
(defn- build-uberjar! [edition]
{:pre [(#{:oss :ee} edition)]}
(u/delete-file-if-exists! uberjar/uberjar-filename)
@@ -82,21 +92,42 @@
(u/assert-file-exists uberjar/uberjar-filename)
(u/announce "Uberjar built successfully.")))
(defn- build-via-yarn!
([step-name]
(build-via-yarn! step-name {}))
([step-name {:keys [edition]}]
(let [mb-edition (when edition
(case edition
:ee "ee"
:oss "oss"))]
(u/step (format "Build %s (using wireit cache)" step-name)
(u/sh {:dir u/project-root-directory
:env (cond-> {"PATH" (env/env :path)
"HOME" (env/env :user-home)}
mb-edition (assoc "MB_EDITION" mb-edition))}
"yarn" (str "build:" step-name))
(u/announce "%s built successfully (cached)." step-name)))))
(defn build-uberjar-direct!
"Build uberjar without requiring edition parameter. Used for yarn/wireit caching."
[_options]
(build-uberjar! (edition-from-env-var)))
(def ^:private all-steps
"These build steps are run in order during the build process."
(ordered-map/ordered-map
:version (fn [{:keys [edition version]}]
(version-properties/generate-version-properties-file! edition version))
:translations (fn [_]
(i18n/create-all-artifacts!))
:version (fn [{:keys [edition]}]
(build-via-yarn! "version" {:edition edition}))
:translations (fn [{:keys [edition]}]
(build-via-yarn! "translations" {:edition edition}))
:frontend (fn [{:keys [edition]}]
(build-frontend! edition))
:licenses (fn [{:keys [edition]}]
(build-licenses! edition))
(build-via-yarn! "licenses" {:edition edition}))
:drivers (fn [{:keys [edition]}]
(build-drivers/build-drivers! edition))
(build-via-yarn! "drivers" {:edition edition}))
:uberjar (fn [{:keys [edition]}]
(build-uberjar! edition))))
(build-via-yarn! "uberjar" {:edition edition}))))
(defn build!
"Programmatic entrypoint."

View File

@@ -356,6 +356,7 @@
"webpack-dev-server": "^5.2.1",
"webpack-notifier": "1.15.0",
"webpack-stats-plugin": "^1.1.3",
"wireit": "^0.14.12",
"yaml-lint": "~1.6.0",
"yarn-deduplicate": "^6.0.2"
},
@@ -393,10 +394,10 @@
"build-hot:js": "yarn && yarn clean-dev:js && NODE_OPTIONS=--max-old-space-size=8192 WEBPACK_BUNDLE=hot rspack serve",
"build-hot:js-wait": "yarn wait:cljs; yarn build-hot:js",
"build-pure:cljs": "yarn clean-dev:cljs && shadow-cljs compile app",
"build-release": "yarn build-release:cljs && yarn build-release:js",
"build-release:cljs": "yarn clean-release:cljs && shadow-cljs release app",
"build-release:js": "WEBPACK_BUNDLE=production rspack build",
"build-release:static-viz": "WEBPACK_BUNDLE=production rspack --config rspack.static-viz.config.js",
"build-release": "wireit",
"build-release:cljs": "wireit",
"build-release:js": "wireit",
"build-release:static-viz": "wireit",
"build-release:embedding-sdk-package": "WEBPACK_BUNDLE=production rspack --config rspack.embedding-sdk-package.config.js",
"build-release:embedding-sdk-bundle": "WEBPACK_BUNDLE=production rspack --config rspack.embedding-sdk-bundle.config.js",
"build-shared": "yarn && rspack --config rspack.shared.config.js",
@@ -486,7 +487,140 @@
"validate-e2e-filenames": "node e2e/validate-e2e-test-files.js",
"wait:cljs": "echo Waiting for first CLJS build; until [ -f target/cljs_dev/cljs.core.js ]; do sleep 1; done; echo CLJS build done",
"generate:expression-parser": "lezer-generator frontend/src/metabase/querying/expressions/tokenizer/grammar.lezer -o frontend/src/metabase/querying/expressions/tokenizer/lezer.js",
"cloud:dev": "yarn && clojure -A:dev:drivers:drivers-dev:ee:ee-dev:cljs -P && yarn concurrently -n 'FE,BE' -c 'blue,green' 'yarn build-hot' 'clojure -M:dev:socket:dev-start:drivers:drivers-dev:ee:ee-dev'"
"cloud:dev": "yarn && clojure -A:dev:drivers:drivers-dev:ee:ee-dev:cljs -P && yarn concurrently -n 'FE,BE' -c 'blue,green' 'yarn build-hot' 'clojure -M:dev:socket:dev-start:drivers:drivers-dev:ee:ee-dev'",
"build:version": "wireit",
"build:translations": "wireit",
"build:licenses": "wireit",
"build:drivers": "wireit",
"build:uberjar": "wireit"
},
"wireit": {
"build-release": {
"dependencies": [
"build-release:cljs",
"build-release:js",
"build-release:static-viz"
]
},
"build-release:cljs": {
"command": "yarn clean-release:cljs && shadow-cljs release app",
"files": [
"frontend/src/**/*.{cljs,cljc}",
"enterprise/frontend/src/**/*.{cljs,cljc}",
"shadow-cljs.edn",
"deps.edn"
],
"output": [
"target/cljs_release/**"
]
},
"build-release:js": {
"command": "WEBPACK_BUNDLE=production rspack build",
"dependencies": [
"build-release:cljs"
],
"files": [
"frontend/src/**/*.{js,jsx,ts,tsx,css}",
"enterprise/frontend/src/**/*.{js,jsx,ts,tsx,css}",
"target/cljs_release/**",
"rspack.config.js",
"rspack.main.config.js",
"rspack.iframe-sdk-embed.config.js",
"rspack.embedding-sdk-bundle.config.js",
"frontend/build/**/*.js",
"package.json",
"tsconfig.json"
],
"output": [
"resources/frontend_client/app/dist/**",
"!resources/frontend_client/app/dist/lib-static-viz.bundle.js"
]
},
"build-release:static-viz": {
"command": "WEBPACK_BUNDLE=production rspack --config rspack.static-viz.config.js",
"dependencies": [
"build-release:cljs"
],
"files": [
"frontend/src/metabase/static-viz/**/*.{js,jsx,ts,tsx}",
"frontend/src/metabase-lib/**/*.{js,jsx,ts,tsx}",
"frontend/src/metabase-types/**/*.{js,jsx,ts,tsx}",
"target/cljs_release/**",
"rspack.static-viz.config.js",
"frontend/build/**/*.js",
"package.json"
],
"output": [
"resources/frontend_client/app/dist/lib-static-viz.bundle.js"
]
},
"build:version": {
"command": "clojure -X:build build/build-version-direct!",
"files": [
"bin/build/src/build/version_properties.clj",
"deps.edn"
],
"output": [
"resources/version.properties"
]
},
"build:translations": {
"command": "clojure -X:build i18n.create-artifacts/create-all-artifacts!",
"files": [
"locales/**/*.po",
"bin/build/src/i18n/**/*.clj"
],
"output": [
"resources/locales.clj",
"resources/i18n/**",
"resources/frontend_client/app/locales/**"
]
},
"build:licenses": {
"command": "clojure -X:build build/build-licenses-direct!",
"files": [
"deps.edn",
"package.json",
"yarn.lock",
"bin/build/src/build/licenses.clj"
],
"output": [
"resources/license-backend-third-party.txt",
"resources/license-frontend-third-party.txt"
]
},
"build:drivers": {
"command": "clojure -X:build:drivers build/build-drivers-direct!",
"files": [
"modules/drivers/**/src/**/*.clj",
"modules/drivers/**/resources/**/*",
"modules/drivers/**/deps.edn",
"bin/build/src/build_drivers/**/*.clj"
],
"output": [
"resources/modules/**"
]
},
"build:uberjar": {
"command": "clojure -X:build build/build-uberjar-direct!",
"dependencies": [
"build:version",
"build:translations",
"build:licenses",
"build:drivers"
],
"files": [
"src/**/*.{clj,cljc}",
"enterprise/backend/src/**/*.{clj,cljc}",
"resources/**/*",
"enterprise/backend/resources/**/*",
"deps.edn",
"bin/build/src/build/uberjar.clj"
],
"output": [
"target/uberjar/metabase.jar"
]
}
},
"lint-staged": {
"+(frontend|enterprise)/**/*.styled.tsx": [

View File

@@ -7402,6 +7402,11 @@ balanced-match@^2.0.0:
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9"
integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==
balanced-match@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-3.0.1.tgz#e854b098724b15076384266497392a271f4a26a0"
integrity sha512-vjtV3hiLqYDNRoiAv0zC4QaGAMPomEoq83PRmYIofPswwZurCeWR5LByXm7SyoL0Zh5+2z0+HC7jG8gSZJUh0w==
base64-arraybuffer@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc"
@@ -7550,6 +7555,13 @@ brace-expansion@^2.0.1:
dependencies:
balanced-match "^1.0.0"
brace-expansion@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-4.0.1.tgz#3387e13eaa2992025d05ea47308f77e4a8dedd1e"
integrity sha512-YClrbvTCXGe70pU2JiEiPLYXO9gQkyxYeKpJIQHVS/gOs6EWMQP2RYBwjFLNT322Ji8TOC3IMPfsYCedNpzKfA==
dependencies:
balanced-match "^3.0.0"
braces@^3.0.3, braces@~3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
@@ -11118,7 +11130,7 @@ fast-equals@^4.0.3:
resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-4.0.3.tgz#72884cc805ec3c6679b99875f6b7654f39f0e8c7"
integrity sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==
fast-glob@^3.1.1, fast-glob@^3.2.9, fast-glob@^3.3.2, fast-glob@^3.3.3:
fast-glob@^3.1.1, fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.2, fast-glob@^3.3.3:
version "3.3.3"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818"
integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==
@@ -14193,6 +14205,11 @@ json5@2.2.2, json5@^1.0.2, json5@^2.1.2, json5@^2.2.2, json5@^2.2.3:
resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.2.tgz#64471c5bdcc564c18f7c1d4df2e2297f2457c5ab"
integrity sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==
jsonc-parser@^3.0.0:
version "3.3.1"
resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4"
integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==
jsonfile@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
@@ -17477,6 +17494,15 @@ prop-types@15.x, prop-types@^15.0.0, prop-types@^15.5.0, prop-types@^15.5.10, pr
object-assign "^4.1.1"
react-is "^16.13.1"
proper-lockfile@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f"
integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==
dependencies:
graceful-fs "^4.2.4"
retry "^0.12.0"
signal-exit "^3.0.2"
property-expr@^2.0.4:
version "2.0.5"
resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.5.tgz#278bdb15308ae16af3e3b9640024524f4dc02cb4"
@@ -18838,6 +18864,11 @@ ret@~0.1.10:
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
retry@^0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==
retry@^0.13.1:
version "0.13.1"
resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658"
@@ -22086,6 +22117,17 @@ wildcard@^2.0.0:
resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec"
integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==
wireit@^0.14.12:
version "0.14.12"
resolved "https://registry.yarnpkg.com/wireit/-/wireit-0.14.12.tgz#c35788b4be4a796a8d05d204ec7d3f5c4b355d71"
integrity sha512-gNSd+nZmMo6cuICezYXRIayu6TSOeCSCDzjSF0q6g8FKDsRbdqrONrSZYzdk/uBISmRcv4vZtsno6GyGvdXwGA==
dependencies:
brace-expansion "^4.0.0"
chokidar "^3.5.3"
fast-glob "^3.2.11"
jsonc-parser "^3.0.0"
proper-lockfile "^4.1.2"
word-wrap@1.2.3, word-wrap@^1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"