전체 설치 스크립트 GitHub 릴리스 에셋 검증 및 폴백 다운로드 방어 로직 적용

This commit is contained in:
mcchae committed 2026-10-31 04:54:34 +09:00
1 parent 5a67e7bbcf
commit b41d2f68f3
21 files changed
+541 -190

No files matched your search

+35 -12
View File
@@ -14,7 +14,8 @@ set -euo pipefail
# 상수 정의
# ────────────────────────────────────────────
REPO="helix-editor/helix"
API_URL="https://api.github.com/repos/${REPO}/releases/latest"
API_URL="https://api.github.com/repos/${REPO}/releases"
FALLBACK_TAG="25.07.1"
INSTALL_DIR="${HOME}/.local/bin"
HELIX_CONFIG_DIR="${HOME}/.config/helix"
@@ -33,20 +34,26 @@ for cmd in curl tar xz uname; do
command -v "$cmd" &>/dev/null || error "'$cmd' 명령어가 필요합니다. 먼저 설치해 주세요."
done
# Fallback: jq가 없을 경우 python3를 사용해 JSON 분석
# Fallback: jq가 없을 경우 python3 또는 grep을 사용해 JSON 분석
if command -v jq &>/dev/null; then
_json_latest_tag() {
jq -r '.tag_name'
jq -r '[.[] | select(.prerelease==false and ((.assets | length) > 0))] | .[0].tag_name'
}
else
command -v python3 &>/dev/null || error "'jq' 또는 'python3' 명령어가 설치되어 있어야 합니다."
elif command -v python3 &>/dev/null; then
_json_latest_tag() {
python3 -c "
import sys, json
data = json.load(sys.stdin)
print(data.get('tag_name', ''))
for r in data:
if not r.get('prerelease') and r.get('assets'):
print(r.get('tag_name', ''))
break
"
}
else
_json_latest_tag() {
grep -oE '"tag_name":[[:space:]]*"[^"]+"' | head -1 | sed -E 's/.*"([^"]+)"$/\1/'
}
fi
# ────────────────────────────────────────────
@@ -93,12 +100,15 @@ detect_platform() {
get_latest_release_tag() {
info "GitHub API를 통해 Helix 최신 릴리스 버전을 조회하는 중..."
local release_json tag
release_json="$(curl -fsSL "${API_URL}")" || error "GitHub API 호출에 실패했습니다."
local release_json="" tag=""
release_json="$(curl -fsSL -H "User-Agent: install-helix-sh" --connect-timeout 10 "${API_URL}" 2>/dev/null)" || true
tag="$(echo "$release_json" | _json_latest_tag)"
if [[ -n "$release_json" ]]; then
tag="$(echo "$release_json" | _json_latest_tag 2>/dev/null || true)"
fi
if [[ -z "$tag" || "$tag" == "null" ]]; then
error "최신 릴리스 태그를 확인하는 데 실패했습니다."
warn "최신 릴리스 태그 조회 실패. 검증된 폴백 버전(${FALLBACK_TAG})을 사용합니다."
tag="${FALLBACK_TAG}"
fi
echo "$tag"
}
@@ -127,8 +137,21 @@ main() {
info "아카이브 다운로드 중: $download_url"
if ! curl -fsSL "$download_url" -o "$tmp_archive"; then
rm -rf "$tmp_dir"
error "바이너리 다운로드에 실패했습니다. URL: $download_url"
if [[ "$tag" != "$FALLBACK_TAG" ]]; then
tag="${FALLBACK_TAG}"
version="${tag#v}"
asset_name="helix-${version}-${platform_arch}"
archive_name="${asset_name}.tar.xz"
download_url="https://github.com/helix-editor/helix/releases/download/${tag}/${archive_name}"
warn "다운로드 실패. 폴백 버전(${FALLBACK_TAG})으로 재시도합니다: $download_url"
if ! curl -fsSL "$download_url" -o "$tmp_archive"; then
rm -rf "$tmp_dir"
error "바이너리 다운로드에 실패했습니다. URL: $download_url"
fi
else
rm -rf "$tmp_dir"
error "바이너리 다운로드에 실패했습니다. URL: $download_url"
fi
fi
info "압축 해제 중..."