Commit graph

116 commits

Author SHA1 Message Date
yiliang114
994f2f4937 fix(installer): normalize Aliyun latest pointer from file 2026-05-18 15:17:16 +08:00
yiliang114
f832d3330b fix(installer): avoid captured PowerShell output in batch latest parsing 2026-05-18 14:40:48 +08:00
yiliang114
b69af67156 fix(installer): normalize Aliyun latest version via PowerShell 2026-05-18 14:18:07 +08:00
易良
62ab5f47de fix(installer): validate Aliyun latest version without findstr 2026-05-18 13:06:47 +08:00
易良
584bb59ab5 fix(installer): parse Aliyun latest version in batch 2026-05-18 11:59:51 +08:00
yiliang114
0a5d308c9c fix(installer): address review feedback round 3
Workflow:
- Configure Aliyun OSS Credentials: write the ossutil config file directly
  with restricted umask instead of invoking `ossutil config -k <secret>`.
  Passing the access-key secret via argv made it visible in /proc/<pid>/cmdline
  for the lifetime of that step; writing the INI file in-process keeps the
  secret out of the process table.

upload-aliyun-oss-assets.js:
- Upload assets in parallel with `Promise.all` + async `spawn` instead of a
  sequential `spawnSync` loop. Each asset keeps its own retry budget; failures
  are aggregated so one flaky upload does not mask a separate failure.
- Replace the bespoke `Atomics.wait` retry sleep with `timers/promises#setTimeout`
  now that the loop is async.

INSTALLATION_GUIDE.md:
- Drop the misleading "instead of overwriting the global installation/
  entrypoint objects" sentence; the workflow has always also refreshed the
  global versionless objects so curl|bash links keep resolving without a
  version segment. Document the rollback story instead.
2026-05-17 23:41:48 +08:00
yiliang114
a1ef8697b7 fix(installer): address review feedback round 2
Workflow:
- Move 'Publish Aliyun OSS Latest VERSION' to run after the hosted installer
  assets are uploaded and verified, so the latest/VERSION pointer only flips
  once every release artifact is in place. Previously a hosted-sync failure
  could leave the pointer ahead of the actual installer scripts.

upload-aliyun-oss-assets.js:
- Replace `spawnSync('sleep', ...)` retry backoff with an Atomics.wait-based
  cross-platform sleep so retries also work on Windows runners.

install-qwen-standalone.bat:
- :DetectTarget no longer emits TARGET=win-arm64 because RELEASE_TARGETS has
  no win-arm64 archive; ARM64 hosts now fall through to the unsupported-arch
  branch and (in detect mode) get the npm fallback instead of a 404.
- Add QWEN_INSTALL_CURL_EXE to :ValidateRawEnvironmentOptions so this curl
  override is checked for shell metacharacters like every other knob.
- Replace `call echo %%i>>...` with plain `echo %%i>>...` when capturing
  pre-install qwen.cmd paths; `call` triggered an extra parse pass that
  could interpret &/|/<,>/etc. inside a directory name as command separators.
- Add `--retry 2` to curl.exe downloads (`:DownloadFile` / `:DownloadFileQuiet`)
  to match the shell installer.
- Include expected vs actual hash in the checksum-mismatch error message.

install-qwen-standalone.ps1:
- Stage the downloaded installer at a cryptographically random temp path
  (`qwen-installer-<random>.bat`) so a same-user attacker cannot pre-stage a
  malicious .bat at a predictable path and race the verify/execute window.
- Atomically install the current-session cmd shim by writing to a sibling
  `.new` temp file then renaming, so a partial write cannot leave a
  half-written shim on PATH.
- Add `--retry 2` to the curl.exe download path.
- Include expected vs actual hash in the checksum-mismatch error message.

install-qwen-standalone.sh:
- Include expected vs actual hash in the checksum-mismatch error message.

