Episode ini menyiapkan tim menghadapi produksi: runbook untuk app crashes dan release issues, monitoring stabilitas dengan analytics dan error reporting, strategi rollout dan rollback, serta team workflows untuk maintenance yang berkelanjutan.

Aplikasi yang dikirim bukan akhir perjalanan — justru awal tanggung jawab operasional. Episode 19 mempersiapkan kalian untuk menjaga aplikasi di produksi: runbook untuk menangani crash dan masalah rilis, monitoring stabilitas lewat analytics dan error reporting, strategi rollout dan rollback, serta workflow tim untuk maintenance.
Runbook adalah dokumen langkah demi langkah untuk menangani insiden. Tanpa runbook, tim panik dan membuat keputusan ad hoc saat produksi bermasalah. Runbook yang baik menjawab tiga pertanyaan: apa gejalanya, siapa yang bertanggung jawab, dan apa langkah mitigasinya.
Minimal, dokumentasikan skenario paling sering:
Judul: Crash rate di atas ambang batas
Trigger: Crashlytics memperingatkan crash rate > 1%
Langkah 1: Buka dashboard crash teratas pada versi aktif.
Langkah 2: Cek apakah terkait rilis terakhir (diff commit).
Langkah 3: Jika ya, aktifkan rollback ke versi stabil sebelumnya.
Langkah 4: Catat insiden di ticket dan kabari tim.Simpan runbook di repository tim atau wiki, dan tinjau ulang setiap bulan. Runbook yang tidak pernah diuji sama buruknya dengan tidak punya runbook.
Crash yang tidak dilaporkan tidak pernah diperbaiki. Integrasikan error reporting sejak dini:
flutter pub add firebase_crashlytics firebase_coreInisialisasi Firebase di main:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(const MyApp());
}Firebase.initializeApp() menyiapkan konfigurasi Firebase sebelum aplikasi di-render. Untuk menangkap error yang tidak tertangani, pasang handler global di runApp dengan FlutterError.onError yang meneruskan ke Crashlytics.
Selain crash, catat error yang tidak mematikan:
try {
await repository.sync();
} catch (e) {
FirebaseCrashlytics.instance.recordError(e, StackTrace.current);
}FirebaseCrashlytics.instance.recordError mengirim error non-fatal ke dashboard. Jangan mencatat data sensitif — sanitasi pesan error sebelum dikirim.
Analytics (misal Firebase Analytics atau Sentry) memberi konteks: pengguna macam apa yang mengalami masalah, di layar mana, dan dengan versi apa. Konteks ini mengubah error reporting dari "ada crash" menjadi "crash pada layar checkout untuk pengguna versi 1.2.0 di Android 14".
Jangan rilis ke 100 persen pengguna sekaligus. Strategi bertahap:
flutter run --release -t lib/main.dartflutter run --release -t lib/main.dart memakai entry point tertentu. Untuk multiple entry point, tiap -t menargetkan konfigurasi berbeda — pola yang dipakai untuk memisahkan build staging dan production.
Rollback harus lebih cepat daripada perbaikan kode:
Keputusan rollback harus dibuat berdasarkan data (crash rate, error rate), bukan perasaan. Tentukan ambang batas saat perencanaan rilis, bukan saat panik.
Semua pekerjaan maintenance mengalir dari ticket atau alert:
Definisikan aturan ini dengan tim dan tempelkan di tempat yang terlihat.
Rilis kecil dan sering lebih aman daripada rilis besar yang jarang:
flutter analyze && flutter testflutter analyze && flutter test adalah pintu masuk rilis. Kombinasikan dengan semantic-release (episode 14) untuk menghasilkan changelog dan versi otomatis, dan pastikan runbook diperbarui setiap kali alur berubah.
Inti yang harus dibawa pulang:
Di episode 20 selanjutnya kita membahas real-world use cases dan patterns — contoh kasus e-commerce, fintech, productivity, dan SaaS apps, design patterns MVVM, Clean Architecture, dan Redux, feature-driven development dan iterative releases, serta cara membangun produk Flutter yang maintainable. Kalian melihat gambaran besar dari semuanya.