Feature Flags & Gradual Rollouts — DevOps

Deploy ≠ Release Feature flag (atau feature toggle) memisahkan kapan kode di-deploy dari kapan user mendapat fitur. Kode bisa sudah ada di production, tapi…

Deploy ≠ Release

Feature flag (atau feature toggle) memisahkan kapan kode di-deploy dari kapan user mendapat fitur. Kode bisa sudah ada di production, tapi disembunyikan di balik flag. Saat siap, flip flag → fitur live, tanpa deploy ulang.

Contoh Dasar

// Tanpa feature flag
function Checkout() {
  return <NewCheckoutFlow />;    // langsung semua user dapat
}

// Dengan feature flag
function Checkout({ user }) {
  if (flags.isEnabled("new_checkout", user)) {
    return <NewCheckoutFlow />;
  }
  return <OldCheckoutFlow />;
}

Use Case 1: Kill Switch

Fitur baru di production tiba-tiba bikin error spike. Daripada rollback deploy (5-15 menit), flip flag → fitur mati dalam detik. Error hilang, tim debug dengan tenang.

// Backend
if (!flags.isEnabled("new_payment_provider")) {
  return legacyPayment.charge(amount);
}
return newPaymentProvider.charge(amount);

// Flip flag di dashboard → instant rollback tanpa deploy

Use Case 2: Percentage Rollout

Deploy fitur baru, aktifkan untuk 5% user dulu. Monitor error rate, latency, conversion. Jika sehat → naikkan ke 20%, 50%, 100%. Jika bermasalah → turunkan ke 0%.

# Dashboard flag provider
feature: new_search_algorithm
rollout:
  - environment: production
    percentage: 5         # 5% traffic random
    sticky: true          # user yang sudah masuk grup, tetap di grup

Hash user ID → percentage → stable. User yang pertama dapat fitur, selalu dapat (bukan flip tiap request).

Use Case 3: Targeted Rollout

Aktifkan fitur hanya untuk segment tertentu — tim internal, beta tester, user tertentu, region tertentu.

# Rules di dashboard
target:
  - segment: internal_employees
    enabled: true
  - segment: beta_testers
    enabled: true
  - attribute: user.plan
    equals: "enterprise"
    enabled: true
  - default: false

Cocok untuk canary internal: tim product/engineering pakai dulu selama seminggu sebelum launch publik.

Use Case 4: A/B Testing

Feature flag adalah pondasi A/B test — bagi user ke variant A dan B, ukur metric bisnis (conversion rate, revenue per user). Bedakan dari rollout:

Provider Populer

Provider menyediakan: SDK untuk app, dashboard untuk config, evaluasi real-time, audit log, targeting rules.

Pairing dengan Trunk-Based Development

Feature flag memungkinkan trunk-based development: semua orang commit ke main, tidak ada long-lived feature branch. Fitur setengah jadi di-merge dengan flag OFF — tidak visible untuk user tapi kode integrated. Saat siap → flip flag ON.

Flag Debt & Cleanup

Masalah umum: flag dibuat untuk rollout, setelah 100% on selama 2 bulan, flag masih ada di kode. Jumlah flag bertambah terus → kode berantakan, conditional bercabang, test suite lambat.

# Kode jadi begini setelah 50 flag lama:
if (flags.isEnabled("feature_a")) {
  if (flags.isEnabled("feature_b")) {
    if (flags.isEnabled("feature_c")) {
      // kombinasi yang sulit di-test
    }
  }
}

Best practice:

Trade-offs yang Harus Dipahami

Yang akan kamu pelajari