Cara termudah menjaga konsistensi kode Rust dan mencegah rilis rusak adalah menjalankan lint, test, dan pengujian release sebelum kode masuk ke remote. Dengan cargo-husky Anda bisa memasang Git hook standar yang otomatis memicu cargo fmt, cargo clippy, cargo test, dan pengecekan release sebelum commit dan push.

Dokumen ini menunjukkan langkah-langkah lengkap: instalasi cargo-husky, konfigurasi hook, pengintegrasian linting utama, validasi release, strategi caching build, dan tips memantau kegagalan agar pengembangan tidak mandek.

Standarisasi Hook Git dengan cargo-husky

Mulai dari proyek Rust baru atau yang sudah jalan, jalankan:

cargo install cargo-husky
cargo husky install

Perintah kedua membuat folder .husky/ dan mendaftarkan template yang dapat Anda tambahkan ke package.metadata.cargo-husky di Cargo.toml. Contoh konfigurasi minimal:

[package.metadata.cargo-husky]
pre-commit = "cargo fmt -- --check && cargo clippy -- -D warnings"
pre-push = "cargo test --locked"

Script di atas memastikan setiap commit diawali pengecekan format dan lint tanpa menulis hook manual. Jika ingin lebih banyak kontrol —misalnya membatasi lint hanya pada file staged— bisa gunakan helper seperti cargo fmt -- --check langsung dengan git diff --name-only --cached di dalam file hook.

Mengintegrasikan cargo fmt dan cargo clippy

Agar linting tidak merusak alur kerja, pisahkan logika formatting dan lint strict ke pre-commit dengan detail berikut:

  • Formatter: cargo fmt -- --check memeriksa style tanpa mengubah file, maka lebih aman untuk hook. Jika tidak lolos, perbaiki secara lokal lalu ulangi commit.
  • Linting: cargo clippy -- -D warnings mencegah peringatan berlalu sebagai error. Anda bisa menambahkan -Zunstable-options hanya bila tim siap dengan fitur nightly.

Contoh isi .husky/pre-commit agar bisa ditulis ulang kalau perlu tambahan logika:

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

cargo fmt -- --check || exit 1
cargo clippy -- -D warnings || exit 1

Gunakan cargo fmt dan cargo clippy secara berurutan untuk menghindari pemeriksaan ulang yang tidak perlu. Jika linting berjalan terlalu lama, injeksi log seperti echo "Running cargo clippy" membantu debugging ketika hook gagal.

Release Check dan Cargo Release otomatis

Pre-push harus lebih tegas, karena ini kesempatan terakhir sebelum kode masuk remote. Tambahkan langkah-langkah berikut:

  • Cargo check/test untuk memastikan kompilasi berhasil tanpa menyusun binary utuh: cargo test --locked sudah cukup di banyak kasus.
  • Dry run release (optional): cargo release --dry-run memvalidasi tagging dan dokumentasi tanpa menyalin versi baru.

Contoh .husky/pre-push:

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

cargo test --locked || exit 1
cargo release --dry-run || exit 1

Jika tim menggunakan cargo release secara aktif, jalankan dry-run untuk memeriksa versi, changelog, dan tag: itu menghindari commit yang membutuhkan rollback karena release gagal.

Strategi Caching dan Monitoring Hook

Lint dan test bisa menelan waktu di mesin developer. Strategi caching berikut membantu menekan ulang waktu eksekusi hook:

  • Caching target/ bundling: Tentukan CARGO_TARGET_DIR di .cargo/config.toml agar build artefak tersimpan di folder yang konsisten dan bisa dicache oleh CI: target-dir = "../.cargo-target".
  • Gunakan cache incremental: cargo clippy dan cargo test mendukung incremental compile. Pastikan ~/.cargo/registry juga tidak dihapus.
  • Simpan hasil lint/tagging: Simpan log hook di file sementara agar bisa dibagikan ke tim jika hook gagal.

Untuk memantau kegagalan hook:

  • Tambahkan catatan di README atau wiki tentang cara menjalankan ulang hook: cargo fmt && cargo clippy sebelum commit dan cargo test sebelum push.
  • Gunakan echo di awal hook untuk menandai fase yang berjalan, lalu kirimkan log penuh jika gagal. Contoh: echo "[hook] running cargo clippy".
  • Jika hook tidak boleh memblokir (misalnya saat CI masih jalan), sediakan override dengan variabel lingkungan: [ -z "$SKIP_HOOKS" ] && cargo fmt ....

Terakhir, libatkan tim dengan menetapkan dokumentasi singkat: misalnya “Jika hook gagal, jalankan cargo fmt, lalu cargo clippy, perbaiki peringatan, dan ulangi commit”. Penjelasan ini menjaga fokus pada kualitas sembari tetap produktif.