Files
PerishFireandGitHub 976edaf38e test: harden e2e smoke and release reports (#1140)
* test: harden e2e inspect specs

* test: wire e2e release reports

* chore: bump packaged beta base to 0.6.1

* test: run release smoke vitest directly

* test: add suite-owned tools-dev lifecycle

* ci: harden stable release packaging

* fix(release,e2e): gate stable signing on verify and harden suite cleanup

- restore `needs: [metadata, verify]` on the stable release `build_mac`,
  `build_mac_intel`, `build_win`, and `build_linux` jobs so Apple
  signing/notarization and Windows release builds cannot run before
  pnpm guard, typecheck, and layout checks complete on the metadata commit.
- in `runToolsDevSuite`, drop the `started` flag and always attempt
  `stopToolsDevWeb` in `finally`; record stop errors in diagnostics, and
  when the test body succeeded, escalate the stop failure to the suite
  result and rethrow — so orphan daemon/web processes from an interrupted
  `startToolsDevWeb` or a broken shutdown can no longer pass silently.

Addresses PR #1140 review feedback from lefarcen and mrcfps.
2026-05-11 13:11:16 +08:00

151 lines
5.2 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.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
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