diff --git a/scripts/BUILD.md b/scripts/BUILD.md new file mode 100644 index 0000000..5d6ee80 --- /dev/null +++ b/scripts/BUILD.md @@ -0,0 +1,188 @@ +# GitCodeStatic 打包脚本说明文档 + +## 打包脚本概述 + +本项目提供了多个构建脚本,支持在不同平台下构建和打包 GitCodeStatic 项目: + +- `build-all.sh` - Unix/Linux/macOS 下的全平台构建脚本 +- `build-all.bat` - Windows 下的全平台构建脚本 +- `build.ps1` - Windows PowerShell 构建脚本(单平台) +- `build-linux.sh` - Linux 专用构建脚本 +- `build-macos.sh` - macOS 专用构建脚本 + +## 使用方法 + +### 快速构建全平台包 + +**Linux/macOS:** +```bash +cd scripts +chmod +x build-all.sh +./build-all.sh [版本号] [输出目录] +``` + +**Windows:** +```batch +cd scripts +build-all.bat [版本号] [输出目录] +``` + +### 参数说明 + +- `版本号`: 可选,默认为 "latest" +- `输出目录`: 可选,默认为 "dist" + +### 示例 + +```bash +# 使用默认参数构建 +./build-all.sh + +# 指定版本号 +./build-all.sh v1.2.3 + +# 指定版本号和输出目录 +./build-all.sh v1.2.3 releases +``` + +## 支持的平台 + +脚本会为以下平台构建二进制文件和安装包: + +| 平台 | 架构 | 二进制文件 | 压缩包格式 | +|------|------|-----------|-----------| +| Windows | amd64 | gitcodestatic.exe | .zip | +| Linux | amd64 | gitcodestatic | .tar.gz | +| Linux | arm64 | gitcodestatic | .tar.gz | +| macOS | amd64 | gitcodestatic | .tar.gz | +| macOS | arm64 | gitcodestatic | .tar.gz | + +## 输出结构 + +构建完成后,每个平台的包都包含以下文件: + +``` +gitcodestatic-{平台}-{架构}-{版本}/ +├── gitcodestatic[.exe] # 主程序 +├── web/ # Web 前端文件 +│ ├── index.html +│ └── static/ +├── configs/ # 配置文件 +│ └── config.yaml +├── README.md # 项目说明 +├── QUICKSTART.md # 快速开始指南 +├── start.[sh|bat] # 启动脚本 +└── [使用说明.txt|README_{平台}.md] # 平台特定说明 +``` + +## 启动脚本 + +每个包都包含平台特定的启动脚本: + +**Windows (`start.bat`):** +```batch +@echo off +echo Starting GitCodeStatic Server... +echo Web UI: http://localhost:8080 +gitcodestatic.exe +pause +``` + +**Unix/Linux (`start.sh`):** +```bash +#!/bin/bash +echo "Starting GitCodeStatic Server..." +echo "Web UI: http://localhost:8080" +chmod +x "./gitcodestatic" +./gitcodestatic +``` + +## 特殊说明 + +### CGO 处理 + +- **Windows amd64**: 启用 CGO (CGO_ENABLED=1) 用于 SQLite 支持 +- **其他平台**: 禁用 CGO (CGO_ENABLED=0) 以简化交叉编译 + +### 压缩格式 + +- **Windows**: 使用 ZIP 格式压缩 +- **Unix/Linux/macOS**: 使用 tar.gz 格式压缩 + +### 兼容性 + +- 构建脚本自动检测可用的压缩工具 +- 如果系统缺少特定工具,会尝试使用替代方案 + +## 前置要求 + +### 必需: +- Go 1.21+ +- Git (用于版本信息) + +### 可选(用于压缩): +- **Linux/macOS**: tar, gzip +- **Windows**: PowerShell (内置压缩) 或 zip 命令 + +## 故障排除 + +### 常见问题 + +1. **权限错误** + ```bash + chmod +x scripts/*.sh + ``` + +2. **Go 模块错误** + ```bash + go mod tidy + go mod download + ``` + +3. **交叉编译失败** + - 确保 Go 版本 >= 1.21 + - 检查网络连接(可能需要下载工具链) + +4. **压缩失败** + - Windows: 确保 PowerShell 可用 + - Unix: 安装 tar 和 gzip + +### 调试模式 + +设置环境变量启用详细输出: +```bash +export GOOS_DEBUG=1 +./build-all.sh +``` + +## 自定义构建 + +如需自定义构建过程,可以修改脚本中的以下部分: + +1. **平台列表**: 编辑 `PLATFORMS` 数组 +2. **构建标志**: 修改 `go build -ldflags` 参数 +3. **包含文件**: 调整文件复制逻辑 +4. **压缩设置**: 更改压缩格式或参数 + +## 部署建议 + +构建完成后的包可以直接部署到目标服务器: + +1. **解压包文件**到目标目录 +2. **运行启动脚本**或直接执行二进制文件 +3. **访问 Web 界面**: http://localhost:8080 +4. **查看 API 文档**: http://localhost:8080/swagger/ + +## 版本管理 + +脚本会在构建时自动注入版本信息: + +```bash +go build -ldflags "-X main.Version=v1.2.3" +``` + +版本号可通过程序参数或环境变量查看: + +```bash +./gitcodestatic --version +``` \ No newline at end of file diff --git a/scripts/build-all.bat b/scripts/build-all.bat new file mode 100644 index 0000000..495598d --- /dev/null +++ b/scripts/build-all.bat @@ -0,0 +1,218 @@ +@echo off +setlocal enabledelayedexpansion + +REM GitCodeStatic Windows 全平台构建脚本 +REM 使用 PowerShell 的交叉编译功能构建所有平台的包 + +set "VERSION=%1" +set "OUTPUT_DIR=%2" + +if "%VERSION%"=="" set "VERSION=latest" +if "%OUTPUT_DIR%"=="" set "OUTPUT_DIR=dist" + +echo 开始全平台构建 GitCodeStatic v%VERSION%... + +REM 设置变量 +set "PROJECT_ROOT=%~dp0\.." +set "OUTPUT_PATH=%PROJECT_ROOT%\%OUTPUT_DIR%" + +REM 清理输出目录 +if exist "%OUTPUT_PATH%" ( + echo 清理旧的输出目录... + rmdir /s /q "%OUTPUT_PATH%" +) +mkdir "%OUTPUT_PATH%" + +REM 平台列表 +set PLATFORMS=windows/amd64 linux/amd64 darwin/amd64 linux/arm64 darwin/arm64 + +cd /d "%PROJECT_ROOT%" + +for %%P in (%PLATFORMS%) do ( + echo. + echo 构建 %%P... + + REM 解析平台字符串 + for /f "tokens=1,2 delims=/" %%A in ("%%P") do ( + set "GOOS=%%A" + set "GOARCH=%%B" + ) + + REM 设置输出文件名 + set "BINARY_NAME=gitcodestatic" + if "!GOOS!"=="windows" set "BINARY_NAME=gitcodestatic.exe" + + REM 设置包名 + set "PACKAGE_NAME=gitcodestatic-!GOOS!-!GOARCH!-!VERSION!" + set "PACKAGE_PATH=!OUTPUT_PATH!\!PACKAGE_NAME!" + + mkdir "!PACKAGE_PATH!" + + REM 设置构建环境 + set "GOOS=!GOOS!" + set "GOARCH=!GOARCH!" + set "CGO_ENABLED=1" + + REM ARM64 和交叉编译时禁用 CGO + if "!GOARCH!"=="arm64" set "CGO_ENABLED=0" + if not "!GOOS!"=="windows" set "CGO_ENABLED=0" + + echo 构建二进制文件... + go build -ldflags "-s -w -X main.Version=!VERSION!" -o "!PACKAGE_PATH!\!BINARY_NAME!" cmd\server\main.go + + if !errorlevel! neq 0 ( + echo 构建 %%P 失败! + continue + ) + + echo 复制文件... + + REM 复制通用文件 + xcopy /E /I /Y web "!PACKAGE_PATH!\web\" > nul + xcopy /E /I /Y configs "!PACKAGE_PATH!\configs\" > nul + copy /Y README.md "!PACKAGE_PATH!\" > nul + copy /Y QUICKSTART.md "!PACKAGE_PATH!\" > nul + + REM 根据平台创建特定的启动脚本 + if "!GOOS!"=="windows" ( + REM Windows 启动脚本 + ( + echo @echo off + echo echo Starting GitCodeStatic Server... + echo echo. + echo echo Web UI: http://localhost:8080 + echo echo API Docs: http://localhost:8080/swagger/ + echo echo. + echo gitcodestatic.exe + echo pause + ) > "!PACKAGE_PATH!\start.bat" + + REM Windows 配置说明 + ( + echo GitCodeStatic Windows 版本 + echo. + echo ## 使用方法 + echo 1. 双击 start.bat 启动服务器 + echo 2. 打开浏览器访问 http://localhost:8080 + echo 3. 查看 API 文档: http://localhost:8080/swagger/ + echo. + echo ## 配置文件 + echo - configs/config.yaml: 主配置文件 + echo. + echo ## 停止服务 + echo - 在命令窗口中按 Ctrl+C 停止服务器 + ) > "!PACKAGE_PATH!\使用说明.txt" + + ) else ( + REM Unix 启动脚本 + ( + echo #!/bin/bash + echo echo "Starting GitCodeStatic Server..." + echo echo "" + echo echo "Web UI: http://localhost:8080" + echo echo "API Docs: http://localhost:8080/swagger/" + echo echo "" + echo echo "Press Ctrl+C to stop the server" + echo echo "" + echo. + echo chmod +x "./gitcodestatic" + echo ./gitcodestatic + ) > "!PACKAGE_PATH!\start.sh" + + REM Unix 说明文件 + ( + echo # GitCodeStatic !GOOS! 版本 + echo. + echo ## 快速启动 + echo ```bash + echo ./start.sh + echo # 或 + echo ./gitcodestatic + echo ``` + echo. + echo ## 配置文件 + echo - configs/config.yaml: 主配置文件 + echo. + echo ## 访问地址 + echo - Web UI: http://localhost:8080 + echo - API 文档: http://localhost:8080/swagger/ + echo. + echo ## 停止服务 + echo 按 Ctrl+C 停止服务器 + ) > "!PACKAGE_PATH!\README_!GOOS!.md" + ) + + echo 创建压缩包... + cd /d "!OUTPUT_PATH!" + + if "!GOOS!"=="windows" ( + REM Windows 使用内置压缩 + powershell -command "Compress-Archive -Path '!PACKAGE_NAME!' -DestinationPath '!PACKAGE_NAME!.zip' -Force" 2>nul + if !errorlevel! equ 0 ( + echo ✓ 已创建 !PACKAGE_NAME!.zip + ) else ( + echo ⚠ 创建压缩包失败 + ) + ) else ( + REM Unix 平台压缩包(如果有 tar 命令) + where tar >nul 2>nul + if !errorlevel! equ 0 ( + tar -czf "!PACKAGE_NAME!.tar.gz" "!PACKAGE_NAME!" + if !errorlevel! equ 0 ( + echo ✓ 已创建 !PACKAGE_NAME!.tar.gz + ) else ( + echo ⚠ 创建 tar.gz 失败 + ) + ) else ( + powershell -command "Compress-Archive -Path '!PACKAGE_NAME!' -DestinationPath '!PACKAGE_NAME!.zip' -Force" 2>nul + if !errorlevel! equ 0 ( + echo ✓ 已创建 !PACKAGE_NAME!.zip + ) else ( + echo ⚠ 创建压缩包失败 + ) + ) + ) + + cd /d "%PROJECT_ROOT%" +) + +echo. +echo =================================== +echo 全平台构建完成! +echo =================================== +echo 输出目录: %OUTPUT_PATH% +echo. +echo 构建的平台: + +cd /d "%OUTPUT_PATH%" + +REM 显示构建结果 +for %%P in (%PLATFORMS%) do ( + for /f "tokens=1,2 delims=/" %%A in ("%%P") do ( + set "GOOS=%%A" + set "GOARCH=%%B" + set "PACKAGE_NAME=gitcodestatic-!GOOS!-!GOARCH!-!VERSION!" + + if "!GOOS!"=="windows" ( + set "ARCHIVE=!PACKAGE_NAME!.zip" + ) else ( + set "ARCHIVE=!PACKAGE_NAME!.tar.gz" + if not exist "!ARCHIVE!" set "ARCHIVE=!PACKAGE_NAME!.zip" + ) + + if exist "!ARCHIVE!" ( + for %%F in ("!ARCHIVE!") do echo ✓ !GOOS!/!GOARCH! - !ARCHIVE! ^(%%~zF 字节^) + ) else ( + echo ✗ !GOOS!/!GOARCH! - 构建失败 + ) + ) +) + +echo. + +REM 统计文件 +set /a COUNT=0 +for %%F in (*.zip *.tar.gz) do set /a COUNT+=1 +echo 总文件数: !COUNT! + +pause \ No newline at end of file diff --git a/scripts/build-all.sh b/scripts/build-all.sh new file mode 100644 index 0000000..b7a14ba --- /dev/null +++ b/scripts/build-all.sh @@ -0,0 +1,200 @@ +#!/bin/bash + +# GitCodeStatic 全平台构建脚本 +# 在支持交叉编译的环境中构建所有平台的包 + +set -e + +VERSION=${1:-"latest"} +OUTPUT_DIR=${2:-"dist"} + +echo "开始全平台构建 GitCodeStatic v$VERSION..." + +# 设置变量 +PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +OUTPUT_PATH="$PROJECT_ROOT/$OUTPUT_DIR" + +# 清理输出目录 +if [ -d "$OUTPUT_PATH" ]; then + echo "清理旧的输出目录..." + rm -rf "$OUTPUT_PATH" +fi + +mkdir -p "$OUTPUT_PATH" + +# 平台列表: OS/ARCH +PLATFORMS=( + "windows/amd64" + "linux/amd64" + "darwin/amd64" + "linux/arm64" + "darwin/arm64" +) + +cd "$PROJECT_ROOT" + +for platform in "${PLATFORMS[@]}"; do + IFS='/' read -r GOOS GOARCH <<< "$platform" + + echo "" + echo "构建 $GOOS/$GOARCH..." + + # 设置输出文件名 + BINARY_NAME="gitcodestatic" + if [ "$GOOS" = "windows" ]; then + BINARY_NAME="gitcodestatic.exe" + fi + + # 设置包名 + PACKAGE_NAME="gitcodestatic-$GOOS-$GOARCH-$VERSION" + PACKAGE_PATH="$OUTPUT_PATH/$PACKAGE_NAME" + + mkdir -p "$PACKAGE_PATH" + + # 设置构建环境 + export GOOS="$GOOS" + export GOARCH="$GOARCH" + export CGO_ENABLED=1 + + # 特殊处理:ARM64 和交叉编译时禁用 CGO + if [ "$GOARCH" = "arm64" ] || [ "$(uname)" != "$(echo $GOOS | tr '[:lower:]' '[:upper:]')" ]; then + export CGO_ENABLED=0 + fi + + echo " 构建二进制文件..." + go build -ldflags "-s -w -X main.Version=$VERSION" -o "$PACKAGE_PATH/$BINARY_NAME" cmd/server/main.go + + echo " 复制文件..." + + # 复制通用文件 + cp -r web "$PACKAGE_PATH/" + cp -r configs "$PACKAGE_PATH/" + cp README.md "$PACKAGE_PATH/" + cp QUICKSTART.md "$PACKAGE_PATH/" + + # 根据平台创建特定的启动脚本 + if [ "$GOOS" = "windows" ]; then + # Windows 启动脚本 + cat > "$PACKAGE_PATH/start.bat" << 'EOF' +@echo off +echo Starting GitCodeStatic Server... +echo. +echo Web UI: http://localhost:8080 +echo API Docs: http://localhost:8080/swagger/ +echo. +gitcodestatic.exe +pause +EOF + + # Windows 配置说明 + cat > "$PACKAGE_PATH/使用说明.txt" << 'EOF' +GitCodeStatic Windows 版本 + +## 使用方法 +1. 双击 start.bat 启动服务器 +2. 打开浏览器访问 http://localhost:8080 +3. 查看 API 文档: http://localhost:8080/swagger/ + +## 配置文件 +- configs/config.yaml: 主配置文件 + +## 停止服务 +- 在命令窗口中按 Ctrl+C 停止服务器 +EOF + + else + # Unix 启动脚本 + cat > "$PACKAGE_PATH/start.sh" << 'EOF' +#!/bin/bash +echo "Starting GitCodeStatic Server..." +echo "" +echo "Web UI: http://localhost:8080" +echo "API Docs: http://localhost:8080/swagger/" +echo "" +echo "Press Ctrl+C to stop the server" +echo "" + +chmod +x "./gitcodestatic" +./gitcodestatic +EOF + chmod +x "$PACKAGE_PATH/start.sh" + + # Unix 说明文件 + cat > "$PACKAGE_PATH/README_$GOOS.md" << EOF +# GitCodeStatic $GOOS 版本 + +## 快速启动 +\`\`\`bash +./start.sh +# 或 +./gitcodestatic +\`\`\` + +## 配置文件 +- configs/config.yaml: 主配置文件 + +## 访问地址 +- Web UI: http://localhost:8080 +- API 文档: http://localhost:8080/swagger/ + +## 停止服务 +按 Ctrl+C 停止服务器 +EOF + fi + + # 设置可执行权限 + chmod +x "$PACKAGE_PATH/$BINARY_NAME" + + # 创建压缩包 + echo " 创建压缩包..." + cd "$OUTPUT_PATH" + + if [ "$GOOS" = "windows" ]; then + # Windows 使用 zip + if command -v zip >/dev/null 2>&1; then + zip -r "$PACKAGE_NAME.zip" "$PACKAGE_NAME/" >/dev/null + echo " ✓ 已创建 $PACKAGE_NAME.zip" + else + echo " ⚠ 未找到 zip 命令,跳过压缩" + fi + else + # Unix 使用 tar.gz + tar -czf "$PACKAGE_NAME.tar.gz" "$PACKAGE_NAME" + echo " ✓ 已创建 $PACKAGE_NAME.tar.gz" + fi + + cd "$PROJECT_ROOT" +done + +echo "" +echo "===================================" +echo "全平台构建完成!" +echo "===================================" +echo "输出目录: $OUTPUT_PATH" +echo "" +echo "构建的平台:" + +# 显示构建结果 +cd "$OUTPUT_PATH" +for platform in "${PLATFORMS[@]}"; do + IFS='/' read -r GOOS GOARCH <<< "$platform" + PACKAGE_NAME="gitcodestatic-$GOOS-$GOARCH-$VERSION" + + if [ "$GOOS" = "windows" ]; then + ARCHIVE="$PACKAGE_NAME.zip" + else + ARCHIVE="$PACKAGE_NAME.tar.gz" + fi + + if [ -f "$ARCHIVE" ]; then + SIZE=$(du -h "$ARCHIVE" | cut -f1) + echo " ✓ $GOOS/$GOARCH - $ARCHIVE ($SIZE)" + else + echo " ✗ $GOOS/$GOARCH - 构建失败" + fi +done + +echo "" +echo "总文件数: $(ls -1 *.tar.gz *.zip 2>/dev/null | wc -l)" +TOTAL_SIZE=$(du -sh . | cut -f1) +echo "总大小: $TOTAL_SIZE" \ No newline at end of file diff --git a/scripts/build-linux.sh b/scripts/build-linux.sh new file mode 100644 index 0000000..7d30f0c --- /dev/null +++ b/scripts/build-linux.sh @@ -0,0 +1,204 @@ +#!/bin/bash + +# GitCodeStatic Linux 打包脚本 +# Bash 脚本用于在 Linux 平台构建和打包 + +set -e + +VERSION=${1:-"latest"} +OUTPUT_DIR=${2:-"dist"} + +echo "开始构建 GitCodeStatic for Linux..." + +# 设置变量 +PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +BINARY_NAME="gitcodestatic" +PACKAGE_NAME="gitcodestatic-linux-$VERSION" +OUTPUT_PATH="$PROJECT_ROOT/$OUTPUT_DIR" +PACKAGE_PATH="$OUTPUT_PATH/$PACKAGE_NAME" + +# 清理输出目录 +if [ -d "$PACKAGE_PATH" ]; then + echo "清理旧的输出目录..." + rm -rf "$PACKAGE_PATH" +fi + +# 创建输出目录 +mkdir -p "$PACKAGE_PATH" + +# 设置构建环境 +export GOOS=linux +export GOARCH=amd64 +export CGO_ENABLED=1 + +echo "构建 Go 二进制文件..." +cd "$PROJECT_ROOT" + +# 构建二进制文件 +go build -ldflags "-s -w -X main.Version=$VERSION" -o "$PACKAGE_PATH/$BINARY_NAME" cmd/server/main.go + +echo "复制必需的文件..." + +# 复制 web 静态文件 +cp -r web "$PACKAGE_PATH/" + +# 复制配置文件 +cp -r configs "$PACKAGE_PATH/" + +# 复制文档文件 +cp README.md "$PACKAGE_PATH/" +cp QUICKSTART.md "$PACKAGE_PATH/" + +# 创建启动脚本 +cat > "$PACKAGE_PATH/start.sh" << 'EOF' +#!/bin/bash + +echo "Starting GitCodeStatic Server..." +echo "" +echo "Web UI: http://localhost:8080" +echo "API Docs: http://localhost:8080/swagger/" +echo "" +echo "Press Ctrl+C to stop the server" +echo "" + +# 设置可执行权限 +chmod +x "./gitcodestatic" + +# 启动服务器 +./gitcodestatic +EOF + +chmod +x "$PACKAGE_PATH/start.sh" + +# 创建系统服务文件 +cat > "$PACKAGE_PATH/gitcodestatic.service" << EOF +[Unit] +Description=GitCodeStatic Git Repository Statistics Service +After=network.target + +[Service] +Type=simple +User=gitcodestatic +WorkingDirectory=/opt/gitcodestatic +ExecStart=/opt/gitcodestatic/gitcodestatic +Restart=always +RestartSec=10 + +[Install] +WantedBy=multi-user.target +EOF + +# 创建安装脚本 +cat > "$PACKAGE_PATH/install.sh" << 'EOF' +#!/bin/bash + +# GitCodeStatic Linux 安装脚本 + +set -e + +if [ "$EUID" -ne 0 ]; then + echo "请使用 sudo 运行此安装脚本" + exit 1 +fi + +echo "安装 GitCodeStatic..." + +# 创建用户 +if ! id "gitcodestatic" &>/dev/null; then + echo "创建 gitcodestatic 用户..." + useradd -r -s /bin/false gitcodestatic +fi + +# 创建安装目录 +INSTALL_DIR="/opt/gitcodestatic" +mkdir -p "$INSTALL_DIR" + +# 复制文件 +echo "复制文件到 $INSTALL_DIR..." +cp -r ./* "$INSTALL_DIR/" + +# 设置权限 +chown -R gitcodestatic:gitcodestatic "$INSTALL_DIR" +chmod +x "$INSTALL_DIR/gitcodestatic" + +# 安装系统服务 +echo "安装系统服务..." +cp "$INSTALL_DIR/gitcodestatic.service" /etc/systemd/system/ +systemctl daemon-reload + +echo "安装完成!" +echo "" +echo "使用以下命令管理服务:" +echo " 启动服务: sudo systemctl start gitcodestatic" +echo " 停止服务: sudo systemctl stop gitcodestatic" +echo " 开机自启: sudo systemctl enable gitcodestatic" +echo " 查看状态: sudo systemctl status gitcodestatic" +echo "" +echo "服务将在 http://localhost:8080 上运行" +EOF + +chmod +x "$PACKAGE_PATH/install.sh" + +# 创建配置说明 +cat > "$PACKAGE_PATH/README_Linux.md" << 'EOF' +# GitCodeStatic Linux 版本 + +## 快速启动 + +```bash +# 直接运行 +./start.sh + +# 或者直接运行二进制文件 +./gitcodestatic +``` + +## 系统服务安装 + +```bash +# 以 root 权限安装 +sudo ./install.sh + +# 启动服务 +sudo systemctl start gitcodestatic + +# 开机自启 +sudo systemctl enable gitcodestatic +``` + +## 配置文件 + +- `configs/config.yaml`: 主配置文件 +- 可以修改端口、数据库路径等配置 + +## 数据目录 + +- 日志文件: `logs/app.log` +- 数据库文件: `workspace/gitcodestatic.db` +- 仓库缓存: `workspace/repos/` + +## 访问地址 + +- Web UI: http://localhost:8080 +- API 文档: http://localhost:8080/swagger/ + +## 停止服务 + +- 直接运行: 按 `Ctrl+C` +- 系统服务: `sudo systemctl stop gitcodestatic` +EOF + +# 设置二进制文件权限 +chmod +x "$PACKAGE_PATH/$BINARY_NAME" + +# 创建 tar.gz 包 +echo "创建压缩包..." +cd "$OUTPUT_PATH" +tar -czf "$PACKAGE_NAME.tar.gz" "$PACKAGE_NAME" + +echo "构建完成!" +echo "输出路径: $OUTPUT_PATH/$PACKAGE_NAME.tar.gz" + +# 显示文件大小 +FILE_SIZE=$(stat -c%s "$PACKAGE_NAME.tar.gz" 2>/dev/null || stat -f%z "$PACKAGE_NAME.tar.gz" 2>/dev/null) +echo "压缩包大小: $(echo "scale=2; $FILE_SIZE/1024/1024" | bc) MB" \ No newline at end of file diff --git a/scripts/build-macos.sh b/scripts/build-macos.sh new file mode 100644 index 0000000..ec909a6 --- /dev/null +++ b/scripts/build-macos.sh @@ -0,0 +1,256 @@ +#!/bin/bash + +# GitCodeStatic macOS 打包脚本 +# Bash 脚本用于在 macOS 平台构建和打包 + +set -e + +VERSION=${1:-"latest"} +OUTPUT_DIR=${2:-"dist"} + +echo "开始构建 GitCodeStatic for macOS..." + +# 设置变量 +PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +BINARY_NAME="gitcodestatic" +PACKAGE_NAME="gitcodestatic-macos-$VERSION" +OUTPUT_PATH="$PROJECT_ROOT/$OUTPUT_DIR" +PACKAGE_PATH="$OUTPUT_PATH/$PACKAGE_NAME" + +# 清理输出目录 +if [ -d "$PACKAGE_PATH" ]; then + echo "清理旧的输出目录..." + rm -rf "$PACKAGE_PATH" +fi + +# 创建输出目录 +mkdir -p "$PACKAGE_PATH" + +# 设置构建环境 +export GOOS=darwin +export GOARCH=amd64 +export CGO_ENABLED=1 + +echo "构建 Go 二进制文件..." +cd "$PROJECT_ROOT" + +# 构建二进制文件 +go build -ldflags "-s -w -X main.Version=$VERSION" -o "$PACKAGE_PATH/$BINARY_NAME" cmd/server/main.go + +echo "复制必需的文件..." + +# 复制 web 静态文件 +cp -r web "$PACKAGE_PATH/" + +# 复制配置文件 +cp -r configs "$PACKAGE_PATH/" + +# 复制文档文件 +cp README.md "$PACKAGE_PATH/" +cp QUICKSTART.md "$PACKAGE_PATH/" + +# 创建启动脚本 +cat > "$PACKAGE_PATH/start.sh" << 'EOF' +#!/bin/bash + +echo "Starting GitCodeStatic Server..." +echo "" +echo "Web UI: http://localhost:8080" +echo "API Docs: http://localhost:8080/swagger/" +echo "" +echo "Press Ctrl+C to stop the server" +echo "" + +# 设置可执行权限 +chmod +x "./gitcodestatic" + +# 启动服务器 +./gitcodestatic +EOF + +chmod +x "$PACKAGE_PATH/start.sh" + +# 创建 LaunchAgent plist 文件 +cat > "$PACKAGE_PATH/com.gitcodestatic.server.plist" << EOF + + + + + Label + com.gitcodestatic.server + ProgramArguments + + /usr/local/bin/gitcodestatic + + RunAtLoad + + KeepAlive + + WorkingDirectory + /usr/local/opt/gitcodestatic + StandardOutPath + /usr/local/var/log/gitcodestatic.log + StandardErrorPath + /usr/local/var/log/gitcodestatic.error.log + + +EOF + +# 创建 Homebrew 安装脚本 +cat > "$PACKAGE_PATH/install-macos.sh" << 'EOF' +#!/bin/bash + +# GitCodeStatic macOS 安装脚本 + +set -e + +echo "安装 GitCodeStatic for macOS..." + +# 检查是否有管理员权限 +if [ "$EUID" -ne 0 ]; then + echo "注意:某些操作可能需要管理员权限" +fi + +# 创建安装目录 +INSTALL_DIR="/usr/local/opt/gitcodestatic" +BIN_DIR="/usr/local/bin" + +echo "创建安装目录: $INSTALL_DIR" +sudo mkdir -p "$INSTALL_DIR" +sudo mkdir -p "/usr/local/var/log" + +# 复制文件 +echo "复制文件..." +sudo cp -r ./* "$INSTALL_DIR/" + +# 创建符号链接 +echo "创建符号链接..." +sudo ln -sf "$INSTALL_DIR/gitcodestatic" "$BIN_DIR/gitcodestatic" + +# 设置权限 +sudo chmod +x "$INSTALL_DIR/gitcodestatic" +sudo chmod +x "$BIN_DIR/gitcodestatic" + +# 安装 LaunchAgent +echo "安装 LaunchAgent..." +LAUNCH_AGENTS_DIR="$HOME/Library/LaunchAgents" +mkdir -p "$LAUNCH_AGENTS_DIR" +cp "$INSTALL_DIR/com.gitcodestatic.server.plist" "$LAUNCH_AGENTS_DIR/" + +echo "安装完成!" +echo "" +echo "使用方法:" +echo " 直接运行: gitcodestatic" +echo " 启动服务: launchctl load ~/Library/LaunchAgents/com.gitcodestatic.server.plist" +echo " 停止服务: launchctl unload ~/Library/LaunchAgents/com.gitcodestatic.server.plist" +echo "" +echo "服务将在 http://localhost:8080 上运行" +echo "配置文件位置: $INSTALL_DIR/configs/config.yaml" +EOF + +chmod +x "$PACKAGE_PATH/install-macos.sh" + +# 创建卸载脚本 +cat > "$PACKAGE_PATH/uninstall-macos.sh" << 'EOF' +#!/bin/bash + +# GitCodeStatic macOS 卸载脚本 + +set -e + +echo "卸载 GitCodeStatic..." + +# 停止服务 +launchctl unload ~/Library/LaunchAgents/com.gitcodestatic.server.plist 2>/dev/null || true + +# 删除 LaunchAgent +rm -f ~/Library/LaunchAgents/com.gitcodestatic.server.plist + +# 删除符号链接 +sudo rm -f /usr/local/bin/gitcodestatic + +# 删除安装目录 +sudo rm -rf /usr/local/opt/gitcodestatic + +# 删除日志文件 +sudo rm -f /usr/local/var/log/gitcodestatic.log +sudo rm -f /usr/local/var/log/gitcodestatic.error.log + +echo "卸载完成!" +EOF + +chmod +x "$PACKAGE_PATH/uninstall-macos.sh" + +# 创建配置说明 +cat > "$PACKAGE_PATH/README_macOS.md" << 'EOF' +# GitCodeStatic macOS 版本 + +## 快速启动 + +```bash +# 直接运行 +./start.sh + +# 或者直接运行二进制文件 +./gitcodestatic +``` + +## 系统安装 + +```bash +# 安装到系统目录 +./install-macos.sh + +# 全局使用 +gitcodestatic +``` + +## 服务管理 + +```bash +# 启动后台服务 +launchctl load ~/Library/LaunchAgents/com.gitcodestatic.server.plist + +# 停止后台服务 +launchctl unload ~/Library/LaunchAgents/com.gitcodestatic.server.plist + +# 卸载 +./uninstall-macos.sh +``` + +## 配置文件 + +- `configs/config.yaml`: 主配置文件 +- 可以修改端口、数据库路径等配置 + +## 数据目录 + +- 日志文件: `logs/app.log` +- 数据库文件: `workspace/gitcodestatic.db` +- 仓库缓存: `workspace/repos/` + +## 访问地址 + +- Web UI: http://localhost:8080 +- API 文档: http://localhost:8080/swagger/ + +## 停止服务 + +- 直接运行: 按 `Ctrl+C` +- 后台服务: `launchctl unload ~/Library/LaunchAgents/com.gitcodestatic.server.plist` +EOF + +# 设置二进制文件权限 +chmod +x "$PACKAGE_PATH/$BINARY_NAME" + +# 创建 tar.gz 包 +echo "创建压缩包..." +cd "$OUTPUT_PATH" +tar -czf "$PACKAGE_NAME.tar.gz" "$PACKAGE_NAME" + +echo "构建完成!" +echo "输出路径: $OUTPUT_PATH/$PACKAGE_NAME.tar.gz" + +# 显示文件大小 +FILE_SIZE=$(stat -f%z "$PACKAGE_NAME.tar.gz" 2>/dev/null || stat -c%s "$PACKAGE_NAME.tar.gz" 2>/dev/null) +echo "压缩包大小: $(echo "scale=2; $FILE_SIZE/1024/1024" | bc) MB" \ No newline at end of file diff --git a/scripts/build.ps1 b/scripts/build.ps1 new file mode 100644 index 0000000..05b1ce7 --- /dev/null +++ b/scripts/build.ps1 @@ -0,0 +1,113 @@ +# GitCodeStatic Windows 打包脚本 +# PowerShell 脚本用于在 Windows 平台构建和打包 + +param( + [string]$Version = "latest", + [string]$OutputDir = "dist" +) + +Write-Host "开始构建 GitCodeStatic for Windows..." -ForegroundColor Green + +# 设置变量 +$ProjectRoot = Split-Path -Parent $PSScriptRoot +$BinaryName = "gitcodestatic.exe" +$PackageName = "gitcodestatic-windows-$Version" +$OutputPath = Join-Path $ProjectRoot $OutputDir +$PackagePath = Join-Path $OutputPath $PackageName + +# 清理输出目录 +if (Test-Path $PackagePath) { + Write-Host "清理旧的输出目录..." -ForegroundColor Yellow + Remove-Item -Recurse -Force $PackagePath +} + +# 创建输出目录 +New-Item -ItemType Directory -Path $PackagePath -Force | Out-Null + +# 设置构建环境 +$env:GOOS = "windows" +$env:GOARCH = "amd64" +$env:CGO_ENABLED = "1" + +Write-Host "构建 Go 二进制文件..." -ForegroundColor Blue +Set-Location $ProjectRoot + +# 构建二进制文件 +$BuildCmd = "go build -ldflags `"-s -w -X main.Version=$Version`" -o `"$PackagePath\$BinaryName`" cmd/server/main.go" +Invoke-Expression $BuildCmd + +if ($LASTEXITCODE -ne 0) { + Write-Error "构建失败!" + exit 1 +} + +Write-Host "复制必需的文件..." -ForegroundColor Blue + +# 复制 web 静态文件 +Copy-Item -Recurse -Path "web" -Destination "$PackagePath\web" + +# 复制配置文件 +Copy-Item -Recurse -Path "configs" -Destination "$PackagePath\configs" + +# 复制文档文件 +Copy-Item -Path "README.md" -Destination $PackagePath +Copy-Item -Path "QUICKSTART.md" -Destination $PackagePath + +# 创建启动脚本 +$StartScript = @" +@echo off +echo Starting GitCodeStatic Server... +echo. +echo Web UI: http://localhost:8080 +echo API Docs: http://localhost:8080/swagger/ +echo. +gitcodestatic.exe +pause +"@ + +$StartScript | Out-File -FilePath "$PackagePath\start.bat" -Encoding ASCII + +# 创建配置说明 +$ConfigInfo = @" +GitCodeStatic Windows 版本 + +## 使用方法 + +1. 双击 start.bat 启动服务器 +2. 打开浏览器访问 http://localhost:8080 +3. 查看 API 文档: http://localhost:8080/swagger/ + +## 配置文件 + +- configs/config.yaml: 主配置文件 +- 可以修改端口、数据库路径等配置 + +## 日志和数据 + +- 日志文件: logs/app.log +- 数据库文件: workspace/gitcodestatic.db +- 仓库缓存: workspace/repos/ + +## 停止服务 + +- 在命令窗口中按 Ctrl+C 停止服务器 +"@ + +$ConfigInfo | Out-File -FilePath "$PackagePath\使用说明.txt" -Encoding UTF8 + +# 创建 ZIP 包 +Write-Host "创建压缩包..." -ForegroundColor Blue +$ZipPath = "$OutputPath\$PackageName.zip" +if (Test-Path $ZipPath) { + Remove-Item $ZipPath +} + +# 使用 PowerShell 5.0+ 的压缩功能 +Compress-Archive -Path "$PackagePath\*" -DestinationPath $ZipPath + +Write-Host "构建完成!" -ForegroundColor Green +Write-Host "输出路径: $ZipPath" -ForegroundColor Green + +# 显示文件大小 +$ZipSize = (Get-Item $ZipPath).Length +Write-Host "压缩包大小: $([math]::Round($ZipSize/1MB, 2)) MB" -ForegroundColor Green \ No newline at end of file