Commit graph

42 commits

Author SHA1 Message Date
yiliang114
926c10a604 feat(installer): add standalone archive installer with multi-platform release workflow
- Add standalone archive installer (bat/sh) that downloads platform binaries
  from GitHub/Aliyun without requiring Node.js or npm on the target machine
- Add fork-friendly release-test workflow for manual GitHub Release creation
  covering all 5 platforms (darwin-arm64/x64, linux-arm64/x64, win-x64)
- Add OSS upload/mirror tools for staging and release distribution
- Update .gitignore to exclude generated build artifacts (release-staging/,
  hosted-staging/)
- Fix Windows PowerShell test command in copy-release-to-latest tool
2026-05-13 00:29:22 +08:00
yiliang114
d0bd8c6639 fix(scripts): address release verifier review feedback 2026-05-12 00:27:23 +08:00
yiliang114
d2acf7f86f fix(installer): remove stale node 20 installer references 2026-05-11 21:22:09 +08:00
yiliang114
bb8b81043f test(installer): allow Windows archive validation more time 2026-05-11 20:59:17 +08:00
yiliang114
728b35fd41 fix(installer): align npm fallback node gate with engines 2026-05-11 20:43:33 +08:00
yiliang114
a244a2e602 fix(test): escape release asset regex 2026-05-11 19:29:56 +08:00
yiliang114
f6696e8d73 feat(installer): fold hosted release checks into installer flow 2026-05-11 18:58:16 +08:00
yiliang114
7d4fc1301c test(installer): relax Windows installer timeout 2026-05-11 16:36:53 +08:00
yiliang114
1f1f5cd5f5 fix(installer): stabilize Windows managed install checks 2026-05-11 16:18:15 +08:00
yiliang114
fddbfdc53f fix(release): tighten standalone asset checks 2026-05-11 15:58:07 +08:00
yiliang114
1502f72852 fix(installer): repair Windows installer tests 2026-05-11 15:55:57 +08:00
yiliang114
1917316b12 fix(installer): address standalone review follow-ups 2026-05-11 13:50:33 +08:00
yiliang114
362bf588f8 fix(installer): tighten verifier base-url + clarify test helper
Three small refinements from the second review pass:

- normalizeHttpsBaseUrl rejects everything except https, since real release
  URLs are always HTTPS. Accepting http previously would let an operator
  silently target a stale or attacker-controlled mirror.
- Drop EXPECTED_RELEASE_ASSET_NAMES from the public exports; it was only
  used internally for the verification log line.
- Rename the test helper standaloneChecksumContent to
  placeholderChecksumContent and document that the hashes in its output are
  placeholders — the remote verifier does not download archives or compare
  hashes, it only validates that SHA256SUMS lists the expected names and
  that each archive URL is reachable.

The non-https rejection test now also covers `http://` in addition to the
existing `file://` case.
2026-05-07 21:08:48 +08:00
yiliang114
4100b8e239 feat(installer): verify installation release assets
Adds `npm run verify:installation-release` and wires it into the release
workflow after `Build Standalone Archives`, so a broken release directory
fails CI before publishing.

Local mode (`--dir PATH`) checks:
- All five `qwen-code-{platform}.{ext}` standalone archives exist.
- `SHA256SUMS` covers exactly those five — missing or unexpected entries fail.
- Each archive's actual SHA256 matches its `SHA256SUMS` entry.

Remote mode (`--base-url URL`) checks:
- `SHA256SUMS` is downloadable, parseable, and contains exactly the expected
  archive entries.
- Each archive URL is reachable via HEAD, with a 1-byte ranged GET fallback
  for hosts that disable HEAD.

