diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1456617..e6c4499 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -71,7 +71,7 @@ jobs: - name: 创建自动发布 if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master') - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 with: name: Auto-Build-${{ steps.version.outputs.date }}-${{ steps.version.outputs.sha_short }} tag_name: auto-${{ steps.version.outputs.date }}-${{ steps.version.outputs.sha_short }} @@ -80,4 +80,4 @@ jobs: files: | **/miao-directory* env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/build.auto.release.sh b/build.auto.release.sh index 85337eb..da1282b 100644 --- a/build.auto.release.sh +++ b/build.auto.release.sh @@ -1,4 +1,7 @@ #!/bin/bash +set -Eeuo pipefail +IFS=$'\n\t' +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 解析命令行参数 FULL_BUILD=false @@ -25,6 +28,12 @@ check_upx() { return 1 fi } +require_cmd() { + if ! command -v "$1" >/dev/null 2>&1; then + echo "$1 未找到,请安装后再试" + exit 1 + fi +} # 清理已有构建产物 echo "清理已有构建产物..." @@ -94,14 +103,18 @@ if [ "$FULL_BUILD" = true ]; then fi echo "构建前端..." +require_cmd pnpm +require_cmd go pnpm run build echo "复制前端文件到服务端..." rm -rf ./src-server/web/* mkdir -p ./src-server/web/ -cp -r ./dist/* ./src-server/web/ +if compgen -G "./dist/*" > /dev/null; then + cp -r ./dist/* ./src-server/web/ +fi -cd ./src-server +cd "$SCRIPT_DIR/src-server" # ===== 构建阶段 ===== echo "===== 开始构建阶段 =====" @@ -111,20 +124,16 @@ echo "构建基础版本..." # Windows AMD64 无GUI echo "构建 Windows AMD64 无GUI 版本" -go env -w GOOS=windows GOARCH=amd64 -go build -ldflags="-s -w" -o ../miao-directory-amd64-win.exe +GOOS=windows GOARCH=amd64 go build -ldflags="-s -w" -o "$SCRIPT_DIR/miao-directory-amd64-win.exe" # Linux AMD64 无GUI echo "构建 Linux AMD64 无GUI 版本" -go env -w GOOS=linux GOARCH=amd64 -export CGO_ENABLED=0 -go build -ldflags="-s -w" -o ../miao-directory-amd64-linux -export CGO_ENABLED=1 +CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o "$SCRIPT_DIR/miao-directory-amd64-linux" +chmod +x "$SCRIPT_DIR/miao-directory-amd64-linux" # Windows AMD64 GUI echo "构建 Windows AMD64 GUI 版本" -go env -w GOOS=windows GOARCH=amd64 -go build -tags webview -ldflags="-s -w -H=windowsgui" -o ../miao-directory-amd64-win.gui.exe +GOOS=windows GOARCH=amd64 go build -tags webview -ldflags="-s -w -H=windowsgui" -o "$SCRIPT_DIR/miao-directory-amd64-win.gui.exe" # 完整构建 - 额外的系统和架构 if [ "$FULL_BUILD" = true ]; then @@ -136,44 +145,52 @@ if [ "$FULL_BUILD" = true ]; then mv resource.syso resource.syso.bak fi - # 无需GUI和syso的构建批次 - export CGO_ENABLED=0 + : # CGO 在每次构建调用中禁用,无需全局 export # 定义操作系统和架构映射 - declare -A OS_ARCHS - OS_ARCHS["linux"]="arm64 386 mips mips64 mips64le ppc64 ppc64le riscv64 s390x" - OS_ARCHS["darwin"]="amd64 arm64" - OS_ARCHS["windows"]="arm64 386" - OS_ARCHS["freebsd"]="amd64 arm64 386" - OS_ARCHS["openbsd"]="amd64 arm64 386" - # OS_ARCHS["netbsd"]="amd64 arm64 386" + # 在工具函数处增加大小写格式化,避免使用 Bash 4 的 ${var^}/${var^^} + uc_first() { + local s="$1" + local first="${s:0:1}" + local rest="${s:1}" + printf "%s%s" "$(printf "%s" "$first" | tr '[:lower:]' '[:upper:]')" "$rest" + } - # 遍历操作系统和架构进行构建 - for os in "${!OS_ARCHS[@]}"; do - echo "构建 ${os^} 系列版本..." - go env -w GOOS=$os - - # 获取当前操作系统支持的架构列表 - archs=${OS_ARCHS[$os]} - + to_upper() { + printf "%s" "$1" | tr '[:lower:]' '[:upper:]' + } + OS_LIST="linux darwin windows freebsd openbsd" + for os in $OS_LIST; do + echo "构建 $(uc_first "$os") 系列版本..." + case "$os" in + linux) archs="arm64 386 mips mips64 mips64le ppc64 ppc64le riscv64 s390x" ;; + darwin) archs="amd64 arm64" ;; + windows) archs="arm64 386" ;; + freebsd) archs="amd64 arm64 386" ;; + openbsd) archs="amd64 arm64 386" ;; + *) archs="" ;; + esac + for arch in $archs; do # 设置输出文件名后缀 suffix="" if [ "$os" = "windows" ]; then suffix=".exe" fi - - echo "构建 ${os^} ${arch^^} 版本" - go env -w GOARCH=$arch - + + echo "构建 $(uc_first "$os") $(to_upper "$arch") 版本" + # 根据条件设置不同的输出文件名格式 if [[ "$os" == "darwin" || ("$os" == "linux" && "$arch" == "arm64") || ("$os" == "windows" && "$arch" == "arm64") ]]; then - output_file="../miao-directory-${arch}-${os}${suffix}" + output_file="$SCRIPT_DIR/miao-directory-${arch}-${os}${suffix}" else - output_file="../miao-directory-x-${arch}-${os}${suffix}" + output_file="$SCRIPT_DIR/miao-directory-x-${arch}-${os}${suffix}" + fi + + CGO_ENABLED=0 GOOS="$os" GOARCH="$arch" go build -ldflags="-s -w" -o "$output_file" + if [ "$os" != "windows" ]; then + chmod +x "$output_file" fi - - go build -ldflags="-s -w" -o "$output_file" done done @@ -183,7 +200,7 @@ if [ "$FULL_BUILD" = true ]; then mv resource.syso.bak resource.syso fi - export CGO_ENABLED=1 + : # 无需恢复 CGO,全程使用内联变量 fi # ===== 压缩阶段 ===== @@ -207,15 +224,15 @@ if check_upx; then # 压缩Windows无GUI版本 echo "正在压缩Windows AMD64无GUI版本" - upx $COMPRESSION_LEVEL -o ../miao-directory-amd64-win.upx.exe ../miao-directory-amd64-win.exe + upx $COMPRESSION_LEVEL -o "$SCRIPT_DIR/miao-directory-amd64-win.upx.exe" "$SCRIPT_DIR/miao-directory-amd64-win.exe" # 压缩Linux AMD64版本 echo "正在压缩Linux AMD64版本" - upx $COMPRESSION_LEVEL -o ../miao-directory-amd64-linux.upx ../miao-directory-amd64-linux + upx $COMPRESSION_LEVEL -o "$SCRIPT_DIR/miao-directory-amd64-linux.upx" "$SCRIPT_DIR/miao-directory-amd64-linux" # 压缩Windows GUI版本 echo "正在压缩Windows AMD64 GUI版本" - upx $COMPRESSION_LEVEL -o ../miao-directory-amd64-win.gui.upx.exe ../miao-directory-amd64-win.gui.exe + upx $COMPRESSION_LEVEL -o "$SCRIPT_DIR/miao-directory-amd64-win.gui.upx.exe" "$SCRIPT_DIR/miao-directory-amd64-win.gui.exe" # 压缩额外架构版本 if [ "$FULL_BUILD" = true ]; then @@ -223,15 +240,15 @@ if check_upx; then # 压缩Linux ARM64版本 echo "正在压缩Linux ARM64版本" - upx $COMPRESSION_LEVEL -o ../miao-directory-arm64-linux.upx ../miao-directory-arm64-linux + upx $COMPRESSION_LEVEL -o "$SCRIPT_DIR/miao-directory-arm64-linux.upx" "$SCRIPT_DIR/miao-directory-arm64-linux" # # 压缩macOS AMD64版本 # echo "正在压缩macOS AMD64版本" - # upx $COMPRESSION_LEVEL -o ../miao-directory-amd64-darwin.upx ../miao-directory-amd64-darwin + # upx $COMPRESSION_LEVEL -o "$SCRIPT_DIR/miao-directory-amd64-darwin.upx" "$SCRIPT_DIR/miao-directory-amd64-darwin" # # 压缩macOS ARM64版本 # echo "正在压缩macOS ARM64版本" - # upx $COMPRESSION_LEVEL -o ../miao-directory-arm64-darwin.upx ../miao-directory-arm64-darwin + # upx $COMPRESSION_LEVEL -o "$SCRIPT_DIR/miao-directory-arm64-darwin.upx" "$SCRIPT_DIR/miao-directory-arm64-darwin" fi echo "所有压缩完成"