Claude Code Plugins

Community-maintained marketplace

Feedback

29-4-process-dao-database

@TencentBlueKing/bk-ci
2.5k
0

Process 模块 DAO 层与数据库表结构详细分析,涵盖 JOOQ 使用、表结构设计、索引优化、数据分片。当用户开发 Process 数据访问、设计表结构、优化查询性能或处理数据存储时使用。

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

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_IDPIPELINE_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)详解