Upgrade to Pro — share decks privately, control downloads, hide ads and more …

J'écris mes CLI en Java, pas vous ?

WeScale
January 20, 2023

J'écris mes CLI en Java, pas vous ?

Les interfaces en ligne de commandes (CLI) font partie de notre quotidien. Elles permettent un accès simple et automatisable à des fonctionnalités ou des services. Beaucoup d'entre elles sont écrites en Go, Python ou encore en Shell.

Mais que faire si vos équipes sont constituées de développeurs Java ? Devez-vous les former à un autre langage ? Sans divulgâcher le sujet : non. De nombreuses solutions s'offrent à vous, venez découvrir Java, Quarkus et Picocli en action !

WeScale

January 20, 2023
Tweet

More Decks by WeScale

Other Decks in Programming

Transcript

  1. Mathieu Laude Cloud Native Developer Qui sommes-nous ? Kévin Toublanc

    Cloud Native Developer https://blog.wescale.fr/
  2. — 01 Une CLI c’est quoi ? Sommaire Parce qu’il

    en faut un 00 02 Pourquoi Java ? 03 Mais Java c’est lent et c’est compliqué non ? 04 LA solution ultime (selon nous)
  3. — Avez-vous déjà utilisé les outils suivants (choix multiple) ?

    CLI is everywhere 00 1. curl 2. docker 3. kubectl 4. terraform 5. Aucun de ces outils
  4. — Définition Un peu de vocabulaire 01 Bref, c’est une

    commande dans un terminal “ une interface homme-machine dans laquelle la communication entre l'utilisateur et l'ordinateur s'effectue en mode texte ” https://fr.wikipedia.org/wiki/Interface_en_ligne_de_commande
  5. — Ça sert à quoi ? Un peu de vocabulaire

    01 ➔ Manipuler le système d’exploitation ➔ Automatiser ➔ Accéder aux API ➔ Simplifier
  6. — C’est quoi ? Anatomie d’une CLI 01 docker container

    run -i -t --name hello --rm bash echo Hello Touraine Tech 🎉 Des (sous) commandes Des options / drapeaux Des arguments positionnels Un exécutable
  7. — Les commandes Anatomie d’une CLI 01 docker container run

    kubectl create job Pourquoi ? - Séparation des domaines - Simplification Des (sous) commandes Soyez lisible et cohérents ! - Sur les nommages - Entre les commandes ? Plusieurs conventions - exécutable nom verbe - exécutable verbe nom
  8. — Les drapeaux Un peu de vocabulaire 01 -i -t

    --name hello --rm Des options / flags Plusieurs types de drapeaux - Courts -i -t / -it - Long --interactive --tty - Avec paramètres --name “Touraine Tech” - Interactifs --password ? On utilise quoi ?
  9. — Les drapeaux Un peu de vocabulaire 01 -i -t

    --name hello --rm Des options / flags Bonnes pratiques - Secrets : pensez interactif - Automatisation : pensez noms longs - La vie de tous les jours : venez comme vous êtes Soyez cohérents - Le même drapeau entre plusieurs commandes À ramener chez vous - On passe plus de temps à lire du code qu’à l’écrire ? On utilise quoi ?
  10. — Les arguments Un peu de vocabulaire 01 Arguments Positionnels

    - Liste de chaînes de caractères - Usage dépendant de la CLI Bonnes Pratiques - Préférer les drapeaux / sous commandes - Utiliser le moins possible Avis personnel : - Préférer une seule fonction pour les arguments bash:latest echo Hello Touraine Tech 🎉 Des arguments positionnels docker container run --image bash:latest --rm echo Touraine Tech 🎉
  11. — La bonne ligne de commande pour extraire une archive

    avec "tar" Il y a les bonnes CLI, et les mauvaises CLI… 01 1. tar -x -v -f archive.tar.zx 2. tar -xfv archive.tar.zx 3. tar xfv archive.tar.zx 4. tar -f archive.tar.zx -x -v ✅ ❌ ✅ ✅
  12. — On attend quoi d’une CLI ? La bonne CLI

    elle est… 01 Indispensable - Abstraction des concepts complexes - Visualisation des erreurs - Documentation - Complétion automatique - Vitesse d’exécution Les petits plus - Correction automatique des erreurs - Pages de manuel - Documentation web
  13. — Quel langage ? 50 nuances de CLI 01 Temps

    de démarrage Langage interprété Langage compilé Environnement de développement Frameworks Tests
  14. — Bash 50 nuances de CLI 01 Avantages - Simple

    Inconvénients - Distribution complexe - Tests Solution Native - getopts while getopts "n:t:" options; do case "${options}" in n) NAME=${OPTARG} ;; t) TIMES=${OPTARG} ;; :) echo "Error: -${OPTARG} requires an argument." ;; *) echo "Error unknown" ;; esac done
  15. — Bash 50 nuances de CLI 01 #!/bin/bash # #

    This is a rather minimal example Argbash potential # Example taken from http://argbash.readthedocs.io/en/stable/example.html # # ARG_OPTIONAL_SINGLE([option], [o], [optional argument help msg]) # ARG_OPTIONAL_BOOLEAN([print], , [boolean optional argument help msg]) # ARG_POSITIONAL_SINGLE([positional-arg], [positional argument help msg], ) # ARG_HELP([The general script's help msg]) # ARGBASH_GO # [ <-- needed because of Argbash echo "Value of --option: $_arg_option" echo "print is $_arg_print" echo "Value of positional-arg: $_arg_positional_arg " # ] <-- needed because of Argbash https://argbash.dev/ Outil - https://argbash.dev Fonctionnalités: - Gestion des arguments - Aide - Complétion Note - Génère 129 lignes
  16. — Python 50 nuances de CLI 01 parser = argparse.ArgumentParser(

    "argparse-cli" , description ="Some description" , exit_on_error=False) # positional argument parser.add_argument( 'filename') # option that takes a value parser.add_argument( '-c', '--count') # on/off flag parser.add_argument( '-v', '--verbose', action='store_true') args = parser.parse_args() print(args.filename, args.count, args.verbose) Avantages - Portable - Environnement riche - Testable Solution Native - argparse
  17. — Python 50 nuances de CLI 01 ## Click @click.command

    () @click.option('--count', default=1, help='Number of greetings.' ) @click.option('--name', prompt='Your name', help='The person to greet.' ) def hello(count, name): ## Typer def main( name: str, lastname: str=typer.Option( "", help="Last name ..."), formal: bool=typer.Option( False, help="Say hi formally." ), ): if __name__ == "__main__": typer.run(main) Libraries - Click - Typer Fonctionnalités - Completion - Sous commandes - Gestion d’erreur - Aide - …
  18. — GO 50 nuances de CLI 01 https://github.com/spf13/cobra https://pkg.go.dev/flag import

    "flag" var nFlag *int func main() { nFlag = flag.Int("n", 1234, "help message" ) flag.Parse() } Avantages - Portable - Compilation native - Environnement riche - Testable Solution Native - flags
  19. — GO 50 nuances de CLI 01 import "github.com/spf13/cobra" var

    nFlag int func main() { rootCmd := &cobra.Command{ Use: "cobra-cli" , Short: "short description" , Long: `Long message here` , Run: func(cmd *cobra.Command, args []string) { println(nFlag) }, } rootCmd.PersistentFlags ().IntVarP(&nFlag, "nFlag" , "n", 0, "nFlag description" ) err := rootCmd.Execute() if err != nil { return } } https://github.com/spf13/cobra https://pkg.go.dev/flag Libraries - cli - Cobra Fonctionnalités - Completion - Sous commandes - Gestion d’erreur - Aide - …
  20. — Java 50 nuances de CLI 01 import java.util.Arrays ;

    public class Main { public static void main(String[] args) { Arrays.stream(args) .peek(arg -> System.out.println("Aïe")) .toList(); } } Avantages - Portable - Environnement riche - Testable Pas de solution native
  21. — Java 50 nuances de CLI 01 Picocli - Naissance

    en 2017 - Création de CLI - Simple Environnement - JVM - Java / Scala / Groovy / Kotlin Librairie “riche” - Commandes / Sous commandes - Options / Validations - Gestion d’erreur - Aide - Auto complétion - Exécution - Couleur - Réutilisation - Traductions
  22. — Java Every main method deserves a picocli! 01 @TopCommand

    @Command(name = "sample-command" , description = "This is a super sample command" , mixinStandardHelpOptions = true ) public class GreetingCommand implements Runnable { @Option(names = {"-y", "--year"}, description = "Touraine Tech year" ) int year; @Parameters (defaultValue = "\uD83C\uDF89 ", description = "emoji") String emoji; @Override public void run() { System.out.printf("Hello Touraine Tech %d %s%n" , year, emoji); } }
  23. — Quel langage ? 50 nuances de CLI 01 ➔

    À chaque langage un framework adapté ➔ Comment on choisit ?
  24. — Le langage qui démarre “instantanément” Il y a les

    bonnes CLI, et les mauvaises CLI… 01 1. Go 2. Rust 3. Java 4. Node 5. Bash 6. Python ✅ ✅ ✅ ✅ ✅ ✅
  25. — Java en 2023 Un écosystème riche - Communauté -

    Plugins, framework - Outils Un calendrier de versions prévisible - 2 versions par an - 1 version LTS tous les 2 ou 3 ans - 8 ans de support pour 1 LTS Les atouts 02
  26. — Java en 2031 Vers l’infini et au delà 02

    https://www.java.com/releases/fullmatrix/
  27. — Java en 2023 Oui mais 02 “Java c’est lent”

    La JVM (Java Virtual Machine) : ➔ Exécute du bytecode compilé ➔ Abstrait le système sous-jacent ➔ Charge en mémoire le Java Runtime Environment (jre) ➔ Tourne plusieurs jours/mois/années
  28. — 03 Alternative à la JVM : GraalVM La JVM

    n’a pas le monopole du run ➔ Exécute aussi du Python, NodeJS, Ruby, … ➔ Choix du mode de compilation ◆ JIT : Just-In-Time ◆ AOT : Ahead-Of-Time ➔ Permet de compiler un binaire natif \o/ ◆ Plus de JVM ni de JRE à installer ➔ La JVM profite de certaines de ces améliorations
  29. — 03 GraalVM on steroids Quid de la Dev Xperience

    ? ➔ Quel framework de développement ? ◆ Spring ◆ Micronaut ◆ Quarkus
  30. — > quarkus dev > curl -s localhost:8080 | grep

    title -m1 <title>code-with-quarkus - 1.0.0-SNAPSHOT</title> Quarkus Késséssé ? ➔ Outil de développement ◆ Rechargement à chaud ◆ Tests unitaires en continu ◆ Intégration IDE 03
  31. — > quarkus build > ls -l target/ quarkus-app/quarkus-run.jar quarkus-app/lib/

    Quarkus Késséssé ? ➔ Outil de compilation ◆ fast jar (défaut) ◆ uber jar ◆ image de conteneur ◆ binaire natif 03
  32. — > quarkus create app --help Create a Quarkus application

    project. [...] > quarkus create cli --help Create a Quarkus command-line project. [...] Quarkus Késséssé ? ➔ Générateur de code ◆ app : application Web ◆ cli : application CLI 03
  33. — > quarkus extension add picocli [SUCCESS] ✅ Extension io.quarkus:quarkus-picocli

    has been installed Quarkus ♥ Picocli Le combo ➔ Dépendance out-of-the-box ◆ par défaut lors du quarkus create cli ◆ ajout simple pour une app ➔ Également intégré à Micronaut et Spring Boot 03
  34. — 04 Quarkus & Picocli En pratique, ça donne quoi

    ? ➔ Développons une CLI ➔ Avec Quarkus ➔ Qui dit Bonjour ◆ En appelant un service REST
  35. — Conclusion Le meilleur des 3 mondes 05 1. La

    CLI, c’est la vie ◦ Peut remplacer une IHM d’admin ◦ Ne pas négliger la conception 2. Java, le langage qui fait foi ◦ Pérennisation des compétences ◦ Ne pas ré-apprendre un nouveau langage 3. Quarkus + Picocli, et c’est parti ! ◦ Développement efficient sans effort ◦ Compilation native pour plus de perf
  36. — 06En complément https://clig.dev/ – CLI Guidelines https://quarkus.io/guides/command-mode-reference – Guide

    de référence Quarkus CLI https://quarkus.io/guides/picocli Guide de référence de l’extension Quarkus Picocli https://quarkus.io/guides/building-native-image Guide de référence de la compilation native Quarkus https://www.graalvm.org/22.1/reference-manual/native-image/Limitations/ Limitation de la compilation native Java https://kubernetes.io/docs/concepts/workloads/controllers/job/ Kube Jobs https://kubernetes.io/docs/concepts/workloads/pods/ephemeral-containers/ Kube Ephemeral Containers Nos références