Monorepo vs Multirepo #

Salah satu keputusan pertama yang perlu dibuat saat mengorganisasi konfigurasi Terraform di skala tim adalah: taruh semua di satu repository, atau pisahkan ke beberapa repository? Tidak ada jawaban universal yang berlaku untuk semua konteks. Monorepo mempermudah visibilitas dan refactoring lintas konfigurasi; multirepo memberikan isolasi dan ownership yang lebih jelas. Pilihannya bergantung pada ukuran tim, arsitektur infrastruktur, dan bagaimana kamu ingin mengelola dependency antar komponen.

Monorepo: Semua di Satu Tempat #

STRUKTUR MONOREPO TIPIKAL:

infra-repo/
  ├── modules/                  ← Shared modules
  │   ├── networking/
  │   ├── compute/
  │   └── database/
  │
  ├── environments/
  │   ├── dev/
  │   │   ├── networking/
  │   │   ├── compute/
  │   │   └── database/
  │   ├── staging/
  │   │   └── ...
  │   └── production/
  │       └── ...
  │
  ├── .github/workflows/        ← Satu CI/CD pipeline
  ├── .gitignore
  └── README.md

Semua infrastruktur ada di satu repository, dikelola bersama.
KEUNTUNGAN MONOREPO:

  ✓ Visibilitas penuh — semua perubahan terlihat di satu tempat
  ✓ Refactoring lebih mudah — ubah module, sekaligus update semua pemanggilnya
  ✓ Dependency antar konfigurasi lebih mudah dilacak
  ✓ Satu CI/CD pipeline untuk semua
  ✓ Lebih mudah untuk tim kecil yang mengelola semua infrastruktur
  ✓ Tidak ada versioning complexity antar module dan pemanggilnya

KELEMAHAN MONOREPO:

  ✗ Repository bisa jadi besar dan lambat seiring waktu
  ✗ Satu commit bisa mempengaruhi CI/CD untuk semua komponen
  ✗ Akses kontrol lebih sulit (sulit restrict tim tertentu ke folder tertentu)
  ✗ Perubahan modul yang tidak hati-hati bisa breaking semua pemanggilnya
  ✗ Coupling yang lebih ketat antar tim

Multirepo: Satu Repository per Komponen #

STRUKTUR MULTIREPO TIPIKAL:

  infra-networking-repo/
    ├── modules/vpc/
    ├── environments/dev/
    ├── environments/staging/
    └── environments/production/

  infra-compute-repo/
    ├── modules/ec2/
    ├── modules/asg/
    └── environments/...

  infra-database-repo/
    ├── modules/rds/
    └── environments/...

  infra-modules-repo/           ← Shared modules di repo terpisah
    ├── networking/
    ├── compute/
    └── database/
    # Versi: v1.0.0, v1.1.0, v2.0.0

  Setiap tim punya repository sendiri dengan akses dan pipeline terpisah.
KEUNTUNGAN MULTIREPO:

  ✓ Isolasi yang jelas — perubahan di satu repo tidak mempengaruhi yang lain
  ✓ Akses kontrol per-repository — tim database tidak bisa modifikasi networking
  ✓ Pipeline CI/CD lebih spesifik dan lebih cepat
  ✓ Module bisa punya versioning sendiri (v1.0, v1.1, v2.0)
  ✓ Tim bisa bergerak lebih independen

KELEMAHAN MULTIREPO:

  ✗ Visibilitas berkurang — sulit melihat gambaran besar infrastruktur
  ✗ Dependency management kompleks — harus kelola versi module antar repo
  ✗ Refactoring lintas repo lebih sulit dan perlu koordinasi
  ✗ Duplikasi pattern/konvensi jika tidak ada shared guidelines
  ✗ Overhead management lebih banyak (banyak repo, banyak pipeline)

Memilih Berdasarkan Konteks #

