Memperbaiki Skrip Onboarding Mac yang Macet Akibat Pembaruan Homebrew 6.0
29 de julio de 2026
0
Computing/SoftwareComments (0)
Log in to leave a comment
No posts yet
Log in to leave a comment
No posts yet
Ketika tiba di kantor pagi ini, ada puluhan pesan Slack yang menumpuk karena skrip onboarding untuk karyawan baru berhenti berjalan. Saat membuka terminal, terlihat bahwa proses brew install berhenti tanpa kepastian karena menunggu masukan pengguna (user input).
Pembaruan ke Homebrew 6.0 memperketat kebijakan antarmuka interaktif (Ask mode) dan pemblokiran masukan standar (stdin). Hal ini tidak bermasalah saat seseorang mengetik perintah secara langsung, tetapi ketika dijalankan di latar belakang menggunakan skrip Shell, terminal akan mengalami kondisi deadlock I/O.
Jika alur kerja Anda terus terganggu oleh pertanyaan rekan tim mengenai pengaturan lingkungan kerja, Anda perlu memasukkan beberapa variabel lingkungan (environment variables) dan penanganan eksepsi secara langsung ke dalam skrip.
Homebrew 6.0 menyebabkan penundaan I/O yang tidak terduga saat menginstal paket tanpa koneksi TTY (terminal interaktif). Untuk memblokir pembekuan terminal dan menciptakan lingkungan eksekusi mandiri (unattended execution) yang sempurna, Anda harus menentukan variabel lingkungan khusus di bagian paling atas skrip.
Menambahkan variabel berikut di bagian paling atas skrip akan mematikan semua prompt interaktif dan tampilan petunjuk (hints), kecuali untuk permintaan hak akses administrator.
`bash
#!/usr/bin/env zsh
export NONINTERACTIVE=1
export HOMEBREW_NO_ENV_HINTS=1
export HOMEBREW_ACCEPT_OUTDATED_CAVEATS=1
export HOMEBREW_NO_AUTO_UPDATE=1
export HOMEBREW_NO_INSTALL_CLEANUP=1
if [[ -f "/opt/homebrew/bin/brew" ]]; then
eval "(/usr/local/bin/brew shellenv)"
else
/bin/bash -c "(/opt/homebrew/bin/brew shellenv)"
fi
safe_brew_install() {
local formula="{formula}" &>/dev/null; then
echo "Sudah terinstal: {formula}"; then
echo "Gagal menginstal: ${formula}" >&2
return 1
fi
fi
}
safe_brew_install "git"
safe_brew_install "jq"
`
Jika Anda menggunakan berkas konfigurasi bawaan Homebrew brew.env alih-alih berkas .zshrc, Anda harus menghapus kata kunci export dan hanya menuliskannya sebagai pasangan kunci-nilai seperti HOMEBREW_NO_ENV_HINTS=1 untuk menghindari kesalahan sintaksis.
Mulai versi 6.0, 'Tap Trust Model' diterapkan secara bawaan untuk alasan keamanan rantai pasokan (supply chain security). Custom Tap eksternal yang tidak terverifikasi atau paket lama yang menggunakan MD5 atau SHA-1 akan diblokir dari pemuatan.
Formula untuk distribusi alat internal wajib menyertakan digest SHA-256 dan harus lolos pemeriksaan brew audit --strict agar alur CI/CD tidak mengalami eror.
`ruby
class InternalApiCli < Formula
desc "Alat CLI kontrol API infrastruktur internal dan otomatisasi penggelaran"
homepage "https://internal.company.net/docs/cli"
url "https://internal.company.net/downloads/cli/v2.4.0/internal-api-cli-2.4.0.tar.gz"
sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
license "Proprietary"
depends_on "jq"
def install
bin.install "internal-api-cli"
end
test do
assert_match "version 2.4.0", shell_output("#{bin}/internal-api-cli --version")
end
end
`
Sertakan pengenal lisensi standar SPDX (license "Proprietary") serta bidang url dan desc yang akurat di dalam berkas Formula distribusi internal (internal-api-cli.rb). Sangat praktis jika Anda mengonfigurasi alur CI/CD untuk mengekstrak nilai dengan shasum -a 256 setelah mengunduh berkas, lalu memperbaruinya secara otomatis menggunakan sed.
Di Mac lokal pengembang, jalankan brew trust company/tools sekali untuk mendaftarkan Tap internal sebagai sumber tepercaya, sehingga paket dapat diinstal langsung tanpa peringatan keamanan.
Jika terminal VS Code atau emulator terminal lama berjalan sebagai biner Intel (x86_64), hasil dari uname -m akan tetap berupa x86_64 meskipun Anda menggunakan Mac M series. Menginstal paket Homebrew dalam kondisi ini akan memasang biner x86 di bawah /usr/local, yang kemudian menghasilkan eror mach-o file, but is an incompatible architecture.
Anda memerlukan pernyataan kondisional untuk memeriksa apakah lingkungan terminal berjalan di bawah Rosetta 2, lalu segera menjalankan kembali proses secara asli di arm64.
`bash
#!/usr/bin/env zsh
SYSTEM_ARCH="(sysctl -n sysctl.proc_translated 2>/dev/null || echo "0")"
if [[ "{SYSTEM_ARCH}" == "x86_64" && "0" "{SYSTEM_ARCH}" == "x86_64" && "${IS_TRANSLATED}" == "0" ]]; then
HOMEBREW_PREFIX="/usr/local"
else
echo "Arsitektur tidak didukung: ${SYSTEM_ARCH}" >&2
exit 1
fi
eval "{HOMEBREW_PREFIX}/bin/brew shellenv)"
`
Ketika parameter kernel sysctl -n sysctl.proc_translated diperiksa dan mengembalikan nilai 1, sistem berada dalam status Rosetta 2. Pada titik ini, mengeksekusi exec arch -arm64 /bin/zsh "$0" "$@" akan mengalihkan seluruh skrip ke shell arm64, sehingga biner yang benar terinstal di jalur /opt/homebrew.
Jika versi Homebrew dan paket yang terinstal berbeda di antara para pengembang, masalah "berjalan lancar di komputer saya" akan terus berulang. Memasukkan kombinasi Brewfile deklaratif dan brew bundle check ke dalam skrip memungkinkan anggota baru menyelesaikan pengaturan hanya dengan satu baris perintah.
`bash
#!/usr/bin/env zsh
set -euo pipefail
export NONINTERACTIVE=1
export HOMEBREW_NO_ENV_HINTS=1
export HOMEBREW_BUNDLE_NO_UPGRADE=1
DOTFILES_REPO="https://github.com/company/dotfiles.git"
TARGET_DIR="$HOME/.dotfiles"
if ! command -v brew &>/dev/null; then
/bin/bash -c "(/opt/homebrew/bin/brew shellenv)"
fi
if [[ ! -d "{DOTFILES_REPO}" "{TARGET_DIR}" pull origin main
fi
BREWFILE_PATH="{BREWFILE_PATH}" &>/dev/null; then
echo "Semua dependensi di Brewfile sudah yang terbaru."
else
brew bundle install --file="${BREWFILE_PATH}"
fi
`
Setelah menyinkronkan repositori Dotfiles internal ke $HOME/.dotfiles, periksa terlebih dahulu apakah ada paket yang belum terinstal menggunakan brew bundle check. Dengan menjalankan brew bundle install hanya saat ada paket yang kurang, lingkungan yang konsisten akan tetap terjaga meskipun skrip dijalankan berkali-kali.