Fixed the boot benchmark failing on a missing card asset manifest - #30004
Conversation
no ref - cbe73b1 moved card minification to build time and made cards.manifest.json a hard boot requirement, but job_perf-tests only ran build:tsc, so boot died with ENOENT and hyperfine exited 2 - the test jobs never hit this because their nx targets declare build:assets in dependsOn, and the production-image benchmark gets it from Dockerfile.production - this job boots via raw `node index.js`, so there is no target to inherit it from and it has to build the assets itself - the step sits outside the measured command, so the boot-time series stays comparable with its history
|
| Command | Status | Duration | Result |
|---|---|---|---|
nx run @tryghost/admin:test:acceptance |
✅ Succeeded | 6m 36s | View ↗ |
nx run ghost:test:integration |
✅ Succeeded | 3m 6s | View ↗ |
nx run ghost:test:ci:integration |
✅ Succeeded | 5s | View ↗ |
nx run ghost:test:legacy |
✅ Succeeded | 2m 48s | View ↗ |
nx run ghost:test:e2e |
✅ Succeeded | 2m 37s | View ↗ |
nx run @tryghost/koenig-lexical:test:acceptance |
✅ Succeeded | 1m 43s | View ↗ |
nx run @tryghost/activitypub:test:acceptance |
✅ Succeeded | 44s | View ↗ |
nx run-many -t build:tsc |
✅ Succeeded | 4s | View ↗ |
Additional runs (9) |
✅ Succeeded | ... | View ↗ |
💡 Verify your cache is correct by running tasks in a sandbox. Read docs ↗
☁️ Nx Cloud last updated this comment at 2026-08-17 08:34:28 UTC
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: QUIET Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
💤 Files with no reviewable changes (1)
Included review availability: Your plan includes up to 10 reviews per rolling hour; 8 remain after this review. 📜 Recent review details⏰ Context from checks skipped due to timeout. (18)
WalkthroughThe CI performance test job runs Possibly related PRs
Merge Risk: ⚪ Minimal · up to The workflow now builds the required asset manifest before booting the benchmark, a localized CI behavior change with no actionable merge-blocking risk remaining after normal checks and review. 🚥 Pre-merge checks | ✅ 6✅ Passed checks (6 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #30004 +/- ##
==========================================
- Coverage 75.59% 75.59% -0.01%
==========================================
Files 1596 1596
Lines 141739 141739
Branches 17539 17538 -1
==========================================
- Hits 107147 107143 -4
- Misses 33589 33593 +4
Partials 1003 1003
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Removed comments explaining the asset build process.

job_perf-testshas been red onmainsince cbe73b1 (#29659) — e.g. this run:That commit moved card minification from request time to build time and made
cards.manifest.jsona hard boot requirement (it's constructed eagerly fromcore/bridge.js). The job only ranbuild:tsc, so the manifest never existed and boot exited 2, failing hyperfine.Every other Ghost-booting job already gets the manifest: the test jobs through their nx
dependsOn: ["build:assets", ...], the production-image benchmark throughDockerfile.production, andjob_ghost-clithrough the packed archive fromjob_pack. This job boots via rawnode index.js, so there's no target to inherit it from — it has to build the assets itself.pnpm --filter ghost run build:assetsis the same invocation already used injob_packandDockerfile.production, rather than a narrowerbuild:assets:cards, so the "make the tree bootable" step stays one greppable string across all three call sites.Benchmark impact
The step is a separate
run:, outside the measured command, so it isn't in the hyperfine sample.Worth flagging for whoever reads the chart: the series has a gap since 17 Aug, and the first green run will likely show a small step up. That's real product behaviour from #29659 — a 53KB
readFileSync+JSON.parseat boot, plus the content-based asset hashing default flip — not environment drift from this change.Verification
Locally, on this branch:
pnpm --filter ghost run build:assets→ writescards.manifest.jsonat exactly the pathcard-assets.jsreads (publicFilePath).GHOST_CI_SHUTDOWN_AFTER_BOOT=1 node index.js→ exit 0, "Ghost booted in 3.354s".No other job in
ci.yml(or any other workflow) boots Ghost from source, so this is the only place that needed it.