PILIH MONOREPO JIKA:

  Tim kecil (< 5 engineer):
    Overhead multirepo tidak sebanding, semua orang sudah tahu semua
    infrastruktur, monorepo memberikan visibilitas yang dibutuhkan

  Infrastruktur yang saling terkait erat:
    Networking, compute, dan database sering berubah bersama
    Refactoring lintas komponen sering terjadi

  Baru mulai dengan Terraform:
    Mulai sederhana, pecah menjadi multirepo nanti jika perlu
    "Premature separation" lebih berbahaya dari monorepo yang tumbuh besar

  Satu tim yang mengelola semua infrastruktur:
    Tidak ada kebutuhan isolasi antar tim

PILIH MULTIREPO JIKA:

  Tim besar dengan ownership yang jelas:
    Tim A hanya touch networking, Tim B hanya touch database
    Isolasi akses penting untuk governance

  Module yang dipakai banyak tim:
    Module perlu punya versi sendiri agar bisa di-upgrade secara bertahap
    Breaking change di module tidak langsung mempengaruhi semua pemanggilnya

  Compliance requirement:
    Audit harus terpisah per domain (network audit, data audit)
    Akses ke production database config tidak boleh ada di repo yang sama
    dengan compute

  Infrastruktur yang sudah mature dan stabil:
    Komponen sudah jarang refactoring lintas domain
    Pemisahan sudah natural sesuai ownership tim

Hybrid: Monorepo per Domain #

Pendekatan yang sering dipakai oleh tim menengah ke besar adalah monorepo per domain — satu repo untuk networking, satu repo untuk platform, satu repo untuk aplikasi, dan satu repo khusus untuk shared modules.

HYBRID STRUCTURE:

  infra-foundation-repo/        ← Tim Platform / Infrastructure
    ├── networking/
    ├── security/
    └── shared-services/

  infra-platform-repo/          ← Tim Platform Engineering
    ├── kubernetes/
    ├── observability/
    └── cicd-infrastructure/

  infra-app-repo/               ← Tim Application
    ├── environments/dev/
    ├── environments/staging/
    └── environments/production/

  terraform-modules-repo/       ← Tim Platform — dipakai semua
    ├── vpc/
    ├── eks/
    ├── rds/
    └── CHANGELOG.md

Ini memberikan isolasi yang cukup tanpa fragmentasi berlebihan.

Praktik yang Berlaku di Kedua Pendekatan #

Ada beberapa praktik yang penting terlepas dari monorepo atau multirepo.

# 1. Satu sumber kebenaran untuk versi Terraform
# Gunakan .terraform-version atau required_version di semua konfigurasi
terraform {
  required_version = ">= 1.6, < 2.0"
}

# 2. Lock file selalu di-commit
# .terraform.lock.hcl harus ada di .gitignore EXCEPTION
# (exclude semua tapi include lock file)
# .gitignore:
# .terraform/
# !.terraform.lock.hcl  ← khusus ini di-include

# 3. CODEOWNERS untuk kontrol review
# .github/CODEOWNERS:
# /environments/production/  @infrastructure-team @senior-engineers
# /modules/                  @platform-team

# 4. Konvensi direktori yang konsisten
# Terlepas dari monorepo/multirepo, struktur internal harus seragam
# environments/
#   dev/        staging/        production/
# (bukan: dev/  stg/  prod/ — inkonsistensi membingungkan)

Ringkasan #

  • Tidak ada pilihan universally better — monorepo lebih baik untuk tim kecil dan infrastruktur yang saling terkait, multirepo lebih baik untuk tim besar dengan ownership yang jelas.
  • Mulai dengan monorepo jika baru mulai — lebih mudah dipecah nanti sesuai kebutuhan, tapi sulit menggabungkan multirepo yang sudah ada.
  • Multirepo membutuhkan module versioning — module di repo terpisah harus punya versioning eksplisit agar pemanggilnya bisa upgrade secara bertahap.
  • Hybrid per-domain adalah sweet spot untuk tim menengah — satu repo per domain (networking, platform, app) dengan satu repo terpisah untuk shared modules.
  • CODEOWNERS di GitHub/GitLab membantu enforce siapa yang harus review perubahan di direktori tertentu — penting untuk monorepo yang dikelola banyak tim.
  • .terraform.lock.hcl harus di-commit di kedua pendekatan — memastikan semua orang dan pipeline menggunakan versi provider yang persis sama.

← Sebelumnya: Common Security Mistake   Berikutnya: Lifecycle Management →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact