fix(jenkins): preflight node toolchain for database import/export
This commit is contained in:
120
scripts/jenkins-prepare-toolchain-env.sh
Normal file
120
scripts/jenkins-prepare-toolchain-env.sh
Normal 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
|
||||
Reference in New Issue
Block a user