Add cross-platform package installation scripts
This commit is contained in:
parent
98b265a8d0
commit
34f1f5d63b
6 changed files with 300 additions and 5 deletions
|
|
@ -4,14 +4,22 @@
|
|||
[data]
|
||||
{{- if eq $hostname "maple" }}
|
||||
machine = "server"
|
||||
hasGUI = false
|
||||
pkgManager = "apt"
|
||||
editor = "hx"
|
||||
{{- else if eq $hostname "rufus" }}
|
||||
machine = "laptop"
|
||||
hasGUI = true
|
||||
pkgManager = "pacman"
|
||||
editor = "hx"
|
||||
{{- else if eq $os "darwin" }}
|
||||
machine = "macbook"
|
||||
hasGUI = true
|
||||
pkgManager = "brew"
|
||||
editor = "hx"
|
||||
{{- else }}
|
||||
machine = "unknown"
|
||||
hasGUI = false
|
||||
pkgManager = "apt"
|
||||
editor = "hx"
|
||||
{{- end }}
|
||||
|
|
|
|||
150
.chezmoiscripts/run_once_before_01-install-packages.sh.tmpl
Normal file
150
.chezmoiscripts/run_once_before_01-install-packages.sh.tmpl
Normal file
|
|
@ -0,0 +1,150 @@
|
|||
#!/bin/bash
|
||||
# Install base packages using the appropriate package manager
|
||||
# This script runs once before other chezmoi operations
|
||||
|
||||
set -e
|
||||
|
||||
echo "==> Installing base packages..."
|
||||
|
||||
{{ if eq .pkgManager "pacman" -}}
|
||||
# Arch Linux (rufus)
|
||||
echo "==> Detected Arch Linux, using pacman..."
|
||||
|
||||
# Update package database
|
||||
sudo pacman -Sy --noconfirm
|
||||
|
||||
# Core CLI tools
|
||||
sudo pacman -S --noconfirm --needed \
|
||||
fish \
|
||||
helix \
|
||||
neovim \
|
||||
ripgrep \
|
||||
fd \
|
||||
bat \
|
||||
eza \
|
||||
fzf \
|
||||
jq \
|
||||
tmux \
|
||||
git \
|
||||
base-devel \
|
||||
keychain
|
||||
|
||||
{{ if .hasGUI -}}
|
||||
# GUI tools (only on machines with GUI)
|
||||
# Check if yay is installed for AUR packages
|
||||
if ! command -v yay &> /dev/null; then
|
||||
echo "==> Installing yay for AUR packages..."
|
||||
cd /tmp
|
||||
git clone https://aur.archlinux.org/yay.git
|
||||
cd yay
|
||||
makepkg -si --noconfirm
|
||||
cd -
|
||||
rm -rf /tmp/yay
|
||||
fi
|
||||
|
||||
# Install Ghostty from AUR
|
||||
echo "==> Installing Ghostty from AUR..."
|
||||
yay -S --noconfirm --needed ghostty
|
||||
{{ end -}}
|
||||
|
||||
{{ else if eq .pkgManager "apt" -}}
|
||||
# Debian/Ubuntu (maple server)
|
||||
echo "==> Detected Debian/Ubuntu, using apt..."
|
||||
|
||||
sudo apt-get update
|
||||
|
||||
# Core CLI tools
|
||||
sudo apt-get install -y \
|
||||
fish \
|
||||
neovim \
|
||||
ripgrep \
|
||||
fd-find \
|
||||
bat \
|
||||
fzf \
|
||||
jq \
|
||||
tmux \
|
||||
git \
|
||||
curl \
|
||||
wget \
|
||||
build-essential \
|
||||
keychain
|
||||
|
||||
# fd is installed as fdfind on Debian, create symlink
|
||||
if [ ! -f ~/.local/bin/fd ] && command -v fdfind &> /dev/null; then
|
||||
mkdir -p ~/.local/bin
|
||||
ln -sf $(which fdfind) ~/.local/bin/fd
|
||||
fi
|
||||
|
||||
# bat is installed as batcat on Debian, create symlink
|
||||
if [ ! -f ~/.local/bin/bat ] && command -v batcat &> /dev/null; then
|
||||
mkdir -p ~/.local/bin
|
||||
ln -sf $(which batcat) ~/.local/bin/bat
|
||||
fi
|
||||
|
||||
# Install eza (modern ls replacement)
|
||||
if ! command -v eza &> /dev/null; then
|
||||
echo "==> Installing eza..."
|
||||
sudo mkdir -p /etc/apt/keyrings
|
||||
wget -qO- https://raw.githubusercontent.com/eza-community/eza/main/deb.asc | sudo gpg --dearmor -o /etc/apt/keyrings/gierens.gpg
|
||||
echo "deb [signed-by=/etc/apt/keyrings/gierens.gpg] http://deb.gierens.de stable main" | sudo tee /etc/apt/sources.list.d/gierens.list
|
||||
sudo chmod 644 /etc/apt/keyrings/gierens.gpg /etc/apt/sources.list.d/gierens.list
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y eza
|
||||
fi
|
||||
|
||||
# Install Helix from GitHub releases (not in apt repos)
|
||||
if ! command -v hx &> /dev/null; then
|
||||
echo "==> Installing Helix from GitHub releases..."
|
||||
HELIX_VERSION=$(curl -s https://api.github.com/repos/helix-editor/helix/releases/latest | jq -r '.tag_name')
|
||||
curl -Lo /tmp/helix.tar.xz "https://github.com/helix-editor/helix/releases/download/${HELIX_VERSION}/helix-${HELIX_VERSION}-x86_64-linux.tar.xz"
|
||||
sudo tar -xf /tmp/helix.tar.xz -C /usr/local/lib/
|
||||
sudo ln -sf /usr/local/lib/helix-${HELIX_VERSION}-x86_64-linux/hx /usr/local/bin/hx
|
||||
rm /tmp/helix.tar.xz
|
||||
echo "==> Helix installed. Set HELIX_RUNTIME=/usr/local/lib/helix-${HELIX_VERSION}-x86_64-linux/runtime"
|
||||
fi
|
||||
|
||||
{{ else if eq .pkgManager "brew" -}}
|
||||
# macOS (macbook)
|
||||
echo "==> Detected macOS, using Homebrew..."
|
||||
|
||||
# Install Homebrew if not present
|
||||
if ! command -v brew &> /dev/null; then
|
||||
echo "==> Installing Homebrew..."
|
||||
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
||||
eval "$(/opt/homebrew/bin/brew shellenv)"
|
||||
fi
|
||||
|
||||
# Core CLI tools
|
||||
brew install \
|
||||
fish \
|
||||
helix \
|
||||
neovim \
|
||||
ripgrep \
|
||||
fd \
|
||||
bat \
|
||||
eza \
|
||||
fzf \
|
||||
jq \
|
||||
tmux \
|
||||
git \
|
||||
keychain
|
||||
|
||||
{{ if .hasGUI -}}
|
||||
# GUI tools (only on machines with GUI)
|
||||
echo "==> Installing Ghostty..."
|
||||
brew install --cask ghostty
|
||||
{{ end -}}
|
||||
|
||||
{{ end -}}
|
||||
|
||||
# Change default shell to fish if not already
|
||||
if [ "$SHELL" != "$(which fish)" ]; then
|
||||
echo "==> Setting fish as default shell..."
|
||||
# Add fish to /etc/shells if not present
|
||||
if ! grep -q "$(which fish)" /etc/shells; then
|
||||
echo "$(which fish)" | sudo tee -a /etc/shells
|
||||
fi
|
||||
chsh -s "$(which fish)"
|
||||
fi
|
||||
|
||||
echo "==> Base packages installed successfully!"
|
||||
34
.chezmoiscripts/run_once_before_02-install-rust.sh.tmpl
Normal file
34
.chezmoiscripts/run_once_before_02-install-rust.sh.tmpl
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
#!/bin/bash
|
||||
# Install Rust toolchain via rustup
|
||||
# This script runs once before other chezmoi operations
|
||||
|
||||
set -e
|
||||
|
||||
echo "==> Installing Rust toolchain..."
|
||||
|
||||
# Install rustup if not present
|
||||
if ! command -v rustup &> /dev/null; then
|
||||
echo "==> Installing rustup..."
|
||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path
|
||||
|
||||
# Source cargo environment for this script
|
||||
source "$HOME/.cargo/env"
|
||||
else
|
||||
echo "==> rustup already installed, updating..."
|
||||
rustup update
|
||||
fi
|
||||
|
||||
# Ensure stable toolchain is installed
|
||||
rustup default stable
|
||||
|
||||
# Install common Rust components
|
||||
echo "==> Installing Rust components..."
|
||||
rustup component add rustfmt clippy rust-analyzer
|
||||
|
||||
# Install useful cargo tools
|
||||
echo "==> Installing cargo tools..."
|
||||
cargo install --locked cargo-watch cargo-edit cargo-outdated 2>/dev/null || true
|
||||
|
||||
echo "==> Rust toolchain installed successfully!"
|
||||
echo " rustc: $(rustc --version)"
|
||||
echo " cargo: $(cargo --version)"
|
||||
37
.chezmoiscripts/run_once_before_03-install-node.sh.tmpl
Normal file
37
.chezmoiscripts/run_once_before_03-install-node.sh.tmpl
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
#!/bin/bash
|
||||
# Install Node.js via fnm (Fast Node Manager)
|
||||
# This script runs once before other chezmoi operations
|
||||
|
||||
set -e
|
||||
|
||||
echo "==> Installing Node.js via fnm..."
|
||||
|
||||
# Install fnm if not present
|
||||
if ! command -v fnm &> /dev/null; then
|
||||
echo "==> Installing fnm..."
|
||||
curl -fsSL https://fnm.vercel.app/install | bash -s -- --skip-shell
|
||||
|
||||
# Add fnm to PATH for this script
|
||||
export PATH="$HOME/.local/share/fnm:$PATH"
|
||||
eval "$(fnm env)"
|
||||
else
|
||||
echo "==> fnm already installed"
|
||||
eval "$(fnm env)"
|
||||
fi
|
||||
|
||||
# Install latest LTS Node.js
|
||||
echo "==> Installing Node.js LTS..."
|
||||
fnm install --lts
|
||||
fnm default lts-latest
|
||||
fnm use lts-latest
|
||||
|
||||
# Verify installation
|
||||
echo "==> Node.js installed successfully!"
|
||||
echo " node: $(node --version)"
|
||||
echo " npm: $(npm --version)"
|
||||
|
||||
# Install common global npm packages
|
||||
echo "==> Installing global npm packages..."
|
||||
npm install -g typescript ts-node npm-check-updates 2>/dev/null || true
|
||||
|
||||
echo "==> Node.js setup complete!"
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
#!/bin/bash
|
||||
# Install Python and common development tools
|
||||
# This script runs once before other chezmoi operations
|
||||
|
||||
set -e
|
||||
|
||||
echo "==> Setting up Python environment..."
|
||||
|
||||
{{ if eq .pkgManager "pacman" -}}
|
||||
# Arch Linux - Python is usually already installed
|
||||
sudo pacman -S --noconfirm --needed python python-pip python-pipx
|
||||
|
||||
{{ else if eq .pkgManager "apt" -}}
|
||||
# Debian/Ubuntu
|
||||
sudo apt-get install -y python3 python3-pip python3-venv pipx
|
||||
|
||||
# Create python symlink if needed
|
||||
if ! command -v python &> /dev/null && command -v python3 &> /dev/null; then
|
||||
sudo ln -sf $(which python3) /usr/local/bin/python
|
||||
fi
|
||||
|
||||
{{ else if eq .pkgManager "brew" -}}
|
||||
# macOS
|
||||
brew install python pipx
|
||||
|
||||
{{ end -}}
|
||||
|
||||
# Ensure pipx path
|
||||
pipx ensurepath
|
||||
|
||||
# Install useful Python CLI tools via pipx
|
||||
echo "==> Installing Python CLI tools via pipx..."
|
||||
pipx install ruff 2>/dev/null || true
|
||||
pipx install black 2>/dev/null || true
|
||||
pipx install mypy 2>/dev/null || true
|
||||
pipx install httpie 2>/dev/null || true
|
||||
|
||||
echo "==> Python setup complete!"
|
||||
echo " python: $(python3 --version)"
|
||||
echo " pip: $(pip3 --version)"
|
||||
|
|
@ -15,21 +15,47 @@ bind \cl 'printf "\e[2J\e[3J\e[H"; commandline -f repaint'
|
|||
# PATH setup
|
||||
fish_add_path -g ~/.local/bin
|
||||
|
||||
{{- if eq .machine "macbook" }}
|
||||
# Cargo/Rust
|
||||
if test -d ~/.cargo/bin
|
||||
fish_add_path -g ~/.cargo/bin
|
||||
end
|
||||
|
||||
# fnm (Fast Node Manager)
|
||||
if test -d ~/.local/share/fnm
|
||||
fish_add_path -g ~/.local/share/fnm
|
||||
fnm env | source
|
||||
end
|
||||
|
||||
# pipx
|
||||
if test -d ~/.local/bin
|
||||
fish_add_path -g ~/.local/bin
|
||||
end
|
||||
|
||||
{{- if eq .pkgManager "brew" }}
|
||||
# macOS-specific: Homebrew paths
|
||||
fish_add_path -g /opt/homebrew/bin
|
||||
fish_add_path -g /opt/homebrew/sbin
|
||||
{{- end }}
|
||||
|
||||
{{- if or (eq .machine "laptop") (eq .machine "macbook") }}
|
||||
{{- if .hasGUI }}
|
||||
# SSH agent socket (systemd user service on Linux, launchd on macOS)
|
||||
{{- if eq .pkgManager "pacman" }}
|
||||
set -gx SSH_AUTH_SOCK $XDG_RUNTIME_DIR/ssh-agent.socket
|
||||
{{- else if eq .pkgManager "brew" }}
|
||||
set -gx SSH_AUTH_SOCK ~/Library/Group\ Containers/2BUA8C4S2C.com.1password/t/agent.sock
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- if eq .machine "server" }}
|
||||
# Server-specific: SSH key caching and Helix runtime
|
||||
{{- if not .hasGUI }}
|
||||
# Server-specific: SSH key caching
|
||||
keychain --eval --quiet id_ed25519 | source
|
||||
set -gx HELIX_RUNTIME /usr/local/lib/helix/runtime
|
||||
{{- end }}
|
||||
|
||||
{{- if eq .pkgManager "apt" }}
|
||||
# Debian/Ubuntu: Helix runtime path (installed from GitHub releases)
|
||||
if test -d /usr/local/lib/helix-*/runtime
|
||||
set -gx HELIX_RUNTIME (ls -d /usr/local/lib/helix-*/runtime | head -1)
|
||||
end
|
||||
{{- end }}
|
||||
|
||||
# GPG TTY for signing
|
||||
|
|
|
|||
Loading…
Reference in a new issue