返回 DeepSeek-Reasonix
validate-cli-release-manifest.sh
根目录 / scripts / validate-cli-release-manifest.sh
1 #!/usr/bin/env bash
2 set -euo pipefail
3
4 channel="${1:-}"
5 tag="${2:-}"
6 repository="${3:-}"
7 manifest="${4:-}"
8 notes_tag="${5:-$tag}"
9
10 stable_tag_pattern='^v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$'
11 preview_tag_pattern='^v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)-preview\.(0|[1-9][0-9]*)$'
12 release_tag_pattern='^v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-([0-9A-Za-z-]+)(\.[0-9A-Za-z-]+)*)?)?$'
13
14 case "$channel" in
15 stable)
16 tag_pattern="$stable_tag_pattern"
17 expected_prerelease=false
18 legacy=false
19 ;;
20 preview)
21 tag_pattern="$preview_tag_pattern"
22 expected_prerelease=true
23 legacy=false
24 ;;
25 any)
26 tag_pattern="$release_tag_pattern"
27 expected_prerelease=any
28 legacy=false
29 ;;
30 legacy-stable)
31 tag_pattern="$stable_tag_pattern"
32 expected_prerelease=false
33 legacy=true
34 ;;
35 legacy-preview)
36 tag_pattern="$preview_tag_pattern"
37 expected_prerelease=true
38 legacy=true
39 ;;
40 legacy-any)
41 tag_pattern="$release_tag_pattern"
42 expected_prerelease=any
43 legacy=true
44 ;;
45 *)
46 echo "CLI manifest channel must be stable, preview, any, legacy-stable, legacy-preview, or legacy-any: $channel" >&2
47 exit 2
48 ;;
49 esac
50
51 if [[ ! "$tag" =~ $tag_pattern ]]; then
52 echo "invalid $channel CLI manifest tag: $tag" >&2
53 exit 1
54 fi
55 if [[ ! "$repository" =~ ^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$ ]]; then
56 echo "invalid GitHub repository: $repository" >&2
57 exit 1
58 fi
59 if [[ ! "$notes_tag" =~ $release_tag_pattern ]]; then
60 echo "invalid CLI release-notes tag: $notes_tag" >&2
61 exit 1
62 fi
63 if [ ! -f "$manifest" ]; then
64 echo "CLI release manifest does not exist: $manifest" >&2
65 exit 1
66 fi
67
68 required_assets='[
69 "reasonix-darwin-amd64.tar.gz",
70 "reasonix-darwin-arm64.tar.gz",
71 "reasonix-linux-amd64.tar.gz",
72 "reasonix-linux-arm64.tar.gz",
73 "reasonix-windows-amd64.zip",
74 "reasonix-windows-arm64.zip",
75 "SHA256SUMS"
76 ]'
77
78 jq -e \
79 --arg channel "$channel" \
80 --arg tag "$tag" \
81 --arg notes_tag "$notes_tag" \
82 --arg repository "$repository" \
83 --arg expected_prerelease "$expected_prerelease" \
84 --argjson legacy "$legacy" \
85 --argjson required "$required_assets" '
86 (type == "object") and
87 (.tag_name == $tag) and
88 (if $expected_prerelease == "any"
89 then (.prerelease | type == "boolean")
90 else (.prerelease == ($expected_prerelease == "true"))
91 end) and
92 (.html_url == ("https://github.com/" + $repository + "/releases/tag/" + $tag)) and
93 (if $legacy
94 then (.release_notes_url == null or
95 .release_notes_url == ("https://reasonix.io/changelog/" + $notes_tag + "/"))
96 else (.release_notes_url == ("https://reasonix.io/changelog/" + $notes_tag + "/"))
97 end) and
98 (.assets | type == "array") and
99 (.assets | length == ($required | length)) and
100 ((.assets | map(.name) | sort) == ($required | sort)) and
101 (.assets | all(
102 (type == "object") and
103 (.name | type == "string") and
104 (.browser_download_url ==
105 ("https://github.com/" + $repository + "/releases/download/" + $tag + "/" + .name)) and
106 (.size | type == "number" and . > 0 and . <= 1073741824 and floor == .)
107 ))
108 ' "$manifest" >/dev/null
109
109 lines BASH