「DeployLite」第七章:技术实现与接口设计(Technical Implementation & API Specification)

第 7 章:DeployLite 技术实现与接口设计,介绍了 DeployLite 平台的技术实现与接口设计,包括技术栈总览、数据库设计、API 规范、安全考虑等。

第七章:技术实现与接口设计(Technical Implementation & API Specification)

7.1 技术栈总览(Technology Stack Overview)

核心语言与框架

层级技术说明
后端语言Go 1.24+主体逻辑实现,单二进制分发
Web 框架Fiber / Gin高性能 HTTP 框架
ORM / 数据库访问GORM v2 + SQLC(生成查询)兼顾灵活性与性能
消息队列Redis Streams / NATS JetStream调度与事件总线
对象存储MinIO / AWS S3 / Aliyun OSS构建制品与日志归档
配置管理Viper + YAML + Env动态加载配置文件
日志框架Zerolog / Zap结构化日志输出(JSON)
容器交互Docker SDK / Kubernetes Client-Go部署与 Runner 执行
缓存层Redis / Memcached任务状态、令牌缓存
前端技术栈Vue3 + TypeScript + Vite + TailwindCSS控制台与 Dashboard 实现
API 文档Swagger (OpenAPI 3.1) + Redoc自动生成文档
监控指标Prometheus Exporter + Grafana系统指标采集
策略引擎OPA(Open Policy Agent) + Rego策略即代码执行
测试框架GoConvey + Testify + Mockery单元与集成测试
CI/CD 流程自托管 DeployLite + GitHub Actions自动构建与发布

7.2 系统分层设计(System Layering)

层级模块职责描述
Presentation LayerHTTP API、GraphQL、WebSocket提供统一外部接口
Application LayerPipeline Service、Runner Service、Deploy Service业务逻辑层
Domain LayerEntities、Aggregates、Policies核心业务模型
Infrastructure LayerRepository、Storage、Queue、Logger外部依赖封装
Integration LayerPlugins、Hooks、Webhooks、SDK外部系统交互
Security LayerAuth、RBAC、Policy、Audit身份与安全控制
Observation LayerMetrics、Tracing、Events可观测性支持

模块依赖图

graph TD
A[HTTP API] --> B[Application Layer]
B --> C[Domain Layer]
C --> D[Repository]
D --> E[Database / Storage]
B --> F[Queue / Scheduler]
F --> G[Runner Agents]
B --> H[Policy Engine]
H --> I[OPA Rego]
B --> J[Metrics Collector]
J --> K[Prometheus]

7.3 控制平面(Control Plane)

主要职责

  • 管理项目与流水线配置;
  • 调度任务;
  • 分配 Runner;
  • 处理制品、日志、策略与审计;
  • 提供 REST/gRPC 接口。

主要组件

组件描述技术实现
API Server对外统一接口(REST/gRPC)Go Fiber / gRPC Gateway
Scheduler任务分配与调度队列Redis Stream + Worker Pool
Artifact Service制品上传、版本控制MinIO SDK / S3 API
Policy Service策略验证引擎OPA Rego Eval
Secret Manager密钥存取AES-GCM + Vault 插件
Audit Logger操作记录PostgreSQL + Async Batch
Metrics Collector指标采集与上报Prometheus Exporter

7.4 Runner Plane(执行平面)

Runner 模型

每个 Runner 是一个独立的 Go 进程,可在不同环境(Docker/K8s/VM)中运行。

核心功能

  • 向 Scheduler 轮询任务;
  • 下载构建代码;
  • 运行 Steps;
  • 上传制品与日志;
  • 汇报状态。

内部模块划分

模块功能
JobFetcher轮询任务队列
Executor执行 Steps(Shell / Docker / SSH)
ArtifactUploader上传构建输出
HealthReporter定时心跳
Sandbox临时执行环境清理
LogStreamer实时日志传输

Runner 注册流程

sequenceDiagram
  participant Runner
  participant ControlPlane
  Runner->>ControlPlane: Register(token)
  ControlPlane-->>Runner: Acknowledge (runner_id)
  Runner->>ControlPlane: Heartbeat (metrics)
  ControlPlane-->>Runner: Job Assignment
  Runner->>ControlPlane: Job Result

