Pipelines CI untuk proyek Rust perlu memastikan kode terformat dan bebas linting sebelum merge, serta dijalankan dengan cepat. Artikel ini langsung menjawab bagaimana menggabungkan cargo-husky untuk enforce hook lint dan format, konfigurasi linting dengan cargo fmt dan clippy, serta caching build di GitHub Actions agar validasi pecahannya cepat tanpa kompromi kualitas.

Menetapkan Fokus DX dan Tooling

Developer experience (DX) di pipeline CI berhubungan langsung dengan kejelasan umpan balik dan waktu tunggu yang pendek. Mulai tiap merge request dengan proses yang konsisten: pertama linting/format, lalu build. Gunakan cargo-husky di repo untuk hook lokal dan sebelum push, sehingga commit sudah melewati pengecekan dasar sebelum menyentuh remote.

Pasang cargo-husky dan definisikan hook seperti ini:

cargo install cargo-husky
cargo husky init

Tambahkan hook pre-commit di .husky/pre-commit:

#!/usr/bin/env sh
cargo fmt -- --check
cargo clippy --all-targets --all-features -- -D warnings

Hook ini memastikan setiap commit tidak dapat dilewatkan jika format atau lint mengandung kesalahan. Hook lokal juga meningkatkan DX karena developer langsung tahu saat terjadi pelanggaran sebelum push.

Konfigurasi Lint dan Format yang Konsisten

Untuk menjaga lint tetap konsisten di merge request:

  • cargo fmt menjalankan format konsisten seluruh workspace. Gunakan cargo fmt -- --check dalam pipeline untuk mendeteksi perbedaan.
  • cargo clippy dengan flag -D warnings membuat pipeline gagal jika terjadi peringatan. Tambahkan konfigurasi di Clippy.toml untuk menonaktifkan lint yang terlalu agresif, bukan menonaktifkan secara global.

Contoh Clippy.toml sederhana:

warn = "clippy::all"

[[allow]]
name = "clippy::module_inception"

Gunakan cargo check untuk memastikan dependensi valid, dan jalankan cargo test secara spesifik jika perlu.

Workflow GitHub Actions: lint, build, cache

Berikut adalah contoh file workflow .github/workflows/ci.yaml yang mencakup linting, cache, dan validasi:

name: CI

on:
  pull_request:
  push:
    branches: ["main"]

jobs:
  check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Setup Rust
        uses: actions/setup-rust@v1
        with:
          cache: cargo
      - name: Cache target
        uses: actions/cache@v4
        with:
          path: target
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: |
            ${{ runner.os }}-cargo-
      - name: Format
        run: cargo fmt -- --check
      - name: Run Clippy
        run: cargo clippy --all-targets --all-features -- -D warnings
      - name: Run tests
        run: cargo test --locked

Cache target dan cache default actions setup-rust membantu mempercepat lint dan build dengan memanfaatkan artefak kompilasi sebelumnya. Kunci cache disinkronkan dengan Cargo.lock sehingga perubahan dependensi memicu cache baru.

Validasi Dependensi dan Konsistensi Merge Request

Sertakan langkah validasi dependensi sebelum linting utama.

  1. Jalankan cargo fetch untuk memastikan Cargo.lock mutakhir.
  2. Gunakan cargo tree atau tool eksternal untuk mengecek versi tertutup jika terjadi konflik.
  3. Pastikan hook husky aktif: tambahkan cargo husky install ke post-checkout atau dokumentasi onboarding.

Untuk menjaga lint konsisten di MR, tambahkan status check lint di platform VCS/platform sehingga setiap PR harus melewati job lint sebelum merge. Komunikasikan template PR yang mengingatkan diagnosa linting: sertakan perintah cargo fmt dan cargo clippy untuk menjalankan lokal.

Pengamatan Kesalahan dan Rollback Cepat

Ketika linting gagal, hal yang perlu diperhatikan:

  • Gunakan log perintah (misal flag --message-format=json) bila ingin memparse output lint secara otomatis.
  • Jika perubahan kode menyebabkan lint baru, jangan mematikan rule tanpa diskusi; tambahkan allow di Clippy.toml dengan komentar alasan.

Untuk rollback cepat saat lint terus menerus gagal, siapkan branch protection rule yang menolak merge saat job lint gagal, dan gunakan cargo fmt -- --check kembali di branch fix. Masukkan catatan troubleshooting di dokumentasi repo:

Jika clippy menolak warn level tertentu, jalankan cargo clippy -- -W clippy::pedantic lokal untuk melihat detail rule.

Metrik DX yang Bisa Dipantau

Pantau metrik berikut agar pipeline tetap ramah developer:

  • Waktu eksekusi lint — idealnya di bawah 3 menit untuk membuat feedback cepat.
  • Frekuensi rollback — peningkatan rollback menunjukkan lint terlalu ketat atau output membingungkan.
  • Persentase build sukses pertama kali setelah push — menandakan apakah lint/format dijalankan sebelum push.

Dengan tooling seperti GitHub Actions Insights atau membangun badge di README, tim bisa memonitor apakah lint tetap konsisten tanpa mengorbankan waktu iterasi.