Ledger Live Monorepo Project: Part 1 - Problematics (Make it Pain) | Καθολικό

Ledger Live Monorepo Project: Part 1 – Problematics (Make it Pain) | Καθολικό

Σε αυτήν τη σειρά αναρτήσεων ιστολογίου, ο Valentin De Almeida, προγραμματιστής του Ledger Live, μας μιλάει για την εξέλιξη της βάσης κωδικών του Ledger Live με τα χρόνια. Σε αυτήν την ανάρτηση ιστολογίου, θα μάθετε ότι αρχικά βασιζόταν σε πολλά αποθετήρια, τα ζητήματα που αντιμετωπίσαμε στην πορεία και γιατί έπρεπε να εξελιχθεί σε μια αρχιτεκτονική ενός αποθετηρίου. Στις επόμενες αναρτήσεις ιστολογίου, θα εξηγήσουμε πώς διεξήχθη αυτό το μεγάλο έργο μετανάστευσης. 

Λίγη ιστορία 

Η ανάπτυξη του Ledger το 2020 και το 2021 ήταν σημαντική. Επιστρατεύσαμε επιθετικά νέα ταλέντα, επεκτείνοντας την ομάδα μας από μια χούφτα σε περισσότερους από 20 προγραμματιστές. Αυτό σημαίνει ότι πολλοί νέοι μηχανικοί προστέθηκαν σε υπάρχοντα έργα. Καθώς η ομάδα μας μεγάλωνε γρήγορα, αντιμετωπίσαμε νέες προκλήσεις που έπρεπε να αντιμετωπίσουμε γρήγορα. Παρά τις νέες αυτές δυσκολίες, παραμείναμε προσηλωμένοι στον στόχο μας και συνεχίσαμε να προσφέρουμε εξαιρετική δουλειά.

Κάναμε ένα βήμα πίσω και εξετάσαμε τα νέα προβλήματα που προκύπτουν όταν όλο και περισσότεροι άνθρωποι εντάχθηκαν στο έργο. Μεταξύ αυτών των νέων προκλήσεων, μπορούμε να απαριθμήσουμε τις ακόλουθες ανάγκες:

  • Πιο απλές ροές.
  • Καλύτερες οδηγίες για εισερχόμενους και εξωτερικούς συνεισφέροντες.
  • Ένα ενιαίο σύνολο εργαλείων.
  • Καλύτερη διαχείριση εξαρτήσεων.
  • Συγκεντρωτικές συνεισφορές ανοιχτού κώδικα.
State of the Art: πριν από τη μετανάστευση
Ledger Live Monorepo Project: Part 1 - Problematics (Make it Pain) | Ledger PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.
Ledger Live Monorepo Project: Part 1 - Problematics (Make it Pain) | Καθολικό

Αρχικά, και μέχρι πέρυσι, το Ledger Live βασιζόταν σε μια αρχιτεκτονική πολυ-αποθήκης, τόσο για φορητές όσο και για επιτραπέζιους υπολογιστές, καθώς και για όλη τη λογική πίσω από αυτό. Δεν ήταν συνειδητή απόφαση να εργαστεί κανείς με αυτόν τον τρόπο, αλλά ήταν μόνο το αποτέλεσμα ενός επεκτεινόμενου έργου χωρίς πραγματικό αρχιτεκτονικό προβάδισμα. Το Ledger Live είναι ένα έργο που συγκεντρώνει διάφορα στοιχεία σε ένα για να προσφέρει την καλύτερη και πιο ασφαλή εφαρμογή στους χρήστες μας Nano, και αυτό αντικατοπτρίστηκε στη βάση κώδικα.

Οι ροές που είχαμε στην καλύτερη περίπτωση ήταν ασαφείς, κυρίως λόγω του γεγονότος ότι ήμασταν 6 ή 7 προγραμματιστές πριν από μερικά χρόνια. Δεδομένου ότι συμμετείχαν λιγότερα μέρη, η επικοινωνία ήταν πολύ πιο εύκολη και ξεφύγαμε. Ωστόσο, υπήρχαν ορισμένα σημεία πόνου στον τρόπο που εργαζόμασταν, ειδικά σχετικά με την εμπειρία προγραμματιστή και τη διαδικασία έκδοσης.

Συμφόρηση εμπειρίας προγραμματιστή

Εξαρτήσεις

Λόγω της φύσης των έργων μας, εργαζόμαστε σε πολλαπλά αποθετήρια ταυτόχρονα, με εξαρτήσεις μεταξύ τους. Ακολουθεί μια γρήγορη επισκόπηση:

Ledger Live Monorepo Project: Part 1 - Problematics (Make it Pain) | Ledger PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.
Ledger Live Monorepo Project: Part 1 - Problematics (Make it Pain) | Καθολικό

