Skip to content

Repository files navigation

Infinity CI

一个使用 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;Step retry: n 失败自动重试
  • 定时触发:工作流 YAML 顶层 schedule: "*/5 * * * *"(5 字段 cron,可配列表),到点自动触发
  • SCM push webhook/api/webhooks/{token} 支持可选 HMAC-SHA256 验签(X-Hub-Signature-256X-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 任意近期版本 任务配置仓库(历史/回滚/克隆)依赖

.NET NuGet 包

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 端到端测试客户端

前端依赖(web/)

运行时依赖

版本 用途
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.cmdscripts/publish.cmd 发布 win-x64 自包含单文件 EXE 到 publish/

Releases

Packages

Contributors

Languages