Dokumentation
Builds und Veröffentlichungen
Zielspezifische Sidecars, signierte Updater-Assets und ein nach Plattforminstallationsprogrammen veröffentlichter Release-Index.
Automatisch aus dem Englischen übersetzt. Englisches Original ansehen
Vertriebsmodell
Der Desktop-Build bündelt ein Vite-Frontend, einen Bun-kompilierten Sidecar und generierte SQLite-Migrationen in einer Tauri-Anwendung. Das Repository definiert macOS Apple Silicon- und Intel-, Windows x64- und ARM64- sowie Linux x64- und ARM64-Builds. Die Release-Automatisierung ist in konfiguriert .github/workflows/release.yml; plattform-Build-Prüfungen laufen auch unabhängig voneinander ab build-platforms.yml.
Eine Workflow-Definition beschreibt den Veröffentlichungsprozess. Die Verfügbarkeit und Gültigkeit eines Installationsprogramms muss anhand seiner jeweiligen Ausführungs- und Release-Assets festgestellt werden. Der Quellcode allein ist kein Beweis für die Signaturberechtigung, die Beglaubigungsergebnisse oder die erfolgreiche Installation auf einem Zielcomputer.
Pipeline erstellen
scripts/build.ts führt sechs geordnete Phasen durch und bricht ab, wenn eine Phase fehlschlägt:
- Installieren: frozen-Lockfile-Installation, einschließlich optionaler Abhängigkeiten für alle Betriebssysteme und CPU-Architekturen.
- Überprüfen: typprüfung des Arbeitsbereichs. Unit-Tests sind ein separater CI-Befehl.
- Kompilieren: baue den Sidecar mit
scripts/compile-sidecar.tsfür das Rust-Ziel-Triple. - Ressourcen: bühne
packages/db/drizzleals gebündelte Migrationen. - Bündeln: erstellen Sie das Frontend und rufen Sie dann Tauri mit Ziel-, Bundle-, Signierungs- und Updater-Einstellungen auf.
- Artefakte: indexieren Sie Installer-Assets, schreiben Sie SHA-256-Prüfsummen und generieren Sie Versionshinweise aus dem Git-Verlauf.
bun scripts/build.ts --help
bun scripts/build.ts --dry-run
bun run build:sidecar
bun scripts/build.ts --only=resources
bun scripts/build.ts --no-updater --only und --skip künstlernamen akzeptieren; --target, --bundles, und --out-dir ausgänge auswählen. Das Standardziel ist der von gemeldete Host rustc -vV. In Sidecar-Binärdateien wird geschrieben apps/desktop/src-tauri/binaries/sidecar-<triple>, mit .exe unter Windows. Identische Binärdateien und Migrationsbäume bleiben unverändert, um unnötige Entwicklungsneustarts zu vermeiden.
Verwenden compile-sidecar.ts durch die Pipeline: Es wendet die eingebetteten Host-Bündelungsanpassungen an. Ein direkter generischer Kompilierungsbefehl stellt nicht dieselbe Erstellungsprozedur dar. Das Standardartefaktverzeichnis ist apps/desktop/src-tauri/target/release-artifacts.
Der resources schrittkopien packages/db/drizzle/ hinein apps/desktop/src-tauri/resources/migrations/ und kann problemlos wiederholt werden. Der artifacts schritt schreibt SHA256SUMS und RELEASE_NOTES.md, erstellt aus den Commits seit dem letzten Tag. Schrittaliase werden akzeptiert von --only und --skip: deps, checks/test, sidecar, migrations, und notes/checksums/release. Das Skript liest nie .env* speichert oder druckt geheime Werte.
CI und Veröffentlichung
| Arbeitsablauf | Konfigurierte Verantwortlichkeiten |
|---|---|
ci.yml | Eingefrorene Installation, Workspace-Typprüfung/-Tests, Sidecar-/Ressourcen-Staging, Rust-Clippy/-Tests und begleitende JavaScript-Prüfungen. |
build-platforms.yml | Manuell bzw build/** branch-Builds für sechs Zielarchitekturen. Verwendung von Bundles --no-updater und indizierte Artefakte hochladen, ohne eine Veröffentlichung zu veröffentlichen. |
release.yml | Versions-Tag-Validierung, signierte Plattform-Builds, Manifeste pro Plattform, Zusammenführung von Manifesten für sechs Plattformen, Veröffentlichung des Installationsprogramms und endgültige Indexveröffentlichung. |
ios.yml | Unsignierter Simulator-Build und Pairing-Roundtrip; Keine App Store- oder TestFlight-Veröffentlichung. |
Der Freigabeworkflow läuft für v* tags oder ein manuell ausgewähltes vorhandenes Versions-Tag im Nicht-Fork-Repository. release-ref.ts prüft das Tag und die Anwendungsversion und löst den Commit auf. Jeder Build erstellt eine Plattformversion, beispielsweise ein Versions-Tag mit dem Suffix macos-arm64 oder linux-x64. Erst nachdem alle Plattformversionen veröffentlicht wurden, veröffentlicht der Versionsindex die zusammengeführten Versionen latest.json.
stage-release.ts prüft die ausgewählten Artefakte, Prüfsummen-/Signaturbeziehungen und Manifest-Links vor der Veröffentlichung. Bereits veröffentlichte Veröffentlichungen werden nicht überschrieben. Die Indexversion kann für stabile Versionen die neueste sein; Vorabversionen bleiben als Vorabversionen gekennzeichnet.
Updater-Builds erfordern die Konfiguration des privaten Signaturschlüssels und des Kennworts von Tauri, die dem öffentlichen Schlüssel entspricht tauri.conf.json. für die Signierung/Beglaubigung von macOS-Versionen werden Apple-Zertifikate und Kontoeinstellungen verwendet. Windows importiert ein Signaturzertifikat und übergibt seinen Fingerabdruck an den Bundler. Fehlende erforderliche Release-Signatureingaben schlagen beim Release-Build fehl. Konfigurieren Sie diese über den CI Secret Store.
Ein separater Release-Job veröffentlicht das Nikcli-Plugin-Paket, wenn ein NPM-Token verfügbar ist. Es überspringt eine bereits veröffentlichte Version und kann den konfigurierten Fallback-Paketnamen verwenden, wenn der primäre Bereich nicht veröffentlicht werden kann. Dieser Paketauftrag stellt nicht die Verfügbarkeit des Desktop-Installationsprogramms her.
Updater-Verhalten
Der konfigurierte Updater-Endpunkt ist der neueste GitHub-Release-Download des Repositorys unter latest.json. Der Rust-Updater prüft beim Start und alle vier Stunden, wobei manuelle Prüfungen über seinen Dienst in die Warteschlange gestellt werden. Jede Anfrage verwendet ein 30-Sekunden-Timeout. Das Manifest identifiziert plattformspezifische Assets und Signaturen; Der öffentliche Schlüssel ist Teil der Anwendungskonfiguration.
update://status enthält die Status „Prüfung“, „Aktuell“, „Verfügbar“, „Herunterladen“, „Bereit“ und „Fehler“. Versionshinweise enthalten [critical] markieren Sie das verfügbare Update als nicht verwerfbar. Auch der Status „Bereit zum Neustart“ kann nicht abgewiesen werden. Dies wirkt sich auf die Eingabeaufforderung aus. Die Installation berücksichtigt weiterhin den Schutz für nicht gespeicherte Arbeiten.
install_update zeichnet die angekündigte Version auf, überprüft sie erneut und lädt dann ein signaturverifiziertes Paket herunter. Der Editor speichert vor dem Download und noch einmal davor apply_update, um die während des Downloads vorgenommenen Änderungen zu schützen. Nicht gespeicherte Arbeit blockiert beide Vorgänge; Bei fehlgeschlagenen Speicherungen werden überprüfte Bytes für einen erneuten Versuch beibehalten. Der native Status wird nach dem Abonnieren wiederhergestellt und Überprüfungen können den aktiven Fortschritt oder einen ausstehenden Neustart nicht ersetzen. Windows entleert den Sidecar, bevor sein Installationsprogramm die Kontrolle übernimmt; Andere Plattformen bieten einen Neustart nach der Installation an.
Halten Sie die Entriegelungsschlüssel stabil
Die Anwendung überprüft Update-Signaturen mithilfe ihres eingebetteten öffentlichen Schlüssels. Eine mit einem anderen privaten Schlüssel signierte Veröffentlichung ist nicht austauschbar. Überprüfen Sie das erstellte Installations- und Updater-Asset auf der Zielplattform, bevor Sie eine Version für Benutzer als bereit erklären.
Datenbankkompatibilität
Gepackte Anwendungen werden geöffnet cadcamfun.db in ihrem Anwendungsdatenverzeichnis. Ausstehende Migrationen werden von der Datenbankschicht beim Start mithilfe der im Bundle enthaltenen Migrationen angewendet. Schema-Upgrades und Binäraktualisierungen hängen daher zusammen, obwohl es sich um separate Artefakte handelt.
Generierte Versionshinweise vergleichen verfolgte Migrationsbäume mit dem vorherigen Release-Tag. Ein geänderter Baum wird als unsicher für ein Downgrade gemeldet; ein unveränderter Baum wird als migrationskompatibel gemeldet; Der nicht verfügbare Verlauf wird als unbekannt gemeldet. Dieser automatisierte Vergleich validiert nicht jedes mögliche Kompatibilitätsproblem auf Anwendungsebene.
Bevor Sie eine Binärdatei durch eine ältere Version ersetzen, bewahren Sie die aktuellen Daten auf und prüfen Sie die Kompatibilitätshinweise der Version. Der Vorwärtsmigrationscode impliziert keine Rückwärtsmigrationen. Befolgen Sie die Verfahren zur Datenbanksicherung und -wiederherstellung für das tatsächliche Datenverzeichnis.
Freigabeverifizierung
bun test scripts
bun scripts/build.ts --only=artifacts --dry-run Hilfstests validieren die Zielzuordnung, Signaturanforderungen, Artefaktbenennung, Manifestverarbeitung und Staging-Regeln. Ein Probelauf druckt geplante Vorgänge ohne Kompilierung oder Signierung. Kein Ersatz für ein tatsächliches natives Bundle, einen Updater-Download-/Installationstest oder die Akzeptanz des Begleiters auf einem physischen Gerät.
Behalten Sie für eine betriebsbereite Version das genaue Tag/Commit, das Workflow-Ergebnis, das zielspezifische Installationsprogramm und Update-Asset, die Prüfsumme/Signaturdateien und das veröffentlichte Manifest bei. Überprüfen Sie, ob die installierte App ihren gebündelten Sidecar und ihre Migrationen startet und dass der Updater das gewünschte Plattform-Asset auswählt.
Ziel- und Vermögensreferenz
| Plattform | Rustziel | Manifestschlüssel | Updater-Asset |
|---|---|---|---|
| macOS Apple Silicon | aarch64-apple-darwin | darwin-aarch64 | .app.tar.gz |
| macOS Intel | x86_64-apple-darwin | darwin-x86_64 | .app.tar.gz |
| Windows ARM64 | aarch64-pc-windows-msvc | windows-aarch64, windows-aarch64-msi | .exe, .msi |
| Windows x64 | x86_64-pc-windows-msvc | windows-x86_64, windows-x86_64-msi | .exe, .msi |
| Linux ARM64 | aarch64-unknown-linux-gnu | linux-aarch64-deb, linux-aarch64-rpm | .deb, .rpm |
| Linux x64 | x86_64-unknown-linux-gnu | linux-x86_64-deb, linux-x86_64-rpm | .deb, .rpm |
Der Generator benötigt genau ein Asset pro Format oben, das angrenzende .sig datei und Versionshinweise. Asset-Namen verwenden a <triple>-- präfix; Doppelte Namen und verwaiste Unterschriften werden abgelehnt. Der Tauri-Updater 2.13.1 wählt den installierten Pakettyp automatisch aus; Linux verwendet signierte Debian/RPM-Pakete ohne AppImage.
Zusammengeführte Manifeste müssen hinsichtlich Version, Veröffentlichungsdatum und Anmerkungen übereinstimmen. Für die Veröffentlichung sind alle zehn oben genannten Schlüssel erforderlich. Windows-Basisschlüssel behalten die NSIS-Kompatibilität für ältere Clients bei; MSI-Schlüssel bewahren MSI-Installationen. URLs müssen HTTPS ohne Anmeldeinformationen, eine Abfrage oder ein Fragment verwenden. Beim Staging werden alle Zielpräfixe, Paketsuffixe, Signaturen und Release-URLs überprüft.
Lokale Build-Optionen und Signierungseingaben
bun --no-env-file scripts/build.ts --only=compile,resources --target=aarch64-apple-darwin --dry-run
bun --no-env-file scripts/build.ts --skip=install,check --target=x86_64-unknown-linux-gnu --bundles=deb,rpm --no-updater --dry-run Entfernen --dry-run nur wenn die ausgewählte Ziel-Toolchain und die nativen Voraussetzungen installiert sind. Durch die übergreifende Kompilierung der ausführbaren Bun-Datei wird kein plattformübergreifender Tauri-Linker und -Bundler bereitgestellt. --only und --skip schließen sich gegenseitig aus; --skip-install ist ein Bequemlichkeitsalias. --no-updater lässt die Erstellung von Updater-Archiven/Signaturen und dessen Signatur-Gate aus.
| Eingang | Verwendet für |
|---|---|
TAURI_SIGNING_PRIVATE_KEY, TAURI_SIGNING_PRIVATE_KEY_PASSWORD | Updater-Signaturen. Von der Umgebung bereitgestellte Schlüssel haben Vorrang vor der lokalen Signaturkonfiguration. |
Lokal ignoriert tauri-signing.json | Lokaler Updater-Schlüssel-Fallback, wenn kein Umgebungsschlüssel bereitgestellt wird. Der deklarierte öffentliche Schlüssel muss mit dem konfigurierten öffentlichen Schlüssel des Updaters übereinstimmen. |
CADCAM_RELEASE=1 | Ermöglicht Plattform-Release-Signaturanforderungen in der Build-Validierung. |
APPLE_CERTIFICATE, APPLE_CERTIFICATE_PASSWORD, APPLE_ID, APPLE_PASSWORD, APPLE_TEAM_ID | macOS-Freigabezertifikat und Beglaubigungskonfiguration. |
WINDOWS_CERTIFICATE, WINDOWS_CERTIFICATE_PASSWORD, importierter Zertifikatfingerabdruck | Signieren von Windows-Releases; CI importiert das Zertifikat und entfernt es später. |
Der Build lädt lokale Updater-Anmeldeinformationen nur für den Bündelungsschritt und übergibt Signaturwerte über die Umgebung an diesen untergeordneten Prozess. Drucken Sie keine lokalen Signaturdateien aus und platzieren Sie kein echtes Schlüsselmaterial in einem Dokumentationsbeispiel. Ein privater Schlüssel, der nicht mit dem öffentlichen Schlüssel einer installierten App übereinstimmt, kann kein akzeptiertes Update für diese App erzeugen.
Diagnose von Freigabefehlern
| Versagen | Interpretation und nächste Kontrolle |
|---|---|
| Tag-/Anwendungsversion stimmt nicht überein | Die Auserwählten v-prefixed-Tag stimmt nicht mit der Version in der Tauri-Konfiguration überein. Die Release-Validierung stoppt, bevor die Plattform erstellt wird. |
| Nicht unterstütztes Ziel | Verwenden Sie eine unterstützte Architektur-/Plattformzuordnung und ein installiertes Rust-Ziel. Die Manifestveröffentlichung unterstützt die sechs oben genannten Schlüssel. |
| Fehlender Updater-Signaturschlüssel | Geben Sie die Signierungseingabe über den Geheimspeicher/die lokale Konfiguration ein oder wählen Sie eine Absicht aus --no-updater entwicklungsaufbau. |
| Keine oder mehrere Updater-Assets | Überprüfen Sie das indizierte Zielverzeichnis. Veraltete oder nicht übereinstimmende Archive machen die Auswahl mehrdeutig. |
| Manifeste Metadaten stimmen nicht überein | Alle Plattformjobs müssen die gleiche aufgelöste Version, das gleiche Datum, die gleichen Notizen und das gleiche Commit verwenden. |
| Veröffentlichung bereits veröffentlicht | Der Workflow weigert sich, ihn zu ändern. Eine erneute Ausführung ist kein Überschreibmechanismus. |
| Die Updater-Überprüfung schlägt für die installierte App fehl | Überprüfen Sie die Erreichbarkeit des Endpunkts, den Manifest-Zielschlüssel, die Download-URL, die Asset-Signatur und den eingebetteten öffentlichen Schlüssel. |
| Die Installation wurde wegen nicht gespeicherter Arbeit abgelehnt | Speichern oder verwerfen Sie die aktive Arbeit über den Editor und versuchen Sie dann die ausstehende Aktualisierung erneut. |
Ein nützlicher Release-Bericht zeichnet auf, welche Phase fehlgeschlagen ist und welches Ziel erstellt wurde. Schließen Sie nicht geheime Artefaktnamen, Validierungsfehler und Workflow-IDs ein. Halten Sie während einer Updater-Übung die zuvor installierte Version und eine überprüfte Datensicherung bereit. Die Migrationskompatibilität wird getrennt von der Signaturgültigkeit geprüft.
Umsetzungsanker: scripts/release-helpers.ts, signing-config.ts, updater-manifest.ts, stage-release.ts, und apps/desktop/src-tauri/src/updater.rs.
Die sechs Bauschritte
| # | Schritt | Aliase | Was es bewirkt |
|---|---|---|---|
| 1 | install | deps | bun install --frozen-lockfile |
| 2 | check | prüft, testet, testet | bun run typecheck |
| 3 | compile | Sidecar | Kompilieren apps/sidecar/src/main.ts bis src-tauri/binaries/sidecar-<triple> |
| 4 | resources | ressource, Migrationen | Kopieren packages/db/drizzle/ bis src-tauri/resources/migrations/ |
| 5 | bundle | bündelung | Desktop-App vite build, dann bunx tauri build |
| 6 | artifacts | artefakte, Notizen, Prüfsummen, Freigabe | SHA256SUMS und RELEASE_NOTES.md aus Commits seit dem letzten Tag |
Schritte werden immer in dieser Reihenfolge ausgeführt und ein fehlgeschlagener Schritt stoppt die Ausführung. Das Skript liest nie .env dateien und gibt niemals geheime Werte aus.
| Option | Effect |
|---|---|
--only=a,b / --skip=a,b | Schritte ausführen oder überspringen (Namen oder Aliase) |
--skip-install | Das Gleiche wie --skip=install |
--target=<triple> | Rustziel; Standard ist das Host-Triple von rustc -vV |
--bundles=<list> | Weitergeleitet an tauri build --bundles |
--no-updater | Installationsprogramme ohne Updater-Archive und Signaturen |
--out-dir=<path> | Wohin schreibt Schritt 6; Standard apps/desktop/src-tauri/target/release-artifacts |
--dry-run | Drucken Sie den Plan aus. schreibe und ändere nichts |
bun scripts/build.ts --dry-run # whole plan, no side effects
bun scripts/build.ts --only=resources # restage migrations (idempotent)
bun scripts/build.ts --only=compile,resources # rebuild the sidecar and migrations
bun scripts/build.ts --only=notes --dry-run # preview release notes
bun scripts/build.ts --target=aarch64-apple-darwin Die lokale Updater-Signierung verwendet eine ignorierte Option tauri-signing.json wenn in der Umgebung kein Signaturschlüssel festgelegt ist. Plattformzertifikate sind weiterhin erforderlich, wenn CADCAM_RELEASE=1.
Release-Matrix
| Ziel | Läufer | Bündel | Schnecke loslassen |
|---|---|---|---|
aarch64-apple-darwin | macos-14 | app, dmg | macos-arm64 |
x86_64-apple-darwin | macos-14 | app, dmg | macos-x64 |
x86_64-pc-windows-msvc | windows-neueste | msi, nsis | windows-x64 |
aarch64-pc-windows-msvc | windows-11-Arm | msi, nsis | fensterarm64 |
x86_64-unknown-linux-gnu | ubuntu-22.04 | deb, rpm | linux-x64 |
aarch64-unknown-linux-gnu | ubuntu-22.04-arm | deb, rpm | linux-Arm64 |
- Ein vertrauenswürdiger Job validiert das Release-Tag anhand der Anwendungsversion.
- Jeder Matrixjob wird ausgeführt
bun --no-env-file scripts/build.ts --target=… --bundles=… --out-dir=release, signiert und erstellt ein Manifest für seine Paketformate. Windows importiert und entfernt anschließend sein optionales Signaturzertifikat. - Ein Zusammenführungsauftrag validiert alle sechs Architekturmanifeste und ihre zehn Paketeinträge in einem
latest.json. - Ein Abschlussjob überprüft alle Artefakte, Signaturen, Prüfsummen und Notizen des Installationsprogramms, bevor die Einzelversionsversion erstellt oder fortgesetzt und veröffentlicht wird.
CI führt bei jedem Push zwei Jobs aus: Installation, Typprüfung und Test (und stellt die Sidecar-Binärdatei und Migrationen bereit) und einen Rust-Job mit Clippy und dem src-tauri tests.