@@ -298,6 +298,16 @@ jobs:
298298 platform : windows
299299 arch : amd64
300300 name : windows-amd64
301+
302+ # Linux builds
303+ - os : ubuntu-latest
304+ platform : linux
305+ arch : arm64
306+ name : linux-arm64
307+ - os : ubuntu-latest
308+ platform : linux
309+ arch : amd64
310+ name : linux-amd64
301311
302312 steps :
303313 - name : Checkout code
@@ -312,6 +322,13 @@ jobs:
312322 - name : Install Fyne CLI
313323 run : go install fyne.io/tools/cmd/fyne@latest
314324
325+ - name : Install Linux dependencies
326+ if : matrix.platform == 'linux'
327+ run : |
328+ sudo apt-get update
329+ sudo apt-get install -y gcc-aarch64-linux-gnu libc6-dev-arm64-cross
330+ sudo apt-get install -y libgl1-mesa-dev xorg-dev
331+
315332 - name : Configure Git for Private Modules
316333 run : |
317334 git config --global url."https://${{ secrets.GHT }}@github.com/".insteadOf "https://github.com/"
@@ -350,34 +367,82 @@ jobs:
350367 env :
351368 GOPRIVATE : github.com/oneclickvirt/security,github.com/oneclickvirt/privatespeedtest
352369 FYNE_BUILD_FLAGS : " -trimpath -ldflags '-s -w -checklinkname=0'"
370+ GOARCH : ${{ matrix.arch }}
353371 shell : bash
354372 run : |
355373 # macOS 需要特殊处理:先编译再打包
356374 if [ "${{ matrix.platform }}" == "darwin" ]; then
375+ # 使用独立目录避免冲突
376+ BUILD_DIR="build-${{ matrix.name }}"
377+ mkdir -p "$BUILD_DIR"
378+
357379 echo "Building macOS binary with ldflags..."
358- go build -trimpath -ldflags "-checklinkname=0 -s -w" -o ecs-gui-bin .
380+ go build -trimpath -ldflags "-checklinkname=0 -s -w" -o "$BUILD_DIR/ ecs-gui-bin" .
359381
360382 echo "Packaging macOS app with fyne..."
383+ cd "$BUILD_DIR"
361384 fyne package -os darwin -name ecs-gui --exe ecs-gui-bin --app-version "${{ needs.prepare.outputs.app_version }}" --release
385+ cd ..
362386
363- if [ -d ecs-gui.app ]; then
387+ if [ -d "$BUILD_DIR/ ecs-gui.app" ]; then
364388 TARFILE="ecs-gui-${{ matrix.name }}-${{ needs.prepare.outputs.version }}.tar.gz"
365389 echo "Creating tar file: $TARFILE"
366- tar -czf "$TARFILE" ecs-gui.app
390+ tar -czf "$TARFILE" -C "$BUILD_DIR" ecs-gui.app
367391 echo "✓ macOS app 构建成功"
392+ # 清理构建目录
393+ rm -rf "$BUILD_DIR"
368394 else
369395 echo "✗ macOS app 构建失败"
370396 exit 1
371397 fi
398+ elif [ "${{ matrix.platform }}" == "linux" ]; then
399+ # Linux 构建 - 使用独立目录避免冲突
400+ BUILD_DIR="build-${{ matrix.name }}"
401+ mkdir -p "$BUILD_DIR"
402+
403+ echo "Building Linux binary for ${{ matrix.arch }}..."
404+ if [ "${{ matrix.arch }}" == "arm64" ]; then
405+ # ARM64 交叉编译
406+ CC=aarch64-linux-gnu-gcc CGO_ENABLED=1 GOOS=linux GOARCH=arm64 \
407+ go build -trimpath -ldflags "-checklinkname=0 -s -w" -o "$BUILD_DIR/ecs-gui" .
408+ else
409+ # AMD64 本地编译
410+ CGO_ENABLED=1 GOOS=linux GOARCH=amd64 \
411+ go build -trimpath -ldflags "-checklinkname=0 -s -w" -o "$BUILD_DIR/ecs-gui" .
412+ fi
413+
414+ echo "Packaging Linux app with fyne..."
415+ cd "$BUILD_DIR"
416+ fyne package -os linux -name ecs-gui --exe ecs-gui --app-version "${{ needs.prepare.outputs.app_version }}" --release
417+ cd ..
418+
419+ # 查找生成的 tar.xz 文件
420+ if [ -f "$BUILD_DIR/ecs-gui.tar.xz" ]; then
421+ mv "$BUILD_DIR/ecs-gui.tar.xz" ecs-gui-${{ matrix.name }}-${{ needs.prepare.outputs.version }}.tar.xz
422+ echo "✓ Linux tar.xz 构建成功"
423+ # 清理构建目录
424+ rm -rf "$BUILD_DIR"
425+ else
426+ echo "✗ Linux tar.xz 构建失败"
427+ ls -la "$BUILD_DIR/"
428+ exit 1
429+ fi
372430 else
373- # Windows 直接使用 fyne package
431+ # Windows 构建 - 使用独立目录
432+ BUILD_DIR="build-${{ matrix.name }}"
433+ mkdir -p "$BUILD_DIR"
434+
374435 echo "Building ${{ matrix.platform }} with fyne package..."
436+ cd "$BUILD_DIR"
375437 fyne package -os ${{ matrix.platform }} -name ecs-gui --app-version "${{ needs.prepare.outputs.app_version }}" --release
438+ cd ..
376439
377440 if [ "${{ matrix.platform }}" == "windows" ]; then
378- if [ -f ecs-gui.exe ]; then
379- mv ecs-gui.exe ecs-gui-${{ matrix.name }}-${{ needs.prepare.outputs.version }}.exe
441+ if [ -f "$BUILD_DIR/ ecs-gui.exe" ]; then
442+ mv "$BUILD_DIR/ ecs-gui.exe" ecs-gui-${{ matrix.name }}-${{ needs.prepare.outputs.version }}.exe
380443 echo "✓ Windows exe 构建成功"
444+ # 清理构建目录
445+ rm -rf "$BUILD_DIR"
381446 else
382447 echo "✗ Windows exe 构建失败"
383448 exit 1
@@ -401,6 +466,25 @@ jobs:
401466 if [[ "$file" == *.tar.gz ]]; then
402467 # macOS app 需要解压后压缩二进制
403468 echo "正在处理 macOS app: $file"
469+ elif [[ "$file" == *.tar.xz ]]; then
470+ # Linux app 需要解压后压缩二进制
471+ echo "正在处理 Linux app: $file"
472+ mkdir -p ecs-gui-extracted
473+ tar -xJf "$file" -C ecs-gui-extracted
474+
475+ # 查找并压缩 Linux 可执行文件
476+ find ecs-gui-extracted -type f -executable | while read binary; do
477+ if file "$binary" | grep -q "ELF"; then
478+ echo "正在压缩 Linux 二进制: $binary"
479+ upx --best --lzma "$binary" || echo "警告: $binary 压缩失败"
480+ fi
481+ done
482+
483+ # 重新打包
484+ rm "$file"
485+ tar -cJf "$file" -C ecs-gui-extracted .
486+ rm -rf ecs-gui-extracted
487+ echo "压缩后大小: $(du -h "$file")"
404488 tar -xzf "$file"
405489
406490 # 查找并压缩 macOS 可执行文件
@@ -440,3 +524,10 @@ jobs:
440524 done
441525 env :
442526 GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
527+
528+ - name : Upload build artifact
529+ uses : actions/upload-artifact@v4
530+ with :
531+ name : ecs-gui-${{ matrix.name }}-${{ needs.prepare.outputs.version }}
532+ path : ecs-gui-${{ matrix.name }}-${{ needs.prepare.outputs.version }}.*
533+ retention-days : 90
0 commit comments