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" \