diff --git a/.github/workflows/release-desktop.yml b/.github/workflows/release-desktop.yml index aa00fa147..c94fd2feb 100644 --- a/.github/workflows/release-desktop.yml +++ b/.github/workflows/release-desktop.yml @@ -4,6 +4,13 @@ on: push: tags: - "desktop-v*" + - "DeskTop-v*" + - "Desktop-v*" + pull_request: + paths: + - "apps/desktop/**" + - ".github/workflows/release-desktop.yml" + workflow_dispatch: jobs: release: @@ -53,7 +60,12 @@ jobs: if [ "${{ matrix.platform }}" = "windows-latest" ]; then EXT=".exe"; fi mkdir -p apps/desktop/src-tauri/binaries cp target/${{ matrix.target }}/release/api${EXT} apps/desktop/src-tauri/binaries/api-${{ matrix.target }}${EXT} + - name: Build Tauri app (PR / manual validation) + if: github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' + working-directory: apps/desktop + run: bun tauri build ${{ matrix.args }} --no-bundle - name: Build and release Tauri app + if: startsWith(github.ref, 'refs/tags/') uses: tauri-apps/tauri-action@v0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -61,7 +73,7 @@ jobs: TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} with: projectPath: apps/desktop - tagName: desktop-v__VERSION__ + tagName: ${{ github.ref_name }} releaseName: Atmos Desktop v__VERSION__ releaseDraft: true prerelease: false diff --git a/apps/desktop/package.json b/apps/desktop/package.json index fce2e349d..a7eb5f8a9 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -7,7 +7,7 @@ "tauri": "tauri", "dev": "tauri dev", "build": "tauri build", - "prepare:sidecar": "bash ./scripts/prepare-sidecar.sh" + "prepare:sidecar": "node ./scripts/before-build.mjs" }, "devDependencies": { "@tauri-apps/cli": "^2.0.0" diff --git a/apps/desktop/scripts/before-build.mjs b/apps/desktop/scripts/before-build.mjs new file mode 100644 index 000000000..9e2a60ddd --- /dev/null +++ b/apps/desktop/scripts/before-build.mjs @@ -0,0 +1,72 @@ +import { cpSync, existsSync, mkdirSync, rmSync } from "node:fs"; +import { join, resolve } from "node:path"; +import { spawnSync } from "node:child_process"; + +const rootDir = resolve(import.meta.dirname, "../../.."); + +function run(command, args, options = {}) { + const result = spawnSync(command, args, { + stdio: "inherit", + cwd: rootDir, + env: process.env, + shell: process.platform === "win32", + ...options, + }); + + if (result.status !== 0) { + process.exit(result.status ?? 1); + } +} + +run("bun", ["--filter", "web", "build"], { + env: { + ...process.env, + BUILD_TARGET: "desktop", + }, +}); + +let targetTriple = process.env.TARGET_TRIPLE; +if (!targetTriple) { + const rustc = spawnSync("rustc", ["-vV"], { + cwd: rootDir, + encoding: "utf-8", + shell: process.platform === "win32", + }); + + if (rustc.status !== 0) { + process.exit(rustc.status ?? 1); + } + + const hostLine = rustc.stdout + .split("\n") + .find((line) => line.startsWith("host:")); + + if (!hostLine) { + console.error("Unable to detect rust host triple from `rustc -vV`."); + process.exit(1); + } + + targetTriple = hostLine.replace("host:", "").trim(); +} + +run("cargo", ["build", "--release", "--bin", "api", "--target", targetTriple]); + +const binExt = targetTriple.includes("windows") ? ".exe" : ""; +const binariesDir = join(rootDir, "apps/desktop/src-tauri/binaries"); +mkdirSync(binariesDir, { recursive: true }); + +const fromSidecar = join(rootDir, `target/${targetTriple}/release/api${binExt}`); +const toSidecar = join(binariesDir, `api-${targetTriple}${binExt}`); +cpSync(fromSidecar, toSidecar); +console.log(`Prepared sidecar: ${toSidecar}`); + +const webOut = join(rootDir, "apps/web/out"); +const sidecarWebOut = join(binariesDir, "web-out"); + +if (existsSync(webOut)) { + rmSync(sidecarWebOut, { recursive: true, force: true }); + cpSync(webOut, sidecarWebOut, { recursive: true }); + console.log(`Copied web static export to: ${sidecarWebOut}`); +} else { + console.warn(`Warning: ${webOut} not found, skipping web static copy`); +} diff --git a/apps/desktop/src-tauri/tauri.conf.json b/apps/desktop/src-tauri/tauri.conf.json index 5a83f5788..60c2053a5 100644 --- a/apps/desktop/src-tauri/tauri.conf.json +++ b/apps/desktop/src-tauri/tauri.conf.json @@ -5,7 +5,7 @@ "identifier": "com.atmos.desktop", "build": { "beforeDevCommand": "bun --filter web dev", - "beforeBuildCommand": "BUILD_TARGET=desktop bun --filter web build && bash ./scripts/prepare-sidecar.sh", + "beforeBuildCommand": "node ./scripts/before-build.mjs", "devUrl": "http://localhost:3030", "frontendDist": "../../web/out" }, @@ -36,7 +36,7 @@ } }, "bundle": { - "active": false, + "active": true, "targets": "all", "icon": ["icons/icon.svg"], "externalBin": [ diff --git a/apps/desktop/src-tauri/tauri.debug.conf.json b/apps/desktop/src-tauri/tauri.debug.conf.json index b4f93add3..f7c510330 100644 --- a/apps/desktop/src-tauri/tauri.debug.conf.json +++ b/apps/desktop/src-tauri/tauri.debug.conf.json @@ -6,7 +6,7 @@ "build": { "beforeDevCommand": "", "devUrl": "http://localhost:3030", - "beforeBuildCommand": "BUILD_TARGET=desktop bun --filter web build && bash ./scripts/prepare-sidecar.sh", + "beforeBuildCommand": "node ./scripts/before-build.mjs", "frontendDist": "../../web/out" }, "app": {