Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Resolve build issues with symlinked files #57412

Merged
merged 7 commits into from
Dec 4, 2023

Conversation

LavaToaster
Copy link
Contributor

@LavaToaster LavaToaster commented Oct 25, 2023

This resolves an issue introduced in #52361 where shouldOmit is overwritten based on if it is a directory or not without considering include conditions.

In an environment where the the application being built is orchestrated and managed by bazel, all files are symbolic links and thus without this the file includes predicate checks aren't considered - and the build fails under certain conditions.

@LavaToaster
Copy link
Contributor Author

@timneutkens @styfle Any chance of this getting a review? ❤️

Copy link
Member

@timneutkens timneutkens left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you add a test for this change? Thanks!

@LavaToaster
Copy link
Contributor Author

@timneutkens When I created the PR I did check to see if there were tests for this, but I couldn't find any. More than happy to introduce some if you can show me the right places, or if it can be tested indirectly easily enough.

@timneutkens
Copy link
Member

Given that you pointed out there's a case where you know it will fail you can add a test for that particular case using pnpm new-test 👍

@LavaToaster LavaToaster requested a review from a team as a code owner November 5, 2023 20:25
@LavaToaster LavaToaster changed the title Fix flatReaddir ignoring include condition on symbolic files Resolve build issues with symlinked files Nov 5, 2023
if (file.isFile()) {
fileNames.add(file.name)
}
}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When writing tests I noticed that this area suffered form the same issue with symbolic links. It wouldn't recognise that layout.tsx existed and would complain that page.tsx doesn't have a root layout file..

Rather than fix it is, I decided re-use the now getFilesInDir. This played a role in dropping the includes predicate check from getFilesInDir.

]

const rootPaths = (await getFilesInDir(rootDir))
.filter((file) => includes.some((include) => include.test(file)))
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I removed the predicate includes check from the updated getFilesInDir function. I felt it would be just as easy for this area to filter out what it didn't needed.

.sort(sortByPageExts(config.pageExtensions))
.map((absoluteFile) => absoluteFile.replace(dir, ''))
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Small amount of irony in that previously flatReaddir returned an absolute path which is then iterated through again to remove. Probably for historical reasons it used to have to do that, but the updated function no longer returns an absolute path so no need.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

😅 This was the cause of test failures since I didn't realise that that the end result would be ["/middleware.ts"] and instead returned ["middleware.ts"]. I've added it back in.

@LavaToaster
Copy link
Contributor Author

