| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 |
- #!/bin/bash
- #
- # CRMEB Node.js 环境一键安装脚本
- # 支持: CentOS, Ubuntu, Debian, Alpine, macOS
- #
- set -e
- # 颜色定义
- RED='\033[0;31m'
- GREEN='\033[0;32m'
- YELLOW='\033[1;33m'
- NC='\033[0m' # No Color
- # sudo 命令(如果是 root 则为空)
- SUDO_CMD=""
- # 日志函数
- log_info() {
- echo -e "${GREEN}[INFO]${NC} $1"
- }
- log_warn() {
- echo -e "${YELLOW}[WARN]${NC} $1"
- }
- log_error() {
- echo -e "${RED}[ERROR]${NC} $1"
- }
- # 检查 root 权限
- check_root() {
- if [ "$EUID" -eq 0 ]; then
- log_info "当前以 root 用户运行"
- SUDO_CMD=""
- else
- log_warn "当前不是 root 用户,将使用 sudo 执行安装命令"
- # 检查 sudo 是否可用
- if command -v sudo &> /dev/null; then
- SUDO_CMD="sudo"
- # 测试 sudo 权限
- if ! sudo -n true 2>/dev/null; then
- log_info "请输入您的密码以继续安装..."
- sudo true
- fi
- else
- log_error "sudo 未安装,请以 root 用户运行此脚本"
- exit 1
- fi
- fi
- }
- # 检测操作系统
- detect_os() {
- if [[ "$OSTYPE" == "darwin"* ]]; then
- OS_TYPE="macos"
- OS_VERSION=$(sw_vers -productVersion)
- elif [ -f /etc/os-release ]; then
- . /etc/os-release
- OS_TYPE=$(echo "$ID" | tr '[:upper:]' '[:lower:]')
- OS_VERSION="$VERSION_ID"
- elif [ -f /etc/redhat-release ]; then
- OS_TYPE="centos"
- OS_VERSION=$(cat /etc/redhat-release | grep -oE '[0-9]+\.[0-9]+' | head -1)
- else
- OS_TYPE="unknown"
- OS_VERSION="unknown"
- fi
-
- log_info "检测到操作系统: $OS_TYPE $OS_VERSION"
- }
- # 检查是否已安装 Node.js
- check_node() {
- if command -v node &> /dev/null; then
- NODE_VERSION=$(node -v 2>/dev/null | sed 's/v//')
- log_info "Node.js 已安装,版本: $NODE_VERSION"
- return 0
- fi
- return 1
- }
- # 检查是否已安装 npm
- check_npm() {
- if command -v npm &> /dev/null; then
- NPM_VERSION=$(npm -v 2>/dev/null)
- log_info "npm 已安装,版本: $NPM_VERSION"
- return 0
- fi
- return 1
- }
- # 检查是否已安装 miniprogram-ci
- check_miniprogram_ci() {
- if command -v miniprogram-ci &> /dev/null; then
- CI_VERSION=$(miniprogram-ci --version 2>/dev/null | head -1)
- log_info "miniprogram-ci 已安装,版本: $CI_VERSION"
- return 0
- fi
- return 1
- }
- # 在 CentOS 上安装 Node.js
- install_node_centos() {
- # 检测 CentOS 版本
- local centos_version="7"
- if [ -f /etc/redhat-release ]; then
- centos_version=$(cat /etc/redhat-release | grep -oE '[0-9]+' | head -1)
- fi
-
- # CentOS 7 只能使用 Node.js 16.x(glibc 2.17 限制)
- if [ "$centos_version" = "7" ]; then
- log_warn "检测到 CentOS 7,由于系统库版本限制,将安装 Node.js 16.x"
- log_warn "建议升级到 CentOS 8/9 以获得更新版本的 Node.js"
-
- if command -v curl &> /dev/null; then
- curl -fsSL https://rpm.nodesource.com/setup_16.x | $SUDO_CMD bash -
- $SUDO_CMD yum install -y nodejs
- else
- $SUDO_CMD yum install -y curl
- curl -fsSL https://rpm.nodesource.com/setup_16.x | $SUDO_CMD bash -
- $SUDO_CMD yum install -y nodejs
- fi
- else
- log_info "正在 CentOS $centos_version 上安装 Node.js 20.x (LTS)..."
-
- if command -v curl &> /dev/null; then
- curl -fsSL https://rpm.nodesource.com/setup_20.x | $SUDO_CMD bash -
- $SUDO_CMD yum install -y nodejs
- else
- $SUDO_CMD yum install -y curl
- curl -fsSL https://rpm.nodesource.com/setup_20.x | $SUDO_CMD bash -
- $SUDO_CMD yum install -y nodejs
- fi
- fi
- }
- # 在 Ubuntu/Debian 上安装 Node.js
- install_node_debian() {
- log_info "正在 $OS_TYPE 上安装 Node.js 20.x (LTS)..."
-
- $SUDO_CMD apt-get update
-
- # 使用 NodeSource 仓库安装 Node.js 20.x
- if command -v curl &> /dev/null; then
- curl -fsSL https://deb.nodesource.com/setup_20.x | $SUDO_CMD bash -
- $SUDO_CMD apt-get install -y nodejs
- else
- $SUDO_CMD apt-get install -y curl
- curl -fsSL https://deb.nodesource.com/setup_20.x | $SUDO_CMD bash -
- $SUDO_CMD apt-get install -y nodejs
- fi
- }
- # 在 Alpine 上安装 Node.js
- install_node_alpine() {
- log_info "正在 Alpine 上安装 Node.js..."
- $SUDO_CMD apk update
- $SUDO_CMD apk add nodejs npm
- }
- # 在 macOS 上安装 Node.js
- install_node_macos() {
- log_info "正在 macOS 上安装 Node.js..."
-
- # 检查是否有 Homebrew
- if command -v brew &> /dev/null; then
- brew install node
- else
- log_error "请先安装 Homebrew,然后重试"
- log_info "安装命令: /bin/bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\""
- exit 1
- fi
- }
- # 安装 Node.js
- install_node() {
- if check_node; then
- log_info "Node.js 已安装,跳过安装步骤"
- return 0
- fi
-
- case "$OS_TYPE" in
- centos|rhel|fedora|rocky|almalinux)
- install_node_centos
- ;;
- ubuntu|debian)
- install_node_debian
- ;;
- alpine)
- install_node_alpine
- ;;
- macos)
- install_node_macos
- ;;
- *)
- log_error "不支持的操作系统: $OS_TYPE"
- log_info "请手动安装 Node.js: https://nodejs.org/"
- exit 1
- ;;
- esac
-
- # 验证安装
- if check_node && check_npm; then
- log_info "Node.js 安装成功!"
- else
- log_error "Node.js 安装失败"
- exit 1
- fi
- }
- # 安装 miniprogram-ci
- install_miniprogram_ci() {
- if check_miniprogram_ci; then
- log_info "miniprogram-ci 已安装,跳过安装步骤"
- return 0
- fi
-
- log_info "正在全局安装 miniprogram-ci..."
-
- # 设置 npm 镜像(可选,加速国内下载)
- npm config set registry https://registry.npmmirror.com
-
- # 全局安装 miniprogram-ci
- $SUDO_CMD npm install -g miniprogram-ci
-
- # 验证安装
- if check_miniprogram_ci; then
- log_info "miniprogram-ci 安装成功!"
- else
- log_error "miniprogram-ci 安装失败"
- exit 1
- fi
- }
- # 显示安装结果
- show_result() {
- echo ""
- echo "=============================================="
- echo -e "${GREEN}安装完成!${NC}"
- echo "=============================================="
- echo ""
-
- if check_node; then
- echo -e "Node.js: ${GREEN}✓${NC} $(node -v)"
- else
- echo -e "Node.js: ${RED}✗${NC} 未安装"
- fi
-
- if check_npm; then
- echo -e "npm: ${GREEN}✓${NC} v$(npm -v)"
- else
- echo -e "npm: ${RED}✗${NC} 未安装"
- fi
-
- if check_miniprogram_ci; then
- echo -e "miniprogram-ci: ${GREEN}✓${NC} $(miniprogram-ci --version 2>/dev/null | head -1)"
- else
- echo -e "miniprogram-ci: ${RED}✗${NC} 未安装"
- fi
-
- echo ""
- }
- # 主函数
- main() {
- echo ""
- echo "=============================================="
- echo " CRMEB Node.js 环境一键安装脚本"
- echo "=============================================="
- echo ""
-
- # 检查 root 权限
- check_root
-
- # 检测操作系统
- detect_os
-
- # 安装 Node.js
- install_node
-
- # 安装 miniprogram-ci
- install_miniprogram_ci
-
- # 显示结果
- show_result
-
- exit 0
- }
- # 执行主函数
- main "$@"
|