mirror of
https://github.com/BigMarc/timebunny-release.git
synced 2026-10-13 17:03:09 +02:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
71acd62ec8 | ||
|
|
5b3c3d4abf | ||
|
|
b871f6aff0 | ||
|
|
9c25bb6cf9 | ||
|
|
4f35d8f79c | ||
|
|
0161ca1241 | ||
|
|
2334be1dd8 | ||
|
|
69b45cb502 | ||
|
|
52ec08b8ec | ||
|
|
87445427e3 | ||
|
|
b63e591c75 | ||
|
|
179b6aa59a | ||
|
|
4483c88629 |
101
.github/workflows/build-windows.yml
vendored
Normal file
101
.github/workflows/build-windows.yml
vendored
Normal file
@ -0,0 +1,101 @@
|
||||
name: Build Windows installer
|
||||
|
||||
# The agent's source lives in a private repository whose Actions are currently billing-blocked.
|
||||
# This repository is public, so its runner minutes are free — it checks the source out with a
|
||||
# read-only deploy key and attaches the resulting installer to a release here.
|
||||
#
|
||||
# The installer is UNSIGNED: no Windows code-signing certificate exists yet. Once one does, the
|
||||
# private repo's `release-agent.yml` is the proper home for this and this workflow should go.
|
||||
#
|
||||
# Note that this repository is public and so are these logs. Keep build output out of them if a
|
||||
# step would ever echo source.
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
tag:
|
||||
description: "Release tag to attach the installer to"
|
||||
required: true
|
||||
default: "v0.1.0"
|
||||
ref:
|
||||
description: "Branch or tag of the source repo to build"
|
||||
required: true
|
||||
default: "main"
|
||||
|
||||
permissions:
|
||||
contents: write # attaching the installer to this repo's release
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Check out agent source
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: BigMarc/TimeBunny
|
||||
ref: ${{ inputs.ref }}
|
||||
ssh-key: ${{ secrets.SOURCE_DEPLOY_KEY }}
|
||||
persist-credentials: false
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: ".nvmrc"
|
||||
cache: "pnpm"
|
||||
- uses: dtolnay/rust-toolchain@stable
|
||||
- uses: Swatinem/rust-cache@v2
|
||||
with:
|
||||
workspaces: apps/agent/src-tauri
|
||||
- run: pnpm install --frozen-lockfile
|
||||
|
||||
# tauri.conf.json now sets `createUpdaterArtifacts`, which makes TAURI_SIGNING_PRIVATE_KEY
|
||||
# mandatory — and that key deliberately does not live in this public repository. Turn the
|
||||
# updater bundle back off for this job: it ships installers via GitHub Releases, and the
|
||||
# signed updater manifest is release-agent.yml's job in the private repo.
|
||||
- name: Build NSIS installer
|
||||
working-directory: apps/agent
|
||||
env:
|
||||
TIMEBUNNY_API_URL: https://time.bunny.team
|
||||
TIMEBUNNY_CHANNEL: stable
|
||||
# `--config` takes a path as well as a literal, and a path is the only form that survives
|
||||
# this trip: pwsh and pnpm between them turned an inline `{\"bundle\":...}` into `{\`.
|
||||
run: |
|
||||
[System.IO.File]::WriteAllText("$PWD\no-updater.json", '{"bundle":{"createUpdaterArtifacts":false}}')
|
||||
pnpm tauri build --bundles nsis --config no-updater.json
|
||||
|
||||
# Same gate as the private repo's release workflow: an agent baked against localhost looks
|
||||
# perfectly healthy in CI and is simply never heard from once someone installs it.
|
||||
# Deliberately not findstr: it reads a leading `/` in a path as a switch prefix, so
|
||||
# `src-tauri/target/...` fails with "Cannot open" and exits 2 — which reads as "string not
|
||||
# found" and would let a localhost build sail through the check that exists to stop it.
|
||||
- name: Verify the baked server URL
|
||||
working-directory: apps/agent
|
||||
run: |
|
||||
$exe = Join-Path $PWD "src-tauri\target\release\timebunny-agent.exe"
|
||||
if (-not (Test-Path $exe)) { throw "No agent binary at $exe" }
|
||||
$text = [System.Text.Encoding]::ASCII.GetString([System.IO.File]::ReadAllBytes($exe))
|
||||
if ($text.Contains("http://localhost:3000")) {
|
||||
throw "Agent binary still carries the localhost fallback - TIMEBUNNY_API_URL was not set at build time"
|
||||
}
|
||||
if (-not $text.Contains("https://time.bunny.team")) {
|
||||
throw "Agent binary does not contain the production API URL"
|
||||
}
|
||||
Write-Host "ok: production URL baked, no localhost fallback"
|
||||
|
||||
- name: Checksum
|
||||
working-directory: apps/agent
|
||||
run: Get-ChildItem -Recurse -Filter *.exe src-tauri/target/release/bundle/nsis | Get-FileHash -Algorithm SHA256 | Format-List
|
||||
|
||||
- name: Attach installer to release
|
||||
working-directory: apps/agent
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
run: |
|
||||
$exe = Get-ChildItem -Recurse -Filter *.exe src-tauri/target/release/bundle/nsis | Select-Object -First 1
|
||||
if (-not $exe) { throw "No NSIS installer was produced" }
|
||||
gh release upload ${{ inputs.tag }} $exe.FullName --clobber --repo ${{ github.repository }}
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: windows-nsis-unsigned
|
||||
path: apps/agent/src-tauri/target/release/bundle/nsis/*.exe
|
||||
if-no-files-found: error
|
||||
21
index.html
21
index.html
@ -71,6 +71,13 @@
|
||||
.btn:hover { background: var(--brand-hover); }
|
||||
.btn.secondary { background: transparent; color: var(--brand); border: 1px solid var(--border); }
|
||||
.btn.secondary:hover { background: var(--bg-subtle); }
|
||||
.btn.unavailable {
|
||||
background: var(--bg-subtle); color: var(--muted); border: 1px dashed var(--border);
|
||||
cursor: default;
|
||||
}
|
||||
.btn.unavailable:hover { background: var(--bg-subtle); }
|
||||
.card.pending { opacity: 0.72; }
|
||||
.card.pending.recommended { opacity: 1; }
|
||||
@media (prefers-color-scheme: dark) { .btn.secondary { color: #ff8fa8; } }
|
||||
|
||||
.note {
|
||||
@ -218,11 +225,13 @@ Get-FileHash -Algorithm SHA256 $HOME\Downloads\TimeBunny_*-setup.exe</code></pre
|
||||
.then(function (rel) {
|
||||
byId("version").textContent = rel.tag_name;
|
||||
|
||||
var found = {};
|
||||
rel.assets.forEach(function (a) {
|
||||
var os = /\.dmg$/i.test(a.name) ? "macos"
|
||||
: /\.exe$/i.test(a.name) ? "windows"
|
||||
: null;
|
||||
if (!os) return;
|
||||
found[os] = true;
|
||||
|
||||
byId("dl-" + os).href = a.browser_download_url;
|
||||
var meta = byId("meta-" + os);
|
||||
@ -233,6 +242,18 @@ Get-FileHash -Algorithm SHA256 $HOME\Downloads\TimeBunny_*-setup.exe</code></pre
|
||||
byId("sha-" + os).textContent = "SHA-256 " + a.digest.slice(7);
|
||||
}
|
||||
});
|
||||
|
||||
// A release that carries no installer for a platform must not offer a button that quietly
|
||||
// lands the visitor on a release page with nothing for them. Reverts by itself as soon as
|
||||
// the asset is attached.
|
||||
["macos", "windows"].forEach(function (os) {
|
||||
if (found[os]) return;
|
||||
var btn = byId("dl-" + os);
|
||||
btn.textContent = "Not available yet";
|
||||
btn.removeAttribute("href");
|
||||
btn.classList.add("unavailable");
|
||||
byId("card-" + os).classList.add("pending");
|
||||
});
|
||||
})
|
||||
.catch(function () {
|
||||
byId("version").textContent = "latest";
|
||||
|
||||
10
stable/latest.json
Normal file
10
stable/latest.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"version": "0.2.1",
|
||||
"notes": "See https://github.com/BigMarc/timebunny-release/releases/tag/v0.2.1",
|
||||
"pub_date": "2026-10-07T18:09:01Z",
|
||||
"platforms": {
|
||||
"darwin-aarch64": { "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVTKzZFeGphbDV6UFFUMEExN2diN3dLMElMYVRXZ0JkZzVqRUp3MFdTekFEYTNJMmFGYmFpckpndENjZjNMbEhNaDBvMzhvU3ZHelJ0YURpQ2dBbkVFaDF5WHNuTTRXZFFzPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzkxMzk2MTUwCWZpbGU6VGltZUJ1bm55LmFwcC50YXIuZ3oKVWVoMzB5NkoxNmZGcUZSWDI3K3ZOYkF3V01Dd2tKdkZOWVZiS0o2ZWZtcGxZQkVMazcxTEVnNnFlNzJ3MjBrS1RoVVV2VVJxc3oyeTh0dUI2Z252RHc9PQo=", "url": "https://github.com/BigMarc/timebunny-release/releases/download/v0.2.1/TimeBunny.app.tar.gz" },
|
||||
"darwin-x86_64": { "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVTKzZFeGphbDV6UFFUMEExN2diN3dLMElMYVRXZ0JkZzVqRUp3MFdTekFEYTNJMmFGYmFpckpndENjZjNMbEhNaDBvMzhvU3ZHelJ0YURpQ2dBbkVFaDF5WHNuTTRXZFFzPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzkxMzk2MTUwCWZpbGU6VGltZUJ1bm55LmFwcC50YXIuZ3oKVWVoMzB5NkoxNmZGcUZSWDI3K3ZOYkF3V01Dd2tKdkZOWVZiS0o2ZWZtcGxZQkVMazcxTEVnNnFlNzJ3MjBrS1RoVVV2VVJxc3oyeTh0dUI2Z252RHc9PQo=", "url": "https://github.com/BigMarc/timebunny-release/releases/download/v0.2.1/TimeBunny.app.tar.gz" },
|
||||
"windows-x86_64": { "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVTKzZFeGphbDV6UGU2ZkZPZk1oKyt4KzBocHZhUmlWOVpZUzlNaERNemJFTzg3UkJhRFJ2RE4vSnY3cExVbE9zbTRBSS9QOU5MM3hDeTE0M1ZHVUJweHRZTzArQ09Lb3dZPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzkxMzk2MzYzCWZpbGU6VGltZUJ1bm55XzAuMi4xX3g2NC1zZXR1cC5leGUKLzFJZTd3Z0hER0FhU2p2QVFrNUhrMkdzeUt6S1B2TG1DMHZvdEdsKzVYRld6Y2VWK3IzZlJISWJoY3h4bndSVmw0L2ZOQmlOSjlQcStJUnhJWWp6Q2c9PQo=", "url": "https://github.com/BigMarc/timebunny-release/releases/download/v0.2.1/TimeBunny_0.2.1_x64-setup.exe" }
|
||||
}
|
||||
}
|
||||
10
stable/release.json
Normal file
10
stable/release.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"version": "0.2.1",
|
||||
"channel": "stable",
|
||||
"pub_date": "2026-10-07T18:09:01Z",
|
||||
"notes_url": "https://github.com/BigMarc/timebunny-release/releases/tag/v0.2.1",
|
||||
"installers": {
|
||||
"macos": { "url": "https://github.com/BigMarc/timebunny-release/releases/download/v0.2.1/TimeBunny_0.2.1_universal.dmg", "filename": "TimeBunny_0.2.1_universal.dmg", "sha256": "4c53ab3a3a13908c3a6776b58b15589dc013004ee361dbe1998ab4693aa86d46", "bytes": 8352510 },
|
||||
"windows": { "url": "https://github.com/BigMarc/timebunny-release/releases/download/v0.2.1/TimeBunny_0.2.1_x64-setup.exe", "filename": "TimeBunny_0.2.1_x64-setup.exe", "sha256": "4227837f649a38dc10688c604134ce14a05141180b62d12fff6e7af94a36355c", "bytes": 3262441 }
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user