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