Skip to content

[ci] Skip Playwright system deps install on subsequent self-hosted runs#92893

Merged
mmastrac merged 1 commit into
canaryfrom
mmastrac/playwright-cache-deps
Apr 16, 2026
Merged

[ci] Skip Playwright system deps install on subsequent self-hosted runs#92893
mmastrac merged 1 commit into
canaryfrom
mmastrac/playwright-cache-deps

Conversation

@mmastrac
Copy link
Copy Markdown
Contributor

@mmastrac mmastrac commented Apr 16, 2026

What

Use a stamp file to skip playwright install --with-deps after the first successful run on a self-hosted runner.

Why

--with-deps runs sudo apt-get install for Playwright's system dependencies every time, even when they're already installed. On self-hosted runners this takes ~10s of no-op apt-get checking. After the first install, subsequent runs only need playwright install (which downloads browser binaries if the version changed, and is instant when cached).

The assumption is that on most of the runners, playwright will be the same version on each, and the deps that are installed are compatible within each version.

Most of the time this step is ~3s, when everything is healthy and up-to-date.

Occasionally these steps will hiccup on builds when we're already really got these deps installed so this chops a little bit off each one. This also helps when APT mirrors go down.

How

  • First run: playwright install --with-deps + write ~/.cache/playwright-deps-installed
  • Subsequent runs: stamp file exists, run playwright install without --with-deps
  • The stamp persists on self-hosted runners across jobs
  • Fresh/reimaged runners don't have the stamp, so they get the full install
  • The cache is ignored if the most recently installed playwright version doesn't match

@nextjs-bot nextjs-bot added the created-by: Turbopack team PRs by the Turbopack team. label Apr 16, 2026
Comment thread .github/workflows/build_reusable.yml Outdated
@nextjs-bot
Copy link
Copy Markdown
Contributor

nextjs-bot commented Apr 16, 2026

Tests Passed

@mmastrac mmastrac force-pushed the mmastrac/playwright-cache-deps branch from f956173 to f15c734 Compare April 16, 2026 14:47
@nextjs-bot
Copy link
Copy Markdown
Contributor

