Files
ProjectAGiPrompt/7-JenBranchRBAC/1-原始需求/2-优化产品需求文档PRD.md
2026-01-21 16:15:49 +08:00

14 KiB
Raw Permalink Blame History

JenBranchRBAC 产品需求文档

Jenkins 分支级权限管理系统

1. 产品概述

1.1 产品定位

JenBranchRBAC 是一个基于 Jenkins REST API 的细粒度权限控制平台,提供项目级、分支级的构建权限管理,解决 Jenkins 原生 RBAC 插件无法满足多分支流水线细粒度授权的痛点。

1.2 核心价值

  • 细粒度权限控制:支持到分支级别的读取、构建权限隔离
  • 独立认证体系:与 Jenkins 解耦的用户管理,降低 Jenkins 账户管理复杂度
  • 审计合规:完整的操作日志记录,满足企业安全审计需求
  • 高效稳定:基于 Go 语言构建,低资源占用,高并发响应

2. 功能架构

2.1 系统角色定义

角色 权限范围 典型场景
超级管理员 系统全部功能 平台运维人员
项目管理员 指定项目的权限分配 项目 Leader
普通用户 已授权分支的查看和构建 开发工程师

3. 详细功能设计

3.1 管理端功能模块

3.1.1 用户生命周期管理

用户注册

  • 支持单个/批量导入用户CSV 格式)
  • 密码策略:
    • 最小长度 8 位,包含大小写字母、数字、特殊字符
    • 采用 bcrypt 算法加密存储cost factor=12
    • 默认密码有效期 180 天,到期前 7 天邮件提醒
  • 首次登录强制修改初始密码

用户查询与导出

  • 支持按用户名、角色、权限范围、状态(启用/禁用/锁定)多维度筛选
  • 导出格式包含:用户名、角色、授权项目-分支清单、账户状态、密码到期时间、最后登录时间
  • 安全约束:导出支持 CSV/Excel 格式,敏感数据(密码哈希)不可导出,管理员仅可重置无法查看明文。

用户编辑

  • 密码重置:管理员可重置用户密码并强制下次登录修改
  • 账户状态管理:启用/禁用/锁定(连续 5 次登录失败自动锁定 30 分钟)
  • 权限变更:调用权限绑定模块进行项目-分支授权调整

3.1.2 权限绑定系统

Jenkins 数据同步

  • 定时拉取:后端使用 cron 协程定时(默认 5 分钟)调用 Jenkins API。
  • 手动立即同步:管理界面提供“立即同步”按钮,后端通过 Goroutine 异步执行同步任务,前端通过 WebSocket 或轮询获取进度。
  • 缓存机制本地缓存分支信息API 调用失败时使用缓存数据。
  • 差异检测:自动识别新增/删除的项目和分支,提示管理员处理孤立权限。

