feat(FR-2887): serve released bundle via Portless with version-named URL#7398
Conversation
How to use the Graphite Merge QueueAdd either label to this PR to merge it via the merge queue:
You must have a Graphite account in order to use the merge queue. Sign up using this link. An organization admin has required the Graphite Merge Queue in this repository. Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue. This stack of pull requests is managed by Graphite. Learn more about stacking. |
Coverage Report for root-coverage
File CoverageNo changed files found. |
There was a problem hiding this comment.
Pull request overview
Adds a workflow for serving any published backend.ai-webui release bundle locally under a stable, version-named Portless URL (with a plain-serve fallback), and documents/automates the workflow via a new Claude Code skill.
Changes:
- Update
scripts/serve-release.shto derive a version-based Portless app name, supportSERVE_PORT, and fall back to directservewhenportlessis unavailable. - Start (or reuse) the Portless proxy daemon on the standard project port (default
1355, respectingPORTLESS_PORTwhen set). - Add
.claude/skills/serve-release/to guide invoking the script and announcing Portless/direct URLs.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| scripts/serve-release.sh | Adds Portless-based serving with version-derived subdomain, configurable serve port, and non-Portless fallback. |
| .claude/skills/serve-release/SKILL.md | Introduces a Claude Code skill documenting version resolution, preflight checks, and how to run the release-serve script. |
Code reviewNo issues found. Checked for bugs and CLAUDE.md compliance. 🤖 Generated with Claude Code - If this code review was useful, please react with 👍. Otherwise, react with 👎. |
787c4d4 to
cf47e2a
Compare

Resolves #7397 (FR-2887)
Summary
Adds a new "serve a released bundle locally via Portless" workflow so QA, developers, and reviewers can spin up any published
backend.ai-webuirelease under a stable, version-named URL.scripts/serve-release.shserveinportlessafter extraction; the proxied URL is derived from the version (e.g.26.4.8-rc.3→https://v26-4-8-rc-3.localhost:1355).1355, same default asscripts/dev.mjs); honoursPORTLESS_PORTif the caller pinned one.SERVE_PORTenv var (default9091) so multiple releases can be served side-by-side.serveonhttp://localhost:${SERVE_PORT}whenportlessisn't installed — no behavioural regression for lean environments..claude/skills/serve-release/dev-serverskill (version resolution, pre-flight checks, port selection, URL announcement, common follow-ups, out-of-scope).Why
Previously,
scripts/serve-release.shserved every release onhttp://localhost:9091. When comparing releases side-by-side (e.g.rc.2vsrc.3) the URL gave no hint which version was loaded, and cookies/storage clashed across runs. The dev-server flow already standardises on Portless for the same reason — this change brings the release-serve flow in line.Test plan
./scripts/serve-release.sh v26.4.8-rc.3downloads the bundle, copiesconfig.toml, and prints both the Portless URL (https://v26-4-8-rc-3.localhost:1355) and the direct fallback URL.pnpm dev.SERVE_PORT=9092 ./scripts/serve-release.sh v26.4.7runs in parallel without clashing with9091and useshttps://v26-4-7.localhost:1355.scripts/temp-releases/webui-<VERSION>/and skips download.portlessbinary out of$PATHmakes the script serve viahttp://localhost:9091directly without erroring.serve-release, notdev-server.