go安装增加从官网下载

This commit is contained in:
2025-12-03 17:37:00 +08:00
parent 72bbddd0aa
commit eba59d1429

View File

@@ -80,7 +80,6 @@ detect_fastest_mirror() {
# Ubuntu/Debian 镜像源列表
UBUNTU_MIRRORS=(
"mirrors.aliyun.com"
"mirrors.tuna.tsinghua.edu.cn"
"mirrors.ustc.edu.cn"
"mirrors.huaweicloud.com"
@@ -90,11 +89,9 @@ detect_fastest_mirror() {
# CentOS/RHEL 镜像源列表
CENTOS_MIRRORS=(
"mirrors.aliyun.com"
"mirrors.tuna.tsinghua.edu.cn"
"mirrors.ustc.edu.cn"
"mirrors.huaweicloud.com"
"mirrorlist.centos.org"
)
FASTEST_MIRROR=""
@@ -374,29 +371,137 @@ install_dependencies() {
echo -e "${GREEN}✓ 依赖安装完成${NC}"
}
# 从官网下载安装 Go
install_go_from_official() {
echo -e "${BLUE}从 Go 官网下载安装...${NC}"
# 检测架构
local arch=""
case "$ARCH" in
amd64)
arch="amd64"
;;
arm64)
arch="arm64"
;;
*)
echo -e "${RED}不支持的架构: $ARCH${NC}"
return 1
;;
esac
# Go 版本(可以根据需要修改)
local go_version="1.21.5"
local go_tar="go${go_version}.linux-${arch}.tar.gz"
local go_url="https://golang.google.cn/dl/${go_tar}"
# 如果国内镜像访问失败,尝试官方源
local download_success=false
# 尝试从国内镜像下载
echo -e "${BLUE}尝试从 Go 国内镜像下载...${NC}"
if curl -fsSL -o "/tmp/${go_tar}" "${go_url}" 2>/dev/null; then
download_success=true
else
# 尝试从官方源下载
echo -e "${BLUE}尝试从 Go 官方源下载...${NC}"
go_url="https://go.dev/dl/${go_tar}"
if curl -fsSL -o "/tmp/${go_tar}" "${go_url}" 2>/dev/null; then
download_success=true
fi
fi
if [ "$download_success" = false ]; then
echo -e "${RED}下载 Go 失败,请检查网络连接${NC}"
return 1
fi
# 删除旧版本(如果存在)
if [ -d "/usr/local/go" ]; then
echo -e "${BLUE}删除旧版本 Go...${NC}"
sudo rm -rf /usr/local/go
fi
# 解压安装
echo -e "${BLUE}安装 Go...${NC}"
sudo tar -C /usr/local -xzf "/tmp/${go_tar}" > /dev/null 2>&1
rm -f "/tmp/${go_tar}"
# 添加到 PATH如果还没有
if ! grep -q "/usr/local/go/bin" /etc/profile 2>/dev/null; then
echo 'export PATH=$PATH:/usr/local/go/bin' | sudo tee -a /etc/profile > /dev/null
fi
# 设置当前会话的 PATH
export PATH=$PATH:/usr/local/go/bin
# 验证安装
if command -v go > /dev/null 2>&1; then
GO_VERSION=$(go version 2>/dev/null | head -1)
echo -e "${GREEN}✓ Go 安装完成: ${GO_VERSION}${NC}"
return 0
else
echo -e "${YELLOW}⚠ Go 已安装但未在 PATH 中,请重新登录或执行: export PATH=\$PATH:/usr/local/go/bin${NC}"
# 临时添加到 PATH 继续执行
export PATH=$PATH:/usr/local/go/bin
if command -v go > /dev/null 2>&1; then
GO_VERSION=$(go version 2>/dev/null | head -1)
echo -e "${GREEN}✓ Go 安装完成: ${GO_VERSION}${NC}"
return 0
fi
return 1
fi
}
# 安装 Go 环境
install_go() {
echo -e "${BLUE}安装 Go 环境...${NC}"
if [ "$OS" = "ubuntu" ] || [ "$OS" = "debian" ]; then
sudo apt-get update -qq
sudo apt-get install -y -qq golang-go > /dev/null 2>&1
elif [ "$OS" = "centos" ] || [ "$OS" = "rhel" ] || [ "$OS" = "rocky" ] || [ "$OS" = "almalinux" ]; then
sudo yum install -y -q golang > /dev/null 2>&1
else
echo -e "${YELLOW}无法自动安装 Go请手动安装: https://golang.org/dl/${NC}"
show_build_alternatives
exit 1
fi
# 先检查是否已安装
if command -v go > /dev/null 2>&1; then
GO_VERSION=$(go version 2>/dev/null | head -1)
echo -e "${GREEN}✓ Go 安装完成: ${GO_VERSION}${NC}"
else
echo -e "${RED}Go 安装失败${NC}"
show_build_alternatives
exit 1
echo -e "${GREEN}✓ Go 安装: ${GO_VERSION}${NC}"
return 0
fi
# 尝试从系统包管理器安装
local install_success=false
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
install_success=true
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
install_success=true
fi
else
echo -e "${YELLOW}⚠ yum 源中未找到 golang 包,尝试从官网下载安装${NC}"
fi
fi
# 检查安装是否成功
if [ "$install_success" = true ] && command -v go > /dev/null 2>&1; then
GO_VERSION=$(go version 2>/dev/null | head -1)
echo -e "${GREEN}✓ Go 安装完成: ${GO_VERSION}${NC}"
return 0
fi
# 如果包管理器安装失败,从官网下载安装
echo -e "${BLUE}包管理器安装失败,尝试从官网下载安装...${NC}"
if install_go_from_official; then
return 0
fi
# 所有方法都失败
echo -e "${RED}Go 安装失败${NC}"
show_build_alternatives
exit 1
}
# 显示替代方案
@@ -497,6 +602,11 @@ build_from_source() {
install_go
fi
# 确保 Go 在 PATH 中(如果从官网安装的)
if [ -d "/usr/local/go/bin" ] && ! echo "$PATH" | grep -q "/usr/local/go/bin"; then
export PATH=$PATH:/usr/local/go/bin
fi
# 检查 Go 版本
GO_VERSION=$(go version 2>/dev/null | head -1 || echo "")
if [ -z "$GO_VERSION" ]; then
@@ -507,6 +617,14 @@ build_from_source() {
echo -e "${BLUE}检测到 Go 版本: ${GO_VERSION}${NC}"
# 确定 Go 的完整路径(用于 sudo 执行)
GO_BIN=$(command -v go)
if [ -z "$GO_BIN" ]; then
echo -e "${RED}无法找到 Go 可执行文件${NC}"
show_build_alternatives
exit 1
fi
# 如果源码目录已存在,删除(卸载函数应该已经删除,这里作为保险)
if [ -d "$SOURCE_DIR" ]; then
echo -e "${YELLOW}清理旧的源码目录...${NC}"
@@ -531,9 +649,14 @@ build_from_source() {
sudo git config --global --add safe.directory "$SOURCE_DIR" 2>/dev/null || true
git config --global --add safe.directory "$SOURCE_DIR" 2>/dev/null || true
# 下载依赖(使用 sudo 以 root 用户执行)
# 下载依赖(使用 sudo 以 root 用户执行,确保 PATH 包含 Go
echo -e "${BLUE}下载 Go 依赖...${NC}"
if ! sudo bash -c "cd '$SOURCE_DIR' && go mod download" 2>&1; then
# 构建包含 Go PATH 的环境变量
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
if ! sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && go mod download" 2>&1; then
echo -e "${RED}下载依赖失败${NC}"
show_build_alternatives
exit 1
@@ -544,8 +667,8 @@ build_from_source() {
TEMP_BINARY=$(mktemp)
BINARY_PATH="$SOURCE_DIR/agent"
# 使用 sudo 以 root 用户编译,直接输出到目标位置
if sudo bash -c "cd '$SOURCE_DIR' && GOOS=linux GOARCH=${ARCH} CGO_ENABLED=0 go build -buildvcs=false -ldflags='-w -s' -o '$BINARY_PATH' ./cmd/agent" 2>&1; then
# 使用 sudo 以 root 用户编译,直接输出到目标位置,确保 PATH 包含 Go
if sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && GOOS=linux GOARCH=${ARCH} CGO_ENABLED=0 go build -buildvcs=false -ldflags='-w -s' -o '$BINARY_PATH' ./cmd/agent" 2>&1; then
if [ -f "$BINARY_PATH" ] && [ -s "$BINARY_PATH" ]; then
sudo chmod +x "$BINARY_PATH"
echo -e "${GREEN}✓ 编译成功${NC}"