功能开发完成

This commit is contained in:
2025-12-31 16:33:01 +08:00
parent 6f0598a859
commit 70fbe040f0
6 changed files with 1179 additions and 0 deletions

188
scripts/BUILD.md Normal file
View File

@@ -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
```

218
scripts/build-all.bat Normal file
View File

@@ -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

200
scripts/build-all.sh Normal file
View File

@@ -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"

204
scripts/build-linux.sh Normal file
View File

@@ -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"

256
scripts/build-macos.sh Normal file
View File

@@ -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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.gitcodestatic.server</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/gitcodestatic</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>WorkingDirectory</key>
<string>/usr/local/opt/gitcodestatic</string>
<key>StandardOutPath</key>
<string>/usr/local/var/log/gitcodestatic.log</string>
<key>StandardErrorPath</key>
<string>/usr/local/var/log/gitcodestatic.error.log</string>
</dict>
</plist>
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"

113
scripts/build.ps1 Normal file
View File

@@ -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