Skip to content

Commit 10e27d5

Browse files
committed
feat(installer): add hosted install release alias
1 parent 668c006 commit 10e27d5

4 files changed

Lines changed: 25 additions & 1 deletion

File tree

.github/workflows/release.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,7 @@ jobs:
422422
gh release create "${RELEASE_TAG}" \
423423
dist/cli.js \
424424
dist/standalone/qwen-code-* \
425+
dist/standalone/install \
425426
dist/standalone/install-qwen.sh \
426427
dist/standalone/install-qwen.bat \
427428
dist/standalone/SHA256SUMS \

scripts/installation/INSTALLATION_GUIDE.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,21 @@ GitHub releases publish these standalone archives:
3434
- `qwen-code-linux-arm64.tar.gz`
3535
- `qwen-code-linux-x64.tar.gz`
3636
- `qwen-code-win-x64.zip`
37+
- `install`
3738
- `install-qwen.sh`
3839
- `install-qwen.bat`
3940
- `SHA256SUMS`
4041

4142
The installer scripts are published as release assets so version-specific
4243
install entrypoints can be distributed alongside the standalone archives after
43-
that release is created:
44+
that release is created. The extensionless `install` asset is the Unix installer
45+
alias for future hosted endpoints such as `https://qwen-code.ai/install`.
46+
That hosted endpoint is not available yet; until it is live, use a concrete
47+
release version in the direct GitHub release URL:
48+
49+
```bash
50+
curl -fsSL https://github.com/QwenLM/qwen-code/releases/download/vX.Y.Z/install | bash
51+
```
4452

4553
```bash
4654
curl -fsSL https://github.com/QwenLM/qwen-code/releases/download/vX.Y.Z/install-qwen.sh | bash

scripts/release-asset-config.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ const INSTALLATION_ASSETS = [
1313
output: 'install-qwen.sh',
1414
mode: 0o755,
1515
},
16+
{
17+
sourcePath: ['scripts', 'installation', 'install-qwen-with-source.sh'],
18+
output: 'install',
19+
mode: 0o755,
20+
},
1621
{
1722
sourcePath: ['scripts', 'installation', 'install-qwen-with-source.bat'],
1823
output: 'install-qwen.bat',

scripts/tests/install-script.test.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@ describe('standalone release packaging', () => {
274274
expect(releaseAssetConfig).toContain('Copyright 2025 Qwen Team');
275275
expect(releaseAssetConfig).toContain('INSTALLATION_ASSETS');
276276
expect(releaseAssetConfig).toContain('install-qwen-with-source.sh');
277+
expect(releaseAssetConfig).toContain("output: 'install'");
277278
expect(releaseAssetConfig).toContain('install-qwen.sh');
278279
expect(releaseAssetConfig).toContain('install-qwen-with-source.bat');
279280
expect(releaseAssetConfig).toContain('install-qwen.bat');
@@ -324,12 +325,15 @@ describe('standalone release packaging', () => {
324325

325326
expect(INSTALLATION_ASSET_NAMES).toEqual([
326327
'install-qwen.sh',
328+
'install',
327329
'install-qwen.bat',
328330
]);
329331
expect(isStandaloneArchiveName('qwen-code-linux-x64.tar.gz')).toBe(true);
330332
expect(isStandaloneArchiveName('qwen-code-win-x64.zip')).toBe(true);
331333
expect(isStandaloneArchiveName('install-qwen.sh')).toBe(false);
334+
expect(isInstallationAssetName('install')).toBe(true);
332335
expect(isInstallationAssetName('install-qwen.sh')).toBe(true);
336+
expect(isReleaseChecksumAsset('install')).toBe(true);
333337
expect(isReleaseChecksumAsset('install-qwen.bat')).toBe(true);
334338
});
335339

@@ -393,20 +397,24 @@ describe('standalone release packaging', () => {
393397
await buildInstallationAssets(tmpDir);
394398

395399
const installSh = path.join(tmpDir, 'install-qwen.sh');
400+
const install = path.join(tmpDir, 'install');
396401
const installBat = path.join(tmpDir, 'install-qwen.bat');
397402
const checksums = readScript(path.join(tmpDir, 'SHA256SUMS'));
398403

399404
expect(readScript(installSh)).toBe(
400405
readScript('scripts/installation/install-qwen-with-source.sh'),
401406
);
407+
expect(readScript(install)).toBe(readScript(installSh));
402408
expect(readScript(installBat)).toBe(
403409
readScript('scripts/installation/install-qwen-with-source.bat'),
404410
);
405411
expect(checksums).toContain('qwen-code-linux-x64.tar.gz');
412+
expect(checksums).toMatch(/\sinstall\n/);
406413
expect(checksums).toContain('install-qwen.sh');
407414
expect(checksums).toContain('install-qwen.bat');
408415
if (process.platform !== 'win32') {
409416
expect(lstatSync(installSh).mode & 0o111).not.toBe(0);
417+
expect(lstatSync(install).mode & 0o111).not.toBe(0);
410418
}
411419

412420
writeFileSync(installSh, 'tampered');
@@ -637,6 +645,7 @@ describe('standalone release packaging', () => {
637645
expect(workflow).not.toContain('verify_node_checksum()');
638646
expect(workflow).not.toContain('download_node()');
639647
expect(workflow).toContain('dist/standalone/qwen-code-*');
648+
expect(workflow).toContain('dist/standalone/install \\');
640649
expect(workflow).toContain('dist/standalone/install-qwen.sh');
641650
expect(workflow).toContain('dist/standalone/install-qwen.bat');
642651
expect(workflow).toContain('dist/standalone/SHA256SUMS');
@@ -653,6 +662,7 @@ describe('standalone release packaging', () => {
653662
const guide = readScript('scripts/installation/INSTALLATION_GUIDE.md');
654663

655664
expect(guide).toContain('Optional Native Modules');
665+
expect(guide).toContain('https://qwen-code.ai/install');
656666
expect(guide).toContain('node-pty');
657667
expect(guide).toContain('clipboard');
658668
});

0 commit comments

Comments
 (0)