ci(release): build installable artifacts for figma, sketch, teams, zendesk, desktop, jupyter

Add producer jobs mirroring the office/outlook pattern so a version tag
attaches downloadable artifacts for every surface that can be one:

- figma/sketch/zendesk: pnpm build -> bestzip dist/ (arc runner has no zip)
- teams: build +  script -> dist/hanzo-teams.zip (nil-GUID app id
  placeholder so the release asset always builds without a bot secret)
- desktop: matrix [macos, windows, ubuntu] Tauri build -> per-OS installer
  (.dmg / .msi+.exe / .AppImage+.deb), continue-on-error (signing is future)
- jupyter: build labextension -> python -m build --wheel

Wire all into the release job needs/files and extend the download table
with Design Tools / Team Apps / Desktop / Data Science sections. Every
advertised link resolves to a produced basename.
This commit is contained in:
Hanzo Dev
2026-07-04 01:05:31 -07:00
parent e37b8e7a07
commit 4faa92e902
+292 -1
View File
@@ -354,11 +354,258 @@ jobs:
name: hanzo-ai-outlook
path: /tmp/hanzo-ai-outlook-v*.zip
# ─── Figma plugin ───
figma:
name: Figma Plugin
runs-on: hanzo-build-linux-amd64
needs: secrets
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'pnpm'
- run: pnpm install --frozen-lockfile
- name: Build + package
run: |
VERSION=${GITHUB_REF_NAME#v}
pnpm --filter @hanzo/cards build
pnpm --filter @hanzo/figma build
# dist/ = manifest.json + code.js + ui.html. Import via
# Figma → Plugins → Development → Import plugin from manifest.
cd packages/figma/dist && npx --yes bestzip "/tmp/hanzo-ai-figma-v${VERSION}.zip" .
- name: Upload Figma plugin
uses: actions/upload-artifact@v4
with:
name: hanzo-ai-figma
path: /tmp/hanzo-ai-figma-v*.zip
# ─── Sketch plugin ───
sketch:
name: Sketch Plugin
runs-on: hanzo-build-linux-amd64
needs: secrets
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'pnpm'
- run: pnpm install --frozen-lockfile
- name: Build + package
run: |
VERSION=${GITHUB_REF_NAME#v}
pnpm --filter @hanzo/cards build
pnpm --filter @hanzo/sketch build
# dist/ contains the "Hanzo AI.sketchplugin" bundle; zip from dist so the
# bundle sits at the archive root (double-click to install into Sketch).
cd packages/sketch/dist && npx --yes bestzip "/tmp/hanzo-ai-sketch-v${VERSION}.zip" .
- name: Upload Sketch plugin
uses: actions/upload-artifact@v4
with:
name: hanzo-ai-sketch
path: /tmp/hanzo-ai-sketch-v*.zip
# ─── Microsoft Teams app ───
teams:
name: Teams App
runs-on: hanzo-build-linux-amd64
needs: secrets
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'pnpm'
- run: pnpm install --frozen-lockfile
- name: Build + package
env:
# The manifest builder substitutes the bot app id into the sideloadable
# package and errors on unset placeholders. Use the registered bot id when
# available; otherwise a nil-GUID placeholder so the release asset always
# builds (sideloaders replace it with their own Azure Bot registration).
MICROSOFT_APP_ID: ${{ secrets.MICROSOFT_APP_ID != '' && secrets.MICROSOFT_APP_ID || '00000000-0000-0000-0000-000000000000' }}
run: |
VERSION=${GITHUB_REF_NAME#v}
pnpm --filter @hanzo/cards build
pnpm --filter @hanzo/teams build
# The teams `package` script emits dist/hanzo-teams.zip (manifest + icons).
pnpm --filter @hanzo/teams package
cp packages/teams/dist/hanzo-teams.zip "/tmp/hanzo-ai-teams-v${VERSION}.zip"
- name: Upload Teams app
uses: actions/upload-artifact@v4
with:
name: hanzo-ai-teams
path: /tmp/hanzo-ai-teams-v*.zip
# ─── Zendesk Support app ───
zendesk:
name: Zendesk App
runs-on: hanzo-build-linux-amd64
needs: secrets
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'pnpm'
- run: pnpm install --frozen-lockfile
- name: Build + package
run: |
VERSION=${GITHUB_REF_NAME#v}
pnpm --filter @hanzo/cards build
pnpm --filter @hanzo/zendesk build
# dist/ is the ZAF v2 app (manifest.json + assets/ + translations/).
cd packages/zendesk/dist && npx --yes bestzip "/tmp/hanzo-ai-zendesk-v${VERSION}.zip" .
- name: Upload Zendesk app
uses: actions/upload-artifact@v4
with:
name: hanzo-ai-zendesk
path: /tmp/hanzo-ai-zendesk-v*.zip
# ─── Desktop app — per-OS Tauri installers ───
desktop:
name: Desktop (${{ matrix.os }})
runs-on: ${{ matrix.os }}
needs: secrets
strategy:
fail-fast: false
matrix:
os: [macos-latest, windows-latest, ubuntu-latest]
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'pnpm'
- uses: dtolnay/rust-toolchain@stable
- name: Install Tauri Linux deps
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get update
sudo apt-get install -y \
libwebkit2gtk-4.1-dev libgtk-3-dev \
libayatana-appindicator3-dev librsvg2-dev patchelf
- run: pnpm install
- name: Build frontend
run: pnpm --filter @hanzo/desktop build
- name: Build Tauri installers
run: pnpm --filter @hanzo/desktop tauri:build
continue-on-error: true
# Collect the native installer(s) and rename to a stable, per-OS release name.
# Signing/notarization is future work — a per-OS failure must not block others.
- name: Package for release (macOS)
if: matrix.os == 'macos-latest'
continue-on-error: true
run: |
VERSION=${GITHUB_REF_NAME#v}
mkdir -p /tmp/desktop
DMG=$(ls packages/desktop/src-tauri/target/release/bundle/dmg/*.dmg 2>/dev/null | head -1)
if [ -n "$DMG" ]; then cp "$DMG" "/tmp/desktop/hanzo-ai-desktop-macos-v${VERSION}.dmg"; fi
ls -la /tmp/desktop/ || echo "no macOS installer produced"
- name: Package for release (Windows)
if: matrix.os == 'windows-latest'
continue-on-error: true
shell: bash
run: |
VERSION=${GITHUB_REF_NAME#v}
mkdir -p /tmp/desktop
MSI=$(ls packages/desktop/src-tauri/target/release/bundle/msi/*.msi 2>/dev/null | head -1)
EXE=$(ls packages/desktop/src-tauri/target/release/bundle/nsis/*.exe 2>/dev/null | head -1)
if [ -n "$MSI" ]; then cp "$MSI" "/tmp/desktop/hanzo-ai-desktop-windows-v${VERSION}.msi"; fi
if [ -n "$EXE" ]; then cp "$EXE" "/tmp/desktop/hanzo-ai-desktop-windows-v${VERSION}.exe"; fi
ls -la /tmp/desktop/ || echo "no Windows installer produced"
- name: Package for release (Linux)
if: matrix.os == 'ubuntu-latest'
continue-on-error: true
run: |
VERSION=${GITHUB_REF_NAME#v}
mkdir -p /tmp/desktop
APPIMAGE=$(ls packages/desktop/src-tauri/target/release/bundle/appimage/*.AppImage 2>/dev/null | head -1)
DEB=$(ls packages/desktop/src-tauri/target/release/bundle/deb/*.deb 2>/dev/null | head -1)
if [ -n "$APPIMAGE" ]; then cp "$APPIMAGE" "/tmp/desktop/hanzo-ai-desktop-linux-v${VERSION}.AppImage"; fi
if [ -n "$DEB" ]; then cp "$DEB" "/tmp/desktop/hanzo-ai-desktop-linux-v${VERSION}.deb"; fi
ls -la /tmp/desktop/ || echo "no Linux installer produced"
- name: Upload Desktop installer
uses: actions/upload-artifact@v4
with:
name: hanzo-ai-desktop-${{ runner.os }}
path: /tmp/desktop/*
if-no-files-found: ignore
continue-on-error: true
# ─── JupyterLab extension (Python wheel) ───
jupyter:
name: JupyterLab Extension
runs-on: hanzo-build-linux-amd64
needs: secrets
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'pnpm'
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- run: pnpm install --frozen-lockfile
- name: Build labextension
run: pnpm --filter @hanzo/jupyter build
- name: Build wheel
continue-on-error: true
working-directory: packages/jupyter
run: |
VERSION=${GITHUB_REF_NAME#v}
python -m pip install --upgrade jupyterlab build
# hatch-jupyter-builder runs `jlpm build:prod` during the wheel build; the
# pre-built labextension above satisfies its skip-if-exists check.
python -m build --wheel
mkdir -p /tmp/jupyter
WHL=$(ls dist/hanzo_jupyter-*.whl dist/hanzo_ai_jupyter-*.whl 2>/dev/null | head -1)
if [ -n "$WHL" ]; then
# Rename to the tag version so the advertised release link resolves even
# if pyproject's version has not been synced to the tag.
cp "$WHL" "/tmp/jupyter/hanzo_jupyter-${VERSION}-py3-none-any.whl"
fi
ls -la /tmp/jupyter/ || echo "no wheel produced"
- name: Upload JupyterLab wheel
uses: actions/upload-artifact@v4
with:
name: hanzo-ai-jupyter
path: /tmp/jupyter/*.whl
if-no-files-found: ignore
continue-on-error: true
# ─── GitHub Release with downloadable artifacts ───
release:
name: GitHub Release
runs-on: hanzo-build-linux-amd64
needs: [browser, safari, vscode, jetbrains, office, outlook]
needs: [browser, safari, vscode, jetbrains, office, outlook, figma, sketch, teams, zendesk, desktop, jupyter]
if: startsWith(github.ref, 'refs/tags/v')
steps:
- uses: actions/checkout@v4
@@ -408,6 +655,44 @@ jobs:
> Chrome zip also works for Brave, Opera, Vivaldi, Arc.
> Cursor, Windsurf, and Antigravity use the VS Code VSIX format.
## Design Tools
| App | Platform | Download |
|-----|----------|----------|
| **Figma** | Windows / macOS / Web | [`hanzo-ai-figma-v${{ steps.version.outputs.version }}.zip`](https://github.com/hanzoai/extension/releases/download/${{ github.ref_name }}/hanzo-ai-figma-v${{ steps.version.outputs.version }}.zip) |
| **Sketch** | macOS | [`hanzo-ai-sketch-v${{ steps.version.outputs.version }}.zip`](https://github.com/hanzoai/extension/releases/download/${{ github.ref_name }}/hanzo-ai-sketch-v${{ steps.version.outputs.version }}.zip) |
> Figma: unzip and import `manifest.json` via Figma → Plugins → Development → Import plugin from manifest.
> Sketch: unzip and double-click `Hanzo AI.sketchplugin`.
## Team Apps
| App | Platform | Download |
|-----|----------|----------|
| **Microsoft Teams** | Windows / macOS / Web | [`hanzo-ai-teams-v${{ steps.version.outputs.version }}.zip`](https://github.com/hanzoai/extension/releases/download/${{ github.ref_name }}/hanzo-ai-teams-v${{ steps.version.outputs.version }}.zip) |
| **Zendesk** | Web | [`hanzo-ai-zendesk-v${{ steps.version.outputs.version }}.zip`](https://github.com/hanzoai/extension/releases/download/${{ github.ref_name }}/hanzo-ai-zendesk-v${{ steps.version.outputs.version }}.zip) |
> Teams: sideload the zip via Teams → Apps → Manage your apps → Upload an app. Set your own Azure Bot app id before publishing.
> Zendesk: upload the zip via the Zendesk Admin Center → Apps and integrations → Upload private app.
## Desktop App
| OS | Format | Download |
|----|--------|----------|
| **macOS** | `.dmg` | [`hanzo-ai-desktop-macos-v${{ steps.version.outputs.version }}.dmg`](https://github.com/hanzoai/extension/releases/download/${{ github.ref_name }}/hanzo-ai-desktop-macos-v${{ steps.version.outputs.version }}.dmg) |
| **Windows** | `.msi` / `.exe` | [`hanzo-ai-desktop-windows-v${{ steps.version.outputs.version }}.msi`](https://github.com/hanzoai/extension/releases/download/${{ github.ref_name }}/hanzo-ai-desktop-windows-v${{ steps.version.outputs.version }}.msi) · [`.exe`](https://github.com/hanzoai/extension/releases/download/${{ github.ref_name }}/hanzo-ai-desktop-windows-v${{ steps.version.outputs.version }}.exe) |
| **Linux** | `.AppImage` / `.deb` | [`hanzo-ai-desktop-linux-v${{ steps.version.outputs.version }}.AppImage`](https://github.com/hanzoai/extension/releases/download/${{ github.ref_name }}/hanzo-ai-desktop-linux-v${{ steps.version.outputs.version }}.AppImage) · [`.deb`](https://github.com/hanzoai/extension/releases/download/${{ github.ref_name }}/hanzo-ai-desktop-linux-v${{ steps.version.outputs.version }}.deb) |
> Desktop installers are unsigned for now — macOS: right-click → Open; Windows: "More info" → Run anyway.
## Data Science
| App | Platform | Download |
|-----|----------|----------|
| **JupyterLab** | Windows / macOS / Linux | [`hanzo_jupyter-${{ steps.version.outputs.version }}-py3-none-any.whl`](https://github.com/hanzoai/extension/releases/download/${{ github.ref_name }}/hanzo_jupyter-${{ steps.version.outputs.version }}-py3-none-any.whl) |
> Jupyter: `pip install hanzo_jupyter-*.whl` then restart JupyterLab.
**Install**: `code --install-extension hanzo-ai-vscode-v${{ steps.version.outputs.version }}.vsix`
**Antigravity**: `antigravity --install-extension hanzo-ai-antigravity-v${{ steps.version.outputs.version }}.vsix`
files: |
@@ -417,3 +702,9 @@ jobs:
artifacts/hanzo-ai-office/*
artifacts/hanzo-ai-outlook/*
artifacts/hanzo-ai-safari/*
artifacts/hanzo-ai-figma/*
artifacts/hanzo-ai-sketch/*
artifacts/hanzo-ai-teams/*
artifacts/hanzo-ai-zendesk/*
artifacts/hanzo-ai-desktop-*/*
artifacts/hanzo-ai-jupyter/*