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.
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.