Skip to content

Enable pnpm dependency caching in e2e deploy tests#88953

Merged
eps1lon merged 7 commits intocanaryfrom
cursor/e2e-deploy-pnpm-caching-d170
Jan 27, 2026
Merged

Enable pnpm dependency caching in e2e deploy tests#88953
eps1lon merged 7 commits intocanaryfrom
cursor/e2e-deploy-pnpm-caching-d170

Conversation

@eps1lon
Copy link
Member

@eps1lon eps1lon commented Jan 23, 2026

Adds pnpm dependency caching to the e2e deploy test workflow. Basically all workflows using build_reusable in a GitHub hosted runners now get pnpm dependency caching. Self-hosted runners relied on the persisted worker environment.

It's also nice for forks/mirrors that use GitHub-hosted runners.

For e2e deploy test this is mostly relevant for a retry. Right now the lockfile changes for every release anyway since we have to use exact versions in the package.json (which change for every release). Ideally we'd use workspace:* and pnpm publish to avoid lockfile changes on release.

test plan


Slack Thread

Open in Cursor Open in Web

@cursor
Copy link

cursor bot commented Jan 23, 2026

Cursor Agent can help with this pull request. Just @cursor in comments and I'll start working on changes in this branch.
Learn more about Cursor Agents

@nextjs-bot nextjs-bot added the created-by: Next.js team PRs by the Next.js team. label Jan 23, 2026
@nextjs-bot
Copy link
Collaborator

nextjs-bot commented Jan 23, 2026

Allow CI Workflow Run

  • approve CI run for commit: 3edcdbd

Note: this should only be enabled once the PR is ready to go and can only be enabled by a maintainer

@eps1lon eps1lon added the CI approved Approve running CI for fork label Jan 26, 2026
@eps1lon eps1lon changed the title E2e deploy pnpm caching Enable pnpm dependency caching in e2e deploy tests Jan 26, 2026
@eps1lon eps1lon marked this pull request as ready for review January 26, 2026 10:15
@eps1lon eps1lon requested review from ijjk and ztanner January 26, 2026 10:16
@nextjs-bot
Copy link
Collaborator

nextjs-bot commented Jan 26, 2026

Tests Passed

@nextjs-bot
Copy link
Collaborator

nextjs-bot commented Jan 26, 2026

Stats from current PR

✅ No significant changes detected

📊 All Metrics
📖 Metrics Glossary

Dev Server Metrics:

  • Listen = TCP port starts accepting connections
  • First Request = HTTP server returns successful response
  • Cold = Fresh build (no cache)
  • Warm = With cached build artifacts

Build Metrics:

  • Fresh = Clean build (no .next directory)
  • Cached = With existing .next directory

Change Thresholds:

  • Time: Changes < 50ms AND < 10%, OR < 2% are insignificant
  • Size: Changes < 1KB AND < 1% are insignificant
  • All other changes are flagged to catch regressions

⚡ Dev Server

Metric Canary PR Change Trend
Cold (Listen) 456ms 455ms ▁▁▁▁▁
Cold (Ready in log) 438ms 438ms ▂▁▁▁▂
Cold (First Request) 1.167s 1.150s ▃▃▃▁▄
Warm (Listen) 457ms 457ms ▁▁▁▁▁
Warm (Ready in log) 443ms 442ms ▁▁▁▁▁
Warm (First Request) 339ms 339ms ▁▁▁▁▁
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 456ms 455ms ▁▁▁▁▅
Cold (Ready in log) 448ms 448ms ▃▃▁▃▄
Cold (First Request) 1.804s 1.826s ▂▃▁▂▃
Warm (Listen) 457ms 457ms ▁▁▁▁▄
Warm (Ready in log) 448ms 446ms ▃▃▁▃▄
Warm (First Request) 1.804s 1.802s ▂▃▁▂▃

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 4.341s 4.269s ▁▁▁▁▁
Cached Build 4.352s 4.199s ▁▁▁▁▁
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 14.556s 14.519s ▁▃▁▁▃
Cached Build 14.543s 14.572s ▁▃▁▁▃
node_modules Size 461 MB 461 MB █████
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Main Bundles: **432 kB** → **432 kB** ✅ -42 B

82 files with content-based hashes (individual files not comparable between builds)

Server

