优化安装脚本
This commit is contained in:
133
install.sh
133
install.sh
@@ -360,15 +360,18 @@ install_dependencies() {
|
||||
echo -e "${BLUE}安装系统依赖...${NC}"
|
||||
|
||||
if [ "$OS" = "ubuntu" ] || [ "$OS" = "debian" ]; then
|
||||
sudo apt-get update -qq
|
||||
sudo apt-get install -y -qq curl wget ping traceroute dnsutils git > /dev/null 2>&1
|
||||
echo -e "${BLUE}更新 apt 软件包列表...${NC}"
|
||||
sudo apt-get update
|
||||
echo -e "${BLUE}安装系统依赖包...${NC}"
|
||||
sudo apt-get install -y curl wget ping traceroute dnsutils git
|
||||
elif [ "$OS" = "centos" ] || [ "$OS" = "rhel" ] || [ "$OS" = "rocky" ] || [ "$OS" = "almalinux" ]; then
|
||||
sudo yum install -y -q curl wget iputils traceroute bind-utils git > /dev/null 2>&1
|
||||
echo -e "${BLUE}安装系统依赖包...${NC}"
|
||||
sudo yum install -y curl wget iputils traceroute bind-utils git
|
||||
else
|
||||
echo -e "${YELLOW}警告: 未知系统类型,跳过依赖安装${NC}"
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}✓ 依赖安装完成${NC}"
|
||||
echo -e "${GREEN}✓ 系统依赖安装完成${NC}"
|
||||
}
|
||||
|
||||
# 从官网下载安装 Go
|
||||
@@ -423,9 +426,10 @@ install_go_from_official() {
|
||||
fi
|
||||
|
||||
# 解压安装
|
||||
echo -e "${BLUE}安装 Go...${NC}"
|
||||
sudo tar -C /usr/local -xzf "/tmp/${go_tar}" > /dev/null 2>&1
|
||||
echo -e "${BLUE}解压并安装 Go...${NC}"
|
||||
sudo tar -C /usr/local -xzf "/tmp/${go_tar}"
|
||||
rm -f "/tmp/${go_tar}"
|
||||
echo -e "${GREEN}✓ Go 解压完成${NC}"
|
||||
|
||||
# 添加到 PATH(如果还没有)
|
||||
if ! grep -q "/usr/local/go/bin" /etc/profile 2>/dev/null; then
|
||||
@@ -479,16 +483,20 @@ install_go() {
|
||||
|
||||
if [ "$OS" = "ubuntu" ] || [ "$OS" = "debian" ]; then
|
||||
echo -e "${BLUE}尝试从 apt 安装 Go...${NC}"
|
||||
sudo apt-get update -qq > /dev/null 2>&1
|
||||
if sudo apt-get install -y -qq golang-go > /dev/null 2>&1; then
|
||||
sudo apt-get update
|
||||
if sudo apt-get install -y golang-go; then
|
||||
install_success=true
|
||||
else
|
||||
echo -e "${YELLOW}⚠ apt 安装 Go 失败${NC}"
|
||||
fi
|
||||
elif [ "$OS" = "centos" ] || [ "$OS" = "rhel" ] || [ "$OS" = "rocky" ] || [ "$OS" = "almalinux" ]; then
|
||||
echo -e "${BLUE}尝试从 yum 安装 Go...${NC}"
|
||||
# 检查 yum 源中是否有 golang 包
|
||||
if yum list available golang > /dev/null 2>&1; then
|
||||
if sudo yum install -y -q golang > /dev/null 2>&1; then
|
||||
if sudo yum install -y golang; then
|
||||
install_success=true
|
||||
else
|
||||
echo -e "${YELLOW}⚠ yum 安装 Go 失败${NC}"
|
||||
fi
|
||||
else
|
||||
echo -e "${YELLOW}⚠ yum 源中未找到 golang 包,尝试从官网下载安装${NC}"
|
||||
@@ -673,22 +681,23 @@ build_from_source() {
|
||||
git config --global --add safe.directory "$SOURCE_DIR" 2>/dev/null || true
|
||||
|
||||
# 配置 Go 代理(使用国内镜像)
|
||||
echo -e "${BLUE}配置 Go 代理(使用国内镜像)...${NC}"
|
||||
# Go 代理镜像列表(按优先级排序)
|
||||
echo -e "${BLUE}配置 Go 代理(使用国内镜像加速)...${NC}"
|
||||
# Go 代理镜像列表(按优先级排序,使用多个镜像以提高成功率)
|
||||
GO_PROXY_MIRRORS=(
|
||||
"https://goproxy.cn,direct"
|
||||
"https://goproxy.io,direct"
|
||||
"https://mirrors.aliyun.com/go-proxy/,direct"
|
||||
"https://goproxy.cn,https://goproxy.io,https://mirrors.aliyun.com/go-proxy/,direct"
|
||||
"https://goproxy.io,https://goproxy.cn,https://mirrors.aliyun.com/go-proxy/,direct"
|
||||
"https://mirrors.aliyun.com/go-proxy/,https://goproxy.cn,https://goproxy.io,direct"
|
||||
"https://proxy.golang.org,direct"
|
||||
)
|
||||
|
||||
# 测试并选择最快的 Go 代理
|
||||
# 测试并选择最快的 Go 代理(使用多个镜像作为备选)
|
||||
GO_PROXY=""
|
||||
for proxy in "${GO_PROXY_MIRRORS[@]}"; do
|
||||
proxy_url=$(echo "$proxy" | cut -d',' -f1)
|
||||
echo -n " 测试 ${proxy_url}... "
|
||||
if curl -sf --connect-timeout 2 "${proxy_url}" > /dev/null 2>&1; then
|
||||
GO_PROXY="$proxy"
|
||||
for proxy_list in "${GO_PROXY_MIRRORS[@]}"; do
|
||||
# 取第一个镜像进行测试
|
||||
first_proxy=$(echo "$proxy_list" | cut -d',' -f1)
|
||||
echo -n " 测试代理链: ${first_proxy}... "
|
||||
if curl -sf --connect-timeout 3 --max-time 5 "${first_proxy}" > /dev/null 2>&1; then
|
||||
GO_PROXY="$proxy_list"
|
||||
echo -e "${GREEN}可用${NC}"
|
||||
break
|
||||
else
|
||||
@@ -701,27 +710,84 @@ build_from_source() {
|
||||
GO_PROXY="https://proxy.golang.org,direct"
|
||||
echo -e "${YELLOW}⚠ 所有国内镜像不可用,使用默认代理${NC}"
|
||||
else
|
||||
echo -e "${GREEN}✓ 使用 Go 代理: ${GO_PROXY}${NC}"
|
||||
echo -e "${GREEN}✓ 使用 Go 代理链: ${GO_PROXY}${NC}"
|
||||
echo -e "${BLUE}说明: Go 会按顺序尝试代理列表中的镜像,提高下载成功率${NC}"
|
||||
fi
|
||||
|
||||
# 下载依赖(使用 sudo 以 root 用户执行,确保 PATH 包含 Go,并设置 GOPROXY)
|
||||
echo -e "${BLUE}下载 Go 依赖...${NC}"
|
||||
echo -e "${BLUE}使用代理: ${GO_PROXY}${NC}"
|
||||
|
||||
# 构建包含 Go PATH 和 GOPROXY 的环境变量
|
||||
GO_PATH_ENV="PATH=\$PATH:/usr/local/go/bin"
|
||||
if [ -d "/usr/local/go/bin" ]; then
|
||||
GO_PATH_ENV="PATH=/usr/local/go/bin:\$PATH"
|
||||
fi
|
||||
GO_ENV="$GO_PATH_ENV GOPROXY=${GO_PROXY} GOSUMDB=sum.golang.google.cn"
|
||||
if ! sudo bash -c "cd '$SOURCE_DIR' && $GO_ENV && go mod download" 2>&1; then
|
||||
echo -e "${YELLOW}⚠ 使用国内镜像下载失败,尝试使用官方源...${NC}"
|
||||
GO_ENV="$GO_PATH_ENV GOPROXY=${GO_PROXY} GOSUMDB=sum.golang.google.cn GOTIMEOUT=300"
|
||||
|
||||
# 显示当前 Go 环境信息
|
||||
echo -e "${BLUE}Go 环境信息:${NC}"
|
||||
sudo bash -c "cd '$SOURCE_DIR' && $GO_ENV && go env GOPROXY GOSUMDB" || true
|
||||
echo ""
|
||||
|
||||
# 先尝试整理依赖(显示详细信息)
|
||||
echo -e "${BLUE}整理 Go 模块依赖...${NC}"
|
||||
if ! sudo bash -c "cd '$SOURCE_DIR' && $GO_ENV && go mod tidy -v" 2>&1; then
|
||||
echo -e "${YELLOW}⚠ go mod tidy 失败,继续尝试下载依赖...${NC}"
|
||||
fi
|
||||
|
||||
# 下载依赖(显示详细进度)
|
||||
echo -e "${BLUE}开始下载 Go 依赖包(这可能需要一些时间)...${NC}"
|
||||
echo -e "${YELLOW}提示: 如果下载速度慢,请检查网络连接和代理设置${NC}"
|
||||
echo ""
|
||||
|
||||
# 设置更长的超时时间和启用详细输出
|
||||
DOWNLOAD_START_TIME=$(date +%s)
|
||||
DOWNLOAD_LOG="/tmp/go_download_$$.log"
|
||||
|
||||
# 使用 -x 显示详细执行过程
|
||||
echo -e "${BLUE}正在下载依赖包,显示详细进度...${NC}"
|
||||
if sudo bash -c "cd '$SOURCE_DIR' && $GO_ENV && timeout 600 go mod download -x" > "$DOWNLOAD_LOG" 2>&1; then
|
||||
DOWNLOAD_END_TIME=$(date +%s)
|
||||
DOWNLOAD_DURATION=$((DOWNLOAD_END_TIME - DOWNLOAD_START_TIME))
|
||||
echo -e "${GREEN}✓ 依赖下载完成 (耗时: ${DOWNLOAD_DURATION}秒)${NC}"
|
||||
# 显示下载摘要
|
||||
echo -e "${BLUE}下载摘要:${NC}"
|
||||
grep -E "(downloading|get|found)" "$DOWNLOAD_LOG" | tail -20 | while IFS= read -r line; do
|
||||
echo " $line"
|
||||
done || true
|
||||
else
|
||||
DOWNLOAD_EXIT_CODE=$?
|
||||
DOWNLOAD_END_TIME=$(date +%s)
|
||||
DOWNLOAD_DURATION=$((DOWNLOAD_END_TIME - DOWNLOAD_START_TIME))
|
||||
|
||||
if [ "$DOWNLOAD_EXIT_CODE" = "124" ]; then
|
||||
echo -e "${YELLOW}⚠ 下载超时 (${DOWNLOAD_DURATION}秒),但可能已下载部分依赖${NC}"
|
||||
echo -e "${YELLOW}继续尝试编译,如果失败请检查网络连接${NC}"
|
||||
else
|
||||
echo -e "${YELLOW}⚠ 使用国内镜像下载失败 (耗时: ${DOWNLOAD_DURATION}秒,退出码: ${DOWNLOAD_EXIT_CODE})${NC}"
|
||||
echo -e "${YELLOW}最后30行日志:${NC}"
|
||||
tail -30 "$DOWNLOAD_LOG" 2>/dev/null || true
|
||||
echo ""
|
||||
echo -e "${YELLOW}尝试使用官方源...${NC}"
|
||||
# 如果失败,尝试使用官方源
|
||||
GO_ENV="$GO_PATH_ENV GOPROXY=https://proxy.golang.org,direct"
|
||||
if ! sudo bash -c "cd '$SOURCE_DIR' && $GO_ENV && go mod download" 2>&1; then
|
||||
echo -e "${RED}下载依赖失败${NC}"
|
||||
GO_ENV="$GO_PATH_ENV GOPROXY=https://proxy.golang.org,direct GOSUMDB=sum.golang.google.cn GOTIMEOUT=300"
|
||||
DOWNLOAD_START_TIME=$(date +%s)
|
||||
if sudo bash -c "cd '$SOURCE_DIR' && $GO_ENV && timeout 600 go mod download -x" > "$DOWNLOAD_LOG" 2>&1; then
|
||||
DOWNLOAD_END_TIME=$(date +%s)
|
||||
DOWNLOAD_DURATION=$((DOWNLOAD_END_TIME - DOWNLOAD_START_TIME))
|
||||
echo -e "${GREEN}✓ 依赖下载完成 (耗时: ${DOWNLOAD_DURATION}秒)${NC}"
|
||||
else
|
||||
echo -e "${RED}下载依赖失败,最后100行日志:${NC}"
|
||||
tail -100 "$DOWNLOAD_LOG" 2>/dev/null || true
|
||||
rm -f "$DOWNLOAD_LOG"
|
||||
show_build_alternatives
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
rm -f "$DOWNLOAD_LOG" 2>/dev/null || true
|
||||
|
||||
# 编译到临时文件(在用户有权限的目录),然后移动到目标位置
|
||||
echo -e "${BLUE}编译二进制文件...${NC}"
|
||||
@@ -729,17 +795,24 @@ build_from_source() {
|
||||
BINARY_PATH="$SOURCE_DIR/agent"
|
||||
|
||||
# 使用 sudo 以 root 用户编译,直接输出到目标位置,确保 PATH 包含 Go,并设置 GOPROXY
|
||||
if sudo bash -c "cd '$SOURCE_DIR' && $GO_ENV && GOOS=linux GOARCH=${ARCH} CGO_ENABLED=0 go build -buildvcs=false -ldflags='-w -s' -o '$BINARY_PATH' ./cmd/agent" 2>&1; then
|
||||
echo -e "${BLUE}开始编译(架构: ${ARCH})...${NC}"
|
||||
if sudo bash -c "cd '$SOURCE_DIR' && $GO_ENV && GOOS=linux GOARCH=${ARCH} CGO_ENABLED=0 go build -v -buildvcs=false -ldflags='-w -s' -o '$BINARY_PATH' ./cmd/agent" 2>&1 | tee /tmp/go_build.log; then
|
||||
if [ -f "$BINARY_PATH" ] && [ -s "$BINARY_PATH" ]; then
|
||||
sudo chmod +x "$BINARY_PATH"
|
||||
echo -e "${GREEN}✓ 编译成功${NC}"
|
||||
BINARY_SIZE=$(du -h "$BINARY_PATH" | cut -f1)
|
||||
echo -e "${GREEN}✓ 编译成功 (文件大小: ${BINARY_SIZE})${NC}"
|
||||
rm -f /tmp/go_build.log 2>/dev/null || true
|
||||
else
|
||||
echo -e "${RED}编译失败:未生成二进制文件${NC}"
|
||||
echo -e "${YELLOW}编译日志:${NC}"
|
||||
cat /tmp/go_build.log 2>/dev/null || true
|
||||
show_build_alternatives
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo -e "${RED}编译失败${NC}"
|
||||
echo -e "${RED}编译失败,编译日志:${NC}"
|
||||
cat /tmp/go_build.log 2>/dev/null || true
|
||||
rm -f /tmp/go_build.log 2>/dev/null || true
|
||||
show_build_alternatives
|
||||
exit 1
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user