name: Release on: push: tags: - 'v*' permissions: contents: write jobs: # Phase 1: Build in parallel and output artifacts build: name: Build ${{ matrix.platform }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: include: - os: macos-latest platform: darwin/amd64 artifact_name: GoNavi-mac-amd64 asset_ext: .dmg - os: macos-latest platform: darwin/arm64 artifact_name: GoNavi-mac-arm64 asset_ext: .dmg - os: windows-latest platform: windows/amd64 artifact_name: GoNavi-windows-amd64 asset_ext: .exe steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Go uses: actions/setup-go@v5 with: go-version: '1.24' check-latest: true - name: Setup Node uses: actions/setup-node@v4 with: node-version: '20' - name: Install Wails run: go install -v github.com/wailsapp/wails/v2/cmd/wails@latest - name: Build shell: bash run: | wails build -platform ${{ matrix.platform }} -clean -o ${{ matrix.artifact_name }} # macOS Packaging - name: Package macOS DMG if: contains(matrix.platform, 'darwin') run: | brew install create-dmg cd build/bin APP_PATH=$(find . -maxdepth 1 -name "*.app" | head -n 1) if [ -z "$APP_PATH" ]; then echo "❌ 未找到 .app 应用包!" exit 1 fi APP_NAME=$(basename "$APP_PATH") echo "🔏 正在进行 Ad-hoc 签名..." codesign --force --options runtime --deep --sign - "$APP_NAME" DMG_NAME="${{ matrix.artifact_name }}.dmg" echo "📦 正在生成 DMG: $DMG_NAME..." create-dmg \ --volname "GoNavi Installer" \ --window-pos 200 120 \ --window-size 800 400 \ --icon-size 100 \ --icon "$APP_NAME" 200 190 \ --hide-extension "$APP_NAME" \ --app-drop-link 600 185 \ "$DMG_NAME" \ "$APP_NAME" mv "$DMG_NAME" ../../ # Windows Packaging - name: Prepare Windows Exe if: contains(matrix.platform, 'windows') shell: bash run: | cd build/bin TARGET="${{ matrix.artifact_name }}" if [ -f "$TARGET.exe" ]; then FINAL_EXE="$TARGET.exe" elif [ -f "$TARGET" ]; then mv "$TARGET" "$TARGET.exe" FINAL_EXE="$TARGET.exe" else echo "❌ 未找到构建产物 '$TARGET'!" exit 1 fi echo "📦 正在移动 $FINAL_EXE 到根目录..." mv "$FINAL_EXE" "../../$FINAL_EXE" # Upload to Actions Artifacts (Temporary Storage) - name: Upload Artifact uses: actions/upload-artifact@v4 with: name: build-artifacts-${{ strategy.job-index }} # Unique name per job path: GoNavi-*${{ matrix.asset_ext }} retention-days: 1 # Phase 2: Collect all artifacts and Publish Release (Single Job) release: name: Publish Release needs: build runs-on: ubuntu-latest steps: - name: Download All Artifacts uses: actions/download-artifact@v4 with: path: release-assets pattern: build-artifacts-* merge-multiple: true - name: List Assets run: ls -R release-assets - name: Create Release uses: softprops/action-gh-release@v2 if: startsWith(github.ref, 'refs/tags/') with: files: release-assets/* draft: true make_latest: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}