Middleware
Canary PR Change
middleware-b..fest.js gzip 764 B 759 B
Total 764 B 759 B ✅ -5 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 450 B 452 B
Total 450 B 452 B ⚠️ +2 B

📦 Webpack

Client

Main Bundles
Canary PR Change
2086.HASH.js gzip 169 B N/A -
2161-HASH.js gzip 5.47 kB N/A -
2747-HASH.js gzip 4.53 kB N/A -
4322-HASH.js gzip 52.7 kB N/A -
ec793fe8-HASH.js gzip 62.3 kB N/A -
framework-HASH.js gzip 59.8 kB 59.8 kB
main-app-HASH.js gzip 251 B 254 B 🔴 +3 B (+1%)
main-HASH.js gzip 38.7 kB 39.1 kB
webpack-HASH.js gzip 1.68 kB 1.68 kB
1596.HASH.js gzip N/A 169 B -
2658-HASH.js gzip N/A 52.4 kB -
6349-HASH.js gzip N/A 4.52 kB -
7019-HASH.js gzip N/A 5.49 kB -
b17a3386-HASH.js gzip N/A 62.3 kB -
Total 226 kB 226 kB ⚠️ +55 B
Polyfills
Canary PR Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Total 39.4 kB 39.4 kB
Pages
Canary PR Change
_app-HASH.js gzip 194 B 193 B
_error-HASH.js gzip 182 B 182 B
css-HASH.js gzip 336 B 335 B
dynamic-HASH.js gzip 1.8 kB 1.8 kB
edge-ssr-HASH.js gzip 256 B 256 B
head-HASH.js gzip 352 B 349 B
hooks-HASH.js gzip 385 B 384 B
image-HASH.js gzip 580 B 580 B
index-HASH.js gzip 259 B 258 B
link-HASH.js gzip 2.5 kB 2.51 kB
routerDirect..HASH.js gzip 319 B 317 B
script-HASH.js gzip 385 B 387 B
withRouter-HASH.js gzip 316 B 315 B
1afbb74e6ecf..834.css gzip 106 B 106 B
Total 7.97 kB 7.96 kB ✅ -8 B

Server

Edge SSR
Canary PR Change
edge-ssr.js gzip 126 kB 126 kB
page.js gzip 245 kB 240 kB 🟢 4.73 kB (-2%)
Total 371 kB 366 kB ✅ -4.6 kB
Middleware
Canary PR Change
middleware-b..fest.js gzip 616 B 615 B
middleware-r..fest.js gzip 155 B 156 B
middleware.js gzip 33.1 kB 33.3 kB
edge-runtime..pack.js gzip 842 B 842 B
Total 34.8 kB 34.9 kB ⚠️ +135 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 736 B 738 B
Total 736 B 738 B ⚠️ +2 B
Build Cache
Canary PR Change
0.pack gzip 3.72 MB 3.72 MB 🔴 +7.79 kB (+0%)
index.pack gzip 101 kB 100 kB
index.pack.old gzip 102 kB 102 kB
Total 3.92 MB 3.93 MB ⚠️ +7.2 kB

🔄 Shared (bundler-independent)

Runtimes
Canary PR Change
app-page-exp...dev.js gzip 307 kB 307 kB
app-page-exp..prod.js gzip 163 kB 163 kB
app-page-tur...dev.js gzip 306 kB 306 kB
app-page-tur..prod.js gzip 163 kB 163 kB
app-page-tur...dev.js gzip 303 kB 303 kB
app-page-tur..prod.js gzip 161 kB 161 kB
app-page.run...dev.js gzip 303 kB 303 kB
app-page.run..prod.js gzip 161 kB 161 kB
app-route-ex...dev.js gzip 70 kB 70 kB
app-route-ex..prod.js gzip 48.6 kB 48.6 kB
app-route-tu...dev.js gzip 70 kB 70 kB
app-route-tu..prod.js gzip 48.6 kB 48.6 kB
app-route-tu...dev.js gzip 69.6 kB 69.6 kB
app-route-tu..prod.js gzip 48.4 kB 48.4 kB
app-route.ru...dev.js gzip 69.6 kB 69.6 kB
app-route.ru..prod.js gzip 48.4 kB 48.4 kB
dist_client_...dev.js gzip 324 B 324 B
dist_client_...dev.js gzip 326 B 326 B
dist_client_...dev.js gzip 318 B 318 B
dist_client_...dev.js gzip 317 B 317 B
pages-api-tu...dev.js gzip 43 kB 43 kB
pages-api-tu..prod.js gzip 32.7 kB 32.7 kB
pages-api.ru...dev.js gzip 43 kB 43 kB
pages-api.ru..prod.js gzip 32.7 kB 32.7 kB
pages-turbo....dev.js gzip 52.3 kB 52.3 kB
pages-turbo...prod.js gzip 39.2 kB 39.2 kB
pages.runtim...dev.js gzip 52.2 kB 52.2 kB
pages.runtim..prod.js gzip 39.2 kB 39.2 kB
server.runti..prod.js gzip 62.4 kB 62.4 kB
Total 2.74 MB 2.74 MB ⚠️ +2 B