nextjs-bot commented Apr 16, 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 456ms ▁▁▁▁█
Cold (Ready in log) 439ms 439ms █▂▇▆▂
Cold (First Request) 821ms 824ms ▁█▁█▇
Warm (Listen) 456ms 455ms ▁▁▁▁█
Warm (Ready in log) 438ms 439ms ▆▅▂█▅
Warm (First Request) 339ms 338ms █▄▅█▄
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 456ms 456ms ███▁▁
Cold (Ready in log) 439ms 438ms ▅▆█▇▃
Cold (First Request) 1.952s 1.932s ▅█▅▆▂
Warm (Listen) 455ms 456ms ▁███▅
Warm (Ready in log) 438ms 438ms ▇▇█▇▄
Warm (First Request) 1.956s 1.952s ▅███▂

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 3.953s 3.907s ▄▃█▃▁
Cached Build 3.980s 3.960s ▅▄▇▃▁
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 14.603s 14.507s ▆▆▇█▅
Cached Build 14.616s 14.584s ▇▇▆█▄
node_modules Size 494 MB 494 MB █████
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Main Bundles
Canary PR Change
01lykb9j9u19z.js gzip 155 B N/A -
037b-ksaecgir.js gzip 158 B N/A -
051awit1pzxy9.js gzip 156 B N/A -
07rxhp_1_g4mu.js gzip 13.1 kB N/A -
08avva-dy02e7.js gzip 10.4 kB N/A -
0b9mvru8gaawc.js gzip 156 B N/A -
0cz1d0mv5g_q7.js gzip 39.4 kB 39.4 kB
0dfverolgqlu_.js gzip 155 B N/A -
0fli3_wppnim5.js gzip 12.9 kB N/A -
0guupo6x26xoo.js gzip 70.8 kB N/A -
0k09jwjeb-tki.js gzip 13.8 kB N/A -
0kb7_ep3r1z0_.js gzip 10.1 kB N/A -
0kpuma6a8t2qh.js gzip 168 B N/A -
0kw8xgqdrilf6.js gzip 8.56 kB N/A -
0ojkk2e654xsc.js gzip 8.59 kB N/A -
0sbq9bkqvh45e.js gzip 152 B N/A -
0wxpyd8r-vipl.js gzip 1.47 kB N/A -
0xnfs20vs3ysc.js gzip 153 B N/A -
0xy2fhla48_rd.js gzip 9.24 kB N/A -
1-z_xm7pzpbeh.js gzip 49.2 kB N/A -
10wqsvi2mgfmi.js gzip 9.82 kB N/A -
16lhqjoqbznyg.js gzip 220 B 220 B
16vepdkipri3r.js gzip 8.51 kB N/A -
17n96uu6y1pxq.js gzip 8.6 kB N/A -
18y4_8-9or0mn.js gzip 8.51 kB N/A -
1elt1qium-r2m.css gzip 115 B 115 B
1gq145j3kps-h.js gzip 8.62 kB N/A -
1l5or8vq6a69s.js gzip 154 B N/A -
1nsh-mbn0e-se.js gzip 8.56 kB N/A -
1tsrrp1tdngti.js gzip 13.3 kB N/A -
1zf460s-ga2zh.js gzip 154 B N/A -
2__-e_ym8n788.js gzip 450 B N/A -
2-ivsrs9yb0b0.js gzip 156 B N/A -
22o6xd9_ywdu6.js gzip 233 B N/A -
2kvj8yrfznmwx.js gzip 5.69 kB N/A -
2mlsou7_9la1i.js gzip 154 B N/A -
2p854ctj-qiki.js gzip 65.5 kB N/A -
2qv7m7xjnokgr.js gzip 8.58 kB N/A -
341itofhl0awt.js gzip 160 B N/A -
342ijzvrpe53h.js gzip 2.29 kB N/A -
44un3--wmqiyh.js gzip 7.61 kB N/A -
turbopack-0a..u7nt.js gzip 4.19 kB N/A -
turbopack-0b..u348.js gzip 4.19 kB N/A -
turbopack-0e..wy2i.js gzip 4.19 kB N/A -
turbopack-0l..dasq.js gzip 4.19 kB N/A -
turbopack-1-..xex1.js gzip 4.2 kB N/A -
turbopack-1d..whps.js gzip 4.19 kB N/A -
turbopack-1e..pdkr.js gzip 4.18 kB N/A -
turbopack-3_..jxf5.js gzip 4.19 kB N/A -
turbopack-33..vmhx.js gzip 4.19 kB N/A -
turbopack-36..b3w5.js gzip 4.17 kB N/A -
turbopack-36..ne43.js gzip 4.19 kB N/A -
turbopack-3s..yafr.js gzip 4.19 kB N/A -
turbopack-3y..cu3g.js gzip 4.19 kB N/A -
turbopack-41..gi52.js gzip 4.19 kB N/A -
03_szppy5nakp.js gzip N/A 49.2 kB -
06eqw0ze8c7k4.js gzip N/A 65.5 kB -
0arkbdqpxc37i.js gzip N/A 8.6 kB -
0bz-xifewa17d.js gzip N/A 8.63 kB -
0tvekitj587fh.js gzip N/A 8.51 kB -
0xz7kqe1wjdqh.js gzip N/A 169 B -
0yvk6-wi8e9wh.js gzip N/A 13.3 kB -
0z83a1om5rvtt.js gzip N/A 7.61 kB -
1-jqyfc89tixo.js gzip N/A 1.46 kB -
14t1kneseb8th.js gzip N/A 2.3 kB -
15sb1-dsqfk_j.js gzip N/A 8.59 kB -
1ab2xruymo-oj.js gzip N/A 449 B -
1hxb-q1ungqh_.js gzip N/A 70.8 kB -
1tu25qtsmfhar.js gzip N/A 9.82 kB -
1vein_gnv3mwr.js gzip N/A 8.56 kB -
1wzrm0xjjbzn5.js gzip N/A 10.1 kB -
1z3g0uaqtv9_3.js gzip N/A 8.56 kB -
2-e64t22r1kgw.js gzip N/A 153 B -
21uyslsd4odmk.js gzip N/A 158 B -
25a1yz7zua29z.js gzip N/A 13.8 kB -
27o93knux3hfn.js gzip N/A 156 B -
2bi5hx402juv-.js gzip N/A 8.58 kB -
2hy56297fog9u.js gzip N/A 8.52 kB -
2r7z7i6hgc457.js gzip N/A 155 B -
2u_rpxq3tzytl.js gzip N/A 233 B -
2upap--8h9cvf.js gzip N/A 157 B -
323ki47w-n3e9.js gzip N/A 157 B -
35a8pvb74ba9h.js gzip N/A 155 B -
368lim5wq0o0r.js gzip N/A 12.9 kB -
3asf9b6dh7q99.js gzip N/A 155 B -
3d2-cjrz3nqd1.js gzip N/A 161 B -
3drqjohogojbw.js gzip N/A 5.69 kB -
3g8l1m2-o-ewi.js gzip N/A 13.1 kB -
3hhvtftvowwye.js gzip N/A 156 B -
3jmkxsnxg0nrh.js gzip N/A 10.4 kB -
3q11pdkvyja5e.js gzip N/A 161 B -
3r03tqt-li-wg.js gzip N/A 158 B -
3wpp8nvyoj121.js gzip N/A 9.24 kB -
turbopack-03..7g4c.js gzip N/A 4.19 kB -
turbopack-0f..tm9h.js gzip N/A 4.19 kB -
turbopack-0i..hzz_.js gzip N/A 4.19 kB -
turbopack-0m..zm5y.js gzip N/A 4.2 kB -
turbopack-0x..34yg.js gzip N/A 4.19 kB -
turbopack-14.._6xm.js gzip N/A 4.17 kB -
turbopack-16..zbi5.js gzip N/A 4.19 kB -
turbopack-1h..u9e1.js gzip N/A 4.19 kB -
turbopack-28..n7f5.js gzip N/A 4.19 kB -
turbopack-2h..wq2d.js gzip N/A 4.19 kB -
turbopack-2n..pnni.js gzip N/A 4.19 kB -
turbopack-2u..gsgj.js gzip N/A 4.19 kB -
turbopack-2x..crbl.js gzip N/A 4.19 kB -
turbopack-36..2jpx.js gzip N/A 4.19 kB -
Total 465 kB 465 kB ⚠️ +61 B

