Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
197 changes: 197 additions & 0 deletions .github/workflows/release-installers.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
name: Release Installers

on:
push:
tags:
- 'v*' # Trigger on version tags (e.g., v0.1.0)
workflow_dispatch: # Allow manual triggering

env:
CARGO_TERM_COLOR: always

jobs:
build-windows:
name: Build Windows Installers
runs-on: windows-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: '20'

- name: Install tree-sitter-cli
run: npm install -g tree-sitter-cli

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: x86_64-pc-windows-msvc

- name: Rust cache
uses: Swatinem/rust-cache@v2
with:
shared-key: windows-release

- name: Install cargo-packager
run: cargo install cargo-packager --locked

- name: Build ggsql binary
run: cargo build --release --package ggsql --bin ggsql

- name: Build NSIS installer
run: cargo packager --release --formats nsis
working-directory: src

- name: Build MSI installer
run: cargo packager --release --formats wix
working-directory: src

- name: Upload NSIS installer
uses: actions/upload-artifact@v4
with:
name: ggsql-windows-nsis
path: src/target/release/packager/*.exe
retention-days: 30

- name: Upload MSI installer
uses: actions/upload-artifact@v4
with:
name: ggsql-windows-msi
path: src/target/release/packager/*.msi
retention-days: 30

build-macos:
name: Build macOS Installers
runs-on: macos-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: '20'

- name: Install tree-sitter-cli
run: npm install -g tree-sitter-cli

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: x86_64-apple-darwin, aarch64-apple-darwin

- name: Rust cache
uses: Swatinem/rust-cache@v2
with:
shared-key: macos-release

- name: Install cargo-packager
run: cargo install cargo-packager --locked

- name: Build ggsql binary (x86_64)
run: cargo build --release --package ggsql --bin ggsql

- name: Build DMG installer (x86_64)
run: cargo packager --release --formats dmg
working-directory: src

- name: Build ggsql binary (aarch64)
run: cargo build --release --package ggsql --bin ggsql --target aarch64-apple-darwin

- name: Build DMG installer (aarch64)
run: cargo packager --release --target aarch64-apple-darwin --formats dmg
working-directory: src

- name: Upload DMG installers
uses: actions/upload-artifact@v4
with:
name: ggsql-macos-dmg
path: src/target/release/packager/*.dmg
retention-days: 30

build-linux:
name: Build Linux Installers
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: '20'

- name: Install tree-sitter-cli
run: npm install -g tree-sitter-cli

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: x86_64-unknown-linux-gnu

- name: Rust cache
uses: Swatinem/rust-cache@v2
with:
shared-key: linux-release

- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
libgtk-3-dev \
libwebkit2gtk-4.1-dev \
libappindicator3-dev \
librsvg2-dev \
patchelf

- name: Install cargo-packager
run: cargo install cargo-packager --locked

- name: Build ggsql binary
run: cargo build --release --package ggsql --bin ggsql

- name: Build Debian package
run: cargo packager --release --formats deb
working-directory: src

- name: Upload Debian package
uses: actions/upload-artifact@v4
with:
name: ggsql-linux-deb
path: src/target/release/packager/*.deb
retention-days: 30

create-release:
name: Create GitHub Release
needs: [build-windows, build-macos, build-linux]
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/v')

steps:
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: artifacts

- name: Display structure of downloaded files
run: ls -R artifacts

- name: Create release and upload installers
uses: softprops/action-gh-release@v1
with:
files: |
artifacts/**/*.exe
artifacts/**/*.msi
artifacts/**/*.dmg
artifacts/**/*.deb
draft: false
prerelease: false
generate_release_notes: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -140,3 +140,11 @@ pkg/
*.Rdata
.Rproj.user
ggsql.Rcheck/

# cargo-packager artifacts
*.msi
*.deb
*.rpm
*.dmg
*.AppImage
.cargo-packager/
79 changes: 79 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -911,6 +911,85 @@ cargo build --all-features

---

## Release & Distribution

### Cross-Platform Installers

ggsql uses [cargo-packager](https://github.com/crabnebula-dev/cargo-packager) to create native installers for Windows, macOS, and Linux. See [INSTALLERS.md](../INSTALLERS.md) for detailed build instructions.

**Supported Formats**:

- **Windows**: NSIS (.exe), MSI (.msi)
- **macOS**: DMG (.dmg)
- **Linux**: Debian (.deb)

**What Gets Packaged**:

- ✅ `ggsql` CLI binary only
- ❌ `ggsql-rest` API server (install separately with `cargo install ggsql --features rest-api`)
- ❌ `ggsql-jupyter` kernel (install separately with `cargo install ggsql-jupyter`)

### Release Process

**Creating a Release**:

1. **Update version** in workspace `Cargo.toml`
2. **Update CHANGELOG** (if exists) with release notes
3. **Test installers locally** (at least one platform):
```bash
cd src
cargo packager --release --formats nsis # Windows
cargo packager --release --formats dmg # macOS
cargo packager --release --formats deb # Linux
```
4. **Create and push version tag**:
```bash
git tag v0.1.0
git push origin v0.1.0
```
5. **GitHub Actions will automatically**:
- Build installers for all platforms
- Create GitHub Release
- Attach installers as release assets
- Generate release notes

**Manual Workflow Trigger** (for testing):
```bash
gh workflow run release-installers.yml
```

### Known Limitations

**Installers**:

- Installers are unsigned (users may see security warnings)
- macOS installers require users to run `xattr -cr /Applications/ggsql.app` if unsigned
- Windows SmartScreen may show "Windows protected your PC" warning
- Production releases should use code signing certificates

**License Display**:

- LICENSE.md must use ASCII quotes (not Unicode smart quotes) for proper Windows installer display
- Verify with: `cargo packager --release --formats nsis` and test installer UI

### Distribution Channels

**Current**:

- GitHub Releases (automated via GitHub Actions)
- Manual local builds via cargo-packager

**Future** (not yet implemented):

- Homebrew tap (macOS/Linux)
- Chocolatey (Windows)
- Scoop (Windows)
- apt repository (Debian/Ubuntu)
- crates.io (Rust library)
- PyPI (Python bindings)

---

## Grammar Deep Dive

### ggsql Grammar Structure
Expand Down
Loading