rust: packaging (Linux desktop entry, macOS bundle), cargo release script with update manifests, CI
This commit is contained in:
Executable
+109
@@ -0,0 +1,109 @@
|
||||
#!/usr/bin/env bash
|
||||
# release.sh — build and package Nexus Terminal release artefacts with cargo.
|
||||
#
|
||||
# Produces, under build/releases/<version>/ (repo root):
|
||||
# NexusTerminal-<os>-<arch>[.exe|.app] and NexusTerminal-<os>-<arch>.zip
|
||||
# and next to them manifest-<os>-<arch>.json + version-<os>-<arch>.txt for the update server
|
||||
# (updates/index.php), in the same format the Wails build produced.
|
||||
#
|
||||
# Targets default to this machine's native one; set NEXUS_RELEASE_TARGETS to a comma list such as
|
||||
# "linux/amd64,windows/amd64" (windows/* from Linux needs the mingw-w64 toolchain and rustup target).
|
||||
# CI (.github/workflows/release-builds.yml) builds every platform natively.
|
||||
set -euo pipefail
|
||||
|
||||
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
ROOT="$(cd "$HERE/.." && pwd)"
|
||||
cd "$HERE"
|
||||
|
||||
DEFAULT_UPDATE_URL="https://alchementary.co.uk/download/link/manifest-{platform}-{arch}.json"
|
||||
DEFAULT_RELEASE_BASE_URL="https://alchementary.co.uk/download/link"
|
||||
|
||||
log() { echo -e "\033[0;32m[nexus]\033[0m $1"; }
|
||||
warn() { echo -e "\033[1;33m[nexus]\033[0m $1"; }
|
||||
|
||||
host_target() {
|
||||
local os arch
|
||||
case "$(uname -s)" in Darwin) os=darwin ;; Linux) os=linux ;; MINGW*|MSYS*|CYGWIN*) os=windows ;; *) os=unknown ;; esac
|
||||
case "$(uname -m)" in x86_64|amd64) arch=amd64 ;; arm64|aarch64) arch=arm64 ;; *) arch=unknown ;; esac
|
||||
echo "$os/$arch"
|
||||
}
|
||||
|
||||
rust_triple() {
|
||||
case "$1" in
|
||||
linux/amd64) echo x86_64-unknown-linux-gnu ;;
|
||||
linux/arm64) echo aarch64-unknown-linux-gnu ;;
|
||||
darwin/amd64) echo x86_64-apple-darwin ;;
|
||||
darwin/arm64) echo aarch64-apple-darwin ;;
|
||||
windows/amd64) if [ "$(uname -s)" = Linux ]; then echo x86_64-pc-windows-gnu; else echo x86_64-pc-windows-msvc; fi ;;
|
||||
windows/arm64) echo aarch64-pc-windows-msvc ;;
|
||||
*) return 1 ;;
|
||||
esac
|
||||
}
|
||||
|
||||
VERSION="${NEXUS_VERSION:-$(git describe --tags --abbrev=0 2>/dev/null || echo dev)-$(git rev-parse --short HEAD 2>/dev/null || echo unknown)}"
|
||||
export NEXUS_VERSION="$VERSION"
|
||||
export NEXUS_UPDATE_URL="${NEXUS_UPDATE_URL:-$DEFAULT_UPDATE_URL}"
|
||||
BASE_URL="${NEXUS_RELEASE_BASE_URL:-$DEFAULT_RELEASE_BASE_URL}"
|
||||
RELEASE_ROOT="${NEXUS_RELEASE_ROOT:-$ROOT/build/releases}"
|
||||
OUT="$RELEASE_ROOT/$VERSION"
|
||||
mkdir -p "$OUT"
|
||||
: > "$OUT/.release-files"
|
||||
|
||||
IFS=',' read -r -a TARGETS <<< "${NEXUS_RELEASE_TARGETS:-$(host_target)}"
|
||||
errors=0
|
||||
for target in "${TARGETS[@]}"; do
|
||||
os="${target%%/*}"; arch="${target##*/}"
|
||||
triple="$(rust_triple "$target")" || { warn "unknown target $target"; errors=$((errors+1)); continue; }
|
||||
base="NexusTerminal-${os}-${arch}"
|
||||
log "Building $target ($triple), version $VERSION"
|
||||
rustup target add "$triple" >/dev/null 2>&1 || true
|
||||
if ! cargo build --release --locked -p nexus --target "$triple"; then
|
||||
warn "build failed for $target"; errors=$((errors+1)); continue
|
||||
fi
|
||||
bin="target/$triple/release/nexus-terminal"
|
||||
case "$os" in
|
||||
darwin)
|
||||
NEXUS_BIN="$bin" packaging/macos/build-app.sh
|
||||
rm -rf "$OUT/$base.app"
|
||||
cp -R target/macos/NexusTerminal.app "$OUT/$base.app"
|
||||
(cd "$OUT" && rm -f "$base.zip" && zip -qry "$base.zip" "$base.app")
|
||||
;;
|
||||
windows)
|
||||
cp "$bin.exe" "$OUT/$base.exe"
|
||||
(cd "$OUT" && rm -f "$base.zip" && zip -qj "$base.zip" "$base.exe")
|
||||
;;
|
||||
*)
|
||||
cp "$bin" "$OUT/$base"
|
||||
strip "$OUT/$base" 2>/dev/null || true
|
||||
stage="$(mktemp -d)"
|
||||
cp "$OUT/$base" "$stage/nexus-terminal"
|
||||
cp packaging/linux/nexus-terminal.desktop packaging/linux/install.sh "$stage/"
|
||||
mkdir -p "$stage/app/assets/icon" && cp app/assets/icon/icon-256.png app/assets/icon/icon-512.png "$stage/app/assets/icon/"
|
||||
sed -i 's|\$HERE/../../app|$HERE/app|; s|\$HERE/../../target/release/nexus-terminal|$HERE/nexus-terminal|' "$stage/install.sh"
|
||||
(cd "$stage" && rm -f "$OUT/$base.zip" && zip -qr "$OUT/$base.zip" .)
|
||||
rm -rf "$stage"
|
||||
;;
|
||||
esac
|
||||
echo "$os|$arch|$base.zip" >> "$OUT/.release-files"
|
||||
done
|
||||
|
||||
published_at="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
|
||||
while IFS='|' read -r os arch filename; do
|
||||
[ -z "$os" ] && continue
|
||||
sha="$(shasum -a 256 "$OUT/$filename" 2>/dev/null || sha256sum "$OUT/$filename")"; sha="${sha%% *}"
|
||||
size="$(wc -c < "$OUT/$filename" | tr -d ' ')"
|
||||
echo "$VERSION" > "$RELEASE_ROOT/version-${os}-${arch}.txt"
|
||||
cat > "$RELEASE_ROOT/manifest-${os}-${arch}.json" <<JSON
|
||||
{
|
||||
"latestVersion": "${VERSION}",
|
||||
"publishedAt": "${published_at}",
|
||||
"releaseURL": "${BASE_URL}/",
|
||||
"files": [
|
||||
{"platform":"${os}","arch":"${arch}","filename":"${filename}","url":"${BASE_URL}/${filename}","sha256":"${sha}","size":${size}}
|
||||
]
|
||||
}
|
||||
JSON
|
||||
done < "$OUT/.release-files"
|
||||
rm -f "$OUT/.release-files"
|
||||
log "Artefacts in $OUT"
|
||||
exit $errors
|
||||
Reference in New Issue
Block a user