Runner 执行模式

  1. Host 模式

    • 执行宿主机命令;
    • 适用于内部环境。
  2. Docker 模式

    • 每 Job 创建容器;
    • 提供最大隔离性;
    • 支持资源限制(CPU/MEM)。
  3. K8s 模式

    • 每 Job 生成 Pod;
    • 支持自动清理;
    • 适合大规模分布式环境。

7.5 Scheduler(任务调度器)

调度算法

采用 Fair Weighted Queue(加权公平调度)

  • 每租户分配初始权重;
  • 超出配额时降低优先级;
  • 任务分配采用拉模式(Runner 主动拉取)。

任务状态机

状态说明转移条件
Pending等待调度有 Runner 空闲
Assigned分配中Runner 拉取任务
Running执行中Runner 启动
Succeeded成功Job 执行完成
Failed失败异常中止或错误
Canceled取消用户终止或系统超时

调度实现伪代码

func AssignJob(job Job) {
  runner := findAvailableRunner(job.Tags)
  if runner == nil {
    enqueuePending(job)
    return
  }
  assign(runner, job)
}

调度重试逻辑

  • 最大重试次数:3;
  • 指数回退策略:1s, 3s, 6s;
  • 异常自动标记 Runner 不健康。

7.6 Artifact Service(制品服务)

API 设计

方法路径描述
POST/artifacts/upload上传构建产物
GET/artifacts/:id获取制品信息
GET/artifacts/:id/download下载文件
DELETE/artifacts/:id删除制品
GET/projects/:id/artifacts查询项目下制品

存储目录结构

/artifacts/
  ├── project-101/
  │   ├── v1.0.0/
  │   │   ├── binary.zip
  │   │   └── sbom.json
  │   ├── v1.0.1/
  │   │   ├── app.tar.gz
  │   │   └── manifest.json

上传流程

sequenceDiagram
User->>API: POST /artifacts/upload
API->>MinIO: PUT Object
MinIO-->>API: OK
API->>DB: INSERT metadata
API-->>User: 201 Created (artifact_id)

7.7 Secret Service(密钥管理)

存储格式

  • 加密算法:AES-256-GCM;
  • 每个 Secret 独立随机 IV;
  • 加密密钥通过 KMS 管理(如 Vault)。
type Secret struct {
  ID       int64
  Scope    string // project / environment
  Key      string
  ValueEnc string // base64(ciphertext)
  Version  int
}

使用流程

  1. 构建时由控制平面加载;
  2. 传递给 Runner;
  3. Runner 注入环境变量;
  4. 构建完成后销毁。

7.8 Policy Engine(策略引擎)

集成 OPA

  • 使用 OPA SDK 嵌入;
  • 策略缓存至 Redis;
  • 每次执行前异步校验。

执行流程

flowchart LR
A[Pipeline Request] --> B[Load Policy]
B --> C[OPA Eval]
C --> D{Result}
D -->|allow| E[Proceed]
D -->|deny| F[Reject + Reason]

策略示例:镜像签名验证

package deploy.policy

deny["Image not signed"] {
  not input.image.signed
}

7.9 API 设计规范(RESTful + OpenAPI)

基本规则

  • 路径:/api/v1/
  • 响应统一格式:
{
  "code": 0,
  "message": "success",
  "data": {...},
  "trace_id": "abc123"
}

分页标准

  • 参数:?page=1&limit=20
  • 响应:
{
  "total": 152,
  "page": 1,
  "page_size": 20,
  "items": [...]
}

样例接口:Pipeline Runs

方法路径描述
GET/projects/:id/pipelines列出所有流水线
POST/projects/:id/pipelines/run触发新构建
GET/pipelines/:run_id/logs获取实时日志
DELETE/pipelines/:run_id取消执行

7.10 gRPC 接口定义

service RunnerService {
  rpc RegisterRunner(RegisterRequest) returns (RegisterResponse);
  rpc FetchJob(FetchRequest) returns (Job);
  rpc ReportResult(ResultRequest) returns (ResultResponse);
  rpc StreamLogs(stream LogChunk) returns (LogAck);
}

message RegisterRequest {
  string token = 1;
  string hostname = 2;
}

7.11 WebSocket 实时通信

用于日志与状态更新推送。
连接路径:/ws/pipeline/:id/logs

