ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Bytebase 移除 SystemBot 用户:以 NULL 语义重构系统级操作身份(设计与实现全解)

Bytebase 移除 SystemBot 用户:以 NULL 语义重构系统级操作身份(设计与实现全解) Bytebase 移除 SystemBot 用户以 NULL 语义重构系统级操作身份设计与实现全解【免费下载链接】bytebaseDatabase governance built for humans and agents — controlling changes and access across every major database.项目地址: https://gitcode.com/GitHub_Trending/by/bytebase摘要本文围绕 Bytebase 开源仓库中《Remove SystemBotUser Implementation Plan》及配套设计文档展开系统阐述其背景、目标、数据库迁移、后端存储层与 API 层改造、前端展示逻辑、i18n 国际化、测试与验证清单等完整方案。仓库实际落地证据表明该计划已进入 3.15 版本迁移链0006##remove_system_bot.sql本文以文档为主干、源码为佐证供开发者理解与复现。背景与目标当前问题Bytebase 早期使用一个特殊的 SystemBot 用户ID1, emailsupportbytebase.com来表示系统级生成的操作包括任务调度器task scheduler的操作自动化的 issue 评论如状态变更当真实用户找不到时的回退fallback内部系统操作这个 SystemBot 会与真实用户一起出现在 UI 用户列表中用户难以分辨 Bytebase supportbytebase.com 是真实用户、支持账号还是其他东西造成困惑。目标与收益目标是彻底移除 SystemBot 概念让系统级操作与用户操作清晰区分数据库层系统操作对应的creator字段为NULL代码层空字符串作为系统操作的哨兵值sentinel由存储层转换为NULLUI 层对NULL的 creator 显示 System国际化标签无特殊常量不再有硬编码的 ID 或 email收益包括NULL系统、email真实用户的语义更清晰用户列表不再出现令人困惑的假用户代码更简单更少特殊分支用户体验更好系统与人工操作一目了然。数据库 Schema 变更影响范围只有两张表需要支持 NULL creator表列原因issue_commentcreator系统为状态变更创建评论task_runcreator系统调度器创建/更新任务运行其余带 creator 列的表保持不变——它们只包含用户创建的记录。这种最小化变更降低了迁移风险。Schema 修改 SQL-- 让 issue_comment.creator 可空 ALTER TABLE issue_comment ALTER COLUMN creator DROP NOT NULL; ALTER TABLE issue_comment DROP CONSTRAINT issue_comment_creator_fkey; ALTER TABLE issue_comment ADD CONSTRAINT issue_comment_creator_fkey FOREIGN KEY (creator) REFERENCES principal(email) ON UPDATE CASCADE ON DELETE SET NULL; -- 让 task_run.creator 可空 ALTER TABLE task_run ALTER COLUMN creator DROP NOT NULL; ALTER TABLE task_run DROP CONSTRAINT task_run_creator_fkey; ALTER TABLE task_run ADD CONSTRAINT task_run_creator_fkey FOREIGN KEY (creator) REFERENCES principal(email) ON UPDATE CASCADE ON DELETE SET NULL;关键点外键改为ON DELETE SET NULL即使未来某个 principal 被删除也不会破坏历史记录。数据迁移策略三步迁移-- Step 1: 使列可空并更新外键约束 -- 同上 SQL -- Step 2: 将现有 SystemBot 记录转换为 NULL UPDATE issue_comment SET creator NULL WHERE creator supportbytebase.com; UPDATE task_run SET creator NULL WHERE creator supportbytebase.com; -- Step 3: 删除 SystemBot principal 行 DELETE FROM principal WHERE id 1 AND email supportbytebase.com;迁移文件创建backend/migrator/migration/X.XX/0001##remove_system_bot.sql更新backend/migrator/migration/LATEST.sql移除 SystemBot INSERT更新表定义更新backend/migrator/migrator_test.go的 TestLatestVersion仓库实际落地的迁移文件3.15 版本backend/migrator/migration/3.15/0006##remove_system_bot.sql实际包含更精细的处理与设计文档存在关键差异task_run.creator置 NULL 的做法与文档一致但issue_comment、sheet、plan、issue、release等必须存在真实用户的表将supportbytebase.com记录重新分配给第一个活跃的 END_USER按 ID 升序而非置 NULLSELECT email INTO fallback_user FROM principal WHERE email ! supportbytebase.com AND type END_USER AND NOT deleted ORDER BY id LIMIT 1; IF fallback_user IS NULL THEN RAISE EXCEPTION No active user found to reassign SystemBot-created records. Please create a user first.; END IF; UPDATE sheet SET creator fallback_user WHERE creator supportbytebase.com; UPDATE plan SET creator fallback_user WHERE creator supportbytebase.com; UPDATE issue SET creator fallback_user WHERE creator supportbytebase.com; UPDATE issue_comment SET creator fallback_user WHERE creator supportbytebase.com; UPDATE release SET creator fallback_user WHERE creator supportbytebase.com;删除所有SYSTEM_BOT类型的 principal 行不只 supportbytebase.com收紧 principal 的 type 约束移除SYSTEM_BOTALTER TABLE principal DROP CONSTRAINT principal_type_check; ALTER TABLE principal ADD CONSTRAINT principal_type_check CHECK (type IN (END_USER, SERVICE_ACCOUNT, WORKLOAD_IDENTITY)); ALTER TABLE principal DROP CONSTRAINT principal_project_type_check; ALTER TABLE principal ADD CONSTRAINT principal_project_type_check CHECK ( (type END_USER AND project IS NULL) OR (type IN (SERVICE_ACCOUNT, WORKLOAD_IDENTITY)) );从源码结构看这是对设计文档的增强设计文档中issue_comment置 NULL 的假设在实际实现中被调整——因为 issue、plan、release 等业务记录需要保留真实归属直接置 NULL 会破坏业务约束。后端代码变更存储层Store Layer设计文档要求 store 方法将空字符串转换为 NULL// CreateIssueComments - 更新为将 转换为 NULL func (s *Store) CreateIssueComments(ctx context.Context, creator string, create *IssueCommentMessage) (*IssueCommentMessage, error) { var creatorPtr *string if creator { creatorPtr nil // NULL for system } else { creatorPtr creator } // 在 INSERT 查询中使用 creatorPtr }仓库中backend/store/task_run.go已落实该模式CreatePendingTaskRuns中var creatorPtr any空字符串时赋nilbackend/store/issue_comment.go的CreateIssueComments直接接收creator string并写入 INSERTListIssueComment的CreatorEmail由sql.NullString扫描。API 层API Layer设计文档要求将所有common.SystemBotEmail替换为// issue_service.go - Issue 状态变更评论 s.store.CreateIssueComments(ctx, , store.IssueCommentMessage{...}) // rollout_service.go - 自动 rollout task runs s.CreatePendingTaskRuns(ctx, , create) s.CreateIssueComments(ctx, , store.IssueCommentMessage{...}) // running_scheduler.go pending_scheduler.go - task run 更新 s.store.UpdateTaskRunStatus(ctx, store.TaskRunStatusPatch{ ID: taskRun.ID, Updater: , // 系统更新 Status: storepb.TaskRun_AVAILABLE, })删除特殊处理// user_service.go - 删除 SystemBot 特殊分支 // DELETE this entire block: if email common.SystemBotEmail { v1User, err : convertToUser(ctx, s.iamManager, store.SystemBotUser) // ... } // issue_service.go approval/runner.go - 删除回退到 SystemBotUser // 当 creator 获取失败时作为已删除/未知用户处理而非 SystemBot删除常量// backend/common/const.go - 删除 // - SystemBotID // - SystemBotEmail // backend/store/principal.go - 删除 // - SystemBotUser 变量 // - UpdateUser 的 SystemBotID 检查仓库证据backend/common/const.go当前已无 SystemBot 相关常量全仓库搜索SystemBot仅剩迁移文件与类型约束相关历史 SQL。后端删除后backend/migrator/migration/3.15/0004##add_principal_project.sql与3.13/0020##add_workload_identity_type.sql中保留的历史定义属于迁移链的原始快照符合历史迁移不改写的惯例。前端变更删除常量// frontend/src/types/common.ts - DELETE: export const SYSTEM_BOT_ID 1; export const SYSTEM_BOT_EMAIL supportbytebase.com;更新用户显示逻辑// frontend/src/utils/user.ts或合适位置 export const displayUserName (user: User | null | undefined): string { if (!user || !user.email) { return t(common.system); // 返回 System国际化 } return user.name || user.email; };i18n 国际化// frontend/src/locales/en-US.json { common: { system: System } } // frontend/src/locales/zh-CN.json { common: { system: 系统 } }仓库证据frontend/src/routes/workspace/RolesPage.tsx中已使用t(common.system)渲染说明前端已具备该文案的国际化键。删除特殊分支// frontend/src/components/Member/MemberDataTable/cells/UserOperationsCell.vue // REMOVE SYSTEM_BOT_USER_NAME 检查——它不再存在测试与验证单元测试更新存储层测试更新任何引用 SystemBotUser 的测试——CreateIssueComments空字符串 creator、UpdateTaskRunStatus空字符串 updater、验证 NULL 正确存储、删除 SystemBotID 校验测试。API 测试用户列表不含 SystemBot、按 email 获取 SystemBot 返回 404、系统 creator 的 issue 评论。迁移测试TestLatestVersion通过、schema 可空列正确、新库无 SystemBot 行。集成测试新增任务调度器流程task runs 以 NULL creator 创建状态更新使用 NULL updaterUI 正确显示 System。Issue 状态变更系统评论 NULL creatorUI 正确渲染webhook 事件优雅处理 NULL creator。迁移验证对含 SystemBot 数据的测试库执行迁移所有supportbytebase.com转换成功SystemBot 行删除成功外键正常工作。手动测试清单调度器创建 task run → creator 为 NULL显示 System变更 issue 状态 → 系统评论创建显示 System查看已迁移的历史记录 → 旧 SystemBot 记录显示 System用户列表 API → 不返回 SystemBot 用户GetUser API 用旧 SystemBot email → 返回 404 或 not found实施顺序与验证清单实施顺序数据库迁移schema 数据后端 store 层变更处理 → NULL后端 API 层变更SystemBotEmail 替换为 后端清理删除常量与特殊分支前端变更删除常量、添加显示逻辑前端 i18n 更新测试更新集成测试最终验证清单迁移文件创建且 TestLatestVersion 通过LATEST.sql 更新可空列、无 SystemBot INSERTstore 层将 转换为 NULLissue_comment 与 task_runAPI 层使用 而非 common.SystemBotEmail后端 SystemBot 常量删除SystemBot 特殊分支移除前端常量删除System i18n 翻译添加前端对 null 用户显示 System所有后端测试通过所有前端测试通过构建成功手动验证确认 NULL creator 显示为 System延伸阅读移除 SystemBotUser 设计文档迁移文件实现后端常量现状issue_comment 存储层实现task_run 存储层实现前端国际化使用示例【免费下载链接】bytebaseDatabase governance built for humans and agents — controlling changes and access across every major database.项目地址: https://gitcode.com/GitHub_Trending/by/bytebase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表