Add initial DevContainer setup and configuration files (#1)
- Create .devcontainer/devcontainer.json for container environment setup - Add postStartCommand.sh for provisioning system dependencies and configuration - Include .gitignore to exclude task-related files - Create .taskrc.yml to enable experimental features - Add Taskfile.yml for task management and configuration - Set up VSCode settings for integrated terminal using zsh Co-authored-by: Thomas <thomas.hochstrasser@gmx.net> Reviewed-on: #1
This commit was merged in pull request #1.
This commit is contained in:
180
.devcontainer/postStartCommand.sh
Normal file
180
.devcontainer/postStartCommand.sh
Normal file
@@ -0,0 +1,180 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ==============================================================================
|
||||
# Conan2 Development Environment Setup
|
||||
#
|
||||
# Description: Provisions system dependencies, shell configuration, and Conan2.
|
||||
# Designed for Debian/Ubuntu-based DevContainers or CI Runners.
|
||||
# Usage: CONAN_USR=x CONAN_PSW=y ./postStartCommand.sh
|
||||
# ==============================================================================
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# --- Configuration ------------------------------------------------------------
|
||||
# Versions & Remote Resources
|
||||
TASK_VERSION="v3.45.5"
|
||||
GLOW_VERSION="2.1.1"
|
||||
CONAN_CONFIG_URL="https://package-cloud.dns.army/ros2/conan2-config.git"
|
||||
CONAN_REMOTE_NAME="package-cloud-ros2-conan2"
|
||||
|
||||
# Localization
|
||||
TIMEZONE="Europe/Berlin"
|
||||
|
||||
# Paths
|
||||
LOCAL_BIN="$HOME/.local/bin"
|
||||
ZSH_CUSTOM="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}"
|
||||
|
||||
# --- Helpers ------------------------------------------------------------------
|
||||
|
||||
log() {
|
||||
echo -e "\033[1;34m>>> [SETUP] $1\033[0m"
|
||||
}
|
||||
|
||||
error() {
|
||||
echo -e "\033[1;31m!!! [ERROR] $1\033[0m" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
cleanup() {
|
||||
# Remove temp files on exit (successful or not)
|
||||
rm -f glow.deb install_task.sh
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
ensure_env_vars() {
|
||||
if [[ -z "${CONAN_USR:-}" ]] || [[ -z "${CONAN_PSW:-}" ]]; then
|
||||
error "CONAN_USR and CONAN_PSW environment variables are required."
|
||||
fi
|
||||
}
|
||||
|
||||
detect_arch() {
|
||||
local arch
|
||||
arch=$(dpkg --print-architecture)
|
||||
case "$arch" in
|
||||
amd64) echo "amd64" ;;
|
||||
arm64) echo "arm64" ;;
|
||||
*) error "Unsupported architecture: $arch" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
# --- Installation Functions ---------------------------------------------------
|
||||
|
||||
install_system_dependencies() {
|
||||
log "Installing system dependencies..."
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
apt-get update -q
|
||||
apt-get install -y -q --no-install-recommends \
|
||||
tzdata curl git zsh python3 python3-pip python3-venv \
|
||||
ca-certificates gnupg pipx
|
||||
|
||||
# Ensure pipx path is available immediately for this script
|
||||
export PATH="$LOCAL_BIN:$PATH"
|
||||
pipx ensurepath
|
||||
}
|
||||
|
||||
configure_timezone() {
|
||||
log "Configuring timezone ($TIMEZONE)..."
|
||||
local tz_path="/usr/share/zoneinfo/$TIMEZONE"
|
||||
|
||||
# Validation: Ensure the requested timezone actually exists
|
||||
if [ ! -f "$tz_path" ]; then
|
||||
error "Timezone data not found at '$tz_path'. Please check the TIMEZONE variable."
|
||||
fi
|
||||
|
||||
ln -fs "$tz_path" /etc/localtime
|
||||
echo "$TIMEZONE" >/etc/timezone
|
||||
dpkg-reconfigure -f noninteractive tzdata
|
||||
}
|
||||
|
||||
install_shell_tools() {
|
||||
log "Setting up Shell (Oh My Zsh)..."
|
||||
if [ ! -d "$HOME/.oh-my-zsh" ]; then
|
||||
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
|
||||
else
|
||||
log "Oh My Zsh already installed. Skipping."
|
||||
fi
|
||||
}
|
||||
|
||||
install_conan() {
|
||||
log "Installing Conan via pipx (Isolated)..."
|
||||
|
||||
# Config
|
||||
log "Installing Conan Config..."
|
||||
# Force allows overwriting existing configs which is usually desired in setup scripts
|
||||
conan config install "$CONAN_CONFIG_URL" --type git --args="--branch main"
|
||||
|
||||
log "Authenticating Conan..."
|
||||
conan remote login "$CONAN_REMOTE_NAME" "$CONAN_USR" -p "$CONAN_PSW"
|
||||
}
|
||||
|
||||
install_utilities() {
|
||||
local arch
|
||||
arch=$(detect_arch)
|
||||
|
||||
# 1. Taskfile
|
||||
log "Installing Taskfile ($TASK_VERSION)..."
|
||||
curl -sL -o install_task.sh https://taskfile.dev/install.sh
|
||||
sh install_task.sh -d -b "$LOCAL_BIN" "$TASK_VERSION"
|
||||
|
||||
# 2. Glow
|
||||
log "Installing Glow ($GLOW_VERSION for $arch)..."
|
||||
local glow_url="https://github.com/charmbracelet/glow/releases/download/v${GLOW_VERSION}/glow_${GLOW_VERSION}_${arch}.deb"
|
||||
|
||||
curl -L -o glow.deb "$glow_url"
|
||||
dpkg -i glow.deb
|
||||
}
|
||||
|
||||
configure_persistence() {
|
||||
log "Persisting configurations..."
|
||||
|
||||
local zshrc="$HOME/.zshrc"
|
||||
touch "$zshrc"
|
||||
|
||||
# Helper to append if missing
|
||||
append_if_missing() {
|
||||
local file="$1"
|
||||
local content="$2"
|
||||
if ! grep -Fxq "$content" "$file"; then
|
||||
echo "$content" >>"$file"
|
||||
fi
|
||||
}
|
||||
|
||||
# Add Local Bin to Path
|
||||
local path_export='export PATH="$HOME/.local/bin:$PATH"'
|
||||
append_if_missing "$HOME/.bashrc" "$path_export"
|
||||
append_if_missing "$zshrc" "$path_export"
|
||||
|
||||
# Shell Completions
|
||||
append_if_missing "$zshrc" 'eval "$(task --completion zsh)"'
|
||||
append_if_missing "$zshrc" 'eval "$(glow completion zsh)"'
|
||||
|
||||
# Git Safe Directory
|
||||
git config --global --add safe.directory /workspaces/conan2-ros2-hesai-lidar
|
||||
}
|
||||
|
||||
run_tasks() {
|
||||
if [ -f "Taskfile.yml" ] || [ -f "Taskfile.yaml" ]; then
|
||||
log "Running default Task..."
|
||||
"$LOCAL_BIN/task" --yes
|
||||
else
|
||||
log "No Taskfile found. Skipping 'task --yes'."
|
||||
fi
|
||||
}
|
||||
|
||||
# --- Main Execution -----------------------------------------------------------
|
||||
|
||||
main() {
|
||||
ensure_env_vars
|
||||
install_system_dependencies
|
||||
configure_timezone
|
||||
install_shell_tools
|
||||
install_utilities # Task & Glow
|
||||
install_conan
|
||||
configure_persistence
|
||||
run_tasks
|
||||
|
||||
log "Setup complete successfully."
|
||||
}
|
||||
|
||||
main
|
||||
Reference in New Issue
Block a user