Pre-commit dengan bash script
Bismillah
masih membahas tentang development box, kali ini mari membahas terkait Git Hooks salah satu diantaranya pre-commit.
Hook pre-commit
dijalankan terlebih dahulu sebelum mengeksekusi commit
, digunakan untuk memeriksa snapshot yang akan dijalankan, untuk melihat apakah lupa sesuatu, untuk memastikan tes berjalan, atau untuk memeriksa apa pun yang perlu diperiksa dalam kode.
Prerequisites
Jika ingin mengikuti tutorial pastikan memiliki yang berikut ini:
- macOS, Linux, atau Windows device, tutorial menggunakan Ubuntu 20.04 running di WSL.
- Git local repository.
- Git command-line tool.
Sebelum ke automation git action dengan Git hooks, ada baiknya mepelajari singkat tentang apa itu git commit
dan bagaimana cara kerjanya. Perintah git commit
menangkap snapshot dari perubahan yang dilakukan untuk sebuah projek, bersama dengan message yang menjelaskan perubahan tersebut.
Ketika menjalankan git commit
, Git membuat objek dalam memori dengan semua informasi tentang file yang ditambahkan ke commit
. Informasi itu termasuk timestamp, penulis, dan perubahan file baris demi baris. Hash dari perubahan ini dibuat untuk mengidentifikasi perubahan secara unik, kemudian disimpan ke objek dalam memori.
Setelah objek dalam memori dibuat, Git kemudian membaca pesan commit
atau meminta pengguna untuk memasukkan message commit
. Objek dan message kemudian disimpan ke sistem file di bawah folder ~/.git
.
Di bawah ini adalah diagram untuk membantu lebih memahami alur proses commit git
step by step.
Berikut adalah daftar lengkap proses yang terjadi ketika menjalankan perintah git commit:
- Hook
pre-commit
dipanggil pertama sebelum memori digunakan untuk objek commit. - Hook
prepare-commit-msg
dipanggil ketika Git memeriksa keberadaan pesan commit. - Hook
commit-msg
dipanggil setelah Git menerima pesan commit.
Setiap hook memiliki kegunaan tersendiri, tetapi untuk kemudahan, hanya satu yang dibahas dalam tutorial ini adalah hook pre-commit
. Bisa melihat diagram di mana masing-masing hook dipicu dalam proses commit
.
Use Case
Back-end projek dengan bahasa golang dan membuat use-case
sebelum menjalankan commit
dipastikan terlebih dahulu apakah linter
berhasil passed
tidak menemukan error
, dan jika terdapat error
maka tidak dapat menjalankan commit
. Dengan use-case
seperti ini diharapkan dapat mengurangi kesalahan yang akan terjadi jika dilanjutkan ke environment
selanjutnya.
Lets Hook
Perlu diketahui untuk pengaturan git hooks pre-commit
berada dalam dir .git/hooks
yang mana best practice atau default-nya akan dimasukan ke dalam daftar .gitignore
, agar bash script bisa digunakan oleh developer lainnya, kita buat menjadi dua bagian file berupa installation and action. Buat file install-hook.bash yang mana dalam proses-nya akan mengeksekusi create symlink
dari file bash ke dalam dir .git/hooks pre-commit
.
#!/usr/bin/env bash
GIT_DIR=$(git rev-parse --git-dir)
echo -e "\033[1;34m[INFO]: Install hooks...\033[0m"
# command creates symlink to our pre-commit script
ln -s ../../scripts/pre-commit.bash $GIT_DIR/hooks/pre-commit
echo -e "\033[1;34m[INFO]: Done ...\033[0m"
Selanjutkan membuat file pre-commit.bash pada bagian ini akan menjalakan command
dari golang-lint
untuk menjalan linter
kemudian menampung hasil tersebut untuk memvalidasi apakah terdapat atau tidaknya error linter
.
#!/bin/bash
echo -e "\033[1;34m[INFO] Running pre-commit hooks ...\033[0m"
# run linter
golangci-lint run -c .golangci.yml
RETVAL=$?
if [[ ${RETVAL} != 0 ]]; then
echo -e "\033[1;31m[FAIL] There are linters failures! ...\033[0m"
exit 1
fi
echo -e "\033[1;34m[INFO] Done pre-commit hooks ...\033[0m"
Setup sudah selesai tinggal menjalan file bash install-hooks.bash dan git hook pre-commit otomatis bisa digunakan.
Jika membutuhkan manajemen yang lebih, bisa menggunakan framework pre-commit yang dapat digunakan untuk menangani beragam use-case. Semoga bermanfaat, may the hooks be with you! Barakallah fiik.