Enhance install script with improved logging and error handling
This commit is contained in:
+44
-14
@@ -23,6 +23,19 @@ log_success() { echo -e "${GREEN}[ok]${NC} $1"; }
|
|||||||
log_warn() { echo -e "${YELLOW}[!]${NC} $1"; }
|
log_warn() { echo -e "${YELLOW}[!]${NC} $1"; }
|
||||||
log_error() { echo -e "${RED}[err]${NC} $1"; exit 1; }
|
log_error() { echo -e "${RED}[err]${NC} $1"; exit 1; }
|
||||||
|
|
||||||
|
# Запускает команду тихо, показывает вывод только при ошибке
|
||||||
|
run_quiet() {
|
||||||
|
local _log
|
||||||
|
_log="$(mktemp /tmp/lwc-cmd.XXXXXX.log)"
|
||||||
|
if "$@" > "$_log" 2>&1; then
|
||||||
|
rm -f "$_log"
|
||||||
|
else
|
||||||
|
cat "$_log" >&2
|
||||||
|
rm -f "$_log"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
print_banner() {
|
print_banner() {
|
||||||
echo ""
|
echo ""
|
||||||
echo -e "${BOLD}"
|
echo -e "${BOLD}"
|
||||||
@@ -53,9 +66,9 @@ detect_os() {
|
|||||||
# Устанавливает системные пакеты через найденный пакетный менеджер
|
# Устанавливает системные пакеты через найденный пакетный менеджер
|
||||||
pkg_install() {
|
pkg_install() {
|
||||||
case "$PKG_MANAGER" in
|
case "$PKG_MANAGER" in
|
||||||
apt) sudo apt-get update -qq && sudo apt-get install -y --no-install-recommends "$@" ;;
|
apt) run_quiet sudo apt-get update -qq && run_quiet sudo apt-get install -y --no-install-recommends "$@" ;;
|
||||||
dnf) sudo dnf install -y "$@" ;;
|
dnf) run_quiet sudo dnf install -y "$@" ;;
|
||||||
pacman) sudo pacman -S --noconfirm "$@" ;;
|
pacman) run_quiet sudo pacman -S --noconfirm "$@" ;;
|
||||||
*) log_error "Cannot auto-install $* — unknown package manager" ;;
|
*) log_error "Cannot auto-install $* — unknown package manager" ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
@@ -69,7 +82,7 @@ check_git() {
|
|||||||
log_info "Installing git..."
|
log_info "Installing git..."
|
||||||
case "$OS" in
|
case "$OS" in
|
||||||
linux) pkg_install git ;;
|
linux) pkg_install git ;;
|
||||||
macos) xcode-select --install 2>/dev/null || brew install git ;;
|
macos) run_quiet xcode-select --install 2>/dev/null || run_quiet brew install git ;;
|
||||||
esac
|
esac
|
||||||
command -v git &>/dev/null || log_error "Failed to install git"
|
command -v git &>/dev/null || log_error "Failed to install git"
|
||||||
log_success "git $(git --version | awk '{print $3}') installed"
|
log_success "git $(git --version | awk '{print $3}') installed"
|
||||||
@@ -81,16 +94,18 @@ check_docker() {
|
|||||||
log_success "Docker $(docker --version | awk '{print $3}' | tr -d ',') found"
|
log_success "Docker $(docker --version | awk '{print $3}' | tr -d ',') found"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
log_info "Installing Docker via get.docker.com..."
|
log_info "Installing Docker..."
|
||||||
|
# Скачиваем установщик во временный файл, а не запускаем через pipe —
|
||||||
|
# так видны ошибки сети отдельно от ошибок самого установщика
|
||||||
local _installer
|
local _installer
|
||||||
_installer="$(mktemp /tmp/lwc-docker.XXXXXX.sh)"
|
_installer="$(mktemp /tmp/lwc-docker.XXXXXX.sh)"
|
||||||
if ! curl -fsSL https://get.docker.com -o "$_installer"; then
|
if ! curl -fsSL https://get.docker.com -o "$_installer"; then
|
||||||
rm -f "$_installer"
|
rm -f "$_installer"
|
||||||
log_error "Failed to download Docker installer"
|
log_error "Failed to download Docker installer"
|
||||||
fi
|
fi
|
||||||
sh "$_installer"
|
run_quiet sh "$_installer" || { rm -f "$_installer"; log_error "Docker installation failed"; }
|
||||||
rm -f "$_installer"
|
rm -f "$_installer"
|
||||||
command -v docker &>/dev/null || log_error "Docker installation failed"
|
command -v docker &>/dev/null || log_error "Docker not found after installation"
|
||||||
log_success "Docker $(docker --version | awk '{print $3}' | tr -d ',') installed"
|
log_success "Docker $(docker --version | awk '{print $3}' | tr -d ',') installed"
|
||||||
# Добавляем пользователя в группу docker, чтобы не требовался sudo
|
# Добавляем пользователя в группу docker, чтобы не требовался sudo
|
||||||
if [ "$(id -u)" -ne 0 ] && command -v usermod &>/dev/null; then
|
if [ "$(id -u)" -ne 0 ] && command -v usermod &>/dev/null; then
|
||||||
@@ -114,6 +129,7 @@ install_uv() {
|
|||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
log_info "Installing uv..."
|
log_info "Installing uv..."
|
||||||
|
# Два отдельных файла: лог и установщик — чтобы различать ошибки скачивания и установки
|
||||||
local _log _installer
|
local _log _installer
|
||||||
_log="$(mktemp /tmp/lwc-uv.XXXXXX.log)"
|
_log="$(mktemp /tmp/lwc-uv.XXXXXX.log)"
|
||||||
_installer="$(mktemp /tmp/lwc-uv-installer.XXXXXX.sh)"
|
_installer="$(mktemp /tmp/lwc-uv-installer.XXXXXX.sh)"
|
||||||
@@ -121,7 +137,7 @@ install_uv() {
|
|||||||
cat "$_log" >&2; rm -f "$_log" "$_installer"
|
cat "$_log" >&2; rm -f "$_log" "$_installer"
|
||||||
log_error "Failed to download uv installer"
|
log_error "Failed to download uv installer"
|
||||||
fi
|
fi
|
||||||
if sh "$_installer" >>"$_log" 2>&1; then
|
if sh "$_installer" >> "$_log" 2>&1; then
|
||||||
rm -f "$_installer"
|
rm -f "$_installer"
|
||||||
for candidate in "$HOME/.local/bin/uv" "$HOME/.cargo/bin/uv"; do
|
for candidate in "$HOME/.local/bin/uv" "$HOME/.cargo/bin/uv"; do
|
||||||
[ -x "$candidate" ] && UV_CMD="$candidate" && break
|
[ -x "$candidate" ] && UV_CMD="$candidate" && break
|
||||||
@@ -146,8 +162,9 @@ check_python() {
|
|||||||
log_success "$ver found"
|
log_success "$ver found"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
# uv умеет скачивать и изолировать нужную версию Python без sudo
|
||||||
log_info "Installing Python $PYTHON_VERSION via uv..."
|
log_info "Installing Python $PYTHON_VERSION via uv..."
|
||||||
"$UV_CMD" python install "$PYTHON_VERSION" || log_error "Failed to install Python $PYTHON_VERSION"
|
run_quiet "$UV_CMD" python install "$PYTHON_VERSION" || log_error "Failed to install Python $PYTHON_VERSION"
|
||||||
log_success "Python $PYTHON_VERSION installed"
|
log_success "Python $PYTHON_VERSION installed"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -160,19 +177,20 @@ resolve_install_dir() {
|
|||||||
log_info "Repo: $INSTALL_DIR"
|
log_info "Repo: $INSTALL_DIR"
|
||||||
else
|
else
|
||||||
# Иначе клонируем в ~/.lwc/ros2_iiwa7
|
# Иначе клонируем в ~/.lwc/ros2_iiwa7
|
||||||
log_info "Cloning into $INSTALL_DIR..."
|
log_info "Cloning repo..."
|
||||||
mkdir -p "$(dirname "$INSTALL_DIR")"
|
mkdir -p "$(dirname "$INSTALL_DIR")"
|
||||||
|
|
||||||
# TODO: Убрать ветку dev и юзать main после мержа
|
# TODO: Убрать ветку dev и юзать main после мержа
|
||||||
git clone --branch dev "$REPO_URL" "$INSTALL_DIR"
|
run_quiet git clone --branch dev "$REPO_URL" "$INSTALL_DIR" \
|
||||||
log_success "Repo cloned"
|
|| log_error "Failed to clone repo"
|
||||||
|
log_success "Repo cloned to $INSTALL_DIR"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
install_cobot() {
|
install_cobot() {
|
||||||
log_info "Installing cobot CLI..."
|
log_info "Installing cobot CLI..."
|
||||||
cd "$INSTALL_DIR"
|
cd "$INSTALL_DIR"
|
||||||
"$UV_CMD" tool install --python "$PYTHON_VERSION" --editable . \
|
# uv tool install создаёт изолированное окружение и кладёт бинарник cobot в ~/.local/bin
|
||||||
|
run_quiet "$UV_CMD" tool install --python "$PYTHON_VERSION" --editable . \
|
||||||
|| log_error "Failed to install cobot"
|
|| log_error "Failed to install cobot"
|
||||||
log_success "cobot installed"
|
log_success "cobot installed"
|
||||||
}
|
}
|
||||||
@@ -205,9 +223,21 @@ print_success() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
run_setup() {
|
run_setup() {
|
||||||
|
# Явная проверка — PATH мог не подхватиться если uv положил бинарник в нестандартное место
|
||||||
|
if ! command -v cobot &>/dev/null; then
|
||||||
|
log_warn "cobot not found on PATH, trying full path..."
|
||||||
|
local cobot_bin="$HOME/.local/bin/cobot"
|
||||||
|
if [ -x "$cobot_bin" ]; then
|
||||||
|
export PATH="$HOME/.local/bin:$PATH"
|
||||||
|
else
|
||||||
|
log_error "cobot binary not found — try: source ~/.bashrc && cobot setup"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
log_info "Running cobot setup..."
|
log_info "Running cobot setup..."
|
||||||
cobot setup
|
cobot setup
|
||||||
|
|
||||||
|
# curl | bash: дочерний процесс не может обновить терминал родителя
|
||||||
if [ "$IS_INTERACTIVE" = false ]; then
|
if [ "$IS_INTERACTIVE" = false ]; then
|
||||||
echo ""
|
echo ""
|
||||||
echo " To apply PATH changes in this terminal, run:"
|
echo " To apply PATH changes in this terminal, run:"
|
||||||
|
|||||||
Reference in New Issue
Block a user