新增 runtime 准备脚本后,两件事此前零覆盖:脚本本身在 Windows 上的分支、 以及「打包产物能不能真跑」。补上: - rust.yml:prepare:node 真跑(验证脚本可用 + 产物自检)→ 断言注入片段声明两份资源 → `verify-bundle --runtime` 真 spawn 运行时跑 sidecar 走一次 JSON-RPC。 paths 触发加上 scripts/prepare-console.mjs。 注:Linux 上不走 strip 分支(macOS 专属),故「strip 必须 adhoc 重签」由 macOS 本机实测覆盖。 - windows-e2e.yml:新增一步跑 prepare:node + verify-bundle --runtime —— 该脚本在 Windows 上走的是「复制 node.exe、无 strip」的另一条分支,此前从未被真实 runner 验证过。
105 lines
4.3 KiB
YAML
105 lines
4.3 KiB
YAML
name: Rust Shell
|
||
|
||
# 2026-10:原 crates/nodeagent-client(Rust 版协议客户端)已退役 ——
|
||
# 协议实现改由 Node sidecar 承担(apps/console/sidecar/),避免两套实现静默漂移。
|
||
# 本工作流随之改为验证 **console 的 Rust 壳**(sidecar 管理 + command 转发)。
|
||
#
|
||
# 它的单测是**真跑** Node sidecar 子进程的(见 apps/console/src-tauri/src/sidecar.rs),
|
||
# 不依赖 Tauri GUI,因此能在 Linux 快车道上跑。
|
||
on:
|
||
push:
|
||
branches: [main]
|
||
paths:
|
||
- 'apps/console/src-tauri/**'
|
||
- 'apps/console/sidecar/**'
|
||
- 'scripts/prepare-console.mjs'
|
||
- '.github/workflows/rust.yml'
|
||
pull_request:
|
||
paths:
|
||
- 'apps/console/src-tauri/**'
|
||
- 'apps/console/sidecar/**'
|
||
- 'scripts/prepare-console.mjs'
|
||
- '.github/workflows/rust.yml'
|
||
workflow_dispatch:
|
||
|
||
env:
|
||
CARGO_TERM_COLOR: always
|
||
|
||
jobs:
|
||
test:
|
||
name: Rust 壳单测(真跑 sidecar)
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- name: 检出代码
|
||
uses: actions/checkout@v5
|
||
|
||
# 版本**锁死**而不跟 stable 漂 —— 否则「本地全绿」与「CI 绿」会因 lint 集合随工具链
|
||
# 变化而分叉(本仓库已因同类原因吃过 8 轮 Windows CI 的苦头)。
|
||
- name: 安装 Rust 工具链(含 clippy)
|
||
uses: dtolnay/rust-toolchain@master
|
||
with:
|
||
toolchain: stable
|
||
components: clippy
|
||
|
||
# Tauri 壳在 Linux 上编译需要这些系统库(webkit2gtk 等)。sidecar 单测本身
|
||
# 不需要 GUI,但整个 crate 要能编过。
|
||
- name: 安装 Tauri 系统依赖
|
||
run: |
|
||
sudo apt-get update
|
||
sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev \
|
||
librsvg2-dev patchelf libgtk-3-dev
|
||
|
||
- name: 安装 Node(sidecar 单测要真跑它)
|
||
uses: actions/setup-node@v4
|
||
with:
|
||
node-version: '22'
|
||
|
||
- name: 安装 pnpm 与依赖(sidecar 需 @nodeagent/client)
|
||
uses: pnpm/action-setup@v4
|
||
with:
|
||
version: 9
|
||
- run: pnpm install --frozen-lockfile
|
||
|
||
- name: 构建 workspace 包(sidecar 依赖其 dist)
|
||
run: pnpm -r --filter "./packages/*" build
|
||
|
||
# ⚠️ tauri-build 在**编译期**校验 tauri.conf.json 里 resources 的文件存在性,
|
||
# 故必须先产出 sidecar.mjs,否则 clippy/test 会在 build.rs 阶段就失败。
|
||
- name: 构建 sidecar(resources 引用的产物)
|
||
run: pnpm --filter nodeagent-console sidecar:build
|
||
|
||
# 随包分发的 Node 运行时由该脚本准备;它同时产出「构建期注入片段」。
|
||
# 在此真跑一遍:既验证脚本本身可用(含产物自检:node 必须真能执行),
|
||
# 也验证注入片段声明的两份 resource 确实就绪。
|
||
# 注意 Linux 上不会走 strip 分支(那是 macOS 专属,见脚本内注释),
|
||
# 故「strip 后必须 adhoc 重签」这条由 macOS 本机实测覆盖,CI 不重复验证。
|
||
- name: 准备 Node 运行时(验证 prepare-console.mjs)
|
||
run: pnpm --filter nodeagent-console prepare:node
|
||
|
||
- name: 注入片段应声明两份资源
|
||
run: |
|
||
node -e '
|
||
const g = require("./apps/console/src-tauri/tauri.bundle.gen.json");
|
||
const r = g.bundle.resources;
|
||
const keys = Object.keys(r);
|
||
if (keys.length !== 2) { console.error("资源项应为 2,实际", keys); process.exit(1); }
|
||
console.log("✓", JSON.stringify(r));
|
||
'
|
||
|
||
# 更强的一道:不是「文件在不在」,而是「产物能不能自举」——
|
||
# 真 spawn 打包内的 node 跑 sidecar 并走一次 JSON-RPC 握手。
|
||
# 这类问题只在产物中暴露(源码与单测都正常)。
|
||
- name: 验证运行时 + sidecar 可自举
|
||
run: node apps/console/scripts/verify-bundle.mjs --runtime
|
||
|
||
- name: 缓存 cargo 构建产物
|
||
uses: Swatinem/rust-cache@v2
|
||
with:
|
||
workspaces: apps/console/src-tauri
|
||
|
||
- name: Clippy(告警即失败)
|
||
run: cargo clippy --manifest-path apps/console/src-tauri/Cargo.toml --all-targets -- -D warnings
|
||
|
||
- name: 单测(真跑 Node sidecar 进程)
|
||
run: cargo test --manifest-path apps/console/src-tauri/Cargo.toml
|