Hlavní navigace

binenv: poslední binárka, kterou si do systému nainstalujete

2. 2. 2021
Doba čtení: 4 minuty

Sdílet

 Autor: Depositphotos
Některé utility se vyvíjí tak rychle, že je autoři distribucí je nestíhají zabalit do nativních distribučních balíčků. Utilita binenv je náhrada balíčkovacího systému právě pro programy, které se vyvíjí takhle bouřlivě.

V posledních letech se stalo u některých nástrojů – zejména v oblasti okolo operations, DevOps a cloudových služeb zvykem používat poslední verze programů.

Vývoj software je občas velmi bouřlivý, nová funkce programu stíhá druhou, třetí a další. Při spolupráci v týmu je pak potřeba řešit, kterou verzi používáme, což je občas zdrojem více či méně zábavných situací.

Obzvláště u aplikací napsaných v Go se tak nějak stalo zvykem nedodávat programy jako balíčky .RPM či .DEB, ale nabízet ke stažení jen staticky slinkovanou binárku.

Patří sem třeba oblíbený Terraform, Terragrunt a driftctl pro popis cloudové infrastruktury. V ekosystému okolo Kubernetes je to vidět ještě více – doporučovaným způsobem instalace kubectl, kustomize, helm, minikube, argocd, k9s nebo kubectx je právě stažení programu ze stránky z release stránky na GitHubu. Stejným způsobem se distribuují například i CLI nástroje pro práci s cloudovými službami DigitalOcean, GitHub či kompresor upx, prompt starship a pravděpodobně i spousta dalšího software o kterém jsem zatím neslyšel ani já, ani laskavý čtenář.

Mám pocit, že při instalaci na vlastní laptop se očekává, že v domovském adresáři připravíme adresář ~/.bin a do něj stáhneme připravené binárky Máme-li pak například více klientů s různými verzemi Terraformu, můžeme zkusit vytvořit adresář bin u projektů pro každého klienta.

Pokud se používané programy vyvíjí opravdu rychle, je výsledkem tohoto postupu spousta stažených souborů a středně velký chaos na disku. Slabší povahy dokonce začínají přemýšlet o tom, že pást ovce v Beskydech by nemusela být až tak špatná kariérní volba.

binenv nás zachrání!

Autoři utilitu binenv se rozhodli tuto smutnou situaci nějak vyřešit a vynalezli další utilitu, který tuhle nudnou práci udělá za nás.

Jak to funguje?

Instalace binenv

Instalace je jednoduchá – uděláme přesně tu věc, nad kterou jsem si na začátku článku posteskl. Stáhneme binenv do svého počítače (jako běžný uživatel) ze stránky binenv Release do dočasného adresáře.

cd /tmp
# choose your OS and arch please
wget -q https://github.com/devops-works/binenv/releases/latest/download/binenv_linux_amd64 -O binenv
chmod +x binenv

Po stažení binenv nainstalujeme:

./binenv update
./binenv install binenv

Instalací v domovském adresáři vznikne adresář ~/.binenv, do kterého se stáhla poslední binárka binenv z GitHubu. Program připravil symlinku ~/.binenv/binenv, která po spuštění spustí  binenv.

Pro pohodlné používání je ještě potřeba přidat cestu ~/.binenv do proměnné PATH. V .bashrc  i .zshrc  například

export PATH="${HOME}/.binenv:$PATH"

Pro ještě pohodlnější používání doporučuji zavolat i binenv completion, aby nám shell uměl napovídat.

#.bashrc
source <(binenv completion bash)

# .zshrc
source <(binenv completion zsh)
compdef _binenv binenv

Výborně, binenv máme nainstalovaný, ale co teď s ním? Instalaci dalšího programu si ukážeme třeba na ukázce kubectl  – „malého“ 40MB statického nástroje pro práci s API Kubernetes.

Instalace kubectl

binenv má v sobě uložené distribuce (distributions) – popisy toho, odkud se konkrétní nástroj má nainstalovat. Pokud tedy potřebujeme nainstalovat právě kubectl, je potřeba nejprve zaktualizovat seznam dostupných verzí pomocí

binenv update kubectl

… a potom nainstalovat poslední verzi kubectl.

binenv install kubectl

Pokud je potřeba z nějakého důvodu nainstalovat starší verzi, můžeme požádat binenv, aby nám poradil, které verze má k dispozici a pak nainstalovat tu konkrétní.

binenv versions kubectl
binenv install kubectl 1.19.5

Nástroj binenv v obou případech do adresáře ~/.binenv/binaries/ stáhne konkrétní verzi požadovaného nástroje.

Za zmínku stojí fakt, že binenv si v sobě nenese informace o tom, které verze instalovaných aplikací jsou k dispozici. V binenv  jsou uloženy odkazy na release stránky na GitHubu (či jiné úložiště) a při volání update se pomocí API GitHubu zjištuje, které verze jsou v současné době dostupné. Pokud tedy vyjde například nová verze kubectl, není potřeba pro její stažení aktualizovat  binenv.

Použití nainstalovaného kubectl

Na počítači teď máme dostupné požadované verze kubectl a v ~/.binenv/kubectl  je připravený wrapper, který spustí poslední verzi právě z  ~/binenv/binaries/kubectl/

Poslední verzi kubectl spustíme tak, jak je obvyklé – prostě napíšeme jméno skriptu a proměnná PATH a připravený wrapper zajistí, že se spustí poslední verze. Fakt.

kubectl version

Co když ale kvůli nějakému legacy projektu musíme použít starší verzi kubectl? binenv umí využít soubor .binenv.lock, ve kterém jsou popsané verze.

echo kubectl=1.19.5 >> .binenv.lock

V adresáři obsahujícím .binenv.lock se od této chvíle bude spouštět kubectl místo ve verzi 1.19.5 místo v poslední.

Jak je to udělané? V adresáři ~/.binenv/ je wrapper kubectl, který před spuštěním konkrétní verze kubectl hledá, jestli se v aktuálním (nebo rodičovských) adresářích nenachází soubor .binenv.lock. Pokud ho objeví, použije specifikovanou verzi. Jinak se použije poslední nainstalovaná verze.

Root obecny

EOF

binenv mne velmi zaujal. Po jeho nasazení jsem mohl vyčistit svůj adresář ~/.bin o nemalé množství binárních utilit, které se tam nastřádaly od posledního úklidu počítače.

Používání .binenv.lock pak výrazně snížilo šanci, že i zákazníkům nechtěně aktualizujeme například terraformové manifesty.

Autor článku

Věroš Kaplan pracuje jako nájemný správce serverů na volné noze. Před několika lety objevil kouzlo automatizace a už ho to nepustilo. Zastává názor, že nudné úkoly mají dělat počítače – a měly by se tedy používat i pro správu dalších počítačů.