- 开发工具
- IDE
- 代码编辑器
- 后端
【免费下载链接】openvscode-server
Run upstream VS Code on a remote machine with access through a modern web browser from any device, anywhere.
导读
本文基于 test/sanity/README.md 与其配套源码,系统讲解 openvscode-server 上游项目如何对已发布的 VS Code 构建产物(Desktop、CLI、Server、Web、WSL 五大形态)进行自动化端到端健全性验证。读完你将掌握健全性测试的完整命令行参数体系、如何在本机或 Docker 容器中按平台运行测试、如何读懂 CI 流水线的测试矩阵,并能从源码层面理解“下载→校验签名→安装→运行→UI 交互验证”这条核心验证链路。
一、什么是发布健全性测试(Sanity Check Tests)
健全性测试(Sanity Test)是发布流水线中位于“构建完成”与“触达终端用户”之间的最后一道自动化质检关卡。它的定位不是覆盖所有功能细节,而是验证关键路径(critical functionality)是否可用:
- 发布产物是否能在不同操作系统与安装方式下正常下载、解压、安装与启动;
- CLI、Server、Web 等入口能否正常响应版本请求;
- 桌面端与 Web 端能否在真实浏览器中完成“建文件→保存→装扩展”的基本工作流;
- 签名(Authenticode / codesign)与公证(notarization)是否有效。
该测试体系位于仓库 test/sanity 目录,由一份 package.json 独立管理依赖(minimist、mocha、mocha-junit-reporter、node-fetch、playwright),并通过 tsconfig.json 编译为 JavaScript 后由 Node.js 执行。
二、测试覆盖范围:五类测试形态
从 main.ts 的入口注册可以看到,健全性测试由五个测试套件组成:
| 测试套件 | 源码文件 | 验证对象 |
|---|---|---|
| CLI 测试 | cli.test.ts | 各平台code/code-insiders命令行入口,含 Dev Tunnel 设备流认证与 Web 端连接 |
| Desktop 测试 | desktop.test.ts | 桌面安装包(DMG、DEB、RPM、Snap、Windows 安装器/归档)安装后通过 Electron 启动并做 UI 验证 |
| Server 测试 | server.test.ts | Server 入口启动后,通过/versionHTTP 端点校验返回的 commit 是否与预期一致 |
| Server Web 测试 | serverWeb.test.ts | 浏览器(Playwright)访问 Web 版 Server,等待.monaco-workbench加载并做 UI 验证 |
| WSL 测试 | wsl.test.ts | 在 Windows 上通过wsl命令驱动 Linux Server / 桌面端 / Web 端的跨系统验证 |
每个测试用例都声明了运行所需的能力集合(Capability),例如desktop-linux-deb-x64要求['linux', 'x64', 'deb', 'desktop']四个能力同时具备才会执行(详见 desktop.test.ts)。
2.1 能力检测机制
测试是否运行,取决于 detectors.ts 中detectCapabilities()的检测结果。它通过运行时环境推断出当前机器的能力:
- 操作系统:读取
os.platform(),若存在/etc/alpine-release则标记为alpine; - 架构:读取
os.arch(),Windows 上会优先使用PROCESSOR_ARCHITEW6432/PROCESSOR_ARCHITECTURE环境变量; - 包管理器:检查
/usr/bin/dpkg(deb)、/usr/bin/dnf或/usr/bin/yum(rpm)、/run/snapd.socket(snap); - 桌面环境:非 Linux 平台或存在
DISPLAY环境变量时标记为desktop; - 浏览器:通过
PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH或系统默认路径探测 Chromium / Edge / WebKit; - WSL:Windows 上检查
wsl.exe是否存在; - GitHub 账号:存在
GITHUB_ACCOUNT与GITHUB_PASSWORD环境变量时标记,用于 CLI 的隧道认证测试。
关键结论:多数测试依赖底层平台完成真实的安装与运行验证,因此必须在对应的目标操作系统或虚拟机上运行,否则测试会因能力不匹配而被自动跳过(这正是 README 中“会失败”的底层原因——不是报错,而是不会执行)。
三、命令行参数详解
测试入口通过 index.ts 中的 minimist 解析参数,main.ts 负责二次解析并把布尔选项的默认值统一为“带前缀为真”(cleanup: true、verbose: false、signing-check: true、headless: true、detection: true)。
完整参数表(与 README 一致,并补充默认值说明):
| 选项 | 别名 | 说明 | 默认值 |
|---|---|---|---|
--commit <commit> | -c | 待测试的构建 commit(必填) | 无 |
--quality <quality> | -q | 待测试的质量通道:stable、insider或exploration(必填) | 无 |
--no-cleanup | 每个测试结束后不清理下载文件 | 默认清理 | |
--no-signing-check | 跳过 Authenticode 与 codesign 签名校验 | 默认校验签名 | |
--no-headless | 以可见 UI 运行测试(仅桌面端测试生效) | 默认 headless | |
--no-detection | 忽略平台能力检测,运行所有测试并跳过可执行文件运行 | 默认启用检测 | |
--grep <pattern> | -g | 仅运行匹配 Mocha grep 正则的测试 | 全部运行 |
--fgrep <string> | -f | 仅运行包含指定字符串的测试(Mocha fgrep) | 全部运行 |
--test-results <path> | -t | 以 JUnit 格式输出测试结果到指定路径 | 不输出 |
--timeout <sec> | 单个测试用例超时秒数 | 600 秒 | |
--verbose | -v | 开启详细日志 | 关闭 |
--help | -h | 显示帮助信息 |
其中两个选项需要重点理解:
--no-detection:从 main.ts 可见,它会把downloadOnly置为true,即所有测试只下载产物并做解压/签名校验,不执行安装与运行。CI 中 macOS x64 这一“部分支持”平台正是用它配合--grep "darwin-x64"实现只验证下载(见 product-sanity-tests.yml)。--grep/--fgrep:用于把测试集过滤到与宿主平台匹配的用例。例如在 Windows 上只跑 win32 相关的用例,避免其他平台的用例因能力不匹配空跑。
四、快速上手:运行一个健全性测试
4.1 准备环境
- Node.js 22.x 运行时(容器与 CI 均按该版本安装,见 ubuntu.dockerfile);
- Playwright 浏览器(各平台脚本负责安装,详见下一节);
- Linux 桌面测试需要 X11 虚拟显示(Xvfb)、D-Bus 以及架构相关的 VS Code 运行库。
4.2 安装依赖并编译
cd test/sanity npm ci # 安装依赖(与 CI 中 npm ci 一致) npm run compile # TypeScript 编译,产物为 out/index.js4.3 运行示例(README 原始示例)
在仓库根目录,对指定 commit 的 Insiders 构建运行所有 CLI 相关测试:
npm run sanity-test -- --commit 19228f26df517fecbfda96c20956f7c521e072be --quality insider -g "cli*"说明:-g "cli*"将 Mocha 用例过滤到以cli开头的测试;--commit与--quality为必填项,缺少任一都会在 main.ts 抛出--commit is required/--quality is required错误。若直接运行测试器,也可使用 test/sanity/package.json 中定义的npm start等价入口。
运行期间会打印当前平台、架构与检测到的能力集合(见 main.ts),便于确认测试是否会在当前环境真正执行:
Arguments: ... Platform: linux, Architecture: x64 Capabilities: linux, x64, deb, rpm, desktop, browser五、平台脚本:按宿主环境一键运行
README 中提到的平台脚本均位于 test/sanity/scripts 目录,职责是“搭好环境,再调用测试器”:
| 脚本 | 平台 | 环境准备动作 |
|---|---|---|
run-win32.cmd | Windows | 以 Edge 作为 Playwright 浏览器运行测试 |
run-macOS.sh | macOS | 安装 Playwright WebKit(npx playwright install --with-deps webkit)后运行 |
run-ubuntu.sh | Ubuntu | 配置 Azure 软件源,安装dbus-x11、x11-utils、xvfb,通过 Snap 安装 Chromium,启动 Xvfb(:99)与 Snap daemon 后运行 |
run-docker.sh | Linux(Docker) | 构建/加载容器镜像并在容器内运行(见下一节) |
run-docker.cmd | Windows(Docker) | Docker 化 Linux 测试的 Windows 包装脚本 |
以 run-ubuntu.sh 为例,其核心环境编排为:
export DISPLAY=:99 Xvfb $DISPLAY -screen 0 1024x768x24 -ac -noreset & sudo systemctl start snapd.socket sudo systemctl start snapd.service这正是 Snap 安装测试(desktop-linux-snap-x64)在 Ubuntu 原生宿主上能够运行的前提。同样,macOS 脚本安装 WebKit 是因为 context.ts 在 darwin 平台默认使用webkit.launch()。
六、Docker 容器:跨 Linux 发行版矩阵测试
6.1 容器定义
test/sanity/containers 目录为各 Linux 发行版提供了 Dockerfile,用于验证不同包管理与基础库环境下的安装与运行:
| 容器 | 基础镜像 | 覆盖场景 |
|---|---|---|
alpine | Alpine 3.x | musl libc 环境(对应alpine能力) |
centos | CentOS Stream 9 | RHEL 兼容发行版(rpm) |
debian-10 | Debian 10 (Buster) | 旧版 Debian,验证旧版库兼容性 |
debian-12 | Debian 12 (Bookworm) | 当前 Debian 稳定版 |
fedora | Fedora 36/40 | 较新的 RPM 发行版 |
opensuse | openSUSE Leap 16.0 | SUSE 系企业发行版 |
redhat | Red Hat UBI 9 | Red Hat Universal Base Image |
ubuntu | Ubuntu 22.04/24.04 | 主流 Debian 系发行版(deb + snap 相关) |
每个容器统一预置:
- Node.js 22.x 运行时;
- Xvfb 虚拟 X11 服务器(headless 桌面测试);
- D-Bus(桌面集成所需);
- 架构相关的 VS Code 运行库(如 ubuntu.dockerfile 安装的
libasound2、libgtk-3-0、libnss3、libgbm1、xdg-utils等,并兼容 Ubuntu 24.04 的t64过渡包名); - 部分容器额外包含 Web 浏览器,用于验证 Web Server 目标。
容器内的统一入口是 entrypoint.sh,它在启动 Xvfb 与dbus-daemon后直接调用node /root/out/index.js。
6.2 run-docker.sh 选项
run-docker.sh 支持的选项:
| 选项 | 说明 |
|---|---|
--container <name> | 容器 Dockerfile 名称(必填,如ubuntu、alpine) |
--arch <arch> | 目标架构:amd64、arm64或arm(默认amd64) |
--base-image <image> | 覆盖基础镜像(如ubuntu:24.04) |
--page-size <size> | 指定64k时走 QEMU 系统级仿真(针对 64K 页大小内核场景) |
其余参数会原样透传给健全性测试运行器(即上一节的-c/-q/-g等)。从脚本实现可见其工作流程:
- 若镜像不存在(且未被 CI 缓存命中),用
docker buildx build --platform linux/$ARCH构建; - 指定
64k页大小时,调用 run-qemu-64k.sh 进入 QEMU 仿真; - 否则
docker run挂载测试目录并执行容器入口。
6.3 容器运行示例(README 原始示例)
# Ubuntu 24.04 on amd64 ./scripts/run-docker.sh --container ubuntu --base-image ubuntu:24.04 -c <commit> -q insider # Alpine on arm64 ./scripts/run-docker.sh --container alpine --arch arm64 -c <commit> -q stable七、CI/CD 流水线:发布前自动化矩阵
健全性测试在 Azure Pipelines 中通过 product-sanity-tests.yml 执行,并复用 common/sanity-tests.yml 作为作业模板。
7.1 流水线参数
| 参数 | 说明 |
|---|---|
buildQuality | 待测试构建的质量通道:exploration、insider或stable(默认insider) |
buildCommit | 已发布构建的 commit SHA |
npmRegistry | 自定义 NPM Registry URL(可选,用于依赖安装) |
流水线通过resources.pipelines监听上游 VS Code 发布流水线的Publish阶段,即每次发布完成后自动触发;BUILD_COMMIT未显式传入时取上游sourceCommit(见 product-sanity-tests.yml)。
7.2 测试矩阵
原生宿主(Native Hosts)——完整安装与运行验证:
- macOS arm64
- Windows x64
- Windows arm64
- Ubuntu 22.04 x64(原生,覆盖 Snap 安装路径)
部分支持(Partial Support)——仅验证下载(--no-detection+ grep 过滤):
- macOS x64(macOS 上 Intel 构建仅做下载与签名校验,不安装运行)
Linux 容器(amd64 与 arm64,Debian 系另有 arm32):
- Alpine 3.22/3.23、CentOS Stream 9、Debian 10、Debian 12、Fedora 36、Fedora 40、openSUSE Leap 16.0、Red Hat UBI 9、Ubuntu 22.04、Ubuntu 24.04
从 product-sanity-tests.yml 还可以看到矩阵中的一个特殊作业:Ubuntu 24.04 arm64 以--page-size 64k参数配合--grep "desktop-linux-arm64"运行,用于验证64K 页大小内核下桌面端的行为。
7.3 作业模板的通用步骤
common/sanity-tests.yml 展示了每个矩阵作业的统一流程,这也是理解整个测试体系的最佳范本:
- 稀疏检出:仅拉取
test/sanity与.nvmrc; - 安装 Node.js:版本来自
.nvmrc; - 配置并认证 NPM Registry,然后
npm ci、npm run compile; - 按平台选择运行脚本:Windows →
run-win32.cmd,macOS →run-macOS.sh,Linux 原生 →run-ubuntu.sh,容器 →run-docker.sh(并配合 Docker 缓存:命中则docker load,未命中则构建后docker save回缓存); - 发布 JUnit 结果:无论成败(
succeededOrFailed())都将results.xml发布为流水线测试报告。
每个作业的timeoutInMinutes: 30,测试器默认用例超时 600 秒,两个超时阈值共同兜底长任务。
八、源码级原理:一条完整的验证链路
以 context.ts 为核心的TestContext提供了所有底层能力,理解它就能理解整个测试体系的运作方式。
8.1 下载与元数据校验
- 获取发布元数据:
fetchMetadata(target)请求https://update.code.visualstudio.com/api/versions/commit:<commit>/<target>/<quality>,校验响应必须包含url与sha256hash字段(见 context.ts); - 下载并校验哈希:
downloadTarget()将产物流式写入临时目录,随后用crypto.createHash('sha256')比对期望哈希,不一致立即判定失败(context.ts); - 解压:
unpackArchive()以tar -xzf解压 zip/tar.gz 归档到独立临时目录。
整个过程带有指数退避重试(fetchNoErrors最多重试 5 次,间隔依次为 1s/2s/4s/8s/16s),以对抗网络抖动。
8.2 签名与公证校验
签名校验默认开启,可用--no-signing-check关闭:
- Windows(Authenticode):
validateAllAuthenticodeSignatures()递归扫描目录,对匹配.(exe|dll|sys|cab|cat|msi|jar|ocx|ps1|psm1|psd1|ps1xml|pssc1)的文件调用 PowerShellGet-AuthenticodeSignature,要求状态为Valid(context.ts); - macOS(codesign + notarization):
validateCodesignSignature()依次执行codesign --verify --deep --strict与spctl --assess --type open,同时通过读取 Mach-O 魔数(0xFEEDFACE、0xCAFEBABE等)识别二进制(context.ts); - DMG 挂载:
mountDmg()使用hdiutil attach -nobrowse -readonly挂载,从输出末行解析挂载点,测试结束后卸载。
8.3 安装方式覆盖
TestContext针对每种分发格式实现了独立的安装/卸载例程,并在安装后验证入口文件存在:
- Windows:
installWindowsApp()以/silent /mergetasks=!runcode静默安装,按 quality 区分用户级/系统级安装目录与Code.exe/Code - Insiders.exe/Code - Exploration.exe入口;卸载走unins000.exe /silent并确认目录已删除; - Linux DEB / RPM:
installDeb()/installRpm()分别调用dpkg -i/rpm -i(root 或 sudo),安装后检查/usr/share/<code|code-insiders|code-exploration>/...入口; - Linux Snap:
installSnap()以snap install --classic --dangerous安装本地包,入口定位到/snap/<package>/current/usr/share/...; - 便携模式(Portable Mode):
createPortableDataDir()在解压目录创建data(Linux/Windows)或code-portable-data(macOS),用于验证 README 引用的 Portable Mode 场景。
8.4 应用层验证(UI 测试)
uiTest.ts 定义了所有形态共用的 UI 工作流(run()→validate()):
- 关闭工作区信任对话框(点击 “Yes, I trust the authors”);
- 通过命令面板(F1)执行 “View: Show Explorer”,新建
helloWorld.txt,键入Hello, World!并保存; - 打开扩展视图搜索并安装 “GitHub Pull Requests” 扩展;
- 验证:文件内容精确匹配
Hello, World!,扩展目录中出现以github.vscode-pull-request-github开头的安装项。
WSL 场景在 wsl.test.ts 中通过WslUITest子类改写验证逻辑——文件内容通过wsl cat在 WSL 文件系统中校验,扩展通过wsl ls检查~/.vscode-server*/extensions目录,并会先删除默认 WSL 扩展目录以保证安装是真实发生的。
8.5 Server 与 Web 的核心断言
- Server 测试(server.test.ts):启动
code-server --accept-server-license-terms --connection-token <token> --host 0.0.0.0 --port <port>,从输出中匹配 “Extension host agent listening on (\d+)” 拿到端口,然后请求/version端点并断言返回文本等于目标 commit; - Web 测试(serverWeb.test.ts):启动带 token 的 Web Server,用 Playwright 打开
http://localhost:<port>/?tkn=<token>&folder=...,等待.monaco-workbench渲染完成后执行 UI 工作流; - CLI 隧道测试(cli.test.ts):执行
--version断言 commit 匹配,再在存在 GitHub 凭据时启动 Dev Tunnel,从输出解析设备码(use code ...)完成设备码认证,点击 GitHub 账号与 Allow 授权,最终等待remote <tunnel-id>连接按钮出现——这是对发布产物中 CLI 远程能力的完整端到端验证。
九、相关资源与延伸阅读
- 测试入口与依赖:test/sanity/package.json、test/sanity/src/index.ts
- 参数解析与测试注册:test/sanity/src/main.ts
- 能力检测:test/sanity/src/detectors.ts
- 平台脚本:test/sanity/scripts(含
run-docker.sh、run-ubuntu.sh、run-macOS.sh、run-win32.cmd、run-qemu-64k.sh) - 容器定义与容器入口:test/sanity/containers
- CI 流水线:build/azure-pipelines/product-sanity-tests.yml 与可复用作业模板 build/azure-pipelines/common/sanity-tests.yml
README 的 References 部分还列出了端到端用户场景相关的官方文档主题(Download、Requirements、Setup Overview、Linux/macOS/Windows Setup、Portable Mode、VS Code Server、WSL),健全性测试的每一类用例都对应其中一种真实安装/使用路径,建议结合这些官方场景说明阅读本文的测试矩阵,可以更清楚地理解每个用例的覆盖意图。
- 开发工具
- IDE
- 代码编辑器
- 后端
【免费下载链接】openvscode-server
Run upstream VS Code on a remote machine with access through a modern web browser from any device, anywhere.
相关推荐
Positron 发布版 Sanity 检查测试:多平台构建质量端到端验证指南
Positron 发布版 Sanity 检查测试:多平台构建质量端到端验证指南 导读:本指南以 test/sanity/README.md https://li
开发工具代码编辑器数据科学ChartDB:企业级多数据库可视化完整解决方案
ChartDB:企业级多数据库可视化完整解决方案 在当今复杂的微服务架构和数据驱动型应用中,技术决策者和架构师面临着一个共同的挑战:如何在MySQL、Postg
数据库前端数据可视化AI 应用llamafile 集成测试体系完全指南:覆盖 CLI / TUI / Server 三种模式的端到端验证方案
llamafile 集成测试体系完全指南:覆盖 CLI / TUI / Server 三种模式的端到端验证方案 导读 本文围绕 llamafile 仓库的 te
人工智能大模型本地部署推理引擎
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考