Memahami Monorepo dan Nx
Pengantar: Mengapa Arsitektur Kode Penting?
Bayangkan Anda memiliki sebuah perusahaan teknologi yang mengembangkan berbagai aplikasi: website e-commerce, aplikasi mobile, API backend, dan sistem admin. Setiap tim mengerjakan proyeknya di repository Git yang terpisah. Suatu hari, Anda perlu mengubah fungsi autentikasi yang digunakan di semua aplikasi. Anda harus membuka empat repository berbeda, melakukan perubahan yang sama empat kali, dan memastikan semuanya tetap sinkron. Merepotkan, bukan?
Di sinilah konsep monorepo hadir sebagai solusi. Mari kita eksplorasi konsep ini secara mendalam, mulai dari dasar hingga implementasi praktis menggunakan Golang.
Apa Itu Monorepo?
Monorepo adalah singkatan dari "monolithic repository", yaitu strategi manajemen kode di mana Anda menyimpan banyak proyek atau aplikasi dalam satu repository Git. Berbeda dengan pendekatan multi-repo atau polyrepo di mana setiap proyek memiliki repository sendiri, monorepo menempatkan semuanya dalam satu tempat yang terpusat.
Untuk memahami perbedaannya, mari kita bandingkan kedua pendekatan ini. Dalam arsitektur multi-repo tradisional, jika Anda memiliki tiga aplikasi (misalnya: aplikasi web, API, dan worker service), Anda akan memiliki tiga repository terpisah. Setiap perubahan pada kode yang dibagikan antar aplikasi memerlukan proses versioning, publikasi package, dan update dependencies di setiap repository. Proses ini bisa memakan waktu dan rentan kesalahan.
Sebaliknya, dalam monorepo, ketiga aplikasi tersebut berada dalam satu repository dengan struktur folder yang terorganisir. Ketika Anda mengubah kode yang dibagikan, semua aplikasi yang menggunakannya langsung terpengaruh dalam commit yang sama. Ini memberikan beberapa keuntungan signifikan seperti refactoring yang lebih mudah, code sharing yang lebih natural, dan atomic changes di mana perubahan pada shared code dan konsumennya bisa dilakukan dalam satu commit.
Perusahaan besar seperti Google, Facebook, dan Microsoft menggunakan monorepo untuk mengelola jutaan baris kode mereka. Google, misalnya, menyimpan hampir seluruh kode perusahaan dalam satu monorepo raksasa yang diakses oleh ribuan engineer setiap harinya.
Memahami Nx: Build System untuk Monorepo
Setelah memahami konsep monorepo, pertanyaan berikutnya adalah: bagaimana mengelola monorepo yang kompleks secara efisien? Di sinilah Nx berperan.
Nx adalah build system dan toolkit yang powerful untuk mengelola monorepo. Meskipun awalnya dikembangkan untuk ekosistem JavaScript/TypeScript, konsep dan arsitekturnya bisa diterapkan pada bahasa lain termasuk Golang. Nx menyediakan berbagai fitur cerdas yang membuat bekerja dengan monorepo menjadi jauh lebih produktif.
Salah satu fitur utama Nx adalah computation caching. Bayangkan Anda menjalankan test suite yang memakan waktu 10 menit. Dengan Nx, jika Anda menjalankan test yang sama tanpa ada perubahan kode, hasilnya akan diambil dari cache dan selesai dalam hitungan detik. Nx cukup pintar untuk mengetahui file mana yang berubah dan hanya menjalankan ulang test yang terpengaruh.
Fitur lainnya adalah dependency graph analysis. Nx memahami hubungan antar proyek dalam monorepo Anda. Jika proyek A menggunakan library B, dan Anda mengubah library B, Nx tahu bahwa proyek A perlu di-rebuild dan di-test ulang. Ini sangat membantu dalam mencegah bug yang muncul akibat perubahan pada shared dependencies.
Nx juga mendukung distributed task execution. Dalam tim besar, Anda bisa mendistribusikan proses build dan testing ke multiple machines, secara dramatis mengurangi waktu CI/CD. Bayangkan monorepo dengan 50 aplikasi yang semuanya perlu di-test. Alih-alih menjalankannya secara sequential yang bisa memakan waktu berjam-jam, Nx bisa mendistribusikan task tersebut dan menyelesaikannya dalam beberapa menit saja.
Nx Monorepo: Kombinasi yang Sempurna
Ketika kita berbicara tentang "Nx Monorepo", kita merujuk pada implementasi monorepo yang menggunakan Nx sebagai build system dan tooling-nya. Ini bukan sekadar menaruh banyak proyek dalam satu folder, tetapi mengorganisirnya dengan cara yang scalable, maintainable, dan performant menggunakan kemampuan Nx.
Dalam Nx Monorepo, kode biasanya diorganisir dalam dua kategori utama: applications (apps) dan libraries (libs). Applications adalah program yang bisa dijalankan secara independen, seperti web server, CLI tool, atau microservice. Libraries adalah kode yang dibagikan antar aplikasi, seperti utility functions, business logic, atau data models.
Struktur ini mendorong pemisahan concerns yang baik. Anda tidak akan menemukan business logic tercampur aduk di dalam aplikasi. Sebaliknya, aplikasi menjadi thin layer yang mengkomposisikan libraries untuk mencapai tujuan tertentu. Ini membuat kode lebih mudah di-test, di-reuse, dan di-maintain.
Cara Kerja dan Keuntungan Praktis
mari kita pahami bagaimana sistem ini bekerja dalam praktik sehari-hari dan apa keuntungannya dibanding pendekatan tradisional.
Workflow Development Sehari-hari
Bayangkan Anda seorang developer yang perlu menambahkan fitur baru: sistem notifikasi email yang akan digunakan oleh user-service untuk mengirim welcome email dan order-service untuk mengirim order confirmation. Dalam pendekatan multi-repo tradisional, Anda perlu membuat package notifikasi terpisah, mempublishnya ke registry, kemudian mengupdate dependencies di kedua service. Prosesnya memakan waktu dan Anda tidak bisa mem-verify bahwa kode Anda bekerja di kedua service sebelum publish.
Dalam Nx Monorepo, workflow-nya jauh lebih smooth. Pertama, Anda membuat library baru di direktori libs/notification dengan kode untuk mengirim email. Kemudian Anda langsung bisa mengimport dan menggunakan library ini di user-service dan order-service. Semua perubahan ada dalam satu commit. Ketika Anda menjalankan test dengan perintah nx test user-service, Nx otomatis mendeteksi bahwa user-service bergantung pada library notification dan akan menjalankan test untuk kedua project. Jika test gagal, Anda langsung tahu ada masalah sebelum commit kode.
Dependency Graph dan Affected Commands
Salah satu fitur paling powerful dari Nx adalah kemampuannya untuk memahami dependency graph proyek Anda. Anda bisa menjalankan perintah nx graph dan Nx akan menampilkan visualisasi interaktif yang menunjukkan bagaimana semua aplikasi dan library dalam monorepo saling berhubungan. Ini sangat membantu ketika Anda join ke proyek baru atau perlu memahami dampak dari perubahan yang akan Anda buat.
Lebih menarik lagi adalah affected commands. Misalkan Anda mengubah library auth untuk menambahkan fitur two-factor authentication. Alih-alih menjalankan test untuk semua 50 aplikasi dalam monorepo Anda, Anda bisa menjalankan nx affected:test dan Nx hanya akan menjalankan test untuk aplikasi yang benar-benar menggunakan library auth. Ini menghemat waktu secara dramatis, terutama dalam monorepo besar. Dalam CI/CD pipeline, ini bisa mengurangi waktu build dari berjam-jam menjadi beberapa menit saja.
Refactoring yang Lebih Aman
Salah satu pain point terbesar dalam pengembangan software adalah melakukan refactoring pada kode yang dibagikan antar banyak aplikasi. Dalam multi-repo, Anda sering kali tidak yakin aplikasi mana saja yang akan terpengaruh oleh perubahan Anda. Anda mungkin melewatkan satu atau dua repository dan deployment mereka akan gagal di production.
Dalam Nx Monorepo, ketika Anda mengubah signature sebuah function di library, IDE Anda akan langsung menunjukkan semua tempat yang perlu diupdate di seluruh monorepo. Anda bisa melakukan refactoring besar-besaran dengan confidence karena semua perubahan terkait ada dalam satu atomic commit. Jika ada yang salah, Anda bisa revert seluruh perubahan dengan satu git revert. Test suite Anda juga akan langsung memberitahu jika ada breaking change yang Anda lewatkan.
Code Sharing yang Natural
Dalam contoh kode kita, perhatikan bagaimana user-service dan product-service keduanya menggunakan library database, logger, dan models. Mereka berbagi kode yang sama persis tanpa perlu khawatir tentang version mismatch. Jika Anda meningkatkan performa connection pooling di library database, semua services langsung mendapat benefit-nya dalam deployment berikutnya.
Ini juga mendorong standarisasi dalam tim. Ketika semua services menggunakan logger yang sama, log format Anda konsisten di seluruh sistem. Ketika semua services menggunakan auth library yang sama, Anda tahu persis bahwa JWT validation bekerja identik di mana-mana. Ini membuat debugging dan monitoring jauh lebih mudah.
Best Practices dan Tips
Setelah memahami konsep dan implementasinya, ada beberapa best practices yang perlu Anda perhatikan untuk memaksimalkan manfaat dari Nx Monorepo.
Organisasi Libraries yang Baik
Jangan tergoda untuk membuat satu giant library yang berisi segalanya. Sebaliknya, pecah libraries berdasarkan domain atau functionality yang jelas. Auth library hanya menghandle authentication dan authorization. Database library hanya menghandle connection dan query utilities. Models library hanya berisi data structures. Pemisahan ini membuat dependency graph lebih clean dan memudahkan reasoning tentang dampak perubahan.
Pertimbangkan juga untuk membuat layers dalam libraries Anda. Misalnya, Anda bisa memiliki low-level libraries yang tidak memiliki dependencies eksternal seperti utils, mid-level libraries yang bergantung pada low-level libraries seperti database dan auth, dan high-level libraries seperti business-logic yang mengkomposisikan berbagai libraries lain. Ini menciptakan clear dependency direction dan mencegah circular dependencies.
Testing Strategy
Dalam monorepo, strategi testing Anda harus lebih sophisticated. Setiap library harus memiliki test suite-nya sendiri yang comprehensive. Ini penting karena libraries digunakan oleh banyak aplikasi, jadi bug dalam library bisa mempengaruhi banyak bagian sistem. Aplikasi juga harus memiliki test sendiri, terutama integration tests yang memverifikasi bahwa komposisi berbagai libraries bekerja dengan benar.
Manfaatkan Nx caching untuk mempercepat test execution. Ketika Anda menjalankan test yang sama berkali-kali tanpa ada perubahan kode, Nx akan menggunakan cached results. Ini sangat membantu dalam development loop dimana Anda sering menjalankan test sebelum commit.
Versioning dan Deployment
Meskipun semua kode ada dalam satu repository, Anda tetap perlu memikirkan versioning dan deployment strategy. Setiap aplikasi bisa di-deploy secara independen dengan version-nya sendiri. Anda bisa menggunakan semantic versioning dimana breaking changes di shared library memicu major version bump untuk aplikasi yang menggunakannya.
Untuk deployment, pertimbangkan untuk menggunakan container orchestration seperti Kubernetes. Setiap service bisa di-build menjadi container image terpisah dan di-deploy secara independen, bahkan jika kodenya ada dalam satu monorepo. CI/CD pipeline Anda bisa menggunakan nx affected:build untuk hanya rebuild dan redeploy services yang terpengaruh oleh perubahan tertentu.
Tantangan dan Solusinya
Tidak ada silver bullet dalam software engineering, dan monorepo pun memiliki tantangannya sendiri. Mari kita diskusikan beberapa tantangan umum dan bagaimana mengatasinya.
Repository Size dan Performance
Seiring waktu, monorepo bisa menjadi sangat besar, terutama jika menyimpan banyak assets atau memiliki history git yang panjang. Ini bisa memperlambat operasi git seperti clone dan checkout. Solusinya adalah menggunakan Git features seperti shallow clone dan sparse checkout. Anda juga bisa menggunakan Git LFS untuk large files dan mempertimbangkan untuk mengarsipkan old branches secara regular.
Nx membantu dengan masalah ini melalui intelligent caching dan computation distribution. Bahkan dalam monorepo dengan ratusan projects, Nx hanya akan menjalankan tasks yang benar-benar diperlukan, bukan semua tasks untuk semua projects.
Access Control dan Ownership
Dalam multi-repo, setiap tim bisa memiliki repository mereka sendiri dengan access control yang granular. Dalam monorepo, semua orang memiliki akses ke semua kode. Ini bisa menjadi concern untuk organisasi besar. Solusinya adalah menggunakan CODEOWNERS file di GitHub untuk mendefinisikan ownership dan mengharuskan review dari owner sebelum merge. Anda juga bisa menggunakan branch protection rules dan required checks untuk memastikan quality standards.
Nx mendukung code ownership concepts melalui tags system. Anda bisa memberi tag pada projects dan membuat lint rules yang enforce bahwa code dari satu scope tidak bisa depend on code dari scope lain tanpa explicit permission.
Onboarding Developer Baru
Monorepo besar bisa overwhelming untuk developer baru. Mereka perlu memahami struktur keseluruhan, dependency relationships, dan tooling yang digunakan. Investasi dalam dokumentasi sangat penting. Buat architecture decision records yang menjelaskan mengapa struktur tertentu dipilih. Maintain up-to-date README di setiap project yang menjelaskan purposenya dan bagaimana cara menjalankannya. Gunakan Nx graph visualization untuk membantu developer baru memahami system architecture secara visual.
Kesimpulan
Monorepo dengan Nx menawarkan cara yang powerful untuk mengelola multiple projects dan shared code dalam satu repository terpusat. Melalui implementasi Golang yang kita bahas, Anda bisa melihat bagaimana konsep ini diterapkan dalam praktik nyata, dari struktur direktori hingga kode implementation yang konkret.
Keuntungan utama dari pendekatan ini adalah code sharing yang natural, refactoring yang lebih aman, atomic changes, dan visibility yang lebih baik terhadap keseluruhan codebase. Dengan Nx sebagai build system, Anda mendapat intelligent caching, affected computation, dan dependency graph analysis yang membuat bekerja dengan monorepo besar tetap efficient dan productive.
Tentu saja, monorepo bukanlah solusi untuk semua kasus. Untuk proyek kecil atau tim yang sangat independent, multi-repo mungkin lebih cocok. Namun untuk organisasi yang memiliki banyak services yang saling related, banyak shared code, atau ingin meningkatkan collaboration antar tim, Nx Monorepo adalah pilihan yang sangat compelling.
Kunci kesuksesan dengan monorepo adalah tooling yang baik, best practices yang consistent, dan investment dalam infrastructure dan dokumentasi. Dengan foundation yang solid seperti yang telah kita bahas, Anda bisa membangun sistem yang scalable dan maintainable yang akan bertahan dalam jangka panjang.
Sekarang giliran Anda untuk mencoba. Mulai dengan monorepo kecil, eksplorasi Nx features, dan rasakan sendiri bagaimana workflow development Anda menjadi lebih smooth dan productive. Selamat mencoba!
Praktek
Bagian 1: Persiapan Environment
Sebelum kita mulai membangun monorepo, kita perlu memastikan semua tools yang diperlukan sudah terinstall di komputer Anda. Mari kita lakukan persiapan ini langkah demi langkah.
Menginstall Golang
Pertama-tama, Anda memerlukan Golang versi 1.21 atau lebih tinggi. Untuk menginstallnya, kunjungi website resmi Golang di https://golang.org/dl/ dan download installer sesuai sistem operasi Anda. Setelah download selesai, jalankan installer dan ikuti instruksinya.
Setelah instalasi selesai, buka terminal dan verifikasi bahwa Golang sudah terinstall dengan benar dengan menjalankan perintah berikut:
Anda seharusnya melihat output yang menampilkan versi Golang yang terinstall, misalnya "go version go1.25.0 darwin/amd64". Jika perintah ini tidak ditemukan, Anda mungkin perlu menambahkan Go ke PATH environment variable Anda. Biasanya installer akan melakukan ini secara otomatis, tetapi jika tidak berhasil, Anda perlu menambahkan direktori instalasi Go ke PATH secara manual.
Menginstall Node.js dan npm
Meskipun kita membangun aplikasi Golang, Nx sendiri adalah tool yang berbasis Node.js, jadi kita perlu menginstall Node.js dan npm (Node Package Manager). Kunjungi https://nodejs.org/ dan download versi LTS (Long Term Support) yang stabil. Versi 18 atau lebih tinggi sangat direkomendasikan.
Setelah instalasi, verifikasi dengan menjalankan:
Kedua perintah ini seharusnya menampilkan nomor versi. Jika berhasil, itu berarti Node.js dan npm sudah siap digunakan.
Menginstall Nx CLI
Sekarang kita akan menginstall Nx CLI secara global di sistem Anda. Nx CLI adalah command-line tool yang akan kita gunakan untuk mengelola monorepo. Jalankan perintah berikut di terminal:
Perintah ini akan menginstall Nx secara global sehingga Anda bisa menggunakannya dari direktori mana pun. Proses instalasi mungkin memakan waktu beberapa menit tergantung kecepatan internet Anda. Setelah selesai, verifikasi instalasi dengan:
Anda seharusnya melihat nomor versi Nx yang terinstall.
Menginstall Git
Git adalah version control system yang akan kita gunakan untuk mengelola kode. Kebanyakan sistem sudah memiliki Git terinstall, tetapi jika belum, download dari https://git-scm.com/downloads dan install sesuai sistem operasi Anda.
Verifikasi instalasi Git dengan:
Menginstall PostgreSQL
Untuk contoh aplikasi kita, kita akan menggunakan PostgreSQL sebagai database. Anda bisa download PostgreSQL dari https://www.postgresql.org/download/ atau menggunakan package manager sistem Anda.
Untuk macOS menggunakan Homebrew:
Untuk Ubuntu/Debian:
Setelah PostgreSQL berjalan, buat database untuk aplikasi kita:
Menginstall Tools Tambahan (Opsional tapi Direkomendasikan)
Untuk pengalaman development yang lebih baik, install juga tools berikut:
Pertama, golangci-lint untuk linting kode Go:
Kedua, install Visual Studio Code atau IDE favorit Anda dengan extension untuk Go dan Nx.
Bagian 2: Membuat Struktur Monorepo
Sekarang setelah semua tools terinstall, mari kita mulai membuat struktur monorepo dari nol. Proses ini akan kita lakukan secara bertahap agar Anda memahami setiap langkah.
Inisialisasi Project
Pertama, buat direktori untuk monorepo kita dan masuk ke dalamnya:
Inisialisasi Git repository di direktori ini:
Sekarang kita akan menginisialisasi Nx workspace. Jalankan perintah berikut:
Perintah ini akan membuat file package.json yang diperlukan untuk mengelola dependencies Node.js. Sekarang kita install Nx sebagai dev dependency di project ini:
Proses instalasi akan memakan waktu beberapa menit karena Nx memiliki banyak dependencies. Setelah selesai, Anda akan melihat folder node_modules dan file package-lock.json di direktori project Anda.
Membuat Struktur Direktori
Sekarang mari kita buat struktur folder untuk monorepo kita. Kita akan membuat folder apps untuk aplikasi dan folder libs untuk shared libraries:
Perintah mkdir dengan flag -p akan membuat semua parent directories yang diperlukan secara otomatis. Setelah menjalankan perintah ini, Anda akan memiliki struktur folder dasar untuk monorepo.
Membuat Nx Configuration Files
Sekarang kita perlu membuat file konfigurasi Nx. Pertama, buat file nx.json di root direktori:
File ini mendefinisikan konfigurasi global untuk Nx workspace. Kita mengatur bahwa operasi build, test, dan lint bisa di-cache untuk meningkatkan performa. Kita juga mengatur bahwa maksimal 3 tasks bisa berjalan parallel.
Inisialisasi Go Workspace
Go versi 1.18 ke atas mendukung fitur workspace yang sempurna untuk monorepo. Mari kita inisialisasi Go workspace:
Perintah ini akan membuat file go.work di root direktori. File ini akan mencatat semua Go modules dalam monorepo kita.
Sekarang kita juga membuat file go.mod di root untuk metadata workspace:
Membuat .gitignore
Sebelum kita mulai menulis kode, mari kita buat file .gitignore agar file-file yang tidak perlu tidak masuk ke Git:
Bagian 3: Membuat Shared Libraries
Sekarang kita akan mulai membuat shared libraries yang akan digunakan oleh berbagai aplikasi. Kita akan membuat satu per satu dengan penjelasan lengkap.
Membuat Library Models
Library models akan berisi definisi data structures yang dibagikan antar services. Mari kita buat:
Sekarang tambahkan module ini ke Go workspace dengan kembali ke root direktori dan menjalankan:
Buat file untuk User model:
Buat file untuk Product model:
Buat Nx project configuration untuk library ini:
Membuat Library Logger
Library logger akan menyediakan structured logging untuk semua services:
Buat file logger.go:
Buat project.json:
Membuat Library Auth
Library auth akan menangani JWT authentication:
Buat file jwt.go:
Buat project.json:
Membuat Library Database
Library database akan menyediakan connection pooling:
Buat file connection.go:
Buat project.json:
Bagian 4: Membuat Aplikasi User Service
Sekarang kita akan membuat aplikasi pertama kita yang menggunakan libraries yang sudah kita buat.
Inisialisasi User Service Module
Sekarang tambahkan dependencies ke libraries kita di go.mod user-service:
Perhatikan bagian replace yang sangat penting. Ini memberitahu Go untuk menggunakan versi lokal dari libraries kita, bukan mencarinya di internet.
Membuat Main Application
Buat file main.go untuk user-service:
Membuat Nx Project Configuration
Buat project.json untuk user-service:
Download Dependencies
Sekarang download semua Go dependencies:
Bagian 5: Menjalankan dan Testing
Sekarang kita siap untuk menjalankan aplikasi kita!
Menjalankan User Service
Untuk menjalankan user service, gunakan Nx:
Atau jika Anda ingin menjalankan langsung dengan Go:
Anda seharusnya melihat log yang menunjukkan service sudah berjalan di port 8081.
Testing dengan curl
Buka terminal baru dan test health check endpoint:
Anda seharusnya mendapat response:
Test create user endpoint:
Test login endpoint:
Menjalankan Tests dengan Nx
Untuk menjalankan tests untuk specific project:
Untuk menjalankan tests untuk semua projects:
Melihat Dependency Graph
Salah satu fitur menarik Nx adalah visualisasi dependency graph:
Ini akan membuka browser dan menampilkan grafik interaktif yang menunjukkan bagaimana semua projects dalam monorepo saling berhubungan.
Building Applications
Untuk build user-service:
Binary yang dihasilkan akan ada di folder dist/user-service.
Untuk build semua applications:
Bagian 6: Menambahkan Service Baru
Sekarang Anda sudah memahami alurnya, mari kita buat service kedua dengan cepat.
Membuat Product Service
Buat go.mod dengan dependencies:
Buat main.go:
Buat project.json:
Download dependencies:
Sekarang Anda bisa menjalankan product service:
Test dengan curl:
Bagian 7: Menggunakan Nx Commands
Sekarang mari kita eksplorasi berbagai Nx commands yang sangat berguna untuk development sehari-hari.
Menjalankan Multiple Services Sekaligus
Untuk menjalankan beberapa services secara bersamaan, buka terminal terpisah untuk masing-masing service, atau gunakan tool seperti Tmux atau gunakan npm script.
Tambahkan script di package.json:
Sekarang Anda bisa menggunakan npm scripts:
Menggunakan Affected Commands
Salah satu fitur paling powerful dari Nx adalah affected commands. Ini akan menjalankan tasks hanya untuk projects yang terpengaruh oleh perubahan Anda.
Misalnya, jika Anda mengubah library auth, Anda ingin test semua applications yang menggunakannya:
Ini sangat menghemat waktu di CI/CD pipeline. Bayangkan monorepo dengan 50 services - Anda tidak perlu build dan test semuanya setiap kali ada perubahan kecil.
Nx Cache
Nx secara otomatis men-cache hasil dari tasks. Jika Anda menjalankan test yang sama dua kali tanpa mengubah kode, hasil kedua akan diambil dari cache:
Untuk clear cache:
Filtering Projects
Anda bisa menjalankan commands untuk specific projects atau projects dengan tags tertentu:
Bagian 8: Environment Variables dan Configuration
Untuk mengelola environment variables dengan baik, mari kita buat file .env:
Copy ke .env untuk development:
Tambahkan .env ke .gitignore (seharusnya sudah ada):
Untuk load environment variables saat development, Anda bisa menggunakan library seperti godotenv. Install di masing-masing service:
Kemudian update main.go untuk load .env:
Bagian 9: Database Migrations
Mari kita setup database migrations untuk mengelola schema database.
Install Migration Tool
Install golang-migrate:
Membuat Migration Scripts
Buat folder untuk migrations:
Buat migration untuk users table:
Edit file migration up:
Edit file migration down:
Buat migration untuk products:
Menjalankan Migrations
Buat script untuk menjalankan migrations:
Buat executable:
Jalankan migrations:
Tambahkan script ke package.json:
Bagian 10: Docker Setup untuk Development
Mari kita setup Docker untuk memudahkan development environment.
Membuat Docker Compose
Membuat Dockerfile untuk Services
Buat Dockerfile untuk user-service:
Buat Dockerfile untuk product-service:
Menjalankan dengan Docker Compose
Bagian 11: Testing dan Quality Assurance
Membuat Unit Tests
Buat test untuk auth library:
Jalankan tests:
Setup Linting dengan golangci-lint
Buat file konfigurasi golangci-lint di root:
Jalankan linting:
Bagian 12: CI/CD Pipeline
Membuat GitHub Actions Workflow
Buat folder untuk GitHub Actions:
bash
Buat workflow file:
Bagian 13: Troubleshooting Common Issues
Issue: Import Errors
Jika Anda mendapat error "package not found":
Issue: Nx Cache Problems
Jika Nx cache menyebabkan masalah:
Issue: Port Already in Use
Jika port sudah digunakan:
Kesimpulan
Sekarang Anda memiliki Nx Monorepo Golang yang fully functional dengan:
Last updated