uninstall-qwen-standalone.ps1:
- Accept `-Purge` and `-Help` parameters; previously every CLI flag was
  silently dropped, so users running with `-Purge` got no purge and no error.
  `-Purge` maps to `QWEN_UNINSTALL_PURGE=1`.

uninstall-qwen-standalone.sh:
- `remove_install_wrapper` additionally requires the wrapper file to start
  with a `#!` shebang before it deletes it; a user-authored script that just
  happens to mention the install path now stays untouched.

verify-installation-release.js, build-hosted-installation-assets.js:
- Include expected vs actual hash in the checksum-mismatch error messages.

scripts/tests/install-script.test.js:
- Update assertions for the new error wording, the curl `--retry 2` flag,
  the dropped ARM64 detection, and the new release-step ordering.
2026-05-17 23:34:25 +08:00
yiliang114
273a01252f fix(release): correct OSS credentials lifetime and mirror probe fallback
- release.yml: remove `trap EXIT` inside the Configure step; it deleted
  ${RUNNER_TEMP}/.ossutilconfig as soon as the configure shell exited,
  so every subsequent step (publish/sync/verify) lost the credentials.
  Move credential cleanup to a final `if: always()` step at the job tail.
- install-qwen-standalone.sh: drop the predictable PID-based mktemp -d
  fallback in race_mirror_head; if mktemp fails, return "github" instead
  of using /tmp/qwen-mirror.$$ which a local attacker could pre-create
  to bias mirror selection.
2026-05-17 23:18:13 +08:00
yiliang114
3f60c2c0e8 fix(installer): address remaining review feedback on PR #3828
- Remove REQUIRE_CHECKSUM dead code, always hard-fail on checksum issues
- Add JSDoc to HOSTED_INSTALLER_BEHAVIOR_PATTERNS explaining its purpose
- Add credential cleanup trap for ossutilconfig in release workflow
- Add 3-attempt retry with exponential backoff for OSS uploads
- Tighten findstr SOURCE regex to require leading letter
2026-05-17 19:16:42 +08:00
yiliang114
3eb6d6c7c3 fix(installer): address hosted release review feedback 2026-05-17 13:44:34 +08:00
yiliang114
0155a4fd88 fix(installer): bound hosted installer probes 2026-05-16 16:59:30 +08:00
yiliang114
63ec525f88 fix(installer): bound Windows download timeouts 2026-05-16 16:00:42 +08:00
yiliang114
0994a809aa fix(installer): harden Windows latest pointer parsing 2026-05-16 15:52:33 +08:00
yiliang114
b3e21a56ae fix(installer): harden hosted release publishing 2026-05-16 00:33:09 +08:00
yiliang114
308fe4da93 fix(installer): allow explicit Windows curl path 2026-05-15 22:45:58 +08:00
yiliang114
c959913dfc fix(installer): harden Windows target detection 2026-05-15 21:49:41 +08:00
yiliang114
7d665f39df fix(installer): address release review follow-ups 2026-05-15 21:00:13 +08:00
yiliang114
7fd314a358 fix(installer): print standalone uninstall commands 2026-05-15 18:26:49 +08:00
yiliang114
a79745b4d8 style(installer): align standalone install output 2026-05-15 17:13:11 +08:00
yiliang114
bae933332e fix(installer): address standalone review feedback 2026-05-15 15:14:34 +08:00
yiliang114
40ac124927 fix(installer): harden standalone release fallback 2026-05-15 01:54:27 +08:00
yiliang114
db8677f01b fix(installer): cleanup mirror probe temp dirs 2026-05-14 23:09:15 +08:00
yiliang114
8fb2bc1254 fix(installer): resolve Aliyun latest via version pointer 2026-05-14 22:49:07 +08:00
yiliang114
db0a44d620 fix(installer): update download commands to use progress indicators for curl and wget 2026-05-14 20:22:27 +08:00
yiliang114
d2ebed9ac1 fix(uninstall): match shell-quoted paths when removing the wrapper
The installer's write_unix_wrapper shell-quotes the binary path, so
paths containing single quotes (or other shell metacharacters) appear
as shell-quoted strings in the generated wrapper file. The uninstall
script's literal grep -qF missed these, leaving the wrapper orphaned.