cursoragent and others added 7 commits January 26, 2026 11:31
This adds pnpm dependency caching to build_reusable.yml for jobs that
run on GitHub-hosted ubuntu-latest runners (like the e2e deploy tests).

The caching pattern follows the same approach used in build_and_deploy.yml,
create_release_branch.yml, and trigger_release.yml:
- Get the pnpm store path
- Cache it using actions/cache@v4 with a key based on pnpm-lock.yaml hash

This will speed up pnpm install for jobs like test_e2e_deploy_release.yml
that pass runs_on_labels: '["ubuntu-latest"]'.

Co-authored-by: sebastian.silbermann <sebastian.silbermann@vercel.com>
Add enablePnpmCache input to build_reusable.yml and enable it in
test_e2e_deploy_release.yml for the test-deploy job.

This caches the pnpm store between workflow runs, speeding up pnpm install
for GitHub-hosted ubuntu-latest runners. The caching pattern follows the
same approach used in build_and_deploy.yml, create_release_branch.yml,
and trigger_release.yml.

Co-authored-by: sebastian.silbermann <sebastian.silbermann@vercel.com>
Add check for ubuntu-latest in runs_on_labels to ensure pnpm caching
only runs on GitHub-hosted runners. Self-hosted runners have their own
persistent storage and don't need actions/cache.

Co-authored-by: sebastian.silbermann <sebastian.silbermann@vercel.com>
Remove the explicit enablePnpmCache option and instead automatically
enable pnpm store caching when runs_on_labels contains 'ubuntu-latest'.

This way any job using build_reusable.yml on GitHub-hosted runners
will benefit from pnpm caching without needing to remember to enable it.

Co-authored-by: sebastian.silbermann <sebastian.silbermann@vercel.com>
Aligns with the pattern used in other workflows (build_and_deploy.yml,
create_release_branch.yml, trigger_release.yml) that explain restore-keys
is avoided to prevent indefinite cache growth.

Co-authored-by: sebastian.silbermann <sebastian.silbermann@vercel.com>
Use runner.environment == 'github-hosted' instead of checking
runs_on_labels for 'ubuntu-latest'. This is more reliable as it
directly checks the runner type rather than inferring from labels.

Co-authored-by: sebastian.silbermann <sebastian.silbermann@vercel.com>
@eps1lon eps1lon force-pushed the cursor/e2e-deploy-pnpm-caching-d170 branch from 3edcdbd to d6d5a70 Compare January 26, 2026 10:31

- name: Cache pnpm store
if: ${{ runner.environment == 'github-hosted' }}
uses: actions/cache@v4
Copy link
Member

@ijjk ijjk Jan 26, 2026

Choose a reason for hiding this comment

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

Has actions/cache gotten more reliable? We previously saw restoring from cache causing slower perf than just installing directly in GitHub's runners, the cache would also randomly cause workflows to fail from transient errors.

Copy link
Member Author

Choose a reason for hiding this comment

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

I've never seen a fresh download be faster than a cached install tbh. Maybe it's only slower on self-hosted runners which this change doesn't affect.

Copy link
Member

Choose a reason for hiding this comment

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

This was way back before we had self hosted runners

@eps1lon
Copy link
Member Author

eps1lon commented Jan 27, 2026

Can't think of an easy A/B testing setup. Will just look at before/after times (after is cache step + install step).

@eps1lon eps1lon merged commit 62f4002 into canary Jan 27, 2026
279 of 283 checks passed
@eps1lon eps1lon deleted the cursor/e2e-deploy-pnpm-caching-d170 branch January 27, 2026 14:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CI approved Approve running CI for fork created-by: Next.js team PRs by the Next.js team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants