#!/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