Add shell_quote to the uninstall script and match against both the raw
and shell-quoted forms before removing the wrapper.
2026-05-14 17:44:17 +08:00
yiliang114
75e5b58806 feat(installer): add standalone uninstall scripts 2026-05-14 17:31:44 +08:00
yiliang114
74130fc79e fix(installer): make Windows standalone shim available in cmd 2026-05-14 17:00:03 +08:00
yiliang114
564f899359 fix(installer): remove non-functional doskey approach for cmd parent
doskey /exename from a child PowerShell process cannot modify the
parent cmd.exe session. Replace with a simple set PATH=... command
that the user can copy-paste.
2026-05-14 16:48:41 +08:00
yiliang114
38c4706d76 feat(installer): make qwen usable immediately from PowerShell after install
- .ps1: detect parent process, update current session PATH, and for
  cmd.exe parents emit a `set PATH=...` command
- .bat: skip final instructions when called from PowerShell to avoid
  duplicate "Run: qwen" output
2026-05-14 16:44:41 +08:00
yiliang114
bdf101b0ee docs(installer): document cmd.exe one-liner for immediate PATH availability
Add curl-based one-liner for cmd.exe users. Running the .bat directly
in the current cmd session makes `qwen` available immediately via the
`endlocal & set` trick. The `powershell -c "irm | iex"` path creates
a child process so PATH changes cannot propagate to the parent.
2026-05-14 16:29:51 +08:00
yiliang114
c3b488f9d7 fix(installer): persist PATH to current terminal session on Windows
Use the `endlocal & set` trick (same as bun/Rust installers) to export
the install bin directory from the setlocal scope to the current cmd
session. qwen is now usable immediately without restarting the terminal.
2026-05-14 16:14:34 +08:00
yiliang114
b7f190a75f fix(installer): always persist install bin to user PATH
Previously MaybeUpdateUserPath was only called when shadow qwen
executables were detected. When no shadow was found, the PATH update
was skipped entirely, leaving the user without qwen on PATH after
restarting their terminal.

Now always persist the bin directory to PATH (unless --no-modify-path
is set), regardless of whether other qwen installations exist.
2026-05-14 16:08:07 +08:00
yiliang114
31e3c4350a fix(installer): fix cmd.exe parsing error in backup fallback code
The %s in the for /f fallback command string was interpreted as a variable
reference by cmd.exe, causing "此时不应有 >" on Chinese Windows. Replace
with a safe fallback and re-enable Expand-Archive progress suppression.
2026-05-14 16:02:07 +08:00
yiliang114
24cb1c7a12 fix(installer): revert Expand-Archive progress suppression in bat
The inline $ProgressPreference = 'SilentlyContinue' caused a cmd.exe
parsing error ("此时不应有 >") on Chinese Windows. Revert to the
original Expand-Archive invocation.
2026-05-14 15:50:33 +08:00
yiliang114
ccbdd34f39 fix(installer): auto-backup non-qwen directories and simplify output
- ensure_managed_install_dir / :EnsureManagedInstallDir now back up
  non-qwen directories instead of refusing to install, so users
  upgrading from npm or old installers don't hit a hard error
- Simplify header/footer output: remove banner bars, verbose INFO
  lines, and redundant "Installation completed!" message
- Match bun.sh / code-server style: minimal, to the point
2026-05-14 15:23:18 +08:00
yiliang114
046d200293 fix(installer): suppress progress bars for small downloads and Expand-Archive
- .ps1: replace curl.exe -# with silent mode, suppress Invoke-WebRequest
  progress bar; save/restore $global:ProgressPreference
- .bat: add $ProgressPreference = 'SilentlyContinue' before Expand-Archive
  to prevent full-screen extraction progress UI
