Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fusion de dora-back et dora-front en un monorepo dora #8

Merged
merged 2,807 commits into from
Oct 23, 2024
Merged

Conversation

ggounot
Copy link
Contributor

@ggounot ggounot commented Oct 22, 2024

🍣 Contexte / problème

💡 Cette pull request est la mise en œuvre de l'ADR pour passer d'un multirepo (front + back) à un monorepo.

Cette PR fusionne les dépôts dora-back et fora-front dans un seul dépôt unifié dora.

🍔 Solution / réalisation

🏁 TL;DR

  • Fusion des historiques de commits avec le contenu de dora-back dans le répertoire back et le contenu de dora-front dans front ;
  • Copie de la configuration dependabot du back avec ajout de configuration pour le front ;
  • Intégration des workflows GitHub de CI du back et du front ;
  • Mise à jour du script post_compile pour prendre en compte le sous-répertoire back pour Scalingo ;
  • Mise à jour du script release.sh ;
  • Mise à jour du fichier README.md.

🏺 Import et fusion des entrepôts dora-back et dora-front

🔑 Nous avons utilisé la commande git subtree. Celle-ci permet d’ajouter le contenu d’un autre repository dans un sous-dossier sans perturber l’historique ni provoquer de conflits avec l’existence d’un dossier .git ou .gitignore.

# Récupération du dépôt "dora" afin de réaliser les opérations en local
git clone https://github.com/gip-inclusion/dora.git
cd dora

# Création d'une branche de travail temporaire
git checkout -b temp-branch

# Import des sources et commits de "dora-back" (via la commande "git subtree")
git remote add dora-back https://github.com/gip-inclusion/dora-back.git
git fetch dora-back
git subtree add --prefix=back dora-back main

# Idem pour "dora-front"
git remote add dora-front https://github.com/gip-inclusion/dora-front.git
git fetch dora-front
git subtree add --prefix=front dora-front main

# Vérification de l'historique
git log --all --graph --oneline --decorate

# Publication de la branche sur GitHub (avec création de cette PR)
git push

🤖 Dependabot

Nous avons repris la configuration Dependabot de dora-back, que nous avons enrichi au passage pour la partie front.

Il a suffit de déplacer le fichier ~/back/.github/dependabot.yml pour le remonter à ~/.github/dependabot.yml en y ajoutant une section dédiée à npm (pour le front Sveltekit).

🏭 CI / GitHub Actions

Nous avons décidé de créer 2 fichiers :

  • ~/.github/workflows/back-ci.yml pour le back
  • ~/.github/workflows/front-ci.yml pour le front

La plus gros de la manœuvre a été de préfixer certains chemins en fonction de l'app (/front ou /back).

Nous avons privilégié l'emploi de la propriété working-directory plutôt que l'emploi de la commande cd [back|front].

🔥 Nous avons rencontré un souci d'exécution des workflows. Cela tenait au fait que l'option "Allow only organisation actions to execute" était coché. Nous avons opté pour l'option "Allow organisation and GitHub actions to execute".

⚙️ Scalingo

Côté Scalingo, il a suffi, dans un premier temps, d'ajouter aux 2 applications staging la variable d'environnement PROJECT_DIR spécifiant le répertoire concerné (back ou front) :

  • dora-back-staging : PROJECT_DIR=back
  • dora-front-staging : PROJECT_DIR=front

Nous avons rencontré une grosse résistance pour l'application back, car il y avait un script bin/post_compile (étape post compile dans le buildpack lifecycle).

La solution était toute simple : il suffisait d'indiquer le sous-répertoire /back dans le script.

Nous en avons profité pour améliorer un tantinet ledit script pour coller un peu plus aux bonnes pratiques de rédaction d'un script shell.

⚠️ Il faudra ajouter les mêmes variables pour les applications de production avant le déploiement du dépôt unifié !

🎁 Script de release

