Who 4 Was kommt i ns MonoRepo? 4 Was i st lerna // Ein kurzer Eindruck 4 Migration i ns MonoRepo // Schritt für Schritt 4 Tellerrand // Was gibt es noch? Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 10
auf Twitter @arndissler 4 Schreibt mir eine E-Mail [email protected] Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 11
Paket ein Repo 4 Ein node_modules-Ordner pro Paket 4 Oft liegt ein Repo in der Hoheit eines Teams Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 18
i st (meistens) klar 4 Move fast, break things: Features schnell implementieren und publizieren; "Konsumenten müssen ja nicht updaten" Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 19
Formatierung, Einrückung, Best Practices 4 Stabile Projekte werden "vergessen" 4 Keine Kontrolle über Konsumenten: Support mehrer Versionen, gerade bei Breaking Changes 4 Oft wenig Bewusstsein dafür, welche Auswirkungen Änderungen haben können Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 20
Pakete 4 Im optimalen Fall nur ein node_modules-Verzeichnis 4 Interne Pakete, die im gleichen MonoRepo verwaltet werden, werden verlinkt 4 Externe Pakete werden auf Root-Ebene gehoisted und verlinkt Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 23
erreichbar und durchsuchbar 4 Auswirkungen von Änderungen sofort greifbar 4 gemeinsame Verantwortung: you break it - you fix it 4 Versionierung einfach: bestenfalls automatisch 4 master hält immer eine lauffähige Version des gesamten Ökosystems Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 24
MonoRepo ausgelegt 4 Alle haben Zugriff auf den gesamten Code 4 Skalierbarkeit muss durch externe Tools geschaffen werden Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 25
mit externen Konsumenten geteilt werden 4 Komponenten, die nur eine lose Kopplung mit dem Projekt haben: Webseite, öffentliche Pakete 4 was genau i ns MonoRepo kommt, hängt von eurer Projekt- und Organisationsstruktur ab Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 28
Verwalten der Dependencies 4 Starten von run-Skripten 4 Versionierung 4 Deployments Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 30
werden gelinkt 4 alle anderen Pakete werden gehoisted und dann gelinkt ! yarn Workspaces leisten das Gleiche Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 31
startet rakete in allen Paketen, die in einem MonoRepo verwaltet werden 4 lerna exec spaceX - führt spaceX in allen Paketen des MonoRepos aus 4 lerna run rakete --scope "packages/components-*" führt rakete in allen matchenden Paketen aus Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 32
independent: alle Pakete haben unterschiedliche, unabhängige Versionsnummern - fixed: alle Pakete haben die gleiche Versionsnummer (das ist der Standard) Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 33
Commit-Historie ermitteln (SemVer) lerna version --conventional-commits 4 involvierte Pakete werden angepasst und nur geänderte Pakete werden veröffentlicht lerna publish --from-git Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 34
MonoRepo etwas für euch? 4 Wie viele Developer arbeiten zeitgleich an der Codebasis? 4 Welche Vorteile erhofft i hr euch? 4 Welche Probleme wollt i hr lösen? Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 44
Workflow aus? 4 releast i hr eure Pakete? 4 versioniert ihr? 4 setzt i hr Bugfixes um? 4 soll das alles im MonoRepo aussehen? Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 45
4 nicht nur: für was i hr euch entschieden habt 4 sondern auch: gegen was - und warum 4 Faktenbasis schaffen 4 messt & dokumentiert langsame Prozesse Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 46
ein Repository mit Historie 4 altes Repository umschreiben, als remote einbinden und mit git fetch i ns MonoRepo heben Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 50
' git ls-files -s | gsed "s,\t,&'packages/repo-name'/," | GIT_INDEX_FILE="$GIT_INDEX_FILE.new" git update-index --index-info && \ mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE" ' HEAD` Dann im MonoRepo als remote hinzufügen und per git fetch remote den Code abholen und den remote/master in den master mergen. Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 51
4 bestehende Repos umschreiben & importieren 4 Dokumentieren: was i st wo 4 Imports/Requires umschreiben, wenn Package-Namen angepasst wurden Das war's: es ist ein MonoRepo ! Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 52
einfach 4 clone, fetch und pull brauchen wesentlich länger 4 klares Branching-Konzept erarbeiten und dokumentieren 4 tiefer in git einsteigen, zum Beispiel git subtree oder git clone -- depth 123 4 git Hooks anpassen und auf Root-Ebene hochziehen oder entfernen Risiko: das Repository wird unbenutzbar Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 54
Fluch als Segen sein 4 tsconfig vereinheitlichen (Root-Ebene) 4 @types sorgfältig abstimmen: am Besten in eigenes Paket 4 skipLibCheck kann Konflikte mit konkurrierenden Type-Definitionen lösen 4 Imports sorgfältig prüfen: alle alten Versionen ersetzt? 4 Nutzt configuration inheritance (mittels extends) Risiko: endloser Prozess, da parallel zur laufenden Entwicklung Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 55
eingestellt: wann laufen welche Tests, wann wird was gebaut? 4 Performance-Gewinne möglich? Parallelisierung? 4 prüft "gefühlte" Performance-Einbußen anhand der Datenlage, die ihr zu Beginn geschaffen habt Achtung: in einem MonoRepo i st der CI-Server sehr stark beansprucht Risiko: suboptimal eingestellte CI kann zum Bottleneck werden Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 56
nach Möglichkeit die Struktur oder zieht es in ein eigenes Paket Risiko: nachlässig geschriebene Webpack-Skripte bundlen ggf. Code, der nicht ausgeliefert werden sollte Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 57
zum Beispiel sonatype/docker-nexus 4 Automatisierung der Dependency-Versionierung: am Besten direkt in die CI auslagern, keine manuellen Eingriffe zulassen Risiko: fehlerhafte Releases und Versionsnummern sind Sand im Getriebe eines MonoRepos Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 58
lange 4 Navigation im MonoRepo: unbenutzbar? 4 graphische git Clients kommen möglicherweise nicht mit der Menge an Daten klar 4 Code Reviews: nutzt Code Owners, wenn möglich Risiko: Developer verlieren an Produktivität Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 59
offen lassen 4 Immer aktuell halten 4 Ablageort muss allen Beteiligten bekannt sein 4 Troubleshooting-Dokument rettet Sprints! Risiko: wo die Realität nicht dokumentiert ist, wird sie geschaffen: es werden Lösungen ergoogelt, die so nicht vorgesehen waren Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 61
Lerna über yarn aufrufen yarn lerna run serve --scope 'packages/application-*' 2) Lerna über yarn aufrufen und dann yarn aufrufen yarn lerna exec --scope 'packages/application-*' yarn run serve 3) ins Paket wechseln und yarn aufrufen cd packages && cd application-01 && yarn run serve Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 62
mit den Teams: hört zu, wenn Probleme auftauchen 4 Es gibt keine dummen Fragen 4 hinterfragt, ob i hr noch die richtigen Probleme löst Risiko: wo die Realität nicht dokumentiert ist, wird sie geschaffen: es werden Lösungen gegoogelt, die so nicht vorgesehen waren Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 63
4 So viele Testläufe wie möglich: automatisierte Migration, Tools, IDEs, git-Workflow 4 dabei unbedingt Messdaten erfassen 4 kontinuierliche Pflege des MonoRepos und Analyse der Performance notwendig 4 Haltet eure Teams durchgehend auf dem Laufenden 4 Hinterfragt, ob ihr auf dem richtigen Weg seid Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 65