Store 研发商店模块架构指南
模块定位: Store 是 BK-CI 的研发商店模块,负责管理流水线插件(Atom)、流水线模板(Template)、容器镜像(Image)等可复用组件的发布、审核、安装、统计等全生命周期管理。
一、模块整体结构
1.1 子模块划分
src/backend/ci/core/store/
├── api-store/ # API 接口定义层
│ └── src/main/kotlin/com/tencent/devops/store/
│ ├── api/
│ │ ├── atom/ # 插件相关接口(25+ 文件)
│ │ ├── common/ # 通用接口(40+ 文件)
│ │ ├── container/ # 容器相关接口
│ │ ├── image/ # 镜像相关接口
│ │ └── template/ # 模板相关接口
│ ├── constant/ # 常量和消息码
│ └── pojo/ # 数据对象(100+ 文件)
│ ├── app/ # 应用相关
│ ├── atom/ # 插件相关
│ ├── common/ # 通用对象
│ ├── image/ # 镜像相关
│ └── template/ # 模板相关
│
├── biz-store/ # 业务逻辑层
│ └── src/main/kotlin/com/tencent/devops/store/
│ ├── atom/ # 插件业务
│ │ ├── dao/ # 插件数据访问
│ │ ├── factory/ # 工厂类
│ │ ├── resources/ # API 实现
│ │ └── service/ # 插件服务
│ ├── common/ # 通用业务
│ │ ├── dao/ # 通用数据访问(60+ 文件)
│ │ ├── handler/ # 处理器链
│ │ ├── resources/ # API 实现
│ │ └── service/ # 通用服务
│ ├── image/ # 镜像业务
│ └── template/ # 模板业务
│
├── model-store/ # 数据模型层(JOOQ 生成)
└── boot-store/ # Spring Boot 启动模块
1.2 Store 组件类型
| 类型 |
枚举值 |
说明 |
核心表 |
| 插件(Atom) |
ATOM |
流水线可执行插件 |
T_ATOM |
| 模板(Template) |
TEMPLATE |
流水线模板 |
T_TEMPLATE |
| 镜像(Image) |
IMAGE |
容器构建镜像 |
T_IMAGE |
二、核心概念
2.1 插件(Atom)模型
┌─────────────────────────────────────────────────────────────────────────┐
│ 插件模型 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ T_ATOM(插件主表) │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ ATOM_CODE │ │ NAME │ │ VERSION │ │ │
│ │ │ (插件标识) │ │ (插件名称) │ │ (版本号) │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ ATOM_STATUS │ │ CLASS_TYPE │ │ LATEST_FLAG │ │ │
│ │ │ (插件状态) │ │ (插件大类) │ │ (最新版本) │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────┼────────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ T_ATOM_ENV_ │ │ T_ATOM_ │ │ T_ATOM_ │ │
│ │ INFO │ │ FEATURE │ │ VERSION_LOG │ │
│ │ (执行环境信息) │ │ (特性配置) │ │ (版本日志) │ │
│ └───────────────┘ └───────────────┘ └───────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
2.2 插件核心字段
| 字段 |
类型 |
说明 |
ID |
String |
插件版本 ID(UUID) |
ATOM_CODE |
String |
插件唯一标识(不变) |
NAME |
String |
插件名称 |
VERSION |
String |
版本号(如 1.0.0) |
ATOM_STATUS |
Int |
插件状态 |
CLASS_TYPE |
String |
插件大类(marketBuild 等) |
JOB_TYPE |
String |
适用 Job 类型(AGENT/AGENT_LESS) |
OS |
String |
支持的操作系统 |
CLASSIFY_ID |
String |
分类 ID |
LATEST_FLAG |
Boolean |
是否最新版本 |
DEFAULT_FLAG |
Boolean |
是否默认插件 |
PUBLISHER |
String |
发布者 |
REPOSITORY_HASH_ID |
String |
代码库 HashId |
2.3 插件状态流转
enum class AtomStatusEnum(val status: Int) {
INIT(0), // 初始化
COMMITTING(1), // 提交中
BUILDING(2), // 构建中
BUILD_FAIL(3), // 构建失败
TESTING(4), // 测试中
AUDITING(5), // 审核中
AUDIT_REJECT(6), // 审核驳回
RELEASED(7), // 已发布
GROUNDING_SUSPENSION(8), // 上架中止
UNDERCARRIAGING(9), // 下架中
UNDERCARRIAGED(10), // 已下架
}
┌─────────────────────────────────────────────────────────────────┐
│ 插件状态流转图 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ INIT ──► COMMITTING ──► BUILDING ──► TESTING ──► AUDITING │
│ │ │ │
│ ▼ ▼ │
│ BUILD_FAIL AUDIT_REJECT │
│ │ │
│ ▼ │
│ RELEASED │
│ │ │
│ ▼ │
│ UNDERCARRIAGING │
│ │ │
│ ▼ │
│ UNDERCARRIAGED │
│ │
└─────────────────────────────────────────────────────────────────┘
2.4 插件分类
// 插件大类
enum class AtomTypeEnum(val type: Int) {
SELF_DEVELOPED(0), // 自研
THIRD_PARTY(1), // 第三方
}
// Job 类型
enum class JobTypeEnum(val type: String) {
AGENT("AGENT"), // 有构建环境
AGENT_LESS("AGENT_LESS"), // 无构建环境
}
三、核心数据库表
3.1 插件相关表
| 表名 |
说明 |
核心字段 |
T_ATOM |
插件主表 |
ATOM_CODE, NAME, VERSION, ATOM_STATUS, LATEST_FLAG |
T_ATOM_ENV_INFO |
插件执行环境 |
ATOM_ID, PKG_PATH, LANGUAGE, TARGET |
T_ATOM_FEATURE |
插件特性 |
ATOM_CODE, VISIBILITY_LEVEL, YAML_FLAG, QUALITY_FLAG |
T_ATOM_BUILD_INFO |
插件构建信息 |
LANGUAGE, SCRIPT, SAMPLE_PROJECT_PATH |
T_ATOM_VERSION_LOG |
版本日志 |
ATOM_ID, RELEASE_TYPE, CONTENT |
T_ATOM_LABEL_REL |
插件标签关联 |
ATOM_ID, LABEL_ID |
T_ATOM_OFFLINE |
插件下架记录 |
ATOM_CODE, EXPIRE_TIME, STATUS |
3.2 模板相关表
| 表名 |
说明 |
核心字段 |
T_TEMPLATE |
模板主表 |
TEMPLATE_CODE, TEMPLATE_NAME, VERSION, TEMPLATE_STATUS |
T_TEMPLATE_CATEGORY_REL |
模板分类关联 |
TEMPLATE_ID, CATEGORY_ID |
T_TEMPLATE_LABEL_REL |
模板标签关联 |
TEMPLATE_ID, LABEL_ID |
3.3 镜像相关表
| 表名 |
说明 |
核心字段 |
T_IMAGE |
镜像主表 |
IMAGE_CODE, IMAGE_NAME, VERSION, IMAGE_STATUS |
T_IMAGE_CATEGORY_REL |
镜像分类关联 |
IMAGE_ID, CATEGORY_ID |
T_IMAGE_LABEL_REL |
镜像标签关联 |
IMAGE_ID, LABEL_ID |
3.4 通用表
| 表名 |
说明 |
T_CLASSIFY |
分类表 |
T_CATEGORY |
范畴表 |
T_LABEL |
标签表 |
T_STORE_MEMBER |
组件成员表 |
T_STORE_PROJECT_REL |
组件项目关联表 |
T_STORE_COMMENT |
评论表 |
T_STORE_COMMENT_REPLY |
评论回复表 |
T_STORE_COMMENT_PRAISE |
评论点赞表 |
T_STORE_STATISTICS |
统计表 |
T_STORE_APPROVE |
审批表 |
T_STORE_SENSITIVE_API |
敏感 API 表 |
T_STORE_SENSITIVE_CONF |
敏感配置表 |
3.5 容器编译环境表
| 表名 |
说明 |
T_APPS |
编译环境信息表 |
T_APP_ENV |
编译环境变量表 |
T_APP_VERSION |
编译环境版本表 |
T_CONTAINER |
容器信息表 |
T_BUILD_RESOURCE |
构建资源表 |
四、分层架构
┌─────────────────────────────────────────────────────────────────────────┐
│ 请求入口 │
└─────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ API 层 (api-store) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │UserMarket │ │ServiceAtom │ │UserTemplate │ │UserImage │ │
│ │AtomResource │ │Resource │ │Resource │ │Resource │ │
│ │(用户插件管理) │ │(服务间调用) │ │(模板管理) │ │(镜像管理) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │UserAtom │ │OpAtom │ │UserStore │ │
│ │ReleaseRes │ │Resource │ │MemberRes │ │
│ │(插件发布) │ │(运维管理) │ │(成员管理) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ 业务层 (biz-store) │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ 插件服务 (atom/service/) │ │
│ │ MarketAtomService - 插件市场服务 │ │
│ │ AtomReleaseService - 插件发布服务 │ │
│ │ AtomService - 插件基础服务 │ │
│ │ MarketAtomEnvService - 插件环境服务 │ │
│ │ MarketAtomArchiveService - 插件归档服务 │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ 通用服务 (common/service/) │ │
│ │ StoreCommentService - 评论服务 │ │
│ │ StoreMemberService - 成员管理服务 │ │
│ │ StoreProjectService - 项目关联服务 │ │
│ │ StoreStatisticService - 统计服务 │ │
│ │ StoreApproveService - 审批服务 │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ 处理器链 (common/handler/) │ │
│ │ StoreCreateHandlerChain - 创建处理器链 │ │
│ │ StoreUpdateHandlerChain - 更新处理器链 │ │
│ │ StoreDeleteHandlerChain - 删除处理器链 │ │
│ └──────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ DAO 层 (biz-store/dao) │
│ AtomDao (59KB) | MarketAtomDao (31KB) | StoreProjectRelDao (25KB) │
│ StoreBaseQueryDao (20KB) | MarketAtomEnvInfoDao | ... │
└─────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ 数据层 (model-store + MySQL) │
│ 数据库:devops_ci_store(共 50+ 张表) │
└─────────────────────────────────────────────────────────────────────────┘
五、核心类速查
5.1 API 接口层
| 类名 |
路径前缀 |
职责 |
UserMarketAtomResource |
/user/market/atom |
用户插件市场操作 |
UserAtomReleaseResource |
/user/market/atom/release |
插件发布 |
ServiceAtomResource |
/service/atoms |
服务间插件查询 |
ServiceMarketAtomResource |
/service/market/atom |
服务间市场插件 |
OpAtomResource |
/op/market/atom |
运维插件管理 |
UserTemplateResource |
/user/market/template |
模板管理 |
UserMarketImageResource |
/user/market/image |
镜像管理 |
UserStoreMemberResource |
/user/store/member |
成员管理 |
5.2 Service 层
| 类名 |
职责 |
MarketAtomService |
插件市场核心服务 |
AtomReleaseService |
插件发布流程 |
AtomService |
插件基础操作 |
MarketAtomEnvService |
插件执行环境 |
MarketAtomArchiveService |
插件归档 |
AtomCooperationService |
插件协作 |
AtomNotifyService |
插件通知 |
5.3 DAO 层
| 类名 |
文件大小 |
职责 |
AtomDao |
59KB |
插件主表访问(最大) |
MarketAtomDao |
31KB |
市场插件访问 |
StoreProjectRelDao |
25KB |
项目关联访问 |
StoreBaseQueryDao |
20KB |
基础查询 |
MarketAtomEnvInfoDao |
13KB |
插件环境访问 |
六、核心流程
6.1 插件发布流程
开发者提交发布请求
│
▼
UserAtomReleaseResource.createAtom()
│
▼
AtomReleaseService.handleAtomRelease()
│
├─► 参数校验
│ ├─► 校验插件代码唯一性
│ ├─► 校验版本号格式
│ └─► 校验代码库权限
│
├─► 创建插件记录
│ ├─► atomDao.create()
│ └─► 状态设为 INIT
│
├─► 触发构建流水线
│ └─► 调用 Process 模块构建插件包
│
├─► 构建完成回调
│ ├─► 更新状态为 TESTING
│ └─► 上传插件包到制品库
│
├─► 提交审核
│ └─► 状态设为 AUDITING
│
└─► 审核通过
├─► 状态设为 RELEASED
└─► 更新 LATEST_FLAG
6.2 插件安装流程
用户安装插件到项目
│
▼
UserMarketAtomResource.installAtom()
│
▼
MarketAtomService.installAtom()
│
├─► 权限校验
│ └─► 检查用户是否有项目权限
│
├─► 检查插件可见性
│ └─► 检查项目是否在可见范围内
│
├─► 创建关联记录
│ └─► storeProjectRelDao.create()
│
└─► 更新统计数据
└─► 增加安装量
6.3 处理器链模式
Store 模块使用责任链模式处理组件的创建、更新、删除:
// 创建处理器链
class StoreCreateHandlerChain {
private val handlers = listOf(
StoreCreateParamCheckHandler, // 参数校验
StoreCreatePreBusHandler, // 前置业务处理
StoreCreateDataPersistHandler, // 数据持久化
StoreCreatePostBusHandler // 后置业务处理
)
fun handle(context: StoreContext) {
handlers.forEach { it.handle(context) }
}
}
七、与其他模块的关系
7.1 依赖关系
┌─────────────────────────────────────────────────────────────────┐
│ Store 模块依赖关系 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────┐ │
│ │ store │ │
│ └───────┬───────┘ │
│ │ │
│ ┌──────────────────┼──────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│ │ project │ │repository │ │artifactory│ │
│ │ (项目信息) │ │ (代码库) │ │ (制品库) │ │
│ └───────────┘ └───────────┘ └───────────┘ │
│ │
│ 被依赖: │
│ - process(流水线使用插件) │
│ - worker(构建机执行插件) │
└─────────────────────────────────────────────────────────────────┘
7.2 服务间调用示例
// Process 模块获取插件信息
// 注意:projectCode 是 T_PROJECT.english_name
client.get(ServiceAtomResource::class).getAtomByCode(
atomCode = atomCode,
username = userId
)
// 获取插件执行环境
client.get(ServiceMarketAtomEnvResource::class).getAtomEnv(
projectCode = projectId, // english_name
atomCode = atomCode,
atomVersion = version
)
// 获取项目可用的插件列表
client.get(ServiceMarketAtomResource::class).getProjectElements(
projectCode = projectId
)
八、插件开发规范
8.1 插件目录结构
my-atom/
├── task.json # 插件配置文件
├── README.md # 插件说明
├── src/ # 源代码
│ └── main.py # 入口文件
├── requirements.txt # Python 依赖
└── logo.png # 插件图标
8.2 task.json 配置
{
"atomCode": "myAtom",
"execution": {
"language": "python",
"packagePath": "src/",
"target": "main.py"
},
"input": {
"param1": {
"label": "参数1",
"type": "vuex-input",
"required": true
}
},
"output": {
"output1": {
"type": "string",
"description": "输出参数"
}
}
}
8.3 插件开发语言支持
| 语言 |
说明 |
| Python |
推荐,有完善的 SDK |
| NodeJS |
支持 |
| Java |
支持 |
| Golang |
支持 |
九、开发规范
9.1 新增组件类型
- 在
StoreTypeEnum 添加新类型
- 创建对应的主表和关联表
- 创建 DAO、Service、Resource 层代码
- 在处理器链中注册新类型的处理器
9.2 插件查询示例
// 根据插件代码查询最新版本
val atom = atomDao.getLatestAtomByCode(
dslContext = dslContext,
atomCode = atomCode
)
// 查询项目可用的插件
val atoms = atomDao.getProjectAtoms(
dslContext = dslContext,
projectCode = projectId, // english_name
classifyCode = classifyCode
)
// 查询插件执行环境
val envInfo = marketAtomEnvInfoDao.getMarketAtomEnvInfo(
dslContext = dslContext,
atomId = atomId
)
十、常见问题
Q: atomCode 和 atomId 的区别?
A: atomCode 是插件唯一标识(不变),atomId 是具体版本的 ID(每个版本不同)。
Q: 如何判断插件是否可用?
A: 检查 ATOM_STATUS = 7(RELEASED)且 LATEST_FLAG = true。
Q: 插件如何关联到项目?
A: 通过 T_STORE_PROJECT_REL 表关联,STORE_CODE 存储 atomCode。
Q: 如何获取插件的执行环境?
A: 查询 T_ATOM_ENV_INFO 表,根据 ATOM_ID 获取 PKG_PATH、TARGET 等信息。
版本: 1.0.0 | 更新日期: 2025-12-11