@timneutkens I have added a unit and e2e test. Identified another symlink issue when I was setting up the e2e test so I've also resolved that, not too sure on how I hadn't encountered it before this. (Unless that code was post v14 since we haven't upgraded yet)

import fs from 'fs/promises'
import type { Dirent, StatsBase } from 'fs'

export async function getFilesInDir(path: string): Promise<string[]> {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I renamed this to something more fitting, since I couldn't really understand what flatReaddir was supposed to reference unless historically it was recursive and did indeed flatten something.

This resolves an issue introduced in vercel#52361 where `shouldOmit` is overwritten based on if it is a directory or not without considering include conditions.

In an environment where the the application being built is orchestrated and managed by bazel, all files are symbolic links and thus without this the file includes predicate checks aren't considered - and the build fails under certain conditions.
@LavaToaster
Copy link
Contributor Author

LavaToaster commented Nov 14, 2023

I can't tell if test failures are my issue to resolve or not. That is to say that I don't know if I caused them, especially as most of them look like timeout errors.

@timneutkens timneutkens added the CI approved Approve running CI for fork label Nov 14, 2023
@LavaToaster
Copy link
Contributor Author

Test failures were correct. I've issued a fix, looks like the Azure Pipelines are happy now :)

@LavaToaster
Copy link
Contributor Author

@timneutkens any chance you could trigger the gh workflow again, and give this a look over now? 😄

@ijjk
Copy link
Member

ijjk commented Nov 16, 2023

Tests Passed

@ijjk
Copy link
Member

ijjk commented Nov 16, 2023

Stats from current PR

Default Build
General
vercel/next.js canary LavaToaster/next.js patch-2 Change
buildDuration 10.3s 10.4s ⚠️ +107ms
buildDurationCached 6s 6.1s N/A
nodeModulesSize 199 MB 199 MB N/A
nextStartRea..uration (ms) 415ms 422ms N/A
Client Bundles (main, webpack)
vercel/next.js canary LavaToaster/next.js patch-2 Change
199-HASH.js gzip 28.8 kB 28.8 kB N/A
3f784ff6-HASH.js gzip 53.3 kB 53.3 kB
494.HASH.js gzip 180 B 181 B N/A
framework-HASH.js gzip 45.2 kB 45.2 kB
main-app-HASH.js gzip 241 B 239 B N/A
main-HASH.js gzip 31.7 kB 31.8 kB N/A
webpack-HASH.js gzip 1.7 kB 1.7 kB
Overall change 100 kB 100 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary LavaToaster/next.js patch-2 Change
polyfills-HASH.js gzip 31 kB 31 kB
Overall change 31 kB 31 kB
Client Pages
vercel/next.js canary LavaToaster/next.js patch-2 Change
_app-HASH.js gzip 194 B 195 B N/A
_error-HASH.js gzip 182 B 181 B N/A
amp-HASH.js gzip 504 B 506 B N/A
css-HASH.js gzip 322 B 323 B N/A
dynamic-HASH.js gzip 2.5 kB 2.5 kB
edge-ssr-HASH.js gzip 253 B 255 B N/A
head-HASH.js gzip 348 B 347 B N/A
hooks-HASH.js gzip 369 B 368 B N/A
image-HASH.js gzip 4.3 kB 4.3 kB N/A
index-HASH.js gzip 256 B 256 B
link-HASH.js gzip 2.63 kB 2.63 kB N/A
routerDirect..HASH.js gzip 311 B 311 B
script-HASH.js gzip 384 B 383 B N/A
withRouter-HASH.js gzip 307 B 308 B N/A
1afbb74e6ecf..834.css gzip 106 B 106 B
Overall change 3.17 kB 3.17 kB
Client Build Manifests
vercel/next.js canary LavaToaster/next.js patch-2 Change
_buildManifest.js gzip 484 B 483 B N/A
Overall change 0 B 0 B
Rendered Page Sizes
vercel/next.js canary LavaToaster/next.js patch-2 Change
index.html gzip 529 B 526 B N/A
link.html gzip 540 B 541 B N/A
withRouter.html gzip 524 B 522 B N/A
Overall change 0 B 0 B
Edge SSR bundle Size
vercel/next.js canary LavaToaster/next.js patch-2 Change
edge-ssr.js gzip 92.6 kB 92.6 kB N/A
page.js gzip 145 kB 145 kB N/A
Overall change 0 B 0 B
Middleware size
vercel/next.js canary LavaToaster/next.js patch-2 Change
middleware-b..fest.js gzip 626 B 625 B N/A
middleware-r..fest.js gzip 150 B 151 B N/A
middleware.js gzip 24.8 kB 24.8 kB N/A
edge-runtime..pack.js gzip 1.92 kB 1.92 kB
Overall change 1.92 kB 1.92 kB
Next Runtimes
vercel/next.js canary LavaToaster/next.js patch-2 Change
app-page-exp...dev.js gzip 167 kB 167 kB
app-page-exp..prod.js gzip 93.4 kB 93.4 kB
app-page-tur..prod.js gzip 94.1 kB 94.1 kB
app-page-tur..prod.js gzip 88.7 kB 88.7 kB
app-page.run...dev.js gzip 137 kB 137 kB
app-page.run..prod.js gzip 88 kB 88 kB
app-route-ex...dev.js gzip 23.8 kB 23.8 kB
app-route-ex..prod.js gzip 16.4 kB 16.4 kB
app-route-tu..prod.js gzip 16.5 kB 16.5 kB
app-route-tu..prod.js gzip 16 kB 16 kB
app-route.ru...dev.js gzip 23.2 kB 23.2 kB
app-route.ru..prod.js gzip 16 kB 16 kB
pages-api-tu..prod.js gzip 9.37 kB 9.37 kB
pages-api.ru...dev.js gzip 9.64 kB 9.64 kB
pages-api.ru..prod.js gzip 9.37 kB 9.37 kB
pages-turbo...prod.js gzip 21.8 kB 21.8 kB
pages.runtim...dev.js gzip 22.5 kB 22.5 kB
pages.runtim..prod.js gzip 21.8 kB 21.8 kB
server.runti..prod.js gzip 49.1 kB 49.1 kB
Overall change 924 kB 924 kB
Commit: 7e6e76c

@LavaToaster
Copy link
Contributor Author

GitHub CI should pass now. Though I will note that pnpm test-dev test/development/acceptance-app/app-hmr-changes.test.ts did work when I ran it locally.

@LavaToaster
Copy link
Contributor Author

Someone able to re-run that last(?) failing workflow. Failed due to a git checkout issue.

@LavaToaster
Copy link
Contributor Author

😅 need another run, the error now is for an address already in use.

@LavaToaster
Copy link
Contributor Author

Anything else I need to sort out? 👀

@timneutkens timneutkens merged commit 00eff94 into vercel:canary Dec 4, 2023
59 checks passed
@timneutkens
Copy link
Member

Thanks @LavaToaster!

@LavaToaster LavaToaster deleted the patch-2 branch December 4, 2023 10:43
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Dec 18, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
CI approved Approve running CI for fork locked type: next
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants