Files
Genarrative/scripts/jenkins-prepare-toolchain-env.sh

121 lines
2.9 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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