install_node_env.sh 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. #!/bin/bash
  2. #
  3. # CRMEB Node.js 环境一键安装脚本
  4. # 支持: CentOS, Ubuntu, Debian, Alpine, macOS
  5. #
  6. set -e
  7. # 颜色定义
  8. RED='\033[0;31m'
  9. GREEN='\033[0;32m'
  10. YELLOW='\033[1;33m'
  11. NC='\033[0m' # No Color
  12. # sudo 命令(如果是 root 则为空)
  13. SUDO_CMD=""
  14. # 日志函数
  15. log_info() {
  16. echo -e "${GREEN}[INFO]${NC} $1"
  17. }
  18. log_warn() {
  19. echo -e "${YELLOW}[WARN]${NC} $1"
  20. }
  21. log_error() {
  22. echo -e "${RED}[ERROR]${NC} $1"
  23. }
  24. # 检查 root 权限
  25. check_root() {
  26. if [ "$EUID" -eq 0 ]; then
  27. log_info "当前以 root 用户运行"
  28. SUDO_CMD=""
  29. else
  30. log_warn "当前不是 root 用户,将使用 sudo 执行安装命令"
  31. # 检查 sudo 是否可用
  32. if command -v sudo &> /dev/null; then
  33. SUDO_CMD="sudo"
  34. # 测试 sudo 权限
  35. if ! sudo -n true 2>/dev/null; then
  36. log_info "请输入您的密码以继续安装..."
  37. sudo true
  38. fi
  39. else
  40. log_error "sudo 未安装,请以 root 用户运行此脚本"
  41. exit 1
  42. fi
  43. fi
  44. }
  45. # 检测操作系统
  46. detect_os() {
  47. if [[ "$OSTYPE" == "darwin"* ]]; then
  48. OS_TYPE="macos"
  49. OS_VERSION=$(sw_vers -productVersion)
  50. elif [ -f /etc/os-release ]; then
  51. . /etc/os-release
  52. OS_TYPE=$(echo "$ID" | tr '[:upper:]' '[:lower:]')
  53. OS_VERSION="$VERSION_ID"
  54. elif [ -f /etc/redhat-release ]; then
  55. OS_TYPE="centos"
  56. OS_VERSION=$(cat /etc/redhat-release | grep -oE '[0-9]+\.[0-9]+' | head -1)
  57. else
  58. OS_TYPE="unknown"
  59. OS_VERSION="unknown"
  60. fi
  61. log_info "检测到操作系统: $OS_TYPE $OS_VERSION"
  62. }
  63. # 检查是否已安装 Node.js
  64. check_node() {
  65. if command -v node &> /dev/null; then
  66. NODE_VERSION=$(node -v 2>/dev/null | sed 's/v//')
  67. log_info "Node.js 已安装,版本: $NODE_VERSION"
  68. return 0
  69. fi
  70. return 1
  71. }
  72. # 检查是否已安装 npm
  73. check_npm() {
  74. if command -v npm &> /dev/null; then
  75. NPM_VERSION=$(npm -v 2>/dev/null)
  76. log_info "npm 已安装,版本: $NPM_VERSION"
  77. return 0
  78. fi
  79. return 1
  80. }
  81. # 检查是否已安装 miniprogram-ci
  82. check_miniprogram_ci() {
  83. if command -v miniprogram-ci &> /dev/null; then
  84. CI_VERSION=$(miniprogram-ci --version 2>/dev/null | head -1)
  85. log_info "miniprogram-ci 已安装,版本: $CI_VERSION"
  86. return 0
  87. fi
  88. return 1
  89. }
  90. # 在 CentOS 上安装 Node.js
  91. install_node_centos() {
  92. # 检测 CentOS 版本
  93. local centos_version="7"
  94. if [ -f /etc/redhat-release ]; then
  95. centos_version=$(cat /etc/redhat-release | grep -oE '[0-9]+' | head -1)
  96. fi
  97. # CentOS 7 只能使用 Node.js 16.x(glibc 2.17 限制)
  98. if [ "$centos_version" = "7" ]; then
  99. log_warn "检测到 CentOS 7,由于系统库版本限制,将安装 Node.js 16.x"
  100. log_warn "建议升级到 CentOS 8/9 以获得更新版本的 Node.js"
  101. if command -v curl &> /dev/null; then
  102. curl -fsSL https://rpm.nodesource.com/setup_16.x | $SUDO_CMD bash -
  103. $SUDO_CMD yum install -y nodejs
  104. else
  105. $SUDO_CMD yum install -y curl
  106. curl -fsSL https://rpm.nodesource.com/setup_16.x | $SUDO_CMD bash -
  107. $SUDO_CMD yum install -y nodejs
  108. fi
  109. else
  110. log_info "正在 CentOS $centos_version 上安装 Node.js 20.x (LTS)..."
  111. if command -v curl &> /dev/null; then
  112. curl -fsSL https://rpm.nodesource.com/setup_20.x | $SUDO_CMD bash -
  113. $SUDO_CMD yum install -y nodejs
  114. else
  115. $SUDO_CMD yum install -y curl
  116. curl -fsSL https://rpm.nodesource.com/setup_20.x | $SUDO_CMD bash -
  117. $SUDO_CMD yum install -y nodejs
  118. fi
  119. fi
  120. }
  121. # 在 Ubuntu/Debian 上安装 Node.js
  122. install_node_debian() {
  123. log_info "正在 $OS_TYPE 上安装 Node.js 20.x (LTS)..."
  124. $SUDO_CMD apt-get update
  125. # 使用 NodeSource 仓库安装 Node.js 20.x
  126. if command -v curl &> /dev/null; then
  127. curl -fsSL https://deb.nodesource.com/setup_20.x | $SUDO_CMD bash -
  128. $SUDO_CMD apt-get install -y nodejs
  129. else
  130. $SUDO_CMD apt-get install -y curl
  131. curl -fsSL https://deb.nodesource.com/setup_20.x | $SUDO_CMD bash -
  132. $SUDO_CMD apt-get install -y nodejs
  133. fi
  134. }
  135. # 在 Alpine 上安装 Node.js
  136. install_node_alpine() {
  137. log_info "正在 Alpine 上安装 Node.js..."
  138. $SUDO_CMD apk update
  139. $SUDO_CMD apk add nodejs npm
  140. }
  141. # 在 macOS 上安装 Node.js
  142. install_node_macos() {
  143. log_info "正在 macOS 上安装 Node.js..."
  144. # 检查是否有 Homebrew
  145. if command -v brew &> /dev/null; then
  146. brew install node
  147. else
  148. log_error "请先安装 Homebrew,然后重试"
  149. log_info "安装命令: /bin/bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\""
  150. exit 1
  151. fi
  152. }
  153. # 安装 Node.js
  154. install_node() {
  155. if check_node; then
  156. log_info "Node.js 已安装,跳过安装步骤"
  157. return 0
  158. fi
  159. case "$OS_TYPE" in
  160. centos|rhel|fedora|rocky|almalinux)
  161. install_node_centos
  162. ;;
  163. ubuntu|debian)
  164. install_node_debian
  165. ;;
  166. alpine)
  167. install_node_alpine
  168. ;;
  169. macos)
  170. install_node_macos
  171. ;;
  172. *)
  173. log_error "不支持的操作系统: $OS_TYPE"
  174. log_info "请手动安装 Node.js: https://nodejs.org/"
  175. exit 1
  176. ;;
  177. esac
  178. # 验证安装
  179. if check_node && check_npm; then
  180. log_info "Node.js 安装成功!"
  181. else
  182. log_error "Node.js 安装失败"
  183. exit 1
  184. fi
  185. }
  186. # 安装 miniprogram-ci
  187. install_miniprogram_ci() {
  188. if check_miniprogram_ci; then
  189. log_info "miniprogram-ci 已安装,跳过安装步骤"
  190. return 0
  191. fi
  192. log_info "正在全局安装 miniprogram-ci..."
  193. # 设置 npm 镜像(可选,加速国内下载)
  194. npm config set registry https://registry.npmmirror.com
  195. # 全局安装 miniprogram-ci
  196. $SUDO_CMD npm install -g miniprogram-ci
  197. # 验证安装
  198. if check_miniprogram_ci; then
  199. log_info "miniprogram-ci 安装成功!"
  200. else
  201. log_error "miniprogram-ci 安装失败"
  202. exit 1
  203. fi
  204. }
  205. # 显示安装结果
  206. show_result() {
  207. echo ""
  208. echo "=============================================="
  209. echo -e "${GREEN}安装完成!${NC}"
  210. echo "=============================================="
  211. echo ""
  212. if check_node; then
  213. echo -e "Node.js: ${GREEN}✓${NC} $(node -v)"
  214. else
  215. echo -e "Node.js: ${RED}✗${NC} 未安装"
  216. fi
  217. if check_npm; then
  218. echo -e "npm: ${GREEN}✓${NC} v$(npm -v)"
  219. else
  220. echo -e "npm: ${RED}✗${NC} 未安装"
  221. fi
  222. if check_miniprogram_ci; then
  223. echo -e "miniprogram-ci: ${GREEN}✓${NC} $(miniprogram-ci --version 2>/dev/null | head -1)"
  224. else
  225. echo -e "miniprogram-ci: ${RED}✗${NC} 未安装"
  226. fi
  227. echo ""
  228. }
  229. # 主函数
  230. main() {
  231. echo ""
  232. echo "=============================================="
  233. echo " CRMEB Node.js 环境一键安装脚本"
  234. echo "=============================================="
  235. echo ""
  236. # 检查 root 权限
  237. check_root
  238. # 检测操作系统
  239. detect_os
  240. # 安装 Node.js
  241. install_node
  242. # 安装 miniprogram-ci
  243. install_miniprogram_ci
  244. # 显示结果
  245. show_result
  246. exit 0
  247. }
  248. # 执行主函数
  249. main "$@"