From d353ecdb39626bb424e55aa39e29045e5b73442b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E5=8B=A4=E6=B0=91?= Date: Tue, 23 Jun 2026 18:54:18 +0800 Subject: [PATCH] =?UTF-8?q?fix(update):=20=E5=9C=A8=E9=87=8D=E5=90=AF=20bu?= =?UTF-8?q?gcollect-service=20=E5=89=8D=E6=89=A7=E8=A1=8C=20schema=20?= =?UTF-8?q?=E9=A2=84=E6=A3=80=E5=92=8C=E8=87=AA=E5=8A=A8=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 避免因 Flyway 迁移 no-op 类问题导致服务启动失败、只能登录服务器手工操作的情况。 新增启动前 schema 预检步骤,使用条件 SQL 检查并补全已知缺失列(build_id), 后续新增迁移问题时可在同一位置追加检查项。 Co-Authored-By: Claude Sonnet 4.6 --- scripts/update.sh | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/scripts/update.sh b/scripts/update.sh index dc86732..52249dd 100755 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -540,6 +540,52 @@ if grep -q 'bugcollect-service:' "$ROOT_DIR/docker-compose.yml" 2>/dev/null; the warn "MySQL 容器未运行(external 模式),请确保数据库 ${BUGCOLLECT_DB:-xuqm_bugcollect} 已存在并授权" fi + # 启动前 schema 预检:确保 bugcollect 数据库表结构与当前服务版本一致。 + # 这里显式检查已知列缺失问题,避免服务启动时因 Hibernate 校验失败而陷入 + # 重启循环(只能登录服务器手工操作)。新增迁移时在此追加对应检查项。 + if [ -n "$_mysql_ctr" ] && [ -n "$_mysql_root_pw" ]; then + _bc_db="${BUGCOLLECT_DB:-xuqm_bugcollect}" + info "bugcollect schema 预检 (db=${_bc_db}) ..." + _schema_repair_sql="$(cat <<'REPAIR_SQL' +-- 检查并补全 build_id 列(V6 no-op 历史遗留问题) +SET @_add_lie = IF( + NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_schema = DATABASE() + AND table_name = 'log_issue_events' + AND column_name = 'build_id' + ), + CONCAT('ALTER TABLE log_issue_events ADD COLUMN build_id VARCHAR(32) NULL ', + 'COMMENT ''Build identifier for sourcemap tracking'' AFTER app_version'), + 'SELECT 1' +); +PREPARE _s FROM @_add_lie; EXECUTE _s; DEALLOCATE PREPARE _s; + +SET @_add_lsm = IF( + NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_schema = DATABASE() + AND table_name = 'log_sourcemaps' + AND column_name = 'build_id' + ), + CONCAT('ALTER TABLE log_sourcemaps ADD COLUMN build_id VARCHAR(32) NULL ', + 'COMMENT ''Build identifier for multi-build-per-version tracking'' AFTER app_version'), + 'SELECT 1' +); +PREPARE _s FROM @_add_lsm; EXECUTE _s; DEALLOCATE PREPARE _s; +REPAIR_SQL +)" + _repair_err="$(docker exec "$_mysql_ctr" mysql -u root -p"${_mysql_root_pw}" \ + "$_bc_db" -e "$_schema_repair_sql" 2>&1)" + if [ $? -eq 0 ]; then + ok "bugcollect schema 预检通过(已补全所有缺失列)" + else + warn "bugcollect schema 预检失败,服务启动可能报错" + warn " 错误: ${_repair_err}" + warn " 如服务启动失败,请查看: docker compose logs bugcollect-service" + fi + fi + for _svc in bugcollect-service symbolicator; do info "应用新镜像并重启 ${_svc} ..." COMPOSE_PROFILES=bugcollect $_COMPOSE up -d --no-deps "$_svc" \