Skip to content

Build and Release

Build and Release #10

Workflow file for this run

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 }}