Build and Release #10
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build and Release | |
| on: | |
| push: | |
| tags: | |
| - 'v*' | |
| workflow_dispatch: | |
| inputs: | |
| do_release: | |
| description: 'Create GitHub Release (manual run)' | |
| type: boolean | |
| required: false | |
| default: false | |
| tag_name: | |
| description: 'Release tag (e.g. v1.3.0). Required when do_release=true' | |
| type: string | |
| required: false | |
| default: '' | |
| draft: | |
| description: 'Create as draft (manual run)' | |
| type: boolean | |
| required: false | |
| default: false | |
| prerelease: | |
| description: 'Mark as prerelease (manual run)' | |
| type: boolean | |
| required: false | |
| default: false | |
| permissions: | |
| contents: write | |
| jobs: | |
| build_ts: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Bun | |
| uses: oven-sh/setup-bun@v2 | |
| with: | |
| bun-version: latest | |
| - name: Cache Bun | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.bun/install/cache | |
| key: ${{ runner.os }}-bun-${{ hashFiles('bun.lock', 'package.json') }} | |
| - name: Install dependencies | |
| run: bun install | |
| - name: Build all platforms | |
| run: bun run build:all | |
| - name: Pack script | |
| run: bun run pack:release | |
| - name: Upload artifacts (TS/Bun) | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ts-dist | |
| if-no-files-found: error | |
| path: | | |
| dist/f11esync-linux-x64.zip | |
| dist/f11esync-linux-arm64.zip | |
| dist/f11esync-darwin-x64.zip | |
| dist/f11esync-darwin-arm64.zip | |
| dist/f11esync-windows-x64.zip | |
| dist/script.zip | |
| build_rust_cli_linux: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Rust | |
| uses: dtolnay/rust-toolchain@stable | |
| - name: Cache Cargo | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.cargo/registry | |
| ~/.cargo/git | |
| dist/rust-target | |
| key: ${{ runner.os }}-cargo-${{ hashFiles('app/Cargo.lock') }} | |
| - name: Install cross | |
| uses: taiki-e/install-action@v2 | |
| with: | |
| tool: cross | |
| - name: Build Rust CLI (linux) | |
| run: | | |
| chmod +x app/scripts/build-linux-rust-cli.sh | |
| app/scripts/build-linux-rust-cli.sh | |
| - name: Upload artifacts (Rust CLI linux) | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: rust-cli-linux | |
| if-no-files-found: error | |
| path: | | |
| dist/f11esync-rust-linux-x64.zip | |
| dist/f11esync-rust-linux-arm64.zip | |
| build_rust_cli_windows: | |
| runs-on: windows-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Rust | |
| uses: dtolnay/rust-toolchain@stable | |
| - name: Cache Cargo | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.cargo/registry | |
| ~/.cargo/git | |
| dist/rust-target | |
| key: ${{ runner.os }}-cargo-${{ hashFiles('app/Cargo.lock') }} | |
| - name: Build Rust (windows) | |
| shell: pwsh | |
| run: | | |
| .\\app\\scripts\\build-windows-rust.ps1 | |
| - name: Upload artifacts (Rust CLI windows) | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: rust-cli-windows | |
| if-no-files-found: error | |
| path: | | |
| dist/f11esync-rust-windows-x64.zip | |
| dist/f11esync-gui-windows-x64.zip | |
| build_rust_macos_gui: | |
| runs-on: macos-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Rust | |
| uses: dtolnay/rust-toolchain@stable | |
| - name: Cache Cargo | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.cargo/bin | |
| ~/.cargo/registry | |
| ~/.cargo/git | |
| dist/rust-target | |
| key: ${{ runner.os }}-cargo-${{ hashFiles('app/Cargo.lock') }} | |
| - name: Build Rust macOS GUI (.app) zips | |
| run: | | |
| cd app | |
| ./scripts/build-macos-gui-apps.sh | |
| - name: Upload artifacts (Rust macOS GUI) | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: rust-macos-gui | |
| if-no-files-found: error | |
| path: | | |
| dist/f11esync-gui-darwin-arm64.zip | |
| dist/f11esync-gui-darwin-x64.zip | |
| release: | |
| runs-on: ubuntu-latest | |
| if: startsWith(github.ref, 'refs/tags/v') || (github.event_name == 'workflow_dispatch' && inputs.do_release) | |
| needs: [build_ts, build_rust_cli_linux, build_rust_cli_windows, build_rust_macos_gui] | |
| steps: | |
| - name: Download artifacts (all) | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: dist | |
| merge-multiple: true | |
| - name: Verify dist assets | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| ls -la dist || true | |
| files=( | |
| "dist/f11esync-linux-x64.zip" | |
| "dist/f11esync-linux-arm64.zip" | |
| "dist/f11esync-darwin-x64.zip" | |
| "dist/f11esync-darwin-arm64.zip" | |
| "dist/f11esync-windows-x64.zip" | |
| "dist/script.zip" | |
| "dist/f11esync-gui-darwin-arm64.zip" | |
| "dist/f11esync-gui-darwin-x64.zip" | |
| "dist/f11esync-gui-windows-x64.zip" | |
| "dist/f11esync-rust-linux-x64.zip" | |
| "dist/f11esync-rust-linux-arm64.zip" | |
| "dist/f11esync-rust-windows-x64.zip" | |
| ) | |
| for f in "${files[@]}"; do | |
| if [[ ! -f "$f" ]]; then | |
| echo "missing release asset: $f" >&2 | |
| exit 1 | |
| fi | |
| done | |
| - name: Create Release | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| tag_name: ${{ github.ref_type == 'tag' && github.ref_name || inputs.tag_name }} | |
| target_commitish: ${{ github.sha }} | |
| draft: ${{ github.event_name == 'workflow_dispatch' && inputs.draft }} | |
| prerelease: ${{ github.event_name == 'workflow_dispatch' && inputs.prerelease }} | |
| fail_on_unmatched_files: true | |
| files: | | |
| dist/f11esync-linux-x64.zip | |
| dist/f11esync-linux-arm64.zip | |
| dist/f11esync-darwin-x64.zip | |
| dist/f11esync-darwin-arm64.zip | |
| dist/f11esync-windows-x64.zip | |
| dist/script.zip | |
| dist/f11esync-gui-darwin-arm64.zip | |
| dist/f11esync-gui-darwin-x64.zip | |
| dist/f11esync-gui-windows-x64.zip | |
| dist/f11esync-rust-linux-x64.zip | |
| dist/f11esync-rust-linux-arm64.zip | |
| dist/f11esync-rust-windows-x64.zip | |
| generate_release_notes: true | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |