50 पॉइंट द्वारा xguru 2024-09-03 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • डेवलपमेंट टीम के लिए संगठन के ज्ञान को इकट्ठा करने और सुरक्षित रखने का एक उपयोगी तरीका है उपयोगी snippets, scripts, या workflows के संग्रह को लगातार बढ़ाना
  • इसलिए कई repositories में Makefile, bash scripts जैसी चीज़ें बनाई जाती हैं
  • लेकिन पूरे संगठन में उपयोगी tools install करना, boilerplate code generate करना, या ऐसे जटिल AWS commands चलाना जिन्हें कोई याद नहीं रखता, यह कैसे किया जाए?
    • Slack या Shopify जैसी कुछ कंपनियों के अपने internal CLI होते हैं
    • आधुनिक terminal Warp में workflows को document और share करने की सुविधा होती है
  • संगठन के आंतरिक उपयोग के लिए CLI आसानी से बनाया जा सकता है। उदाहरण के तौर पर acme नाम की कंपनी के लिए CLI बनाकर देखते हैं

CLI डिज़ाइन आवश्यकताएँ

  • acme <command> के जरिए कहीं से भी command चलाने के लिए एक common entry point हो
    • हर developer किसी खास repository में पहले जाए बिना, कहीं से भी acme <command> चलाकर command trigger कर सके
  • developers नए commands आसानी से contribute कर सकें
  • acme update से नए versions आसानी से deploy किए जा सकें
  • cross-platform support हो (उदाहरण: acme download something चलाने पर Linux में curl, Windows में Invoke-WebRequest इस्तेमाल हो)
  • acme list से उपलब्ध commands की सूची और उनका छोटा description देखा जा सके

just का उपयोग करके project शुरू करना

  • just make जैसा है, लेकिन commands चलाने पर विशेष रूप से केंद्रित एक tool है
  • यह cross-platform support देता है और platform-specific commands भी चला सकता है
  • दूसरे विकल्पों में Slack का magic-cli (अगर आपको Ruby अच्छी तरह आती है तो शुरुआत के लिए बेहतरीन) या make शामिल हैं

project सेट करना

  • just install करें। यहाँ दिए गए निर्देशों का पालन करें
  • ~/acme/cli folder बनाएं और root में नीचे दिया गया justfile जोड़ें:
default:  
  just --list  
  
# arch와 os 이름 표시   
os-info:  
  echo "Arch: {{arch()}}"  
  echo "OS: {{os()}}"  
  • just के docs में commands को "recipes" कहा जाता है
  • अगर recipes के बिना just चलाया जाए, तो justfile की पहली recipe चलती है। आम तौर पर पहली recipe का नाम default रखना एक सामान्य pattern है
$ just  
just --list  
Available recipes:  
    default  
    os-info # Show arch and os name  
  • default recipe, just list चलाती है। यह सभी recipes की सूची और comments दिखाती है
  • default recipe को hide करना बेहतर है
  • recipe चलाने पर हर command, execute होने से पहले print होती है। @ prefix से इस output को हटाया जा सकता है। यह Makefile जैसा ही है
[private]  
@default:  
  just --list  
  
# arch와 os 이름 표시  
@os-info:  
  echo "Arch: {{arch()}}"  
  echo "OS: {{os()}}"  

acme alias बनाना

  • acme <command> के रूप में चलाने के लिए .bashrc में alias जोड़ें
    alias acme='just --justfile ~/acme/cli/justfile'  
    
  • source ~/.bashrc या exec bash से नया alias लोड करें

नई recipe लिखना

सरल recipe

  • AWS IAM user/role जानकारी लाना
    @aws-id:  
      aws sts get-caller-identity  
    
    • जिन commands को कोई याद नहीं रखता, उन्हें सरल बनाना शायद internal CLI का सबसे बड़ा use case है
    • यह मानते हुए कि awscli cross-platform है, यह recipe जहाँ से भी call की जाए, काम करेगी

platform-specific recipe

  • systemd जैसे tool वाले snippets केवल उन developers को दिखें जो Linux machine इस्तेमाल कर रहे हों
  • [linux] attribute का उपयोग करके recipe को केवल Linux में expose किया जा सकता है
[linux]  
@list-systemd-services:  
  systemctl list-units --type=service  

cross-platform recipe

  • folder size निकालने को Windows और Linux में अलग-अलग implement करना
    [windows]  
    [no-cd]  
    get-folder-size path:  
      (Get-ChildItem "{{path}}" -Recurse -Force | Measure-Object -Property Length -Sum).Sum / 1MB  
    
    [linux]  
    [no-cd]  
    get-folder-size path:  
      du -sh {{path}}  
    

script recipe

  • recipe में पूरा script embed किया जा सकता है
  • Shebang(#!) से शुरू होने वाली recipe अलग file के रूप में save होकर run होती है
  • यह तब उपयोगी है जब workflow में थोड़ी अधिक जटिल logic चाहिए, जैसे control flow (if-else, loops), variables को store और manipulate करना आदि
# Say hello world in sh  
hello-world-sh:  
  #!/usr/bin/env sh  
  hello='Yo'  
  echo "$hello from a shell script!"  
  • इसका मतलब है कि आप शक्तिशाली scripting capabilities वाली programming language का उपयोग कर सकते हैं। कुछ काम Bash की तुलना में Python में आसान हो सकते हैं
# scale jpg image by 50%  
[no-cd]  
scale-jpg path:  
  #!/usr/bin/env python3  
  
  import PIL.Image  
  image = PIL.Image.open("{{path}}")  
  factor = 0.5  
  image = image.resize((round(image.width * factor), round(image.height * factor)))  
  image.save("{{path}}.s50.jpg")  
  • हर developer के कंप्यूटर में Python install हो, यह ज़रूरी नहीं है, और install होने पर भी pillow मौजूद हो यह भी ज़रूरी नहीं। nix का उपयोग करके dependencies सहित script चलाया जा सकता है:
# scale jpg image by 50%  
[no-cd]  
scale-jpg path:  
  #! /usr/bin/env nix-shell  
  #! nix-shell -i python3 -p python3Packages.pillow  
  
  import PIL.Image  
  ...  

recipes deploy करना

  • अपना deployment mechanism बनाने के बजाय git का उपयोग करें
  • GitHub पर repository बनाएं और अब तक का काम push करें
$ git init  
$ git commit -m "first commit"  
$ git branch -M main  
$ git remote add origin git@github.com:acme/cli.git  
$ git push -u origin main  
  • अब जिस किसी के पास इस repository की access है, वह PR बनाकर changes contribute कर सकता है
  • acme update recipe से git pull को automate करें
# Update the Acme CLI  
@update:  
  git fetch  
  git checkout main  

documentation

  • internal tool की सफलता के लिए adoption बहुत महत्वपूर्ण है, और नए users को tool install और explore करने में मदद देने वाला अच्छा user guide ज़रूरी है
  • README में installation और usage के निर्देश दें
# Acme CLI  
  
## Prerequisites  
  
`just`: Install just [here](https://github.com/casey/just/blob/master/README.md#installation)  
  
## Installation  
  
Clone this repo:  
...  
  
Set up the `acme` alias:  
...  
  
## Usage  
  
List all available recipes:  
...  
  • अब यह Acme Corp के सभी developers के उपयोग के लिए तैयार है!
  • कंपनी के भीतर Slack message पोस्ट करके सभी को इसे आज़माने के लिए प्रोत्साहित किया जा सकता है, और हर व्यक्ति अपने snippets भी जोड़ सकता है

अतिरिक्त सुविधाएँ

  • completion फीचर एक ऐसा mechanism है जिसमें TAB key दबाने पर subcommands, file paths, options आदि अपने-आप complete हो जाते हैं
  • ज़्यादातर shells यह सुविधा देते हैं, और ज़्यादातर बड़े CLI tools completion install करने का तरीका भी देते हैं
    • Python का Click, Golang का Cobra, Rust का clap जैसे ज़्यादातर प्रमुख CLI frameworks अपने-आप completion generate कर सकते हैं
  • Just, just --completion <shell>. चलाकर completion generate कर सकता है

1 टिप्पणियां

 
bus710 2024-09-03

काफी समय से लगता है कि कंपनी के अंदरूनी DX की डिज़ाइन platform engineering के लिए एक महत्वपूर्ण विषय रही है।