构建系统与发布管线
构建系统与发布管线
相关源文件
本章引用的主要源码文件:
.github/scripts/verify_windows_install.ps1.github/workflows/ci.yml.github/workflows/release.yml.github/workflows/windows-smoke.ymlAGENTS.mdCargo.lockCargo.tomlbuild.rsdocs/CODE_QUALITY_10_10_PLAN.mddocs/CODE_QUALITY_AUDIT_2026-04-18.mddocs/CODE_QUALITY_TODO.mddocs/COMPILE_PERFORMANCE_PLAN.mddocs/REFACTORING.mdscripts/agent_trace.shscripts/bench_compile.shscripts/bench_selfdev_checkpoints.shscripts/build_linux_compat.shscripts/cargo_exec.shscripts/check_warning_budget.shscripts/dev_cargo.shscripts/install.ps1scripts/install.shscripts/install_release.shscripts/invoke_cargo_with_timeout.ps1scripts/quick-release.shscripts/real_provider_smoke.shscripts/refactor_phase1_verify.shscripts/remote_build.shscripts/remote_config.shscripts/test_auth_e2e.shscripts/test_e2e.shscripts/update_packages.shtests/e2e/windows_lifecycle.rs
本文档描述了支撑 jcode 开发生命周期的基础设施,包括 Cargo 工作区架构、编译优化策略、基于 GitHub Actions 的自动化持续集成/持续部署(CI/CD)管线,以及发布分发机制。
Cargo 工作区与编译性能
jcode 代码库被组织成一个 Cargo 工作区,以促进模块化并改善编译时间。该架构将核心逻辑与特定于提供者的实现、UI 组件以及桌面/移动端特定的 crate 分离开来。
工作区分解
该项目被拆分为 50 多个专门的 crate,以减少元数据变更并支持并行编译 Cargo.toml:8-61。关键的 crate 包括:
jcode-agent-runtime:核心状态机、中断信号和后台工具处理Cargo.toml:11-11。jcode-provider-core:用于大语言模型(LLM)后端的共享 trait、成本类型和 OpenAI 模式逻辑Cargo.toml:37-37。jcode-provider-metadata:模型目录和配置文件选择Cargo.toml:36-36。jcode-tui-render:终端界面的核心渲染管线Cargo.toml:50-50。jcode-desktop:使用wgpu的 GPU 加速桌面应用程序Cargo.toml:60-60。
编译优化计划
为了保持快速的开发者内部循环,系统遵循“编译性能计划” docs/COMPILE_PERFORMANCE_PLAN.md:1-4:
- 链接器选择:系统在 Linux 上优先使用
clang + lld或mold以减少链接时间scripts/dev_cargo.sh:217-251。 - 编译器缓存:通过
RUSTC_WRAPPER集成了sccache,用于本地开发和持续集成(CI)scripts/dev_cargo.sh:30-45,.github/workflows/ci.yml:131-135。 - 减少元数据变更:本地构建的版本字符串已稳定化。
build.rs不再仅仅因为时间戳变化而重新编译主 crate;相反,它使用 git 哈希和Cargo.toml版本docs/COMPILE_PERFORMANCE_PLAN.md:93-97,build.rs:102-109。 - 自研(Self-Dev)配置文件:使用专用的
selfdevCargo 配置文件进行迭代开发,显著减少了热构建时间docs/COMPILE_PERFORMANCE_PLAN.md:98-102。
开发者构建工作流
scripts/dev_cargo.sh 脚本作为 cargo 的包装器,自动配置环境以达到最佳性能。
| 特性 | 实现方式 |
|---|---|
| Sccache | 自动启动服务器并设置 RUSTC_WRAPPER scripts/dev_cargo.sh:30-45。 |
| 快速链接器 | 检测 mold 或 lld,并通过 RUSTFLAGS 注入 -fuse-ld scripts/dev_cargo.sh:242-255。 |
| 基准测试 | scripts/bench_selfdev_checkpoints.sh 测量冷/热构建的投资回报率(ROI)docs/COMPILE_PERFORMANCE_PLAN.md:103-125。 |
| 低内存模式 | 为小型机器提供自适应的 codegen-units 和增量编译设置 scripts/dev_cargo.sh:164-215。 |
来源: Cargo.toml:1-61, docs/COMPILE_PERFORMANCE_PLAN.md:1-140, scripts/dev_cargo.sh:1-260, build.rs:1-132
GitHub Actions 持续集成/持续部署(CI/CD)
该项目使用两个主要工作流:用于拉取请求的 CI 和用于打标签版本的 Release。
持续集成(CI)
ci.yml 工作流在每次推送时强制执行代码质量和功能正确性。
- 质量护栏:检查代码格式、clippy(拒绝警告)并强制执行预算棘轮机制
.github/workflows/ci.yml:42-69。 - 矩阵测试:在
ubuntu-latest、macos-latest和windows-latest上运行.github/workflows/ci.yml:103-109。 - 移动端模拟:在 Linux 运行器上为 iOS 子系统运行核心和模拟器测试
.github/workflows/ci.yml:71-101。
发布管线
release.yml 工作流由版本标签(例如 v*)触发。它自动化了跨平台编译和分发过程。
构建与制品创建
该管线为以下目标构建二进制文件:
- Linux:
x86_64(通过 Docker 实现可移植的 glibc 2.17)和aarch64目标.github/workflows/release.yml:29-38,scripts/build_linux_compat.sh:4-24。 - macOS:Intel 和 Apple Silicon 目标
.github/workflows/release.yml:39-44。 - Windows:使用 MSVC 构建
x64和ARM64目标.github/workflows/release.yml:131-138。
发布自动化流程图
下图展示了从 git 标签到分发制品的流程。
来源: .github/workflows/release.yml:1-120, .github/workflows/ci.yml:1-70, scripts/build_linux_compat.sh:1-30
警告与大小预算系统
为了防止技术债和二进制文件膨胀,jcode 采用了一个由 CI 棘轮机制强制执行的“预算”系统。
强制执行机制
- 警告预算:通过
scripts/check_warning_budget.sh限制允许的编译器警告数量.github/workflows/ci.yml:51-53。 - 代码大小预算:通过
scripts/check_code_size_budget.py追踪每个文件的代码行数(LoC)。超过设定阈值的文件会被标记.github/workflows/ci.yml:55-57。 - 错误处理棘轮:通过
scripts/check_swallowed_error_budget.py监控“被吞没”的错误(例如.ok()、let _ = ...).github/workflows/ci.yml:67-69。 - Panic 预算:通过
scripts/check_panic_budget.py监控unwrap()和expect()的使用.github/workflows/ci.yml:63-65。
来源: .github/workflows/ci.yml:48-70, docs/CODE_QUALITY_TODO.md:12-18
分发与安装
安装脚本
- Shell(Linux/macOS):
scripts/install.sh下载最新发布版本,检测架构,并在.zshrc、.bashrc或.zshenv中配置PATHscripts/install.sh:10-45,scripts/install.sh:178-200。 - PowerShell(Windows):
scripts/install.ps1安装到%LOCALAPPDATA%\jcode\bin,并提供用于 Alacritty 和热键设置的辅助功能scripts/install.ps1:43-57。
构建.rs 版本注入
build.rs 脚本通过检查环境变量和 git 状态来管理版本:
JCODE_VERSION:注入为类似v0.12.3 (abc1234)的字符串build.rs:114-114。JCODE_CHANGELOG:将最近的提交历史(最多 700 条)嵌入到二进制文件中,用于/changelog命令build.rs:70-96。- 自动补丁:如果未提供版本,它会递增一个本地补丁计数器,以确保开发构建版本唯一
build.rs:162-181。
构建实体关系图
下图将构建时配置与其对应的代码实体和脚本关联起来。
来源: build.rs:1-132, scripts/install.sh:1-120, scripts/install.ps1:1-130, scripts/dev_cargo.sh:1-260