mirror of
https://github.com/nexu-io/open-design.git
synced 2026-06-01 03:14:35 +07:00
Adds a new `--to zip` (and `--to all`) tools-pack Windows build target that produces a portable `.zip` from the cached `win-unpacked` tree using the bundled 7z. The zip lays files at the archive root so users can extract it anywhere and launch `Open Design.exe` without going through the NSIS installer, addressing the no-install download request. Release plumbing is updated to publish the portable zip and its sha256 beside the existing installer on R2 for beta, preview, and stable channels (default on, gated by `WINDOWS_INCLUDE_ZIP`/`WIN_INCLUDE_ZIP`). The electron-updater `latest.yml` feed continues to point only at the installer; the zip is a manual-download convenience and is intentionally excluded from the in-app updater. Closes #1121 Generated-By: looper 0.0.0-dev (runner=worker, agent=claude-code) Co-authored-by: libertecode <libertecode@proton.me>
164 lines
5.9 KiB
Bash
164 lines
5.9 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
for name in ENABLE_LINUX ENABLE_MAC ENABLE_MAC_INTEL ENABLE_WIN R2_METADATA_URL RELEASE_CHANNEL RELEASE_VERSION RUNNER_TEMP; do
|
|
if [ -z "${!name:-}" ]; then
|
|
echo "$name is required" >&2
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
mac_artifact_mode="${MAC_ARTIFACT_MODE:-dmg-and-zip}"
|
|
report_zip_url="${R2_REPORT_ZIP_URL:-}"
|
|
case "$mac_artifact_mode" in
|
|
dmg-only | dmg-and-zip) ;;
|
|
*)
|
|
echo "unsupported MAC_ARTIFACT_MODE: $mac_artifact_mode" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
downloaded_report_zip="$RUNNER_TEMP/report.zip"
|
|
if [ -n "$report_zip_url" ]; then
|
|
if ! command -v unzip >/dev/null 2>&1; then
|
|
echo "unzip is required to verify R2_REPORT_ZIP_URL" >&2
|
|
exit 1
|
|
fi
|
|
curl -fsSL "$report_zip_url?run=${GITHUB_RUN_ID:-local}" -o "$downloaded_report_zip"
|
|
unzip -t "$downloaded_report_zip" >/dev/null
|
|
fi
|
|
|
|
require_report_file() {
|
|
local path="$1"
|
|
if [ -n "$report_zip_url" ]; then
|
|
if ! unzip -Z1 "$downloaded_report_zip" | grep -Fx "$path" >/dev/null; then
|
|
echo "report.zip is missing expected file: $path" >&2
|
|
exit 1
|
|
fi
|
|
else
|
|
if [ -z "${R2_REPORT_URL:-}" ]; then
|
|
echo "R2_REPORT_URL is required when R2_REPORT_ZIP_URL is not set" >&2
|
|
exit 1
|
|
fi
|
|
curl -fsSI "${R2_REPORT_URL}${path}" >/dev/null
|
|
fi
|
|
}
|
|
|
|
downloaded_metadata="$RUNNER_TEMP/metadata.json"
|
|
curl -fsSL "$R2_METADATA_URL?run=${GITHUB_RUN_ID:-local}" -o "$downloaded_metadata"
|
|
DOWNLOADED_METADATA="$downloaded_metadata" \
|
|
EXPECTED_CHANNEL="$RELEASE_CHANNEL" \
|
|
EXPECTED_MAC_INTEL_SIGNED="${MAC_INTEL_SIGNED:-}" \
|
|
EXPECTED_NIGHTLY_NUMBER="${NIGHTLY_NUMBER:-}" \
|
|
EXPECTED_RELEASE_VERSION="$RELEASE_VERSION" \
|
|
node --input-type=module <<'NODE'
|
|
import { readFileSync } from "node:fs";
|
|
const metadata = JSON.parse(readFileSync(process.env.DOWNLOADED_METADATA, "utf8"));
|
|
if (metadata.channel !== process.env.EXPECTED_CHANNEL) {
|
|
throw new Error("unexpected metadata channel: " + metadata.channel);
|
|
}
|
|
if (metadata.channel === "beta") {
|
|
if (metadata.betaVersion !== process.env.EXPECTED_RELEASE_VERSION) {
|
|
throw new Error("unexpected metadata betaVersion: " + metadata.betaVersion);
|
|
}
|
|
} else if (metadata.channel === "preview") {
|
|
if (metadata.releaseVersion !== process.env.EXPECTED_RELEASE_VERSION) {
|
|
throw new Error("unexpected metadata releaseVersion: " + metadata.releaseVersion);
|
|
}
|
|
if (metadata.previewVersion !== process.env.EXPECTED_RELEASE_VERSION) {
|
|
throw new Error("unexpected metadata previewVersion: " + metadata.previewVersion);
|
|
}
|
|
const expectedPreviewNumber = Number(process.env.EXPECTED_RELEASE_VERSION.split("-preview.")[1]);
|
|
if (metadata.previewNumber !== expectedPreviewNumber) {
|
|
throw new Error("unexpected metadata previewNumber: " + metadata.previewNumber);
|
|
}
|
|
} else {
|
|
if (metadata.releaseVersion !== process.env.EXPECTED_RELEASE_VERSION) {
|
|
throw new Error("unexpected metadata releaseVersion: " + metadata.releaseVersion);
|
|
}
|
|
if (metadata.channel === "nightly") {
|
|
if (metadata.nightlyVersion !== process.env.EXPECTED_RELEASE_VERSION) {
|
|
throw new Error("unexpected metadata nightlyVersion: " + metadata.nightlyVersion);
|
|
}
|
|
if (metadata.nightlyNumber !== Number(process.env.EXPECTED_NIGHTLY_NUMBER)) {
|
|
throw new Error("unexpected metadata nightlyNumber: " + metadata.nightlyNumber);
|
|
}
|
|
}
|
|
}
|
|
if (process.env.EXPECTED_MAC_INTEL_SIGNED !== "") {
|
|
const expected = process.env.EXPECTED_MAC_INTEL_SIGNED === "true";
|
|
if (metadata.platforms?.macIntel?.signed !== expected) {
|
|
throw new Error("unexpected metadata platforms.macIntel.signed: " + metadata.platforms?.macIntel?.signed);
|
|
}
|
|
}
|
|
NODE
|
|
|
|
if [ "$ENABLE_MAC" = "true" ]; then
|
|
for name in R2_MAC_DMG_URL; do
|
|
if [ -z "${!name:-}" ]; then
|
|
echo "$name is required when ENABLE_MAC=true" >&2
|
|
exit 1
|
|
fi
|
|
done
|
|
curl -fsSI "$R2_MAC_DMG_URL" >/dev/null
|
|
if [ "$mac_artifact_mode" != "dmg-only" ]; then
|
|
for name in R2_MAC_FEED_URL R2_MAC_ZIP_URL; do
|
|
if [ -z "${!name:-}" ]; then
|
|
echo "$name is required when ENABLE_MAC=true and MAC_ARTIFACT_MODE=$mac_artifact_mode" >&2
|
|
exit 1
|
|
fi
|
|
done
|
|
downloaded_feed="$RUNNER_TEMP/latest-mac.yml"
|
|
curl -fsSL "$R2_MAC_FEED_URL?run=${GITHUB_RUN_ID:-local}" -o "$downloaded_feed"
|
|
grep -F "version: \"$RELEASE_VERSION\"" "$downloaded_feed"
|
|
grep -F "$R2_MAC_ZIP_URL" "$downloaded_feed"
|
|
curl -fsSI "$R2_MAC_ZIP_URL" >/dev/null
|
|
fi
|
|
require_report_file "mac/manifest.json"
|
|
require_report_file "mac/screenshots/open-design-mac-smoke.png"
|
|
require_report_file "mac/suite-result.json"
|
|
require_report_file "mac/tools-pack.json"
|
|
require_report_file "mac/tools-pack.log"
|
|
require_report_file "mac/vitest.log"
|
|
fi
|
|
|
|
if [ "$ENABLE_WIN" = "true" ]; then
|
|
for name in R2_WIN_FEED_URL R2_WIN_INSTALLER_URL; do
|
|
if [ -z "${!name:-}" ]; then
|
|
echo "$name is required when ENABLE_WIN=true" >&2
|
|
exit 1
|
|
fi
|
|
done
|
|
downloaded_feed="$RUNNER_TEMP/latest.yml"
|
|
curl -fsSL "$R2_WIN_FEED_URL?run=${GITHUB_RUN_ID:-local}" -o "$downloaded_feed"
|
|
grep -F "version: \"$RELEASE_VERSION\"" "$downloaded_feed"
|
|
grep -F "$R2_WIN_INSTALLER_URL" "$downloaded_feed"
|
|
curl -fsSI "$R2_WIN_INSTALLER_URL" >/dev/null
|
|
if [ -n "${R2_WIN_PORTABLE_ZIP_URL:-}" ]; then
|
|
curl -fsSI "$R2_WIN_PORTABLE_ZIP_URL" >/dev/null
|
|
fi
|
|
require_report_file "win/manifest.json"
|
|
require_report_file "win/screenshots/open-design-win-smoke.png"
|
|
require_report_file "win/suite-result.json"
|
|
require_report_file "win/tools-pack.json"
|
|
require_report_file "win/vitest.log"
|
|
fi
|
|
|
|
if [ "$ENABLE_MAC_INTEL" = "true" ]; then
|
|
for name in R2_MAC_INTEL_DMG_URL R2_MAC_INTEL_ZIP_URL; do
|
|
if [ -z "${!name:-}" ]; then
|
|
echo "$name is required when ENABLE_MAC_INTEL=true" >&2
|
|
exit 1
|
|
fi
|
|
done
|
|
curl -fsSI "$R2_MAC_INTEL_DMG_URL" >/dev/null
|
|
curl -fsSI "$R2_MAC_INTEL_ZIP_URL" >/dev/null
|
|
fi
|
|
|
|
if [ "$ENABLE_LINUX" = "true" ]; then
|
|
if [ -z "${R2_LINUX_APPIMAGE_URL:-}" ]; then
|
|
echo "R2_LINUX_APPIMAGE_URL is required when ENABLE_LINUX=true" >&2
|
|
exit 1
|
|
fi
|
|
curl -fsSI "$R2_LINUX_APPIMAGE_URL" >/dev/null
|
|
fi
|