Οι βιβλιοθήκες ανοιχτού κώδικα Ledger χρησιμοποιούνται από την επιχειρηματική λογική, η οποία στη συνέχεια χρησιμοποιείται τόσο από την επιφάνεια εργασίας όσο και από τις εφαρμογές για κινητά. Αλλά αυτές οι εφαρμογές χρησιμοποιούν επίσης τις βιβλιοθήκες ανοιχτού κώδικα και χρησιμοποιούν δύο διαφορετικές εκδόσεις της ίδιας βιβλιοθήκης (όπως @ledgerhq/errors για παράδειγμα) θα σπάσει την εφαρμογή.

Χρειαζόμασταν να προσκρούσουμε την έκδοση στη μία πλευρά, μετά να δημοσιεύσουμε τις βιβλιοθήκες (ναι, σε npm!!!) και μετά να προσπαθήσουμε ξανά αν δεν λειτούργησε. Αρχίσαμε να βασιζόμαστε yalc σε έργα συμβολικής σύνδεσης, κάτι που ήταν ως επί το πλείστον εντάξει, εφόσον δεν είχαμε πολλά επίπεδα εξαρτήσεων (για παράδειγμα, από τις βιβλιοθήκες ανοιχτού κώδικα στην επιχειρηματική λογική και, στη συνέχεια, από τη λογική της επιχείρησης στις εφαρμογές). Προσπαθήσαμε προσωρινά να συνεργαστούμε yarn link επίσης, αλλά φαίνεται ότι ήταν καταδικασμένο με το React Native.

Δοκιμές

Ήταν σχεδόν αδύνατο να γίνουν δοκιμές ενοποίησης με όλο τον πιο πρόσφατο κώδικα από τα διάφορα έργα. Επειδή χρειαζόταν να δημοσιεύσουμε τις βιβλιοθήκες στο μητρώο, η δοκιμή όλων των στοιχείων με τον πιο πρόσφατο ενημερωμένο κώδικα ήταν εφιάλτης

Έπρεπε επίσης να διατηρήσουμε πολλά CI με διπλή λογική.

Εναλλαγή περιβάλλοντος

Η κίνηση σε πολλούς επεξεργαστές κώδικα / έργα / καταλόγους έκανε την εμπειρία προγραμματιστή να φαίνεται πραγματικά αδύναμη.

Συμφόρηση διαδικασίας απελευθέρωσης

Έκδοση

Ο χειρισμός της έκδοσης διαφορετικών έργων είναι δύσκολος, ειδικά όταν υπάρχουν πολλά επίπεδα εξαρτήσεων.

Απελευθέρωση

Η παρακολούθηση εκδόσεων ήταν περίπλοκη λόγω του γεγονότος ότι τα έργα χωρίστηκαν και έπρεπε να διαχειριστούμε τις εκδόσεις των διαφορετικών έργων

Ήταν αδύνατο να αυτοματοποιηθεί η διαδικασία έκδοσης, και πάλι λόγω του γεγονότος ότι τα έργα χωρίστηκαν σε διαφορετικά αποθετήρια.

Και φυσικά, το Continuous Delivery ήταν αδιανόητο σε αυτό το σημείο.

Πιθανή λύση ?
Ledger Live Monorepo Project: Part 1 - Problematics (Make it Pain) | Ledger PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.
Ledger Live Monorepo Project: Part 1 - Problematics (Make it Pain) | Καθολικό

Κοιτάζοντας τριγύρω για έμπνευση, φαίνεται ότι μια αρχιτεκτονική μονού αποθετηρίου είναι το κεντρικό κομμάτι που μας έλειπε. Θα επέτρεπε μια πολύ καλύτερη διαδικασία ανάπτυξης. Υπάρχουν εργαλεία χτισμένα γύρω από αυτήν την αρχιτεκτονική που θα μας βοηθήσουν να επιτύχουμε τα μέρη που λείπουν (έκδοση, αυτοματισμός, έκδοση εκδόσεων…).

Αλλά, τι είναι ένα μονοθέσιο;

Στον πυρήνα του, ένα μονοφωνικό αποθετήριο είναι ένα έργο που ενσωματώνει όλα τα άλλα σχετικά έργα (εφαρμογές, βιβλιοθήκες, εργαλεία) σε έναν φάκελο / έργο git. Επιτρέπει καλύτερη διαχείριση εξαρτήσεων, εναρμόνιση εργαλείων (όπως στυλ κώδικα και διαμορφώσεις γραφομηχανών), κεντρική συνεχή ενσωμάτωση, δοκιμή ενοποίησης, ομοιόμορφη έκδοση του χρησιμοποιημένου πακέτου (αντίδραση για παράδειγμα)…

