Compare commits
671 Commits
node-nativ
...
document-s
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2935aefc64 | ||
|
|
0ecddc9870 | ||
|
|
7ebb0f0000 | ||
|
|
25ce9c5dcf | ||
|
|
14a343de12 | ||
|
|
ec0c2dba8b | ||
|
|
39afe7fff5 | ||
|
|
ab958737a9 | ||
|
|
45a0c85158 | ||
|
|
d2479a5b95 | ||
|
|
6d13f02bf3 | ||
|
|
3b8161ca75 | ||
|
|
93047a3e2f | ||
|
|
2b902a4ce1 | ||
|
|
e03e528f09 | ||
|
|
6f74d26021 | ||
|
|
cb9d5e33e2 | ||
|
|
1ddff04bf6 | ||
|
|
640b530563 | ||
|
|
952a52974c | ||
|
|
915abf29eb | ||
|
|
67eceb653a | ||
|
|
11260e4d72 | ||
|
|
11d3fb22d2 | ||
|
|
2627574bce | ||
|
|
53fcff39ef | ||
|
|
99c391fb9f | ||
|
|
47f6a9ac46 | ||
|
|
0f0d91d824 | ||
|
|
dd41094d50 | ||
|
|
676c64a2aa | ||
|
|
709df6c4ac | ||
|
|
f2096262fa | ||
|
|
73763282b7 | ||
|
|
43f07d3c88 | ||
|
|
ecc7d9ba86 | ||
|
|
c9205461c1 | ||
|
|
65974dc29d | ||
|
|
b452abc839 | ||
|
|
debcec5881 | ||
|
|
2f15322530 | ||
|
|
8783c54480 | ||
|
|
cce80c3f1d | ||
|
|
5647025c0c | ||
|
|
ebb0d64993 | ||
|
|
96a1ed0b8f | ||
|
|
9f8331cb63 | ||
|
|
65bbe6429e | ||
|
|
7b367b6c0f | ||
|
|
c328d7f7e0 | ||
|
|
08cec1d1f5 | ||
|
|
5c489b9c95 | ||
|
|
4a079f203a | ||
|
|
1fc9390906 | ||
|
|
8d6ba8f390 | ||
|
|
3164d5d866 | ||
|
|
6ee5cbf07a | ||
|
|
aba008b9b7 | ||
|
|
a9a088ef1f | ||
|
|
71d915b7d0 | ||
|
|
3fc274a4cf | ||
|
|
ba8f1f3ccf | ||
|
|
db122be70b | ||
|
|
9781d9b7cd | ||
|
|
3feae381dd | ||
|
|
bbe95ee859 | ||
|
|
9c2156a025 | ||
|
|
6542c95758 | ||
|
|
4ac4d34af7 | ||
|
|
9a4c0bb7c3 | ||
|
|
ebd8ecb06c | ||
|
|
98a9b04fb1 | ||
|
|
19f1e5517a | ||
|
|
ee248d5fff | ||
|
|
b3d4d009aa | ||
|
|
d2f01b00eb | ||
|
|
a076cca120 | ||
|
|
42e48c71e0 | ||
|
|
88ef82938d | ||
|
|
b3a9f566df | ||
|
|
9477b72420 | ||
|
|
5ef76f8592 | ||
|
|
fbc7f9668d | ||
|
|
4c79e29cca | ||
|
|
0ab4df1655 | ||
|
|
38bd513835 | ||
|
|
4b128f68a9 | ||
|
|
b0687c26d2 | ||
|
|
c6674c0185 | ||
|
|
e4c92ff6e2 | ||
|
|
4cbb2297a5 | ||
|
|
54ebe17696 | ||
|
|
69b313f83e | ||
|
|
d76385094e | ||
|
|
41674dd1de | ||
|
|
772e56a62e | ||
|
|
9595d9493d | ||
|
|
3c3a8dd127 | ||
|
|
4373216910 | ||
|
|
efbfc502f1 | ||
|
|
ab2eb8a1f9 | ||
|
|
d1dd7964c2 | ||
|
|
9bd2243573 | ||
|
|
9c2838341e | ||
|
|
a60e02dd1e | ||
|
|
92e9d6360d | ||
|
|
c6f35e0393 | ||
|
|
89b4bbe920 | ||
|
|
a1206f3886 | ||
|
|
6c24ddee41 | ||
|
|
0ab1d4ccb6 | ||
|
|
ea64672746 | ||
|
|
e4afb704fe | ||
|
|
b9a446a933 | ||
|
|
7bd57d1d66 | ||
|
|
aedb754045 | ||
|
|
1991635e2a | ||
|
|
dfeafc9489 | ||
|
|
9f0c6d1e2e | ||
|
|
e716d1d253 | ||
|
|
8ad7691ba9 | ||
|
|
f7c8221468 | ||
|
|
30df0133e7 | ||
|
|
c2cee019de | ||
|
|
812d1eceef | ||
|
|
4135955236 | ||
|
|
b2a0c144ba | ||
|
|
d7653edd9d | ||
|
|
9a56a9e96b | ||
|
|
436840eac9 | ||
|
|
f294fb48b7 | ||
|
|
19f3c013aa | ||
|
|
ab0bd1b8ff | ||
|
|
5edd511b5b | ||
|
|
c800fb73d0 | ||
|
|
0463d74f76 | ||
|
|
f8924beba5 | ||
|
|
b46048533c | ||
|
|
92eb7e62a1 | ||
|
|
6351f1c4ef | ||
|
|
d0c0516fa2 | ||
|
|
eeb46a43f1 | ||
|
|
31412ebe1e | ||
|
|
5b885a5447 | ||
|
|
8df9924e76 | ||
|
|
f6d3a73bb3 | ||
|
|
eb8f2d91d0 | ||
|
|
8c5adc5f85 | ||
|
|
a792b1706e | ||
|
|
268352d02b | ||
|
|
acafad1b6a | ||
|
|
4f95b0ebb7 | ||
|
|
92017cfe7c | ||
|
|
9ee59951ae | ||
|
|
2581cc50b4 | ||
|
|
403bf4eafd | ||
|
|
010af9dc10 | ||
|
|
be36bd367d | ||
|
|
064110eaa2 | ||
|
|
8c1e179da7 | ||
|
|
794d472d29 | ||
|
|
dd9668fd41 | ||
|
|
5a2c86ad40 | ||
|
|
35a47b2418 | ||
|
|
304d4cda21 | ||
|
|
211f371fd5 | ||
|
|
40368f85fb | ||
|
|
978e12c2d6 | ||
|
|
3a5e8d1471 | ||
|
|
ea4c347006 | ||
|
|
5556654506 | ||
|
|
4ea6c16f19 | ||
|
|
6620040235 | ||
|
|
f809d7747c | ||
|
|
181e8f31d2 | ||
|
|
83bd4ba534 | ||
|
|
f770d21cdf | ||
|
|
93ec57af84 | ||
|
|
e5b8670c6d | ||
|
|
f6f6b2d3a9 | ||
|
|
745ab32bde | ||
|
|
6760658aec | ||
|
|
88b979623a | ||
|
|
bad6bccac2 | ||
|
|
7448009633 | ||
|
|
7418a137c8 | ||
|
|
40269ca9c0 | ||
|
|
458913d017 | ||
|
|
42bee66fba | ||
|
|
76ee0b6f8c | ||
|
|
912aca8811 | ||
|
|
2e9f07ede2 | ||
|
|
9568b9956d | ||
|
|
d9373fa6d8 | ||
|
|
34e884c47a | ||
|
|
80867e1335 | ||
|
|
ee9d5d3832 | ||
|
|
7894f1e45e | ||
|
|
230784e3fb | ||
|
|
fd4a621603 | ||
|
|
8119bc5c8c | ||
|
|
94570c4c1b | ||
|
|
aade35f0db | ||
|
|
0486d547d3 | ||
|
|
ec7163091a | ||
|
|
289e00d760 | ||
|
|
7428fee268 | ||
|
|
ffad0df277 | ||
|
|
d86d74ba5f | ||
|
|
141cff0fe8 | ||
|
|
cc758a125d | ||
|
|
287e496a1b | ||
|
|
4b8d3a1dc8 | ||
|
|
2ac44861b5 | ||
|
|
47d994182c | ||
|
|
17435642ef | ||
|
|
c9106f66f1 | ||
|
|
efac2b8f96 | ||
|
|
ab30c325db | ||
|
|
a917ade608 | ||
|
|
d11ce55c79 | ||
|
|
81b5c133b2 | ||
|
|
1799892d0b | ||
|
|
673c5b93ed | ||
|
|
44ec7bc393 | ||
|
|
62b48d1795 | ||
|
|
da35b08918 | ||
|
|
4a56e706eb | ||
|
|
4f7c22ed53 | ||
|
|
ba806688b6 | ||
|
|
d8a03a312f | ||
|
|
18898a5fdf | ||
|
|
81f880637b | ||
|
|
9a6dd6456f | ||
|
|
1ebe336a00 | ||
|
|
36790affcf | ||
|
|
698be3e9f7 | ||
|
|
a15154cb84 | ||
|
|
f232f68588 | ||
|
|
095cae88af | ||
|
|
5314f9f976 | ||
|
|
7189344bfd | ||
|
|
11b74e0e4b | ||
|
|
c5862c278d | ||
|
|
0af4b1c0de | ||
|
|
75ef744af8 | ||
|
|
4cd96fa6a2 | ||
|
|
b47ccb6123 | ||
|
|
84e35e40da | ||
|
|
d3f48b79a5 | ||
|
|
5271f4092d | ||
|
|
643695fc44 | ||
|
|
fd29d268d3 | ||
|
|
1a14bd6eba | ||
|
|
debb945c57 | ||
|
|
8d195dc6db | ||
|
|
c06ea7d391 | ||
|
|
1eccdad5f4 | ||
|
|
3f07958eae | ||
|
|
0947c6b604 | ||
|
|
e62c8f1fff | ||
|
|
efb70a343a | ||
|
|
6f34845c13 | ||
|
|
e2e2e5fdf3 | ||
|
|
11f24779e2 | ||
|
|
086a00ab8d | ||
|
|
ed82963a86 | ||
|
|
0fe24156a3 | ||
|
|
ad3ec1b797 | ||
|
|
9276aaad2a | ||
|
|
329b903a8b | ||
|
|
c69ef65bff | ||
|
|
87f36432ca | ||
|
|
00ceb1aff2 | ||
|
|
b243e4e4d4 | ||
|
|
7c2347fef6 | ||
|
|
ab0ed63e26 | ||
|
|
d34ddd45c2 | ||
|
|
82acc79f82 | ||
|
|
240862340a | ||
|
|
b07b86a367 | ||
|
|
c4db9bf7fe | ||
|
|
d389949074 | ||
|
|
0a9b808754 | ||
|
|
7849e0394c | ||
|
|
f1057b6420 | ||
|
|
28bf41bb17 | ||
|
|
73bcc90a68 | ||
|
|
8fa264cb17 | ||
|
|
74a6335bd3 | ||
|
|
ca4744dc08 | ||
|
|
78e9dda8dd | ||
|
|
b36f00cf80 | ||
|
|
3f24ba5687 | ||
|
|
d7dc44feb2 | ||
|
|
0450ba6a67 | ||
|
|
b30ecea5ca | ||
|
|
fc8ca9b602 | ||
|
|
fa3b11fcde | ||
|
|
68366d7d37 | ||
|
|
63a94c8788 | ||
|
|
10bd9d68ce | ||
|
|
f8f5e20c1f | ||
|
|
06712c46e5 | ||
|
|
7221915503 | ||
|
|
f9d74d1f3b | ||
|
|
1dffd98bd7 | ||
|
|
909354fe89 | ||
|
|
944ca02530 | ||
|
|
a2b720a743 | ||
|
|
3f19d40ca1 | ||
|
|
e357c4f0db | ||
|
|
8563b74b89 | ||
|
|
6558cca6a4 | ||
|
|
435e905ffd | ||
|
|
3063577208 | ||
|
|
1c6c3681a8 | ||
|
|
84f0a92394 | ||
|
|
9019aab71e | ||
|
|
abdfe5062c | ||
|
|
adefc0f0b7 | ||
|
|
fadfd67275 | ||
|
|
4b57f82089 | ||
|
|
b8d2ac9ebc | ||
|
|
00e3499af8 | ||
|
|
d81a470a57 | ||
|
|
c329272406 | ||
|
|
75ec895750 | ||
|
|
60ca78c873 | ||
|
|
a204791f86 | ||
|
|
4e7f0f28d3 | ||
|
|
a15d4122f2 | ||
|
|
8bc377369b | ||
|
|
2ff3bb736f | ||
|
|
badbd28565 | ||
|
|
c45c500628 | ||
|
|
a95c69a0b3 | ||
|
|
1319841229 | ||
|
|
e0bacfea5e | ||
|
|
987ed5d7da | ||
|
|
431afb660b | ||
|
|
b11f0905f3 | ||
|
|
7eee4b5da1 | ||
|
|
4bef26a524 | ||
|
|
9edd0db967 | ||
|
|
f51780142f | ||
|
|
98ce261480 | ||
|
|
f7e1511dcd | ||
|
|
f1d46ecf36 | ||
|
|
f93123f2a2 | ||
|
|
45ee83044e | ||
|
|
6a73a95940 | ||
|
|
40d897d7f1 | ||
|
|
89a7f3c1b6 | ||
|
|
eb671b92ab | ||
|
|
aa0cdb546d | ||
|
|
c43a1c5ca5 | ||
|
|
a7930e7395 | ||
|
|
8132b400d2 | ||
|
|
8c80f88e30 | ||
|
|
c004ea2d46 | ||
|
|
ad58a25fc6 | ||
|
|
78adcf7380 | ||
|
|
7c5f3f11db | ||
|
|
7bc29f3f9a | ||
|
|
d7cf38d3cf | ||
|
|
72bca32bcd | ||
|
|
14b2815113 | ||
|
|
9b0241aa11 | ||
|
|
13a851f3c1 | ||
|
|
9dcd19054e | ||
|
|
0c64aaa4a7 | ||
|
|
ef8bc2ea06 | ||
|
|
915a78f13a | ||
|
|
7427caa8d0 | ||
|
|
35bc7c8b9a | ||
|
|
ff36018fb9 | ||
|
|
b7d5408300 | ||
|
|
7bc79ed0a5 | ||
|
|
4e87da201c | ||
|
|
ea826ef62b | ||
|
|
1270cf7271 | ||
|
|
fc23270381 | ||
|
|
1d5a79395d | ||
|
|
cff5e706f9 | ||
|
|
cc3ddf8359 | ||
|
|
5b5c5e7298 | ||
|
|
0b3df70817 | ||
|
|
5e7f3e9467 | ||
|
|
ffb583c99e | ||
|
|
be8e6611c3 | ||
|
|
f889695914 | ||
|
|
f182885389 | ||
|
|
3bb4d5e74d | ||
|
|
17bea4176a | ||
|
|
e22ab60e01 | ||
|
|
04c1d21645 | ||
|
|
e446ba2c3d | ||
|
|
93390d9f57 | ||
|
|
29f56b541f | ||
|
|
d786ffbff8 | ||
|
|
58cfd55861 | ||
|
|
6625097d66 | ||
|
|
ef21542b10 | ||
|
|
645b55cfaf | ||
|
|
db61438bd8 | ||
|
|
351fdc90cf | ||
|
|
05e78aae4a | ||
|
|
b0b8348dad | ||
|
|
831fb413cc | ||
|
|
aab42da74c | ||
|
|
1dc85bcbae | ||
|
|
6191275795 | ||
|
|
319cf701dc | ||
|
|
5e79cee71f | ||
|
|
23d194ca63 | ||
|
|
1cc4b87479 | ||
|
|
61d8979597 | ||
|
|
0995bf3526 | ||
|
|
206f7eaccb | ||
|
|
00d8e50082 | ||
|
|
832e2b7ac5 | ||
|
|
dc973f0cb8 | ||
|
|
08f7daa02a | ||
|
|
606416ba23 | ||
|
|
f2b8b44d48 | ||
|
|
9d3ed0c9f2 | ||
|
|
0d14cb4aac | ||
|
|
86a55c97d9 | ||
|
|
850afa8366 | ||
|
|
0f1eb823d3 | ||
|
|
647058ec89 | ||
|
|
f58709dc20 | ||
|
|
457cde39db | ||
|
|
3b028ee825 | ||
|
|
64448e927d | ||
|
|
f2a3859e32 | ||
|
|
2c85824963 | ||
|
|
27420b5cb9 | ||
|
|
c3e67fd73e | ||
|
|
18ab9af893 | ||
|
|
d3469efb09 | ||
|
|
e00d09cc37 | ||
|
|
ef602ae2d0 | ||
|
|
65c5af5155 | ||
|
|
eb0e823d1e | ||
|
|
c22ec1ebbd | ||
|
|
d46d9d4dc9 | ||
|
|
c6eeb8e6ba | ||
|
|
af496e167d | ||
|
|
48199ff2f7 | ||
|
|
83ca395ccf | ||
|
|
bd83d0691b | ||
|
|
08cd4c5d37 | ||
|
|
99a91de1b4 | ||
|
|
2fcd6ed374 | ||
|
|
5b2fa90fdb | ||
|
|
680b24023c | ||
|
|
67aeb818ab | ||
|
|
f197cbb591 | ||
|
|
85e8bcbc3d | ||
|
|
50d9b94ccb | ||
|
|
436341ab76 | ||
|
|
aa7ced174f | ||
|
|
7de1211bab | ||
|
|
fd5a433265 | ||
|
|
aabc1d165f | ||
|
|
a4747ed263 | ||
|
|
cb5f72cad4 | ||
|
|
6c0b2d81ad | ||
|
|
1bd2398307 | ||
|
|
e0f1ecee2d | ||
|
|
6b8124421a | ||
|
|
2dc4715824 | ||
|
|
e07751fe9e | ||
|
|
3cde309b3c | ||
|
|
a1a437bd26 | ||
|
|
59d8776683 | ||
|
|
f5e92dbce9 | ||
|
|
fea73a4f5c | ||
|
|
3a7474eadc | ||
|
|
967745c312 | ||
|
|
df462d07d5 | ||
|
|
4f908179ec | ||
|
|
9cbdac4de4 | ||
|
|
0cf80c77f2 | ||
|
|
0b4b4dfced | ||
|
|
19f4980a7e | ||
|
|
38e9f21dfb | ||
|
|
2775a7e069 | ||
|
|
d92773df06 | ||
|
|
09e2ee40e7 | ||
|
|
023864e72f | ||
|
|
994e2ff647 | ||
|
|
afabd18f56 | ||
|
|
9c479154a5 | ||
|
|
747781ee29 | ||
|
|
a5e13bedd8 | ||
|
|
31503487b3 | ||
|
|
9c7f08c2ae | ||
|
|
5085f8ee19 | ||
|
|
8693547be1 | ||
|
|
341e81611e | ||
|
|
29786d318c | ||
|
|
22ddd2cba8 | ||
|
|
3df17fd3a8 | ||
|
|
c3dbced191 | ||
|
|
8e836010fb | ||
|
|
634c7942cd | ||
|
|
5cdf070465 | ||
|
|
9307c56d7b | ||
|
|
f1c7740a45 | ||
|
|
df80eb95b6 | ||
|
|
a525192b0b | ||
|
|
07f1e62fae | ||
|
|
b614b303ea | ||
|
|
2583528cb3 | ||
|
|
33edd890a3 | ||
|
|
1e8dbe446b | ||
|
|
739e461866 | ||
|
|
cd987d88a7 | ||
|
|
8a4c87a136 | ||
|
|
f3953111ce | ||
|
|
d1345439f9 | ||
|
|
73b8863eb6 | ||
|
|
783d3ceca4 | ||
|
|
ce0e349f21 | ||
|
|
6d31996556 | ||
|
|
f3f462d9cc | ||
|
|
fc5a6469ba | ||
|
|
8523bf0412 | ||
|
|
13d11d33cd | ||
|
|
bb15f10b44 | ||
|
|
f9241dd461 | ||
|
|
a4a135903b | ||
|
|
67d31cea38 | ||
|
|
1f0b41a30b | ||
|
|
b7e77ac43c | ||
|
|
89fd0b5c2b | ||
|
|
5339aaa1ca | ||
|
|
1880b20c34 | ||
|
|
809896ee0a | ||
|
|
aae3788116 | ||
|
|
d743daaf20 | ||
|
|
853d9b0cf0 | ||
|
|
4e88f438e9 | ||
|
|
5b6d472c96 | ||
|
|
37cfdcfd3e | ||
|
|
a7ecc9e669 | ||
|
|
60373ead57 | ||
|
|
a4a927799d | ||
|
|
8e75cd74f4 | ||
|
|
fda455fabc | ||
|
|
5d5f73f403 | ||
|
|
7304c050ab | ||
|
|
e8dee796db | ||
|
|
3e605c6d87 | ||
|
|
1fc73ccc47 | ||
|
|
3441035d2d | ||
|
|
d530b9a45c | ||
|
|
5be18b9afd | ||
|
|
0a61f6688f | ||
|
|
6421b4187e | ||
|
|
40ce015882 | ||
|
|
b7d02f7d6c | ||
|
|
bf0624f700 | ||
|
|
9f823bd747 | ||
|
|
f881594d61 | ||
|
|
8401e8715d | ||
|
|
8252df95f2 | ||
|
|
1cd6a43417 | ||
|
|
1cd2a7dafe | ||
|
|
cd77efaf80 | ||
|
|
e50e3ddad8 | ||
|
|
b6174a8a0c | ||
|
|
4956974743 | ||
|
|
2c2863cb9d | ||
|
|
1e22b1971c | ||
|
|
0ff7a8887c | ||
|
|
4e04711a2d | ||
|
|
f38a0f6769 | ||
|
|
7e1ab4e2c7 | ||
|
|
13d4abff0b | ||
|
|
f1f175e4e5 | ||
|
|
f4ac64fd80 | ||
|
|
ff7eb5f1f5 | ||
|
|
b241401b2d | ||
|
|
fea9b59511 | ||
|
|
0374a8ac42 | ||
|
|
d43c0a418b | ||
|
|
d3435af399 | ||
|
|
43ff1d6a13 | ||
|
|
c4aca6545e | ||
|
|
f7288acbfe | ||
|
|
c57656fbfa | ||
|
|
f24a7fdc18 | ||
|
|
22e6fd8d57 | ||
|
|
52d9ba6670 | ||
|
|
0c2dddf2bc | ||
|
|
aa691b0888 | ||
|
|
037cd61c9e | ||
|
|
5e08c9e9e1 | ||
|
|
2568336e90 | ||
|
|
0ba623e4ba | ||
|
|
4ff56367f9 | ||
|
|
c1484f5f57 | ||
|
|
59193a2267 | ||
|
|
fb99cfcdc6 | ||
|
|
cfb3d5ad2e | ||
|
|
9eb27dc5c9 | ||
|
|
9753a8a64d | ||
|
|
ea6a639b63 | ||
|
|
2454ab7188 | ||
|
|
517f98bf5c | ||
|
|
0e75b6bbac | ||
|
|
82bad2ee19 | ||
|
|
87afb2783f | ||
|
|
ca73c4406e | ||
|
|
e0e25ed230 | ||
|
|
2505c039bf | ||
|
|
f2ce68cd98 | ||
|
|
dc5ed72564 | ||
|
|
58717801ec | ||
|
|
92d757b132 | ||
|
|
ff702a180c | ||
|
|
878fc256b6 | ||
|
|
edfb5fe39c | ||
|
|
d626289c81 | ||
|
|
0adf8b5d5b | ||
|
|
9a6113cff5 | ||
|
|
59c1d93c76 | ||
|
|
ff989915fb | ||
|
|
19e9ec0cd3 | ||
|
|
f67919695d | ||
|
|
466f7879da | ||
|
|
bdfae3d613 | ||
|
|
424bb4d19e | ||
|
|
b75ef21b91 | ||
|
|
3f01f61624 | ||
|
|
4927b35f0f | ||
|
|
481065bc8f | ||
|
|
d10fafd538 | ||
|
|
b76a18112a | ||
|
|
b39cfa3b6a | ||
|
|
23eeb71330 | ||
|
|
1e088b195a | ||
|
|
5601b31019 | ||
|
|
6c6e042e20 | ||
|
|
6f94207bdf | ||
|
|
83178c42e9 | ||
|
|
366e28ab80 | ||
|
|
e3a45d5996 | ||
|
|
23ed37fcb3 | ||
|
|
2768c95be3 | ||
|
|
0b73abd44e | ||
|
|
1dd56e5f14 | ||
|
|
bcd9ce522b | ||
|
|
87d57b5880 | ||
|
|
8eec882c31 | ||
|
|
1bf726bddc | ||
|
|
75df8b0ce6 | ||
|
|
788fd1922c | ||
|
|
cc23721d9c | ||
|
|
2ff890692e | ||
|
|
8a6b842320 | ||
|
|
c5118e2517 | ||
|
|
bdc56af8e7 | ||
|
|
e779e66621 | ||
|
|
ad256b6e5c | ||
|
|
36b9569619 | ||
|
|
62d441fd36 |
@@ -68,6 +68,7 @@
|
||||
:metabase/validate-logging {:level :warning}
|
||||
:metabase/validate-mb-driver-tests {:level :warning}
|
||||
:metabase/validate-mb-once {:level :warning}
|
||||
:metabase/discourage-millis-duration {:level :warning}
|
||||
|
||||
:metabase/validate-deftest
|
||||
{:level :warning
|
||||
@@ -408,9 +409,10 @@
|
||||
clojure.test.check.properties/for-all clojure.core/let
|
||||
clojurewerkz.quartzite.jobs/defjob clojure.core/defn
|
||||
instaparse.core/defparser clojure.core/def
|
||||
metabase-enterprise.action-v2.test-util/with-test-tables! clojure.core/let
|
||||
metabase-enterprise.serialization.test-util/with-dbs clojure.core/fn
|
||||
metabase-enterprise.serialization.test-util/with-random-dump-dir clojure.core/let
|
||||
metabase-enterprise.content-translation.routes-test/with-new-secret-key! clojure.core/fn
|
||||
metabase-enterprise.content-translation.routes-test/with-new-secret-key! clojure.core/fn
|
||||
metabase.actions.test-util/with-actions clojure.core/let
|
||||
metabase.api.common/let-404 clojure.core/let
|
||||
metabase.app-db.custom-migrations.util/with-temp-scheduler! clojure.core/fn
|
||||
@@ -469,6 +471,7 @@ metabase-enterprise.content-translation.routes-test/with-new-secret-key!
|
||||
metabase.test/with-temp-file clojure.core/let
|
||||
metabase.test/with-user-in-groups clojure.core/let
|
||||
metabase.upload.impl-test/with-upload-table! clojure.core/let
|
||||
metabase.util/for-map clojure.core/for
|
||||
metabase.util.files/with-open-path-to-resource clojure.core/let
|
||||
metabase.util.malli.defn/defn schema.core/defn
|
||||
metabase.util.malli.defn/defn- schema.core/defn
|
||||
@@ -501,6 +504,7 @@ metabase-enterprise.content-translation.routes-test/with-new-secret-key!
|
||||
clojure.core/ns hooks.clojure.core.ns/lint-ns
|
||||
clojure.core/require hooks.clojure.core.require/lint-require
|
||||
clojure.core/requiring-resolve hooks.clojure.core.require/lint-requiring-resolve
|
||||
clojure.core/- hooks.metabase.util.timing/discourage-millis-duration
|
||||
clojure.test/deftest hooks.clojure.test/deftest
|
||||
clojure.test/is hooks.clojure.test/is
|
||||
clojure.test/use-fixtures hooks.clojure.test/use-fixtures
|
||||
@@ -539,6 +543,7 @@ metabase-enterprise.content-translation.routes-test/with-new-secret-key!
|
||||
metabase.lib.schema.mbql-clause/define-tuple-mbql-clause hooks.metabase.lib.schema.mbql-clause/define-mbql-clause
|
||||
metabase.lib.test-util.macros/$ids hooks.metabase.test.data/$ids
|
||||
metabase.lib.test-util.macros/mbql-query hooks.metabase.test.data/mbql-query
|
||||
metabase.lib.test-util.macros/mbql-5-query hooks.metabase.test.data/mbql-query
|
||||
metabase.lib.test-util.macros/with-testing-against-standard-queries hooks.metabase.lib.test-util.macros/with-testing-against-standard-queries
|
||||
metabase.model-persistence.api-test/with-persistence-setup! hooks.common/with-one-top-level-binding
|
||||
metabase.model-persistence.api-test/with-setup! hooks.common/with-one-top-level-binding
|
||||
@@ -739,6 +744,7 @@ metabase-enterprise.content-translation.routes-test/with-new-secret-key!
|
||||
{:linters
|
||||
{:metabase/validate-escaped-single-quotes-in-i18n {:level :warning}
|
||||
:metabase/validate-string-or-str-args-to-i18n {:level :warning}
|
||||
:metabase/discourage-millis-duration {:level :warning}
|
||||
:discouraged-var
|
||||
{clojure.core/with-redefs {:message "Don't use with-redefs outside of tests"}
|
||||
clojure.core/eval {:message "Don't use eval outside of tests"}}}}
|
||||
@@ -807,4 +813,9 @@ metabase-enterprise.content-translation.routes-test/with-new-secret-key!
|
||||
|
||||
general-qp-and-driver-test-namespaces
|
||||
{:linters
|
||||
{:metabase/disallow-hardcoded-driver-names-in-tests {:level :warning}}}}}
|
||||
{:discouraged-var
|
||||
{metabase.test/with-column-remappings {:message "Use metabase.lib.test-util/remap-metadata-provider instead of with-column-remappings in QP tests"}
|
||||
metabase.test.util/with-column-remappings {:message "Use metabase.lib.test-util/remap-metadata-provider instead of with-column-remappings in QP tests"}}
|
||||
|
||||
:metabase/disallow-hardcoded-driver-names-in-tests
|
||||
{:level :warning}}}}}
|
||||
|
||||
16
.clj-kondo/src/hooks/metabase/util/timing.clj
Normal file
@@ -0,0 +1,16 @@
|
||||
(ns hooks.metabase.util.timing
|
||||
"Custom CLJ Kondo hooks for timing-related linting rules."
|
||||
(:require [clj-kondo.hooks-api :as api]))
|
||||
|
||||
(defn discourage-millis-duration
|
||||
"Discourage slow and unreliable duration calculations using System/currentTimeMillis "
|
||||
[{:keys [node]}]
|
||||
(let [sexpr (api/sexpr node)]
|
||||
(when (and (list? sexpr) (= (first sexpr) '-) (>= (count sexpr) 2))
|
||||
(let [first-arg (second sexpr)]
|
||||
(when (= first-arg (list 'System/currentTimeMillis))
|
||||
(api/reg-finding!
|
||||
(assoc (meta node)
|
||||
:message "Avoid System/currentTimeMillis for calculating durations. Use u/start-timer and u/since-ms for more reliability."
|
||||
:type :metabase/discourage-millis-duration
|
||||
:level :warning)))))))
|
||||
@@ -152,6 +152,7 @@
|
||||
metabase.lib.join/with-join-alias [[:default]]
|
||||
metabase.lib.join/with-join-conditions [[:default]]
|
||||
metabase.lib.test-util.macros/$ids [[:inner 0]]
|
||||
metabase.lib.test-util.macros/mbql-5-query [[:inner 0]]
|
||||
metabase.lib.test-util.macros/mbql-query [[:inner 0]]
|
||||
metabase.lib.util.match/match [[:inner 0]]
|
||||
metabase.lib.util.match/match-one [[:inner 0]]
|
||||
@@ -284,6 +285,7 @@
|
||||
metabase.upload.impl-test/with-upload-table! [[:inner 0]]
|
||||
metabase.upload.types/with-currency [[:default]]
|
||||
metabase.upload.types/with-parens [[:default]]
|
||||
metabase.util/for-map [[:block 1]]
|
||||
metabase.util.async/cancelable-thread [[:block 0]]
|
||||
metabase.util.date-2/with-time-zone-same-instant [[:default]]
|
||||
metabase.util.encryption-test/with-secret-key [[:block 1]]
|
||||
|
||||
15
.eslintrc.js
@@ -1,6 +1,8 @@
|
||||
/* eslint-disable import/no-commonjs */
|
||||
/* eslint-disable no-undef */
|
||||
|
||||
const path = require("path");
|
||||
|
||||
// `postcss-modules` lints css modules class names, but it currently crashes
|
||||
// eslint on vscode. If you use webstorm or want to run the lint for the cli, you
|
||||
// can use this flag to enable it. This is set to true in CI
|
||||
@@ -155,6 +157,7 @@ module.exports = {
|
||||
"import/internal-regex": "^metabase/|^metabase-lib/",
|
||||
"import/resolver": {
|
||||
webpack: {
|
||||
config: path.resolve(__dirname, "./rspack.main.config.js"),
|
||||
typescript: true,
|
||||
},
|
||||
},
|
||||
@@ -203,8 +206,9 @@ module.exports = {
|
||||
"e2e/**/*",
|
||||
"**/tests/*",
|
||||
"release/**/*",
|
||||
"webpack.config.js",
|
||||
"rspack.config.js",
|
||||
"rspack.main.config.js",
|
||||
"rspack.embedding-sdk-bundle.config.js",
|
||||
],
|
||||
rules: {
|
||||
"no-color-literals": "off",
|
||||
@@ -221,8 +225,7 @@ module.exports = {
|
||||
"e2e/**/*",
|
||||
"**/tests/*",
|
||||
"release/**/*",
|
||||
"webpack.config.js",
|
||||
"rspack.config.js",
|
||||
"rspack.main.config.js",
|
||||
],
|
||||
rules: {
|
||||
"i18next/no-literal-string": "off",
|
||||
@@ -333,5 +336,11 @@ module.exports = {
|
||||
"no-color-literals": "off",
|
||||
},
|
||||
},
|
||||
{
|
||||
files: ["frontend/build/**/*.js"],
|
||||
rules: {
|
||||
"import/no-commonjs": "off",
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
6
.github/CODEOWNERS
vendored
@@ -5,7 +5,7 @@ enterprise/frontend/src/embedding-sdk @metabase/embedding
|
||||
frontend/src/metabase/embedding-sdk @metabase/embedding
|
||||
frontend/src/metabase/public/containers/PublicOrEmbeddedQuestion @metabase/embedding
|
||||
frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard @metabase/embedding
|
||||
frontend/src/metabase/ui @metabase/core-frontend-admin-webapp
|
||||
frontend/src/metabase/ui @metabase/core-frontend-ux-west
|
||||
# snowplow/* @metabase/data
|
||||
src/metabase/analytics/prometheus.clj @metabase/cloud-ops
|
||||
.github @metabase/devexp
|
||||
@@ -95,8 +95,8 @@ test/metabase/driver/sql_jdbc/actions_test.clj @metabase/core-workflows
|
||||
# enterprise/backend/src/metabase_enterprise/upload_management @metabase/core-backend-admin-webapp
|
||||
# enterprise/backend/test/metabase_enterprise/upload_management @metabase/core-backend-admin-webapp
|
||||
|
||||
src/metabase/actions @metabase/core-backend-admin-webapp
|
||||
test/metabase/actions @metabase/core-backend-admin-webapp
|
||||
src/metabase/actions @metabase/core-backend-ux-west
|
||||
test/metabase/actions @metabase/core-backend-ux-west
|
||||
|
||||
# src/metabase/activity_feed @metabase/core-backend-admin-webapp
|
||||
# test/metabase/activity_feed @metabase/core-backend-admin-webapp
|
||||
|
||||
3
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -63,7 +63,8 @@ body:
|
||||
attributes:
|
||||
label: Information about your Metabase installation
|
||||
description: |
|
||||
Copy and paste the JSON from `Admin -> Troubleshooting`.
|
||||
For versions >= 56, copy and paste the Diagnostic info from `Admin -> Tools -> Help`.
|
||||
For versions < 56, copy and paste the Diagnostic info from `Admin -> Troubleshooting`.
|
||||
_This will be automatically formatted into code, so no need for backticks._
|
||||
placeholder: |
|
||||
{"browser-info": {
|
||||
|
||||
3
.github/actions/await-port/action.yml
vendored
@@ -1,4 +1,5 @@
|
||||
name: Wait for localhost port to be ready
|
||||
name: await-port
|
||||
description: Wait for localhost port to be ready
|
||||
|
||||
inputs:
|
||||
port:
|
||||
|
||||
1
.github/actions/test-driver/action.yml
vendored
@@ -1,4 +1,5 @@
|
||||
name: Test database driver
|
||||
description: Test database driver
|
||||
inputs:
|
||||
junit-name:
|
||||
required: true
|
||||
|
||||
@@ -11,4 +11,7 @@ runs:
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ inputs.github-token }}
|
||||
shell: bash
|
||||
run: bash ${{ github.action_path }}/upgrade-deps.sh
|
||||
run: |
|
||||
git config --global user.email "github-automation@metabase.com"
|
||||
git config --global user.name "Metabase Automation"
|
||||
bash ${{ github.action_path }}/upgrade-deps.sh
|
||||
|
||||
@@ -59,6 +59,11 @@ for upgrade in $UPGRADES; do
|
||||
|
||||
# Commit the dependency update, and link to the diff
|
||||
git add deps.edn modules
|
||||
|
||||
# Use an email and name that will pass the CLA check:
|
||||
git config --global user.email "github-automation@metabase.com"
|
||||
git config --global user.name "Metabase Automation"
|
||||
|
||||
git commit -m ${TITLE} -m ${BODY} --no-verify
|
||||
git push -u origin $BRANCH_NAME
|
||||
|
||||
|
||||
52
.github/copilot-instructions.md
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
# Metabase Developer Assistant Instructions
|
||||
|
||||
## Frontend Development
|
||||
|
||||
### Repository Structure
|
||||
|
||||
```
|
||||
frontend/src/
|
||||
├── metabase/ # Main application components and pages
|
||||
├── metabase-lib/ # Query building and data modeling utilities
|
||||
├── metabase-types/ # TypeScript type definitions
|
||||
└── metabase/ui/ # Design system components
|
||||
|
||||
e2e/ # Cypress end-to-end tests
|
||||
frontend/test/ # Jest unit tests
|
||||
```
|
||||
|
||||
### Technology Stack
|
||||
|
||||
- **Framework**: React 18 with TypeScript
|
||||
- **State**: Redux Toolkit
|
||||
- **Styling**: CSS Modules (preferred) > Emotion styled-components
|
||||
- **UI**: `metabase/ui` components built with Mantine v8
|
||||
- **Build**: Rspack (primary), Webpack (legacy)
|
||||
- **Testing**: Jest + React Testing Library, Cypress
|
||||
|
||||
### Coding Standards
|
||||
|
||||
#### Component Preferences
|
||||
|
||||
- Prefer `metabase/ui`components over `metabase/common/components`
|
||||
- Use `.tsx` for components, `.ts` for utilities
|
||||
|
||||
#### Styling
|
||||
|
||||
ALWAYS prefer Mantine style props,then CSS modules. DO NOT suggest styled components, they are deprecated.
|
||||
|
||||
#### TypeScript Migration
|
||||
|
||||
When heavily editing `.js`/`.jsx` files, create a separate PR to convert to TypeScript first, then implement changes.
|
||||
|
||||
#### Enterprise Features
|
||||
|
||||
Enterprise functionality MUST use the plugin system. It is very important to not expose enterprise code in the OSS version.
|
||||
|
||||
#### Testing Requirements
|
||||
|
||||
All PRs should include tests. Prefer Unit tests over E2E tests.
|
||||
|
||||
#### Localization
|
||||
|
||||
All user-facing strings MUST be localized using the ttag library. Localized strings should be complete phrases, do not concatenate a few separately localized strings. You should add context to strings where the meaning of the string might not be obvious in isolation: e.g. "Home" might have different words in some languages depending on whether you're talking about a dwelling or the landing page for a website.
|
||||
7
.github/file-paths.yaml
vendored
@@ -29,9 +29,9 @@ frontend_configs: &frontend_configs
|
||||
- ".eslintrc.js"
|
||||
- "postcss.config.js"
|
||||
- "rspack.config.js"
|
||||
- "webpack.config.js"
|
||||
- "webpack.embedding-sdk.config.js"
|
||||
- "webpack.static-viz.config.js"
|
||||
- "rspack.main.config.js"
|
||||
- "rspack.embedding-sdk-bundle.config.js"
|
||||
- "rspack.static-viz.config.js"
|
||||
- ".nvmrc"
|
||||
|
||||
frontend_sources: &frontend_sources
|
||||
@@ -132,6 +132,7 @@ e2e_embedding_sdk_compatibility:
|
||||
- *default
|
||||
- *frontend_embedding_sdk_ci
|
||||
- *frontend_sources
|
||||
- *backend_sources
|
||||
- "e2e/embedding-sdk-host-apps/**"
|
||||
- "e2e/runner/embedding-sdk/**"
|
||||
- "e2e/test-host-app/**/*.cy.*.{js,ts}"
|
||||
|
||||
82
.github/team.json
vendored
@@ -8,22 +8,11 @@
|
||||
"romeovs",
|
||||
"bshepherdson",
|
||||
"metamben",
|
||||
"appleby",
|
||||
"uladzimirdev",
|
||||
"wzimrin",
|
||||
"ericnormand",
|
||||
"galdre"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Semantic Layer",
|
||||
"label": ".Team/SemanticLayer",
|
||||
"members": [
|
||||
"kamilmielnik",
|
||||
"lbrdnk",
|
||||
"bronsa"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Drivers",
|
||||
"label": ".Team/Drivers",
|
||||
@@ -37,10 +26,10 @@
|
||||
"label": ".Team/Embedding",
|
||||
"members": [
|
||||
"WiNloSt",
|
||||
"oisincoveney",
|
||||
"npretto",
|
||||
"heypoom",
|
||||
"sanex3339"
|
||||
"sanex3339",
|
||||
"lorem--ipsum"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -50,35 +39,18 @@
|
||||
"qnkhuat",
|
||||
"piranha",
|
||||
"crisptrutski",
|
||||
"deniskaber",
|
||||
"wotbrew",
|
||||
"spalt08",
|
||||
"stasgavrylov"
|
||||
"stasgavrylov",
|
||||
"uladzimirdev",
|
||||
"kulyk",
|
||||
"kamilmielnik"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Admin Webapp",
|
||||
"label": ".Team/AdminWebapp",
|
||||
"members": [
|
||||
"npfitz",
|
||||
"johnswanson",
|
||||
"rafpaf",
|
||||
"iethree",
|
||||
"nvoxland",
|
||||
"fraserdrops",
|
||||
"edpaget"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "DashViz",
|
||||
"label": ".Team/DashViz",
|
||||
"members": [
|
||||
"alxnddr",
|
||||
"kulyk",
|
||||
"tsplude",
|
||||
"lorem--ipsum",
|
||||
"noahmoss",
|
||||
"bpander"
|
||||
"eliotmetabase"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -93,20 +65,54 @@
|
||||
"name": "Metabot",
|
||||
"label": ".Team/Metabot",
|
||||
"members": [
|
||||
"appleby",
|
||||
"noahmoss",
|
||||
"retro",
|
||||
"sloansparger",
|
||||
"somtom"
|
||||
"somtom",
|
||||
"wotbrew",
|
||||
"tsplude",
|
||||
"lbrdnk",
|
||||
"bronsa"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Product Growth",
|
||||
"label": ".Team/ProductGrowth",
|
||||
"members": ["nemanjaglumac", "chodorowicz"]
|
||||
"members": [
|
||||
"nemanjaglumac",
|
||||
"chodorowicz",
|
||||
"andsalves"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Cloud",
|
||||
"label": "cloud",
|
||||
"members": []
|
||||
"members": [
|
||||
"filipesilva"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "DashViz",
|
||||
"label": ".Team/DashViz",
|
||||
"members": [
|
||||
"eliotmetabase"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "UX West",
|
||||
"label": ".Team/UXWest",
|
||||
"members": [
|
||||
"eliotmetabase",
|
||||
"npfitz",
|
||||
"johnswanson",
|
||||
"iethree",
|
||||
"nvoxland",
|
||||
"edpaget",
|
||||
"deniskaber",
|
||||
"alxnddr",
|
||||
"bpander"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
21
.github/workflows/claude.yml
vendored
@@ -1,21 +0,0 @@
|
||||
name: Claude Assistant
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
pull_request_review_comment:
|
||||
types: [created]
|
||||
issues:
|
||||
types: [opened, assigned, labeled]
|
||||
pull_request_review:
|
||||
types: [submitted]
|
||||
|
||||
jobs:
|
||||
claude-response:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: git config --global --add safe.directory /__w/metabase/metabase
|
||||
- uses: actions/checkout@v4
|
||||
- uses: anthropics/claude-code-action@beta
|
||||
with:
|
||||
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
2
.github/workflows/cljs.yml
vendored
@@ -40,5 +40,5 @@ jobs:
|
||||
uses: ./.github/actions/prepare-backend
|
||||
with:
|
||||
m2-cache-key: 'cljs'
|
||||
- name: Run Cljs tests for shared/ code
|
||||
- name: Run Cljs tests
|
||||
run: yarn run test-cljs
|
||||
|
||||
26
.github/workflows/coverage.yml
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
name: Test coverage
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '40 1 * * *' # every day at 1:40
|
||||
|
||||
jobs:
|
||||
fe-test-coverage:
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 30
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Prepare front-end environment
|
||||
uses: ./.github/actions/prepare-frontend
|
||||
- name: Prepare back-end environment
|
||||
uses: ./.github/actions/prepare-backend
|
||||
with:
|
||||
m2-cache-key: "cljs"
|
||||
- name: Run frontend unit tests
|
||||
run: yarn run test-unit --silent --coverage
|
||||
- name: Upload coverage to codecov.io
|
||||
uses: codecov/codecov-action@v4
|
||||
with:
|
||||
files: ./coverage/lcov.info
|
||||
flags: front-end
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
39
.github/workflows/drivers.yml
vendored
@@ -21,11 +21,17 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
- name: Fetch base branch
|
||||
if: github.event_name == 'pull_request' && github.event.pull_request.base.ref != ''
|
||||
run: |
|
||||
# Fetch the base branch to ensure its history is available for diffing
|
||||
git fetch origin ${{ github.event.pull_request.base.ref }}:${{ github.event.pull_request.base.ref }}
|
||||
# Only run this if it's a pull request and the base ref exists
|
||||
- name: Check if tier3 drivers should run
|
||||
id: check_team_and_branch
|
||||
run: |
|
||||
IS_MASTER_OR_RELEASE="${{ github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/heads/release-') }}"
|
||||
HAS_TEAM_LABEL="${{ contains(github.event.pull_request.labels.*.name, '.Team/Drivers') || contains(github.event.pull_request.labels.*.name, '.Team/Querying') || contains(github.event.pull_request.labels.*.name, '.Team/SemanticLayer') }}"
|
||||
HAS_TEAM_LABEL="${{ contains(github.event.pull_request.labels.*.name, '.Team/Drivers') || contains(github.event.pull_request.labels.*.name, '.Team/Querying') || contains(github.event.pull_request.labels.*.name, '.Team/SemanticLayer') || contains(github.event.pull_request.labels.*.name, '.Team/DevEx') }}"
|
||||
|
||||
|
||||
echo "Is master or release: ${IS_MASTER_OR_RELEASE}"
|
||||
@@ -37,8 +43,25 @@ jobs:
|
||||
echo "skip=false" >> $GITHUB_OUTPUT
|
||||
echo "A relevant team label is present. Tier 3 driver tests will run."
|
||||
else
|
||||
echo "skip=true" >> $GITHUB_OUTPUT
|
||||
echo "Not labeled with required team and not merging into master/release. Tier 3 driver tests will be skipped."
|
||||
echo "Checking for changes in relevant folders..."
|
||||
CHANGED_FILES=$(git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ github.sha }})
|
||||
|
||||
# Initialize an empty array to store folders with changes
|
||||
CHANGED_FOLDERS=()
|
||||
for folder in "src/metabase/lib" "src/metabase/query_processor" "modules/drivers"; do
|
||||
if echo "$CHANGED_FILES" | grep -q "$folder"; then
|
||||
CHANGED_FOLDERS+=("$folder")
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ ${#CHANGED_FOLDERS[@]} -gt 0 ]]; then
|
||||
echo "skip=false" >> $GITHUB_OUTPUT
|
||||
echo "Changes detected in the following folders: ${CHANGED_FOLDERS[*]}."
|
||||
echo "Tier 3 driver tests will run."
|
||||
else
|
||||
echo "skip=true" >> $GITHUB_OUTPUT
|
||||
echo "No relevant team label, not merging into master/release, and no changes in relevant folders. Tier 3 driver tests will be skipped."
|
||||
fi
|
||||
fi
|
||||
shell: bash
|
||||
be-tests-athena-ee:
|
||||
@@ -50,9 +73,11 @@ jobs:
|
||||
CI: 'true'
|
||||
DRIVERS: athena
|
||||
MB_ATHENA_TEST_REGION: us-east-1
|
||||
MB_ATHENA_TEST_REGION_ROUTING: us-east-2
|
||||
MB_ATHENA_TEST_ACCESS_KEY: ${{ secrets.MB_ATHENA_TEST_ACCESS_KEY }}
|
||||
MB_ATHENA_TEST_SECRET_KEY: ${{ secrets.MB_ATHENA_TEST_SECRET_KEY }}
|
||||
MB_ATHENA_TEST_S3_STAGING_DIR: ${{ secrets.MB_ATHENA_TEST_S3_STAGING_DIR }}
|
||||
MB_ATHENA_TEST_S3_STAGING_DIR_ROUTING: ${{ secrets.MB_ATHENA_TEST_S3_STAGING_DIR_ROUTING }}
|
||||
# These credentials are used to test the driver when the user does not have the athena:GetTableMetadata permission
|
||||
MB_ATHENA_TEST_WITHOUT_GET_TABLE_METADATA_ACCESS_KEY: ${{ secrets.MB_ATHENA_TEST_WITHOUT_GET_TABLE_METADATA_ACCESS_KEY }}
|
||||
MB_ATHENA_TEST_WITHOUT_GET_TABLE_METADATA_SECRET_KEY: ${{ secrets.MB_ATHENA_TEST_WITHOUT_GET_TABLE_METADATA_SECRET_KEY }}
|
||||
@@ -90,6 +115,7 @@ jobs:
|
||||
MB_BIGQUERY_TEST_ACCESS_TOKEN: ${{ secrets.MB_BIGQUERY_TEST_ACCESS_TOKEN }}
|
||||
MB_BIGQUERY_TEST_REFRESH_TOKEN: ${{ secrets.MB_BIGQUERY_TEST_REFRESH_TOKEN }}
|
||||
MB_BIGQUERY_CLOUD_SDK_TEST_SERVICE_ACCOUNT_JSON: ${{ secrets.MB_BIGQUERY_CLOUD_SDK_TEST_SERVICE_ACCOUNT_JSON }}
|
||||
MB_BIGQUERY_CLOUD_SDK_TEST_SERVICE_ACCOUNT_JSON_ROUTING: ${{ secrets.MB_BIGQUERY_CLOUD_SDK_TEST_SERVICE_ACCOUNT_JSON_ROUTING }}
|
||||
name: BigQuery
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
@@ -242,6 +268,7 @@ jobs:
|
||||
MB_DATABRICKS_TEST_HTTP_PATH: ${{ secrets.MB_DATABRICKS_JDBC_TEST_HTTP_PATH }}
|
||||
MB_DATABRICKS_TEST_TOKEN: ${{ secrets.MB_DATABRICKS_JDBC_TEST_TOKEN }}
|
||||
MB_DATABRICKS_TEST_CATALOG: 'metabase_ci'
|
||||
MB_DATABRICKS_TEST_CATALOG_ROUTING: 'metabase_routing_catalog'
|
||||
MB_DATABRICKS_TEST_CLIENT_ID: ${{ secrets.MB_DATABRICKS_JDBC_TEST_CLIENT_ID }}
|
||||
MB_DATABRICKS_TEST_OAUTH_SECRET: ${{ secrets.MB_DATABRICKS_JDBC_TEST_OAUTH_SECRET }}
|
||||
name: Databricks
|
||||
@@ -278,6 +305,7 @@ jobs:
|
||||
MB_DATABRICKS_TEST_HTTP_PATH: ${{ secrets.MB_DATABRICKS_JDBC_TEST_HTTP_PATH }}
|
||||
MB_DATABRICKS_TEST_TOKEN: ${{ secrets.MB_DATABRICKS_JDBC_TEST_TOKEN }}
|
||||
MB_DATABRICKS_TEST_CATALOG: 'metabase_ci'
|
||||
MB_DATABRICKS_TEST_CATALOG_ROUTING: 'metabase_routing_catalog'
|
||||
MB_DATABRICKS_TEST_CLIENT_ID: ${{ secrets.MB_DATABRICKS_JDBC_TEST_CLIENT_ID }}
|
||||
MB_DATABRICKS_TEST_OAUTH_SECRET: ${{ secrets.MB_DATABRICKS_JDBC_TEST_OAUTH_SECRET }}
|
||||
name: Databricks (Multi-Catalog)
|
||||
@@ -830,6 +858,7 @@ jobs:
|
||||
DRIVERS: redshift
|
||||
MB_REDSHIFT_TEST_USER: metabase_ci
|
||||
MB_REDSHIFT_TEST_DB: testdb
|
||||
MB_REDSHIFT_TEST_DB_ROUTING: dev
|
||||
MB_REDSHIFT_TEST_HOST: ${{ secrets.MB_REDSHIFT_TEST_HOST }}
|
||||
MB_REDSHIFT_TEST_PASSWORD: ${{ secrets.MB_REDSHIFT_TEST_PASSWORD }}
|
||||
name: ${{ matrix.job.name }}
|
||||
@@ -867,6 +896,10 @@ jobs:
|
||||
MB_SNOWFLAKE_TEST_WAREHOUSE: ${{ secrets.MB_SNOWFLAKE_TEST_WAREHOUSE }}
|
||||
MB_SNOWFLAKE_TEST_PK_USER: METABASE PK
|
||||
MB_SNOWFLAKE_TEST_PK_PRIVATE_KEY: ${{ secrets.MB_SNOWFLAKE_TEST_PK_PRIVATE_KEY }}
|
||||
MB_SNOWFLAKE_TEST_PK_PRIVATE_KEY_2: ${{ secrets.MB_SNOWFLAKE_TEST_PK_PRIVATE_KEY_2 }}
|
||||
MB_SNOWFLAKE_TEST_PK_PUBLIC_KEY: ${{ secrets.MB_SNOWFLAKE_TEST_PK_PUBLIC_KEY }}
|
||||
MB_SNOWFLAKE_TEST_PK_PUBLIC_KEY_2: ${{ secrets.MB_SNOWFLAKE_TEST_PK_PUBLIC_KEY_2 }}
|
||||
|
||||
# RSA Role testing:
|
||||
MB_SNOWFLAKE_TEST_RSA_ROLE_TEST_DEFAULT_USER: RSA_ROLE_TEST_DEFAULT_USER
|
||||
MB_SNOWFLAKE_TEST_RSA_ROLE_TEST_CUSTOM_USER: RSA_ROLE_TEST_CUSTOM_USER
|
||||
|
||||
@@ -116,7 +116,7 @@ jobs:
|
||||
CYPRESS_MB_PRO_CLOUD_TOKEN: ${{ secrets.MB_PRO_CLOUD_TOKEN }}
|
||||
CYPRESS_MB_PRO_SELF_HOSTED_TOKEN: ${{ secrets.MB_PRO_SELF_HOSTED_TOKEN }}
|
||||
CYPRESS_PULL_REQUEST_ID: ${{ github.event.pull_request.number || '' }}
|
||||
CYPRESS_IS_EMBEDDING_SDK: true
|
||||
CYPRESS_IS_EMBEDDING_SDK: "true"
|
||||
COMMIT_INFO_MESSAGE: ${{ github.event.pull_request.title || github.event.head_commit.message || github.event.head.sha }}
|
||||
TZ: US/Pacific # to make node match the instance tz
|
||||
CYPRESS_CI: true
|
||||
|
||||
@@ -215,7 +215,7 @@ jobs:
|
||||
PR_NUMBER: ${{ github.event.pull_request.number || '' }}
|
||||
HASH: ${{ github.event.pull_request.head.sha || github.sha }}-${{ github.run_attempt }}
|
||||
CYPRESS_MB_ALL_FEATURES_TOKEN: ${{ secrets.MB_ALL_FEATURES_TOKEN }}
|
||||
CYPRESS_IS_EMBEDDING_SDK: true
|
||||
CYPRESS_IS_EMBEDDING_SDK: "true"
|
||||
TZ: US/Pacific # to make node match the instance tz
|
||||
CYPRESS_CI: true
|
||||
SAMPLE_APP_BRANCH_NAME: ${{ needs.get-sample-apps-data.outputs.branch_name }}
|
||||
@@ -325,13 +325,14 @@ jobs:
|
||||
needs: [get-build-requirements, build]
|
||||
strategy:
|
||||
matrix:
|
||||
test_suite: [
|
||||
"vite-6-host-app-e2e",
|
||||
"next-15-app-router-host-app-e2e",
|
||||
"next-15-pages-router-host-app-e2e",
|
||||
"angular-20-host-app-e2e",
|
||||
]
|
||||
environment: [ "production", "development" ]
|
||||
test_suite:
|
||||
[
|
||||
"vite-6-host-app-e2e",
|
||||
"next-15-app-router-host-app-e2e",
|
||||
"next-15-pages-router-host-app-e2e",
|
||||
"angular-20-host-app-e2e",
|
||||
]
|
||||
environment: ["production", "development"]
|
||||
if: |
|
||||
!cancelled() && needs.build.result == 'success'
|
||||
runs-on: ubuntu-22.04
|
||||
@@ -344,7 +345,7 @@ jobs:
|
||||
PR_NUMBER: ${{ github.event.pull_request.number || '' }}
|
||||
HASH: ${{ github.event.pull_request.head.sha || github.sha }}-${{ github.run_attempt }}
|
||||
CYPRESS_MB_ALL_FEATURES_TOKEN: ${{ secrets.MB_ALL_FEATURES_TOKEN }}
|
||||
CYPRESS_IS_EMBEDDING_SDK: true
|
||||
CYPRESS_IS_EMBEDDING_SDK: "true"
|
||||
TZ: US/Pacific # to make node match the instance tz
|
||||
CYPRESS_CI: true
|
||||
HOST_APP_ENVIRONMENT: ${{ matrix.environment }}
|
||||
|
||||
2
.github/workflows/e2e-test.yml
vendored
@@ -57,7 +57,7 @@ jobs:
|
||||
TZ: US/Pacific # to make node match the instance tz
|
||||
CYPRESS_CI: true
|
||||
CYPRESS_QA_DB_MONGO: ${{ inputs.name == 'mongo' }}
|
||||
CYPRESS_IS_EMBEDDING_SDK: ${{ inputs.name == 'embedding-sdk' }}
|
||||
CYPRESS_IS_EMBEDDING_SDK: "${{ inputs.name == 'embedding-sdk' }}"
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
|
||||
80
.github/workflows/e2e-tests.yml
vendored
@@ -22,72 +22,6 @@ jobs:
|
||||
chunks: 50
|
||||
specs: ${{ inputs.specs }}
|
||||
|
||||
# if this is a test on a release branch, we need to check the build requirements
|
||||
get-build-requirements:
|
||||
if: |
|
||||
!cancelled() &&
|
||||
contains(github.ref, 'release-x')
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 10
|
||||
outputs:
|
||||
java_version: ${{ fromJson(steps.dependencies.outputs.result).java_version }}
|
||||
node_version: ${{ fromJson(steps.dependencies.outputs.result).node_version }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
sparse-checkout: release
|
||||
- name: Prepare build scripts
|
||||
run: cd ${{ github.workspace }}/release && yarn && yarn build
|
||||
- name: Get build dependencies
|
||||
uses: actions/github-script@v7
|
||||
id: dependencies
|
||||
with:
|
||||
script: | # js
|
||||
const { getBuildRequirements, getVersionFromReleaseBranch } = require('${{ github.workspace }}/release/dist/index.cjs');
|
||||
|
||||
const version = getVersionFromReleaseBranch('${{ github.ref }}');
|
||||
const requirements = getBuildRequirements(version);
|
||||
|
||||
return {
|
||||
java_version: requirements.java,
|
||||
node_version: requirements.node,
|
||||
};
|
||||
|
||||
build:
|
||||
needs: [get-build-requirements]
|
||||
if: ${{ !cancelled() && !inputs.skip }}
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 15
|
||||
strategy:
|
||||
matrix:
|
||||
edition: [oss, ee]
|
||||
env:
|
||||
MB_EDITION: ${{ matrix.edition }}
|
||||
INTERACTIVE: false
|
||||
# make sure that builds on release branches get licenses, because we use them for releases
|
||||
SKIP_LICENSES: ${{ github.event_name == 'pull_request' }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Prepare front-end environment
|
||||
uses: ./.github/actions/prepare-frontend
|
||||
with:
|
||||
node-version: "${{ needs.get-build-requirements.outputs.node_version }}"
|
||||
- name: Prepare back-end environment
|
||||
uses: ./.github/actions/prepare-backend
|
||||
with:
|
||||
m2-cache-key: uberjar
|
||||
java-version: "${{ needs.get-build-requirements.outputs.java_version || 21 }}"
|
||||
|
||||
- name: Build uberjar with ./bin/build.sh
|
||||
timeout-minutes: 10
|
||||
run: ./bin/build.sh
|
||||
shell: bash
|
||||
|
||||
- name: Prepare uberjar artifact
|
||||
uses: ./.github/actions/prepare-uberjar-artifact
|
||||
with:
|
||||
name: metabase-${{ matrix.edition }}-${{ github.event.pull_request.head.sha || github.sha }}-uberjar
|
||||
|
||||
reset-e2e-test-comment:
|
||||
if: ${{ github.event_name == 'pull_request' }}
|
||||
runs-on: ubuntu-latest
|
||||
@@ -124,9 +58,8 @@ jobs:
|
||||
uses: ./.github/workflows/e2e-test.yml
|
||||
needs:
|
||||
- e2e-matrix-builder
|
||||
- build
|
||||
if: |
|
||||
!cancelled() && needs.build.result == 'success'
|
||||
!cancelled() && !inputs.skip
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix: ${{ fromJson(needs.e2e-matrix-builder.outputs.matrix) }}
|
||||
@@ -145,11 +78,10 @@ jobs:
|
||||
name: Flaky e2e Tests
|
||||
uses: ./.github/workflows/e2e-test.yml
|
||||
needs:
|
||||
- build
|
||||
- e2e-matrix-builder
|
||||
# skip flaky test run if only e2e specs changed as an optimization
|
||||
if: |
|
||||
!cancelled() && needs.build.result == 'success' && needs.e2e-matrix-builder.outputs.isDefaultSpecPattern == 'true'
|
||||
!cancelled() && !inputs.skip && needs.e2e-matrix-builder.outputs.isDefaultSpecPattern == 'true'
|
||||
secrets: inherit
|
||||
with:
|
||||
name: Flaky
|
||||
@@ -181,11 +113,3 @@ jobs:
|
||||
echo "E2E Tests failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
pr-env:
|
||||
needs: [build]
|
||||
if: |
|
||||
!cancelled() &&
|
||||
contains(github.event.pull_request.labels.*.name, 'PR-Env')
|
||||
uses: ./.github/workflows/pr-env.yml
|
||||
secrets: inherit
|
||||
|
||||
32
.github/workflows/frontend.yml
vendored
@@ -9,6 +9,16 @@ on:
|
||||
skip-lint:
|
||||
type: boolean
|
||||
default: false
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
skip:
|
||||
description: "Skip main frontend jobs (type-check, unit tests, timezone tests)"
|
||||
type: boolean
|
||||
default: false
|
||||
skip-lint:
|
||||
description: "Skip linting jobs (prettier, eslint, css variables check)"
|
||||
type: boolean
|
||||
default: false
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }}-frontend
|
||||
@@ -63,8 +73,13 @@ jobs:
|
||||
fe-tests-unit:
|
||||
if: ${{ !inputs.skip }}
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 60
|
||||
timeout-minutes: 30
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
shard: [1, 2] # 2 shards for parallel execution
|
||||
env:
|
||||
SHARDS: 2 # should match matrix above
|
||||
JEST_JUNIT_OUTPUT_DIR: ./target/junit
|
||||
JEST_JUNIT_OUTPUT_NAME: test-report-frontend-unit.xml
|
||||
steps:
|
||||
@@ -75,22 +90,11 @@ jobs:
|
||||
uses: ./.github/actions/prepare-backend
|
||||
with:
|
||||
m2-cache-key: "cljs"
|
||||
- name: Run frontend unit tests and collect the code coverage information
|
||||
if: github.ref_name == 'master'
|
||||
run: yarn run test-unit --coverage --silent
|
||||
- name: Run frontend unit tests
|
||||
if: github.ref_name != 'master'
|
||||
run: yarn run test-unit --silent
|
||||
- name: Upload coverage to codecov.io
|
||||
if: github.ref_name == 'master'
|
||||
uses: codecov/codecov-action@v4
|
||||
with:
|
||||
files: ./coverage/lcov.info
|
||||
flags: front-end
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
run: yarn run test-unit --silent --shard=${{ matrix.shard }}/${{ env.SHARDS }}
|
||||
- name: Upload Test Results
|
||||
uses: ./.github/actions/upload-test-results
|
||||
if: always()
|
||||
if: always() && github.event_name != 'workflow_dispatch'
|
||||
with:
|
||||
input-path: ./target/junit
|
||||
output-name: frontend-unit
|
||||
|
||||
10
.github/workflows/fuzzing.yml
vendored
@@ -7,10 +7,10 @@ on:
|
||||
- "master"
|
||||
- "release-**"
|
||||
paths:
|
||||
- "frontend/src/metabase-lib/expressions/**"
|
||||
- "frontend/src/metabase/querying/expressions/**"
|
||||
pull_request:
|
||||
paths:
|
||||
- "frontend/src/metabase-lib/expressions/**"
|
||||
- "frontend/src/metabase/querying/expressions/**"
|
||||
|
||||
jobs:
|
||||
fe-fuzz-lexifier:
|
||||
@@ -24,7 +24,7 @@ jobs:
|
||||
uses: ./.github/actions/prepare-backend
|
||||
with:
|
||||
m2-cache-key: "cljs"
|
||||
- run: yarn test-unit frontend/src/metabase-lib/v1/expressions/pratt/fuzz.lexifier.unit.spec.ts
|
||||
- run: yarn test-unit frontend/src/metabase/querying/expressions/pratt/fuzz.lexifier.unit.spec.ts
|
||||
env:
|
||||
MB_FUZZ: 1
|
||||
name: Run fuzz testing on the lexifier
|
||||
@@ -40,7 +40,7 @@ jobs:
|
||||
uses: ./.github/actions/prepare-backend
|
||||
with:
|
||||
m2-cache-key: "cljs"
|
||||
- run: yarn test-unit frontend/src/metabase-lib/v1/expressions/fuzz.compiler.unit.spec.ts
|
||||
- run: yarn test-unit frontend/src/metabase/querying/expressions/fuzz.compiler.unit.spec.ts
|
||||
env:
|
||||
MB_FUZZ: 1
|
||||
name: Run fuzz testing on the custom expression compiler
|
||||
@@ -56,7 +56,7 @@ jobs:
|
||||
uses: ./.github/actions/prepare-backend
|
||||
with:
|
||||
m2-cache-key: "cljs"
|
||||
- run: yarn test-unit frontend/src/metabase-lib/v1/expressions/fuzz.string.unit.spec.ts
|
||||
- run: yarn test-unit frontend/src/metabase/querying/expressions/fuzz.string.unit.spec.ts
|
||||
env:
|
||||
MB_FUZZ: 1
|
||||
name: Run fuzz testing on the custom expression string quoter
|
||||
|
||||
13
.github/workflows/optimize-images.yml
vendored
@@ -1,18 +1,19 @@
|
||||
name: Auto-Optimize Docs PNG Images
|
||||
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- 'docs/**/*.png'
|
||||
pull_request:
|
||||
types:
|
||||
- labeled
|
||||
|
||||
jobs:
|
||||
optimize-images:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
if: ${{ contains(github.event.pull_request.labels.*.name,'Type:Documentation') }}
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.head_ref }}
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Install pngcrush and bc
|
||||
@@ -31,8 +32,8 @@ jobs:
|
||||
if: steps.changed-files.outputs.any_changed == 'true'
|
||||
id: optimize
|
||||
run: |
|
||||
echo "Optimizing PNG files with pngcrush..."
|
||||
echo "Branch:" $(git_current_branch)
|
||||
echo "Optimizing new PNG files with pngcrush..."
|
||||
echo "Branch: $(git_current_branch)"
|
||||
|
||||
# Initialize tracking variables
|
||||
total_files=0
|
||||
|
||||
8
.github/workflows/pr-env-labeled.yml
vendored
@@ -9,9 +9,13 @@ concurrency:
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
uberjar:
|
||||
if: ${{ github.event.label.name == 'PR-Env' }}
|
||||
uses: ./.github/workflows/uberjar.yml
|
||||
secrets: inherit
|
||||
|
||||
pr-env:
|
||||
needs: [uberjar]
|
||||
if: ${{ github.event.label.name == 'PR-Env' }}
|
||||
uses: ./.github/workflows/pr-env.yml
|
||||
with:
|
||||
wait_for_uberjar: true
|
||||
secrets: inherit
|
||||
|
||||
68
.github/workflows/pr-env.yml
vendored
@@ -3,11 +3,6 @@ run-name: Building Dynamic PR Environment for ${{ github.ref_name }} by @${{ git
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
wait_for_uberjar:
|
||||
description: "Wait for uberjar build"
|
||||
required: false
|
||||
type: boolean
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -31,69 +26,10 @@ jobs:
|
||||
uses: aws-actions/amazon-ecr-login@v2
|
||||
with:
|
||||
registries: "${{ secrets.PR_ENV_AWS_ACCOUNT_ID }}"
|
||||
- name: Wait for uberjar
|
||||
id: wait_for_uberjar
|
||||
if: ${{ inputs.wait_for_uberjar == true }}
|
||||
run: |
|
||||
## Get workflow run id for uberjar build
|
||||
curl -Ls --output e2e-tests.json \
|
||||
-H "Accept: application/vnd.github+json" \
|
||||
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
|
||||
-H "X-GitHub-Api-Version: 2022-11-28" \
|
||||
https://api.github.com/repos/${{ github.repository }}/actions/workflows/run-tests.yml/runs?head_sha=${{ github.event.pull_request.head.sha || github.sha }}
|
||||
ID=$(jq -r '.workflow_runs[0].id' e2e-tests.json)
|
||||
echo "Run ID: ${ID}"
|
||||
|
||||
## Get workflow run id for uberjar build
|
||||
while [ -z "$JOB_ID" ]; do
|
||||
NEXT_URL="https://api.github.com/repos/${{ github.repository }}/actions/runs/${ID}/jobs?filter=latest"
|
||||
|
||||
# Search for build job
|
||||
echo "Searching for build job..."
|
||||
while [ -z "$JOB_ID" ] && [ -n "$NEXT_URL" ]; do
|
||||
# Get one page of jobs
|
||||
RESPONSE=$(curl -s -i \
|
||||
-H "Accept: application/vnd.github+json" \
|
||||
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
|
||||
-H "X-GitHub-Api-Version: 2022-11-28" \
|
||||
"$NEXT_URL")
|
||||
|
||||
# Extract headers and body
|
||||
HEADERS=$(echo "$RESPONSE" | sed -n '1,/^\r$/p')
|
||||
BODY=$(echo "$RESPONSE" | sed '1,/^\r$/d')
|
||||
LINK_HEADER=$(echo "$HEADERS" | grep -i '^link:' | sed 's/^link: //')
|
||||
|
||||
# Check for next page in Link header
|
||||
if echo "$LINK_HEADER" | grep -q 'rel="next"'; then
|
||||
NEXT_URL=$(echo "$LINK_HEADER" | sed -E 's/.*<([^>]+)>; rel="next".*/\1/')
|
||||
else
|
||||
NEXT_URL=""
|
||||
fi
|
||||
|
||||
# Check for build job
|
||||
JOB_ID=$(echo "$BODY" | jq -r '.jobs[] | select(.name | contains("build (ee)")) | .id')
|
||||
done
|
||||
done
|
||||
echo "Job ID: ${JOB_ID}"
|
||||
|
||||
## Wait for uberjar build to complete
|
||||
while [ true ]; do
|
||||
curl -Ls --output uberjar.json \
|
||||
-H "Accept: application/vnd.github+json" \
|
||||
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
|
||||
-H "X-GitHub-Api-Version: 2022-11-28" \
|
||||
https://api.github.com/repos/${{ github.repository }}/actions/jobs/${JOB_ID}
|
||||
jq -r '.steps[] | select(.name == "Prepare uberjar artifact") | .status' uberjar.json | grep -q "completed" && break
|
||||
echo "Waiting for uberjar build..."
|
||||
sleep 10
|
||||
done
|
||||
echo "run_id=$(jq -r '.workflow_runs[0].id' e2e-tests.json)" >> $GITHUB_OUTPUT
|
||||
- name: Retrieve uberjar artifact for ee
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: metabase-ee-${{ github.event.pull_request.head.sha || github.sha }}-uberjar
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
run-id: ${{ inputs.wait_for_uberjar && steps.wait_for_uberjar.outputs.run_id || github.run_id }}
|
||||
- name: Move uberjar to bin/docker
|
||||
run: |
|
||||
jar xf target/uberjar/metabase.jar
|
||||
@@ -107,7 +43,7 @@ jobs:
|
||||
tags: ${{ secrets.PR_ENV_AWS_ACCOUNT_ID }}.dkr.ecr.us-east-1.amazonaws.com/metabase-enterprise:pr${{ github.event.number }}
|
||||
push: true
|
||||
deploy_pr:
|
||||
needs: [ build ]
|
||||
needs: [build]
|
||||
runs-on: ubuntu-latest
|
||||
name: PR Review ENV
|
||||
permissions:
|
||||
@@ -191,7 +127,7 @@ jobs:
|
||||
kubectl apply -f ./metabase.yml
|
||||
preview_links:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [ deploy_pr ]
|
||||
needs: [deploy_pr]
|
||||
steps:
|
||||
- uses: marocchino/sticky-pull-request-comment@v2
|
||||
with:
|
||||
|
||||
14
.github/workflows/release-embedding-sdk.yml
vendored
@@ -16,6 +16,7 @@ on:
|
||||
- release-x.53.x
|
||||
- release-x.54.x
|
||||
- release-x.55.x
|
||||
- release-x.56.x
|
||||
- esbuild-main
|
||||
|
||||
concurrency:
|
||||
@@ -393,10 +394,19 @@ jobs:
|
||||
run: |
|
||||
echo //registry.npmjs.org/:_authToken=${{ secrets.NPM_RELEASE_TOKEN }} > .npmrc
|
||||
# Please keep the value in sync with `inputs.branch`'s release branch
|
||||
npm publish --tag ${{fromJson('{"master": "nightly", "release-x.51.x": "51-stable", "release-x.52.x": "52-stable", "release-x.53.x": "53-stable", "release-x.54.x": "54-stable", "release-x.55.x": "55-stable", "esbuild-main": "56-esbuild"}')[inputs.branch]}}
|
||||
npm publish --tag ${{fromJson('{
|
||||
"master": "nightly",
|
||||
"release-x.51.x": "51-stable",
|
||||
"release-x.52.x": "52-stable",
|
||||
"release-x.53.x": "53-stable",
|
||||
"release-x.54.x": "54-stable",
|
||||
"release-x.55.x": "55-stable",
|
||||
"release-x.56.x": "56-stable",
|
||||
"esbuild-main": "56-esbuild"
|
||||
}')[inputs.branch]}}
|
||||
|
||||
- name: Add `latest` tag to the latest release branch (`release-x.55.x`) deployment
|
||||
if: ${{ inputs.branch == 'release-x.55.x' }}
|
||||
if: ${{ inputs.branch == 'release-x.56.x' }}
|
||||
working-directory: sdk
|
||||
run: |
|
||||
npm dist-tag add @metabase/embedding-sdk-react@${{ env.sdk_version }} latest
|
||||
|
||||
2
.github/workflows/release-log.yml
vendored
@@ -7,9 +7,7 @@ on:
|
||||
- release-x.*
|
||||
tags:
|
||||
- v*
|
||||
- nightly-*
|
||||
- latest-*
|
||||
- beta-*
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
|
||||
9
.github/workflows/release-notes-preview.yml
vendored
@@ -34,18 +34,23 @@ jobs:
|
||||
AWS_S3_DOWNLOADS_BUCKET: test_bucket
|
||||
with:
|
||||
script: | # js
|
||||
const { getChangelog } = require('${{ github.workspace }}/release/dist/index.cjs');
|
||||
const R = require('${{ github.workspace }}/release/dist/index.cjs');
|
||||
const fs = require('fs');
|
||||
|
||||
const version = '${{ inputs.version }}';
|
||||
|
||||
const notes = await getChangelog({
|
||||
const issues = await R.getMilestoneIssues({
|
||||
version,
|
||||
github,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
});
|
||||
|
||||
const notes = R.getWebsiteChangelog({
|
||||
version,
|
||||
issues,
|
||||
});
|
||||
|
||||
fs.writeFileSync(`release-notes-preview-${version}.md`, notes);
|
||||
- name: Upload Release Notes
|
||||
uses: actions/upload-artifact@v4
|
||||
|
||||
6
.github/workflows/release-tag.yml
vendored
@@ -12,8 +12,6 @@ on:
|
||||
description: Tag name to apply to this release
|
||||
type: choice
|
||||
options:
|
||||
- nightly
|
||||
- beta
|
||||
- latest
|
||||
required: true
|
||||
tag_rollout:
|
||||
@@ -36,8 +34,6 @@ on:
|
||||
tag_name:
|
||||
type: string
|
||||
# options:
|
||||
# - nightly
|
||||
# - beta
|
||||
# - latest
|
||||
# - none (skips everything)
|
||||
required: true
|
||||
@@ -270,7 +266,7 @@ jobs:
|
||||
token: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
|
||||
fetch-depth: 0 # we want all branches and tags
|
||||
fetch-tags: true
|
||||
- name: Add and push git tag for nightly/beta/latest
|
||||
- name: Add and push git tag for latest
|
||||
if: ${{ !inputs.dot-x-tag }}
|
||||
run: | # sh
|
||||
if [[ "${{ matrix.edition }}" == "ee" ]]; then
|
||||
|
||||
8
.github/workflows/release.yml
vendored
@@ -17,8 +17,6 @@ on:
|
||||
options:
|
||||
- none
|
||||
- latest
|
||||
- beta
|
||||
- nightly
|
||||
required: true
|
||||
default: 'none'
|
||||
auto:
|
||||
@@ -41,8 +39,6 @@ on:
|
||||
# options:
|
||||
# - none
|
||||
# - latest
|
||||
# - beta
|
||||
# - nightly
|
||||
required: true
|
||||
default: 'none'
|
||||
auto:
|
||||
@@ -403,7 +399,9 @@ jobs:
|
||||
});
|
||||
|
||||
trigger-ee-extra-pr:
|
||||
needs: verify-s3-download
|
||||
needs:
|
||||
- containerize-ee
|
||||
- verify-s3-download
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 10
|
||||
steps:
|
||||
|
||||
22
.github/workflows/run-tests.yml
vendored
@@ -11,6 +11,7 @@ on:
|
||||
|
||||
jobs:
|
||||
files-changed:
|
||||
if: ${{ !contains(github.event.pull_request.labels.*.name,'ci skip') }}
|
||||
name: Check which files changed
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 5
|
||||
@@ -22,6 +23,7 @@ jobs:
|
||||
backend_all: ${{ steps.changes.outputs.backend_all }}
|
||||
frontend_all: ${{ steps.changes.outputs.frontend_all }}
|
||||
frontend_sources: ${{ steps.changes.outputs.frontend_sources }}
|
||||
documentation: ${{ steps.changes.outputs.documentation }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Test which files changed
|
||||
@@ -35,6 +37,7 @@ jobs:
|
||||
|
||||
static-viz-files-changed:
|
||||
name: Check whether static-viz files changed
|
||||
if: ${{ !contains(github.event.pull_request.labels.*.name,'ci skip') }}
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 10
|
||||
outputs:
|
||||
@@ -64,6 +67,14 @@ jobs:
|
||||
token: ${{ github.token }}
|
||||
filters: .github/static-viz-sources.yaml
|
||||
|
||||
uberjar:
|
||||
needs: [files-changed, static-viz-files-changed]
|
||||
if: ${{ !cancelled() && !(needs.files-changed.outputs.documentation == 'true' && needs.files-changed.outputs.backend_all == 'false' && needs.files-changed.outputs.frontend_all == 'false' && needs.files-changed.outputs.e2e_all == 'false') }}
|
||||
uses: ./.github/workflows/uberjar.yml
|
||||
secrets: inherit
|
||||
with:
|
||||
source_changed: ${{ needs.files-changed.outputs.backend_all == 'true' || needs.files-changed.outputs.frontend_all == 'true' || needs.static-viz-files-changed.outputs.static_viz == 'true' }}
|
||||
|
||||
backend-tests:
|
||||
if: ${{ !cancelled() }}
|
||||
needs: [files-changed, static-viz-files-changed]
|
||||
@@ -95,7 +106,8 @@ jobs:
|
||||
skip-lint: ${{ needs.files-changed.outputs.frontend_all != 'true' && needs.files-changed.outputs.e2e_specs != 'true' }}
|
||||
|
||||
e2e-tests:
|
||||
needs: files-changed
|
||||
needs: [files-changed, uberjar]
|
||||
if: always() && !cancelled()
|
||||
uses: ./.github/workflows/e2e-tests.yml
|
||||
secrets: inherit
|
||||
with:
|
||||
@@ -110,3 +122,11 @@ jobs:
|
||||
needs: files-changed
|
||||
uses: ./.github/workflows/embedding-sdk.yml
|
||||
secrets: inherit
|
||||
|
||||
pr-env:
|
||||
needs: [uberjar]
|
||||
if: |
|
||||
!cancelled() &&
|
||||
contains(github.event.pull_request.labels.*.name, 'PR-Env')
|
||||
uses: ./.github/workflows/pr-env.yml
|
||||
secrets: inherit
|
||||
|
||||
147
.github/workflows/snyk.yml
vendored
@@ -13,12 +13,11 @@ on:
|
||||
schedule:
|
||||
- cron: '0 5 * * *'
|
||||
|
||||
|
||||
jobs:
|
||||
monitor:
|
||||
# don't run this workflow on a cron for forks
|
||||
# Generate pom.xml files for all Maven projects
|
||||
generate-poms:
|
||||
if: ${{ github.event_name != 'schedule' || github.repository == 'metabase/metabase' }}
|
||||
name: Generate Snyk report
|
||||
name: Generate pom.xml files
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
@@ -26,26 +25,144 @@ jobs:
|
||||
uses: ./.github/actions/prepare-backend
|
||||
with:
|
||||
m2-cache-key: 'snyk'
|
||||
- uses: snyk/actions/setup@0.4.0
|
||||
- name: Generate all pom.xml
|
||||
run: .github/scripts/write-poms.sh
|
||||
- name: Run snyk main project
|
||||
- name: Upload pom files
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: pom-files
|
||||
path: |
|
||||
pom.xml
|
||||
modules/drivers/*/pom.xml
|
||||
|
||||
# Yarn/NPM projects that don't need pom files
|
||||
frontend-projects:
|
||||
if: ${{ github.event_name != 'schedule' || github.repository == 'metabase/metabase' }}
|
||||
name: ${{ matrix.project.name }}
|
||||
runs-on: ubuntu-22.04
|
||||
strategy:
|
||||
matrix:
|
||||
project:
|
||||
- name: Main Frontend (yarn)
|
||||
file: yarn.lock
|
||||
package-manager: yarn
|
||||
category: main-frontend-yarn
|
||||
- name: Embedding SDK Template
|
||||
file: bin/embedding-sdk/templates/yarn.lock
|
||||
package-manager: yarn
|
||||
category: embedding-sdk-template
|
||||
- name: E2E Angular 20 Host App
|
||||
file: e2e/embedding-sdk-host-apps/angular-20-host-app/package-lock.json
|
||||
package-manager: npm
|
||||
category: e2e-angular-host
|
||||
- name: E2E Next 15 App Router
|
||||
file: e2e/embedding-sdk-host-apps/next-15-app-router-host-app/package-lock.json
|
||||
package-manager: npm
|
||||
category: e2e-next-app-router
|
||||
- name: E2E Next 15 Pages Router
|
||||
file: e2e/embedding-sdk-host-apps/next-15-pages-router-host-app/package-lock.json
|
||||
package-manager: npm
|
||||
category: e2e-next-pages-router
|
||||
- name: E2E Vite 6 Host App
|
||||
file: e2e/embedding-sdk-host-apps/vite-6-host-app/package-lock.json
|
||||
package-manager: npm
|
||||
category: e2e-vite-host
|
||||
- name: Release Helper
|
||||
file: release/yarn.lock
|
||||
package-manager: yarn
|
||||
category: release-helper
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: snyk/actions/setup@0.4.0
|
||||
- name: Run snyk test
|
||||
env:
|
||||
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
||||
continue-on-error: true
|
||||
run: snyk test --all-projects --exclude="modules" --sarif-file-output=snyk-main.sarif
|
||||
- name: Upload result to GitHub Code Scanning
|
||||
run: snyk test --org="metabase-AnD9iS4Wfu4eBYMsG2DZ5N" --remote-repo-url="https://github.com/metabase/metabase" --file=${{ matrix.project.file }} --package-manager=${{ matrix.project.package-manager }} --sarif-file-output=snyk-${{ matrix.project.category }}.sarif
|
||||
- name: Upload results
|
||||
uses: github/codeql-action/upload-sarif@v3
|
||||
with:
|
||||
sarif_file: snyk-main.sarif
|
||||
category: main-project
|
||||
- name: Run snyk drivers
|
||||
sarif_file: snyk-${{ matrix.project.category }}.sarif
|
||||
category: ${{ matrix.project.category }}
|
||||
|
||||
# Maven projects that need pom files
|
||||
maven-projects:
|
||||
needs: generate-poms
|
||||
if: ${{ github.event_name != 'schedule' || github.repository == 'metabase/metabase' }}
|
||||
name: ${{ matrix.project.name }}
|
||||
runs-on: ubuntu-22.04
|
||||
strategy:
|
||||
matrix:
|
||||
project:
|
||||
- name: Main Backend (maven)
|
||||
file: pom.xml
|
||||
category: main-backend-maven
|
||||
- name: Driver - Athena
|
||||
file: modules/drivers/athena/pom.xml
|
||||
category: driver-athena
|
||||
- name: Driver - BigQuery Cloud SDK
|
||||
file: modules/drivers/bigquery-cloud-sdk/pom.xml
|
||||
category: driver-bigquery-cloud-sdk
|
||||
- name: Driver - ClickHouse
|
||||
file: modules/drivers/clickhouse/pom.xml
|
||||
category: driver-clickhouse
|
||||
- name: Driver - Databricks
|
||||
file: modules/drivers/databricks/pom.xml
|
||||
category: driver-databricks
|
||||
- name: Driver - Druid
|
||||
file: modules/drivers/druid/pom.xml
|
||||
category: driver-druid
|
||||
- name: Driver - Druid JDBC
|
||||
file: modules/drivers/druid-jdbc/pom.xml
|
||||
category: driver-druid-jdbc
|
||||
- name: Driver - Hive-like
|
||||
file: modules/drivers/hive-like/pom.xml
|
||||
category: driver-hive-like
|
||||
- name: Driver - MongoDB
|
||||
file: modules/drivers/mongo/pom.xml
|
||||
category: driver-mongo
|
||||
- name: Driver - Oracle
|
||||
file: modules/drivers/oracle/pom.xml
|
||||
category: driver-oracle
|
||||
- name: Driver - Presto JDBC
|
||||
file: modules/drivers/presto-jdbc/pom.xml
|
||||
category: driver-presto-jdbc
|
||||
- name: Driver - Redshift
|
||||
file: modules/drivers/redshift/pom.xml
|
||||
category: driver-redshift
|
||||
- name: Driver - Snowflake
|
||||
file: modules/drivers/snowflake/pom.xml
|
||||
category: driver-snowflake
|
||||
- name: Driver - SparkSQL
|
||||
file: modules/drivers/sparksql/pom.xml
|
||||
category: driver-sparksql
|
||||
- name: Driver - SQLite
|
||||
file: modules/drivers/sqlite/pom.xml
|
||||
category: driver-sqlite
|
||||
- name: Driver - SQL Server
|
||||
file: modules/drivers/sqlserver/pom.xml
|
||||
category: driver-sqlserver
|
||||
- name: Driver - Starburst
|
||||
file: modules/drivers/starburst/pom.xml
|
||||
category: driver-starburst
|
||||
- name: Driver - Vertica
|
||||
file: modules/drivers/vertica/pom.xml
|
||||
category: driver-vertica
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: snyk/actions/setup@0.4.0
|
||||
- name: Download pom files
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: pom-files
|
||||
- name: Run snyk test
|
||||
env:
|
||||
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
||||
continue-on-error: true
|
||||
run: cd modules && snyk test --all-projects --sarif-file-output=snyk-drivers.sarif
|
||||
- name: Upload result to GitHub Code Scanning
|
||||
run: snyk test --org="metabase-AnD9iS4Wfu4eBYMsG2DZ5N" --remote-repo-url="https://github.com/metabase/metabase" --file=${{ matrix.project.file }} --package-manager=maven --sarif-file-output=snyk-${{ matrix.project.category }}.sarif
|
||||
|
||||
- name: Upload results
|
||||
uses: github/codeql-action/upload-sarif@v3
|
||||
with:
|
||||
sarif_file: modules/snyk-drivers.sarif
|
||||
category: drivers
|
||||
sarif_file: snyk-${{ matrix.project.category }}.sarif
|
||||
category: ${{ matrix.project.category }}
|
||||
|
||||
114
.github/workflows/uberjar.yml
vendored
@@ -3,12 +3,15 @@ name: Build + Docker Uberjar
|
||||
# This workflow builds an uberjar and pushes it to dockerhub for any branch, either on-demand,
|
||||
# or automatically for the listed branches
|
||||
|
||||
concurrency:
|
||||
group: uberjar-${{ github.ref }}
|
||||
cancel-in-progress: false
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- metabot-v3-main
|
||||
- feature-visualizer
|
||||
- internal-tools
|
||||
paths-ignore:
|
||||
# config files
|
||||
@@ -24,12 +27,95 @@ on:
|
||||
inputs:
|
||||
commit:
|
||||
description: "Optional full-length commit SHA-1 hash"
|
||||
workflow_call:
|
||||
inputs:
|
||||
source_changed:
|
||||
description: "Whether source code has changed"
|
||||
type: boolean
|
||||
default: true
|
||||
|
||||
jobs:
|
||||
check-existing-artifacts:
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 5
|
||||
outputs:
|
||||
ee_exists: ${{ steps.check-ee.outcome == 'success' }}
|
||||
oss_exists: ${{ steps.check-oss.outcome == 'success' }}
|
||||
should_build: ${{ steps.decide.outputs.should_build }}
|
||||
steps:
|
||||
- name: Try to download existing EE artifact
|
||||
id: check-ee
|
||||
continue-on-error: true
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: metabase-ee-${{ github.event.inputs.commit || github.event.pull_request.head.sha || github.sha }}-uberjar
|
||||
|
||||
- name: Try to download existing OSS artifact
|
||||
id: check-oss
|
||||
continue-on-error: true
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: metabase-oss-${{ github.event.inputs.commit || github.event.pull_request.head.sha || github.sha }}-uberjar
|
||||
|
||||
- name: Decide if build is needed
|
||||
id: decide
|
||||
run: |
|
||||
SOURCE_CHANGED="${{ inputs.source_changed == true }}"
|
||||
EE_EXISTS="${{ steps.check-ee.outcome == 'success' }}"
|
||||
OSS_EXISTS="${{ steps.check-oss.outcome == 'success' }}"
|
||||
|
||||
echo "Source changed: $SOURCE_CHANGED"
|
||||
echo "EE exists: $EE_EXISTS"
|
||||
echo "OSS exists: $OSS_EXISTS"
|
||||
|
||||
# Build if source changed OR artifacts don't exist
|
||||
if [[ "$SOURCE_CHANGED" == "true" ]] || [[ "$EE_EXISTS" == "false" ]] || [[ "$OSS_EXISTS" == "false" ]]; then
|
||||
SHOULD_BUILD="true"
|
||||
echo "Will build: source_changed=$SOURCE_CHANGED, ee_exists=$EE_EXISTS, oss_exists=$OSS_EXISTS"
|
||||
else
|
||||
SHOULD_BUILD="false"
|
||||
echo "Skipping build: artifacts exist and no source changes"
|
||||
fi
|
||||
|
||||
echo "should_build=$SHOULD_BUILD" >> $GITHUB_OUTPUT
|
||||
|
||||
# if this is on a release branch, we need to check the build requirements
|
||||
get-build-requirements:
|
||||
if: |
|
||||
!cancelled() &&
|
||||
contains(github.ref, 'release-x')
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 10
|
||||
outputs:
|
||||
java_version: ${{ fromJson(steps.dependencies.outputs.result).java_version }}
|
||||
node_version: ${{ fromJson(steps.dependencies.outputs.result).node_version }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
sparse-checkout: release
|
||||
- name: Prepare build scripts
|
||||
run: cd ${{ github.workspace }}/release && yarn && yarn build
|
||||
- name: Get build dependencies
|
||||
uses: actions/github-script@v7
|
||||
id: dependencies
|
||||
with:
|
||||
script: | # js
|
||||
const { getBuildRequirements, getVersionFromReleaseBranch } = require('${{ github.workspace }}/release/dist/index.cjs');
|
||||
|
||||
const version = getVersionFromReleaseBranch('${{ github.ref }}');
|
||||
const requirements = getBuildRequirements(version);
|
||||
|
||||
return {
|
||||
java_version: requirements.java,
|
||||
node_version: requirements.node,
|
||||
};
|
||||
|
||||
get-container-info:
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 5
|
||||
name: Get container info
|
||||
# Skip if this is a PR without the build-docker-uberjar label
|
||||
if: github.ref_name == 'master' || contains(github.event.pull_request.labels.*.name, 'build-docker-uberjar')
|
||||
outputs:
|
||||
editions: ${{ toJson(fromJson(steps.info.outputs.result).editions) }}
|
||||
ee: ${{ toJson(fromJson(steps.info.outputs.result).ee) }}
|
||||
@@ -72,17 +158,19 @@ jobs:
|
||||
echo "${{ steps.info.outputs.result }}"
|
||||
|
||||
build:
|
||||
needs: get-container-info
|
||||
needs:
|
||||
[check-existing-artifacts, get-build-requirements, get-container-info]
|
||||
if: always() && !cancelled() && needs.check-existing-artifacts.outputs.should_build == 'true' && (needs.get-build-requirements.result == 'success' || needs.get-build-requirements.result == 'skipped')
|
||||
name: Build MB ${{ matrix.edition }}
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 15
|
||||
strategy:
|
||||
matrix:
|
||||
edition: ${{ fromJson(needs.get-container-info.outputs.editions) }}
|
||||
edition: ${{ needs.get-container-info.result == 'success' && fromJson(needs.get-container-info.outputs.editions) || fromJson('["ee", "oss"]') }}
|
||||
env:
|
||||
MB_EDITION: ${{ matrix.edition }}
|
||||
INTERACTIVE: false
|
||||
SKIP_LICENSES: true # faster builds for dev
|
||||
SKIP_LICENSES: ${{ github.event_name == 'pull_request' }} # faster builds for dev
|
||||
steps:
|
||||
- name: Check out the code
|
||||
uses: actions/checkout@v4
|
||||
@@ -90,26 +178,29 @@ jobs:
|
||||
ref: ${{ github.event.inputs.commit }}
|
||||
- name: Prepare front-end environment
|
||||
uses: ./.github/actions/prepare-frontend
|
||||
with:
|
||||
node-version: "${{ needs.get-build-requirements.outputs.node_version || '22' }}"
|
||||
- name: Prepare back-end environment
|
||||
uses: ./.github/actions/prepare-backend
|
||||
with:
|
||||
m2-cache-key: uberjar
|
||||
java-version: 21
|
||||
java-version: "${{ needs.get-build-requirements.outputs.java_version || 21 }}"
|
||||
- name: Build
|
||||
run: ./bin/build.sh
|
||||
- name: Prepare uberjar artifact
|
||||
uses: ./.github/actions/prepare-uberjar-artifact
|
||||
with:
|
||||
name: metabase-${{ matrix.edition }}-${{ github.event.inputs.commit || github.sha }}-uberjar
|
||||
name: metabase-${{ matrix.edition }}-${{ github.event.inputs.commit || github.event.pull_request.head.sha || github.sha }}-uberjar
|
||||
|
||||
check-jar-health:
|
||||
runs-on: ubuntu-22.04
|
||||
name: Is ${{ matrix.edition }} (java ${{ matrix.java-version }}) healthy?
|
||||
needs: [build, get-container-info]
|
||||
needs: [build, check-existing-artifacts, get-container-info]
|
||||
if: always() && !cancelled() && (needs.build.result == 'success' || (needs.check-existing-artifacts.outputs.should_build == 'false' && needs.check-existing-artifacts.outputs.ee_exists == 'true' && needs.check-existing-artifacts.outputs.oss_exists == 'true'))
|
||||
timeout-minutes: 10
|
||||
strategy:
|
||||
matrix:
|
||||
edition: ${{ fromJson(needs.get-container-info.outputs.editions) }}
|
||||
edition: ${{ needs.get-container-info.result == 'success' && fromJson(needs.get-container-info.outputs.editions) || fromJson('["ee", "oss"]') }}
|
||||
java-version: [21]
|
||||
steps:
|
||||
- name: Prepare JRE (Java Run-time Environment)
|
||||
@@ -122,7 +213,7 @@ jobs:
|
||||
- uses: actions/download-artifact@v4
|
||||
name: Retrieve uberjar artifact
|
||||
with:
|
||||
name: metabase-${{ matrix.edition }}-${{ github.event.inputs.commit || github.sha }}-uberjar
|
||||
name: metabase-${{ matrix.edition }}-${{ github.event.inputs.commit || github.event.pull_request.head.sha || github.sha }}-uberjar
|
||||
- name: Launch uberjar
|
||||
run: >-
|
||||
java --add-opens java.base/java.nio=ALL-UNNAMED -jar ./target/uberjar/metabase.jar &
|
||||
@@ -130,14 +221,15 @@ jobs:
|
||||
run: while ! curl 'http://localhost:3000/api/health' | grep '{"status":"ok"}'; do sleep 1; done
|
||||
|
||||
containerize:
|
||||
needs: [check-jar-health, get-container-info]
|
||||
needs: [check-jar-health, get-container-info, build]
|
||||
if: needs.get-container-info.result == 'success' && needs.build.result == 'success'
|
||||
strategy:
|
||||
matrix:
|
||||
edition: ${{ fromJson(needs.get-container-info.outputs.editions) }}
|
||||
uses: ./.github/workflows/containerize-jar.yml
|
||||
secrets: inherit
|
||||
with:
|
||||
artifact-name: metabase-${{ matrix.edition }}-${{ github.event.inputs.commit || github.sha }}-uberjar
|
||||
artifact-name: metabase-${{ matrix.edition }}-${{ github.event.inputs.commit || github.event.pull_request.head.sha || github.sha }}-uberjar
|
||||
commit: ${{ github.event.inputs.commit || github.sha }}
|
||||
repo: ${{ fromJson(needs.get-container-info.outputs[matrix.edition]).repo }}
|
||||
tag: ${{ fromJson(needs.get-container-info.outputs[matrix.edition]).tag }}
|
||||
|
||||
2
.gitignore
vendored
@@ -51,6 +51,7 @@ cypress.env.json
|
||||
/lein-plugins/*/target
|
||||
/local
|
||||
/locales/metabase-*.pot
|
||||
/logs
|
||||
/modules/drivers/*/resources/namespaces.edn
|
||||
/modules/drivers/*/target
|
||||
/node_modules/
|
||||
@@ -152,3 +153,4 @@ CLAUDE.local.md
|
||||
.eslintcache
|
||||
|
||||
/logs
|
||||
/.clojure-mcp
|
||||
|
||||
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 57 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 84 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 88 KiB |
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 84 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 73 KiB |
BIN
.loki/reference/chrome_laptop_Components_Documents_Default.png
Normal file
|
After Width: | Height: | Size: 212 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 4.1 KiB |