29-4-process-dao-database
Process 模块 DAO 层与数据库表结构详细分析,涵盖 JOOQ 使用、表结构设计、索引优化、数据分片。当用户开发 Process 数据访问、设计表结构、优化查询性能或处理数据存储时使用。
When & Why to Use This Skill
This Claude skill provides a comprehensive technical analysis of the Process module's DAO (Data Access Object) layer and database architecture. It covers JOOQ implementation, detailed table schema design, index optimization strategies, and data sharding techniques. It is specifically optimized for developers working on high-concurrency CI/CD engines, offering deep insights into managing pipeline metadata, build histories, and execution records for maximum performance and scalability.
Use Cases
- Database Schema Design: Providing architectural guidance for designing and extending relational tables to support complex CI/CD pipeline models.
- Performance Tuning: Optimizing SQL queries and indexing strategies for large-scale tables like T_PIPELINE_BUILD_HISTORY to reduce latency in high-load environments.
- JOOQ Integration: Assisting developers in implementing type-safe, maintainable DAO layers using JOOQ within Kotlin-based backend services.
- Execution vs. Record Separation: Implementing the architectural pattern of separating real-time engine execution tables (BUILD) from historical query tables (RECORD) to improve system throughput.
- Data Sharding & Scalability: Applying data sharding and partitioning strategies to handle massive volumes of build logs and pipeline execution data.
| name | 29-4-process-dao-database |
|---|---|
| description | Process 模块 DAO 层与数据库表结构详细分析,涵盖 JOOQ 使用、表结构设计、索引优化、数据分片。当用户开发 Process 数据访问、设计表结构、优化查询性能或处理数据存储时使用。 |
Process 模块 DAO 层与数据库表结构详细分析
模块路径:
src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/dao/数据库:devops_process
一、DAO 层概述
1.1 目录结构
biz-base/src/main/kotlin/com/tencent/devops/process/engine/dao/
├── PipelineInfoDao.kt # 流水线信息 (29KB)
├── PipelineBuildDao.kt # 构建历史 (85KB) - 最大
├── PipelineBuildSummaryDao.kt # 构建摘要 (27KB)
├── PipelineBuildContainerDao.kt # 构建容器 (14KB)
├── PipelineBuildStageDao.kt # 构建阶段 (14KB)
├── PipelineBuildTaskDao.kt # 构建任务 (18KB)
├── PipelineBuildVarDao.kt # 构建变量 (9KB)
├── PipelineResourceDao.kt # 流水线资源/模型 (12KB)
├── PipelineResourceVersionDao.kt # 资源版本 (29KB)
├── PipelineModelTaskDao.kt # 模型任务索引 (16KB)
├── PipelineOperationLogDao.kt # 操作日志 (6KB)
├── PipelinePauseValueDao.kt # 暂停值 (5KB)
├── PipelineWebhookDao.kt # Webhook (12KB)
├── PipelineWebhookVersionDao.kt # Webhook 版本 (4KB)
├── PipelineJobMutexGroupDao.kt # 互斥组 (3KB)
├── PipelineRuleDao.kt # 规则 (6KB)
├── PipelineTriggerReviewDao.kt # 触发审核 (3KB)
├── SubPipelineRefDao.kt # 子流水线引用 (6KB)
├── WebhookBuildParameterDao.kt # Webhook 参数 (1KB)
└── template/
├── TemplateDao.kt # 模板 (24KB)
└── TemplatePipelineDao.kt # 模板流水线 (16KB)
1.2 DAO 类与表映射
| DAO 类 | 主表 | 职责 |
|---|---|---|
PipelineInfoDao |
T_PIPELINE_INFO |
流水线基本信息 |
PipelineBuildDao |
T_PIPELINE_BUILD_HISTORY |
构建历史记录 |
PipelineBuildSummaryDao |
T_PIPELINE_BUILD_SUMMARY |
构建摘要统计 |
PipelineBuildContainerDao |
T_PIPELINE_BUILD_CONTAINER |
构建容器记录 |
PipelineBuildStageDao |
T_PIPELINE_BUILD_STAGE |
构建阶段记录 |
PipelineBuildTaskDao |
T_PIPELINE_BUILD_TASK |
构建任务记录 |
PipelineBuildVarDao |
T_PIPELINE_BUILD_VAR |
构建变量 |
PipelineResourceDao |
T_PIPELINE_RESOURCE |
流水线模型(JSON) |
PipelineResourceVersionDao |
T_PIPELINE_RESOURCE_VERSION |
模型版本历史 |
PipelineModelTaskDao |
T_PIPELINE_MODEL_TASK |
模型任务索引 |
TemplateDao |
T_TEMPLATE |
流水线模板 |
TemplatePipelineDao |
T_TEMPLATE_PIPELINE |
模板实例关系 |
二、核心数据库表结构
2.1 T_PIPELINE_INFO - 流水线信息表
CREATE TABLE `T_PIPELINE_INFO` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT,
`PIPELINE_ID` varchar(34) NOT NULL COMMENT '流水线ID',
`PROJECT_ID` varchar(64) NOT NULL COMMENT '项目ID',
`PIPELINE_NAME` varchar(255) NOT NULL COMMENT '流水线名称',
`PIPELINE_DESC` varchar(255) DEFAULT '' COMMENT '流水线描述',
`VERSION` int(11) NOT NULL DEFAULT '1' COMMENT '版本号',
`CREATE_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`UPDATE_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
`CREATOR` varchar(64) NOT NULL COMMENT '创建者',
`LAST_MODIFY_USER` varchar(64) NOT NULL COMMENT '最后修改人',
`CHANNEL` varchar(32) NOT NULL DEFAULT 'BS' COMMENT '渠道',
`MANUAL_STARTUP` int(11) DEFAULT '1' COMMENT '是否手动启动',
`ELEMENT_SKIP` int(11) DEFAULT '0' COMMENT '是否允许跳过插件',
`TASK_COUNT` int(11) DEFAULT '0' COMMENT '任务数量',
`DELETE` bit(1) DEFAULT b'0' COMMENT '是否删除',
`DELETE_TIME` datetime DEFAULT NULL COMMENT '删除时间',
`LATEST_VERSION_STATUS` varchar(64) DEFAULT 'RELEASED' COMMENT '最新版本状态',
`LOCKED` bit(1) DEFAULT b'0' COMMENT '是否锁定',
PRIMARY KEY (`ID`),
UNIQUE KEY `UNI_PIPELINE_ID` (`PIPELINE_ID`),
KEY `IDX_PROJECT_ID` (`PROJECT_ID`),
KEY `IDX_CHANNEL` (`CHANNEL`),
KEY `IDX_DELETE` (`DELETE`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流水线信息表';
关键字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
PIPELINE_ID |
varchar(34) | 流水线唯一标识,格式:p-{uuid} |
PROJECT_ID |
varchar(64) | 所属项目 ID |
VERSION |
int | 当前发布版本号 |
CHANNEL |
varchar(32) | 渠道:BS(蓝盾)、CODECC、GIT 等 |
DELETE |
bit | 软删除标记 |
LATEST_VERSION_STATUS |
varchar(64) | RELEASED/COMMITTING/BRANCH_RELEASE |
2.2 T_PIPELINE_BUILD_HISTORY - 构建历史表
CREATE TABLE `T_PIPELINE_BUILD_HISTORY` (
`BUILD_ID` varchar(34) NOT NULL COMMENT '构建ID',
`PROJECT_ID` varchar(64) NOT NULL COMMENT '项目ID',
`PIPELINE_ID` varchar(34) NOT NULL COMMENT '流水线ID',
`PARENT_BUILD_ID` varchar(34) DEFAULT NULL COMMENT '父构建ID',
`PARENT_TASK_ID` varchar(34) DEFAULT NULL COMMENT '父任务ID',
`BUILD_NUM` int(11) NOT NULL COMMENT '构建号',
`TRIGGER` varchar(32) NOT NULL COMMENT '触发方式',
`STATUS` int(11) NOT NULL COMMENT '构建状态',
`START_USER` varchar(64) DEFAULT NULL COMMENT '启动用户',
`TRIGGER_USER` varchar(64) DEFAULT NULL COMMENT '触发用户',
`START_TIME` datetime DEFAULT NULL COMMENT '开始时间',
`END_TIME` datetime DEFAULT NULL COMMENT '结束时间',
`QUEUE_TIME` datetime DEFAULT NULL COMMENT '排队时间',
`TASK_COUNT` int(11) DEFAULT NULL COMMENT '任务数',
`FIRST_TASK_ID` varchar(34) DEFAULT NULL COMMENT '第一个任务ID',
`CHANNEL` varchar(32) DEFAULT 'BS' COMMENT '渠道',
`VERSION` int(11) DEFAULT NULL COMMENT '流水线版本',
`EXECUTE_TIME` bigint(20) DEFAULT NULL COMMENT '执行耗时(毫秒)',
`BUILD_PARAMETERS` mediumtext COMMENT '构建参数(JSON)',
`WEBHOOK_TYPE` varchar(32) DEFAULT NULL COMMENT 'Webhook类型',
`RECOMMEND_VERSION` varchar(64) DEFAULT NULL COMMENT '推荐版本号',
`ERROR_INFO` text COMMENT '错误信息',
`BUILD_MSG` varchar(255) DEFAULT NULL COMMENT '构建信息',
`BUILD_NUM_ALIAS` varchar(256) DEFAULT NULL COMMENT '构建号别名',
`CONCURRENCY_GROUP` varchar(255) DEFAULT NULL COMMENT '并发组',
`EXECUTE_COUNT` int(11) DEFAULT '1' COMMENT '执行次数',
`RETRY_FLAG` bit(1) DEFAULT b'0' COMMENT '是否重试',
`DEBUG_BUILD` bit(1) DEFAULT b'0' COMMENT '是否调试构建',
PRIMARY KEY (`BUILD_ID`),
KEY `IDX_PROJECT_PIPELINE` (`PROJECT_ID`, `PIPELINE_ID`),
KEY `IDX_STATUS` (`STATUS`),
KEY `IDX_START_TIME` (`START_TIME`),
KEY `IDX_BUILD_NUM` (`BUILD_NUM`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流水线构建历史表';
关键字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
BUILD_ID |
varchar(34) | 构建唯一标识,格式:b-{uuid} |
BUILD_NUM |
int | 构建号,自增 |
TRIGGER |
varchar(32) | 触发方式:MANUAL/TIME_TRIGGER/WEB_HOOK 等 |
STATUS |
int | 构建状态码(见 BuildStatus 枚举) |
BUILD_PARAMETERS |
mediumtext | 构建参数 JSON |
EXECUTE_COUNT |
int | 执行次数(重试时递增) |
BuildStatus 状态码:
| 状态码 | 名称 | 说明 |
|---|---|---|
| 0 | SUCCEED | 成功 |
| 1 | FAILED | 失败 |
| 2 | CANCELED | 取消 |
| 3 | RUNNING | 运行中 |
| 4 | TERMINATE | 终止 |
| 5 | REVIEWING | 审核中 |
| 6 | REVIEW_ABORT | 审核驳回 |
| 7 | REVIEW_PROCESSED | 审核通过 |
| 8 | HEARTBEAT_TIMEOUT | 心跳超时 |
| 9 | PREPARE_ENV | 准备环境 |
| 10 | UNEXEC | 未执行 |
| 11 | SKIP | 跳过 |
| 12 | QUALITY_CHECK_FAIL | 质量红线失败 |
| 13 | QUEUE | 排队中 |
| 14 | LOOP_WAITING | 循环等待 |
| 15 | CALL_WAITING | 调用等待 |
| 16 | TRY_FINALLY | 执行 finally |
| 17 | QUEUE_TIMEOUT | 排队超时 |
| 18 | EXEC_TIMEOUT | 执行超时 |
| 19 | QUEUE_CACHE | 排队缓存 |
| 20 | RETRY | 重试中 |
| 21 | PAUSE | 暂停 |
| 22 | STAGE_SUCCESS | 阶段成功 |
| 23 | QUOTA_FAILED | 配额失败 |
| 24 | DEPENDENT_WAITING | 依赖等待 |
| 25 | QUALITY_REVIEWING | 质量审核中 |
| 26 | WAIT_QUEUE | 等待排队 |
2.3 T_PIPELINE_BUILD_SUMMARY - 构建摘要表
CREATE TABLE `T_PIPELINE_BUILD_SUMMARY` (
`PIPELINE_ID` varchar(34) NOT NULL COMMENT '流水线ID',
`PROJECT_ID` varchar(64) NOT NULL COMMENT '项目ID',
`BUILD_NUM` int(11) NOT NULL DEFAULT '0' COMMENT '构建号',
`BUILD_NO` int(11) DEFAULT '0' COMMENT '构建序号',
`FINISH_COUNT` int(11) DEFAULT '0' COMMENT '完成次数',
`RUNNING_COUNT` int(11) DEFAULT '0' COMMENT '运行次数',
`QUEUE_COUNT` int(11) DEFAULT '0' COMMENT '排队次数',
`LATEST_BUILD_ID` varchar(34) DEFAULT NULL COMMENT '最新构建ID',
`LATEST_TASK_ID` varchar(34) DEFAULT NULL COMMENT '最新任务ID',
`LATEST_START_USER` varchar(64) DEFAULT NULL COMMENT '最新启动用户',
`LATEST_START_TIME` datetime DEFAULT NULL COMMENT '最新开始时间',
`LATEST_END_TIME` datetime DEFAULT NULL COMMENT '最新结束时间',
`LATEST_TASK_COUNT` int(11) DEFAULT NULL COMMENT '最新任务数',
`LATEST_TASK_NAME` varchar(128) DEFAULT NULL COMMENT '最新任务名',
`LATEST_STATUS` int(11) DEFAULT NULL COMMENT '最新状态',
`BUILD_NUM_ALIAS` varchar(256) DEFAULT NULL COMMENT '构建号别名',
`DEBUG_BUILD_NUM` int(11) DEFAULT '0' COMMENT '调试构建号',
PRIMARY KEY (`PIPELINE_ID`),
KEY `IDX_PROJECT_ID` (`PROJECT_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流水线构建摘要表';
2.4 T_PIPELINE_BUILD_STAGE - 构建阶段表
CREATE TABLE `T_PIPELINE_BUILD_STAGE` (
`PROJECT_ID` varchar(64) NOT NULL COMMENT '项目ID',
`PIPELINE_ID` varchar(34) NOT NULL COMMENT '流水线ID',
`BUILD_ID` varchar(34) NOT NULL COMMENT '构建ID',
`STAGE_ID` varchar(34) NOT NULL COMMENT '阶段ID',
`SEQ` int(11) NOT NULL COMMENT '序号',
`STATUS` int(11) DEFAULT NULL COMMENT '状态',
`START_TIME` datetime DEFAULT NULL COMMENT '开始时间',
`END_TIME` datetime DEFAULT NULL COMMENT '结束时间',
`COST` int(11) DEFAULT '0' COMMENT '耗时(秒)',
`EXECUTE_COUNT` int(11) DEFAULT '1' COMMENT '执行次数',
`CONDITIONS` mediumtext COMMENT '执行条件(JSON)',
`CHECK_IN` mediumtext COMMENT '准入配置(JSON)',
`CHECK_OUT` mediumtext COMMENT '准出配置(JSON)',
PRIMARY KEY (`BUILD_ID`, `STAGE_ID`),
KEY `IDX_PROJECT_PIPELINE` (`PROJECT_ID`, `PIPELINE_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流水线构建阶段表';
2.5 T_PIPELINE_BUILD_CONTAINER - 构建容器表
CREATE TABLE `T_PIPELINE_BUILD_CONTAINER` (
`PROJECT_ID` varchar(64) NOT NULL COMMENT '项目ID',
`PIPELINE_ID` varchar(34) NOT NULL COMMENT '流水线ID',
`BUILD_ID` varchar(34) NOT NULL COMMENT '构建ID',
`STAGE_ID` varchar(34) NOT NULL COMMENT '阶段ID',
`CONTAINER_ID` varchar(34) NOT NULL COMMENT '容器ID',
`CONTAINER_TYPE` varchar(45) NOT NULL COMMENT '容器类型',
`SEQ` int(11) NOT NULL COMMENT '序号',
`STATUS` int(11) DEFAULT NULL COMMENT '状态',
`START_TIME` datetime DEFAULT NULL COMMENT '开始时间',
`END_TIME` datetime DEFAULT NULL COMMENT '结束时间',
`COST` int(11) DEFAULT '0' COMMENT '耗时(秒)',
`EXECUTE_COUNT` int(11) DEFAULT '1' COMMENT '执行次数',
`CONDITIONS` mediumtext COMMENT '执行条件(JSON)',
`CONTAINER_HASH_ID` varchar(64) DEFAULT NULL COMMENT '容器哈希ID',
`MATRIX_GROUP_FLAG` bit(1) DEFAULT b'0' COMMENT '是否矩阵组',
`MATRIX_GROUP_ID` varchar(64) DEFAULT NULL COMMENT '矩阵组ID',
PRIMARY KEY (`BUILD_ID`, `CONTAINER_ID`),
KEY `IDX_PROJECT_PIPELINE` (`PROJECT_ID`, `PIPELINE_ID`),
KEY `IDX_STAGE_ID` (`STAGE_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流水线构建容器表';
2.6 T_PIPELINE_BUILD_TASK - 构建任务表
CREATE TABLE `T_PIPELINE_BUILD_TASK` (
`PROJECT_ID` varchar(64) NOT NULL COMMENT '项目ID',
`PIPELINE_ID` varchar(34) NOT NULL COMMENT '流水线ID',
`BUILD_ID` varchar(34) NOT NULL COMMENT '构建ID',
`STAGE_ID` varchar(34) NOT NULL COMMENT '阶段ID',
`CONTAINER_ID` varchar(34) NOT NULL COMMENT '容器ID',
`TASK_ID` varchar(34) NOT NULL COMMENT '任务ID',
`TASK_NAME` varchar(128) DEFAULT NULL COMMENT '任务名称',
`TASK_TYPE` varchar(64) NOT NULL COMMENT '任务类型',
`TASK_ATOM` varchar(128) DEFAULT NULL COMMENT '任务插件',
`ATOM_CODE` varchar(128) DEFAULT NULL COMMENT '插件代码',
`CLASS_TYPE` varchar(64) DEFAULT NULL COMMENT '类类型',
`TASK_SEQ` int(11) DEFAULT '1' COMMENT '任务序号',
`STATUS` int(11) DEFAULT NULL COMMENT '状态',
`STARTER` varchar(64) DEFAULT NULL COMMENT '启动者',
`APPROVER` varchar(64) DEFAULT NULL COMMENT '审批者',
`SUB_PROJECT_ID` varchar(64) DEFAULT NULL COMMENT '子项目ID',
`SUB_BUILD_ID` varchar(34) DEFAULT NULL COMMENT '子构建ID',
`START_TIME` datetime DEFAULT NULL COMMENT '开始时间',
`END_TIME` datetime DEFAULT NULL COMMENT '结束时间',
`EXECUTE_COUNT` int(11) DEFAULT '0' COMMENT '执行次数',
`TASK_PARAMS` mediumtext COMMENT '任务参数(JSON)',
`ADDITIONAL_OPTIONS` mediumtext COMMENT '附加选项(JSON)',
`TOTAL_TIME` bigint(20) DEFAULT NULL COMMENT '总耗时(毫秒)',
`ERROR_TYPE` int(11) DEFAULT NULL COMMENT '错误类型',
`ERROR_CODE` int(11) DEFAULT NULL COMMENT '错误码',
`ERROR_MSG` text COMMENT '错误信息',
`CONTAINER_HASH_ID` varchar(64) DEFAULT NULL COMMENT '容器哈希ID',
`STEP_ID` varchar(64) DEFAULT NULL COMMENT '步骤ID',
PRIMARY KEY (`BUILD_ID`, `TASK_ID`),
KEY `IDX_PROJECT_PIPELINE` (`PROJECT_ID`, `PIPELINE_ID`),
KEY `IDX_CONTAINER_ID` (`CONTAINER_ID`),
KEY `IDX_STATUS` (`STATUS`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流水线构建任务表';
2.7 T_PIPELINE_RESOURCE - 流水线资源表
CREATE TABLE `T_PIPELINE_RESOURCE` (
`PROJECT_ID` varchar(64) NOT NULL COMMENT '项目ID',
`PIPELINE_ID` varchar(34) NOT NULL COMMENT '流水线ID',
`VERSION` int(11) NOT NULL DEFAULT '1' COMMENT '版本',
`MODEL` mediumtext COMMENT '流水线模型(JSON)',
`YAML` mediumtext COMMENT 'YAML内容',
`CREATOR` varchar(64) DEFAULT NULL COMMENT '创建者',
`CREATE_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`PIPELINE_ID`, `VERSION`),
KEY `IDX_PROJECT_ID` (`PROJECT_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流水线资源表';
MODEL 字段示例:
{
"name": "示例流水线",
"desc": "流水线描述",
"stages": [
{
"id": "stage-1",
"name": "Stage-1",
"containers": [
{
"id": "1",
"@type": "trigger",
"name": "构建触发",
"elements": [
{
"id": "T-1-1-1",
"@type": "manualTrigger",
"name": "手动触发"
}
]
}
]
},
{
"id": "stage-2",
"name": "Stage-2",
"containers": [
{
"id": "2",
"@type": "vmBuild",
"name": "Linux构建机",
"baseOS": "LINUX",
"elements": [
{
"id": "T-2-1-1",
"@type": "linuxScript",
"name": "Shell脚本",
"script": "echo hello"
}
]
}
]
}
]
}
2.8 T_PIPELINE_BUILD_VAR - 构建变量表
CREATE TABLE `T_PIPELINE_BUILD_VAR` (
`BUILD_ID` varchar(34) NOT NULL COMMENT '构建ID',
`KEY` varchar(255) NOT NULL COMMENT '变量名',
`VALUE` mediumtext COMMENT '变量值',
`PROJECT_ID` varchar(64) DEFAULT NULL COMMENT '项目ID',
`PIPELINE_ID` varchar(34) DEFAULT NULL COMMENT '流水线ID',
`VAR_TYPE` varchar(64) DEFAULT NULL COMMENT '变量类型',
`READ_ONLY` bit(1) DEFAULT NULL COMMENT '是否只读',
PRIMARY KEY (`BUILD_ID`, `KEY`),
KEY `IDX_PROJECT_PIPELINE` (`PROJECT_ID`, `PIPELINE_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流水线构建变量表';
2.9 T_TEMPLATE - 模板表
CREATE TABLE `T_TEMPLATE` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT,
`TYPE` varchar(32) NOT NULL DEFAULT 'CUSTOMIZE' COMMENT '模板类型',
`TEMPLATE_ID` varchar(34) NOT NULL COMMENT '模板ID',
`TEMPLATE_NAME` varchar(64) NOT NULL COMMENT '模板名称',
`VERSION_NAME` varchar(64) NOT NULL COMMENT '版本名称',
`VERSION` bigint(20) NOT NULL DEFAULT '1' COMMENT '版本号',
`LOGO_URL` varchar(512) DEFAULT NULL COMMENT 'Logo URL',
`PROJECT_ID` varchar(64) NOT NULL COMMENT '项目ID',
`SRC_TEMPLATE_ID` varchar(34) DEFAULT NULL COMMENT '源模板ID',
`DESC` varchar(1024) DEFAULT NULL COMMENT '描述',
`CATEGORY` varchar(128) DEFAULT NULL COMMENT '分类',
`CREATOR` varchar(64) NOT NULL COMMENT '创建者',
`CREATE_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`TEMPLATE` mediumtext COMMENT '模板内容(JSON)',
`STORE_FLAG` bit(1) DEFAULT b'0' COMMENT '是否商店模板',
PRIMARY KEY (`ID`),
UNIQUE KEY `UNI_TEMPLATE_VERSION` (`TEMPLATE_ID`, `VERSION`),
KEY `IDX_PROJECT_ID` (`PROJECT_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流水线模板表';
三、核心 DAO 类详解
3.1 PipelineInfoDao
文件: PipelineInfoDao.kt (29KB)
@Repository
class PipelineInfoDao {
fun create(
dslContext: DSLContext,
pipelineId: String,
projectId: String,
version: Int,
pipelineName: String,
pipelineDesc: String,
userId: String,
channelCode: ChannelCode,
manualStartup: Boolean,
canElementSkip: Boolean,
taskCount: Int
): Int {
with(T_PIPELINE_INFO) {
dslContext.insertInto(this,
PIPELINE_ID, PROJECT_ID, VERSION, PIPELINE_NAME, PIPELINE_DESC,
CREATE_TIME, UPDATE_TIME, CHANNEL, CREATOR, LAST_MODIFY_USER,
MANUAL_STARTUP, ELEMENT_SKIP, TASK_COUNT
).values(
pipelineId, projectId, version, pipelineName, pipelineDesc,
LocalDateTime.now(), LocalDateTime.now(), channelCode.name, userId, userId,
if (manualStartup) 1 else 0, if (canElementSkip) 1 else 0, taskCount
).execute()
}
return version
}
fun getPipelineInfo(
dslContext: DSLContext,
projectId: String,
pipelineId: String
): TPipelineInfoRecord? {
return with(T_PIPELINE_INFO) {
dslContext.selectFrom(this)
.where(PROJECT_ID.eq(projectId))
.and(PIPELINE_ID.eq(pipelineId))
.and(DELETE.eq(false))
.fetchOne()
}
}
fun listPipelineIdByProject(
dslContext: DSLContext,
projectId: String,
channelCode: ChannelCode? = null
): List<String> {
return with(T_PIPELINE_INFO) {
val query = dslContext.select(PIPELINE_ID)
.from(this)
.where(PROJECT_ID.eq(projectId))
.and(DELETE.eq(false))
channelCode?.let { query.and(CHANNEL.eq(it.name)) }
query.fetch(PIPELINE_ID)
}
}
fun softDelete(
dslContext: DSLContext,
projectId: String,
pipelineId: String,
userId: String
): Int {
return with(T_PIPELINE_INFO) {
dslContext.update(this)
.set(DELETE, true)
.set(DELETE_TIME, LocalDateTime.now())
.set(LAST_MODIFY_USER, userId)
.where(PROJECT_ID.eq(projectId))
.and(PIPELINE_ID.eq(pipelineId))
.execute()
}
}
}
3.2 PipelineBuildDao
文件: PipelineBuildDao.kt (85KB) - 最大的 DAO 文件
@Repository
class PipelineBuildDao {
fun create(
dslContext: DSLContext,
projectId: String,
pipelineId: String,
buildId: String,
version: Int,
buildNum: Int,
trigger: String,
status: BuildStatus,
startUser: String,
triggerUser: String,
buildParameters: String? = null
) {
with(T_PIPELINE_BUILD_HISTORY) {
dslContext.insertInto(this,
BUILD_ID, PROJECT_ID, PIPELINE_ID, VERSION, BUILD_NUM,
TRIGGER, STATUS, START_USER, TRIGGER_USER, QUEUE_TIME,
BUILD_PARAMETERS
).values(
buildId, projectId, pipelineId, version, buildNum,
trigger, status.ordinal, startUser, triggerUser, LocalDateTime.now(),
buildParameters
).execute()
}
}
fun getBuildInfo(
dslContext: DSLContext,
projectId: String,
buildId: String
): BuildInfo? {
return with(T_PIPELINE_BUILD_HISTORY) {
dslContext.selectFrom(this)
.where(PROJECT_ID.eq(projectId))
.and(BUILD_ID.eq(buildId))
.fetchOne()?.let { convert(it) }
}
}
fun updateStatus(
dslContext: DSLContext,
projectId: String,
buildId: String,
status: BuildStatus,
startTime: LocalDateTime? = null,
endTime: LocalDateTime? = null
): Int {
return with(T_PIPELINE_BUILD_HISTORY) {
val update = dslContext.update(this)
.set(STATUS, status.ordinal)
startTime?.let { update.set(START_TIME, it) }
endTime?.let { update.set(END_TIME, it) }
update.where(PROJECT_ID.eq(projectId))
.and(BUILD_ID.eq(buildId))
.execute()
}
}
fun listBuildHistory(
dslContext: DSLContext,
projectId: String,
pipelineId: String,
offset: Int,
limit: Int
): List<BuildHistory> {
return with(T_PIPELINE_BUILD_HISTORY) {
dslContext.selectFrom(this)
.where(PROJECT_ID.eq(projectId))
.and(PIPELINE_ID.eq(pipelineId))
.orderBy(BUILD_NUM.desc())
.offset(offset)
.limit(limit)
.fetch()
.map { convertToHistory(it) }
}
}
}
3.3 PipelineResourceDao
文件: PipelineResourceDao.kt (12KB)
@Repository
class PipelineResourceDao {
fun create(
dslContext: DSLContext,
projectId: String,
pipelineId: String,
version: Int,
model: String,
creator: String
) {
with(T_PIPELINE_RESOURCE) {
dslContext.insertInto(this,
PROJECT_ID, PIPELINE_ID, VERSION, MODEL, CREATOR, CREATE_TIME
).values(
projectId, pipelineId, version, model, creator, LocalDateTime.now()
).execute()
}
}
fun getModel(
dslContext: DSLContext,
projectId: String,
pipelineId: String,
version: Int? = null
): String? {
return with(T_PIPELINE_RESOURCE) {
val query = dslContext.select(MODEL)
.from(this)
.where(PROJECT_ID.eq(projectId))
.and(PIPELINE_ID.eq(pipelineId))
version?.let { query.and(VERSION.eq(it)) }
?: query.orderBy(VERSION.desc()).limit(1)
query.fetchOne()?.value1()
}
}
}
四、数据库表关系图
┌─────────────────────────────────────────────────────────────────────────┐
│ T_PIPELINE_INFO │
│ (流水线基本信息) │
│ PIPELINE_ID ──────────────────────────────────────────────────────────┐ │
└─────────────────────────────────────────────────────────────────────────┘ │
│ │
│ 1:N │
▼ │
┌─────────────────────────────────────────────────────────────────────────┐ │
│ T_PIPELINE_RESOURCE │ │
│ (流水线模型/版本) │ │
│ PIPELINE_ID + VERSION (PK) │ │
│ MODEL (JSON) ← 存储完整的流水线编排模型 │ │
└─────────────────────────────────────────────────────────────────────────┘ │
│ │
│ 1:1 │
▼ │
┌─────────────────────────────────────────────────────────────────────────┐ │
│ T_PIPELINE_BUILD_SUMMARY │ │
│ (构建摘要/统计) │ │
│ PIPELINE_ID (PK) ← 每个流水线一条记录 │ │
│ BUILD_NUM ← 自增构建号 │ │
│ LATEST_BUILD_ID ← 最新构建 │ │
└─────────────────────────────────────────────────────────────────────────┘ │
│ │
│ 1:N │
▼ │
┌─────────────────────────────────────────────────────────────────────────┐ │
│ T_PIPELINE_BUILD_HISTORY │◄┘
│ (构建历史) │
│ BUILD_ID (PK) │
│ PIPELINE_ID (FK) ────────────────────────────────────────────────────┘
│ BUILD_NUM, STATUS, START_TIME, END_TIME │
└─────────────────────────────────────────────────────────────────────────┘
│
│ 1:N
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ T_PIPELINE_BUILD_STAGE │
│ (构建阶段) │
│ BUILD_ID + STAGE_ID (PK) │
│ SEQ, STATUS, CONDITIONS │
└─────────────────────────────────────────────────────────────────────────┘
│
│ 1:N
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ T_PIPELINE_BUILD_CONTAINER │
│ (构建容器/Job) │
│ BUILD_ID + CONTAINER_ID (PK) │
│ STAGE_ID (FK), SEQ, STATUS, CONTAINER_TYPE │
└─────────────────────────────────────────────────────────────────────────┘
│
│ 1:N
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ T_PIPELINE_BUILD_TASK │
│ (构建任务/插件) │
│ BUILD_ID + TASK_ID (PK) │
│ CONTAINER_ID (FK), TASK_SEQ, STATUS, TASK_PARAMS │
└─────────────────────────────────────────────────────────────────────────┘
│
│ 1:N
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ T_PIPELINE_BUILD_VAR │
│ (构建变量) │
│ BUILD_ID + KEY (PK) │
│ VALUE, VAR_TYPE, READ_ONLY │
└─────────────────────────────────────────────────────────────────────────┘
五、RECORD 系列表(构建执行记录)
重要: BK-CI 有两套构建记录表,BUILD 系列用于引擎执行调度,RECORD 系列用于前端展示和历史查询。
5.1 两套表的设计目的
┌─────────────────────────────────────────────────────────────────────────────┐
│ BUILD 系列表(引擎执行用) │
│ T_PIPELINE_BUILD_STAGE / CONTAINER / TASK │
│ • 用于引擎调度和执行控制 │
│ • 记录当前构建的实时状态 │
│ • 每次构建只有一份记录(重试时覆盖更新) │
└─────────────────────────────────────────────────────────────────────────────┘
│
│ 区别
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ RECORD 系列表(历史记录用) │
│ T_PIPELINE_BUILD_RECORD_MODEL / STAGE / CONTAINER / TASK │
│ • 用于前端展示和历史查询 │
│ • 支持多次执行记录(EXECUTE_COUNT 区分) │
│ • 保留每次执行的完整快照 │
└─────────────────────────────────────────────────────────────────────────────┘
5.2 T_PIPELINE_BUILD_RECORD_MODEL - 构建模型记录
CREATE TABLE IF NOT EXISTS `T_PIPELINE_BUILD_RECORD_MODEL` (
`BUILD_ID` varchar(34) NOT NULL COMMENT '构建ID',
`PROJECT_ID` varchar(64) NOT NULL DEFAULT '' COMMENT '项目ID',
`PIPELINE_ID` varchar(34) NOT NULL DEFAULT '' COMMENT '流水线ID',
`RESOURCE_VERSION` int(11) NOT NULL COMMENT '编排版本',
`BUILD_NUM` int(20) NOT NULL COMMENT '构建次数',
`EXECUTE_COUNT` int(11) NOT NULL COMMENT '执行次数',
`START_USER` varchar(32) NOT NULL DEFAULT '' COMMENT '启动者',
`MODEL_VAR` mediumtext NOT NULL COMMENT '当次执行的变量记录',
`START_TYPE` varchar(32) NOT NULL DEFAULT '' COMMENT '触发方式',
`QUEUE_TIME` datetime(3) NOT NULL COMMENT '触发时间',
`START_TIME` datetime(3) NULL COMMENT '启动时间',
`END_TIME` datetime(3) NULL COMMENT '结束时间',
`STATUS` varchar(32) DEFAULT NULL COMMENT '构建状态',
`ERROR_INFO` text COMMENT '错误信息',
`CANCEL_USER` varchar(32) DEFAULT NULL COMMENT '取消者',
`TIMESTAMPS` text COMMENT '运行中产生的时间戳集合',
PRIMARY KEY (`BUILD_ID`, `EXECUTE_COUNT`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流水线构建详情表';
关键字段说明:
| 字段 | 说明 |
|---|---|
EXECUTE_COUNT |
执行次数,支持同一构建多次重试的记录 |
RESOURCE_VERSION |
使用的流水线编排版本 |
MODEL_VAR |
模型级别的变量(如 timeCost) |
TIMESTAMPS |
时间戳集合(排队、启动、结束等) |
5.3 T_PIPELINE_BUILD_RECORD_STAGE - 阶段记录
CREATE TABLE IF NOT EXISTS `T_PIPELINE_BUILD_RECORD_STAGE` (
`BUILD_ID` varchar(64) NOT NULL COMMENT '构建ID',
`PROJECT_ID` varchar(64) NOT NULL DEFAULT '' COMMENT '项目ID',
`PIPELINE_ID` varchar(64) NOT NULL DEFAULT '' COMMENT '流水线ID',
`RESOURCE_VERSION` int(11) DEFAULT NULL COMMENT '编排版本号',
`STAGE_ID` varchar(64) NOT NULL DEFAULT '' COMMENT '步骤ID',
`SEQ` int(11) NOT NULL COMMENT '步骤序列',
`STAGE_VAR` text NOT NULL COMMENT '当次执行的变量记录',
`STATUS` varchar(32) DEFAULT NULL COMMENT '构建状态',
`EXECUTE_COUNT` int(11) NOT NULL DEFAULT '1' COMMENT '执行次数',
`START_TIME` datetime(3) NULL COMMENT '开始时间',
`END_TIME` datetime(3) NULL COMMENT '结束时间',
`TIMESTAMPS` text COMMENT '运行中产生的时间戳集合',
PRIMARY KEY (`BUILD_ID`, `STAGE_ID`, `EXECUTE_COUNT`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流水线构建阶段表';
5.4 T_PIPELINE_BUILD_RECORD_CONTAINER - 容器记录
CREATE TABLE IF NOT EXISTS `T_PIPELINE_BUILD_RECORD_CONTAINER` (
`BUILD_ID` varchar(64) NOT NULL COMMENT '构建ID',
`PROJECT_ID` varchar(64) NOT NULL COMMENT '项目ID',
`PIPELINE_ID` varchar(64) NOT NULL COMMENT '流水线ID',
`RESOURCE_VERSION` int(11) NOT NULL COMMENT '编排版本',
`STAGE_ID` varchar(64) NOT NULL DEFAULT '' COMMENT '步骤ID',
`CONTAINER_ID` varchar(64) NOT NULL DEFAULT '' COMMENT '构建容器ID',
`EXECUTE_COUNT` int(11) NOT NULL DEFAULT '1' COMMENT '执行次数',
`STATUS` varchar(32) DEFAULT NULL COMMENT '构建状态',
`CONTAINER_VAR` mediumtext NOT NULL COMMENT '当次执行的变量记录',
`CONTAINER_TYPE` varchar(45) DEFAULT NULL COMMENT '容器类型',
`CONTAIN_POST_TASK` bit(1) DEFAULT NULL COMMENT '包含POST插件标识',
`MATRIX_GROUP_FLAG` bit(1) DEFAULT NULL COMMENT '矩阵标识',
`MATRIX_GROUP_ID` varchar(64) DEFAULT NULL COMMENT '所属的矩阵组ID',
`START_TIME` datetime(3) NULL COMMENT '开始时间',
`END_TIME` datetime(3) NULL COMMENT '结束时间',
`TIMESTAMPS` text COMMENT '运行中产生的时间戳集合',
PRIMARY KEY (`BUILD_ID`, `CONTAINER_ID`, `EXECUTE_COUNT`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流水线构建容器环境表';
关键字段说明:
| 字段 | 说明 |
|---|---|
CONTAINER_VAR |
容器级别的变量(如 name、dispatchType) |
MATRIX_GROUP_FLAG |
是否是矩阵组 |
CONTAIN_POST_TASK |
是否包含 POST 插件 |
5.5 T_PIPELINE_BUILD_RECORD_TASK - 任务记录
CREATE TABLE IF NOT EXISTS `T_PIPELINE_BUILD_RECORD_TASK` (
`BUILD_ID` varchar(34) NOT NULL COMMENT '构建ID',
`PROJECT_ID` varchar(64) NOT NULL COMMENT '项目ID',
`PIPELINE_ID` varchar(34) NOT NULL COMMENT '流水线ID',
`RESOURCE_VERSION` int(11) NOT NULL COMMENT '编排版本号',
`STAGE_ID` varchar(34) NOT NULL DEFAULT '' COMMENT '步骤ID',
`CONTAINER_ID` varchar(34) NOT NULL COMMENT '构建容器ID',
`TASK_ID` varchar(34) NOT NULL COMMENT '任务ID',
`TASK_SEQ` int(11) NOT NULL DEFAULT '1' COMMENT '任务序列',
`EXECUTE_COUNT` int(11) NOT NULL DEFAULT '1' COMMENT '执行次数',
`STATUS` varchar(32) DEFAULT NULL COMMENT '构建状态',
`TASK_VAR` mediumtext NOT NULL COMMENT '当次执行的变量记录',
`POST_INFO` text DEFAULT NULL COMMENT '市场插件的POST关联信息',
`CLASS_TYPE` varchar(64) NOT NULL DEFAULT '' COMMENT '类类型',
`ATOM_CODE` varchar(128) NOT NULL DEFAULT '' COMMENT '插件的唯一标识',
`ORIGIN_CLASS_TYPE` varchar(64) DEFAULT NULL COMMENT '原始类类型',
`START_TIME` datetime(3) NULL COMMENT '开始时间',
`END_TIME` datetime(3) NULL COMMENT '结束时间',
`TIMESTAMPS` text COMMENT '运行中产生的时间戳集合',
`ASYNC_STATUS` varchar(32) NULL COMMENT '插件异步执行状态',
PRIMARY KEY (`BUILD_ID`, `TASK_ID`, `EXECUTE_COUNT`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流水线构建任务表';
关键字段说明:
| 字段 | 说明 |
|---|---|
TASK_VAR |
任务级别的变量(插件参数、输出等) |
POST_INFO |
POST 插件关联信息 |
ASYNC_STATUS |
异步执行状态 |
5.6 BUILD vs RECORD 使用场景对比
| 场景 | BUILD 表 | RECORD 表 |
|---|---|---|
| 引擎调度执行 | ✅ 使用 | ❌ 不用 |
| Worker 拉取任务 | ✅ 使用 | ❌ 不用 |
| 前端构建详情页 | ❌ 不用 | ✅ 使用 |
| 查看历史执行记录 | ❌ 不用 | ✅ 使用 |
| 重试时保留历史 | ❌ 会覆盖 | ✅ 新增记录 |
| 耗时统计 | ❌ 不准确 | ✅ 精确 |
5.7 RECORD 系列表的 DAO 和 Service
DAO 层:
| DAO 类 | 表 | 路径 |
|---|---|---|
BuildRecordModelDao |
T_PIPELINE_BUILD_RECORD_MODEL |
biz-base/.../dao/record/ |
BuildRecordStageDao |
T_PIPELINE_BUILD_RECORD_STAGE |
biz-base/.../dao/record/ |
BuildRecordContainerDao |
T_PIPELINE_BUILD_RECORD_CONTAINER |
biz-base/.../dao/record/ |
BuildRecordTaskDao |
T_PIPELINE_BUILD_RECORD_TASK |
biz-base/.../dao/record/ |
Service 层:
| Service 类 | 职责 |
|---|---|
PipelineBuildRecordService |
构建记录管理,查询 ModelRecord |
StageBuildRecordService |
Stage 记录更新 |
ContainerBuildRecordService |
Container 记录更新 |
TaskBuildRecordService |
Task 记录更新 |
BaseBuildRecordService |
基础服务,公共方法 |
5.8 完整的表关系图(含 RECORD 系列)
┌─────────────────────────────────────────────────────────────────────────────┐
│ 构建启动时创建 │
└─────────────────────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────┐
│ T_PIPELINE_BUILD_HISTORY │
│ (构建历史 - 顶层入口) │
└───────────────┬──────────────────────┘
│
┌───────────────────────────┼───────────────────────────┐
│ │ │
▼ ▼ ▼
┌───────────────────┐ ┌───────────────────┐ ┌───────────────────────────┐
│ T_PIPELINE_BUILD_ │ │ T_PIPELINE_BUILD_ │ │ T_PIPELINE_BUILD_RECORD_ │
│ DETAIL │ │ VAR │ │ MODEL │
│ (完整Model JSON) │ │ (构建变量) │ │ (执行记录-支持多次) │
└───────────────────┘ └───────────────────┘ └─────────────┬─────────────┘
│
┌─────────────────────────────────────────┤
│ │
┌───────────┴───────────┐ ┌───────────┴───────────┐
│ 引擎执行用 (BUILD) │ │ 历史记录用 (RECORD) │
│ 单次执行状态 │ │ 多次执行快照 │
└───────────┬───────────┘ └───────────┬───────────┘
│ │
┌───────────────┼───────────────┐ ┌───────────────┼───────────────┐
▼ ▼ ▼ ▼ ▼ ▼
┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
│ STAGE │ │CONTAINER│ │ TASK │ │ STAGE │ │CONTAINER│ │ TASK │
│(阶段) │ │(Job) │ │(插件) │ │(阶段) │ │(Job) │ │(插件) │
└────────┘ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘
│ │ │ │ │ │
└─────────────┴─────────────┘ └─────────────┴─────────────┘
引擎实时更新 前端查询展示
5.9 EXECUTE_COUNT 的作用
场景:用户对构建 #100 进行了 3 次重试
BUILD 系列表:
┌─────────────────────────────────────────┐
│ BUILD_ID = xxx │
│ 只保留最新一次执行的状态 │
│ (第3次重试的状态) │
└─────────────────────────────────────────┘
RECORD 系列表:
┌─────────────────────────────────────────┐
│ BUILD_ID = xxx, EXECUTE_COUNT = 1 │ ← 第1次执行
├─────────────────────────────────────────┤
│ BUILD_ID = xxx, EXECUTE_COUNT = 2 │ ← 第2次执行(重试)
├─────────────────────────────────────────┤
│ BUILD_ID = xxx, EXECUTE_COUNT = 3 │ ← 第3次执行(重试)
└─────────────────────────────────────────┘
六、开发规范
6.1 DAO 编写规范
@Repository
class XxxDao {
// 1. 使用 with(TABLE) 简化代码
fun create(dslContext: DSLContext, ...) {
with(T_XXX) {
dslContext.insertInto(this, ...)
.values(...)
.execute()
}
}
// 2. 查询方法返回可空类型
fun get(dslContext: DSLContext, id: String): XxxRecord? {
return with(T_XXX) {
dslContext.selectFrom(this)
.where(ID.eq(id))
.fetchOne()
}
}
// 3. 列表查询使用 fetch()
fun list(dslContext: DSLContext, ...): List<Xxx> {
return with(T_XXX) {
dslContext.selectFrom(this)
.where(...)
.fetch()
.map { convert(it) }
}
}
// 4. 更新/删除返回影响行数
fun update(dslContext: DSLContext, ...): Int {
return with(T_XXX) {
dslContext.update(this)
.set(...)
.where(...)
.execute()
}
}
}
6.2 新增表检查清单
- 表名以
T_PIPELINE_开头 - 主键使用
BUILD_ID+ 业务 ID 组合 - 添加
PROJECT_ID、PIPELINE_ID索引 - 添加必要的时间字段(CREATE_TIME、UPDATE_TIME)
- SQL 脚本放在
support-files/sql/目录
6.3 RECORD 表使用注意事项
- 查询前端展示数据时优先使用 RECORD 表
- 引擎调度逻辑使用 BUILD 表
- 重试场景需要同时更新两套表
- EXECUTE_COUNT 字段用于区分多次执行
版本: 2.0.0 | 更新日期: 2025-12-12 | 更新内容: 新增 RECORD 系列表(BUILD_RECORD_MODEL/STAGE/CONTAINER/TASK)详解