From 11755d832ff1685683bd6d41bf386d1ed158d5e7 Mon Sep 17 00:00:00 2001 From: m3tam3re Date: Sun, 12 Oct 2025 16:21:40 +0200 Subject: [PATCH] +devshell structure --- README.md | 113 ++++++++++++++++++++++++++++++++++- flake.nix | 23 ++------ shells/default.nix | 36 ++++++++++++ shells/devops.nix | 144 +++++++++++++++++++++++++++++++++++++++++++++ shells/python.nix | 78 ++++++++++++++++++++++++ 5 files changed, 375 insertions(+), 19 deletions(-) create mode 100644 shells/default.nix create mode 100644 shells/devops.nix create mode 100644 shells/python.nix diff --git a/README.md b/README.md index 147c580..cfb562a 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ My personal Nix repository containing custom packages, overlays, NixOS modules, - 🎁 **Custom Packages**: Collection of personal Nix packages - 🔄 **Overlays**: Package modifications and enhancements +- 🐚 **Development Shells**: Pre-configured environments for Python and DevOps - ⚙️ **NixOS Modules**: System-level configuration modules - 🏠 **Home Manager Modules**: User-level configuration modules - 📚 **Library Functions**: Helper utilities for configuration management @@ -25,6 +26,10 @@ m3ta-nixpkgs/ │ ├── pomodoro-timer/ │ ├── tuxedo-backlight/ │ └── zellij-ps/ +├── shells/ # Development shells +│ ├── default.nix # Shell registry (default, python, devops) +│ ├── python.nix # Python development environment +│ └── devops.nix # DevOps/infrastructure tools ├── overlays/ # Overlays │ ├── default.nix │ └── mods/ # Package modifications @@ -43,7 +48,7 @@ m3ta-nixpkgs/ │ └── ports.nix # Port management utilities ├── examples/ # Usage examples │ ├── home-manager-standalone.nix -│ └── nixos-configuration.nix +│ ├── nixos-configuration.nix └── templates/ # Templates for new packages/modules ``` @@ -160,6 +165,112 @@ nix profile install git+https://code.m3ta.dev/m3tam3re/nixpkgs#msty-studio nix flake show git+https://code.m3ta.dev/m3tam3re/nixpkgs ``` +## Development Shells + +This repository provides pre-configured development environments. All shells are accessible via `nix develop`. + +### Available Shells + +| Shell | Description | Usage | +| --------- | ---------------------------------------------- | ---------------------- | +| `default` | Nix development tools for working on this repo | `nix develop` | +| `python` | Python with common libraries and tools | `nix develop .#python` | +| `devops` | Docker, Kubernetes, Terraform, cloud CLIs | `nix develop .#devops` | + +### Quick Start + +```bash +# Enter a development environment +nix develop git+https://code.m3ta.dev/m3tam3re/nixpkgs#python +nix develop git+https://code.m3ta.dev/m3tam3re/nixpkgs#devops + +# Run a command in a shell without entering it +nix develop git+https://code.m3ta.dev/m3tam3re/nixpkgs#python --command python --version +``` + +### Using Shells in Home Manager + +Add shells to your home-manager configuration for persistent access: + +```nix +{ + inputs.m3ta-nixpkgs.url = "git+https://code.m3ta.dev/m3tam3re/nixpkgs"; + + # Make tools globally available + home.packages = with inputs.m3ta-nixpkgs.devShells.${pkgs.system}; + python.buildInputs ++ devops.buildInputs; + + # Or create aliases + programs.zsh.shellAliases = { + dev-python = "nix develop ${inputs.m3ta-nixpkgs}#python"; + dev-devops = "nix develop ${inputs.m3ta-nixpkgs}#devops"; + }; +} +``` + +### Using Shells in NixOS + +Add shells system-wide: + +```nix +{ + inputs.m3ta-nixpkgs.url = "git+https://code.m3ta.dev/m3tam3re/nixpkgs"; + + # Make tools available to all users + environment.systemPackages = + inputs.m3ta-nixpkgs.devShells.${pkgs.system}.python.buildInputs; + + # System-wide aliases + environment.shellAliases = { + dev-python = "nix develop ${inputs.m3ta-nixpkgs}#python"; + }; +} +``` + +### Project-Specific Usage with direnv + +Create `.envrc` in your project directory: + +```bash +use flake git+https://code.m3ta.dev/m3tam3re/nixpkgs#python +``` + +Then run `direnv allow`. The environment activates automatically when you enter the directory! + +### Extending Shells for Your Project + +Create a `flake.nix` in your project that extends a base shell: + +```nix +{ + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + m3ta-nixpkgs.url = "git+https://code.m3ta.dev/m3tam3re/nixpkgs"; + }; + + outputs = { nixpkgs, m3ta-nixpkgs, ... }: { + devShells.x86_64-linux.default = nixpkgs.legacyPackages.x86_64-linux.mkShell { + # Inherit all packages from base Python shell + inputsFrom = [ m3ta-nixpkgs.devShells.x86_64-linux.python ]; + + # Add project-specific packages + buildInputs = [ nixpkgs.legacyPackages.x86_64-linux.postgresql ]; + + # Project-specific environment variables + DATABASE_URL = "postgresql://localhost/mydb"; + }; + }; +} +``` + +### Shell Details + +See individual shell files for detailed package lists and configuration: + +- **Default Shell**: `shells/default.nix` - Nix development tools +- **Python Shell**: `shells/python.nix` - Python development environment +- **DevOps Shell**: `shells/devops.nix` - Infrastructure and cloud tools + ## Development ### Setting Up Development Environment diff --git a/flake.nix b/flake.nix index 5be8241..8dca4cb 100644 --- a/flake.nix +++ b/flake.nix @@ -75,27 +75,14 @@ import ./lib {lib = pkgs.lib;} ); - # Development shell for working on this repository + # Development shells for various programming environments + # Usage: nix develop .# + # Available shells: default, rust, python, nodejs, go, cpp, web, devops, data-science devShells = forAllSystems ( system: let pkgs = pkgsFor system; - in { - default = pkgs.mkShell { - buildInputs = with pkgs; [ - nil # Nix LSP - nixpkgs-fmt # Nix formatter - nix-tree # Explore dependency trees - ]; - - shellHook = '' - echo "🚀 m3ta-nixpkgs development environment" - echo "Available commands:" - echo " nix flake check - Check flake validity" - echo " nix flake show - Show flake outputs" - echo " nix build .# - Build a package" - ''; - }; - } + in + import ./shells {inherit pkgs;} ); # Formatter for 'nix fmt' diff --git a/shells/default.nix b/shells/default.nix new file mode 100644 index 0000000..ae1cd1d --- /dev/null +++ b/shells/default.nix @@ -0,0 +1,36 @@ +# Development shells for various programming environments +# Each shell can be accessed via: nix develop .# +# Or used in home-manager/system configs +{pkgs}: { + # Default shell for working on this repository + default = pkgs.mkShell { + name = "m3ta-nixpkgs-dev"; + + buildInputs = with pkgs; [ + nil # Nix LSP + nixpkgs-fmt # Nix formatter + nix-tree # Explore dependency trees + statix # Nix linter + deadnix # Find dead Nix code + ]; + + shellHook = '' + echo "🚀 m3ta-nixpkgs development environment" + echo "Available commands:" + echo " nix flake check - Check flake validity" + echo " nix flake show - Show flake outputs" + echo " nix build .# - Build a package" + echo " nixpkgs-fmt . - Format Nix files" + echo " statix check . - Lint Nix files" + echo " deadnix . - Find dead code" + ''; + }; + + # Import all individual shell environments + rust = import ./rust.nix {inherit pkgs;}; + python = import ./python.nix {inherit pkgs;}; + nodejs = import ./nodejs.nix {inherit pkgs;}; + go = import ./go.nix {inherit pkgs;}; + web = import ./web.nix {inherit pkgs;}; + devops = import ./devops.nix {inherit pkgs;}; +} diff --git a/shells/devops.nix b/shells/devops.nix new file mode 100644 index 0000000..052bb15 --- /dev/null +++ b/shells/devops.nix @@ -0,0 +1,144 @@ +# DevOps development environment +# Usage: nix develop .#devops +{pkgs}: +pkgs.mkShell { + name = "devops-dev"; + + buildInputs = with pkgs; [ + # Container tools + docker + docker-compose + podman + buildah + skopeo + dive # Docker image explorer + + # Kubernetes tools + kubectl + kubectx # Includes kubens + k9s # TUI for Kubernetes + kubernetes-helm + helmfile + kustomize + stern # Multi-pod log tailing + kubeseal # Sealed secrets + + # Infrastructure as Code + terraform + opentofu # Open-source Terraform fork + terragrunt + terraform-docs + tflint + infracost # Cost estimates for Terraform + + # Configuration management + ansible + ansible-lint + + # CI/CD tools + github-cli + gitlab-runner + act # Run GitHub Actions locally + + # Cloud CLIs + awscli2 + google-cloud-sdk + azure-cli + doctl # DigitalOcean CLI + + # Monitoring and observability + prometheus + grafana + # Note: promtool is included in prometheus package + + # Service mesh + istioctl + linkerd + + # Security and secrets + vault + sops + age # Encryption tool + trivy # Security scanner + + # Scripting and automation + python3 + jq + yq-go + jo # JSON output from shell + + # Network tools + curl + wget + httpie + netcat + nmap + tcpdump + wireshark-cli + + # System utilities + htop + btop + lsof + tmux + git + gnumake + + # Linters and formatters + shellcheck + shfmt + yamllint + ]; + + # Environment variables + DOCKER_BUILDKIT = "1"; + COMPOSE_DOCKER_CLI_BUILD = "1"; + + shellHook = '' + echo "🚀 DevOps Development Environment" + echo "" + echo "Container tools:" + echo " docker / podman - Container runtime" + echo " docker-compose - Multi-container applications" + echo " dive - Explore Docker images" + echo " buildah / skopeo - Build and manage containers" + echo "" + echo "Kubernetes:" + echo " kubectl - Kubernetes CLI" + echo " k9s - Kubernetes TUI" + echo " helm - Package manager" + echo " kubectx / kubens - Switch contexts/namespaces (kubens included in kubectx)" + echo " stern - Multi-pod logs" + echo "" + echo "Infrastructure as Code:" + echo " terraform / opentofu - Infrastructure provisioning" + echo " terragrunt - Terraform wrapper" + echo " ansible - Configuration management" + echo " tflint - Terraform linter" + echo "" + echo "Cloud CLIs:" + echo " aws - AWS CLI" + echo " gcloud - Google Cloud CLI" + echo " az - Azure CLI" + echo " doctl - DigitalOcean CLI" + echo "" + echo "Security & Secrets:" + echo " vault - HashiCorp Vault" + echo " sops - Secrets management" + echo " trivy - Security scanner" + echo " kubeseal - Sealed secrets" + echo "" + echo "CI/CD:" + echo " gh - GitHub CLI" + echo " act - Run GitHub Actions locally" + echo " gitlab-runner - GitLab CI runner" + echo "" + echo "Utilities:" + echo " jq / yq - JSON/YAML processors" + echo " httpie / curl - HTTP clients" + echo " shellcheck - Shell script linter" + echo "" + echo "💡 Tip: Use 'kubectx' and 'kubens' to quickly switch contexts" + echo "" + ''; +} diff --git a/shells/python.nix b/shells/python.nix new file mode 100644 index 0000000..40ed97f --- /dev/null +++ b/shells/python.nix @@ -0,0 +1,78 @@ +# Modern Python development environment with marimo and uv — Nushell version +# Usage: nix develop .#python (drops into Nushell) +{pkgs}: let + # Use the latest Python available in nixpkgs + python = pkgs.python314; +in + pkgs.mkShell { + name = "python-marimo-dev"; + + buildInputs = with pkgs; [ + # Python interpreter + python + + # Modern package manager + uv + + # Essential system dependencies for numpy and scientific packages + stdenv.cc.cc.lib + zlib + gfortran + openblas + lapack + + # Nushell itself + nushell + ]; + + # Environment variables for proper library linking + LD_LIBRARY_PATH = "${pkgs.lib.makeLibraryPath [ + pkgs.stdenv.cc.cc.lib + pkgs.zlib + pkgs.gfortran.cc.lib + ]}"; + + # Bash shellHook that sets up the environment and launches Nushell + shellHook = '' + echo "🐍 Python + Marimo Development Environment" + echo "" + echo "Python version: $(python --version)" + echo "uv version: $(uv --version)" + echo "" + + # Create venv if it doesn't exist + if [ ! -d ".venv" ]; then + echo "Creating virtual environment..." + uv venv + fi + + # Activate the virtual environment + source .venv/bin/activate + + # Install marimo if not present + if ! python -c "import marimo" 2>/dev/null; then + echo "Installing marimo..." + uv pip install marimo + fi + + # Install numpy if not present + if ! python -c "import numpy" 2>/dev/null; then + echo "Installing numpy..." + uv pip install numpy + fi + + echo "" + echo "✅ Environment ready!" + echo "" + echo "Quick start:" + echo " marimo edit - Start marimo notebook" + echo " uv pip install - Install packages" + echo " python script.py - Run Python scripts" + echo "" + echo "💡 Popular packages: uv pip install pandas matplotlib scipy scikit-learn" + echo "" + + # Launch Nushell + exec nu + ''; + }