fix(jenkins): preflight node toolchain for database import/export

This commit is contained in:
2026-05-15 17:02:40 +08:00
parent 7a3b137565
commit 49ffa6b901
5 changed files with 135 additions and 0 deletions

View File

@@ -0,0 +1,120 @@
#!/usr/bin/env bash
set -euo pipefail
prepend_path_dir() {
local dir="$1"
if [[ -z "${dir}" || ! -d "${dir}" ]]; then
return
fi
if [[ ":${PATH}:" == *":${dir}:"* ]]; then
return
fi
export PATH="${dir}:${PATH}"
}
prepend_colon_path() {
local raw_paths="$1"
local old_ifs="${IFS}"
local -a dirs=()
local dir
IFS=':'
for dir in ${raw_paths}; do
dirs+=("${dir}")
done
IFS="${old_ifs}"
for ((index = ${#dirs[@]} - 1; index >= 0; index--)); do
prepend_path_dir "${dirs[index]}"
done
}
append_path_dir() {
local dir="$1"
if [[ -z "${dir}" || ! -d "${dir}" ]]; then
return
fi
if [[ ":${PATH}:" == *":${dir}:"* ]]; then
return
fi
export PATH="${PATH}:${dir}"
}
append_colon_path() {
local raw_paths="$1"
local old_ifs="${IFS}"
local dir
IFS=':'
for dir in ${raw_paths}; do
append_path_dir "${dir}"
done
IFS="${old_ifs}"
}
append_node_version_dirs() {
local root="$1"
local dir
if [[ ! -d "${root}" ]]; then
return
fi
for dir in "${root}"/*/bin; do
[[ -d "${dir}" ]] || continue
prepend_path_dir "${dir}"
done
}
# Jenkins 的非交互 shell 不一定加载 nvm/profile生产导入导出脚本需要显式补齐工具链目录。
append_node_version_dirs "/var/lib/jenkins/.nvm/versions/node"
append_node_version_dirs "${HOME:-}/.nvm/versions/node"
for tool_dir in \
"/var/lib/jenkins/.nvm/versions/node/v22.22.2/bin" \
"/var/lib/jenkins/.cargo/bin" \
"/var/lib/jenkins/.local/bin" \
"/var/lib/jenkins/bin" \
"${HOME:-}/.cargo/bin" \
"${HOME:-}/.local/bin" \
"/root/.cargo/bin" \
"/usr/local/cargo/bin" \
"/stdb/bin/current" \
"/usr/.local/share/spacetime/bin/current"; do
prepend_path_dir "${tool_dir}"
done
# 系统路径只做补位,避免压过 Jenkins 用户目录里的 Node/Cargo/SpacetimeDB 工具链。
append_colon_path "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
# 目标机器路径不同的时候,显式传入的路径应当拥有最高优先级。
prepend_colon_path "${GENARRATIVE_JENKINS_TOOL_PATHS:-}"
require_toolchain_command() {
local command_name="$1"
local install_hint="$2"
if command -v "${command_name}" >/dev/null 2>&1; then
echo "[jenkins-toolchain] ${command_name}=$(command -v "${command_name}")"
return
fi
echo "[jenkins-toolchain] 缺少 ${command_name}${install_hint}" >&2
echo "[jenkins-toolchain] 当前 PATH=${PATH}" >&2
exit 1
}
require_toolchain_command node "请确认 Node.js 已安装到 Jenkins 用户目录,或通过 GENARRATIVE_JENKINS_TOOL_PATHS 显式传入其 bin 目录。"
if [[ -z "${GENARRATIVE_SPACETIME_TOKEN:-}" ]]; then
require_toolchain_command spacetime "请确认 SpacetimeDB CLI 已安装到 Jenkins 用户目录,或通过 GENARRATIVE_JENKINS_TOOL_PATHS 显式传入其 bin 目录。"
else
echo "[jenkins-toolchain] 已提供 GENARRATIVE_SPACETIME_TOKEN跳过 spacetime CLI 预检"
fi