Bash Scripting Automation untuk Developer: Kerja Lebih Cepat
Kamu habiskan berapa menit sehari untuk mengetik perintah yang sama berulang kali? git pull, docker-compose up, npm install, restart service, cek log. Kalau dijumlah seminggu, angkanya bikin mual.
Ini bukan soal malas. Ini soal opportunity cost. Setiap menit yang kamu buang untuk pekerjaan mekanis adalah menit yang tidak kamu pakai untuk memecahkan masalah yang sebenarnya. Bash scripting automation untuk developer bukan topik glamor—tidak ada konferensi besar yang membahasnya dengan slide penuh animasi—tapi dampaknya nyata dan langsung terasa.
Artikel ini bukan pengantar "apa itu bash". Kamu sudah tahu. Ini tentang pola-pola spesifik yang saya pakai sehari-hari sebagai backend engineer yang mengelola beberapa proyek sekaligus, dan bagaimana kamu bisa mengadaptasinya dalam satu sore.
Kenapa Bash, Bukan Python atau Zsh?
Pertanyaan wajar. Python lebih ekspresif, Zsh punya plugin ekosistem yang kaya. Tapi bash punya satu keunggulan yang sering diabaikan: dia ada di mana-mana.
Server Ubuntu 22.04 yang baru kamu spin up? Bash ada. Container Alpine minimal? Bash ada (atau bisa diinstall dalam satu baris). Script yang kamu tulis di laptop macOS akan jalan di VPS tanpa modifikasi—selama kamu tidak pakai fitur bash 5.x yang belum tentu tersedia di semua distro.
Python butuh virtual environment, dependency, versi yang cocok. Bash butuh... bash. Untuk automation task yang sifatnya glue code—menghubungkan tool satu dengan lainnya—bash adalah pilihan paling pragmatis.
Satu catatan: saya pakai bash 5.2 di macOS (via Homebrew) dan bash 5.1 di Ubuntu 22.04. Kalau kamu masih di bash 3.x bawaan macOS, upgrade dulu:
brew install bash
echo '/opt/homebrew/bin/bash' | sudo tee -a /etc/shells
chsh -s /opt/homebrew/bin/bash
Struktur Script yang Tidak Memalukan
Script bash yang ditulis asal-asalan adalah technical debt paling cepat menumpuk. Saya punya template yang saya pakai untuk semua script baru:
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
# ============================================================
# Nama script : deploy.sh
# Deskripsi : Deploy aplikasi ke staging/production
# Penggunaan : ./deploy.sh [staging|production]
# Dependensi : git, docker, curl
# ============================================================
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LOG_FILE="${SCRIPT_DIR}/deploy.log"
TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
log() {
echo "[${TIMESTAMP}] $*" | tee -a "${LOG_FILE}"
}
error() {
log "ERROR: $*" >&2
exit 1
}
check_deps() {
local deps=("git" "docker" "curl")
for dep in "${deps[@]}"; do
command -v "${dep}" &>/dev/null || error "Dependensi tidak ditemukan: ${dep}"
done
}
main() {
local env="${1:-staging}"
[[ "${env}" =~ ^(staging|production)$ ]] || error "Environment tidak valid: ${env}"
check_deps
log "Memulai deploy ke ${env}..."
# logic utama di sini
}
main "$@"
Tiga baris paling penting di awal:
set -e: keluar kalau ada perintah yang gagalset -u: error kalau ada variabel yang belum didefinisikanset -o pipefail: tangkap kegagalan di tengah pipeline
Tanpa ini, script kamu akan terus jalan meski ada yang salah, dan debugging-nya mimpi buruk.
Pola Automation yang Paling Sering Saya Pakai
1. Git Workflow Automation
Saya punya script gstart yang menggantikan ritual git branch baru:
#!/usr/bin/env bash
set -euo pipefail
gstart() {
local ticket="${1:?Masukkan nomor tiket, contoh: gstart PROJ-123}"
local description="${2:?Masukkan deskripsi singkat}"
local branch_name
# Normalisasi: lowercase, spasi jadi dash
branch_name=$(echo "${ticket}-${description}" | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | tr -cd '[:alnum:]-')
git checkout main
git pull origin main
git checkout -b "${branch_name}"
echo "Branch '${branch_name}' siap. Selamat coding."
}
gstart "$@"
Dipanggil dengan gstart PROJ-123 "fix login bug", hasilnya branch proj-123-fix-login-bug yang sudah sync dengan main.
2. Environment Setup Otomatis
Onboarding developer baru di proyek sering memakan waktu setengah hari. Script ini memotongnya jadi 10 menit:
#!/usr/bin/env bash
set -euo pipefail
BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
setup_env() {
echo "==> Mengecek dependensi sistem..."
local required=("node" "docker" "psql")
for cmd in "${required[@]}"; do
if ! command -v "${cmd}" &>/dev/null; then
echo "[SKIP] ${cmd} tidak ditemukan—install manual dulu."
else
echo "[OK] ${cmd} $(${cmd} --version 2>&1 | head -1)"
fi
done
echo "==> Menyalin .env file..."
[[ -f "${BASE_DIR}/.env" ]] || cp "${BASE_DIR}/.env.example" "${BASE_DIR}/.env"
echo "==> Menginstall Node dependencies..."
npm ci --silent
echo "==> Menjalankan migrasi database..."
npm run db:migrate
echo "==> Selesai. Jalankan 'npm run dev' untuk mulai."
}
setup_env
3. Log Monitoring dengan Alert Sederhana
Saya tidak pakai tool monitoring berbayar untuk proyek kecil. Script ini cukup:
#!/usr/bin/env bash
set -euo pipefail
LOG_PATH="/var/log/app/error.log"
WEBHOOK_URL="${SLACK_WEBHOOK_URL:?Set SLACK_WEBHOOK_URL dulu}"
KEYWORD="CRITICAL"
watch_log() {
tail -F "${LOG_PATH}" | while IFS= read -r line; do
if echo "${line}" | grep -q "${KEYWORD}"; then
local payload
payload=$(printf '{"text": "🚨 *Alert*: %s"}' "${line}")
curl -s -X POST -H 'Content-type: application/json' \
--data "${payload}" \
"${WEBHOOK_URL}" &>/dev/null
fi
done
}
watch_log
Jalankan sebagai systemd service atau di dalam tmux, dan kamu dapat notifikasi Slack setiap kali ada log CRITICAL tanpa bayar tool monitoring.
Mengelola Banyak Script: Jangan Taruh di ~/.bashrc
Kesalahan klasik: semua fungsi ditumpuk di ~/.bashrc sampai file itu jadi 800 baris yang tidak ada yang berani disentuh.
Struktur yang lebih waras:
~/.local/bin/
├── gstart # git workflow
├── deploy # deployment script
├── dbdump # backup database
└── logwatch # log monitoring
~/.config/shell/
├── aliases.sh # alias pendek
├── functions.sh # fungsi kompleks
└── env.sh # environment variables
Di ~/.bashrc atau ~/.bash_profile, cukup satu baris:
for f in ~/.config/shell/*.sh; do source "$f"; done
Semua script di ~/.local/bin/ bisa langsung dipanggil kalau direktori itu ada di $PATH:
export PATH="$HOME/.local/bin:$PATH"
Rapi, mudah di-version control, dan tidak ada yang takut edit.
Bash Scripting Automation untuk Developer: Testing Script Kamu
Ini bagian yang paling sering dilewati. Script tanpa test adalah bom waktu.
Saya pakai bats-core (versi 1.10.0 saat artikel ini ditulis) untuk testing bash script:
# Install
npm install -g bats
# atau
brew install bats-core
Contoh test untuk fungsi gstart:
#!/usr/bin/env bats
setup() {
# Buat repo git temporary untuk testing
TEST_DIR=$(mktemp -d)
cd "${TEST_DIR}"
git init -q
git commit --allow-empty -m "init" -q
}
teardown() {
rm -rf "${TEST_DIR}"
}
@test "gstart membuat branch dengan format yang benar" {
source "${BATS_TEST_DIRNAME}/../scripts/gstart.sh"
run gstart "PROJ-123" "fix login bug"
[ "$status" -eq 0 ]
run git branch --show-current
[ "$output" = "proj-123-fix-login-bug" ]
}
@test "gstart gagal tanpa argumen" {
source "${BATS_TEST_DIRNAME}/../scripts/gstart.sh"
run gstart
[ "$status" -ne 0 ]
}
Jalankan dengan bats tests/. Kalau kamu sudah setup CI, tambahkan ini ke pipeline GitHub Actions:
- name: Test bash scripts
run: |
npm install -g bats
bats tests/
Perbandingan: Bash vs Alternatif untuk Automation Task
| Kriteria | Bash | Python | Makefile | Just |
|---|---|---|---|---|
| Ketersediaan | ✅ Ada di mana-mana | ⚠️ Perlu install + venv | ✅ Hampir universal | ❌ Perlu install |
| Kurva belajar | Sedang | Rendah | Rendah | Rendah |
| Debugging | ❌ Menyebalkan | ✅ Mudah | ⚠️ Terbatas | ✅ Mudah |
| Cocok untuk | Glue code, sysadmin | Data processing, complex logic | Task runner | Task runner modern |
| Interop dengan shell | ✅ Native | ⚠️ Via subprocess | ✅ Native | ✅ Native |
| Testing | ⚠️ bats-core | ✅ pytest | ❌ Sulit | ❌ Sulit |
Kesimpulan dari tabel ini: bash untuk glue code dan sysadmin task, Python kalau logic-nya sudah kompleks dan butuh library eksternal. Jangan pakai bash untuk parsing JSON yang rumit—pakai jq atau pindah ke Python.
Tiga Kebiasaan yang Bikin Script Bash Kamu Tidak Jadi Sampah
Pertama, selalu validasi input. Jangan asumsikan user (termasuk diri sendiri di masa depan) akan memanggil script dengan benar.
# Buruk
rm -rf "${DIR}/"
# Baik
[[ -n "${DIR}" ]] || error "DIR tidak boleh kosong"
[[ -d "${DIR}" ]] || error "${DIR} bukan direktori yang valid"
rm -rf "${DIR}/"
Kedua, gunakan shellcheck. Tool ini gratis, bisa diinstall via brew install shellcheck atau apt install shellcheck, dan menangkap 90% kesalahan umum sebelum script dijalankan. Integrasi ke editor kamu sekarang juga.
Ketiga, log semuanya. Script yang jalan di background tanpa log adalah misteri yang tidak menyenangkan untuk di-debug jam 2 pagi.
exec > >(tee -a /var/log/myscript.log) 2>&1
echo "Script dimulai: $(date)"
Satu baris itu di awal script, dan semua output—termasuk stderr—masuk ke log file sekaligus tetap tampil di terminal.
Kesimpulan: Mulai dari Satu Script Besok
Bash scripting automation untuk developer bukan tentang menulis script yang canggih dan kompleks. Ini tentang mengidentifikasi satu task yang kamu lakukan berulang minggu ini, dan mengautomasi-nya sekarang.
Besok pagi, sebelum mulai kerja: buka terminal, ketik which bash, pastikan versinya 5.x, lalu tulis satu script kecil dengan template yang ada di artikel ini. Mulai dari yang paling sering kamu lakukan—mungkin git workflow, mungkin restart service, mungkin deploy ke staging.
Kalau kamu mau lihat bagaimana saya mengorganisir dotfiles dan script-script ini dalam setup self-hosted yang lebih lengkap, cek artikel tentang manajemen dotfiles dengan GNU Stow.
Install shellcheck sekarang. Tidak ada alasan untuk tidak.