Skip to content

omargallob/devops-starter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

89 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

devops-starter

CI Release Go License: MIT Coverage

An opinionated, cross-platform DevOps tool installer and dotfile manager. Downloads and installs 61 pre-built CLI binaries (no package manager required) and manages shell/editor configuration via symlinks. One command to bootstrap a fully-configured development workstation.

Powered by eget for reliable binary downloads from GitHub releases.


Table of Contents

Why devops-starter?

Setting up a new machine (or a CI runner) with a consistent DevOps toolchain is tedious: different package managers, outdated repos, manual binary downloads, and scattered dotfiles.

devops-starter solves this by:

  1. Using eget to download tools directly from upstream releases -- no Homebrew, apt, or pacman needed.
  2. Verifying downloads with SHA256 checksums (via eget or built-in verification).
  3. Running downloads concurrently with progress bars.
  4. Managing dotfiles (shell, git, tmux, starship, Neovim) via symlinks with automatic backup.
  5. Providing a single YAML config to control everything.

Quick Install

curl -fsSL https://raw.githubusercontent.com/omargallob/devops-starter/main/scripts/install.sh | sh

This detects your OS and architecture, downloads the correct binary, and places it in ~/.local/bin. Make sure ~/.local/bin is in your $PATH.

Build from Source

Prerequisites

  • Go 1.26+
  • (Optional) Bazel 9 (installed via Bazelisk) for hermetic builds

Using Make

make build          # compile for current platform
make test           # run tests with race detector
make lint           # golangci-lint + shellcheck
make install        # build and copy to ~/.local/bin
make help           # list all available targets

Using Bazel

bazel build //cmd/devops-starter
bazel test //...
make bazel-release   # cross-compile all platforms

Usage

Guided Setup

# Interactive wizard: groups, install dir, dotfiles
devops-starter setup

# Non-interactive (uses existing config or defaults)
devops-starter setup --non-interactive

See docs/setup.md for a detailed walkthrough of each wizard screen.

Install Tools

# Install all enabled tools for your platform
devops-starter install

# Preview without installing
devops-starter install --dry-run

# Install only a specific group
devops-starter install --only kubernetes

List Available Tools

# Show all tools with installation status
devops-starter list

Adopt System Tools

# Adopt a specific tool already on your system
devops-starter adopt kubectl helm

# Adopt all detected system tools
devops-starter adopt --all-detected

Remove Managed Tools

# Remove managed binaries (reverts to system version if available)
devops-starter remove terraform packer

Status Dashboard

# Launch interactive full-screen TUI showing tool state
devops-starter status

# Plain text output (CI-friendly)
devops-starter status --no-tui

# Detect actual installed versions
devops-starter status --verify

The TUI features:

  • Full-screen layout that adapts to terminal size
  • Category-based navigation with install/remove/verify actions
  • Status bar showing the running version and update availability
  • Automatic update check (non-blocking) against GitHub Releases

Main view

Cloud group view

Manage Dotfiles

# Create symlinks from repo dotfiles to $HOME
devops-starter dotfiles link

# Remove symlinks managed by devops-starter
devops-starter dotfiles unlink

# Show current symlink status
devops-starter dotfiles status

# Specify a custom dotfiles source directory
devops-starter dotfiles link --source /path/to/dotfiles

System Health Check

# Verify PATH, git, curl, and platform detection
devops-starter doctor

Configuration Management

# Create default config at ~/.config/devops-starter/config.yaml
devops-starter config init

# Show current configuration
devops-starter config show

Global Flags

Flag Description
--config <path> Use a custom config file
--dry-run Preview actions without executing
--yes, -y Skip confirmation prompts

Configuration

The config file lives at ~/.config/devops-starter/config.yaml (respects $XDG_CONFIG_HOME).

# Where binaries are installed (must be in $PATH)
install_dir: ~/.local/bin

# Enable or disable tool groups
groups:
  languages: true
  containers: true
  kubernetes: true
  infra: true
  cloud: true
  rust_tools: true
  utilities: true

# Per-tool overrides
overrides:
  terraform:
    version: "1.7.5"     # Pin a specific version
  aws-cli:
    disabled: true       # Skip this tool entirely

Run devops-starter config init to generate the default config.

How Installation Works

devops-starter uses eget under the hood to handle binary downloads, archive extraction, and platform detection. eget is automatically bootstrapped on first run if not already present.

Every tool in the catalog has an InstallMode that determines how it is installed:

Install Modes

Mode Description Used by
eget Downloads from a GitHub release using eget <owner/repo>. eget automatically detects the correct asset for your OS/architecture and extracts the binary. 53 tools (k9s, fzf, ripgrep, lazygit, gh, etc.)
eget-url Downloads from a direct URL using eget <url>. Used for tools hosted outside GitHub releases but still downloadable as a single archive or binary. 8 tools (kubectl, helm, terraform, vault, consul, packer, age, firebase-cli)
custom Uses a legacy download/extract pipeline for tools that require post-install scripts or produce multiple binaries. 5 tools (aws-cli, azure-cli, gcloud-cli, docker, pulumi)
mise Delegates entirely to mise for language runtime management. Dynamic (from .mise.toml: go, python, node, etc.)

How eget mode works

For tools using eget mode, the installer runs:

eget <owner/repo> --tag v<version> --to <install-dir> [--asset <pattern>] [--file <binary>] [-q]

