diff --git a/.devcontainer/buildAppImage.sh b/.devcontainer/buildAppImage.sh deleted file mode 100644 index efb963d5a..000000000 --- a/.devcontainer/buildAppImage.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env bash - -make clean - -# To reproduce https://github.com/menloresearch/jan/pull/5463 -TAURI_TOOLKIT_PATH="${XDG_CACHE_HOME:-$HOME/.cache}/tauri" -mkdir -p "$TAURI_TOOLKIT_PATH" -wget https://github.com/linuxdeploy/linuxdeploy/releases/download/1-alpha-20250213-2/linuxdeploy-x86_64.AppImage -O "$TAURI_TOOLKIT_PATH/linuxdeploy-x86_64.AppImage" -chmod +x "$TAURI_TOOLKIT_PATH/linuxdeploy-x86_64.AppImage" - -jq '.bundle.resources = ["resources/pre-install/**/*"] | .bundle.externalBin = ["binaries/cortex-server", "resources/bin/uv"]' ./src-tauri/tauri.conf.json > /tmp/tauri.conf.json -mv /tmp/tauri.conf.json ./src-tauri/tauri.conf.json - -make build-tauri - -cp ./src-tauri/resources/bin/bun ./src-tauri/target/release/bundle/appimage/Jan.AppDir/usr/bin/bun -mkdir -p ./src-tauri/target/release/bundle/appimage/Jan.AppDir/usr/lib/Jan/binaries/engines -cp -f ./src-tauri/binaries/deps/*.so* ./src-tauri/target/release/bundle/appimage/Jan.AppDir/usr/lib/Jan/binaries/ -cp -f ./src-tauri/binaries/*.so* ./src-tauri/target/release/bundle/appimage/Jan.AppDir/usr/lib/Jan/binaries/ -cp -rf ./src-tauri/binaries/engines ./src-tauri/target/release/bundle/appimage/Jan.AppDir/usr/lib/Jan/binaries/ -APP_IMAGE=./src-tauri/target/release/bundle/appimage/$(ls ./src-tauri/target/release/bundle/appimage/ | grep AppImage | head -1) -echo $APP_IMAGE -rm -f $APP_IMAGE -/opt/bin/appimagetool ./src-tauri/target/release/bundle/appimage/Jan.AppDir $APP_IMAGE \ No newline at end of file diff --git a/.devcontainer/postCreateCommand.sh b/.devcontainer/postCreateCommand.sh index 79fb4de1c..a9a1277b8 100755 --- a/.devcontainer/postCreateCommand.sh +++ b/.devcontainer/postCreateCommand.sh @@ -14,7 +14,3 @@ sudo apt install -yqq libwebkit2gtk-4.1-dev \ librsvg2-dev \ xdg-utils \ libfuse2 - -sudo mkdir -p /opt/bin -sudo wget https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O /opt/bin/appimagetool -sudo chmod +x /opt/bin/appimagetool \ No newline at end of file diff --git a/.github/workflows/template-tauri-build-linux-x64.yml b/.github/workflows/template-tauri-build-linux-x64.yml index 303b00109..b07faa0bc 100644 --- a/.github/workflows/template-tauri-build-linux-x64.yml +++ b/.github/workflows/template-tauri-build-linux-x64.yml @@ -104,20 +104,15 @@ jobs: run: | echo "Version: ${{ inputs.new_version }}" # Update tauri.conf.json - jq --arg version "${{ inputs.new_version }}" '.version = $version | .bundle.createUpdaterArtifacts = true | .bundle.resources = ["resources/pre-install/**/*"] | .bundle.externalBin = ["binaries/cortex-server", "resources/bin/uv"]' ./src-tauri/tauri.conf.json > /tmp/tauri.conf.json + jq --arg version "${{ inputs.new_version }}" '.version = $version | .bundle.createUpdaterArtifacts = true' ./src-tauri/tauri.conf.json > /tmp/tauri.conf.json mv /tmp/tauri.conf.json ./src-tauri/tauri.conf.json if [ "${{ inputs.channel }}" != "stable" ]; then jq '.bundle.linux.deb.files = {"usr/bin/bun": "resources/bin/bun", "usr/lib/Jan-${{ inputs.channel }}/binaries": "binaries/deps", "usr/lib/Jan-${{ inputs.channel }}/binaries/engines": "binaries/engines", - "usr/lib/Jan-${{ inputs.channel }}/binaries/libvulkan.so": "binaries/libvulkan.so"}' ./src-tauri/tauri.conf.json > /tmp/tauri.conf.json - else - jq '.bundle.linux.deb.files = {"usr/bin/bun": "resources/bin/bun", - "usr/lib/Jan/binaries": "binaries/deps", - "usr/lib/Jan/binaries/engines": "binaries/engines", - "usr/lib/Jan/binaries/libvulkan.so": "binaries/libvulkan.so"}' ./src-tauri/tauri.conf.json > /tmp/tauri.conf.json + "usr/lib/Jan-${{ inputs.channel }}/binaries/libvulkan.so": "binaries/libvulkan.so"}' ./src-tauri/tauri.linux.conf.json > /tmp/tauri.linux.conf.json + mv /tmp/tauri.linux.conf.json ./src-tauri/tauri.linux.conf.json fi - mv /tmp/tauri.conf.json ./src-tauri/tauri.conf.json jq --arg version "${{ inputs.new_version }}" '.version = $version' web-app/package.json > /tmp/package.json mv /tmp/package.json web-app/package.json @@ -150,48 +145,16 @@ jobs: fi - name: Build app run: | - # Pin linuxdeploy version to prevent @tauri-apps/cli-linux-x64-gnu from pulling in an outdated version - TAURI_TOOLKIT_PATH="${XDG_CACHE_HOME:-$HOME/.cache}/tauri" - mkdir -p "$TAURI_TOOLKIT_PATH" - wget https://github.com/linuxdeploy/linuxdeploy/releases/download/1-alpha-20250213-2/linuxdeploy-x86_64.AppImage -O "$TAURI_TOOLKIT_PATH/linuxdeploy-x86_64.AppImage" - chmod +x "$TAURI_TOOLKIT_PATH/linuxdeploy-x86_64.AppImage" - make build-tauri - # Copy engines and bun to appimage - wget https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O ./appimagetool - chmod +x ./appimagetool - if [ "${{ inputs.channel }}" != "stable" ]; then - ls ./src-tauri/target/release/bundle/appimage/ - cp ./src-tauri/resources/bin/bun ./src-tauri/target/release/bundle/appimage/Jan-${{ inputs.channel }}.AppDir/usr/bin/bun - mkdir -p ./src-tauri/target/release/bundle/appimage/Jan-${{ inputs.channel }}.AppDir/usr/lib/Jan-${{ inputs.channel }}/binaries/engines - cp -f ./src-tauri/binaries/deps/*.so* ./src-tauri/target/release/bundle/appimage/Jan-${{ inputs.channel }}.AppDir/usr/lib/Jan-${{ inputs.channel }}/binaries/ - cp -f ./src-tauri/binaries/*.so* ./src-tauri/target/release/bundle/appimage/Jan-${{ inputs.channel }}.AppDir/usr/lib/Jan-${{ inputs.channel }}/binaries/ - cp -rf ./src-tauri/binaries/engines ./src-tauri/target/release/bundle/appimage/Jan-${{ inputs.channel }}.AppDir/usr/lib/Jan-${{ inputs.channel }}/binaries/ - APP_IMAGE=./src-tauri/target/release/bundle/appimage/$(ls ./src-tauri/target/release/bundle/appimage/ | grep .AppImage | head -1) - echo $APP_IMAGE - rm -f $APP_IMAGE - ./appimagetool ./src-tauri/target/release/bundle/appimage/Jan-${{ inputs.channel }}.AppDir $APP_IMAGE - yarn tauri signer sign \ - --private-key "$TAURI_SIGNING_PRIVATE_KEY" \ - --password "$TAURI_SIGNING_PRIVATE_KEY_PASSWORD" \ - "$APP_IMAGE" - else - cp ./src-tauri/resources/bin/bun ./src-tauri/target/release/bundle/appimage/Jan.AppDir/usr/bin/bun - mkdir -p ./src-tauri/target/release/bundle/appimage/Jan.AppDir/usr/lib/Jan/binaries/engines - cp -f ./src-tauri/binaries/deps/*.so* ./src-tauri/target/release/bundle/appimage/Jan.AppDir/usr/lib/Jan/binaries/ - cp -f ./src-tauri/binaries/*.so* ./src-tauri/target/release/bundle/appimage/Jan.AppDir/usr/lib/Jan/binaries/ - cp -rf ./src-tauri/binaries/engines ./src-tauri/target/release/bundle/appimage/Jan.AppDir/usr/lib/Jan/binaries/ - APP_IMAGE=./src-tauri/target/release/bundle/appimage/$(ls ./src-tauri/target/release/bundle/appimage/ | grep AppImage | head -1) - echo $APP_IMAGE - rm -f $APP_IMAGE - ./appimagetool ./src-tauri/target/release/bundle/appimage/Jan.AppDir $APP_IMAGE - yarn tauri signer sign \ - --private-key "$TAURI_SIGNING_PRIVATE_KEY" \ - --password "$TAURI_SIGNING_PRIVATE_KEY_PASSWORD" \ - "$APP_IMAGE" - fi + + APP_IMAGE=./src-tauri/target/release/bundle/appimage/$(ls ./src-tauri/target/release/bundle/appimage/ | grep AppImage | head -1) + yarn tauri signer sign \ + --private-key "$TAURI_SIGNING_PRIVATE_KEY" \ + --password "$TAURI_SIGNING_PRIVATE_KEY_PASSWORD" \ + "$APP_IMAGE" env: + RELEASE_CHANNEL: "${{ inputs.channel }}" GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} POSTHOG_KEY: ${{ secrets.POSTHOG_KEY }} POSTHOG_HOST: ${{ secrets.POSTHOG_HOST }} diff --git a/.gitignore b/.gitignore index f09d958d0..e714bfdd6 100644 --- a/.gitignore +++ b/.gitignore @@ -49,4 +49,5 @@ src-tauri/resources/bin # Helper tools .opencode OpenCode.md -archive/ \ No newline at end of file +archive/ +.cache/ \ No newline at end of file diff --git a/Makefile b/Makefile index 6e69c602d..5bd42c755 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,8 @@ config-yarn: install-and-build: config-yarn ifeq ($(OS),Windows_NT) echo "skip" +else ifeq ($(shell uname -s),Linux) + chmod +x src-tauri/build-utils/* endif yarn install yarn build:core @@ -82,6 +84,7 @@ else ifeq ($(shell uname -s),Linux) rm -rf ./src-tauri/target rm -rf "~/jan/extensions" rm -rf "~/.cache/jan*" + rm -rf "./.cache" else find . -name "node_modules" -type d -prune -exec rm -rf '{}' + find . -name ".next" -type d -exec rm -rf '{}' + diff --git a/mise.toml b/mise.toml index 9f6cee5c7..86a90f742 100644 --- a/mise.toml +++ b/mise.toml @@ -164,6 +164,7 @@ elif [[ "$OSTYPE" == "linux-gnu"* ]]; then rm -rf ./src-tauri/target 2>/dev/null || true rm -rf ~/jan/extensions 2>/dev/null || true rm -rf "~/.cache/jan*" 2>/dev/null || true + rm -rf "./.cache" 2>/dev/null || true else # macOS cleanup (matches Makefile) find . -name "node_modules" -type d -prune -exec rm -rf '{}' + 2>/dev/null || true diff --git a/package.json b/package.json index c8273cb33..ce2e96117 100644 --- a/package.json +++ b/package.json @@ -33,9 +33,10 @@ "copy:lib:win32": "cpx \"./lib/windows/*.dll\" \"./src-tauri/resources/lib/\"", "copy:lib:darwin": "mkdir -p \"./src-tauri/resources/lib/\"", "download:bin": "node ./scripts/download-bin.mjs", - "build:tauri:linux:win32": "yarn download:bin && yarn install:cortex && yarn build:icon && yarn copy:assets:tauri && yarn tauri build", - "build:tauri:darwin": "yarn install:cortex && yarn build:icon && yarn copy:assets:tauri && yarn tauri build --target universal-apple-darwin", - "build:tauri": "run-script-os", + "build:tauri:win32": "yarn download:bin && yarn tauri build", + "build:tauri:linux": "yarn download:bin && ./src-tauri/build-utils/shim-linuxdeploy.sh yarn tauri build && ./src-tauri/build-utils/buildAppImage.sh", + "build:tauri:darwin": "yarn tauri build --target universal-apple-darwin", + "build:tauri": "yarn install:cortex && yarn build:icon && yarn copy:assets:tauri && run-script-os", "build:icon": "tauri icon ./src-tauri/icons/icon.png", "build:core": "cd core && yarn build && yarn pack", "build:web": "yarn workspace @janhq/web-app build", diff --git a/src-tauri/build-utils/buildAppImage.sh b/src-tauri/build-utils/buildAppImage.sh new file mode 100755 index 000000000..3149e0b2c --- /dev/null +++ b/src-tauri/build-utils/buildAppImage.sh @@ -0,0 +1,33 @@ +#!/bin/bash +APPIMAGETOOL="./.cache/build-tools/appimagetool" +RELEASE_CHANNEL=${RELEASE_CHANNEL:-"stable"} + +# pull in AppImageTool if it's not pre cached +mkdir -p ./.cache/build-tools +if [ ! -f "${APPIMAGETOOL}" ]; then + wget https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O "${APPIMAGETOOL}" + chmod +x "${APPIMAGETOOL}" +fi + +if [ "${RELEASE_CHANNEL}" != "stable" ]; then + APP_DIR=./src-tauri/target/release/bundle/appimage/Jan-${RELEASE_CHANNEL}.AppDir + LIB_DIR=$APP_DIR/usr/lib/Jan-${RELEASE_CHANNEL}/binaries +else + APP_DIR=./src-tauri/target/release/bundle/appimage/Jan.AppDir + LIB_DIR=$APP_DIR/usr/lib/Jan/binaries +fi + +# bundle additional resources in the AppDir without pulling in their dependencies +cp ./src-tauri/resources/bin/bun $APP_DIR/usr/bin/bun +mkdir -p $LIB_DIR/engines +cp -f ./src-tauri/binaries/deps/*.so* $LIB_DIR/ +cp -f ./src-tauri/binaries/*.so* $LIB_DIR/ +cp -rf ./src-tauri/binaries/engines $LIB_DIR/ + +# remove appimage generated by tauri build +APP_IMAGE=./src-tauri/target/release/bundle/appimage/$(ls ./src-tauri/target/release/bundle/appimage/ | grep AppImage | head -1) +echo $APP_IMAGE +rm -f $APP_IMAGE + +# repackage appimage with additional resources +"${APPIMAGETOOL}" $APP_DIR $APP_IMAGE \ No newline at end of file diff --git a/src-tauri/build-utils/shim-linuxdeploy.sh b/src-tauri/build-utils/shim-linuxdeploy.sh new file mode 100755 index 000000000..359ccd5ba --- /dev/null +++ b/src-tauri/build-utils/shim-linuxdeploy.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +set -euo pipefail + +# wrapper script to pin linuxdeploy version and inject environment variables into the +# build process. While yarn supports injecting environment vairables via env files, +# this applies to all yarn scripts. Using a wrapper allows granular control over +# when environment variables are injected, and avoids tainting the system .cache + +# avoid redownloading corepack if possible +export COREPACK_HOME=${COREPACK_HOME:-${XDG_CACHE_HOME:-$HOME/.cache}/node/corepack} +# move cache home to /.cache +export XDG_CACHE_HOME=${PWD}/.cache + +LINUXDEPLOY_VER="1-alpha-20250213-2" +LINUXDEPLOY="$XDG_CACHE_HOME/tauri/linuxdeploy-$LINUXDEPLOY_VER-x86_64.AppImage" +SYMLINK="$XDG_CACHE_HOME/tauri/linuxdeploy-x86_64.AppImage" + +mkdir -p "$XDG_CACHE_HOME/tauri" + +if [ ! -f "$LINUXDEPLOY" ]; then + GLOB_PATTERN="$XDG_CACHE_HOME/tauri/linuxdeploy-*-x86_64.AppImage" + rm -f $GLOB_PATTERN + wget "https://github.com/linuxdeploy/linuxdeploy/releases/download/$LINUXDEPLOY_VER/linuxdeploy-x86_64.AppImage" -O "$LINUXDEPLOY" + chmod a+x "$LINUXDEPLOY" +fi + +rm -f "$SYMLINK" +ln -s "$LINUXDEPLOY" "$SYMLINK" + +"$@" \ No newline at end of file diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 210322297..e6f9d6214 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -76,7 +76,6 @@ }, "bundle": { "active": true, - "targets": ["nsis", "app", "dmg", "deb", "appimage"], "createUpdaterArtifacts": false, "icon": [ "icons/32x32.png", @@ -84,32 +83,6 @@ "icons/128x128@2x.png", "icons/icon.icns", "icons/icon.ico" - ], - "resources": [ - "resources/pre-install/**/*", - "resources/lib/", - "binaries/**/*" - ], - "externalBin": [ - "binaries/cortex-server", - "resources/bin/bun", - "resources/bin/uv" - ], - "linux": { - "appimage": { - "bundleMediaFramework": false, - "files": {} - }, - "deb": { - "files": { - "usr/bin/bun": "resources/bin/bun", - "usr/lib/Jan/binaries": "binaries/deps", - "usr/lib/Jan/binaries/engines": "binaries/engines" - } - } - }, - "windows": { - "signCommand": "powershell -ExecutionPolicy Bypass -File ./sign.ps1 %1" - } + ] } } diff --git a/src-tauri/tauri.linux.conf.json b/src-tauri/tauri.linux.conf.json new file mode 100644 index 000000000..4174cd770 --- /dev/null +++ b/src-tauri/tauri.linux.conf.json @@ -0,0 +1,26 @@ +{ + "bundle": { + "targets": ["deb", "appimage"], + "resources": [ + "resources/pre-install/**/*" + ], + "externalBin": [ + "binaries/cortex-server", + "resources/bin/uv" + ], + "linux": { + "appimage": { + "bundleMediaFramework": false, + "files": {} + }, + "deb": { + "files": { + "usr/bin/bun": "resources/bin/bun", + "usr/lib/Jan/binaries": "binaries/deps", + "usr/lib/Jan/binaries/engines": "binaries/engines", + "usr/lib/Jan/binaries/libvulkan.so": "binaries/libvulkan.so" + } + } + } + } +} diff --git a/src-tauri/tauri.macos.conf.json b/src-tauri/tauri.macos.conf.json new file mode 100644 index 000000000..485e1b784 --- /dev/null +++ b/src-tauri/tauri.macos.conf.json @@ -0,0 +1,15 @@ +{ + "bundle": { + "targets": ["app", "dmg"], + "resources": [ + "resources/pre-install/**/*", + "resources/lib/", + "binaries/**/*" + ], + "externalBin": [ + "binaries/cortex-server", + "resources/bin/bun", + "resources/bin/uv" + ] + } +} diff --git a/src-tauri/tauri.windows.conf.json b/src-tauri/tauri.windows.conf.json new file mode 100644 index 000000000..17ebd5dab --- /dev/null +++ b/src-tauri/tauri.windows.conf.json @@ -0,0 +1,18 @@ +{ + "bundle": { + "targets": ["nsis"], + "resources": [ + "resources/pre-install/**/*", + "resources/lib/", + "binaries/**/*" + ], + "externalBin": [ + "binaries/cortex-server", + "resources/bin/bun", + "resources/bin/uv" + ], + "windows": { + "signCommand": "powershell -ExecutionPolicy Bypass -File ./sign.ps1 %1" + } + } +}