Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Migration bestehender Projekte in ein LernaJS-M...

Migration bestehender Projekte in ein LernaJS-MonoRepo

Avatar for Arnd Issler

Arnd Issler

June 26, 2019
Tweet

More Decks by Arnd Issler

Other Decks in Technology

Transcript

  1. Migration bestehender Projekte in ein LernaJS- MonoRepo Migration bestehender Projekte

    in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 1
  2. Hi, ich bin Arnd @arndissler Migration bestehender Projekte in ein

    LernaJS-MonoRepo // @arndissler // EnterJS 2019 4
  3. und ich trage meistens fancy shirts Migration bestehender Projekte in

    ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 7
  4. Migration bestehender Projekte in ein LernaJS- MonoRepo Migration bestehender Projekte

    in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 9
  5. Inhalte Worum geht's heute? 4 PolyRepo & MonoRepo // Who's

    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
  6. Kritik? 4 Sprecht mich an 4 Schreibt mir eine Direktnachricht

    auf Twitter @arndissler 4 Schreibt mir eine E-Mail [email protected] Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 11
  7. Fragen? ! am besten nach dem Talk Migration bestehender Projekte

    in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 12
  8. Who's Who? PolyRepo: viele einzelne Repositories MonoRepo: viel in einem

    Repository Paket: npm package Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 14
  9. PolyRepo vs MonoRepo facts from random internet sources Migration bestehender

    Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 15
  10. PolyRepo // Was ist das eigentlich? │ ├── Paket-A │

    ├── package.json │ ├── node_modules │ │ └── Paket-B ├── Paket-B │ ├── package.json │ └── node_modules │ ├── Paket-C Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 17
  11. PolyRepo // Was ist das eigentlich? 4 Mehrere Repos: pro

    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
  12. PolyRepo // the good parts 4 Verantwortlichkeit für jedes Repo

    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
  13. PolyRepo // the bad parts 4 Eigene Kultur pro Repo:

    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
  14. MonoRepo // Was ist das eigentlich │ ├── Paket-A │

    ├── package.json │ └── node_modules │ └── Paket-B ├── Paket-B │ ├── package.json │ └── node_modules │ └── Paket-C ├── package.json ├── lerna.json └── node_modules Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 22
  15. MonoRepo // Was ist das eigentlich 4 Ein Repo, mehrere

    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
  16. MonoRepo // the good parts 4 alle Teile der Code-Basis

    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
  17. MonoRepo // the bad parts 4 Tooling meist nicht auf

    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
  18. Was kommt nicht ins MonoRepo? Migration bestehender Projekte in ein

    LernaJS-MonoRepo // @arndissler // EnterJS 2019 27
  19. Was kommt nicht ins MonoRepo? 4 Credentials 4 Komponenten, die

    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
  20. LernaJS der de-facto Standard für JavaScript-Projekte in MonoRepos Migration bestehender

    Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 29
  21. Lerna Lerna erleichtert das Tooling rund um ein Monorepo: 4

    Verwalten der Dependencies 4 Starten von run-Skripten 4 Versionierung 4 Deployments Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 30
  22. Lerna // Verwalten der Dependencies 4 Pakete innerhalb eines Monorepos

    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
  23. Lerna // Starten von run-Skripten 4 lerna run rakete -

    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
  24. Lerna // Versionierung lerna unterstützt zwei Arten der Versionierung: -

    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
  25. Lerna // Deployments 4 lerna kann die Versionsnummern anhand der

    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
  26. Migration bestehender Projekte ins MonoRepo Let's roll Migration bestehender Projekte

    in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 36
  27. Lessons learned 4 Migration von 14 Projekten 4 inklusive 3+

    Jahre git-Historie 4 Insgesamt 59.000+ Commits 4 BigBang Migration 4 3 Monate Planung 4 2 Monate Umsetzung 4 4 Stunden Migrationszeit Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 37
  28. Hindernisse bei der Migration Nach Grad der Beherrschbarkeit: 4 Leicht:

    Technik & Tooling 4 Schwieriger: Zeitrahmen festlegen 4 Sehr schwer: Developer & Management Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 40
  29. Checkliste ✁ ausdrucken und abhaken Migration bestehender Projekte in ein

    LernaJS-MonoRepo // @arndissler // EnterJS 2019 41
  30. Schritte ins MonoRepo // Zeitplanung 4 Vorbereitung // Monate vorher

    4 Zielmodellierung 4 Technische Grundlagen schaffen 4 Technische Basis // Wochen vorher 4 Dry-Run 4 Repeat 4 Teams abholen // kontinuierlich Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 42
  31. Vorbereitung // Diskutiert mit euren Devs Evaluierung: i st ein

    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
  32. Vorbereitung // Diskutiert mit euren Devs Wie... 4 sieht euer

    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
  33. Vorbereitung // Diskutiert mit euren Devs 4 Dokumentiert alle Entscheidungen

    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
  34. Vorbereitung // Repo-Kultur Clash der Kulturen 4 Tabs vs Spaces

    4 Code-Formatierung 4 Linter ! prettier - nicht unbedingt schön, aber einheitlich Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 47
  35. Vorbereitung // Repo-Kultur Clash der Kulturen 4 run Scripte vereinheitlichen

    4 Dependencies harmonisieren: vor allem React, Vue, Angular, TypeScript, babel, webpack 4 verwendete node-Versionen angleichen & testen ! Breaking Changes erkennen & Alternativen suchen Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 48
  36. Import von Repositories Zwei Möglichkeiten: 4 lerna import /path/to/repo Importiert

    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
  37. Technische Maßnahmen Repository auf neue Struktur umschreiben: git filter-branch --index-filter

    ' 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
  38. Technische Maßnahmen 4 Repo-Struktur erarbeiten 4 ggf. neues Repo anlegen

    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
  39. Technische Maßnahmen: git Umgang mit git im MonoRepo nicht immer

    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
  40. Technische Maßnahmen: TypeScript 4 Bei der Migration kann es eher

    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
  41. Technische Maßnahmen: CI 4 genug Power vorhanden? 4 Pipelines gut

    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
  42. Technische Maßnahmen: Bundler/Webpack 4 prüft bestehende Webpack-Skripte gewissenhaft 4 vereinheitlicht

    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
  43. Technische Maßnahmen: Release-Prozess 4 Release testen mit privater, lokaler Registry,

    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
  44. Technische Maßnahmen: Code Handling 4 IDEs 4 Code-Indizierung dauert sehr

    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
  45. Team abholen: Dokumentation & Kommunikation 4 Dokumentation darf keine Fragen

    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
  46. 0) Lerna direkt aufrufen: ./node_modules/.bin/lerna run serve --scope 'packages/application-*' 1)

    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
  47. Team abholen: Dokumentation & Kommunikation 4 sprecht vor/während/nach der Migration

    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
  48. Fazit 4 Skriptet alles 4 So viel Dokumentation wie möglich

    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
  49. But... ...you might not need a MonoRepo Migration bestehender Projekte

    in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 66
  50. Alternative Tools 4 shell scripts 4 git subtree 4 pnpm

    4 rushJS (Microsoft) 4 Bazel (Google) 4 Buck (facebook) Migration bestehender Projekte in ein LernaJS-MonoRepo // @arndissler // EnterJS 2019 67