返回 DeepSeek-Reasonix
resolve-preview-release.sh
根目录 / scripts / resolve-preview-release.sh
1 #!/usr/bin/env bash
2 # Validate one canonical Preview release tag and emit the shared release event
3 # identity used by CLI, Desktop, npm, and the exact changelog entry.
4 set -euo pipefail
5
6 release_tag="${RELEASE_TAG:?RELEASE_TAG is required}"
7 release_remote="${RELEASE_REMOTE:-origin}"
8 allow_recovery="${ALLOW_PREVIEW_RECOVERY:-false}"
9
10 case "$allow_recovery" in
11 true | false) ;;
12 *)
13 echo "::error::ALLOW_PREVIEW_RECOVERY must be true or false, got: $allow_recovery" >&2
14 exit 2
15 ;;
16 esac
17
18 if [[ ! "$release_tag" =~ ^v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)-preview\.([1-9][0-9]*)$ ]]; then
19 echo "::error::Preview release tag must be vMAJOR.MINOR.PATCH-preview.N, got: $release_tag" >&2
20 exit 1
21 fi
22
23 base_version="${BASH_REMATCH[1]}.${BASH_REMATCH[2]}.${BASH_REMATCH[3]}"
24 preview_number="${BASH_REMATCH[4]}"
25 checkout_sha="$(git rev-parse HEAD^{commit})"
26 main_sha="$(git ls-remote "$release_remote" refs/heads/main-v2 | awk 'NR == 1 { print $1 }')"
27 tag_sha="$(
28 git ls-remote --tags "$release_remote" "refs/tags/$release_tag" "refs/tags/$release_tag^{}" |
29 awk '/\^\{\}$/ { print $1; found = 1; exit } NR == 1 { first = $1 } END { if (!found) print first }'
30 )"
31
32 if [ -z "$main_sha" ] || [ "$checkout_sha" != "$main_sha" ]; then
33 echo "::error::Preview control checkout must equal current $release_remote/main-v2 ($main_sha), got $checkout_sha" >&2
34 exit 1
35 fi
36 if [ -z "$tag_sha" ]; then
37 echo "::error::$release_tag is missing from $release_remote" >&2
38 exit 1
39 fi
40 if [ "$tag_sha" != "$main_sha" ]; then
41 if [ "$allow_recovery" != "true" ]; then
42 echo "::error::$release_tag must point to current $release_remote/main-v2 ($main_sha), got $tag_sha" >&2
43 exit 1
44 fi
45 if ! git cat-file -e "$tag_sha^{commit}" 2>/dev/null ||
46 ! git merge-base --is-ancestor "$tag_sha" "$main_sha"; then
47 echo "::error::Preview recovery tag $release_tag must remain on $release_remote/main-v2 history" >&2
48 exit 1
49 fi
50 fi
51
52 {
53 echo "version=${release_tag#v}"
54 echo "base_version=$base_version"
55 echo "preview_number=$preview_number"
56 echo "cli_tag=$release_tag"
57 echo "desktop_tag=desktop-v${base_version}-preview.${preview_number}"
58 echo "npm_version=${base_version}-canary.${preview_number}"
59 echo "sha=$tag_sha"
60 } >>"${GITHUB_OUTPUT:-/dev/stdout}"
61
62 echo "Preview release resolved: ${release_tag#v} at $tag_sha (recovery=$allow_recovery)"
63
63 lines BASH