一个使用 C# / .NET 10 构建的类 Jenkins / GitHub Actions 持续集成服务器。
- 并行 Run / Job / Step:一个工作流的多个 Job 并行执行;每个步骤独立的控制台输出
- Job 依赖图(needs):
needs: [a, b]声明依赖,形成 DAG;依赖失败时下游自动跳过;if: always()的 Job 在依赖失败后仍会运行;Run 页面渲染依赖图,点击节点切换日志 - 超时与重试:Job / Step 级
timeout_minutes(或timeout_seconds)超时自动 kill;Stepretry: n失败自动重试 - 定时触发:工作流 YAML 顶层
schedule: "*/5 * * * *"(5 字段 cron,可配列表),到点自动触发 - SCM push webhook:
/api/webhooks/{token}支持可选 HMAC-SHA256 验签(X-Hub-Signature-256或X-Signature)与分支过滤(通配符,如main,release/*);兼容 GitHub/GitLab/Gitea 的ref载荷 - 全页面实时:每个页面打开即建立本标签页独立的 SignalR 连接,按可见项目分组推送,数据变化实时上屏,无手动刷新按钮
- 心跳看门狗:健康期每 15s ping 服务端;失败按指数回退(1s/2s/4s/8s/16s)自动重试并尝试恢复连接,连续第 5 次失败时自动刷新页面
- 逐行时间戳日志:每个 Job 独立 JSONL 日志文件,行号即断点续传游标;控制台渲染 ANSI 颜色
- 分布式 Agent:Agent 主动外连 Master(gRPC,端口 5001),心跳租约、拉取式领任务、断线自动重连、孤儿任务自动重排队
- 用户权限与安全:超级管理员 / 管理员 / 普通用户 + 按项目可见性(REST 与实时推送一致过滤);个人 API Token(
Authorization: Bearer)供 CLI / 机器接入 - 任务配置 Git 仓库:每个任务独立仓库(
data/{任务}/.git),保存即提交(LibGit2Sharp 实现,配置历史/回滚/只读克隆);工作流scm:源码检出在 agent/本地用 git 命令行执行,以应对大型仓库 - 任务优先目录布局:
data/{任务}/下含配置、日志(按运行号)、工作区;运行编号在任务内自增,URL 形如/runs/{任务}/{编号}
scripts\start-server.cmd :: 启动 Server(Web http://127.0.0.1:5000,gRPC 5001)
scripts\start-agent.cmd :: 启动 Agent(需先在 Web 的 Agents 页签发注册令牌)
scripts\start-agent.cmd --Agent:EnrollToken=<令牌> --Agent:AgentName=build-1
scripts\publish.cmd :: 发布自包含单文件 EXE 到 publish\bash 环境使用同目录下对应的 .sh 脚本。
首次启动自动创建超级管理员 admin / admin 与 Default 项目(请立即修改密码)。
在 Web「任务 → 新建任务」用表单或 YAML 创建;YAML 会被写入 data/jobs/*.yml
(Git 仓库,保存即提交)。也可以直接把文件放进该目录,保存即热加载:
name: demo
project: Default
jobs:
build:
steps:
- name: Build
command: dotnet build
test:
needs: [build] # 依赖 build 成功后才运行
runs_on: agent # 在 Agent 上执行(可选 agent:<标签>)
steps:
- name: Test
command: dotnet test| 项目 | 说明 |
|---|---|
src/InfinityCI.Core |
工作流/运行模型、YAML 解析、跨平台 Shell 解析、gRPC 协议 |
src/InfinityCI.Server |
Web + REST + SignalR(5000)、Agent gRPC(5001)、并行调度引擎 |
src/InfinityCI.Agent |
Agent 进程:注册/心跳/拉取式领任务/远程执行 |
web |
React 19 + Rsbuild + Tailwind 前端(GitHub Actions 风格) |
所有依赖版本均已固定(前端精确到补丁号,.NET 由 global.json 与精确的 PackageReference 固定)。
| 依赖 | 版本 | 说明 |
|---|---|---|
| .NET SDK | 10.0.401 | 由 global.json 固定(rollForward=latestFeature);目标框架 net10.0 |
| Node.js | ≥ 20 | 开发环境验证于 26.x |
| npm | ≥ 10 | 开发环境验证于 11.x |
| Git | 任意近期版本 | 任务配置仓库(历史/回滚/克隆)依赖 |
InfinityCI.Core(共享库)
| 包 | 版本 | 用途 |
|---|---|---|
| Google.Protobuf | 3.36.1 | gRPC 协议消息序列化 |
| Grpc.Core.Api | 2.83.0 | gRPC 公共 API |
| Grpc.Tools | 2.83.0 | Protobuf 编译(仅编译期) |
| LibGit2Sharp | 0.32.0 | Git 检出 / 配置仓库 / SCM 集成 |
| YamlDotNet | 18.1.0 | 工作流 YAML 解析 |
InfinityCI.Server
| 包 | 版本 | 用途 |
|---|---|---|
| Grpc.AspNetCore | 2.83.0 | Agent gRPC 服务(端口 5001) |
| Microsoft.EntityFrameworkCore.Sqlite | 10.0.12 | SQLite 持久化 |
| Serilog.AspNetCore | 10.0.0 | 结构化日志 |
| System.DirectoryServices.Protocols | 10.0.12 | LDAP 认证 |
InfinityCI.Agent
| 包 | 版本 | 用途 |
|---|---|---|
| Grpc.Net.Client | 2.83.0 | 与 Master 的 gRPC 通信 |
| Microsoft.Extensions.Hosting | 10.0.12 | Worker 服务宿主 |
测试项目
| 包 | 版本 | 用途 |
|---|---|---|
| xunit / xunit.runner.visualstudio | 2.9.3 / 3.1.4 | 单元与集成测试 |
| Microsoft.NET.Test.Sdk | 17.14.1 | 测试平台 |
| coverlet.collector | 6.0.4 | 覆盖率收集 |
| Microsoft.AspNetCore.Mvc.Testing | 10.0.12 | WebApplicationFactory 集成测试 |
| Microsoft.AspNetCore.SignalR.Client | 10.0.12 | SignalR 端到端测试客户端 |
运行时依赖
| 包 | 版本 | 用途 |
|---|---|---|
| react / react-dom | 19.2.8 | UI 框架 |
| @tanstack/react-router | 1.170.33 | 类型安全路由 |
| @tanstack/react-query | 5.102.8 | 服务端状态管理 |
| @microsoft/signalr | 10.0.11 | 实时推送客户端(每标签页独立连接) |
| @xterm/xterm + @xterm/addon-fit | 6.0.0 / 0.11.0 | 构建日志终端 |
| zustand | 5.0.15 | 轻量客户端状态 |
| js-yaml | 5.4.1 | 任务编辑器 YAML 往返 |
| lucide-react | 1.43.0 | 图标 |
| i18next / react-i18next | 26.4.2 / 17.0.13 | 国际化 |
| clsx + tailwind-merge | 2.1.1 / 3.6.0 | 样式工具 |
| class-variance-authority | 0.7.1 | 组件变体 |
开发依赖
| 包 | 版本 | 用途 |
|---|---|---|
| @rsbuild/core + @rsbuild/plugin-react | 2.2.5 / 2.1.0 | 构建(Rspack,dev 端口 3000,代理 /api 与 /hubs 到 5000) |
| typescript | 7.0.2 | 类型检查(npm run typecheck) |
| tailwindcss + @tailwindcss/postcss | 4.3.3 | Tailwind CSS v4(PostCSS 集成) |
| @types/react / @types/react-dom / @types/node / @types/js-yaml | 19.2.18 / 19.2.7 / 26.5.0 / 4.0.9 | 类型声明 |
- 前端:
npm run dev(开发热更新)/npm run build(产物输出dist/,由 Server 托管) - 后端:
scripts/start-server.cmd/scripts/start-agent.cmd;scripts/publish.cmd发布 win-x64 自包含单文件 EXE 到publish/