Δεδομένου ότι είναι ένα αρκετά αγνωστικιστικό σύστημα, ορισμένα χαρακτηριστικά έμειναν για να ανακαλύψουμε και να εφαρμόσουμε. Ας ελπίσουμε ότι υπάρχουν μερικά εξαιρετικά εργαλεία κοινότητας που θα μπορούσαν να μας βοηθήσουν να προσθέσουμε ενορχήστρωση στις εκδόσεις (διαδοχικές εκδόσεις, χρήσιμες για CI), έκδοση εκδόσεων, δημιουργία καταγραφής αλλαγών.. που θα συμπλήρωναν αυτό που μας έλειπε στη διαδικασία κυκλοφορίας μας.

ΚΑΤΑ

Τα μονοφωνικά αποθετήρια έχουν νόημα σε ένα πλαίσιο όπου πολλοί προγραμματιστές ή μια ομάδα προγραμματιστών εργάζονται σε πολλά έργα ταυτόχρονα, με εξαρτήσεις μεταξύ τους. Ωστόσο, προσθέτει κάποιο επίπεδο πολυπλοκότητας κατά τη φάση της εγκατάστασης (ειδικά με ήδη δρομολογημένα έργα που έχουν ιστορία 4 ετών και ενεργή ανάπτυξη). Αξίζει να αναφέρουμε ότι το έργο γίνεται πολύ μεγαλύτερο (σαν πολύ μεγαλύτερο) όσον αφορά τον χώρο στο δίσκο. Όλα τα έργα βρίσκονται πλέον στον ίδιο φάκελο και όλες οι εξαρτήσεις. Ποιες εξετάσεις είναι υποχρεωτικές; Πότε να τα ενεργοποιήσετε;

ΥΠΕΡ

Αφού αξιολογήσαμε το χρόνο, το κόστος και τη σκοπιμότητα των φιλοδοξιών μας, παραθέτουμε μερικά από τα αναμενόμενα οφέλη αυτής της μετάβασης:

  • Βελτιωμένη διαχείριση εξαρτήσεων: Με ένα monorepo, είναι πιο εύκολο να διαχειριστείτε τις εξαρτήσεις μεταξύ διαφορετικών έργων, καθώς όλα αποθηκεύονται στο ίδιο αποθετήριο. Αυτό μπορεί να μειώσει την ανάγκη για λύσεις όπως σύνδεση νήματος ή yalc, και διευκολύνουν τη διασφάλιση ότι όλα τα έργα χρησιμοποιούν τις σωστές εκδόσεις εξαρτήσεων.
  • Καλύτερη οργάνωση κώδικα: Ένα monorepo μπορεί να διευκολύνει την οργάνωση κώδικα, καθώς όλα τα έργα και οι εξαρτήσεις τους αποθηκεύονται σε ένα ενιαίο χώρο αποθήκευσης. Είναι ευκολότερο να καταλάβουμε πώς ταιριάζουν διαφορετικά έργα και πώς εξαρτώνται το ένα από το άλλο.
  • Βελτιωμένη εμπειρία προγραμματιστή: Ένα monorepo μπορεί να διευκολύνει τους προγραμματιστές να εργάζονται σε πολλά έργα, καθώς δεν χρειάζεται να κάνουν εναλλαγή μεταξύ διαφορετικών βάσεων κώδικα ή αποθετηρίων. Μπορεί επίσης να διευκολύνει την εκτέλεση δοκιμών ενοποίησης, καθώς όλος ο κώδικας αποθηκεύεται στο ίδιο αποθετήριο.
  • Βελτιωμένος αυτοματισμός και συνεχής παράδοση: Με ένα monorepo, είναι πιο εύκολο να αυτοματοποιήσετε εργασίες όπως η δημιουργία, η δοκιμή και η απελευθέρωση κώδικα. Αυτό μπορεί να βοηθήσει στον εξορθολογισμό της διαδικασίας απελευθέρωσης και στη διευκόλυνση της συνεχούς παράδοσης.
  • Αυξημένη ταχύτητα ανάπτυξης. Δεδομένου ότι διαφορετικές ομάδες εργάζονται στο ίδιο αποθετήριο, δεν χρειάζεται να περιμένουν μέχρι την κυκλοφορία για να επαληθεύσουν το αποτέλεσμα, επιταχύνοντας την ενσωμάτωση.
Συμπέρασμα

Συνολικά, η υλοποίηση μιας δομής monorepo μπορεί να βοηθήσει στη βελτίωση της διαδικασίας ανάπτυξης, στον εξορθολογισμό της διαδικασίας έκδοσης και στη βελτίωση της εμπειρίας προγραμματιστή.

Στις επόμενες αναρτήσεις ιστολογίου αυτής της σειράς, θα σας καθοδηγήσουμε στο πώς διεξήχθη αυτό το μεγάλο έργο μετανάστευσης, τα εργαλεία που χρησιμοποιήσαμε, τις επιλογές που κάναμε, το αποτέλεσμα και πολλά άλλα. Μείνετε συντονισμένοι για το Μέρος 2: Τα εργαλεία!


Valentin DE ALMEIDA
Developer Experience & Core Tech – Ledger Live

Σφραγίδα ώρας:

Περισσότερα από Καθολικό