{"id":229510,"date":"2022-01-12T10:23:18","date_gmt":"2022-01-12T09:23:18","guid":{"rendered":"https:\/\/blog.jetbrains.com\/space\/2022\/01\/12\/a-deep-dive-into-space-dev-environments\/"},"modified":"2022-04-27T15:52:29","modified_gmt":"2022-04-27T14:52:29","slug":"immersion-dans-les-environnements-de-developpement-de-space","status":"publish","type":"space","link":"https:\/\/blog.jetbrains.com\/fr\/space\/2022\/01\/12\/immersion-dans-les-environnements-de-developpement-de-space\/","title":{"rendered":"Immersion dans les environnements de d\u00e9veloppement de Space"},"content":{"rendered":"<p><a class=\"ek-link\" href=\"https:\/\/www.jetbrains.com\/fr-fr\/space\/\" target=\"_blank\" rel=\"noopener\">JetBrains Space<\/a> permet de lancer des environnements de d\u00e9veloppement \u00e0 distance. Une puissante machine virtuelle d\u00e9di\u00e9e ex\u00e9cute un conteneur Docker qui a acc\u00e8s au code source du projet et fournit des composants de backend \u00e0 votre \u00e9diteur de code local. Vous pouvez <strong>utiliser ces machines distantes pour d\u00e9velopper au lieu de votre ordinateur local.<\/strong><\/p>\n<p><a href=\"https:\/\/blog.jetbrains.com\/fr\/space\/2021\/11\/29\/decouvrez-le-developpement-a-distance-avec-space\/\">L&#8217;utilisation des environnements de d\u00e9veloppement de Space offre de nombreux avantages<\/a>, notamment la possibilit\u00e9 de <strong>standardiser l&#8217;environnement de d\u00e9veloppement<\/strong> <strong>de votre \u00e9quipe<\/strong> pour \u00e9viter de perdre du temps \u00e0 configurer les machines locales. De plus, vous pouvez <strong>ex\u00e9cuter des t\u00e2ches de pr\u00e9paration<\/strong> et cr\u00e9er un snapshot contenant toutes les d\u00e9pendances de packages n\u00e9cessaires et un index de projet pr\u00e9configur\u00e9 pr\u00eat \u00e0 \u00eatre utilis\u00e9.<\/p>\n<p>Dans cet article, nous allons vous pr\u00e9senter les diff\u00e9rentes options de personnalisation des environnements de d\u00e9veloppement de Space et vous expliquer <strong>comment<\/strong> <strong>personnaliser un environnement en fonction des besoins de votre \u00e9quipe<\/strong>.<\/p>\n<p>\u00a0<\/p>\n<h1>Cr\u00e9er un environnement de d\u00e9veloppement\u00a0<\/h1>\n<p>Avant de vous faire d\u00e9couvrir les options de personnalisation, faisons un point rapide sur le <a href=\"https:\/\/blog.jetbrains.com\/fr\/space\/2021\/11\/29\/decouvrez-le-developpement-a-distance-avec-space\/\">processus de d\u00e9veloppement dans les environnements de Space<\/a>.<\/p>\n<p>Pour commencer, vous pouvez lancer un environnement de d\u00e9veloppement dans tout r\u00e9f\u00e9rentiel Git appartenant \u00e0 votre organisation Space en cliquant sur <strong>Open in IDE<\/strong>. Vous pouvez aussi cr\u00e9er un environnement de d\u00e9veloppement pour une demande de fusion, ce qui \u00e9vite d&#8217;avoir \u00e0 cloner du code manuellement et de t\u00e9l\u00e9charger des d\u00e9pendances sur votre ordinateur local pour v\u00e9rifier et tester les modifications.<\/p>\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-216826\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/01\/01-create-dev-environment.png\" alt=\"Cr\u00e9er des environnements de d\u00e9veloppement dans Space\" width=\"840\" height=\"472\" \/><\/figure>\n<p><em>Conseil : vous pouvez <\/em><a href=\"https:\/\/blog.jetbrains.com\/space\/2020\/02\/06\/mirroring-an-external-git-repository-in-space\/\"><em>migrer ou mettre en miroir un r\u00e9f\u00e9rentiel Git depuis GitHub ou BitBucket<\/em><\/a><em> et le mettre \u00e0 disposition dans Space, ce qui inclut toutes les branches et balises, ainsi que les commits. Cela permet de pouvoir utiliser les environnements de d\u00e9veloppement de Space avec un r\u00e9f\u00e9rentiel existant.<\/em><\/p>\n<p>Nous proposons trois types d&#8217;instances de machine virtuelle en fonction de la taille de votre projet et du niveau de puissance requis : Regular (4 c\u0153urs de processeur, 8 Go de RAM), Large (8 c\u0153urs de processeur, 16 Go de RAM) ou Extra Large (16 c\u0153urs de processeur, 32 Go de RAM).<\/p>\n<p>Ensuite, vous devez s\u00e9lectionner l&#8217;IDE que vous souhaitez utiliser : <a href=\"https:\/\/www.jetbrains.com\/fr-fr\/idea\/\" target=\"_blank\" rel=\"noopener\">IntelliJ IDEA<\/a> avec <a href=\"https:\/\/www.jetbrains.com\/fr-fr\/remote-development\/gateway\/\" target=\"_blank\" rel=\"noopener\">JetBrains Gateway<\/a> (qui peut \u00eatre t\u00e9l\u00e9charg\u00e9 avec <a href=\"https:\/\/www.jetbrains.com\/fr-fr\/toolbox-app\/\" target=\"_blank\" rel=\"noopener\">Toolbox App<\/a>) ou <a href=\"https:\/\/www.jetbrains.com\/fr-fr\/fleet\/\" target=\"_blank\" rel=\"noopener\">JetBrains Fleet<\/a>. La prise en charge d&#8217;autres IDE bas\u00e9s sur IntelliJ sera effective prochainement.<\/p>\n<p>Vous remarquerez \u00e9galement deux autres \u00e9l\u00e9ments dans cette bo\u00eete de dialogue : le <strong>snapshot de pr\u00e9paration<\/strong> et le <strong>conteneur dev<\/strong> servant \u00e0 d\u00e9marrer votre IDE distant. Dans l&#8217;exemple ci-dessus, il n&#8217;y a aucun snapshot de pr\u00e9paration n&#8217;est pr\u00e9sent (nous y reviendrons dans un moment) et l&#8217;<a href=\"https:\/\/www.jetbrains.com\/help\/space\/set-up-a-dev-evnvironment.html#using-the-default-dev-environment\" target=\"_blank\" rel=\"noopener\">image Docker par d\u00e9faut<\/a> sert de conteneur pour le d\u00e9marrage de votre IDE.<\/p>\n<p>Lorsque vous cliquez sur <strong>Create<\/strong>, Space lance votre IDE dans le cloud. Quand la machine virtuelle est configur\u00e9e et que le backend de l&#8217;IDE est pr\u00eat, JetBrains Gateway (ou Fleet) s&#8217;ouvre et s&#8217;y connecte.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-216837\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/01\/02-dev-environment-running.png\" alt=\"Ex\u00e9cuter des environnements de d\u00e9veloppement dans IntelliJ IDEA (et JetBrains Gateway)\" width=\"2560\" height=\"1440\" \/><\/figure>\n<p>Le backend IntelliJ IDEA s&#8217;ex\u00e9cute \u00e0 pr\u00e9sent dans le cloud de Space et la connexion est assur\u00e9e par un client l\u00e9ger : <a href=\"https:\/\/www.jetbrains.com\/fr-fr\/remote-development\/gateway\/\" target=\"_blank\" rel=\"noopener\">JetBrains Gateway<\/a>.<\/p>\n<p>Pour la plupart des projets, cela suffit pour commencer \u00e0 coder. Mais dans cet exemple pr\u00e9cis, il manque plusieurs \u00e9l\u00e9ments :<\/p>\n<ul>\n<li>Il faut encore t\u00e9l\u00e9charger le bon JDK, comme indiqu\u00e9 par l&#8217;avertissement dans l&#8217;\u00e9diteur.<\/li>\n<li>Il faut ex\u00e9cuter <code>mvnw compile<\/code> pour t\u00e9l\u00e9charger les d\u00e9pendances et synchroniser le projet dans l&#8217;IDE.<\/li>\n<\/ul>\n<p>Cela suffirait probablement pour un environnement de d\u00e9veloppement \u00e0 usage unique, mais si toute votre \u00e9quipe doit travailler dans ce r\u00e9f\u00e9rentiel, mieux vaut personnaliser l&#8217;environnement et s&#8217;assurer que toutes les d\u00e9pendances sont pr\u00e9sentes d\u00e8s le d\u00e9but. Voyons comment proc\u00e9der !<\/p>\n<h2>Personnalisation du Dockerfile de l&#8217;environnement de d\u00e9veloppement<\/h2>\n<p>Par d\u00e9faut, Space ex\u00e9cute votre environnement de d\u00e9veloppement en utilisant l&#8217;<a href=\"https:\/\/www.jetbrains.com\/help\/space\/set-up-a-dev-evnvironment.html#using-the-default-dev-environment\" target=\"_blank\" rel=\"noopener\">image de conteneur par d\u00e9faut<\/a> bas\u00e9e sur le syst\u00e8me d&#8217;exploitation Ubuntu et incluant Git, cURL, Docker, Docker Compose et OpenJDK.<\/p>\n<p>Pour installer les outils et biblioth\u00e8ques dont vous avez besoin, vous pouvez ajouter un Dockerfile personnalis\u00e9 \u00e0 votre projet. Selon l&#8217;IDE que vous utiliserez, vous devrez cr\u00e9er <code>.\/.jb-gateway\/Dockerfile<\/code> (pour IntelliJ IDEA avec JetBrains Gateway) ou <code>.\/.fleet\/Dockerfile<\/code> (pour Fleet).<\/p>\n<p>Dans le cas de ce projet, nous allons personnaliser l&#8217;environnement en le basant sur Ubuntu 20.04, et installer plusieurs outils de ligne de commande, parmi lesquels Git, curl et Docker. Nous allons \u00e9galement ajouter plusieurs versions d&#8217;OpenJDK et utiliser la version 16 par d\u00e9faut afin que l&#8217;environnement de d\u00e9veloppement puisse l&#8217;utiliser.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"dockerfile\" data-enlighter-theme=\"wpcustom\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">FROM ubuntu:20.04\n\nENV DEBIAN_FRONTEND=noninteractive\nENV LC_ALL=C.UTF-8\n\nRUN apt-get update &amp;&amp; apt-get install -y apt-utils apt-transport-https\n\nRUN apt-get install -y \\\n  # Utilities \\\n  curl unzip wget software-properties-common socat man-db gnupg2 pass lsof \\\n  # VCS \\\n  git \\\n  # JVM \\\n  openjdk-8-jre-headless openjdk-11-jdk-headless openjdk-16-jdk-headless openjdk-17-jdk-headless maven \\\n  # Docker\n  docker docker-compose \\\n  &amp;&amp; rm -rf \/var\/lib\/apt\/lists\/*\n\n\nENV JAVA_HOME=\/usr\/lib\/jvm\/java-16-openjdk-amd64\n<\/pre>\n<p>L&#8217;ajout d&#8217;un Dockerfile personnalis\u00e9 est soumis \u00e0 plusieurs conditions\u00a0:<\/p>\n<ul>\n<li>Le syst\u00e8me d&#8217;exploitation doit \u00eatre une distribution Linux bas\u00e9e sur glibc (par exemple, CentOS 7+, Debian 9+ ou Ubuntu 20.04+).<\/li>\n<li>Vous devez installer Git, OpenSSH (si vous souhaitez utiliser un r\u00e9f\u00e9rentiel Git distant) et <code>lsof<\/code> (si vous avez besoin de transfert de ports dans l&#8217;IDE).<\/li>\n<li>Le conteneur doit s&#8217;ex\u00e9cuter en tant que racine (sans utilisateur non racine dans le Dockerfile).<\/li>\n<\/ul>\n<p>Veuillez noter que le Dockerfile est sp\u00e9cifique \u00e0 la branche. Cela permet notamment de tester les personnalisations dans une autre branche sans que cela n&#8217;affecte les autres d\u00e9veloppeurs de votre \u00e9quipe, et de mettre \u00e0 jour les outils dans une branche de fonctionnalit\u00e9.<\/p>\n<p>Lorsque vous validez et envoyez en push ce Dockerfile personnalis\u00e9 vers votre r\u00e9f\u00e9rentiel de projet, Space l&#8217;utilisera comme image de base lors de la cr\u00e9ation d&#8217;un nouvel environnement de d\u00e9veloppement dans cette branche.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-217353\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/01\/03-customize-dockerfile.png\" alt=\"Dockerfile personnalis\u00e9\/conteneur Docker pour un environnement de d\u00e9veloppement Space \u00e0 distance\" width=\"2560\" height=\"1440\" \/><\/figure>\n<p>Une fois cet environnement de d\u00e9veloppement personnalis\u00e9 lanc\u00e9, vous verrez que la bonne version du JDK sera accessible pour l&#8217;IDE. Toutefois, les projets IntelliJ IDEA et Maven doivent toujours \u00eatre synchronis\u00e9s. C&#8217;est l\u00e0 qu&#8217;intervient le script de pr\u00e9paration.<\/p>\n<h2>Pr\u00e9paration de l&#8217;environnement de d\u00e9veloppement<\/h2>\n<p>Vous pouvez r\u00e9duire le temps n\u00e9cessaire \u00e0 l&#8217;IDE pour r\u00e9soudre les d\u00e9pendances du projet, cr\u00e9er des index et ex\u00e9cuter d&#8217;autres activ\u00e9s en arri\u00e8re-plan, en cr\u00e9ant un snapshot de pr\u00e9paration. Dans notre exemple, l&#8217;ex\u00e9cution de <code>mvnw compile<\/code> et l&#8217;indexation du projet nous aideraient \u00e0 obtenir un environnement de d\u00e9veloppement pr\u00eat \u00e0 \u00eatre utilis\u00e9.<\/p>\n<p>Les snapshots de pr\u00e9paration sont cr\u00e9\u00e9s par <a href=\"https:\/\/www.jetbrains.com\/fr-fr\/space\/features\/software-development.html#a-automation\" target=\"_blank\" rel=\"noopener\">Space Automation<\/a>. En ajoutant un fichier <code>.space.kts<\/code>, vous pouvez non seulement configurer l&#8217;int\u00e9gration continue (CI) pour votre projet, mais aussi la fa\u00e7on dont l&#8217;environnement de d\u00e9veloppement devrait \u00eatre pr\u00e9par\u00e9.<\/p>\n<p>Voici un exemple de fichier <code>.space.kts<\/code> d\u00e9finissant une t\u00e2che qui s&#8217;ex\u00e9cute toutes les nuits, t\u00e9l\u00e9charge toutes les branches Git, puis ex\u00e9cute les \u00e9tapes de cr\u00e9ation d&#8217;un snapshot de pr\u00e9paration avec IntelliJ IDEA :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"wpcustom\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">job(\"Dev Environment Warmup - Gateway\") {\n    startOn {\n        schedule { cron(\"0 5 * * *\") }\n    }\n\n    git {\n        depth = UNLIMITED_DEPTH\n        refSpec = \"refs\/*:refs\/*\"\n    }\n\n    warmup(ide = Ide.IJGateway) {\n        scriptLocation = \"warmup.sh\"\n    }\n}<\/pre>\n<p>Le param\u00e8tre <code>scriptLocation<\/code> est facultatif. S&#8217;il est omis, Space Automation clone le r\u00e9f\u00e9rentiel Git de votre projet et g\u00e8re l&#8217;indexation du projet dans l&#8217;IDE. S&#8217;il est ajout\u00e9, vous pouvez cr\u00e9er un script de pr\u00e9paration, par exemple <code>warmup.sh<\/code>, et ex\u00e9cuter <code>mvnw compile<\/code> pour t\u00e9l\u00e9charger toutes les d\u00e9pendances Maven dans votre snapshot de pr\u00e9paration, ou encore ex\u00e9cuter <code>npm install<\/code>. Voici un exemple de script de pr\u00e9paration <code>warmup.sh<\/code> :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"wpcustom\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#!\/bin\/bash\n.\/mvnw compile<\/pre>\n<p>Le script <code>warmup.sh<\/code> doit \u00eatre valid\u00e9 dans votre r\u00e9f\u00e9rentiel avec des autorisations d&#8217;ex\u00e9cution. Pour ce faire, ex\u00e9cutez <code>git update-index --chmod=+x warmup.sh<\/code>.<\/p>\n<p>Une fois que Space Automation a termin\u00e9 le travail de pr\u00e9paration, les nouveaux environnements de d\u00e9veloppement ainsi g\u00e9n\u00e9r\u00e9s utilisent le Dockerfile personnalis\u00e9 que nous avons cr\u00e9\u00e9 plus t\u00f4t, et montent le snapshot de pr\u00e9paration que nous venons de cr\u00e9er, avec les index de projet et les d\u00e9pendances pr\u00eats \u00e0 l&#8217;emploi.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-216865\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/01\/04-warmup-script.png\" alt=\"Environnement de d\u00e9veloppement avec snapshot de pr\u00e9paration\" width=\"2560\" height=\"1440\" \/>\n<figcaption>Si vous devez r\u00e9soudre des probl\u00e8mes li\u00e9s \u00e0 un travail de pr\u00e9paration, vous pouvez utiliser Space Automation pour trouver le journal contenant toutes les \u00e9tapes qui ont \u00e9t\u00e9 ex\u00e9cut\u00e9es, ainsi que leur sortie sur la console.\u00a0<\/figcaption>\n<\/figure>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-217341\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/01\/05-warmup-automation2.png\" alt=\"Journaux d'un environnement de d\u00e9veloppement dans Space\" width=\"2560\" height=\"1440\" \/><\/figure>\n<p>D&#8217;autre part, vous pouvez g\u00e9rer et supprimer les snapshots dont vous n&#8217;avez plus besoin via le menu <strong>Dev Environments<\/strong> du projet.<\/p>\n<h2>Image de conteneur, snapshot de pr\u00e9paration ou les deux ?<\/h2>\n<p>Nous avons vu comment personnaliser l&#8217;image de conteneur d&#8217;un environnement de d\u00e9veloppement et comment cr\u00e9er un snapshot de pr\u00e9paration. Mais o\u00f9 faut-il ex\u00e9cuter tel ou tel type de t\u00e2che ?<\/p>\n<p>De mani\u00e8re g\u00e9n\u00e9rale, la configuration de l&#8217;environnement et du syst\u00e8me d&#8217;exploitation se fait avec une image de conteneur personnalis\u00e9e, alors que les travaux de pr\u00e9paration sont destin\u00e9s aux t\u00e2ches propres au projet, telles que le t\u00e9l\u00e9chargement des d\u00e9pendances binaires et la pr\u00e9paration de l&#8217;IDE pour votre projet.<\/p>\n<h2>Conclusion<\/h2>\n<p>L&#8217;utilisation d&#8217;images de conteneurs personnalis\u00e9es vous permet de standardiser l&#8217;environnement de d\u00e9veloppement de votre \u00e9quipe et de gagner du temps. De plus, en cr\u00e9ant un snapshot de pr\u00e9paration\u00a0 incluant les d\u00e9pendances de package t\u00e9l\u00e9charg\u00e9es et les index de projet d\u00e9j\u00e0 g\u00e9n\u00e9r\u00e9s, vous pouvez commencer \u00e0 travailler avec l&#8217;environnement de d\u00e9veloppement plus rapidement.<\/p>\n<p><a href=\"https:\/\/www.jetbrains.com\/fr-fr\/space\/#sign-up-popup\" target=\"_blank\" rel=\"noopener\"><strong>Essayez Space et ses environnements de d\u00e9veloppement !<\/strong><\/a> Nous avons h\u00e2te de savoir ce que vous en pensez !<\/p>\n\n\n<p><em>Auteur de l&#8217;article original en anglais :<\/em><\/p>\n\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":813,"featured_media":229513,"comment_status":"closed","ping_status":"closed","template":"","categories":[1401],"tags":[447,91,1038,6495],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/space\/229510"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/space"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/types\/space"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/users\/813"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/comments?post=229510"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/space\/229510\/revisions"}],"predecessor-version":[{"id":243407,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/space\/229510\/revisions\/243407"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/229513"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=229510"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=229510"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=229510"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=229510"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}