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. J'écris mes
    (pico)
    CLI en Java
    Pas vous ?

    View Slide

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

    View Slide


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

    View Slide

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

    View Slide

  5. Une CLI ?

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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




    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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






    View Slide

  27. Quel langage choisir ?
    Et pourquoi Java ?

    View Slide

  28. — Pourquoi Java
    Capitaliser sur les
    connaissances de
    l’équipe

    Human first
    02

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  32. Java ?
    Ça va être lent 😏

    View Slide


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

    View Slide


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

    View Slide


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

    View Slide

  36. — Quarkus
    Une console de dev
    03

    View Slide


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

    View Slide


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

    View Slide


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

    View Slide

  40. Demo !!!! 😍

    View Slide


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

    View Slide

  42. Conclusion

    View Slide

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

    View Slide

  44. Références

    View Slide


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

    View Slide

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

    View Slide

  47. — Sortez vos agendas
    Actualité
    07
    07 MARS 2023

    View Slide