Membahas cara menyimpan konfigurasi Hermes sebagai sumber tunggal agar build reproducible, memvalidasi artefak build di CI, serta mengintegrasikan linting dan release pipeline supaya setiap rilis melewati pemeriksaan yang sama.

Episode 10 menutup rantai observability: source maps, stack trace yang readable, dan telemetry yang rapi. Sekarang kita mundur satu langkah ke sisi yang tidak terlihat: bagaimana memastikan setiap build menghasilkan bytecode yang sama, tervalidasi, dan layak rilis. Tanpa ini, source map yang bagus pun jadi kebohongan kalau build-nya tidak bisa diulang.
Roadmap episode 11: menyimpan konfigurasi Hermes untuk build reproducibility, memvalidasi output build dengan CI checks, lalu mengintegrasikan semuanya dengan linting serta release pipelines.
Masalah klasik tim: developer A membangun dengan flag -O, developer B lupa, dan bytecode yang dihasilkan berbeda di perangkat mereka. Solusinya sederhana — konfigurasi Hermes harus menjadi kode yang di-commit, bukan perintah yang dihafal. Di React Native, flag kompiler disimpan di build.gradle:
react {
hermesFlags = [
"-O",
"-output-source-map",
]
}Untuk workload embeddable di luar React Native, simpan perintah kompilasi dalam skrip yang dipanggil bersama, misalnya scripts/compile.sh. Jangan pernah menjalankan hermesc secara ad hoc tanpa dokumentasi flag. Kalau konfigurasi berubah, perubahan itu harus terlihat di code review seperti perubahan kode lain.
Sumber kebenaran tunggal ini yang membuat build reproducible: selama semua orang memakai file yang sama, bytecode yang dihasilkan identik.
Reproducibility tidak cukup dengan flag yang sama. Versi toolchain juga harus terkunci:
hermesc untuk embedding custom. Bytecode terkunci ke versi engine — ingat pelajaran dari episode 13 nanti.bun.lock atau package-lock.json wajib ikut repo, dan instalasi CI memakai mode frozen, misalnya bun install --frozen-lockfile.hermesc -version
node --version
bun --versionJalankan ketiga perintah di atas saat CI mulai, lalu catat output-nya sebagai bagian dari laporan build. Ketika bug muncul, kalian bisa membedakan "masalah di kode" dan "masalah di toolchain" hanya dari catatan ini.
Info
Mode frozen lockfile adalah gerbang pertama reproducibility: kalau ada dependency yang tidak tercatat, instalasi langsung gagal, bukan diam-diam menghasilkan bytecode yang berbeda.
Build yang sukses belum tentu output-nya benar. CI harus memvalidasi artefak sebelum dianggap layak. Pemeriksaan minimum:
hbcdump.Skrip validasi bisa sesederhana ini:
set -e
test -s dist/index.android.bundle
test -s dist/index.android.map
hbcdump -summary dist/index.android.bundleKalau salah satu pemeriksaan gagal, skrip keluar dengan kode non-nol dan CI pun merah. Membuat pemeriksaan otomatis seperti ini jauh lebih murah daripada menemukan bundle rusak di tangan user.
Integrasi dilakukan di workflow. Berikut contoh langkah-langkah yang biasa dipakai dalam pipeline build Hermes:
name: hermes-build-check
on:
pull_request:
push:
branches: [main, staging]
jobs:
validate:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install dependencies
run: bun install --frozen-lockfile
- name: Build bundle
run: bun run build:content
- name: Validate artifacts
run: bash scripts/validate-artifacts.sh
- name: Upload source maps
run: bash scripts/upload-sourcemaps.shPerhatikan bahwa setiap pull request sudah melewati alur yang sama dengan release: install terkunci, build, validasi, dan upload source map. Ini membuat release pipeline tidak punya kejutan — hal yang biasanya baru muncul justru di langkah terakhir sebelum rilis.
Konfigurasi build juga perlu dijaga lewat linting. Beberapa praktik yang terbukti:
hermesFlags yang tidak diizinkan atau source map yang hilang pada build release.rc atau versi stabil bisa dipromosikan.Release pipeline yang baik bersifat deterministik: urutan yang sama dijalankan, artefak yang sama dihasilkan, dan keputusan layak rilis diambil oleh CI, bukan oleh ingatan manusia.
Dengan konfigurasi yang disimpan sebagai kode, toolchain yang terkunci, dan CI yang memvalidasi setiap artefak, kalian punya fondasi build yang bisa diulang dan dipercaya. Linting dan gerbang release menutup siklusnya: tidak ada yang rilis tanpa melewati pemeriksaan yang sama.
Inti yang harus dibawa pulang:
Di episode 12 kita masuk fase baru: Secure Runtime Practices. Kalian akan belajar memuat bundel JavaScript dengan aman, menghindari remote code execution dan eval yang tidak aman, serta mitigasi praktis untuk aplikasi mobile dan edge. Sampai jumpa!