La modification du script a été assez simple. Nous avons simplement supprimé les paramètres possibles et nous sommes contentés d'appeler la méthode deploy_repo() avec le paramètre "dora".

🧹 Issues et Pull requests

Par chance, les issues n'étaient pas utilisées sur les dépôts dora-back et dora-front.

Pour ce qui est des pull requests, dans la mesure où il y en avait peu, nous avons pris le parti de les refaire à la main, en réimportant les branches associées.

⚠️ Après discussion, il nous est apparu plus simple et fiable de d'abord fusionné cette pull request et la nouvelle architecture monorepo, avant de songer à importer les branches des anciens dépôts.

# Exemple d'import de la branche dora-back de migration de Inclusion Connect vers Pro Connect (dora-back/pro-connect-migration)
git subtree pull --prefix=back https://github.com/gip-inclusion/dora-back.git pro-connect-migration

Cette commande crée un commit de merge. Nous avons cherché à nous en passer, mais ça semblait compliqué ou bancal. Nous avons sacrifié la perfection de l'historique Git sur l'hôtel du pragmatisme opérationnel.

Les descriptions et discussions ont été recopiées manuellement, avec mention des PR originales.

Organisation

Nous avons décidé de ne pas nous précipiter et fusionner / livrer le tout, tout de suite. Nous avons préféré attendre le lendemain midi, frais et requinquer, avant d'intégrer et pousser en prod ce gros changement.

🍻 Post-merge (23/10/2024)

Pour mettre en production la nouvelle organisation de code, nous avons :

  • ajouté les variables d'environnement PROJECT_DIR aux applications de production sur Scalingo
  • mis à jour les associations GitHub dans la partie "Deploy (via GitHub)" de Scalingo
  • créé la branche dora/releases
  • mise à jour des variables d'environnement Scalingo dans Bitwarden
  • mise à jour des PR référencées par les cartes Trello

