From 7ac5d54a84ca21e1922257017bdddc53be803ae4 Mon Sep 17 00:00:00 2001 From: yoyo Date: Sun, 7 Dec 2025 18:05:27 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E5=92=8C=E6=9B=BF=E6=8D=A2=E6=9E=84=E5=BB=BA=E5=8F=8A=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除旧的 build-all.sh 和 upload.sh 脚本 - 新增 all-build.sh 和 all-upload-release.sh 脚本,支持从 version.json 自动读取版本号 - 更新 Makefile 和 README.md 以反映脚本名称的更改和新功能 --- Makefile | 2 +- README.md | 112 ++++++++++++++++++----------- build-all.sh => all-build.sh | 43 ++++++++++- upload.sh => all-upload-release.sh | 75 +++++++++++++++---- version.json | 4 ++ 5 files changed, 179 insertions(+), 57 deletions(-) rename build-all.sh => all-build.sh (85%) rename upload.sh => all-upload-release.sh (92%) create mode 100644 version.json diff --git a/Makefile b/Makefile index bb69cb6..443c38d 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ build-linux: GOOS=linux GOARCH=amd64 go build -o bin/linkmaster-node-linux ./cmd/agent build-all: - @./build-all.sh + @./all-build.sh clean: rm -rf bin/ diff --git a/README.md b/README.md index 0a74e66..f572bda 100644 --- a/README.md +++ b/README.md @@ -280,36 +280,36 @@ BACKEND_URL=http://192.168.1.100:8080 ./run.sh start - 需要确保源码目录存在且是 Git 仓库 - 需要 Go 环境已安装并在 PATH 中 -### 5. build-all.sh - 跨平台编译脚本 +### 5. all-build.sh - 跨平台编译脚本 -编译多个操作系统和架构的二进制文件,支持并行编译。 +编译多个操作系统和架构的二进制文件,支持并行编译。**版本号自动从 `version.json` 读取**。 **使用方法:** ```bash -# 编译所有平台 -./build-all.sh +# 编译所有平台(自动使用 version.json 中的版本号) +./all-build.sh # 只编译指定平台 -./build-all.sh -p linux/amd64 +./all-build.sh -p linux/amd64 # 编译前清理输出目录 -./build-all.sh -c +./all-build.sh -c # 设置并行编译数量 -./build-all.sh -j 2 +./all-build.sh -j 2 -# 设置版本号 -./build-all.sh -v 1.0.0 +# 覆盖版本号(覆盖 version.json 中的版本) +./all-build.sh -v 1.0.0 # 只生成不带版本号的文件 -./build-all.sh -s +./all-build.sh -s # 列出所有支持的平台 -./build-all.sh -l +./all-build.sh -l # 显示帮助信息 -./build-all.sh -h +./all-build.sh -h ``` **支持的平台:** @@ -321,53 +321,63 @@ BACKEND_URL=http://192.168.1.100:8080 ./run.sh start - `windows/arm64` - Windows ARM64 **功能特性:** -- 支持并行编译(默认 4 个任务) -- 自动生成带版本号和不带版本号的文件 -- 输出到 `bin/` 目录 -- 显示编译进度和结果 -- 支持清理输出目录 +- ✅ **自动从 `version.json` 读取版本号**(无需手动指定) +- ✅ 支持并行编译(默认 4 个任务) +- ✅ 自动生成带版本号和不带版本号的文件 +- ✅ 输出到 `bin/` 目录 +- ✅ 显示编译进度和结果 +- ✅ 支持清理输出目录 **输出文件:** - `bin/agent-{os}-{arch}` - 不带版本号的二进制文件 - `bin/agent-{os}-{arch}-{version}` - 带版本号的二进制文件 - Windows 平台会自动添加 `.exe` 扩展名 -### 6. upload.sh - 发布上传脚本 +**版本管理:** +版本号统一从 `version.json` 文件读取: +```json +{ + "version": "1.1.0", + "tag": "v1.1.0" +} +``` -将编译好的二进制文件上传到 Releases 或通过其他方式发布。 +### 6. all-upload-release.sh - 发布上传脚本 + +将编译好的二进制文件上传到 Releases 或通过其他方式发布。**版本号和标签自动从 `version.json` 读取,Token 已硬编码**。 **使用方法:** ```bash -# 上传到 Gitea Releases(自动从 .git/config 读取仓库信息) -./upload.sh -m gitea -t v1.0.0 -v 1.0.0 +# 上传到 Gitea Releases(自动从 version.json 和 .git/config 读取信息) +./all-upload-release.sh -m gitea -# 指定 Gitea 访问令牌 -./upload.sh -m gitea -t v1.0.0 -v 1.0.0 -T your_token +# 上传到 Gitea Releases(覆盖版本号和标签) +./all-upload-release.sh -m gitea -t v1.2.0 -v 1.2.0 # 上传到 GitHub Releases -./upload.sh -m github -r owner/repo -t v1.0.0 -v 1.0.0 +./all-upload-release.sh -m github -r owner/repo -t v1.0.0 -v 1.0.0 # 通过 SCP 上传 -./upload.sh -m scp -H example.com -u user -d /path/to/release +./all-upload-release.sh -m scp -H example.com -u user -d /path/to/release # 通过 SCP 上传(指定私钥) -./upload.sh -m scp -H example.com -u user -d /path/to/release -k ~/.ssh/id_rsa +./all-upload-release.sh -m scp -H example.com -u user -d /path/to/release -k ~/.ssh/id_rsa # 通过 FTP 上传 -./upload.sh -m ftp -H ftp.example.com -u user -d /path/to/release +./all-upload-release.sh -m ftp -H ftp.example.com -u user -d /path/to/release # 复制到本地目录 -./upload.sh -m local -d /path/to/release +./all-upload-release.sh -m local -d /path/to/release # 只打包不上传 -./upload.sh --pack-only -v 1.0.0 +./all-upload-release.sh --pack-only # 不上传压缩包,直接上传二进制文件 -./upload.sh -m scp --no-pack -H example.com -u user -d /path/to/release +./all-upload-release.sh -m scp --no-pack -H example.com -u user -d /path/to/release # 显示帮助信息 -./upload.sh -h +./all-upload-release.sh -h ``` **支持的上传方式:** @@ -378,19 +388,21 @@ BACKEND_URL=http://192.168.1.100:8080 ./run.sh start - `local` - 复制到本地目录 **功能特性:** -- 自动打包二进制文件(tar.gz 或 zip) -- 自动创建发布说明 -- 支持指定平台上传 -- 支持自定义版本号和标签 -- 支持自定义发布说明 -- 自动检测并处理已存在的 Release +- ✅ **自动从 `version.json` 读取版本号和标签**(无需手动指定) +- ✅ **Token 已硬编码**(无需手动指定) +- ✅ 自动打包二进制文件(tar.gz 或 zip) +- ✅ 自动创建发布说明 +- ✅ 支持指定平台上传 +- ✅ 支持自定义版本号和标签(覆盖配置文件) +- ✅ 支持自定义发布说明 +- ✅ 自动检测并处理已存在的 Release **参数说明:** -- `-m, --method`: 上传方式(gitea|github|scp|ftp|local) -- `-v, --version`: 版本号(默认: 时间戳) -- `-t, --tag`: Git 标签(Releases 需要) +- `-m, --method`: 上传方式(gitea|github|scp|ftp|local,默认: gitea) +- `-v, --version`: 版本号(默认: 从 version.json 读取) +- `-t, --tag`: Git 标签(默认: 从 version.json 读取) - `-p, --platform`: 只上传指定平台 -- `-T, --token`: 访问令牌(Gitea/GitHub) +- `-T, --token`: 访问令牌(已硬编码,此选项已废弃) - `-H, --host`: 主机地址(SCP/FTP) - `-u, --user`: 用户名(SCP/FTP) - `-d, --dest`: 目标路径(SCP/FTP/local) @@ -398,6 +410,24 @@ BACKEND_URL=http://192.168.1.100:8080 ./run.sh start - `--pack-only`: 只打包不上传 - `--no-pack`: 不上传压缩包,直接上传二进制文件 +**版本管理:** +版本号和标签统一从 `version.json` 文件读取: +```json +{ + "version": "1.1.0", + "tag": "v1.1.0" +} +``` + +**典型工作流程:** +```bash +# 1. 编译所有平台(自动使用 version.json 中的版本号) +./all-build.sh + +# 2. 上传到 Gitea Releases(自动使用 version.json 中的版本号和标签) +./all-upload-release.sh -m gitea +``` + ### 7. vendor.sh - Vendor 依赖打包脚本 将项目依赖下载到 vendor 目录,客户端克隆后可直接编译,无需网络连接。 diff --git a/build-all.sh b/all-build.sh similarity index 85% rename from build-all.sh rename to all-build.sh index 45515db..d057672 100755 --- a/build-all.sh +++ b/all-build.sh @@ -15,9 +15,48 @@ NC='\033[0m' # No Color # 项目信息 PROJECT_NAME="agent" BUILD_DIR="bin" -VERSION="${VERSION:-$(date +%Y%m%d-%H%M%S)}" MAIN_PACKAGE="./cmd/agent" +# 版本配置文件路径 +VERSION_FILE="version.json" + +# 从版本配置文件读取版本信息 +read_version_config() { + local version_file="${VERSION_FILE}" + + if [ ! -f "$version_file" ]; then + return 1 + fi + + # 检查是否有 jq 命令 + if command -v jq &> /dev/null; then + local version=$(jq -r '.version' "$version_file" 2>/dev/null) + + if [ -n "$version" ] && [ "$version" != "null" ]; then + echo "$version" + return 0 + fi + else + # 如果没有 jq,使用 grep 和 sed 解析 JSON + local version=$(grep -o '"version"[[:space:]]*:[[:space:]]*"[^"]*"' "$version_file" 2>/dev/null | sed 's/.*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/') + + if [ -n "$version" ]; then + echo "$version" + return 0 + fi + fi + + return 1 +} + +# 初始化版本号(从配置文件读取,如果失败则使用时间戳) +VERSION_CONFIG=$(read_version_config) +if [ $? -eq 0 ] && [ -n "$VERSION_CONFIG" ]; then + VERSION="${VERSION:-$VERSION_CONFIG}" +else + VERSION="${VERSION:-$(date +%Y%m%d-%H%M%S)}" +fi + # 支持的平台列表 # 格式: OS/ARCH PLATFORMS=( @@ -40,7 +79,7 @@ usage() { echo " -l, --list 列出所有支持的平台" echo " -c, --clean 编译前清理输出目录" echo " -j, --jobs N 并行编译数量 (默认: 4)" - echo " -v, --version VERSION 设置版本号 (默认: 时间戳)" + echo " -v, --version VERSION 设置版本号 (默认: 从 version.json 读取)" echo " -s, --simple-only 只生成不带版本号的文件(默认生成两个)" echo "" echo -e "${BLUE}示例:${NC}" diff --git a/upload.sh b/all-upload-release.sh similarity index 92% rename from upload.sh rename to all-upload-release.sh index c0ced1a..26e8932 100755 --- a/upload.sh +++ b/all-upload-release.sh @@ -16,10 +16,57 @@ NC='\033[0m' # No Color # 项目信息 PROJECT_NAME="agent" BUILD_DIR="bin" -VERSION="${VERSION:-$(date +%Y%m%d-%H%M%S)}" RELEASE_DIR="release" TEMP_DIR=$(mktemp -d) +# Gitea Token (硬编码) +GITEA_TOKEN="3becb08eee31b422481ce1b8986de1cd645b468e" + +# 版本配置文件路径 +VERSION_FILE="version.json" + +# 从版本配置文件读取版本信息 +read_version_config() { + local version_file="${VERSION_FILE}" + + if [ ! -f "$version_file" ]; then + return 1 + fi + + # 检查是否有 jq 命令 + if command -v jq &> /dev/null; then + local version=$(jq -r '.version' "$version_file" 2>/dev/null) + local tag=$(jq -r '.tag' "$version_file" 2>/dev/null) + + if [ -n "$version" ] && [ "$version" != "null" ]; then + echo "$version|$tag" + return 0 + fi + else + # 如果没有 jq,使用 grep 和 sed 解析 JSON + local version=$(grep -o '"version"[[:space:]]*:[[:space:]]*"[^"]*"' "$version_file" 2>/dev/null | sed 's/.*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/') + local tag=$(grep -o '"tag"[[:space:]]*:[[:space:]]*"[^"]*"' "$version_file" 2>/dev/null | sed 's/.*"tag"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/') + + if [ -n "$version" ]; then + echo "$version|$tag" + return 0 + fi + fi + + return 1 +} + +# 初始化版本号(从配置文件读取,如果失败则使用时间戳) +VERSION_CONFIG=$(read_version_config) +if [ $? -eq 0 ] && [ -n "$VERSION_CONFIG" ]; then + IFS='|' read -r config_version config_tag <<< "$VERSION_CONFIG" + VERSION="${VERSION:-$config_version}" + DEFAULT_TAG="${config_tag}" +else + VERSION="${VERSION:-$(date +%Y%m%d-%H%M%S)}" + DEFAULT_TAG="" +fi + # 支持的平台列表 PLATFORMS=( "linux/amd64" @@ -51,7 +98,7 @@ usage() { echo " -t, --tag TAG Git标签 (GitHub/Gitea Releases需要)" echo " -r, --repo REPO 仓库 (格式: owner/repo,默认从.git/config读取)" echo " -b, --base-url URL Gitea基础URL (默认从.git/config读取)" - echo " -T, --token TOKEN 访问令牌 (Gitea需要,也可通过GITEA_TOKEN环境变量)" + echo " -T, --token TOKEN 访问令牌 (已硬编码,此选项已废弃)" echo " -d, --dest DEST 目标路径 (SCP/FTP/local需要)" echo " -H, --host HOST 主机地址 (SCP/FTP需要)" echo " -u, --user USER 用户名 (SCP/FTP需要)" @@ -64,9 +111,9 @@ usage() { echo "" echo -e "${BLUE}上传方式说明:${NC}" echo "" - echo -e "${CYAN}Gitea Releases (自动从.git/config读取):${NC}" + echo -e "${CYAN}Gitea Releases (自动从.git/config和version.json读取):${NC}" + echo " $0 -m gitea" echo " $0 -m gitea -t v1.0.0 -v 1.0.0" - echo " $0 -m gitea -t v1.0.0 -v 1.0.0 -T your_token" echo "" echo -e "${CYAN}GitHub Releases:${NC}" echo " $0 -m github -r owner/repo -t v1.0.0 -v 1.0.0" @@ -185,7 +232,7 @@ check_dependencies() { check_build_files() { if [ ! -d "$BUILD_DIR" ] || [ -z "$(ls -A $BUILD_DIR 2>/dev/null)" ]; then echo -e "${RED}错误: 构建目录为空或不存在${NC}" - echo "请先运行 ./build-all.sh 编译项目" + echo "请先运行 ./all-build.sh 编译项目" exit 1 fi @@ -206,7 +253,7 @@ check_build_files() { if [ $found -eq 0 ]; then echo -e "${RED}错误: 未找到任何构建文件${NC}" - echo "请先运行 ./build-all.sh 编译项目" + echo "请先运行 ./all-build.sh 编译项目" exit 1 fi } @@ -385,12 +432,13 @@ upload_gitea() { exit 1 fi + # Token 已硬编码,确保使用硬编码的 token if [ -z "$token" ]; then token="${GITEA_TOKEN}" fi if [ -z "$token" ]; then - echo -e "${RED}错误: 访问令牌未指定,使用 -T TOKEN 或设置 GITEA_TOKEN 环境变量${NC}" + echo -e "${RED}错误: 访问令牌未配置${NC}" exit 1 fi @@ -682,10 +730,10 @@ upload_local() { main() { local method="gitea" local selected_platforms=() - local tag="" + local tag="${DEFAULT_TAG}" local repo="" local base_url="" - local token="" + local token="${GITEA_TOKEN}" # 使用硬编码的 token local dest="" local host="" local user="" @@ -727,7 +775,7 @@ main() { shift 2 ;; -T|--token) - token="$2" + echo -e "${YELLOW}警告: Token 已硬编码,-T 参数将被忽略${NC}" shift 2 ;; -d|--dest) @@ -847,9 +895,10 @@ main() { if [ -z "$repo" ]; then repo="${git_owner}/${git_repo_name}" fi - if [ -z "$token" ] && [ -n "$git_token" ]; then - token="$git_token" - fi + # Token 已硬编码,不从 git config 读取 + # if [ -z "$token" ] && [ -n "$git_token" ]; then + # token="$git_token" + # fi echo -e "${CYAN}[信息]${NC} 从 .git/config 读取仓库信息: ${repo}" fi fi diff --git a/version.json b/version.json new file mode 100644 index 0000000..ddde6f0 --- /dev/null +++ b/version.json @@ -0,0 +1,4 @@ +{ + "version": "1.1.0", + "tag": "v1.1.0" +}