From 23604c222f7a58c13fd2b538d689139e75ee1f07 Mon Sep 17 00:00:00 2001 From: Yujohn Nattrass Date: Tue, 7 Jan 2025 20:53:29 -0800 Subject: [PATCH 1/5] fix(config): fail builds if failed to fetch extensions --- packages/config/src/api/site_info.ts | 17 ++++++++----- .../config/tests/api/snapshots/tests.js.md | 6 +++++ .../config/tests/api/snapshots/tests.js.snap | Bin 2232 -> 2286 bytes packages/config/tests/api/tests.js | 23 ++++++++++++++++++ 4 files changed, 40 insertions(+), 6 deletions(-) diff --git a/packages/config/src/api/site_info.ts b/packages/config/src/api/site_info.ts index fe5a286f2d..cb5161948c 100644 --- a/packages/config/src/api/site_info.ts +++ b/packages/config/src/api/site_info.ts @@ -116,7 +116,7 @@ const getIntegrations = async function ({ accountId, testOpts, offline, -}: GetIntegrationsOpts): Promise { +}: GetIntegrationsOpts): Promise { if (!siteId || offline) { return [] } @@ -132,12 +132,17 @@ const getIntegrations = async function ({ try { const response = await fetch(url) - - const integrations = await response.json() + if (response.status !== 200) { + throw new Error(`Unexpected status code ${response.status} from fetching extensions`) + } + const bodyText = await response.text() + if (bodyText === '') { + return [] + } + + const integrations = await JSON.parse(bodyText) return Array.isArray(integrations) ? integrations : [] } catch (error) { - // TODO: We should consider blocking the build as integrations are a critical part of the build process - // https://linear.app/netlify/issue/CT-1214/implement-strategy-in-builds-to-deal-with-integrations-that-we-fail-to - return [] + throwUserError(`Failed retrieving extensions for site ${siteId}: ${error.message}. ${ERROR_CALL_TO_ACTION}`) } } diff --git a/packages/config/tests/api/snapshots/tests.js.md b/packages/config/tests/api/snapshots/tests.js.md index 46de190353..929e7dc6f1 100644 --- a/packages/config/tests/api/snapshots/tests.js.md +++ b/packages/config/tests/api/snapshots/tests.js.md @@ -2250,6 +2250,12 @@ Generated by [AVA](https://avajs.dev). "token": "test"␊ }` +## Integrations are not returned if failed to fetch integrations + +> Snapshot 1 + + 'Failed retrieving extensions for site test: Unexpected status code 500 from fetching extensions. Double-check your login status with \'netlify status\' or contact support with details of your error.' + ## baseRelDir is true if build.base is overridden > Snapshot 1 diff --git a/packages/config/tests/api/snapshots/tests.js.snap b/packages/config/tests/api/snapshots/tests.js.snap index 65648ca3465f93e2ee662761da418c18abe9de26..4cf9ceda68c58fcf87590926e1e14d48aaacbb41 100644 GIT binary patch literal 2286 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 GwEzHjT| { + const { output } = await new Fixture('./fixtures/base') + .withFlags({ + siteId: 'test', + mode: 'buildbot', + accountId: 'account1', + token: 'test', + }) + .runConfigServer([ + SITE_INFO_DATA, + TEAM_INSTALLATIONS_META_RESPONSE_INTERNAL_SERVER_ERROR, + FETCH_INTEGRATIONS_EMPTY_RESPONSE, + ]) + + t.snapshot(normalizeOutput(output)) +}) + test('baseRelDir is true if build.base is overridden', async (t) => { const fixturesDir = normalize(`${fileURLToPath(test.meta.file)}/../fixtures`) From 308132e63f8010e1b7220e062d10bc02af46ce53 Mon Sep 17 00:00:00 2001 From: Yujohn Nattrass Date: Thu, 9 Jan 2025 11:13:24 -0800 Subject: [PATCH 2/5] fix(config): return never if failed to fetch extensions --- packages/config/src/api/site_info.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/config/src/api/site_info.ts b/packages/config/src/api/site_info.ts index cb5161948c..e0612918d1 100644 --- a/packages/config/src/api/site_info.ts +++ b/packages/config/src/api/site_info.ts @@ -116,7 +116,7 @@ const getIntegrations = async function ({ accountId, testOpts, offline, -}: GetIntegrationsOpts): Promise { +}: GetIntegrationsOpts): Promise { if (!siteId || offline) { return [] } @@ -132,7 +132,7 @@ const getIntegrations = async function ({ try { const response = await fetch(url) - if (response.status !== 200) { + if (!response.ok) { throw new Error(`Unexpected status code ${response.status} from fetching extensions`) } const bodyText = await response.text() @@ -143,6 +143,6 @@ const getIntegrations = async function ({ const integrations = await JSON.parse(bodyText) return Array.isArray(integrations) ? integrations : [] } catch (error) { - throwUserError(`Failed retrieving extensions for site ${siteId}: ${error.message}. ${ERROR_CALL_TO_ACTION}`) + return throwUserError(`Failed retrieving extensions for site ${siteId}: ${error.message}. ${ERROR_CALL_TO_ACTION}`) } } From 039badbe3b752381b6d8a5698c45011f12475ff7 Mon Sep 17 00:00:00 2001 From: Yujohn Nattrass Date: Mon, 13 Jan 2025 10:48:18 -0800 Subject: [PATCH 3/5] chore(config): use feature flag to error builds if failed to fetch extensions from jigsaw --- packages/config/src/api/site_info.ts | 42 ++++++++++---- .../config/tests/api/snapshots/tests.js.md | 52 +++++++++++++++++- .../config/tests/api/snapshots/tests.js.snap | Bin 2286 -> 2355 bytes packages/config/tests/api/tests.js | 25 ++++++++- 4 files changed, 105 insertions(+), 14 deletions(-) diff --git a/packages/config/src/api/site_info.ts b/packages/config/src/api/site_info.ts index e0612918d1..807623c634 100644 --- a/packages/config/src/api/site_info.ts +++ b/packages/config/src/api/site_info.ts @@ -36,8 +36,10 @@ export const getSiteInfo = async function ({ offline = false, testOpts = {}, siteFeatureFlagPrefix, + featureFlags = {}, }: GetSiteInfoOpts) { const { env: testEnv = false } = testOpts + const errorOnExtensionFetchFail = featureFlags.error_builds_on_extension_fetch_fail if (api === undefined || mode === 'buildbot' || testEnv) { const siteInfo: { id?: string; account_id?: string } = {} @@ -46,7 +48,9 @@ export const getSiteInfo = async function ({ if (accountId !== undefined) siteInfo.account_id = accountId const integrations = - mode === 'buildbot' && !offline ? await getIntegrations({ siteId, testOpts, offline, accountId }) : [] + mode === 'buildbot' && !offline + ? await getIntegrations({ siteId, testOpts, offline, accountId, errorOnExtensionFetchFail }) + : [] return { siteInfo, accounts: [], addons: [], integrations } } @@ -55,7 +59,7 @@ export const getSiteInfo = async function ({ getSite(api, siteId, siteFeatureFlagPrefix), getAccounts(api), getAddons(api, siteId), - getIntegrations({ siteId, testOpts, offline, accountId }), + getIntegrations({ siteId, testOpts, offline, accountId, errorOnExtensionFetchFail }), ] const [siteInfo, accounts, addons, integrations] = await Promise.all(promises) @@ -109,6 +113,7 @@ type GetIntegrationsOpts = { accountId?: string testOpts: TestOptions offline: boolean + errorOnExtensionFetchFail?: boolean } const getIntegrations = async function ({ @@ -116,6 +121,7 @@ const getIntegrations = async function ({ accountId, testOpts, offline, + errorOnExtensionFetchFail, }: GetIntegrationsOpts): Promise { if (!siteId || offline) { return [] @@ -130,19 +136,31 @@ const getIntegrations = async function ({ ? `${baseUrl}team/${accountId}/integrations/installations/meta/${siteId}` : `${baseUrl}site/${siteId}/integrations/safe` - try { - const response = await fetch(url) - if (!response.ok) { - throw new Error(`Unexpected status code ${response.status} from fetching extensions`) - } - const bodyText = await response.text() - if (bodyText === '') { - return [] + if (errorOnExtensionFetchFail) { + try { + const response = await fetch(url) + if (!response.ok) { + throw new Error(`Unexpected status code ${response.status} from fetching extensions`) + } + const bodyText = await response.text() + if (bodyText === '') { + return [] + } + + const integrations = await JSON.parse(bodyText) + return Array.isArray(integrations) ? integrations : [] + } catch (error) { + return throwUserError( + `Failed retrieving extensions for site ${siteId}: ${error.message}. ${ERROR_CALL_TO_ACTION}`, + ) } + } - const integrations = await JSON.parse(bodyText) + try { + const response = await fetch(url) + const integrations = await response.json() return Array.isArray(integrations) ? integrations : [] } catch (error) { - return throwUserError(`Failed retrieving extensions for site ${siteId}: ${error.message}. ${ERROR_CALL_TO_ACTION}`) + return [] } } diff --git a/packages/config/tests/api/snapshots/tests.js.md b/packages/config/tests/api/snapshots/tests.js.md index 929e7dc6f1..76282a01b6 100644 --- a/packages/config/tests/api/snapshots/tests.js.md +++ b/packages/config/tests/api/snapshots/tests.js.md @@ -2250,12 +2250,56 @@ Generated by [AVA](https://avajs.dev). "token": "test"␊ }` -## Integrations are not returned if failed to fetch integrations +## Integrations are not returned if failed to fetch integrations and if flag is true > Snapshot 1 'Failed retrieving extensions for site test: Unexpected status code 500 from fetching extensions. Double-check your login status with \'netlify status\' or contact support with details of your error.' +## Empty array of integrations are returned if failed to fetch integrations and if flag is false + +> Snapshot 1 + + `{␊ + "accounts": [],␊ + "addons": [],␊ + "branch": "branch",␊ + "buildDir": "packages/config/tests/api/fixtures/base",␊ + "config": {␊ + "build": {␊ + "environment": {},␊ + "processing": {␊ + "css": {},␊ + "html": {},␊ + "images": {},␊ + "js": {}␊ + },␊ + "publish": "packages/config/tests/api/fixtures/base",␊ + "publishOrigin": "default",␊ + "services": {}␊ + },␊ + "functions": {␊ + "*": {}␊ + },␊ + "headers": [],␊ + "plugins": [],␊ + "redirects": []␊ + },␊ + "configPath": "packages/config/tests/api/fixtures/base/netlify.toml",␊ + "context": "production",␊ + "env": {},␊ + "hasApi": true,␊ + "headersPath": "packages/config/tests/api/fixtures/base/_headers",␊ + "integrations": [],␊ + "redirectsPath": "packages/config/tests/api/fixtures/base/_redirects",␊ + "repositoryRoot": "packages/config/tests/api/fixtures/base",␊ + "siteInfo": {␊ + "account_id": "account1",␊ + "id": "test"␊ + },␊ + "token": "test"␊ + }` + ## baseRelDir is true if build.base is overridden > Snapshot 1 @@ -2419,3 +2463,9 @@ Generated by [AVA](https://avajs.dev). },␊ "token": "test"␊ }` + +## Integrations are not returned if failed to fetch integrations + +> Snapshot 1 + + 'Failed retrieving extensions for site test: Unexpected status code 500 from fetching extensions. Double-check your login status with \'netlify status\' or contact support with details of your error.' diff --git a/packages/config/tests/api/snapshots/tests.js.snap b/packages/config/tests/api/snapshots/tests.js.snap index 4cf9ceda68c58fcf87590926e1e14d48aaacbb41..fcd3582afbf02483f58189a5f0e0f0f3bd13e9b6 100644 GIT binary patch literal 2355 zcmZY7c{me}9|!P}Td^ETzS*2}=BBckNL!BFN1*`Fqm-2UZ_dx;`!R;Nxg-e_CwUnm=ka&Oljim%@ zG7_BZLN<({6P;!sI3Db*cMXGeFVOMi0r^ z{VbMuu6rPw>G+ zKeK)s*5jj1$}djl@eP?KC>FBDSLYwVkjZew6!?+rb^J(wij{Y{X|zGcLzEPwqNq<1 zak1BVa;M_28kf!=Jul(}6h`G;XtN(2NB_d5XoSIgBWOfg;yY{Y)wm{$nf&*9vXgQi zRBI{$B%q*$Pi@vsQa9s z8VL0rlJV?zwyfZ#&wwJ!d!De9$0uuL6^BQDp7J!5%{TJZ?lGzz526xo@h*Z2awN8U zv&NewUi9@5YNqQ2%#e4yE)etxru5dC32)u~z#$6aBZjKlWmfj-n4kr{Ito*tqGfi(YTUWPJ%G_(d27O&=j}WcUgi7Cgq=Ahut`k{c#=OSUA=|6FU5V4p)QS4> z6_?5P6A}Bxf!UOawZ}CNt1;pZ56S}DqBl!9MiZvm8SQR6b+9l$(q)UQrW>Zcv4I;a3S&*NcJ%Q=iA0RkpT%N7gv_D7AYv z<@MRNR+s=!ZlBGnY+%^OC98B9n~3{2U2nvX z*#F@UUl4w*qBf?Q0yEG6Y#67&qyZ)X(vyh8{1-_Y1W36n0u&ZpBGlLqVT5f(HD?(! zCAU6Tj=gVz%RB7S$zRQ>QDm4LQsMtB6V7f0R>kU5NB~@kFok+FrGpuK#N_vZQmn!u z-y!H>mUCHO;B*6~oS8iZ6FHE-sSajc^4PZFLwBgA>{=qU4jsY?u-H{KE(rgKO2|-+fd~625wv z>Ol8rfXBW-&yvO02fIvRP%)vUS53xl}Ar49<`X7s0s$ktMYBGuC-bp*w22qS;ZwHd9|z zYEGl|Jj|6zw;QsY;xM%Qm% z?8!GA+|&7bf<$2y1nL1GHuiHb58W%*Z)}-m{caiEW-)$8sf6wMh0nY%n~M9@B5}WF zqfje^f#7`Q!KI0_=@@j<>FqjSr1Ps7!u!3T@;-(K;!_B`6%+{oxf@x5f8`NNzw(UH zxs&qHzqc*Yc&AkCL(z;~j$P)v8s ztnTvDrb!>NH$%>*Wh$ul;Yj3rU!z&t_m*R>HyeuAKlV42lJYH|s_#K#uP10*3iv&L?#P1T%{@=7=3JiYwrtMlU;dRA4Uww3c+ z{@QOtkiNxRC4#eYAqW2q0K{2gTG<$`+V{XCI`;_#1eC;?v=vUPTYL+@@Rq0KXg zJ56MyxtLN1Fsn1=#K+mQ!I575>(hF=O5GV0=Q)3PLc6?k#|O~?^45F~ituko z_d_Pc(wUze{Bhocr3Yc-uM9Xc*RW#ZTu#lQCz80+(~MGXl1-CuvT^Wlx`CYlUFcy#Pb42J9YqW-c4*GOrnct^b1}R|SwgKg^`g zkYA3oTF*Y*osf>mf>}PDHw)>*<@8d=k+?;Vx%m)F+o0!#Wt>cV4EQn#S@_ezW2C Li2Rs#6%$3kaLXo3PV~McQ zl;l|MI~tlv8}h5~U*F&3_jx`ZulL8u(FkN8csn@ECny{gd7g)z#a^(@?vXyg?i5-Z zA2{G;5s(r0vVC+(Mn}!8AZ#Wn2bg_~<)34xmJbIl_KEguyKtD`vk%$63*??2NFNF?73m)>Vu`Xv zbiwU(C4Lj)Na={{#_RM{P3%lriFOYI2}~b-9XPxA^E~4N#L#xRyVCW>fy6nLlI1~J zCtBmI?!)Sa?D3<7qnWdtsYhH85=jP(?>p1Ay&*b-$W7kt z$sSTX(+MhRGwf?8gx*IV4oN09Og_Se+t`B&8(a*YI;U9eZ~qv7gJSQR(=s)i1ck-;*qT#~FRNV9q|v;>MI1HUnO@L*5%?p{ zxE#_vi8>h1aQMjTRmIH(J+nPZ=i~OU3>eU{hB{3pPG)V@c;}La}U}cDKG4?ES1z(%G}}(z+W}*?>0Uqtfn>C)!;Os*6D$n~0KJPPRJ4 zh7<(kFC}H@&9(Sm0K7GHc2iJhT%tCa8dW0r1cwxC}Ik1=i>!3<*E4HOmh!r!)INs zA-AWnd+AknT~m!;7Upj}H?ONCH3)sb-iKe_Pi<2gKU%DYLY^Up1=NOKeA0UOAaM1a z|10taR{-XISG+YM0zNv}n=)Bp%~!(le`x*-LszF@-uc<@v4i#Pg(8Wug6Q+q8#<%BF3MuU17Oq4a2G382Gs8T`y1(DZMycUMfb(R zqIt9nkFjAgk{t@m8&6zIFedOnok-LpSfv{R=(@E}znP3H2>~L(iX|sO8cp)9WvrjLAU+`G7T2*Se_h=9 zTiJ{>`#H{}HQ^UR#((XADC%UZ;hWQ+tz1wVJ(vynbORN|43SvW>`YrzGv5-Msz1lR zDKuOvT=2xd(g?aX$d}?I^_y>7QNi}0^%j^5OQ%JOZKB$dtz)K-CtktM=kTZ(YQ)C-58A>5nWK%_i6BbL>mt7Lq_R zK%1-BW(N?_$>BH=1Mjrp0Sc*^4iurEXYe5_cttDL5}Rukxe=cBw$ppy2ZtXP`ZTOo z@DvvN-P&9m*{aK>I+s&Zp2awr*8eh04SyplT(hoST1No9k;pkxo9Mis^IA4b?q9l$ zm9mrFss|MahZIiP9I>jD||JRHt=<+7GS z_GGK=w%x=&?gPi3kcE(ic4D=Xc11!dAxzMUUt^MN?4O-yASf2))-4Z!_?|c*{K{ap z3LY(w-l^5IMJ&hzYW1>_m7DnFj`Mdp#W?#c65@hwZyaz2=AAd8hte0-N zX4O?Y*HE0)`lMh>!?7)-iG1g{!I~K;4yI{SAQFW38%Rxo+*M~W}x=P(xS#{_&7P91st2UUGgeMSrotZ|T?WWBW=#wkurbeo6Ag)(4H_z9Cw= z_}Z_gl(*Z4Y&l;hVl~6`Gl#MFlRO_94G2y@-H5;kWA9q{@@T9(i{vVScHC?XpClTy z;%dN^iI46aE}zJSE#mJ=Dkk8^t{6JiF{xrT(Y?^JtK|_6Y0&cZ;#He^QCQs)-S5J? zuzPLJJ-w?=JVyE!w;8w5+n2ns{|NEL}!JRo3>cnQE+Q-}96yKB!mlP366&t?`BXY|=()wgg~Fz?tX zho#t1OME(t^G9f$ss2E7_dAh$X#+R&O`P-H#*1Li9cG@#|b_`)MDvJ+XB^#gsb4zGu$ZM!%+MAyZSXo1_RcU$2vcKKH+TYls?`Pt1-knUa^65@B7S@EC?Enp_{FX2QmD3jdM^$I}? z(1fUwJ-gl<11g`1-yk9+&;Jg<1nC=jqZww9L*812smy$nbP8eAjjnP3v7 tYw+w#oJ{5zo)GkMgBJPIH~w)@tb4qCh1g029 { +test('Integrations are not returned if failed to fetch integrations and if flag is true', async (t) => { const { output } = await new Fixture('./fixtures/base') .withFlags({ siteId: 'test', mode: 'buildbot', accountId: 'account1', token: 'test', + featureFlags: { + error_builds_on_extension_fetch_fail: true, + }, + }) + .runConfigServer([ + SITE_INFO_DATA, + TEAM_INSTALLATIONS_META_RESPONSE_INTERNAL_SERVER_ERROR, + FETCH_INTEGRATIONS_EMPTY_RESPONSE, + ]) + + t.snapshot(normalizeOutput(output)) +}) + +test('Empty array of integrations are returned if failed to fetch integrations and if flag is false', async (t) => { + const { output } = await new Fixture('./fixtures/base') + .withFlags({ + siteId: 'test', + mode: 'buildbot', + accountId: 'account1', + token: 'test', + featureFlags: { + error_builds_on_extension_fetch_fail: false, + }, }) .runConfigServer([ SITE_INFO_DATA, From 18cb7fee1cfc1a4160064c04dcb028a6fe8adb30 Mon Sep 17 00:00:00 2001 From: Yujohn Nattrass Date: Tue, 14 Jan 2025 16:04:07 -0800 Subject: [PATCH 4/5] chore(config): add debug logs --- packages/config/src/api/site_info.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/config/src/api/site_info.ts b/packages/config/src/api/site_info.ts index 807623c634..ba13461ac1 100644 --- a/packages/config/src/api/site_info.ts +++ b/packages/config/src/api/site_info.ts @@ -40,6 +40,15 @@ export const getSiteInfo = async function ({ }: GetSiteInfoOpts) { const { env: testEnv = false } = testOpts const errorOnExtensionFetchFail = featureFlags.error_builds_on_extension_fetch_fail + console.log(`Fetching site info for site ${siteId}`, { + siteId, + accountId, + mode, + offline, + testEnv, + errorOnExtensionFetchFail, + }) + console.log(`Feature flags: ${JSON.stringify(featureFlags, null, 2)}`) if (api === undefined || mode === 'buildbot' || testEnv) { const siteInfo: { id?: string; account_id?: string } = {} From 3f60a48b36d96f18b59949485acf9937e1579008 Mon Sep 17 00:00:00 2001 From: Yujohn Nattrass Date: Tue, 14 Jan 2025 16:29:41 -0800 Subject: [PATCH 5/5] chore(config): clean up logs --- packages/config/src/api/site_info.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/packages/config/src/api/site_info.ts b/packages/config/src/api/site_info.ts index ba13461ac1..807623c634 100644 --- a/packages/config/src/api/site_info.ts +++ b/packages/config/src/api/site_info.ts @@ -40,15 +40,6 @@ export const getSiteInfo = async function ({ }: GetSiteInfoOpts) { const { env: testEnv = false } = testOpts const errorOnExtensionFetchFail = featureFlags.error_builds_on_extension_fetch_fail - console.log(`Fetching site info for site ${siteId}`, { - siteId, - accountId, - mode, - offline, - testEnv, - errorOnExtensionFetchFail, - }) - console.log(`Feature flags: ${JSON.stringify(featureFlags, null, 2)}`) if (api === undefined || mode === 'buildbot' || testEnv) { const siteInfo: { id?: string; account_id?: string } = {}