ggounot and others added 30 commits April 15, 2024 17:53
- ajout d'une vue absente référencée par un tableau de bord (a du sauter
quelque part dans l'historique git)
- modification du script de génération et d'imports des dumps pour les
tables / vues / questions spécifiques Metabase
Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 21.2.0 to
22.0.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/benoitc/gunicorn/releases">gunicorn's
releases</a>.</em></p>
<blockquote>
<h2>Gunicorn 22.0 has been released</h2>
<p><strong>Gunicorn 22.0.0 has been released.</strong> This version fix
the numerous security vulnerabilities. You're invited to upgrade asap
your own installation.</p>
<p>Changes:</p>
<pre><code>22.0.0 - 2024-04-17
===================
<ul>
<li>use <code>utime</code> to notify workers liveness</li>
<li>migrate setup to pyproject.toml</li>
<li>fix numerous security vulnerabilities in HTTP parser (closing some
request smuggling vectors)</li>
<li>parsing additional requests is no longer attempted past unsupported
request framing</li>
<li>on HTTP versions &lt; 1.1 support for chunked transfer is refused
(only used in exploits)</li>
<li>requests conflicting configured or passed SCRIPT_NAME now produce a
verbose error</li>
<li>Trailer fields are no longer inspected for headers indicating secure
scheme</li>
<li>support Python 3.12</li>
</ul>
<p>** Breaking changes **</p>
<ul>
<li>minimum version is Python 3.7</li>
<li>the limitations on valid characters in the HTTP method have been
bounded to Internet Standards</li>
<li>requests specifying unsupported transfer coding (order) are refused
by default (rare)</li>
<li>HTTP methods are no longer casefolded by default (IANA method
registry contains none affected)</li>
<li>HTTP methods containing the number sign (#) are no longer accepted
by default (rare)</li>
<li>HTTP versions &lt; 1.0 or &gt;= 2.0 are no longer accepted by
default (rare, only HTTP/1.1 is supported)</li>
<li>HTTP versions consisting of multiple digits or containing a
prefix/suffix are no longer accepted</li>
<li>HTTP header field names Gunicorn cannot safely map to variables are
silently dropped, as in other software</li>
<li>HTTP headers with empty field name are refused by default (no
legitimate use cases, used in exploits)</li>
<li>requests with both Transfer-Encoding and Content-Length are refused
by default (such a message might indicate an attempt to perform request
smuggling)</li>
<li>empty transfer codings are no longer permitted (reportedly seen with
really old &amp; broken proxies)</li>
</ul>
<p>** SECURITY **</p>
<ul>
<li>fix CVE-2024-1135
</code></pre></li>
</ul>
<ol>
<li>Documentation is available there: <a
href="https://docs.gunicorn.org/en/stable/news.html">https://docs.gunicorn.org/en/stable/news.html</a></li>
<li>Packages: <a
href="https://pypi.org/project/gunicorn/">https://pypi.org/project/gunicorn/</a></li>
</ol>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/benoitc/gunicorn/commit/f63d59e4d73a8ee28748d2c700fb81c8780bc419"><code>f63d59e</code></a>
bump to 22.0</li>
<li><a
href="https://github.com/benoitc/gunicorn/commit/4ac81e0a1037ba5b570323be7430e09caa233e38"><code>4ac81e0</code></a>
Merge pull request <a
href="https://redirect.github.com/benoitc/gunicorn/issues/3175">#3175</a>
from e-kwsm/typo</li>
<li><a
href="https://github.com/benoitc/gunicorn/commit/401cecfaed85d79236c7a9a1f7d8946b01c466fc"><code>401cecf</code></a>
Merge pull request <a
href="https://redirect.github.com/benoitc/gunicorn/issues/3179">#3179</a>
from dhdaines/exclude-eventlet-0360</li>
<li><a
href="https://github.com/benoitc/gunicorn/commit/0243ec39ef4fc1b479ff4e1659e165f0b980b571"><code>0243ec3</code></a>
fix(deps): exclude eventlet 0.36.0</li>
<li><a
href="https://github.com/benoitc/gunicorn/commit/628a0bcb61ef3a211d67dfd68ad1ba161cccb3b8"><code>628a0bc</code></a>
chore: fix typos</li>
<li><a
href="https://github.com/benoitc/gunicorn/commit/88fc4a43152039c28096c8ba3eeadb3fbaa4aff9"><code>88fc4a4</code></a>
Merge pull request <a
href="https://redirect.github.com/benoitc/gunicorn/issues/3131">#3131</a>
from pajod/patch-py12-rebased</li>
<li><a
href="https://github.com/benoitc/gunicorn/commit/deae2fc4c5f93bfce59be5363055d4cd4ab1b0b6"><code>deae2fc</code></a>
CI: back off the agressive timeout</li>
<li><a
href="https://github.com/benoitc/gunicorn/commit/f4703824c323fe6867dce0e2f11013b8de319353"><code>f470382</code></a>
docs: promise 3.12 compat</li>
<li><a
href="https://github.com/benoitc/gunicorn/commit/5e30bfa6b1a3e1f2bde7feb514d1734d28f39231"><code>5e30bfa</code></a>
add changelog to project.urls (updated for PEP621)</li>
<li><a
href="https://github.com/benoitc/gunicorn/commit/481c3f9522edc58806a3efc5b49be4f202cc7700"><code>481c3f9</code></a>
remove setup.cfg - overridden by pyproject.toml</li>
<li>Additional commits viewable in <a
href="https://github.com/benoitc/gunicorn/compare/21.2.0...22.0.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=gunicorn&package-manager=pip&previous-version=21.2.0&new-version=22.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/gip-inclusion/dora-back/network/alerts).

</details>

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Ajout de la DR Clermont-Ferrand 63074
Le runtime actuel est en 3.11.4
- un patch de sécu, et une info qui remonte dans les build
- je teste en 3.12 pendant quelque temps avant de valider la MaJ
- les tests passent
- Ruff qui posait des pb en 3.11 semble ok aussi
### Logger Python DB

connexe à : https://trello.com/c/cb5cz7xo/35-tdb-suivi-des-notifications

Permet d'utiliser le logger `dora.logs.core` qui stocke les
enregistrements en base.
Les éléments de base du log (niveau, message) sont inclus en tant que
champs du modèle.
L'objet `ActionLog` peut aussi contenir tout autre élément JSON valide
complémentaire (via les `args` du logger).

Sera utile pour logger par ex. certaines actions sensibles (AIPD) ou
plus finement l'évolution du volume au cours du temps des notifications.
Un champ `legal` du modèle sert à marquer ce genre d'enregistrement, il
peut être ajouté dans le `payload`.

Le logger est automatiquement chargé dans un contexte Django.

#### Exemple d'utilisation (dans un contexte Django)
```
import logging
dblog = logging.getLogger("dora.logs.core")
dblog.error("Message d'erreur", {"details": "Mais aussi des champs optionnels en dict", "legal":True}
...
```
Cause encore non déterminée.

Voir les commentaires dans le code de la vue de recherche. 

Une sous-requête de l'ORM ne se comporte pas de la même manière sur
environnement de dev et celui de production.
Le niveau de log de Django en production est 'WARNING'. 
Celui de debug/dev (DEBUG=True_ est 'INFO'.
Le niveau du logger 'dora.logs.core' est désormais 'INFO'.
Pour effectuer un suivi cumulatif des envois de notifications et tracer
les suppressions d'utilisateurs.

Ah oui, ça dépends de :
gip-inclusion/dora-back#275
L'exploitation sur Metabase est ... compliquée sans valeur numérique
pour les chiffres ...
Une mauvaise gestion du cas où `formsInfo` vaut `null` causait le
formulaire d'orientation à ne pas s'afficher pour certains services.
assorti du tracking (considéré comme une MeR)
Les UUIDs ne sont pas sérialisés directement (dumb)
fiche structure: ajout d'un bouton pour visualiser les infos de contact
Exemples :

Recherche "Toulouse" sans thématique et sans besoin :
On passe de **1560** requêtes en **3.7825s** à **24** requêtes en
**1.1775s**

Recherche "Toulouse" avec une thématique et deux besoins :
On passe de **208** requêtes en **0.6408s** à **24** requêtes en
**0.5969s**
https://trello.com/c/upyz8C4m

Une PR dont je revais depuis longtemps… Au lieu de maintenir de notre
coté les listes de valeurs définies par le schema d·i, on interroge
directement le schema.
Voici un premier test, sur le champ `typology` des structures, qui est
une simple FK, donc assez simple à remplacer. Les M2M seront plus
complexes.

Il y a des gains de performances sans doute non négligeables à la clé,
avec pas mal de jointures en moins, et les échanges avec l’API d·i dans
les deux sens sont également simplifiés.

Il restera le problème de savoir comment gérer les montées de version de
schema d·i ; à voir dans quelle mesure c’est automatisable, ou si on
continue de le faire à la main.

@vmttn je veux bien ton avis sur l’approche !
Pytest lève souvent des avertissements de déprécation intéressants, en
voici quelques uns de corrigés.

voir : https://docs.pytest.org/en/stable/how-to/capture-warnings.html
Les structures obsolètes n'étaient pas filtrées.
@ggounot ggounot force-pushed the temp-branch branch 11 times, most recently from c68c3bb to 8585cc3 Compare October 22, 2024 16:18
@ggounot ggounot requested a review from jbuget October 22, 2024 16:27
@ggounot
Copy link
Contributor Author

ggounot commented Oct 22, 2024

Mono repo

@ggounot ggounot changed the title Merge de back et front Fusion de dora-back et dora-front en un monorepo dora Oct 22, 2024
@ggounot ggounot self-assigned this Oct 22, 2024
Copy link
Contributor

@jbuget jbuget left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We did it ! LGTM 🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants