Julien Philippon

Automatiser l'installation d'un projet

Dans une agence, nous avons une multitude de projets plus ou moins complexes, et chacun d’entre eux ont des spécificités. J’attache une importance à l’automatisation du lancement de ceux-ci. Le test ultime est de faire un git clone, puis de lancer le projet à l’aide d’un script.

Cela peut être simple sur certains projets, comme ReactJS par exemple, par contre c’est bien souvent côté back ou c’est plus complexe, avec les fichiers de configuration, les versions de l’environnement (php / node), etc…

Heureusement, Docker permet de résoudre la question de version. Un fichier docker-compose aux petits oignons, un Dockerfile ISO avec la prod. Je ne détaille pas comment faire cela ici, vous trouverez plein de doc selon vos besoins.

Pour ma part, j’y ajoute un fichier install.sh à la racine, qui permet de lancer tout ce qui est nécessaire pour faire tourner le projet. Par exemple, sur le fichier suivant, l’utilisateur a juste besoin de docker sur sa machine, aucune autre dépendance est nécessaire puisque nous nous appuyons sur des images toutes prêtes (pour node, composer et minio dans ce cas).

#!/bin/bash

# Pour cibler le chemin en fonction de l'OS
[[ "$(uname -s)" == "Linux" ]] && VOLUME_APP=$(pwd) || VOLUME_APP=$(pwd -W)

# Import des variable d'environnement
. .env

# Faire quelques actions dans les fichiers
docker run ${CMD_OPTS} -v "$VOLUME_APP:/app" php:7.4-cli bash -c "cp /app/public/web/.htaccess_development /app/public/web/.htaccess"


# Installation des paquets nodeJS
docker run ${CMD_OPTS} -v "$VOLUME_APP:/app" node:14 sh -c "cd /app && npm i"


# Installation des vendors pour un projet PHP
docker run ${CMD_OPTS} -v "$VOLUME_APP:/app" composer bash -c "cd /app/public/ && composer install --ignore-platform-reqs"

# Démarrage de minio
docker-compose up -d minio

echo "Wait minio started..."
sleep 5

echo "Create S3 bucket s3.${URL}"
docker run --network=host -v "$VOLUME_APP/data/.mc:/root/.mc" --rm
minio/mc config host add myminio http://minio.${URL} user password
docker run --network=host -v "$VOLUME_APP/data/.mc:/root/.mc" --rm minio/mc mb --ignore-existing myminio/s3.${URL}
docker run --network=host -v "$VOLUME_APP/data/.mc:/root/.mc" --rm minio/mc policy set download myminio/s3.${URL}

# Démarrage du reste du projet
docker-compose up

Ce script est bien sûr à adapter selon le contexte du projet.

Idéalement, intégrer à cela aussi des fixtures afin d’avoir des données toutes prêtes pour faciliter le développement. Dans mes projets perso, je n’hésite pas à générer environ 100K d’entrées dans la base de données, afin d’optimiser les performances dès le début du développement projet.

Si mon projet comporte plusieurs parties (api, fixtures, cron, front) séparées dans des repositories différents, je préfère faire un projet git parent qui les englobe tous avec des submodules et un seul fichier docker-compose.yml à la racine qui lance la totalité du projet.

Lorsqu’un nouveau développeur intègre le projet ou que vous souhaitez le lancer sur une nouvelle machine, il suffit de le cloner et lancer le script. Vous ne devez pas mettre plus de 5min à le lancer.

Pensez à mettre à jour le script et le Dockerfile en fonction de l’évolution du projet et intégrez un petit fichier README pour donner les indications à vos collègues ;).