Pre-commit dengan bash script

Arif Hidayat
Arunatech
Published in
3 min readJan 12, 2023

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.

@mangday

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.

--

--