Tuto Front JS • Variabilisation pour multi-environnements
La plupart des frameworks JS rend difficile l’application du principe DevOps « Build once, Deploy many« , ce qui signifie « Construisez-la une seule fois et déployez la dans tous vos environnements en y injectant la configuration propre à cet environnement ».
En effet, lors de l’utilisation d’un fichier .env, le contenu de celui-ci est packagé dans l’application au moment du build de celle-ci et minifié. Ce qui rend difficile sa modification après coup, lors du démarrage de l’application.
De plus, l’application étant exécutée dans un navigateur et non sur un serveur d’application, le concept même des variables d’environnement ne s’applique pas.
Il est cependant possible, dans la plupart des cas, de contourner ces problèmes en utilisant les propriétés du navigateur, notamment l’objet window du DOM.
Dans cet article, l’Elosien Gérald fait le point et vous livre les étapes clés.
Variabilisation du projet
Voici les étapes à suivre :
Dans le dossier public du projet, créer un fichier config.js. Celui-ci contiendra les propriétés que l’on veut déclarer. Par exemple :
window.VUE_APP_API_URL=https://monapplication/api;
window.VUE_APP_AUTH_URL=https://keycloak/auth;
Le dossier public contient généralement un fichier index.html qu’il faut modifier pour charger le fichier config.js
<html lang="">
<head>
...
<script src="/config.js" type="text/javascript"></script>
...
<title><%= htmlWebpackPlugin.options.title %></title>
Enfin, modifier le code de l’application pour utiliser les propriétés déclarées. Par exemple, en vuejs :
- Remplacer const apiUrl = process.env.VUE_APP_API_URL ;
- Par const apiURL = window.VUE_APP_API_URL ? window.VUE_APP_API_URL : process.env.VUE_APP_API_URL;
À ce stade, il est possible de surcharger la configuration par défaut au démarrage de l’application en remplaçant le fichier config.js.
Docker – Utilisation des variables d’environnement
Il est tout à fait possible d’utiliser les variables d’environnement d’un conteneur pour constituer les fichiers config.js au démarrage de celui-ci.
Pour cela, en prenant l’exemple d’un conteneur nginx, nous allons :
1. Créer, dans le dossier public, un fichier config.js.template qui servira de modèle pour constituer le fichier config.js
2.Créer un script create_config_js.sh qui :
- lit le fichier config.js.template
- regarde s’il y a une variable d’environnement correspondante, pour chaque propriété contenue dans ce fichier
- injecte la valeur trouvées dans le fichier config.js
#!/bin/bash
###############################
#
# Ce script génère le fichier config.js
# à partir des variables d'environnement
#
# Il lit les variables présentes dans config.template.js.
# Si cette varible existe en tant que variables d'environnement
au démarrage de nginx,
# il l'ajoute au fichier config.js accompagné de sa valeur
#
###############################
SRC=/usr/share/nginx/html/config.template.js
DST=/usr/share/nginx/html/config.js
# Vérifie que le fichier source existe
if [ -z $SRC ] || [ ! -e "$SRC" ]; then
echo "Le fichier source '$SRC' n'existe pas"
exit 1
fi
OUTPUT="// fichier généré"
# Lire chaque ligne du fichier source et remplacer les variables
d'environnement
while IFS="" read -r line || [ -n "$line" ]; do
use_line=$line
# Si une ligne contient "window.", récupérer la variable
d'environnement correspondante
if [[ $line =~ "window." ]]; then
ENVIRONMENT_VARIABLE_NAME=`echo $line | sed -re 's/window\.
(.*)\s*\=(.*);/\1/g'`
value=${!ENVIRONMENT_VARIABLE_NAME}
# Si la variable est définie, remplacer la ligne par
la valeur de l'environnement
if [[ ${value} && ${value-x} ]]; then
use_line="window.$ENVIRONMENT_VARIABLE_NAME = '$value';"
fi
fi
# Ajouter la ligne traitée au contenu de sortie
OUTPUT="$OUTPUT\n$use_line"
done <$SRC
# Écrire la sortie dans le fichier de destination
echo -en $"$OUTPUT" > $DST
Ajouter ce script dans le conteneur et faire en sorte qu’il soit exécuté au démarrage :
# BUILD Final image step
################################
FROM nginxinc/nginx-unprivileged:1.27
USER root
COPY create_config_js.sh /docker-entrypoint.d/
COPY --from=node-step /app/dist /usr/share/nginx/html
COPY default.conf /etc/nginx/conf.d/
RUN chown -R nginx:nginx /usr/share/nginx/html && \
chown nginx:nginx /etc/nginx/conf.d/default.conf && \
chmod 755 /docker-entrypoint.d/create_config_js.sh
USER nginx
CMD ["nginx", "-g", "daemon off;"]
Comment débugger si ça ne fonctionne pas ?
- Regarder le contenu de config.js dans le conteneur : est-il bien alimenté ?
- Regarder le code source de la page : le fichier config.js est-il bien chargé ?
- Utiliser les outils de debug du navigateur : il est possible d’interroger le contenu des propriétés