重启也本地依赖编译

This commit is contained in:
2025-12-03 21:57:18 +08:00
parent 238589b82e
commit 0bed6eba94

View File

@@ -15,11 +15,38 @@ cd "$SCRIPT_DIR"
BINARY_NAME="agent"
BACKEND_URL="${BACKEND_URL:-http://localhost:8080}"
# 检查二进制文件是否存在且有效
check_binary() {
if [ -f "$BINARY_NAME" ] && [ -x "$BINARY_NAME" ] && [ -s "$BINARY_NAME" ]; then
# 验证二进制文件类型Linux 应该是 ELF 文件)
if command -v file > /dev/null 2>&1; then
local file_type=$(file "$BINARY_NAME" 2>/dev/null || echo "")
if [ -n "$file_type" ] && echo "$file_type" | grep -qi "ELF"; then
return 0
fi
else
# 如果没有 file 命令,至少检查文件大小(应该大于 1MB
local file_size=$(stat -c%s "$BINARY_NAME" 2>/dev/null || stat -f%z "$BINARY_NAME" 2>/dev/null || echo "0")
if [ "$file_size" -gt 1048576 ]; then
return 0
fi
fi
fi
return 1
}
# 拉取最新源码并编译
update_and_build() {
# 如果二进制文件已存在且有效,跳过编译
if check_binary; then
echo "二进制文件已存在,跳过编译步骤"
return 0
fi
# 检查是否在 Git 仓库中
if [ ! -d ".git" ]; then
return 0
echo "错误: 不在 Git 仓库中,无法更新代码" >&2
return 1
fi
# 配置 Git safe.directory解决所有权问题
@@ -44,8 +71,28 @@ update_and_build() {
exit 1
fi
# 更新依赖
go mod download 2>&1 > /dev/null || true
# 检查是否有 vendor 目录
local use_vendor=false
if [ -d "./vendor" ] && [ -f "./vendor/modules.txt" ]; then
use_vendor=true
echo "使用 vendor 目录编译(无需网络连接)"
fi
# 更新依赖(仅在非 vendor 模式下,并设置超时避免卡住)
if [ "$use_vendor" != "true" ]; then
echo "更新 Go 依赖..."
# 使用 timeout 命令设置超时30秒如果系统没有 timeout 命令则直接执行
if command -v timeout > /dev/null 2>&1; then
timeout 30 go mod download 2>&1 > /dev/null || {
echo "警告: 依赖更新失败或超时,尝试继续编译" >&2
}
else
# 如果没有 timeout 命令,直接执行(可能卡住,但至少能工作)
go mod download 2>&1 > /dev/null || {
echo "警告: 依赖更新失败,尝试继续编译" >&2
}
fi
fi
# 编译
ARCH=$(uname -m)
@@ -61,21 +108,33 @@ update_and_build() {
;;
esac
if GOOS=linux GOARCH=${ARCH} CGO_ENABLED=0 go build -buildvcs=false -ldflags="-w -s" -o "$BINARY_NAME" ./cmd/agent 2>&1; then
# 构建编译命令
local build_cmd="GOOS=linux GOARCH=${ARCH} CGO_ENABLED=0 go build -buildvcs=false -ldflags=\"-w -s\""
if [ "$use_vendor" = "true" ]; then
build_cmd="$build_cmd -mod=vendor"
fi
build_cmd="$build_cmd -o \"$BINARY_NAME\" ./cmd/agent"
echo "开始编译(架构: ${ARCH}..."
if eval "$build_cmd" 2>&1; then
if [ -f "$BINARY_NAME" ] && [ -s "$BINARY_NAME" ]; then
chmod +x "$BINARY_NAME"
echo "编译成功"
return 0
else
echo "错误: 编译失败,未生成二进制文件" >&2
exit 1
return 1
fi
else
echo "错误: 编译失败" >&2
exit 1
return 1
fi
}
# 拉取最新源码并编译
# 检查并更新/编译
if ! check_binary; then
update_and_build
fi
# 设置环境变量
export BACKEND_URL="$BACKEND_URL"