-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Tech] Injection des variables d'env au runtime (#2715)
## Linked issues - Resolve #2714 - `import-meta-env` demande de ne pas utiliser un prefixe en `VITE_` pour éviter un clash avec Vite ---- - [ ] Tests E2E (Cypress)
- Loading branch information
Showing
21 changed files
with
666 additions
and
109 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
# Injection au runtime des variable d'env dans le frontend | ||
|
||
Date: 22/11/2023 | ||
|
||
## Statut | ||
|
||
Résolu | ||
|
||
## Contexte | ||
|
||
Lors du passage de `CRA` à `Vite`, on a perdu la possibilité d'injecter des variables d'environnements au frontend au runtime. | ||
|
||
Pour respecter les 12-factor app et avoir plus d'agilité dans la gestion des variables d'env, nous allons rajouter cette feature. | ||
|
||
Trois options : | ||
1. Utiliser `import-meta-env` qui injecte dans l'`ENTRYPOINT` docker du backend les variables | ||
2. Ajouter un controlleur `Index` dans le backend, qui retourne le contenu de `index.html` lans lequel il injecte des balises `meta` qui contiennent les variables | ||
3. Utiliser le script `env.sh`, qui injecte dans l'`ENTRYPOINT` docker du backend les variables dans le frontend avec le CLI `sed` | ||
|
||
### Utiliser `import-meta-env` | ||
|
||
Cette méthode utilise un fichier `.env.template` qui défini les variables à injecter dynamiquement et gére le développement `compile-time` et la production `runtime`. | ||
|
||
Un fichier `.env.example` permet de filtrer les variables à injecter dans le frontend. | ||
|
||
Il faut rajouter dans l'image docker finale le script `import-meta-env` (préalablement packagé avec `npx pkg`) pour effectuer l'injection dans le fichier `index.html`. | ||
|
||
Cette méthode nécessite de rajouter une nouvelle lib dans notre étape de build. | ||
|
||
### Ajouter un controlleur `Index` dans le backend | ||
|
||
Cette méthode demande: | ||
- D'ajouter les balises `meta` dans le payload retourné sur `/`. (i.e `<meta name="MAPBOX_KEY" content="${System.getenv("MAPBOX_KEY")}" />`) | ||
- De rendre les nom d'assets déterministes (i.e `/assets/index.js`) | ||
- Cela nous oblige à avoir la gestion du cache dans ce controlleur, avec par exemple un `hash=randomString` généré au démarrage | ||
- L'objet JS généré à la volée avec les balises `meta` ne sera pas typé | ||
- Il faut modifier l'env de dev pour avoir | ||
- un build `Vite` "watché" au lieu d'un run de dev watché par défaut | ||
- un `.setCacheControl()` dans le backend pour éviter le caching en dev | ||
|
||
### Utiliser le script `env.sh` | ||
|
||
Ce script utilise un object `env` pour stocker les variables (i.e): | ||
``` | ||
self.env = { | ||
REACT_APP_MONITORENV_URL: '__REACT_APP_MONITORENV_URL__' | ||
} | ||
``` | ||
|
||
Et un script au démarrage de l'image docker avec `ENTRYPOINT ["/home/monitorfish/env.sh"]` (i.e): | ||
``` | ||
sed -i 's#__REACT_APP_MONITORENV_URL__#'"$REACT_APP_MONITORENV_URL"'#g' /home/monitorfish/public/env.js | ||
``` | ||
|
||
- Cette méthode construit un objet `env` non-typé | ||
|
||
## Décision | ||
|
||
Nous rajoutons une injection au runtime des dépendances avec `import-meta-env`. | ||
|
||
Cet outil permet: | ||
1) De ne pas dupliquer la spécification des variables | ||
2) Ne change pas la façon de gérer les env var de `Vite`: `import.meta.env` | ||
|
||
## Conséquences | ||
|
||
Nos devons **obligatoirement** spécifier toutes les variables d'env dans le docker-compose lors du run de l'application `backend` (qui contient le frontend). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
FRONTEND_GEOSERVER_LOCAL_URL= | ||
FRONTEND_GEOSERVER_REMOTE_URL= | ||
FRONTEND_IS_DEV_ENV= | ||
FRONTEND_MAPBOX_KEY= | ||
FRONTEND_MONITORENV_URL= | ||
FRONTEND_OIDC_AUTHORITY= | ||
FRONTEND_OIDC_CLIENT_ID= | ||
FRONTEND_OIDC_ENABLED= | ||
FRONTEND_OIDC_REDIRECT_URI= | ||
FRONTEND_SENTRY_DSN= | ||
FRONTEND_SHOM_KEY= | ||
VITE_SMALL_CHAT_SNIPPET= |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.