diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9aac3cd..90f1798 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,6 +29,28 @@ jobs: platform: windows/amd64 artifact_name: GoNavi-windows-amd64 asset_ext: .exe + - os: windows-latest + platform: windows/arm64 + artifact_name: GoNavi-windows-arm64 + asset_ext: .exe + - os: ubuntu-22.04 + platform: linux/amd64 + artifact_name: GoNavi-linux-amd64 + asset_ext: .tar.gz + - os: ubuntu-22.04 + platform: linux/arm64 + artifact_name: GoNavi-linux-arm64 + asset_ext: .tar.gz + - os: ubuntu-22.04 + platform: linux/amd64 + artifact_name: GoNavi-linux-amd64 + asset_ext: .AppImage + build_appimage: true + - os: ubuntu-22.04 + platform: linux/arm64 + artifact_name: GoNavi-linux-arm64 + asset_ext: .AppImage + build_appimage: true steps: - name: Checkout code @@ -45,12 +67,48 @@ jobs: with: node-version: '20' + # Linux Dependencies (GTK3, WebKit2GTK required by Wails) + - name: Install Linux Dependencies + if: contains(matrix.platform, 'linux') + run: | + sudo apt-get update + sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev + + # Cross-compile dependencies for ARM64 + if [ "${{ matrix.platform }}" = "linux/arm64" ]; then + sudo dpkg --add-architecture arm64 + sudo apt-get update + sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu + sudo apt-get install -y libgtk-3-dev:arm64 libwebkit2gtk-4.0-dev:arm64 || true + fi + + # AppImage tools + if [ "${{ matrix.build_appimage }}" = "true" ]; then + sudo apt-get install -y libfuse2 + if [ "${{ matrix.platform }}" = "linux/arm64" ]; then + wget -q https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-aarch64.AppImage -O /tmp/linuxdeploy + wget -q https://github.com/linuxdeploy/linuxdeploy-plugin-gtk/releases/download/continuous/linuxdeploy-plugin-gtk-aarch64.AppImage -O /tmp/linuxdeploy-plugin-gtk + else + wget -q https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage -O /tmp/linuxdeploy + wget -q https://github.com/linuxdeploy/linuxdeploy-plugin-gtk/releases/download/continuous/linuxdeploy-plugin-gtk-x86_64.AppImage -O /tmp/linuxdeploy-plugin-gtk + fi + chmod +x /tmp/linuxdeploy /tmp/linuxdeploy-plugin-gtk + fi + - name: Install Wails run: go install -v github.com/wailsapp/wails/v2/cmd/wails@latest - name: Build shell: bash run: | + # Set cross-compile environment for Linux ARM64 + if [ "${{ matrix.platform }}" = "linux/arm64" ]; then + export CC=aarch64-linux-gnu-gcc + export CXX=aarch64-linux-gnu-g++ + export CGO_ENABLED=1 + export GOOS=linux + export GOARCH=arm64 + fi wails build -platform ${{ matrix.platform }} -clean -o ${{ matrix.artifact_name }} # macOS Packaging @@ -107,6 +165,78 @@ jobs: echo "📦 正在移动 $FINAL_EXE 到根目录..." mv "$FINAL_EXE" "../../$FINAL_EXE" + # Linux Packaging + - name: Package Linux tar.gz + if: contains(matrix.platform, 'linux') && matrix.build_appimage != true + run: | + cd build/bin + TARGET="${{ matrix.artifact_name }}" + + if [ -f "$TARGET" ]; then + chmod +x "$TARGET" + echo "📦 正在打包 $TARGET.tar.gz..." + tar -czvf "$TARGET.tar.gz" "$TARGET" + mv "$TARGET.tar.gz" ../../ + else + echo "❌ 未找到构建产物 '$TARGET'!" + exit 1 + fi + + # Linux AppImage Packaging + - name: Package Linux AppImage + if: matrix.build_appimage == true + run: | + cd build/bin + TARGET="${{ matrix.artifact_name }}" + + if [ ! -f "$TARGET" ]; then + echo "❌ 未找到构建产物 '$TARGET'!" + exit 1 + fi + + chmod +x "$TARGET" + + # Create AppDir structure + mkdir -p AppDir/usr/bin + mkdir -p AppDir/usr/share/applications + mkdir -p AppDir/usr/share/icons/hicolor/256x256/apps + + cp "$TARGET" AppDir/usr/bin/gonavi + + # Create desktop file + cat > AppDir/usr/share/applications/gonavi.desktop << 'EOF' +[Desktop Entry] +Name=GoNavi +Exec=gonavi +Icon=gonavi +Type=Application +Categories=Development;Database; +Comment=Database Management Tool +EOF + + cp AppDir/usr/share/applications/gonavi.desktop AppDir/gonavi.desktop + + # Create a simple icon (or use existing if available) + if [ -f "../../build/appicon.png" ]; then + cp "../../build/appicon.png" AppDir/usr/share/icons/hicolor/256x256/apps/gonavi.png + cp "../../build/appicon.png" AppDir/gonavi.png + else + # Create a placeholder icon + convert -size 256x256 xc:#336791 -fill white -gravity center -pointsize 48 -annotate 0 "GoNavi" AppDir/gonavi.png || \ + wget -q "https://via.placeholder.com/256/336791/FFFFFF?text=GoNavi" -O AppDir/gonavi.png || \ + touch AppDir/gonavi.png + cp AppDir/gonavi.png AppDir/usr/share/icons/hicolor/256x256/apps/gonavi.png + fi + + # Build AppImage + echo "📦 正在生成 AppImage..." + export DEPLOY_GTK_VERSION=3 + /tmp/linuxdeploy --appdir AppDir --plugin gtk --output appimage + + # Rename output + mv GoNavi*.AppImage "$TARGET.AppImage" + mv "$TARGET.AppImage" ../../ + # Upload to Actions Artifacts (Temporary Storage) - name: Upload Artifact uses: actions/upload-artifact@v4 diff --git a/build-release.sh b/build-release.sh index 7866a59..6708d6f 100755 --- a/build-release.sh +++ b/build-release.sh @@ -136,14 +136,121 @@ if command -v x86_64-w64-mingw32-gcc &> /dev/null; then mv "$BUILD_BIN_DIR/${DEFAULT_BINARY_NAME}.exe" "$DIST_DIR/${APP_NAME}-${VERSION}-windows-amd64.exe" echo " ✅ 已生成 ${APP_NAME}-${VERSION}-windows-amd64.exe" else - echo -e "${RED} ❌ Windows 构建失败。${NC}" + echo -e "${RED} ❌ Windows amd64 构建失败。${NC}" fi else - echo -e "${YELLOW} ⚠️ 未找到 MinGW 工具 (x86_64-w64-mingw32-gcc),跳过 Windows 构建。${NC}" + echo -e "${YELLOW} ⚠️ 未找到 MinGW 工具 (x86_64-w64-mingw32-gcc),跳过 Windows amd64 构建。${NC}" +fi + +# --- Windows ARM64 构建 --- +echo -e "${GREEN}🪟 正在构建 Windows (arm64)...${NC}" +if command -v aarch64-w64-mingw32-gcc &> /dev/null; then + wails build -platform windows/arm64 -clean + if [ $? -eq 0 ]; then + mv "$BUILD_BIN_DIR/${DEFAULT_BINARY_NAME}.exe" "$DIST_DIR/${APP_NAME}-${VERSION}-windows-arm64.exe" + echo " ✅ 已生成 ${APP_NAME}-${VERSION}-windows-arm64.exe" + else + echo -e "${RED} ❌ Windows arm64 构建失败。${NC}" + fi +else + echo -e "${YELLOW} ⚠️ 未找到 MinGW ARM64 工具 (aarch64-w64-mingw32-gcc),跳过 Windows arm64 构建。${NC}" + echo " 安装命令: brew install mingw-w64 (需要支持 ARM64 的版本)" +fi + +# --- Linux AMD64 构建 --- +echo -e "${GREEN}🐧 正在构建 Linux (amd64)...${NC}" +# 检测当前系统 +CURRENT_OS=$(uname -s) +CURRENT_ARCH=$(uname -m) + +if [ "$CURRENT_OS" = "Linux" ] && [ "$CURRENT_ARCH" = "x86_64" ]; then + # 本机 Linux amd64,直接构建 + wails build -platform linux/amd64 -clean + if [ $? -eq 0 ]; then + mv "$BUILD_BIN_DIR/${DEFAULT_BINARY_NAME}" "$DIST_DIR/${APP_NAME}-${VERSION}-linux-amd64" + chmod +x "$DIST_DIR/${APP_NAME}-${VERSION}-linux-amd64" + # 打包为 tar.gz + cd "$DIST_DIR" + tar -czvf "${APP_NAME}-${VERSION}-linux-amd64.tar.gz" "${APP_NAME}-${VERSION}-linux-amd64" + rm "${APP_NAME}-${VERSION}-linux-amd64" + cd .. + echo " ✅ 已生成 ${APP_NAME}-${VERSION}-linux-amd64.tar.gz" + else + echo -e "${RED} ❌ Linux amd64 构建失败。${NC}" + fi +elif command -v x86_64-linux-gnu-gcc &> /dev/null; then + # macOS 或其他系统,尝试交叉编译 + export CC=x86_64-linux-gnu-gcc + export CXX=x86_64-linux-gnu-g++ + export CGO_ENABLED=1 + wails build -platform linux/amd64 -clean + if [ $? -eq 0 ]; then + mv "$BUILD_BIN_DIR/${DEFAULT_BINARY_NAME}" "$DIST_DIR/${APP_NAME}-${VERSION}-linux-amd64" + chmod +x "$DIST_DIR/${APP_NAME}-${VERSION}-linux-amd64" + cd "$DIST_DIR" + tar -czvf "${APP_NAME}-${VERSION}-linux-amd64.tar.gz" "${APP_NAME}-${VERSION}-linux-amd64" + rm "${APP_NAME}-${VERSION}-linux-amd64" + cd .. + echo " ✅ 已生成 ${APP_NAME}-${VERSION}-linux-amd64.tar.gz" + else + echo -e "${RED} ❌ Linux amd64 交叉编译失败。${NC}" + fi + unset CC CXX CGO_ENABLED +else + echo -e "${YELLOW} ⚠️ 非 Linux 系统且未找到交叉编译工具,跳过 Linux amd64 构建。${NC}" + echo " 在 Linux 上运行此脚本可直接构建,或安装交叉编译工具链。" +fi + +# --- Linux ARM64 构建 --- +echo -e "${GREEN}🐧 正在构建 Linux (arm64)...${NC}" +if [ "$CURRENT_OS" = "Linux" ] && [ "$CURRENT_ARCH" = "aarch64" ]; then + # 本机 Linux arm64,直接构建 + wails build -platform linux/arm64 -clean + if [ $? -eq 0 ]; then + mv "$BUILD_BIN_DIR/${DEFAULT_BINARY_NAME}" "$DIST_DIR/${APP_NAME}-${VERSION}-linux-arm64" + chmod +x "$DIST_DIR/${APP_NAME}-${VERSION}-linux-arm64" + cd "$DIST_DIR" + tar -czvf "${APP_NAME}-${VERSION}-linux-arm64.tar.gz" "${APP_NAME}-${VERSION}-linux-arm64" + rm "${APP_NAME}-${VERSION}-linux-arm64" + cd .. + echo " ✅ 已生成 ${APP_NAME}-${VERSION}-linux-arm64.tar.gz" + else + echo -e "${RED} ❌ Linux arm64 构建失败。${NC}" + fi +elif command -v aarch64-linux-gnu-gcc &> /dev/null; then + # 交叉编译 + export CC=aarch64-linux-gnu-gcc + export CXX=aarch64-linux-gnu-g++ + export CGO_ENABLED=1 + wails build -platform linux/arm64 -clean + if [ $? -eq 0 ]; then + mv "$BUILD_BIN_DIR/${DEFAULT_BINARY_NAME}" "$DIST_DIR/${APP_NAME}-${VERSION}-linux-arm64" + chmod +x "$DIST_DIR/${APP_NAME}-${VERSION}-linux-arm64" + cd "$DIST_DIR" + tar -czvf "${APP_NAME}-${VERSION}-linux-arm64.tar.gz" "${APP_NAME}-${VERSION}-linux-arm64" + rm "${APP_NAME}-${VERSION}-linux-arm64" + cd .. + echo " ✅ 已生成 ${APP_NAME}-${VERSION}-linux-arm64.tar.gz" + else + echo -e "${RED} ❌ Linux arm64 交叉编译失败。${NC}" + fi + unset CC CXX CGO_ENABLED +else + echo -e "${YELLOW} ⚠️ 非 Linux ARM64 系统且未找到交叉编译工具,跳过 Linux arm64 构建。${NC}" + echo " 安装命令 (Ubuntu): sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu" + echo " 安装命令 (macOS): brew install aarch64-linux-gnu-gcc (需要第三方 tap)" fi # 清理中间构建目录 rm -rf "build/bin" +echo "" echo -e "${GREEN}🎉 所有任务完成!构建产物在 'dist/' 目录下:${NC}" -ls -1 "$DIST_DIR" +ls -lh "$DIST_DIR" +echo "" +echo -e "${GREEN}📋 支持的平台:${NC}" +echo " • macOS (Intel/Apple Silicon): .dmg" +echo " • Windows (x64/ARM64): .exe" +echo " • Linux (x64/ARM64): .tar.gz" +echo "" +echo -e "${YELLOW}💡 提示:Linux AppImage 包请使用 GitHub Actions CI/CD 构建。${NC}"