eget handles:

  • Matching the correct release asset for your OS and architecture
  • Downloading with HTTPS
  • Extracting tar.gz, tar.xz, zip archives (or placing raw binaries)
  • Finding the correct binary inside nested archive directories

How eget-url mode works

For tools not on GitHub (HashiCorp CDN, dl.k8s.io, etc.), the URL is resolved via a Go template and passed to eget:

eget <resolved-url> --to <install-dir> [--file <binary>] [-q]

How custom mode works

For the 5 tools requiring special handling (post-install scripts, multi-binary archives), devops-starter falls back to its built-in pipeline: download, verify checksum, extract archive, run post-install command.

Adding a new tool

When adding a tool to the registry, set the appropriate InstallMode:

// GitHub release (most common)
&tooldef.Tool{
    Name:        "mytool",
    Version:     "1.2.3",
    InstallMode: tooldef.InstallModeEget,
    Repo:        "owner/mytool",
    Asset:       "*linux*",  // optional: narrow asset selection
}

// Direct URL (non-GitHub CDN)
&tooldef.Tool{
    Name:        "mytool",
    Version:     "1.2.3",
    InstallMode: tooldef.InstallModeEgetURL,
    Format:      tooldef.FormatZip,
    URLTemplate: "https://releases.example.com/mytool/{{.Version}}/mytool_{{.OS}}_{{.Arch}}.zip",
}

See CONTRIBUTING.md for the full guide.

Tool Catalog

61 tools across 7 groups:

Group Tools
languages mise, + all runtimes from .mise.toml (e.g., go, python, node)
containers docker, docker-compose, nerdctl
kubernetes kubectl, helm, kustomize, k9s, kubectx, kubens, stern, argocd, flux, istioctl, cilium, kind, kubeseal, velero
infra terraform, opentofu, pulumi, packer, vault, consul
cloud aws-cli, eksctl
rust-tools bat, eza, fd, ripgrep, delta, zoxide, starship, tokei, hyperfine, procs, bottom, gitui, dust, bandwhich, sd, tealdeer, xh, yazi, atuin, zellij, just, watchexec
utilities jq, yq, fzf, direnv, age, sops, gh, trivy, lazygit, shellcheck, shfmt, task, neovim

Platform Availability

Most tools provide pre-built binaries for all four platforms. Exceptions:

Tool linux/amd64 linux/arm64 darwin/amd64 darwin/arm64
bat yes yes yes -
dust yes yes yes -
tokei yes yes yes -
procs - - yes yes
neovim yes - yes yes
trivy yes yes yes yes

All other tools support linux/amd64, linux/arm64, darwin/amd64, and darwin/arm64.

Want a tool added? See CONTRIBUTING.md for how to add tools to the registry.

Dotfiles

The dotfiles/ directory contains managed configuration files:

Directory Contents
zsh/ .zshrc, .zprofile
bash/ .bashrc, .bash_profile
shared/ Common aliases, environment variables, functions (sourced by both shells)
git/ .gitconfig (delta pager, histogram diff, rebase-on-pull), .gitignore_global
tmux/ .tmux.conf (Ctrl+a prefix, vim-style navigation)
starship/ starship.toml (DevOps-focused prompt with k8s, AWS, terraform context)
nvim/ init.lua + lazy.nvim plugin setup

Shell configs replace common coreutils with Rust alternatives (ls->eza, cat->bat, grep->rg, find->fd) and initialise starship, zoxide, direnv, atuin, and mise.

When linking, existing files are backed up to ~/.dotfiles.bak before being replaced with symlinks.

Project Structure

cmd/devops-starter/       Entry point (main package)
internal/
  cli/                    Cobra commands: setup, install, list, adopt, remove, status, dotfiles, doctor, config
  config/                 YAML configuration loading/saving
  dotfiles/               Symlink manager with backup/restore
  installer/              Install orchestration: eget backend, bootstrap, and legacy custom pipeline
  platform/               OS/arch/distro detection
  registry/               Tool definitions organised by group (with InstallMode annotations)
  state/                  Persistent state store for managed tools
  tui/                    Bubbletea interactive UI (full-screen, status bar, update check)
  updater/                Async update checker (GitHub Releases API)
pkg/tooldef/              Public types: Tool, Platform, Group, ArchiveFormat, InstallMode
configs/                  Default config template
docs/                     Documentation (setup wizard walkthrough, etc.)
dotfiles/                 Managed dotfiles (shell, git, tmux, starship, nvim)
scripts/                  Bootstrap install script
oci/                      Container test image definitions (Ubuntu, Arch)
platforms/                Bazel cross-compilation platform configs
bazel/                    Custom Bazel rules (shellcheck, golangci-lint) and macros
.github/workflows/        CI, release, and PR title enforcement workflows

Development

make help           # list all targets
make check          # fmt + vet + lint + test (full local validation)
make test-coverage  # tests with coverage report
make release        # cross-compile release binaries
make gazelle        # regenerate Bazel BUILD files
make setup          # install dev tools and pre-commit hooks

See CONTRIBUTING.md for the full development guide and ARCHITECTURE.md for design decisions.

Contributing

Contributions are welcome. Please read CONTRIBUTING.md before submitting a PR.

License

MIT - Copyright (c) 2026 Omar Gallo