Server

Middleware
Canary PR Change
middleware-b..fest.js gzip 717 B 718 B
Total 717 B 718 B ⚠️ +1 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 432 B 434 B
Total 432 B 434 B ⚠️ +2 B

📦 Webpack

Client

Main Bundles
Canary PR Change
2637-HASH.js gzip 4.63 kB N/A -
7724.HASH.js gzip 169 B N/A -
8274-HASH.js gzip 61.4 kB N/A -
8817-HASH.js gzip 5.59 kB N/A -
c3500254-HASH.js gzip 62.8 kB N/A -
framework-HASH.js gzip 59.7 kB 59.7 kB
main-app-HASH.js gzip 254 B 255 B
main-HASH.js gzip 39.4 kB 39.4 kB
webpack-HASH.js gzip 1.68 kB 1.68 kB
5887-HASH.js gzip N/A 5.61 kB -
6522-HASH.js gzip N/A 60.8 kB -
6779-HASH.js gzip N/A 4.63 kB -
8854.HASH.js gzip N/A 169 B -
eab920f9-HASH.js gzip N/A 62.8 kB -
Total 236 kB 235 kB ✅ -643 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 193 B 193 B
_error-HASH.js gzip 182 B 182 B
css-HASH.js gzip 333 B 334 B
dynamic-HASH.js gzip 1.81 kB 1.8 kB
edge-ssr-HASH.js gzip 255 B 255 B
head-HASH.js gzip 353 B 349 B 🟢 4 B (-1%)
hooks-HASH.js gzip 384 B 382 B
image-HASH.js gzip 581 B 581 B
index-HASH.js gzip 260 B 259 B
link-HASH.js gzip 2.51 kB 2.51 kB
routerDirect..HASH.js gzip 316 B 318 B
script-HASH.js gzip 386 B 386 B
withRouter-HASH.js gzip 313 B 314 B
1afbb74e6ecf..834.css gzip 106 B 106 B
Total 7.98 kB 7.97 kB ✅ -10 B

Server

