From 805d6f8cae473c4f7741e79e38e5c8cbadd0c111 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E7=89=A9?= <253518756@qq.com> Date: Thu, 30 Apr 2026 00:51:44 +0800 Subject: [PATCH] 1 --- ...KINS_RUST_BUILD_DEPLOY_PIPELINES_2026-04-23.md | 2 ++ ...EDB_DATABASE_MIGRATION_PIPELINES_2026-04-29.md | 4 ++-- ...AL_AND_REMOTE_DEPLOYMENT_SCRIPTS_2026-04-22.md | 2 ++ jenkins/Jenkinsfile.build-and-deploy | 6 +++--- scripts/deploy-rust-remote.sh | 15 +++++++++++++++ 5 files changed, 24 insertions(+), 5 deletions(-) diff --git a/docs/technical/JENKINS_RUST_BUILD_DEPLOY_PIPELINES_2026-04-23.md b/docs/technical/JENKINS_RUST_BUILD_DEPLOY_PIPELINES_2026-04-23.md index 84d4e2aa..6587e455 100644 --- a/docs/technical/JENKINS_RUST_BUILD_DEPLOY_PIPELINES_2026-04-23.md +++ b/docs/technical/JENKINS_RUST_BUILD_DEPLOY_PIPELINES_2026-04-23.md @@ -25,6 +25,7 @@ 9. 由于 Jenkins Pipeline 的 `build` 步骤触发下游时,原因类型通常是 `org.jenkinsci.plugins.workflow.support.steps.build.BuildUpstreamCause`,实现上需要同时兼容它和经典的 `hudson.model.Cause$UpstreamCause`,否则会把真实的上游触发误判成人工执行。 10. 如果线上进程的启停必须经过 `sudo`,只允许 `start.sh` / `stop.sh` 这两个 hook 使用 `sudo -n` 执行,部署目录清空与文件覆盖仍保持普通权限。 11. `WEB_PORT` 必须在 `构建并部署` 与 `部署` 两条流水线之间使用同名参数传递;部署脚本会把最终端口写入固定部署目录 `.env.local` 的 `GENARRATIVE_WEB_PORT`,避免 `sudo` 启动 hook 时环境变量被清理导致端口回退。 +12. `DATABASE` 必须使用 SpacetimeDB CLI 可接受的名称字符:数字、字母、点和短横线;不要使用下划线,否则 `spacetime publish` 会报 `invalid characters in database name`。 ## 3. 节点与工作区要求 @@ -170,6 +171,7 @@ jenkins/Jenkinsfile.build-and-deploy 4. `CLEAR_DATABASE` 5. `MIGRATE_ON_CONFLICT` 6. `MIGRATION_DIRECTORY` +7. `DATABASE`:发布包默认数据库名,默认 `genarrative-pipeline-local-test`,只能包含数字、字母、点和短横线。 如果你选择启用 `RUN_DEPLOY_HOOKS_WITH_SUDO=true`,推荐提前在服务器上增加一份最小 sudoers 配置,例如: diff --git a/docs/technical/JENKINS_SPACETIMEDB_DATABASE_MIGRATION_PIPELINES_2026-04-29.md b/docs/technical/JENKINS_SPACETIMEDB_DATABASE_MIGRATION_PIPELINES_2026-04-29.md index d28faee3..dbeaf674 100644 --- a/docs/technical/JENKINS_SPACETIMEDB_DATABASE_MIGRATION_PIPELINES_2026-04-29.md +++ b/docs/technical/JENKINS_SPACETIMEDB_DATABASE_MIGRATION_PIPELINES_2026-04-29.md @@ -90,7 +90,7 @@ Genarrative-Database-Import `Genarrative-Build-And-Deploy` 增加以下本地发布包参数,便于在 Jenkins 中测试本地 SpacetimeDB,不依赖 Maincloud: -1. `DATABASE`:发布包默认数据库名,默认 `genarrative_pipeline_local_test`。 +1. `DATABASE`:发布包默认数据库名,默认 `genarrative-pipeline-local-test`。SpacetimeDB CLI 当前只接受数字、字母、点和短横线,不要使用下划线。 2. `API_PORT`:发布包内 api-server 端口,默认 `8082`。 3. `WEB_PORT`:发布包内静态网站端口,默认 `25001`。 4. `SPACETIME_PORT`:发布包内本地 SpacetimeDB 端口,默认 `3101`。 @@ -99,7 +99,7 @@ Genarrative-Database-Import 数据库导入导出流水线在本地测试时应显式填写: ```text -DATABASE=genarrative_pipeline_local_test +DATABASE=genarrative-pipeline-local-test SERVER_URL=http://127.0.0.1:3101 DEPLOY_DIRECTORY=/var/lib/jenkins/deploy/Genarrative ``` diff --git a/docs/technical/RUST_LOCAL_AND_REMOTE_DEPLOYMENT_SCRIPTS_2026-04-22.md b/docs/technical/RUST_LOCAL_AND_REMOTE_DEPLOYMENT_SCRIPTS_2026-04-22.md index 259f8d48..7b633288 100644 --- a/docs/technical/RUST_LOCAL_AND_REMOTE_DEPLOYMENT_SCRIPTS_2026-04-22.md +++ b/docs/technical/RUST_LOCAL_AND_REMOTE_DEPLOYMENT_SCRIPTS_2026-04-22.md @@ -145,6 +145,8 @@ npm run deploy:rust:remote 8. 在目标目录写入 `start.sh` 与 `stop.sh`;`start.sh` 会先按 `KEY=value` 子集加载发布目录根部的 `.env`、`.env.local`,兼容 UTF-8 BOM 与 CRLF,再回退到构建时通过 `--database`、`--api-port`、`--web-port`、`--spacetime-host`、`--spacetime-port` 写入的默认值,并默认导出 `NO_COLOR=1` 与 `CARGO_TERM_COLOR=never`,避免 ANSI 控制码写入日志文件;同时按 Ubuntu 发布环境使用发布目录内 `.spacetimedb/` 作为 root-dir,不再额外设置 `--data-dir`,启动前先执行 `sync_ubuntu_spacetime_install`,优先从 `/usr/.local/share/spacetime/bin//spacetimedb-cli` 或 `$HOME/.local/share/spacetime/bin//spacetimedb-cli` 同步到 `.spacetimedb/bin/current/spacetimedb-cli`,当前线上 `spacetime` 入口为 `/usr/local/bin/spacetime`;启动参数为 `spacetime --root-dir ./.spacetimedb start --edition standalone --listen-addr :`,探活必须确认 `server ping` 输出包含 `Server is online:`;普通启动先无清库发布,若 publish 输出可判定为 schema 冲突,则自动导出旧库、清库发布新 wasm、导入回灌;如果以 `--clear-database` 启动,则内部 `spacetime publish` 会追加 `-c=on-conflict`,代表人工确认清库,不触发自动回灌。 9. 默认执行 `scp -r -i ~\.ssh\dsk.pem build/ ubuntu@82.157.175.59:/home/ubuntu/genarrative/` 上传发布包。 +SpacetimeDB database 名称只能包含数字、字母、点和短横线;不要使用下划线,否则 `spacetime publish` 会报 `invalid characters in database name`。发布包构建脚本和 `start.sh` 都会提前拦截这类非法名称。 + 发布包结构: ```text diff --git a/jenkins/Jenkinsfile.build-and-deploy b/jenkins/Jenkinsfile.build-and-deploy index d343f21f..302630c8 100644 --- a/jenkins/Jenkinsfile.build-and-deploy +++ b/jenkins/Jenkinsfile.build-and-deploy @@ -10,7 +10,7 @@ pipeline { string(name: 'AGENT_LABEL', defaultValue: 'built-in', description: '构建节点标签') string(name: 'GENARRATIVE_WORKSPACE_ROOT', defaultValue: '', description: '源码根目录,留空则使用当前 Jenkins 工作区') string(name: 'BUILD_VERSION', defaultValue: '', description: '发布版本号,留空则使用 Jenkins BUILD_NUMBER') - string(name: 'DATABASE', defaultValue: 'genarrative_pipeline_local_test', description: '发布包默认 SpacetimeDB database') + string(name: 'DATABASE', defaultValue: 'genarrative-pipeline-local-test', description: '发布包默认 SpacetimeDB database') string(name: 'API_PORT', defaultValue: '8082', description: '发布包内 api-server 端口') string(name: 'WEB_PORT', defaultValue: '25001', description: '发布包内静态网站端口,默认 25001') string(name: 'SPACETIME_PORT', defaultValue: '3101', description: '发布包内本地 SpacetimeDB 端口') @@ -39,8 +39,8 @@ pipeline { if (!database) { error('DATABASE 不能为空。') } - if (!(database ==~ /^[0-9A-Za-z._-]+$/)) { - error("DATABASE 只能包含数字、字母、点、下划线和短横线,当前值: ${database}") + if (!(database ==~ /^[0-9A-Za-z.-]+$/)) { + error("DATABASE 只能包含数字、字母、点和短横线,不能包含下划线,当前值: ${database}") } env.EFFECTIVE_DATABASE = database def apiPort = params.API_PORT?.trim() diff --git a/scripts/deploy-rust-remote.sh b/scripts/deploy-rust-remote.sh index daa79fd3..4d624910 100644 --- a/scripts/deploy-rust-remote.sh +++ b/scripts/deploy-rust-remote.sh @@ -270,6 +270,11 @@ if [[ ! "${BUILD_NAME}" =~ ^[0-9A-Za-z._-]+$ ]]; then exit 1 fi +if [[ ! "${DATABASE}" =~ ^[0-9A-Za-z.-]+$ ]]; then + echo "[deploy:rust] --database 只能包含数字、字母、点和短横线,不能包含下划线: ${DATABASE}" >&2 + exit 1 +fi + if [[ "${SKIP_SPACETIME_BUILD}" -eq 1 && "${MIGRATION_BOOTSTRAP_SECRET_MODE}" != "disabled" ]]; then echo "[deploy:rust] --skip-spacetime-build 无法把迁移引导密钥注入 wasm。" >&2 echo "[deploy:rust] 请移除 --skip-spacetime-build,或同时传 --no-migration-bootstrap-secret。" >&2 @@ -654,6 +659,15 @@ sanitize_path_segment() { printf "%s" "$1" | tr -c 'A-Za-z0-9._-' '_' } +validate_spacetime_database_name() { + local database="$1" + + if [[ ! "${database}" =~ ^[0-9A-Za-z.-]+$ ]]; then + echo "[start] GENARRATIVE_SPACETIME_DATABASE 只能包含数字、字母、点和短横线,不能包含下划线: ${database}" >&2 + exit 1 + fi +} + is_publish_conflict_output() { local output="$1" local normalized @@ -973,6 +987,7 @@ start_process() { require_command node require_command spacetime +validate_spacetime_database_name "${SPACETIME_DATABASE}" mkdir -p "${PID_DIR}" "${LOG_DIR}" "${SPACETIME_ROOT_DIR}" sync_ubuntu_spacetime_install "${SPACETIME_ROOT_DIR}"