消息格式:

{
  "event": "log",
  "timestamp": "2025-10-22T10:12:33Z",
  "content": "[build] compiling..."
}

7.12 缓存与加速(Caching Layer)

缓存策略

类型Key 结构TTL说明
Runner 状态runner:{id}:status10s心跳缓存
项目配置project:{id}:config60s减少 DB 查询
Policy 缓存policy:{id}:hash300s提升 OPA 性能
构建日志块log:{pipeline}:{chunk}永久流式读取优化

7.13 日志与追踪(Logging & Tracing)

日志格式

{
  "time": "2025-10-22T10:05:31Z",
  "level": "info",
  "trace_id": "xyz",
  "module": "runner",
  "msg": "job completed"
}

Trace 标准

  • 使用 OpenTelemetry;
  • traceId 注入 HTTP Header;
  • 可与 Jaeger / Tempo 集成;
  • 追踪跨 Runner 与 Pipeline。

7.14 测试与验证(Testing & Validation)

测试类型工具目标
单元测试Go test + Testify代码逻辑正确性
集成测试Docker Compose多组件兼容
压力测试k6 / vegeta性能瓶颈
安全测试ZAP / Trivy漏洞扫描
端到端测试PlaywrightWeb + API 全链路
Mock 测试Mockery外部依赖隔离

单元测试覆盖率目标

模块覆盖率
Pipeline Engine≥ 90%
Runner≥ 85%
Scheduler≥ 85%
API 层≥ 80%
Artifact≥ 75%
Policy≥ 70%

7.15 性能优化策略(Performance Optimization)

层级策略
API 层Gzip 压缩、连接复用、HTTP/2
数据库索引优化、读写分离、批量提交
任务调度Redis pipeline 批量取任务
Runner局部缓存、并行步骤执行
日志系统分块写入、异步 flush
前端加载代码分片(chunk)、延迟加载

7.16 插件执行生命周期(Plugin Lifecycle)

阶段Hook 名称插件类型
构建前pre_buildStep Plugin
构建后post_buildStep Plugin
部署前pre_deployPolicy Plugin
部署后post_deployNotify Plugin
任务失败on_failureNotify Plugin

执行顺序:

pre_build → build → post_build → pre_deploy → deploy → post_deploy

7.17 外部集成(Integrations)

系统集成方式
GitHub / GitLabOAuth + Webhook
Slack / 飞书Notification Plugin
Harbor / GHCRDocker Registry API
HashiCorp VaultSecret Backend Plugin
TerraformStep Plugin
Prometheus / GrafanaMetrics Exporter

7.18 部署与升级(Deployment & Upgrade)

发布流程

  1. 构建二进制(make build);
  2. 生成镜像;
  3. 推送至 registry;
  4. K8s 滚动更新;
  5. 校验健康探针;
  6. 触发自动回滚(若失败)。

版本号策略

v<major>.<minor>.<patch>-<build>
示例:v1.2.3-20251022

灰度升级

  • 蓝绿切换;
  • 新版本实例并行启动;
  • 流量切换完成后销毁旧版本。

7.19 API 文档生成(OpenAPI Integration)

  • 使用 swaggo/swag 生成 OpenAPI;
  • 自动发布至 /docs
  • 版本控制(v1/v2)。

示例

// @Summary Get all projects
// @Router /api/v1/projects [get]
// @Produce json
// @Success 200 {array} Project
func GetProjects(c *fiber.Ctx) error {...}

7.20 安全机制验证与渗透测试

测试类型工具目标
SQL 注入ZAP验证防御
XSS / CSRFOWASP Zap前端安全
SSRF自定义测试网络隔离
权限绕过Burp SuiteRBAC 检查
文件上传Go test mockMIME 校验

第七章总结
本章定义了 DeployLite 的完整技术实现路径与接口契约:

  • 分层清晰,便于分工开发;
  • 接口与协议标准化;
  • 高性能、高安全、高扩展;
  • 支持二次开发与插件生态。

整体目标:

“保持像 GitHub Actions 一样灵活,但像 Render 一样可自托管。”

接下来进入:

第八章:验收标准与测试计划(Acceptance & QA Plan)
它将定义各模块验收条件、功能/性能/安全测试用例、回归策略与自动化覆盖体系。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页