🏗️ Build and Test JellyTau / Run Tests (pull_request) Successful in 18m41s
🏗️ Build and Test JellyTau / Supply Chain (pull_request) Successful in 31s
Traceability Validation / Check Requirement Traces (pull_request) Successful in 9s
🏗️ Build and Test JellyTau / Android Compile Check (pull_request) Successful in 4m5s
Preparing v0.10.0 meant building the release locally first. It did not build. Two separate defects were sitting on master, both invisible to every gate this project has, for the same reason: nothing in build-and-test.yml runs `tauri build`. Only a tag does. So the first time anyone would have discovered either was a failed release. **Tauri plugin versions had drifted apart.** Tauri refuses to build when a plugin's Rust crate and npm package are on different minor versions: tauri-plugin-log (v2.8.0) : @tauri-apps/plugin-log (v2.9.0) tauri-plugin-updater (v2.9.0) : @tauri-apps/plugin-updater (v2.10.1) Introduced by the updater and diagnostics work in this same branch -- `cargo add` took what the pinned toolchain allowed while `bun add` took latest, and the caret ranges let them separate. cargo check, clippy, cargo test and svelte-check all passed. Matching upward pulled wry 0.53.5 -> 0.54.2 along with wasm-bindgen, web-sys and webkit2gtk: the webview layer, which on Linux is the video playback path. That is not a change to make while cutting a release, so the npm packages are pinned down to the crates instead -- exactly, not by caret, since the caret is what allowed the drift. The upgrade is worth doing deliberately, with a playback check, and ci-operations.md says so. CI now runs `tauri info`, which performs the same comparison without building. Verified by reintroducing the mismatch and watching it fail. **The AppImage target had never been built.** It was added earlier in this branch because the release notes had advertised an AppImage for months while tauri.conf.json never produced one. It does not work out of the box: linuxdeploy carries its own `strip`, too old to parse the .relr.dyn section modern toolchains emit, and it fails on every bundled library -- strip: libzstd.so.1: unknown type [0x13] section `.relr.dyn' failed to bundle project `failed to run linuxdeploy` Ubuntu 23.10+ links with -z pack-relative-relocs by default, so the CI builder image fails exactly as a modern Arch host does. NO_STRIP=true is linuxdeploy's documented escape hatch. The resulting 153 MB AppImage was verified to be well-formed and to actually start. Without this the release would have failed at the Linux build step -- the artifact check added earlier refuses to publish when no AppImage is produced, which is the behaviour we want, but it would have refused a tagged build rather than a local one. Also: the traceability extractor now reads the tooling shell scripts that carry TRACES comments. DR-207, DR-213 and DR-220 all had them and were counted as uncovered because only .ts/.svelte/.rs were scanned. Listed individually rather than globbing scripts/*.sh -- most implement nothing, and adding one should be a decision. DR-221.
102 lines
4.6 KiB
Bash
Executable File
102 lines
4.6 KiB
Bash
Executable File
#!/bin/bash
|
|
# Cross-compile JellyTau for Windows from Linux, producing an NSIS installer.
|
|
#
|
|
# Uses the OFFICIAL Tauri cross-compile path (https://v2.tauri.app/distribute/
|
|
# windows-installer/): the MSVC target driven by cargo-xwin, which downloads the
|
|
# MSVC CRT/Windows SDK headers and links with lld. This is the target Tauri
|
|
# officially supports for Windows (the mingw/GNU target is not), and unlike GNU
|
|
# it can bundle the NSIS installer from a Linux host.
|
|
#
|
|
# Playback on Windows: video renders via WebView2 and audio via the webview
|
|
# <audio> backend (WebviewAudioBackend) — see docs/build/build-windows.md.
|
|
#
|
|
# Requirements (present in the Docker windows-cross target / unified builder):
|
|
# - rustup target x86_64-pc-windows-msvc
|
|
# - cargo-xwin (cargo install --locked cargo-xwin)
|
|
# - lld, llvm (linker + llvm-lib used by cargo-xwin)
|
|
# - nsis (makensis) (installer generator)
|
|
#
|
|
# Usage:
|
|
# scripts/build-windows-cross.sh # exe + NSIS installer
|
|
# WIN_BUNDLES=none scripts/build-windows-cross.sh # exe only, skip bundling
|
|
# OUTPUT_DIR=/app/dist scripts/build-windows-cross.sh
|
|
set -euo pipefail
|
|
|
|
cd "$(dirname "$0")/.."
|
|
|
|
TARGET="x86_64-pc-windows-msvc"
|
|
WIN_BUNDLES="${WIN_BUNDLES:-nsis}"
|
|
|
|
echo "🪟 Cross-compiling JellyTau for Windows ($TARGET, via cargo-xwin)"
|
|
echo "================================================================"
|
|
echo "Video plays via WebView2; audio via the webview <audio> backend."
|
|
echo "Bundles: $WIN_BUNDLES"
|
|
echo ""
|
|
|
|
bun install --frozen-lockfile 2>/dev/null || bun install
|
|
bun run build
|
|
|
|
# --runner cargo-xwin + the MSVC target is what makes the Tauri CLI treat this as
|
|
# a real Windows build and enable the nsis/msi bundlers on a Linux host.
|
|
#
|
|
# IMPORTANT: do NOT pass `--bundles nsis` here. tauri-cli 2.9.x validates the
|
|
# `--bundles` flag against a static clap enum gated by the HOST OS (Linux allows
|
|
# only deb/rpm/appimage) *before* it considers --target/--runner, so `--bundles
|
|
# nsis` is rejected at arg-parse time. Instead the Windows bundle targets come
|
|
# from tauri.conf.json (bundle.targets includes "nsis"), which is not subject to
|
|
# that CLI validation — the bundler then picks nsis once it knows the target is
|
|
# Windows.
|
|
# TRACES: | DR-221
|
|
#
|
|
# 🔴 Clear the bundle output before building.
|
|
#
|
|
# The bundle directory is not versioned and is never cleaned by cargo, and the
|
|
# CI runner reuses src-tauri/target between builds. The copy step below globs
|
|
# `bundle/**/*-setup.exe`, so every stale installer left there was picked up and
|
|
# attached to the release: v0.8.2 shipped sixteen Windows installers, thirteen
|
|
# of them from earlier versions, and v0.5.0 offered users a download list going
|
|
# back to 0.1.0. Every release from v0.1.0 to v0.8.2 did this. It stopped only
|
|
# because an unrelated change wiped the runner's target dir, so it is dormant
|
|
# rather than fixed.
|
|
#
|
|
# Filtering the copy by version would hide it; removing the directory means a
|
|
# stale file cannot exist to be copied. scripts/check-release-artifacts.sh is
|
|
# the backstop if some other path reintroduces one.
|
|
BUNDLE_DIR="src-tauri/target/$TARGET/release/bundle"
|
|
if [[ -d "$BUNDLE_DIR" ]]; then
|
|
echo "🧹 Clearing previous bundle output at $BUNDLE_DIR"
|
|
rm -rf "$BUNDLE_DIR"
|
|
fi
|
|
|
|
if [[ "$WIN_BUNDLES" == "none" ]]; then
|
|
bun run tauri build --runner cargo-xwin --target "$TARGET" --no-bundle
|
|
else
|
|
bun run tauri build --runner cargo-xwin --target "$TARGET"
|
|
fi
|
|
|
|
BIN_DIR="src-tauri/target/$TARGET/release"
|
|
echo ""
|
|
echo "✅ Built Windows artifacts:"
|
|
find "$BIN_DIR" -maxdepth 1 -name '*.exe' -print
|
|
find "$BIN_DIR/bundle" -type f \( -name '*.exe' -o -name '*.msi' \) -print 2>/dev/null || true
|
|
|
|
if [[ -n "${OUTPUT_DIR:-}" ]]; then
|
|
mkdir -p "$OUTPUT_DIR"
|
|
find "$BIN_DIR" -maxdepth 1 -name 'jellytau.exe' -exec cp -v {} "$OUTPUT_DIR/" \;
|
|
# NSIS setup installers land in bundle/nsis/*-setup.exe; MSI in bundle/msi/*.msi.
|
|
#
|
|
# The .sig files come along too: when TAURI_SIGNING_PRIVATE_KEY is set the
|
|
# bundler writes `<installer>.sig` beside each installer, and that signature is
|
|
# what the updater verifies before installing anything. Leaving it behind
|
|
# produces a release whose manifest references a signature that was never
|
|
# published, which fails only on the user's machine.
|
|
find "$BIN_DIR/bundle" -type f \( -name '*-setup.exe' -o -name '*.msi' -o -name '*.sig' \) \
|
|
-exec cp -v {} "$OUTPUT_DIR/" \; 2>/dev/null || true
|
|
echo ""
|
|
echo "📦 Copied Windows artifacts to $OUTPUT_DIR"
|
|
fi
|
|
|
|
# Containerised builds run as root against a bind-mounted tree; hand the
|
|
# artifacts back to the host user. No-op when not root. See DR-213.
|
|
"$(dirname "$0")/restore-ownership.sh"
|