.. _prog-e3-getting-started: **************************** Installation et premiers pas **************************** Suivre ce cours nécessite un environnement de travail opérationnel. Nous allons installer ici les outils nécessaires : - Docker Desktop pour disposer d'un environnement de travail reproductible ; - Visual Studio Code pour éditer les fichiers sources et les compiler/exécuter depuis le terminal intégré ; - Git pour la synchronisation dans le cloud. Puis créer l'environnement de travail dans lequel nous allons écrire/exécuter nos programmes. .. include:: misc-04-docker.rst .. include:: misc-05-vscode.rst .. include:: misc-06-git.rst Les labs ======== Ce cours est accompagné de labs qui permettent de mettre en pratique les concepts abordés. Ces labs sont disponibles dans un repo hébergé sur le serveur GitLab de l'ESIEE. Forker le repo des labs ----------------------- Forker un repo c'est copier un repo existant sur Gitlab pour en créer une copie parfaite dans son espace GitLab personnel. Il s'agit ici de créer une copie du repo commun dans votre espace GitLab personnel pour pouvoir travailler dessus sans interférer avec les travaux des autres étudiants, ni avec le repo commun. Connectez vous sur https://git.esiee.fr/ avec vos identifiants ESIEE Ouvrez le repo https://git.esiee.fr/esiee-cs/e3-programmation-labs-student, faites un fork en renseignant les champs suivants : - Project name : e3-programmation-labs-student - Project URL : https://git.esiee.fr//e3-programmation-labs-student - Branches to include : All branches - Visibility level : Private - Fork project .. tip:: ```` représente ici le login ESIEE. Par exemple, l'élève ``Adam Labrosse`` a pour login ``labrossa`` et son repo est disponible à l'URL ``https://git.esiee.fr/labrossa/e3-programmation-labs-student`` Vous disposez maintenant de votre propre repo GitLab dans votre espace personnel. C'est dans cet espace que vous allez travailler SSH --- Le workflow va nécessiter des échanges entre votre machine hôte et votre repo GitLab personnel. Pour cela, il est nécessaire de configurer un accès sécurisé entre les deux. C'est le rôle du protocole `SSH (Secure SHell) `_ qui permet d'authentifier les machines et de protéger les communications grâce au chiffrement. .. quiz:: quizz-ssh :title: SSH - Quel est le rôle du protocole SSH dans les échanges entre votre machine hôte et GitLab ? :quiz:`{"type":"SC","answer":"b","values":"a,b,c,d"}` - a) Compresser les fichiers avant leur transfert - b) Authentifier les machines et protéger les communications grâce au chiffrement - c) Accélérer la connexion Internet - d) Remplacer le protocole HTTP - Lorsqu'un utilisateur génère une paire de clés SSH, quel fichier doit-il copier sur le serveur ou dans son compte GitLab ? :quiz:`{"type":"SC","answer":"b","values":"a,b,c,d"}` - a) La clé privée - b) La clé publique - c) Les deux clés - d) Aucun des deux - Pourquoi la clé privée ne doit-elle jamais être transmise au serveur lors d'une authentification SSH ? :quiz:`{"type":"SC","answer":"b","values":"a,b,c,d"}` - a) Parce qu'elle est trop volumineuse - b) Parce que seule la clé publique est utilisée pour vérifier que le client possède bien la clé privée correspondante - c) Parce que le serveur la possède déjà - d) Parce qu'elle est recréée à chaque connexion - Que se passe-t-il si un utilisateur accepte sans vérification la clé publique d'un serveur inconnu lors de la première connexion ? :quiz:`{"type":"SC","answer":"c","values":"a,b,c,d"}` - a) Rien de particulier - b) La connexion devient plus rapide - c) Il risque de faire confiance à un attaquant qui se fait passer pour le serveur légitime - d) Sa clé privée est automatiquement envoyée au serveur - Dans une authentification par clé publique, laquelle des affirmations suivantes est correcte ? :quiz:`{"type":"SC","answer":"b","values":"a,b,c,d"}` - a) La clé privée est envoyée au serveur pour être comparée. - b) Le serveur vérifie que le client possède la clé privée correspondant à la clé publique enregistrée. - c) Le serveur génère une nouvelle paire de clés à chaque connexion. - d) Les clés publique et privée doivent être stockées sur le serveur. - Quel est l'avantage principal d'une authentification SSH par paire de clés par rapport à une authentification uniquement par mot de passe ? :quiz:`{"type":"SC","answer":"a","values":"a,b,c,d"}` - a) Elle permet de se connecter automatiquement sans saisir de mot de passe à chaque fois (si la clé est acceptée). - b) Elle supprime le chiffrement des communications. - c) Elle ne nécessite plus de compte utilisateur sur le serveur. - d) Elle permet à plusieurs utilisateurs de partager la même clé privée. Pour bénéficier d'une connexion sécurisée entre votre machine hôte et votre repo GitLab personnel, il est nécessaire de générer une paire de clés SSH sur votre machine hôte et d'ajouter la clé publique dans votre compte GitLab. Générer une paire de clés SSH sur votre machine hôte .................................................... Consulter `Use SSH keys with GitLab`_ dont un résumé est donné ci dessous. Ouvrir un terminal ``Git Bash`` (Windows) ou ``bash`` (Linux) sur votre machine hôte et suivre les instructions ci dessous. .. figure:: images/prog-e3-create-ssh-keys.drawio.png :alt: SSH keys :align: center .. tip:: Voilà un résumé des commandes à exécuter et leur signification. Le caractère ``~`` représente le répertoire racine de l'utilisateur :: ls ~/.ssh # lister le contenu du répertoire ~/.ssh mkdir -p ~/.ssh # créer le répertoire ~/.ssh s'il n'existe pas cat ~/.ssh/id_ed25519.pub # afficher la clé publique si elle existe ssh-keygen -t ed25519 # générer une nouvelle paire de clés SSH Copier la clé publique dans votre compte GitLab ............................................... Il existe maintenant une paire de clés SSH sur votre machine hôte. L'étape suivante consiste à copier la clé publique dans votre compte GitLab. Un résumé de la procédure décrite dans `Use SSH keys with GitLab`_ est donné ci dessous. - Sign in to GitLab. - In the upper-right corner, select your avatar. - Select Edit profile. - In the left sidebar, select Access > SSH keys. - Select Add new key. - In the Key box, paste the contents of your public key - In the Title box, type a description, like Work Laptop or Home Workstation. Vérifier la connexion SSH avec le serveur ......................................... Exécuter la commande suivante dans un terminal de votre machine hôte pour vérifier que la connexion SSH avec le serveur GitLab est opérationnelle :: ssh -T git@git.esiee.fr Lors de la première connexion, votre machine hôte ne connait pas le serveur et vous devez manuellement accepter la clé publique du serveur. Le message affiché dans le terminal est semblable à celui ci (le hostname, l'adresse IP et la clé seront ceux du serveur GitLab de l'ESIEE) :: The authenticity of host 'git.esiee.fr (xxx.xxx.xxx.xxx)' can't be established. ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. Are you sure you want to continue connecting (yes/no)? You should receive a welcome message. Si la connexion SSH est opérationnelle, vous devez recevoir un message de bienvenue du serveur semblable à celui ci :: Welcome to GitLab, @! Cloner le repo des labs dans votre espace personnel --------------------------------------------------- Vous disposez à cette étape de votre propre repo dans votre espace personnel GitLab et d'une connexion SSH active. Il est maintenant nécessaire de le cloner sur votre machine hôte pour pouvoir travailler dessus. Pour cela, ouvrir un terminal sur la machine hôte, se placer dans le répertoire ``e3-programmation`` créé précédemment, puis exécuter la commande suivante :: git clone git@git.esiee.fr:/e3-programmation-labs-student.git . .. tip:: Si vous rencontrez des problèmes pour établir la connexion SSH avec le serveur GitLab, vous pouver utiliser le protocole HTTPS. Une authentification par mot de passe sera alors nécessaire. git clone https://git.esiee.fr//e3-programmation-labs-student.git L'environnement de travail est résumé dans le schéma ci dessous. .. figure:: images/prog-e3-getting-started-fork-clone.drawio.png :alt: Cloner le repo :align: center .. important:: Ce repo est susceptible d'être modifié par l'enseignant (ajout ou modification de labs) au cours du semestre. Vous en serez averti par un message du LMS. Pour récupérer les modifications, il faut établir la connexion entre le repo local et le repo upstream (une seule fois):: git remote add upstream https://git.esiee.fr/esiee-cs/e3-programmation-labs-student.git puis, à chaque fois que vous voulez récupérer les modifications :: git fetch upstream # récupérer les modifications du repo upstream git merge upstream/main # fusionner les modifications dans le repo local Validation de l'environnement ============================= Pour vérifier que l'environnement de travail est opérationnel sur la machine hôte, nous allons écrire un premier programme simple dans les deux langages que nous allons utiliser dans ce cours. Ouvrir VS Code sur la machine hôte : - ``File > Open Folder...`` puis sélectionner le répertoire de travail ``e3-programmation-labs-student`` ; - Sélectionner ``Reopen in Container`` pour lancer le container Docker. Cette opération peut prendre quelques minutes la première fois que le container est lancé, car il faut télécharger l'image Docker et installer les outils nécessaires. Les accès suivants sont plus rapides. L'environnement de travail est prêt. .. exercice:: Premier programme C (sans IA) Il est nécessaire que VS Code soit démarré sur la machine hôte, pointe vers le répertoire ``e3-programmation-labs-student`` et que le container Docker soit lancé. Créer un fichier :file:`exercices/hello.c` et y placer le code source du programme C ci dessous. .. code-block:: c :linenos: #include int main(){ printf("Hello World !\n"); return 0; } Dans un terminal, compiler et exécuter le programme pour vérifier que l'environnement de travail est opérationnel :: $ gcc -std=c99 -Wall -Wextra hello.c -o hello $ ./hello Hello World ! .. exercice:: Premier programme Python (sans IA) Il est nécessaire que VS Code soit démarré sur la machine hôte, pointe vers le répertoire ``e3-programmation-labs-student`` et que le container Docker soit lancé. Créer un fichier :file:`exercices/hello.py` et y placer le code source du programme Python ci dessous. .. code-block:: python :linenos: print("Hello World !") Dans un terminal, exécuter le programme pour vérifier que l'environnement de travail est opérationnel :: $ python3 hello.py Hello World ! .. exercice:: Synchronisation avec le repo distant Il est nécessaire que VS Code soit démarré sur la machine hôte, pointe vers le répertoire ``e3-programmation-labs-student`` et que le container Docker soit lancé. Les fichiers ``hello.c`` et ``hello.py`` ont été créés dans le repo local qui est donc "en avance" sur le repo distant (il contient des modifications qui ne sont pas sur le repo distant). Il est donc nécessaire de synchroniser ces deux repos. Dans un terminal, depuis la racine du répertoire de travail, exécuter les commandes suivantes :: $ git add . # ajouter tous les fichiers modifiés à l'index Git $ git commit -m "add hello.c and hello.py" # enregistrer les modifications dans le repo local $ git push Vérifier que le repo distant est bien à jour en vous connectant sur votre compte GitLab et en ouvrant le repo ``e3-programmation-labs-student``. Les fichiers ``hello.c`` et ``hello.py`` doivent être présents. ✨ Si vous rencontrez des difficultés, soumettez les messages d'erreur à l'IA. .. quiz:: quizz-01 :title: Validation de l'environnement - Pour exécuter le code Python enregistré dans le fichier ``program.py``, on utilise la commande :quiz:`{"type":"FB","answer":"python3 program.py", "size":21}` - Pour compiler le code C enregistré dans le fichier ``program.c``, on utilise la commande :quiz:`{"type":"FB","answer":"gcc -std=c99 -Wall -Wextra program.c -o program", "size":55}` - Pour exécuter le programme généré à l'étape précédente on utilise la commande :quiz:`{"type":"FB","answer":"./program", "size":9}` pour exécuter le programme compilé. - Pour ajouter des fichiers à l'index Git, on utilise la commande :quiz:`{"type":"FB", "flags":"fuzzy","answer":"git add", "size":7}` - Pour enregistrer les modifications dans le repo local, on utilise la commande :quiz:`{"type":"FB", "flags":"fuzzy","answer":"git commit", "size":10}` - L'option ``-m`` de la commande :quiz:`{"type":"FB", "flags":"fuzzy","answer":"git commit", "size":10}` permet de spécifier un message explicatif - Pour mettre à jour le repo distant avec les modifications locales, on utilise la commande :quiz:`{"type":"FB", "flags":"fuzzy","answer":"git push", "size":8}` - Chaque modification importante doit être synchronisée avec le repo via :quiz:`{"type":"FB", "flags":"fuzzy","answer":"git", "size":3}` - Sur Windows, pour disposer d'un vrai noyau Linux, il faut installer :quiz:`{"type":"FB", "flags":"fuzzy","answer":"WSL2", "size":4}` - Pour initialiser un répertoire de travail dans VS Code, on utilise :quiz:`{"type":"FB", "flags":"fuzzy","answer":"File > Open Folder", "size":16}` - Pour afficher le terminal dans VS Code, on utilise :quiz:`{"type":"FB", "flags":"fuzzy","answer":"View > Terminal", "size":14}` .. _Use SSH keys with GitLab: https://docs.gitlab.com/user/ssh/