141 lines
5.7 KiB
Bash
141 lines
5.7 KiB
Bash
#!/usr/bin/env bash
|
|||
|
|
# shellcheck disable=SC2086
|
||
|
|
|
||
|
|
# Alibaba Open Code Review (ocr) 설치 스크립트
|
||
|
|
#
|
||
|
|
# macOS, Linux 환경에서 GitHub Releases에 배포된 최신 네이티브 바이너리를 다운로드하여 설치합니다.
|
||
|
|
# 공식 가이드: https://github.com/alibaba/open-code-review
|
||
|
|
#
|
||
|
|
# 지원 아키텍처:
|
||
|
|
# macOS : Apple Silicon (arm64), Intel (x86_64)
|
||
|
|
# Linux : x86_64 (amd64), ARM64 (aarch64)
|
||
|
|
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
# ────────────────────────────────────────────
|
||
|
|
# 상수 정의
|
||
|
|
# ────────────────────────────────────────────
|
||
|
|
REPO="alibaba/open-code-review"
|
||
|
|
API_URL="https://api.github.com/repos/${REPO}/releases/latest"
|
||
|
|
INSTALL_DIR="${HOME}/.local/bin"
|
||
|
|
FALLBACK_VERSION="v1.3.19"
|
||
|
|
|
||
|
|
# ────────────────────────────────────────────
|
||
|
|
# 유틸리티 함수 (모두 stderr 출력)
|
||
|
|
# ────────────────────────────────────────────
|
||
|
|
info() { echo "[INFO] $*" >&2; }
|
||
|
|
warn() { echo "[WARN] $*" >&2; }
|
||
|
|
error() { echo "[ERROR] $*" >&2; exit 1; }
|
||
|
|
success() { echo "[OK] $*" >&2; }
|
||
|
|
|
||
|
|
# ────────────────────────────────────────────
|
||
|
|
# 필수 명령어 확인
|
||
|
|
# ────────────────────────────────────────────
|
||
|
|
for cmd in curl uname; do
|
||
|
|
command -v "$cmd" &>/dev/null || error "'$cmd' 명령어가 필요합니다."
|
||
|
|
done
|
||
|
|
|
||
|
|
# ────────────────────────────────────────────
|
||
|
|
# OS / 아키텍처 감지 및 파일명 결정
|
||
|
|
# ────────────────────────────────────────────
|
||
|
|
detect_platform() {
|
||
|
|
local os arch
|
||
|
|
os="$(uname -s)"
|
||
|
|
arch="$(uname -m)"
|
||
|
|
|
||
|
|
case "$os" in
|
||
|
|
Darwin)
|
||
|
|
case "$arch" in
|
||
|
|
arm64) echo "opencodereview-darwin-arm64" ;;
|
||
|
|
x86_64) echo "opencodereview-darwin-amd64" ;;
|
||
|
|
*) error "지원하지 않는 macOS 아키텍처: $arch" ;;
|
||
|
|
esac
|
||
|
|
;;
|
||
|
|
Linux)
|
||
|
|
case "$arch" in
|
||
|
|
x86_64|amd64) echo "opencodereview-linux-amd64" ;;
|
||
|
|
aarch64|arm64) echo "opencodereview-linux-arm64" ;;
|
||
|
|
*) error "지원하지 않는 Linux 아키텍처: $arch" ;;
|
||
|
|
esac
|
||
|
|
;;
|
||
|
|
*)
|
||
|
|
error "지원하지 않는 OS입니다: $os. Windows인 경우 install-ocr.ps1을 사용하세요."
|
||
|
|
;;
|
||
|
|
esac
|
||
|
|
}
|
||
|
|
|
||
|
|
# ────────────────────────────────────────────
|
||
|
|
# 최신 릴리즈 태그 가져오기
|
||
|
|
# ────────────────────────────────────────────
|
||
|
|
get_latest_tag() {
|
||
|
|
local json tag
|
||
|
|
info "GitHub API에서 Open Code Review 최신 릴리즈 정보를 가져오는 중..."
|
||
|
|
|
||
|
|
if json=$(curl -fsSL --connect-timeout 10 "${API_URL}" 2>/dev/null); then
|
||
|
|
if command -v jq &>/dev/null; then
|
||
|
|
tag=$(echo "$json" | jq -r '.tag_name')
|
||
|
|
else
|
||
|
|
# jq가 없는 경우 grep & sed 사용
|
||
|
|
tag=$(echo "$json" | grep '"tag_name":' | head -n 1 | sed -E 's/.*"tag_name": *"([^"]+)".*/\1/')
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [[ -z "${tag:-}" || "${tag}" == "null" ]]; then
|
||
|
|
warn "최신 태그 정보를 가져오지 못했습니다. 기본 버전(${FALLBACK_VERSION})을 사용합니다."
|
||
|
|
echo "${FALLBACK_VERSION}"
|
||
|
|
else
|
||
|
|
echo "${tag}"
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
# ────────────────────────────────────────────
|
||
|
|
# 메인 설치 함수
|
||
|
|
# ────────────────────────────────────────────
|
||
|
|
main() {
|
||
|
|
local asset_name tag url tmpdir dest_file
|
||
|
|
|
||
|
|
asset_name="$(detect_platform)"
|
||
|
|
info "감지된 플랫폼 에셋: $asset_name"
|
||
|
|
|
||
|
|
tag="$(get_latest_tag)"
|
||
|
|
info "적용할 버전 태그: $tag"
|
||
|
|
|
||
|
|
url="https://github.com/${REPO}/releases/download/${tag}/${asset_name}"
|
||
|
|
|
||
|
|
# 임시 디렉토리 생성
|
||
|
|
tmpdir="$(mktemp -d)"
|
||
|
|
trap '[[ -d "${tmpdir:-}" ]] && rm -rf "$tmpdir"' EXIT
|
||
|
|
|
||
|
|
dest_file="${tmpdir}/ocr"
|
||
|
|
|
||
|
|
info "바이너리 다운로드 중: $url"
|
||
|
|
if ! curl -fsSL --progress-bar -o "$dest_file" "$url"; then
|
||
|
|
error "다운로드 실패: $url"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# 설치 디렉토리 확보
|
||
|
|
mkdir -p "$INSTALL_DIR"
|
||
|
|
|
||
|
|
local install_path="${INSTALL_DIR}/ocr"
|
||
|
|
info "설치 경로로 복사 중: ${install_path}"
|
||
|
|
cp "$dest_file" "$install_path"
|
||
|
|
chmod +x "$install_path"
|
||
|
|
|
||
|
|
success "Open Code Review (ocr) 설치가 완료되었습니다!"
|
||
|
|
|
||
|
|
# 버전 정보 출력 테스트
|
||
|
|
if "$install_path" version &>/dev/null; then
|
||
|
|
info "버전 확인: $("$install_path" version)"
|
||
|
|
elif "$install_path" --version &>/dev/null; then
|
||
|
|
info "버전 확인: $("$install_path" --version)"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# PATH 환경 변수 체크 및 가이드
|
||
|
|
if ! echo ":${PATH}:" | grep -q ":${INSTALL_DIR}:"; then
|
||
|
|
warn "'${INSTALL_DIR}' 경로가 PATH 환경 변수에 추가되어 있지 않습니다."
|
||
|
|
warn "다음 명령어를 통해 쉘 설정 파일(~/.bashrc 또는 ~/.zshrc)에 PATH를 추가하세요:"
|
||
|
|
warn " echo 'export PATH=\"\$HOME/.local/bin:\$PATH\"' >> ~/.zshrc && source ~/.zshrc"
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
main "$@"
|