From 32a6a7485117361bf8ec35bfeb156c37657e36e3 Mon Sep 17 00:00:00 2001 From: yoyo Date: Wed, 3 Dec 2025 18:37:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=90=86=E5=A2=9E=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install.sh | 102 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 96 insertions(+), 6 deletions(-) diff --git a/install.sh b/install.sh index 01a76b8..d55825b 100755 --- a/install.sh +++ b/install.sh @@ -712,6 +712,71 @@ 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 + # 配置 Git 使用代理(加速 GitHub 访问) + echo -e "${BLUE}配置 Git 代理(加速 GitHub 访问)...${NC}" + + # GitHub 代理镜像列表(按优先级排序) + GITHUB_PROXIES=( + "https://gh-proxy.com" + "https://githubproxy.cc" + "https://ghproxy.com" + "https://mirror.ghproxy.com" + "https://github.com.cnpmjs.org" + ) + + # 测试并选择可用的 GitHub 代理 + GITHUB_PROXY="" + for proxy in "${GITHUB_PROXIES[@]}"; do + echo -n " 测试 ${proxy}... " + # 测试代理是否可用(尝试访问 GitHub 主页) + if curl -sf --connect-timeout 3 --max-time 5 "${proxy}/https://github.com" > /dev/null 2>&1 || \ + curl -sf --connect-timeout 3 --max-time 5 "${proxy}" > /dev/null 2>&1; then + GITHUB_PROXY="$proxy" + echo -e "${GREEN}可用${NC}" + break + else + echo -e "${RED}不可用${NC}" + fi + done + + if [ -n "$GITHUB_PROXY" ]; then + # 配置 Git 使用代理 + echo -e "${GREEN}✓ 使用 GitHub 代理: ${GITHUB_PROXY}${NC}" + + # 根据不同的代理服务配置不同的 URL 格式 + if echo "$GITHUB_PROXY" | grep -q "gh-proxy.com\|githubproxy.cc"; then + # gh-proxy.com 和 githubproxy.cc 使用 /https://github.com/ 格式 + GIT_PROXY_URL="${GITHUB_PROXY}/https://github.com/" + sudo git config --global url."${GIT_PROXY_URL}".insteadOf "https://github.com/" 2>/dev/null || true + git config --global url."${GIT_PROXY_URL}".insteadOf "https://github.com/" 2>/dev/null || true + + # 配置 Git HTTP/HTTPS 代理 + sudo git config --global http.https://github.com.proxy "${GITHUB_PROXY}/" 2>/dev/null || true + git config --global http.https://github.com.proxy "${GITHUB_PROXY}/" 2>/dev/null || true + else + # 其他代理使用标准格式 + sudo git config --global url."${GITHUB_PROXY}/https://github.com/".insteadOf "https://github.com/" 2>/dev/null || true + git config --global url."${GITHUB_PROXY}/https://github.com/".insteadOf "https://github.com/" 2>/dev/null || true + + sudo git config --global http.https://github.com.proxy "${GITHUB_PROXY}/" 2>/dev/null || true + git config --global http.https://github.com.proxy "${GITHUB_PROXY}/" 2>/dev/null || true + fi + + # 设置环境变量(供 Go 使用) + export HTTP_PROXY="${GITHUB_PROXY}/" + export HTTPS_PROXY="${GITHUB_PROXY}/" + export http_proxy="${GITHUB_PROXY}/" + export https_proxy="${GITHUB_PROXY}/" + + # 添加到 Go 环境变量中 + GO_ENV="$GO_ENV HTTP_PROXY=${GITHUB_PROXY}/ HTTPS_PROXY=${GITHUB_PROXY}/ http_proxy=${GITHUB_PROXY}/ https_proxy=${GITHUB_PROXY}/" + + echo -e "${BLUE}已配置 Git 和 Go 使用 GitHub 代理加速${NC}" + else + echo -e "${YELLOW}⚠ 未找到可用的 GitHub 代理,将直接访问 GitHub${NC}" + echo -e "${YELLOW}提示: 如果 GitHub 访问慢,可以手动设置代理${NC}" + fi + # 配置 Go 代理(使用国内镜像) echo -e "${BLUE}配置 Go 代理(使用国内镜像加速)...${NC}" # Go 代理镜像列表(按优先级排序,使用多个镜像以提高成功率) @@ -760,7 +825,7 @@ build_from_source() { # 禁用 GOSUMDB 以避免连接 proxy.golang.org(在中国大陆通常无法访问) # 如果必须启用校验和,可以使用 GOSUMDB=sum.golang.google.cn,但可能仍有问题 - GO_ENV="$GO_PATH_ENV GOPROXY=${GO_PROXY} GOSUMDB=off GOTIMEOUT=300 GOPRIVATE=*" + GO_ENV="$GO_PATH_ENV GOPROXY=${GO_PROXY} GOSUMDB=off GOTIMEOUT=60 GONOPROXY= GONOSUMDB= GOPRIVATE=*" # 使用 go env -w 永久设置环境变量(避免被其他配置覆盖) echo -e "${BLUE}永久设置 Go 环境变量(避免连接 proxy.golang.org)...${NC}" @@ -783,7 +848,7 @@ build_from_source() { echo -e "${YELLOW}正在强制移除 proxy.golang.org...${NC}" CLEAN_PROXY=$(echo "$ACTUAL_GOPROXY" | sed 's|https://proxy.golang.org,||g' | sed 's|,https://proxy.golang.org||g' | sed 's|https://proxy.golang.org||g') GO_PROXY="$CLEAN_PROXY" - GO_ENV="$GO_PATH_ENV GOPROXY=${GO_PROXY} GOSUMDB=off GOTIMEOUT=300 GOPRIVATE=*" + GO_ENV="$GO_PATH_ENV GOPROXY=${GO_PROXY} GOSUMDB=off GOTIMEOUT=60 GONOPROXY= GONOSUMDB= GOPRIVATE=*" sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && go env -w GOPROXY=${GO_PROXY}" 2>/dev/null || true echo -e "${GREEN}✓ 已更新 GOPROXY: ${GO_PROXY}${NC}" fi @@ -819,10 +884,13 @@ build_from_source() { DOWNLOAD_LOG="/tmp/go_download_$$.log" DOWNLOAD_PROGRESS_LOG="/tmp/go_progress_$$.log" - # 在下载前再次确认环境变量设置 + # 在下载前再次确认环境变量设置(强制所有包都通过代理) sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && go env -w GOPROXY=${GO_PROXY}" 2>/dev/null || true sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && go env -w GOSUMDB=off" 2>/dev/null || true + sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && go env -w GONOPROXY=" 2>/dev/null || true + sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && go env -w GONOSUMDB=" 2>/dev/null || true sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && go env -w GOPRIVATE=*" 2>/dev/null || true + sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && go env -w GOTIMEOUT=60" 2>/dev/null || true # 使用命名管道来实时监控输出 PIPE_FILE="/tmp/go_download_pipe_$$" @@ -875,7 +943,16 @@ build_from_source() { PROGRESS_PID=$! # 使用 -x 标志下载,显示详细输出,同时写入日志和管道 - if sudo bash -c "cd '$SOURCE_DIR' && $GO_ENV && timeout 600 go mod download -x" 2>&1 | tee "$DOWNLOAD_LOG" "$PIPE_FILE"; then + # 设置较短的超时时间,避免长时间卡住 + echo -e "${BLUE}开始下载(超时时间:300秒)...${NC}" + + # 确保环境变量中包含代理设置 + if [ -n "$GITHUB_PROXY" ]; then + GO_ENV="$GO_ENV HTTP_PROXY=${GITHUB_PROXY}/ HTTPS_PROXY=${GITHUB_PROXY}/ http_proxy=${GITHUB_PROXY}/ https_proxy=${GITHUB_PROXY}/" + fi + + # 使用 timeout 命令设置总超时时间 + if timeout 300 sudo bash -c "cd '$SOURCE_DIR' && $GO_ENV && go mod download -x" 2>&1 | tee "$DOWNLOAD_LOG" "$PIPE_FILE"; then # 停止进度显示进程 touch "${DOWNLOAD_PROGRESS_LOG}.done" sleep 2 @@ -919,7 +996,7 @@ build_from_source() { # 清理管道文件 rm -f "$PIPE_FILE" 2>/dev/null || true - DOWNLOAD_EXIT_CODE=$? + DOWNLOAD_EXIT_CODE=${DOWNLOAD_EXIT_CODE:-$?} DOWNLOAD_END_TIME=$(date +%s) DOWNLOAD_DURATION=$((DOWNLOAD_END_TIME - DOWNLOAD_START_TIME)) @@ -941,7 +1018,20 @@ build_from_source() { echo -e "${YELLOW}尝试使用 direct 模式(直接从 GitHub/GitLab 等下载)...${NC}" # 如果失败,尝试使用 direct 模式,直接从源码仓库下载 # 注意:不使用 proxy.golang.org,因为在中国大陆无法访问 - GO_ENV="$GO_PATH_ENV GOPROXY=direct GOSUMDB=off GOTIMEOUT=300" + GO_ENV="$GO_PATH_ENV GOPROXY=direct GOSUMDB=off GOTIMEOUT=60 GONOPROXY= GONOSUMDB= GOPRIVATE=*" + + # 如果配置了 GitHub 代理,添加到环境变量 + if [ -n "$GITHUB_PROXY" ]; then + GO_ENV="$GO_ENV HTTP_PROXY=${GITHUB_PROXY}/ HTTPS_PROXY=${GITHUB_PROXY}/ http_proxy=${GITHUB_PROXY}/ https_proxy=${GITHUB_PROXY}/" + fi + + # 重新设置环境变量 + sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && go env -w GOPROXY=direct" 2>/dev/null || true + sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && go env -w GOSUMDB=off" 2>/dev/null || true + sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && go env -w GONOPROXY=" 2>/dev/null || true + sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && go env -w GONOSUMDB=" 2>/dev/null || true + sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && go env -w GOPRIVATE=*" 2>/dev/null || true + sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && go env -w GOTIMEOUT=60" 2>/dev/null || true # 重新启动进度显示 (