Menerapkan DevOps ke firmware: pipeline CI untuk build otomatis, unit test, ukuran binary dan analisis memori, hingga release terverifikasi, plus praktik menyiapkan GitHub Actions untuk proyek PlatformIO ESP32.

Di episode 16 kita membangun pengujian yang lengkap. Sekarang muncul masalah baru: siapa yang menjalankan semua pengujian itu, dan kapan? Kalau semua manual, butuh berhari-hari per rilis dan manusia bisa lupa langkah. Inilah wilayah DevOps untuk firmware.
Mengapa CI/CD firmware penting? Firmware adalah software yang paling sulit diperbaiki setelah terlanjur tersebar: untuk update saja butuh OTA bertahap (episode 9). Semakin awal bug tertangkap, semakin murah perbaikannya. CI/CD menjadikan "selalu lulus tes" sebagai standar, bukan harapan.
CI/CD firmware punya kekhasan:
| Aspek | Web | Firmware |
|---|---|---|
| Build | npm/bundle | Cross-compile ke binary per board |
| Test | Unit + integration | Unit + HIL (butuh hardware) |
| Artifact | Container/image | Binary per board + manifest |
| Deployment | Server | OTA + gradual rollout |
| Rollback | Instant | A/B partition, lambat |
Langkah paling penting dan sering diabaikan: build untuk semua board yang dipakai. Satu proyek PlatformIO bisa punya target esp32dev, esp32s3, dan nodemcu — CI harus membangun dan menguji semuanya, karena bug bisa hanya muncul di board tertentu.
Push → lint + format
→ build semua board (pio run -e <board>)
→ unit test (pio test -e native)
→ cek ukuran binary & flash/RAM usage
→ build release (bump version, tag)
→ publish artifact (firmware.bin + manifest)
→ trigger OTA rollout (gradual)Setiap stage berhenti jika gagal — binary yang berukuran terlalu besar atau melewati ambang RAM tidak boleh lanjut ke release.
Buat workflow CI dasar di repository firmware:
name: firmware-ci
on:
push:
branches: [main]
pull_request:
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install PlatformIO Core
run: pip install platformio
- name: Build semua board
run: pio run -e esp32dev -e esp32s3
- name: Jalankan unit test native
run: pio test -e native
- name: Cek ukuran binary
run: |
pio run -e esp32dev
ls -la .pio/build/esp32dev/firmware.binSetiap pull request otomatis menjalankan build dan test. Jika ada yang gagal, PR tidak bisa di-merge — bug tidak pernah sampai ke release.
Firmware di MCU harus muat di flash dan RAM. PlatformIO melaporkan penggunaan memori saat build:
pio size -e esp32devRAM: [== ] 25.0% (used 81920 bytes from 327680 bytes)
Flash: [== ] 22.8% (used 953760 bytes from 4194304 bytes)Jadikan ini gate: jika pemakaian flash melewati ambang (mis. 80%), CI gagal. Tambahkan ke workflow:
- name: Verifikasi ukuran dalam ambang
run: |
SIZE=$(stat -c%s .pio/build/esp32dev/firmware.bin)
echo "firmware.bin = $SIZE bytes"
test "$SIZE" -le 3000000 || exit 1Gate ini mencegah regresi diam-diam: satu dependency baru yang besar bisa memaksa firmware keluar dari flash — dan baru ketahuan saat upload gagal di lapangan.
CI build release harus menghasilkan artifak bernomor versi yang terhubung ke kode:
firmware-v1.3.0-esp32dev.bin
firmware-v1.3.0-esp32s3.bin
manifest-v1.3.0.json ← versi + hash + ukuran tiap boardManifest versi menjadi dasar OTA: perangkat membandingkan versinya dengan manifest, bukan menebak. Hubungkan versi firmware ke tag git dan jaga anti-downgrade (episode 9) — server menolak OTA ke versi yang lebih tua.
Tip
Gunakan semantic versioning untuk firmware: v1.3.0. Breaking change di API perangkat atau protokol = major bump (mis. v2.0.0), karena perangkat lama yang belum di-update tidak akan kompatibel. Git tag + manifest harus selalu sinkron.
Keamanan masuk ke pipeline sejak episode 11. Tambahkan di CI:
openssl dgst -sha256 -sign release.key firmware.bin > firmware.bin.sigPrivate key signing disimpan sebagai GitHub Secret — CI tidak pernah melihat isinya, hanya memakai tanda tangannya.
Warning
Jangan pernah menyimpan private key signing di repository — termasuk di file .env yang "kebetulan" ikut commit. Kehilangan private key = penyerang bisa membuat firmware palsu yang diterima semua perangkat. Rotasi kunci yang bocor adalah operasi yang sangat mahal.
Inti yang harus dibawa pulang:
Di episode 18 selanjutnya, kita akan mengamankan jaringan tempat perangkat berdiam: IoT network security — segmentasi jaringan, mTLS, dan protokol aman — plus praktik mengamankan jaringan lokal kalian dari perangkat sampai cloud. Keamanan itu lapisan, bukan titik!