Hosted installer scripts (`install-qwen.sh` / `install-qwen.bat`) are
intentionally out of scope here — they are served from the hosted endpoint
prepared by `package:hosted-installation` (PR #3853), not from the GitHub
Release surface this verifier targets.
2026-05-07 20:09:30 +08:00
yiliang114
2e4086aa4a fix(installer): tighten hosted default-version check, flag legacy URL
- Replace the loose `latest` fragment check with per-format regex patterns
  in HOSTED_INSTALLER_DEFAULT_VERSION_PATTERNS so an unrelated occurrence
  of `latest` (comment, help text) cannot satisfy the staging guard. The
  patterns still tolerate whitespace variation, only the default-version
  assignment itself must be intact.
- Add a "Hosted endpoint status" callout in INSTALLATION_GUIDE.md before
  the curl examples. The documented `--version` flow does not work against
  the OSS URL today because it currently serves the legacy NVM-based
  installer; the callout points users at a local checkout until the next
  release sync.
- Tests: drop `latest` from the fragments equality assertion, add positive
  and negative regex coverage, add a failure-path case for sources whose
  default version is not `latest`, and pin the new guide markers so the
  callout cannot silently disappear.
2026-05-07 19:03:22 +08:00
yiliang114
51778f9fb8 fix(installer): refine hosted asset staging 2026-05-07 17:47:53 +08:00
yiliang114
27a1bbee1a fix(installer): reject stale hosted assets 2026-05-07 17:15:57 +08:00
yiliang114
587dc1f2c6 feat(installer): stage hosted installation assets 2026-05-07 16:54:43 +08:00
yiliang114
f9d9a3b6be fix(installer): keep installer entrypoint hosted 2026-05-07 16:33:32 +08:00
yiliang114
44ac2297cf fix(installer): address release asset review findings 2026-05-07 15:57:54 +08:00
yiliang114
51c14f419f fix(installer): unblock Windows CI for standalone install path
Three CI failures and a few review followups in one pass.

- ensureMinimalDist places its dist/ backup beside dist/ instead of
  under os.tmpdir(). On Windows GitHub runners the workspace lives on
  D: while os.tmpdir() is on C:, so renameSync raised EXDEV for every
  test that needed to swap dist/ in.
- create-standalone-package.js and the matching test fixture build
  win-x64 zips with [IO.Compression.ZipFile]::CreateFromDirectory.
  Compress-Archive emits backslash entry names that the .bat
  installer's path-traversal guard then rejected, so every freshly
  built archive failed the standalone install path on Windows.
- :ValidateArchiveContents normalizes entry separators to '/' before
  checking for '..', absolute paths, and drive prefixes - archives
  from any Windows zip tool still install while real traversal
  entries remain rejected.
- createWindowsTraversalStandaloneArchive runs PowerShell via -File
  instead of a single -Command line; the joined-with-'; ' form had a
  function definition the runner's PowerShell refused to parse.

Drive-by review followups:

- replaceRequired uses replaceAll so a future duplicate placeholder
  cannot silently keep the trailing copy as 'latest'.
- :ValidateOptions runs the unsafe-character check on SOURCE
  alongside the other variables.
- build-installation-assets.js drops a dead INSTALLATION_ASSETS
  re-export; consumers already import from release-asset-config.js.
- .gitignore covers the new sibling .qwen-dist-backup-* directory.
2026-05-07 11:54:30 +08:00
yiliang114
3570f93af9 fix(installer): address release asset review followups
- sh: reject CR/LF in archive entry names before the literal `..` glob so
  a `..\r` entry cannot bypass path validation.
- bat: prefer Tls12+Tls13 in PowerShell helpers, fall back to Tls12 alone
  on older .NET Framework where the Tls13 enum is missing.
- bat: document the implicit `:ValidateOptions` dependency next to the
  qwen.cmd wrapper writer so loosening the validator stays a conscious
  choice.
- build-standalone-release: surface the `xz-utils` host requirement for
  Linux Node downloads in `--help`.
- release-script-utils: support `--key=value` form in `parseCliArgs`.
- tests: cover the new CRLF message, TLS string, and `--key=value` parsing;
  register process-level signal/exit handlers in `ensureMinimalDist` so a
  crashed test still restores `dist/`.
2026-05-06 21:19:19 +08:00
yiliang114
bca4a7f0ea refactor(installer): share release CLI parsing 2026-05-05 23:12:20 +08:00
yiliang114
6c80ef8330 fix(installer): address release asset review followups 2026-05-05 23:08:09 +08:00
yiliang114
6534e6f971 fix(installer): pin versioned installer assets 2026-05-05 22:13:28 +08:00
yiliang114
a205e6ccdc feat(installer): add hosted install release alias 2026-05-05 20:15:01 +08:00
yiliang114
668c006941 test(installer): isolate standalone dist fixture 2026-05-05 19:49:42 +08:00
yiliang114
ccf83e9da7 fix(installer): address release asset review feedback 2026-05-05 18:39:04 +08:00
yiliang114
ec654dd87c feat(installer): publish release installer assets 2026-05-04 21:34:33 +08:00
yiliang114
fee51d1d91 fix(installer): harden standalone review fixes 2026-05-04 17:38:07 +08:00
yiliang114
e7e3f9077d fix(installer): simplify Windows option validation 2026-05-04 16:56:02 +08:00
yiliang114
1ca86fe8e7 fix(installer): address standalone review hardening 2026-05-04 16:03:34 +08:00
yiliang114
faa9087f2d fix(installer): use robust Windows checksum hashing 2026-05-03 01:14:19 +08:00
yiliang114
69e22f9418 test(installer): preserve Windows cmd quotes 2026-05-03 00:50:18 +08:00
yiliang114
fee13e4ddf test(installer): fix Windows batch smoke quoting 2026-05-03 00:27:50 +08:00
yiliang114
a4a15e1ded test(installer): add Windows batch install smoke 2026-05-02 23:56:09 +08:00
yiliang114
2b40bad5df chore(installer): simplify standalone release review fixes 2026-05-02 23:27:25 +08:00
yiliang114
472e51eb19 fix(installer): stabilize standalone script checks 2026-05-02 22:52:44 +08:00
yiliang114
571959532b chore(installer): clarify review followups 2026-05-02 21:11:50 +08:00
yiliang114
d7277a6976 fix(installer): address standalone review findings 2026-05-02 21:07:14 +08:00
yiliang114
d2e5b1bd07 fix(installer): harden standalone archive installs 2026-05-02 20:20:56 +08:00
yiliang114
eb2a9a8bef feat(installer): add standalone archive installation 2026-04-30 22:04:01 +08:00