(feat): tauri -> electron desktop app migration #9

Merged
alois merged 13 commits from dev into main 2026-05-25 16:35:36 +03:00
4 changed files with 71 additions and 8 deletions
Showing only changes of commit 2440fedaad - Show all commits

(feat): add auto update for dev builds on dev builds
All checks were successful
/ build-web (push) Successful in 1m17s
/ build-desktop (linux) (push) Successful in 5m42s
/ build-mobile (push) Successful in 11m33s
/ release (push) Successful in 29s

Alois 2026-05-25 14:05:20 +02:00

View file

@ -104,6 +104,20 @@ jobs:
- name: Build packages
run: bun run build:packages
- name: Set Electron dev version
run: |
VERSION="$(node -p "require('./package.json').version")"
SHORT_SHA="$(git rev-parse --short HEAD)"
DEV_VERSION="$VERSION-dev-$SHORT_SHA"
export DEV_VERSION
node -e '
const fs = require("fs");
const path = "apps/electron/package.json";
const pkg = JSON.parse(fs.readFileSync(path, "utf8"));
pkg.version = process.env.DEV_VERSION;
fs.writeFileSync(path, JSON.stringify(pkg, null, 2) + "\n");
'
- name: Build Electron desktop
run: bun run build:desktop
@ -143,9 +157,6 @@ jobs:
name: electron-desktop-linux
path: apps/electron/release/
- name: Copy releases
run: bun --bun run copy-releases
- name: Read version and hash
id: version
run: |
@ -156,6 +167,15 @@ jobs:
echo "tag=${VERSION}-dev-${SHORT_SHA}" >> "$FORGEJO_OUTPUT"
echo "title=${VERSION}-dev-${SHORT_SHA}" >> "$FORGEJO_OUTPUT"
- name: Copy releases
env:
TENSAMIN_RELEASE_VERSION: ${{ steps.version.outputs.tag }}
TENSAMIN_RELEASE_TAG: ${{ steps.version.outputs.tag }}
run: |
ASSET_BASE_URL="${{ forgejo.api_url }}"
ASSET_BASE_URL="${ASSET_BASE_URL%/api/v1}/${{ forgejo.repository }}/releases/download/${{ steps.version.outputs.tag }}"
FORGEJO_RELEASE_ASSET_BASE_URL="$ASSET_BASE_URL" bun --bun run copy-releases
- name: Create pre-release and upload files
env:
TOKEN: ${{ forgejo.token }}
@ -239,6 +259,7 @@ jobs:
const fs = require("fs");
const path = "releases/electron-release-metadata.json";
const metadata = JSON.parse(fs.readFileSync(path, "utf8"));
metadata.version = process.env.TAG;
metadata.tag = process.env.TAG;
for (const artifact of metadata.artifacts || []) {
artifact.url = `${process.env.ASSET_BASE_URL}/${encodeURIComponent(artifact.name)}`;

View file

@ -104,6 +104,18 @@ jobs:
- name: Build packages
run: bun run build:packages
- name: Set Electron prod version
run: |
VERSION="$(node -p "require('./package.json').version")"
export VERSION
node -e '
const fs = require("fs");
const path = "apps/electron/package.json";
const pkg = JSON.parse(fs.readFileSync(path, "utf8"));
pkg.version = process.env.VERSION;
fs.writeFileSync(path, JSON.stringify(pkg, null, 2) + "\n");
'
- name: Build Electron desktop
run: bun run build:desktop
@ -141,9 +153,6 @@ jobs:
name: electron-desktop-linux
path: apps/electron/release/
- name: Copy releases
run: bun --bun run copy-releases
- name: Read version
id: version
run: |
@ -151,6 +160,15 @@ jobs:
echo "version=$VERSION" >> "$FORGEJO_OUTPUT"
echo "tag=$VERSION" >> "$FORGEJO_OUTPUT"
- name: Copy releases
env:
TENSAMIN_RELEASE_VERSION: ${{ steps.version.outputs.tag }}
TENSAMIN_RELEASE_TAG: ${{ steps.version.outputs.tag }}
run: |
ASSET_BASE_URL="${{ forgejo.api_url }}"
ASSET_BASE_URL="${ASSET_BASE_URL%/api/v1}/${{ forgejo.repository }}/releases/download/${{ steps.version.outputs.tag }}"
FORGEJO_RELEASE_ASSET_BASE_URL="$ASSET_BASE_URL" bun --bun run copy-releases
- name: Create release and upload files
env:
TOKEN: ${{ forgejo.token }}
@ -198,6 +216,7 @@ jobs:
const fs = require("fs");
const path = "releases/electron-release-metadata.json";
const metadata = JSON.parse(fs.readFileSync(path, "utf8"));
metadata.version = process.env.TAG;
metadata.tag = process.env.TAG;
for (const artifact of metadata.artifacts || []) {
artifact.url = `${process.env.ASSET_BASE_URL}/${encodeURIComponent(artifact.name)}`;

View file

@ -20,6 +20,10 @@ function compareSemver(left: string, right: string) {
return 0;
}
function isDevVersion(version: string) {
return /-dev[.-]/.test(version);
}
function platformName() {
if (process.platform === "win32") return "windows";
if (process.platform === "darwin") return "macos";
@ -101,6 +105,23 @@ export async function checkForUpdates(): Promise<UpdateCheckResult> {
const metadata = JSON.parse(await requestText(metadataUrl)) as ReleaseMetadata;
const artifact = selectArtifact(metadata);
if (isDevVersion(metadata.version) !== isDevVersion(currentVersion)) {
return { available: false, currentVersion, latestVersion: metadata.version };
}
if (isDevVersion(currentVersion)) {
if (!artifact || metadata.version === currentVersion) {
return { available: false, currentVersion, latestVersion: metadata.version };
}
return {
available: true,
currentVersion,
latestVersion: metadata.version,
artifact,
};
}
if (!artifact || compareSemver(metadata.version, currentVersion) <= 0) {
return { available: false, currentVersion, latestVersion: metadata.version };
}

View file

@ -13,6 +13,8 @@ import { join } from "node:path";
import packageJson from "../package.json" with { type: "json" };
const { version } = packageJson;
const releaseVersion = process.env.TENSAMIN_RELEASE_VERSION || version;
const releaseTag = process.env.TENSAMIN_RELEASE_TAG || releaseVersion;
const releasesDir = join("releases");
const releaseAssetBaseUrl = process.env.FORGEJO_RELEASE_ASSET_BASE_URL;
@ -64,7 +66,7 @@ const copyElectronArtifacts = () => {
for (const file of readdirSync(electronReleaseDir)) {
if (file.endsWith(".blockmap") || file.endsWith(".yml")) continue;
if (!file.includes(version)) continue;
if (!file.includes(version) && !file.includes(releaseVersion)) continue;
const source = join(electronReleaseDir, file);
if (!statSync(source).isFile()) continue;
@ -98,7 +100,7 @@ const artifacts = await Promise.all(
await Bun.write(
join(releasesDir, "electron-release-metadata.json"),
`${JSON.stringify({ version, tag: version, publishedAt: new Date().toISOString(), artifacts: artifacts.filter((artifact) => artifact.platform !== "android") }, null, 2)}\n`,
`${JSON.stringify({ version: releaseVersion, tag: releaseTag, publishedAt: new Date().toISOString(), artifacts: artifacts.filter((artifact) => artifact.platform !== "android") }, null, 2)}\n`,
);
await Bun.write(
join(releasesDir, "SHA256SUMS"),