权限分配界面

  • 左右穿梭框设计Material UI 风格):
    • 左侧:所有项目-分支树状结构
    • 右侧:已授权清单
    • 支持项目级全选/分支级精选
  • 搜索功能:支持项目名、分支名模糊匹配及正则过滤(如 feature/*)。
  • 权限模板:保存常用权限组合为模板,快速应用于同类用户。

3.1.3 操作审计日志

日志记录维度

  • 用户操作:登录/登出、密码修改、权限变更
  • 构建操作:构建触发人、项目、分支、参数、时间戳
  • 管理操作:用户创建/删除、权限模板变更、配置修改
  • API 调用Jenkins API 调用记录、响应状态、耗时

日志查询与分析

  • 支持时间范围、操作类型、用户、项目多维度筛选
  • 统计分析:用户活跃度排行、构建频率热力图、异常操作告警

3.2 用户端功能模块

3.2.1 安全认证机制

登录流程

  • 前端使用 RSA 加密密码传输(公钥前端存储,私钥后端保管)
  • 后端验证:
    1. 解密密码并与数据库 bcrypt 哈希比对
    2. 校验账户状态(未过期、未锁定)
    3. 生成 JWT Token有效期 8 小时,支持刷新)
  • 支持 MFA可选集成 TOTP 双因素认证

会话管理

  • 单设备登录限制(可配置允许多会话)
  • Token 自动续期机制:活跃用户无感刷新

3.2.2 项目与分支管理

项目视图

  • 卡片式展示已授权项目Material Card 组件):
    • 项目名称、描述、授权分支数量、最新构建状态图标
  • 分组与排序:按项目名称、最后构建时间排序,支持收藏。

分支视图

  • DataGrid 表格展示分支信息:
    • 分支名称、最后构建状态、时间、Commit 信息
  • 快速构建按钮:一键触发构建

3.2.3 构建管理

构建触发

  • 参数化构建支持:自动识别 Jenkinsfile parameters前端动态生成 Material UI 表单。
  • 权限二次校验:调用 Jenkins API 前验证用户对该分支的构建权限。

实时构建监控

  • 基于 WebSocket后端 Go Gin 开启 WebSocket 路由,实时推送 Jenkins 日志。
  • 日志渲染优化:前端解析 ANSI Color Codes还原 Jenkins 控制台的红/黄/绿色高亮。

历史构建查询

  • 分页展示历史构建(编号、结果、触发人、时长)。
  • 构建产物下载:提供 .jar/.war/.apk 等构建产物的直接下载链接。

3.3 配置管理模块

3.3.1 系统配置

数据存储配置

{
  "database": {
    "type": "sqlite3",
    "path": "./data/jenbranchrbac.db",
    "options": {
      "journal_mode": "WAL",  // 显式开启 WAL 模式以提升并发性能
      "synchronous": "NORMAL"
    },
    "backup": {
      "enabled": true,
      "interval": "daily",
      "retention": 30
    }
  }
}

安全配置

{
  "security": {
    "password_encryption": {
      "algorithm": "bcrypt",
      "cost_factor": 12
    },
    "rsa_key_pair": {
      "public_key_path": "./keys/public.pem",
      "private_key_path": "./keys/private.pem"
    },
    "jwt": {
      "secret": "CHANGE_THIS_SECRET",
      "expiry": "8h",
      "refresh_window": "1h"
    },
    "mfa": {
      "enabled": false,
      "issuer": "JenBranchRBAC"
    }
  }
}

Jenkins 集成配置

{
  "jenkins": {
    "url": "https://jenkins.example.com",
    "credentials": {
      "username": "api_user",
      "token": "API_TOKEN_HERE"
    },
    "sync": {
      "interval": 300,
      "timeout": 30
    },
    "proxy": {
      "enabled": false,
      "url": "http://proxy.example.com:8080"
    }
  }
}

3.3.2 通知配置(增强功能)

邮件通知

  • SMTP 配置:支持 TLS/SSL
  • 通知场景:
    • 密码即将过期提醒
    • 构建失败告警(可配置失败次数阈值)
    • 账户异常登录告警

Webhook 集成

  • 支持发送构建事件到外部系统如钉钉、企业微信、Slack
  • 自定义消息模板

3.4 Jenkins API 封装模块

3.4.1 API 能力清单

API 端点 功能 实现要点
/api/json?tree=jobs[...] 获取所有项目 使用 depth 和 tree 参数优化响应大小
/job/{name}/api/json 获取多分支流水线的分支 递归解析 jobs 字段
/job/{job}/job/{branch}/build 触发无参构建 POST 请求,需 Jenkins Crumb
/job/{job}/job/{branch}/buildWithParameters 触发参数化构建 表单数据传递参数
/job/{job}/job/{branch}/{num}/logText/progressiveText 增量获取构建日志 使用 start 参数实现断点续传
/job/.../{num}/api/json?tree=artifacts 获取构建产物 新增:解析下载路径
/queue/api/json 查询构建队列 估算等待时间

3.4.2 API 调用优化

性能优化

  • 使用 tree 参数精简返回字段,避免全量数据拉取
  • 启用 HTTP/2 和连接池复用
  • 缓存静态数据(项目列表、分支列表)

可靠性保障

  • 重试机制API 调用失败自动重试 3 次(指数退避)
  • 熔断降级Jenkins 不可用时,显示缓存数据并提示用户
  • 请求限流:防止单用户频繁调用 Jenkins API

安全增强

  • 使用 Jenkins API Token 而非用户名密码
  • 所有 POST 请求携带 Jenkins Crumb 防止 CSRF
  • API Token 加密存储在配置文件中

4. 数据库设计

4.1 核心表结构

用户表users

CREATE TABLE users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username VARCHAR(50) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    role VARCHAR(20) DEFAULT 'user',
    status VARCHAR(20) DEFAULT 'active',
    password_expires_at DATETIME NOT NULL,
    failed_login_attempts INTEGER DEFAULT 0,
    locked_until DATETIME,
    mfa_secret VARCHAR(32),
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    last_login_at DATETIME
);

权限表permissions

CREATE TABLE permissions (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER NOT NULL,
    project_name VARCHAR(255) NOT NULL,
    branch_name VARCHAR(255) NOT NULL,
    can_view BOOLEAN DEFAULT 1,
    can_build BOOLEAN DEFAULT 1,
    granted_by INTEGER NOT NULL,
    granted_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    FOREIGN KEY (granted_by) REFERENCES users(id),
    UNIQUE(user_id, project_name, branch_name)
);

审计日志表audit_logs

CREATE TABLE audit_logs (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER,
    action VARCHAR(50) NOT NULL,
    resource_type VARCHAR(50),
    resource_id VARCHAR(255),
    details TEXT,
    ip_address VARCHAR(45),
    user_agent TEXT,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE INDEX idx_audit_logs_user_time ON audit_logs(user_id, created_at);
CREATE INDEX idx_audit_logs_action ON audit_logs(action);

权限模板表permission_templates

CREATE TABLE permission_templates (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name VARCHAR(100) UNIQUE NOT NULL,
    description TEXT,
    permissions_json TEXT NOT NULL,
    created_by INTEGER NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (created_by) REFERENCES users(id)
);

5. 技术选型建议 (Updated)

5.1 后端技术栈

  • 语言Go (Golang) 1.24+
  • Web 框架Gin
    • 选择理由:高性能、轻量级、中间件生态丰富,适合构建高并发 REST API。
  • ORM 框架GORM
    • 选择理由Go 语言事实标准的 ORM支持 SQLite/MySQL/PostgreSQL 驱动,提供 AutoMigrate 能力,方便未来无缝迁移数据库。
  • 身份认证golang-jwt/jwt (JWT) + golang.org/x/crypto/bcrypt (密码哈希)。
  • 任务调度robfig/cron
    • 架构优势:利用 Go 的协程 (Goroutine) 处理定时同步和异步任务,无需 额外部署 Redis + Celery 等复杂的消息队列组件,大幅降低运维成本。
  • Jenkins SDKbndr/gojenkins 或基于 resty 封装的 HTTP Client。
  • 日志处理zaplogrus (高性能结构化日志)。

5.2 前端技术栈

  • 框架Vue 3 (Composition API)
  • 语言TypeScript
    • 选择理由:提供静态类型检查,增强代码可维护性和智能提示,适合企业级后台管理系统。
  • UI 组件库Vuetify 3 (Material Design for Vue)
    • 说明:严格遵循 Material Design 规范的 Vue 组件库提供丰富的现成组件Card, DataGrid, Dialog 等),响应式设计优秀。
  • 状态管理Pinia (Type-safe store)。
  • 网络请求Axios (封装拦截器处理 JWT 刷新)。
  • 日志渲染ansi-to-html (解析构建日志颜色)。

5.3 部署方案

  • 编译构建:后端编译为单二进制文件 (Static Binary),前端编译为静态资源 (dist)。
  • 容器化:使用 Multi-stage Dockerfile 构建,最终镜像体积可控制在 20MB-50MB 级别(使用 Alpine 基础镜像)。
  • 反向代理Nginx 托管前端静态文件,并反向代理 API 请求到 Go 服务。

6. 非功能性需求

6.1 性能指标

  • 高并发:得益于 Go 的 Goroutine 模型,单实例可轻松支持 1000+ 并发连接WebSocket 日志推送)。
  • 低延迟API 响应时间 < 100ms。
  • 资源占用:空闲状态下内存占用 < 50MB。
  • 快速启动:服务启动时间 < 1s。

6.2 安全与合规

  • 密码零明文存储Bcrypt
  • API 接口实施 RBAC 中间件拦截。
  • SQL 注入防御GORM 参数化查询)。
  • XSS 防御Vue 自动转义 + Gin Secure JSON

6.3 可维护性

  • 前后端完全分离,通过 Swagger/OpenAPI (swag 库自动生成) 定义接口。
  • Go 强类型语言特性减少运行时错误。

7. 实施路线图

Phase 1 - MVP4 周)

  • 初始化 Go Gin 项目脚手架与 GORM 模型设计。
  • 实现基于 JWT 的用户认证与权限中间件。
  • 完成 Jenkins API 的 Go 语言封装与数据同步协程。
  • 前端 Vue3 + TS + Vuetify 基础框架搭建及登录页。
  • 验证SQLite WAL 模式下的 GORM 并发读写稳定性。

Phase 2 - 增强功能3 周)

  • 实现 WebSocket 路由,对接 Jenkins 实时日志流。
  • 开发前端日志组件(支持 ANSI 颜色渲染)。
  • 实现构建产物解析与下载接口。
  • 完善审计日志的中间件埋点Aspect-Oriented Programming

Phase 3 - 企业级特性3 周)

  • 集成 TOTP (MFA) 认证。
  • 增加 Webhook 通知模块Go 协程异步发送)。
  • 压力测试:验证 500+ 用户同时在线时的内存泄漏情况pprof 分析)。
  • 编写 Dockerfile 与 CI/CD 流水线。

8. 风险与挑战 (针对新栈)

  • 前端学习曲线TypeScript 和 Vuetify 的系统性较强,需确保前端团队熟悉类型系统。
    • 缓解:制定 TS 规范,提供类型定义文件 (*.d.ts)。
  • Jenkins API 结构变动Go 是强类型语言,解析 Jenkins 不规范的 JSON 可能报错。
    • 缓解:在 JSON 解析层定义松散的 struct 或使用 interface{} 配合断言处理动态字段。