Slide 1

Slide 1 text

— J'écris mes (pico) CLI en Java Pas vous ?

Slide 2

Slide 2 text

Mathieu Laude Cloud Native Developer Qui sommes-nous ? Kévin Toublanc Cloud Native Developer https://blog.wescale.fr/

Slide 3

Slide 3 text

— 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)

Slide 4

Slide 4 text

— 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

Slide 5

Slide 5 text

Une CLI ?

Slide 6

Slide 6 text

— 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

Slide 7

Slide 7 text

— Ça sert à quoi ? Un peu de vocabulaire 01 ➔ Manipuler le système d’exploitation ➔ Automatiser ➔ Accéder aux API ➔ Simplifier

Slide 8

Slide 8 text

— 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

Slide 9

Slide 9 text

— 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

Slide 10

Slide 10 text

— 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 ?

Slide 11

Slide 11 text

— 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 ?

Slide 12

Slide 12 text

— 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 🎉

Slide 13

Slide 13 text

— 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 ✅ ❌ ✅ ✅

Slide 14

Slide 14 text

— 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

Slide 15

Slide 15 text

— Quel langage ? 50 nuances de CLI 01 Temps de démarrage Langage interprété Langage compilé Environnement de développement Frameworks Tests

Slide 16

Slide 16 text

— 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

Slide 17

Slide 17 text

— 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

Slide 18

Slide 18 text

— 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

Slide 19

Slide 19 text

— 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 - …

Slide 20

Slide 20 text

— 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

Slide 21

Slide 21 text

— 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 - …

Slide 22

Slide 22 text

— 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

Slide 23

Slide 23 text

— 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

Slide 24

Slide 24 text

— 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); } }

Slide 25

Slide 25 text

— Quel langage ? 50 nuances de CLI 01 ➔ À chaque langage un framework adapté ➔ Comment on choisit ?

Slide 26

Slide 26 text

— 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 ✅ ✅ ✅ ✅ ✅ ✅

Slide 27

Slide 27 text

Quel langage choisir ? Et pourquoi Java ?

Slide 28

Slide 28 text

— Pourquoi Java Capitaliser sur les connaissances de l’équipe ♥ Human first 02

Slide 29

Slide 29 text

— 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

Slide 30

Slide 30 text

— Java en 2031 Vers l’infini et au delà 02 https://www.java.com/releases/fullmatrix/

Slide 31

Slide 31 text

— 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

Slide 32

Slide 32 text

Java ? Ça va être lent 😏

Slide 33

Slide 33 text

— 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

Slide 34

Slide 34 text

— 03 GraalVM on steroids Quid de la Dev Xperience ? ➔ Quel framework de développement ? ◆ Spring ◆ Micronaut ◆ Quarkus

Slide 35

Slide 35 text

— > quarkus dev > curl -s localhost:8080 | grep title -m1 code-with-quarkus - 1.0.0-SNAPSHOT Quarkus Késséssé ? ➔ Outil de développement ◆ Rechargement à chaud ◆ Tests unitaires en continu ◆ Intégration IDE 03

Slide 36

Slide 36 text

— Quarkus Une console de dev 03

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

Demo !!!! 😍

Slide 41

Slide 41 text

— 04 Quarkus & Picocli En pratique, ça donne quoi ? ➔ Développons une CLI ➔ Avec Quarkus ➔ Qui dit Bonjour ◆ En appelant un service REST

Slide 42

Slide 42 text

Conclusion

Slide 43

Slide 43 text

— 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

Slide 44

Slide 44 text

Références

Slide 45

Slide 45 text

— 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

Slide 46

Slide 46 text

Merci de votre attention. De façon constructive et bienveillante, évidemment ☺ Partagez vos feedbacks ! 🙏

Slide 47

Slide 47 text

— Sortez vos agendas Actualité 07 07 MARS 2023