Github a lancé lors de l’été 2021 un service payant appelé
Github Codespaces
. Ce service propose des conteneurs de développement dans le cloud, à la demande et facturé à la durée d’utilisation et d’inactivité.
Un conteneur de développement est un environnement de développement clé en main. Cela permet d’avoir un environnement complet sans installer sur votre poste vos librairies, dépendences, sdk, etc. Tout sera préinstallé directement dans le conteneur.
Ces conteneurs sont “jetables”. Vous pouvez en créer un nouveau en quelques clics et supprimer ceux que vous avez créés aussi facilement.
Pour en bénéficier il faut bien entendu que votre projet soit sur Github, et également être abonné à l’abonnement Teams (ou Enterprise) de Github. Et il vous faudra
activer
la fonctionnalité dans votre organisation.
Sous le capot
Comme rien n’est magique je vais vous expliquer ce qu’il y a derrière ce service.
Codespace ⇒ Docker
Qui dit conteneur dit généralement docker (même s’il y a des alternatives, comme
podman
par exemple) mais en l’occurrence c’est bien docker qui est utilisé par
Github Codespaces
.
Le conteneur par défaut contient déjà de quoi développer avec les technologies suivantes : Python, Node.js, JavaScript, TypeScript, C++, Java, .NET, PHP, PowerShell, Go, Ruby, and Rust.
Vous aurez ensuite accès à une image de ce container sur la branche de votre projet choisie à travers un
VSCode
dans votre navigateur. Il est aussi possible d’utiliser en VSCode classique avec le plugin
Github.codespaces
.
Code editor ⇒ VSCode
VScode, l’étoile montante des IDE, Open Source et poussé par Microsoft depuis 2015. Il y a de grandes chances que si vous lisiez ceci il soit déjà installé sur votre poste 💻
Vous pouvez synchroniser vos settings VSCode en vous connectant avec un compte Github ou Microsoft.
💸 Coût/Performances
Pour 8h d’activité avec un 8 core/16GB, cela revient à 5.76$.
Lorsque vous êtes inactif pendant 30 minutes, le Codespace se stoppe mais garde l’état de votre conteneur, donc vous ne perdrez pas votre code non commit/push 😉.
La facturation d’un Codespace inactif se fait à l’espace disque utilisé durant la période d’inactivité. Cela dépend donc de la taille de votre projet.
Tips
: Pensez à supprimer vos conteneurs inutilisés régulièrement depuis cette page
https://github.com/codespaces
. Votre compte en banque et la planète vous remercieront 🙂
⚙️ Configuration
Il est possible de configurer pour Codespace à votre guise.
Deux fichiers vous permettent de personnaliser le Codespace:
Un fichier .devcontainer/devcontainer.json ⇒ Personnaliser le Codespace et VSCode
Un fichier .devcontainer/Dockerfile ⇒ Personnaliser le conteneur docker
Vous pouvez configurer l’un ou l’autre ou les deux selon vos besoins.
Personnalisation du conteneur (.devcontainer/Dockerfile)
Vous pouvez très bien revoir complètement le conteneur pour subvenir à vos besoins plus spécifiques comme par exemple démarrer un conteneur de base de données à l’intérieur, spécifier les versions de vos langages de développement désirées ou installer des outils divers.
Petit exemple
# [Choice] Java version (use -bullseye variants on local arm64/Apple Silicon): 11, 17, 11-bullseye, 17-bullseye, 11-buster, 17-buster
ARG VARIANT="17-bullseye"
FROM mcr.microsoft.com/vscode/devcontainers/java:0-${VARIANT}
# [Choice] Node.js version: none, lts/*, 16, 14, 12, 10
ARG NODE_VERSION="none"
RUN if [ "${NODE_VERSION}" != "none" ]; then su vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi
Ce fichier Dockerfile permet de choisir la version Java qui vous intéresse. Par défaut c’est hélas encore un JDK 11 qui est disponible dans le Dockerfile de base, c’est pourquoi nous précisons ici un JDK 17.
À combiner avec ces paramètres dans le fichier devcontainer.json.
Personnalisation du Codespace (.devcontainer/devcontainer.json)
Vous pouvez préinstaller vos extensions favorites comme ceci dans le fichier devcontainer.json.
Tips
: Trouver le nom des extensions de votre VSCode avec cette commande
code --list-extensions
Port forwarding
Quand vous démarrez votre application, Codespace détecte automatiquement le port à forward (s’il est affiché dans les logs de démarrage de votre application) et le map, vous permettant ainsi d’y accéder avec une url du type :
Le cas échéant vous pouvez spécifier les ports à forward. Vous pouvez également renseigner un label et définir un comportement lorsque le port est automatiquement forward.
Par exemple,
notify
fera apparaitre un popup vous proposant d’ouvrir l’url.
Secrets
Codespace inclut un système de secrets, à configurer dans les settings Github de votre projet. Ces secrets sont mis à disposition en variable d’environnement du conteneur créé.
Très pratique pour ne pas commiter de secrets dans votre repository, même pour l’environnement de dev 😉
Note
: Les secrets sont injectés au premier lancement de votre Codespace, il faudra donc le supprimer et en recréer un nouveau si vous effectuez des changements.
dotfiles
Il est possible d’exécuter des scripts à certain moment du cycle de vie de votre conteneur, comme après la création ou le démarrage. C’est très pratique pour installer vos dépendences npm par exemple 🙂
Utilisation
🌎 Browser vs Web
Vous avez le choix entre utiliser l’environnement Web ou bien connecter votre VSCode local au conteneur de dev.
Il y a des différences notables, la principale étant la gestion des raccourcis claviers. En effet votre navigateur prend la main sur certains raccourcis ce qui est parfois assez gênant.
Il y a également moins de plugins compatibles sur la version web.
Il est possible d’exposer les ports de votre application soit à n’importe qui, soit uniquement aux membres de votre organisation. Par défaut la visibilité de votre port est privée.
Cette fonctionnalité s’avère très pratique pour partager avec vos collègues votre environnement de développement afin de leur présenter vos développements en cours.
🔒 Sécurité/Réseau
Si vous avez besoin d’accéder à des ressources derrière un réseau privé, vous pouvez le
faire
. La documentation à ce sujet est encore toute fraîche et elle n’existait pas lors de la mise en place de Codespace chez notre client (cf plus bas).
Le cycle de vie de votre Codespace
On peut distinguer 5 états différents : Création/Démarrage/Actif/Extinction/Inactif
Pas grand choses à dire si ce n’est qu’au bout d’un certain temps d’inactivité (
30 min par défaut
) votre Codespace passe en statut inactif et qu’il est possible d’exécuter des scripts lors d’un changement d’état (
postCreate, postStart
).
Cas d’usage client
Si je vous parle de ce sujet aujourd’hui c’est parce que j’ai pu le mettre en place chez un client d’Attineos.
Ce client développe un produit SaaS entièrement configurable. Un repository Github est créé pour configurer l’instance de chaque client. C’est une équipe d’analyste qui s’occupe de la configuration. Ils ne sont pas nécessairement familiers avec le développement web et les langages utilisés.
Nous leur mettons donc à disposition un environnement clé en main et avons configuré un script
postCreate.sh
qui installe les dépendences du monorepo, du projet frontend web et installe gradle dans la partie api.
Pour couronner le tout,
npm run dev
lancera simultanément l’API et le front end.
Grâce à Github Codespaces, nous n’avons pas besoin d’expliquer aux analystes comment installer un environnement ou comment configurer sa machine. Il est également très facile de passer d’un Codespace à un autre.
Pour l’équipe de développeur, cela nous permet d’éviter d’avoir autant de repositories que de client sur notre machine. En 3 clics, notre instance de dev avec l’environnement client est prête.
Un Codespace étant lié à une branche il est donc possible de développer sur plusieurs branches simultanément !
Petite comparaison avec la concurrence
Docker Development Environments (Preview)
Docker propose en preview une fonctionnalité appelée “Development Environments” qui semblerait être gratuite mais la fonctionnalité de partage semble payante.
Ce n’est pas vraiment un environnement virtuel dans le sens où tout tourne sur votre machine. Vous ne louer pas de la puissance de calcul dans un cloud.
Il faut avoir Docker Desktop d’installé sur son poste et Il n’y a pas d’image docker préconfigurée avec les technologies classiques.
Cette technologie s’adresse donc uniquement aux développeurs avec une bonne connaissance de docker.
Amazon AWS Cloud9
Amazon propose des environnements de développement virtualisés où vous devez installer tout ce dont vous avez besoin vous-même. Cela peut être pratique si vous avez besoin de puissance de calcul.
Vous ne pouvez coder qu’à travers le navigateur et leur IDE AWS Cloud9.
Ce service s’adresse à des utilisateurs avancés.
Conclusion
Personnellement j’adore vraiment le concept d’environnement de développement préconfiguré jetable. C’est vraiment pratique d’arriver sur un projet sans rien avoir à configurer.
J’ai toujours été contre les VDI (Virtual Desktop Infrastructure) pour les développeurs car je ne supporte pas la frustration liée à la latence, mais ici la latence est transparente étant donné qu’on ne stream pas un OS entier. Il vous suffit donc d’un navigateur web pour pouvoir développer et ça c’est plutôt génial !
Les plus
:
Depuis la mise en place en septembre 2021 la documentation a déjà bien évolué, c’est donc que le projet évolue vite et est très suivi.
Le partage de son environnement en deux clicks
Facilité de prise en main, même pour les non développeurs
Ce qui est améliorable
:
La durée de lancement : Actuellement à chaque création, un docker build est effectué, ce qui est lent, mais visiblement une
private preview
pour prébuilder votre Codespace est en cours depuis peu
Pouvoir exécuter un script avant la destruction du Codespace
Mieux gérer le feedback des erreurs d’exécution de ses scripts : Il faut ouvrir les logs soit même
Depuis cet été, et après plusieurs mois d'effort, nous sommes fiers d'annoncer que nous avons obtenu le label Numérique Responsable de niveau 1 (label NR1). Et c'est une excellente nouvelle ! Pourquoi cela ? Cette labellisation marque une étape importante dans...
Attineos s’engage auprès du Club Omnisports Région Elbeuvienne (CORE), une association sportive dynamique de la région regroupant près de 400 licenciés en Normandie.
C’est un terme que nous entendons peu et pourtant… Il est essentiel de démocratiser et de définir le concept d’accessibilité dans le domaine numérique.
Que signifie ce terme ? Réponse dans cet article !
Pour offrir les meilleures expériences, nous utilisons des technologies telles que les cookies pour stocker et/ou accéder aux informations sur l'appareil. Le consentement à ces technologies nous permettra de traiter des données telles que le comportement de navigation ou les identifiants uniques sur ce site. Ne pas consentir ou retirer son consentement peut affecter négativement certaines caractéristiques et fonctions.
Le stockage ou l’accès technique qui est utilisé exclusivement à des fins statistiques.
Le stockage ou l'accès technique qui est utilisé exclusivement à des fins statistiques anonymes. Sans assignation à comparaître, conformité volontaire de la part de votre fournisseur de services Internet ou enregistrements supplémentaires d'un tiers, les informations stockées ou récupérées à cette seule fin ne peuvent généralement pas être utilisées pour vous identifier.