Edge SSR
Canary PR Change
edge-ssr.js gzip 126 kB 126 kB
page.js gzip 273 kB 273 kB
Total 399 kB 399 kB ✅ -437 B
Middleware
Canary PR Change
middleware-b..fest.js gzip 618 B 618 B
middleware-r..fest.js gzip 156 B 156 B
middleware.js gzip 44.2 kB 44.4 kB
edge-runtime..pack.js gzip 842 B 842 B
Total 45.8 kB 46 kB ⚠️ +180 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 721 B 720 B
Total 721 B 720 B ✅ -1 B
Build Cache
Canary PR Change
0.pack gzip 4.38 MB 4.38 MB
index.pack gzip 114 kB 115 kB 🔴 +1.25 kB (+1%)
index.pack.old gzip 112 kB 114 kB 🔴 +1.86 kB (+2%)
Total 4.61 MB 4.61 MB ⚠️ +721 B

🔄 Shared (bundler-independent)

Runtimes
Canary PR Change
app-page-exp...dev.js gzip 346 kB 346 kB
app-page-exp..prod.js gzip 192 kB 192 kB
app-page-tur...dev.js gzip 346 kB 346 kB
app-page-tur..prod.js gzip 192 kB 192 kB
app-page-tur...dev.js gzip 342 kB 342 kB
app-page-tur..prod.js gzip 190 kB 190 kB
app-page.run...dev.js gzip 343 kB 343 kB
app-page.run..prod.js gzip 190 kB 190 kB
app-route-ex...dev.js gzip 77 kB 77 kB
app-route-ex..prod.js gzip 52.5 kB 52.5 kB
app-route-tu...dev.js gzip 77.1 kB 77.1 kB
app-route-tu..prod.js gzip 52.6 kB 52.6 kB
app-route-tu...dev.js gzip 76.7 kB 76.7 kB
app-route-tu..prod.js gzip 52.3 kB 52.3 kB
app-route.ru...dev.js gzip 76.6 kB 76.6 kB
app-route.ru..prod.js gzip 52.3 kB 52.3 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.9 kB 43.9 kB
pages-api-tu..prod.js gzip 33.5 kB 33.5 kB
pages-api.ru...dev.js gzip 43.9 kB 43.9 kB
pages-api.ru..prod.js gzip 33.5 kB 33.5 kB
pages-turbo....dev.js gzip 53.3 kB 53.3 kB
pages-turbo...prod.js gzip 39.1 kB 39.1 kB
pages.runtim...dev.js gzip 53.3 kB 53.3 kB
pages.runtim..prod.js gzip 39.1 kB 39.1 kB
server.runti..prod.js gzip 62.9 kB 62.9 kB
Total 3.06 MB 3.06 MB
📎 Tarball URL
https://vercel-packages.vercel.app/next/commits/5961ddcb5c6445abec9350e8f2c2847265c5dee4/next

@mmastrac mmastrac force-pushed the mmastrac/playwright-cache-deps branch from f15c734 to eb977e2 Compare April 16, 2026 16:01
@mmastrac mmastrac requested a review from ztanner April 16, 2026 16:01
@mmastrac mmastrac force-pushed the mmastrac/playwright-cache-deps branch from eb977e2 to 84f6c0b Compare April 16, 2026 16:09
@mmastrac mmastrac changed the title Skip Playwright system deps install on subsequent self-hosted runs [ci] Skip Playwright system deps install on subsequent self-hosted runs Apr 16, 2026
@mmastrac mmastrac marked this pull request as ready for review April 16, 2026 16:14
On self-hosted runners, the system dependencies installed by
playwright install --with-deps persist between runs. Use a stamp
file (~/.cache/playwright-deps-installed) to skip the slow apt-get
on subsequent runs, falling back to just downloading browser binaries
if their version changed.
@mmastrac mmastrac force-pushed the mmastrac/playwright-cache-deps branch from 84f6c0b to 5961ddc Compare April 16, 2026 16:15
@mmastrac mmastrac merged commit 30b305e into canary Apr 16, 2026
546 of 637 checks passed
@mmastrac mmastrac deleted the mmastrac/playwright-cache-deps branch April 16, 2026 20:14
@github-actions github-actions Bot added the locked label May 1, 2026
@github-actions github-actions Bot locked as resolved and limited conversation to collaborators May 1, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

created-by: Turbopack team PRs by the Turbopack team. locked

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants