新增编译脚本和 github 工作流配置文件

This commit is contained in:
2026-01-26 22:48:48 +08:00
parent 50275265ac
commit 950a9aef9d
15 changed files with 416 additions and 83 deletions

53
scripts/build.bat Normal file
View File

@@ -0,0 +1,53 @@
@echo off
setlocal enabledelayedexpansion
set APP_NAME=BingPaper
set OUTPUT_DIR=output
echo 开始构建 %APP_NAME% 多平台二进制文件...
if exist %OUTPUT_DIR% rd /s /q %OUTPUT_DIR%
mkdir %OUTPUT_DIR%
set PLATFORMS=linux/amd64 linux/arm64 windows/amd64 windows/arm64 darwin/amd64 darwin/arm64
for %%p in (%PLATFORMS%) do (
for /f "tokens=1,2 delims=/" %%a in ("%%p") do (
set GOOS=%%a
set GOARCH=%%b
set OUTPUT_NAME=%APP_NAME%-%%a-%%b
set BINARY_NAME=!OUTPUT_NAME!
if "%%a"=="windows" set BINARY_NAME=!OUTPUT_NAME!.exe
echo 正在编译 %%a/%%b...
set PACKAGE_DIR=%OUTPUT_DIR%\!OUTPUT_NAME!
if not exist !PACKAGE_DIR! mkdir !PACKAGE_DIR!
env GOOS=%%a GOARCH=%%b CGO_ENABLED=0 go build -o !PACKAGE_DIR!\!BINARY_NAME! main.go
if !errorlevel! equ 0 (
echo %%a/%%b 编译成功
xcopy /e /i /y web !PACKAGE_DIR!\web >nul
copy /y config.example.yaml !PACKAGE_DIR!\ >nul
copy /y README.md !PACKAGE_DIR!\ >nul
pushd %OUTPUT_DIR%
tar -czf !OUTPUT_NAME!.tar.gz !OUTPUT_NAME!
rd /s /q !OUTPUT_NAME!
popd
echo %%a/%%b 打包完成: !OUTPUT_NAME!.tar.gz
) else (
echo %%a/%%b 编译失败
if exist !PACKAGE_DIR! rd /s /q !PACKAGE_DIR!
)
)
)
echo ----------------------------------------
echo 多平台打包完成!输出目录: %OUTPUT_DIR%
dir /s /b %OUTPUT_DIR%
pause

67
scripts/build.ps1 Normal file
View File

@@ -0,0 +1,67 @@
$AppName = "BingPaper"
$OutputDir = "output"
Write-Host "开始构建 $AppName 多平台二进制文件..."
if (Test-Path $OutputDir) {
Remove-Item -Recurse -Force $OutputDir
}
New-Item -ItemType Directory -Path $OutputDir | Out-Null
$Platforms = @(
"linux/amd64",
"linux/arm64",
"windows/amd64",
"windows/arm64",
"darwin/amd64",
"darwin/arm64"
)
foreach ($Platform in $Platforms) {
$parts = $Platform.Split("/")
$OS = $parts[0]
$Arch = $parts[1]
$OutputName = "$AppName-$OS-$Arch"
$BinaryName = $OutputName
if ($OS -eq "windows") {
$BinaryName = "$OutputName.exe"
}
Write-Host "正在编译 $OS/$Arch..."
$PackageDir = Join-Path $OutputDir $OutputName
if (-not (Test-Path $PackageDir)) {
New-Item -ItemType Directory -Path $PackageDir | Out-Null
}
$env:GOOS = $OS
$env:GOARCH = $Arch
$env:CGO_ENABLED = "0"
go build -o (Join-Path $PackageDir $BinaryName) main.go
if ($LASTEXITCODE -eq 0) {
Write-Host " $OS/$Arch 编译成功"
Copy-Item -Recurse "web" $PackageDir\
Copy-Item "config.example.yaml" $PackageDir\
Copy-Item "README.md" $PackageDir\
$CurrentDir = Get-Location
Set-Location $OutputDir
tar -czf "${OutputName}.tar.gz" $OutputName
Remove-Item -Recurse -Force $OutputName
Set-Location $CurrentDir
Write-Host " $OS/$Arch 打包完成: ${OutputName}.tar.gz"
} else {
Write-Host " $OS/$Arch 编译失败"
if (Test-Path $PackageDir) {
Remove-Item -Recurse -Force $PackageDir
}
}
}
Write-Host "----------------------------------------"
Write-Host "多平台打包完成!输出目录: $OutputDir"
Get-ChildItem -Recurse $OutputDir

82
scripts/build.sh Executable file
View File

@@ -0,0 +1,82 @@
#!/bin/bash
# 获取脚本所在目录并切换到项目根目录
cd "$(dirname "$0")/.."
# 设置变量
APP_NAME="BingPaper"
OUTPUT_DIR="output"
# 定义目标平台
PLATFORMS=(
"linux/amd64"
"linux/arm64"
"windows/amd64"
"windows/arm64"
"darwin/amd64"
"darwin/arm64"
)
# 需要包含的额外文件/目录
EXTRA_FILES=("web" "config.example.yaml" "README.md")
echo "开始构建 $APP_NAME 多平台二进制文件..."
# 清理 output 目录
if [ -d "$OUTPUT_DIR" ]; then
echo "正在清理 $OUTPUT_DIR 目录..."
rm -rf "$OUTPUT_DIR"
fi
mkdir -p "$OUTPUT_DIR"
# 循环编译各平台
for PLATFORM in "${PLATFORMS[@]}"; do
# 分离 OS 和 ARCH
OS=$(echo $PLATFORM | cut -d'/' -f1)
ARCH=$(echo $PLATFORM | cut -d'/' -f2)
# 设置输出名称
OUTPUT_NAME="${APP_NAME}-${OS}-${ARCH}"
if [ "$OS" = "windows" ]; then
BINARY_NAME="${OUTPUT_NAME}.exe"
else
BINARY_NAME="${OUTPUT_NAME}"
fi
echo "正在编译 ${OS}/${ARCH}..."
# 创建临时打包目录
PACKAGE_DIR="${OUTPUT_DIR}/${OUTPUT_NAME}"
mkdir -p "$PACKAGE_DIR"
# 现在已移除 CGO 依赖,使用 CGO_ENABLED=0 以支持轻松的跨平台编译
GOOS=$OS GOARCH=$ARCH CGO_ENABLED=0 go build -o "${PACKAGE_DIR}/${BINARY_NAME}" main.go
if [ $? -eq 0 ]; then
echo " ${OS}/${ARCH} 编译成功"
# 复制额外文件
for file in "${EXTRA_FILES[@]}"; do
if [ -e "$file" ]; then
cp -r "$file" "$PACKAGE_DIR/"
fi
done
# 压缩为 tar.gz
tar -czf "${OUTPUT_DIR}/${OUTPUT_NAME}.tar.gz" -C "${OUTPUT_DIR}" "${OUTPUT_NAME}"
# 删除临时打包目录
rm -rf "$PACKAGE_DIR"
echo " ${OS}/${ARCH} 打包完成: ${OUTPUT_NAME}.tar.gz"
else
echo " ${OS}/${ARCH} 编译失败"
# 编译失败时清理临时目录
rm -rf "$PACKAGE_DIR"
fi
done
echo "----------------------------------------"
echo "多平台打包完成!输出目录: $OUTPUT_DIR"
ls -R "$OUTPUT_DIR"

44
scripts/tag.sh Executable file
View File

@@ -0,0 +1,44 @@
#!/bin/bash
# 获取版本号
TAG_NAME=$1
if [ -z "$TAG_NAME" ]; then
echo "Usage: ./scripts/tag.sh <version>"
exit 1
fi
# 确保在 master 分支
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [ "$CURRENT_BRANCH" != "master" ]; then
echo "Error: Must be on master branch to tag. Current branch: $CURRENT_BRANCH"
exit 1
fi
# 检查是否有未提交的代码
if [ -n "$(git status --porcelain)" ]; then
echo "Error: You have uncommitted changes. Please commit or stash them first."
exit 1
fi
# 拉取最新代码
echo "Updating master branch..."
git pull origin master
# 检查本地和远端是否一致
LOCAL=$(git rev-parse @)
REMOTE=$(git rev-parse @{u})
if [ "$LOCAL" != "$REMOTE" ]; then
echo "Error: Local branch is not in sync with remote. Please push your changes first."
exit 1
fi
# 创建并推送 tag
echo "Creating tag $TAG_NAME..."
git tag -f "$TAG_NAME"
echo "Pushing tag $TAG_NAME to remote..."
git push origin "$TAG_NAME" -f
echo "Done! GitHub Action should be triggered shortly."