- .sh: remove --progress-bar / --show-progress from download_file, always
  use silent curl/wget
2026-05-14 15:09:45 +08:00
yiliang114
01e9767421 fix(installer): use curl.exe -# progress bar in Windows downloads
Prefer curl.exe with -# (hash-mark progress bar) for archive and installer
downloads on Windows 10+. Falls back to Invoke-WebRequest (which shows its
own progress bar) when curl.exe is unavailable. Matches the approach used
by code-server (curl -#fL) and bun.sh (curl.exe -#SfLo).
2026-05-14 13:47:04 +08:00
yiliang114
4b950aba7c fix(installer): suppress PowerShell progress bar in bat installer downloads
Add $ProgressPreference = 'SilentlyContinue' to DownloadFile so the
full-screen progress UI does not appear during archive downloads in
interactive PowerShell sessions, consistent with the .ps1 shim.
2026-05-14 13:34:08 +08:00
yiliang114
4095171f64 fix(installer): suppress PowerShell progress bar in hosted entrypoint shim
Add $ProgressPreference = 'SilentlyContinue' to the .ps1 wrapper so
Invoke-WebRequest downloads don't render a progress bar when invoked
via the irm | iex one-liner.
2026-05-14 13:29:01 +08:00
yiliang114
c6005a74bb feat(installer): refactor argument parsing and utility functions for release scripts 2026-05-14 01:11:19 +08:00
yiliang114
0c8022d491 fix(installer): address hosted installer review gaps 2026-05-13 23:54:05 +08:00
yiliang114
645edb8ec2 chore(installer): remove temporary OSS smoke workflow 2026-05-13 23:35:44 +08:00
yiliang114
7d328be114 feat(installer): wire Aliyun OSS sync, address review followups
- Add Aliyun OSS sync steps to release workflow: package hosted assets,
  install pinned ossutil, configure credentials, upload versioned and
  latest paths, and verify upload via verify:installation-release plus
  curl probes against the hosted installer endpoint.
- Document required production-release environment secrets and bucket
  variables in INSTALLATION_GUIDE.md.
- Restructure hosted endpoint guidance to lead with the pre-sync
  warning, splitting "Run today" (local checkout) from "After the OSS
  sync" (hosted one-liners) so users no longer copy a one-liner that
  silently installs latest.
- Distinguish mirror auto-selection timeout from successful selection
  in install-qwen-standalone.sh and install-qwen-standalone.bat: emit
  a "timed out; defaulting to github" log instead of pretending the
  HEAD probe picked github.
- Support QWEN_INSTALLER_BAT_URL override (https only) in the
  PowerShell shim so staging mirrors can be exercised without forking
  the file.
- Strip a leading UTF-8 BOM in verify-installation-release.js
  parseSha256Sums so BOM-prefixed SHA256SUMS reports a useful
  "Missing checksum entry" error instead of "Malformed SHA256SUMS
  line 1".
- Add tests for verifier HEAD→Range fallback, partial-failure
  formatting, all-failure wording, and BOM tolerance.
2026-05-13 21:22:39 +08:00
yiliang114
72a5efe744 fix(installer): make Windows option validation readable 2026-05-13 20:43:30 +08:00
yiliang114
90935774a2 fix(installer): stabilize Windows installer tests 2026-05-13 19:58:07 +08:00
yiliang114
984b1a9a0e fix(installer): address hosted installer review followups 2026-05-13 19:29:49 +08:00
yiliang114
5f649c9523 chore(installer): stage standalone hosted entrypoints 2026-05-13 19:09:20 +08:00
yiliang114
af64da874f feat(installer): restore hosted PowerShell entrypoint 2026-05-13 18:53:45 +08:00
yiliang114
b8e54900f2 chore(installer): trim hosted release diff scope 2026-05-13 16:58:20 +08:00
yiliang114
eeabd1b8dd fix(installer): stage direct hosted install scripts 2026-05-13 16:47:33 +08:00