store-module-architecture

安装量: 35
排名: #19728

安装

npx skills add https://github.com/tencentblueking/bk-ci --skill store-module-architecture
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
返回排行榜