Homebrew 6.0 アップデートでフリーズした Mac オンボーディングスクリプトの修正方法
29 Juli 2026
0
Computing/SoftwareComments (0)
Log in to leave a comment
No posts yet
Log in to leave a comment
No posts yet
朝出社すると、新入社員のオンボーディングスクリプトが停止したという Slack メッセージが数十件溜まっていました。ターミナルを開いてみると、brew install の過程でユーザー入力を待ち受けたまま完全に停止している状態でした。
Homebrew 6.0 へのアップデートに伴い、対話型インターフェース(Ask mode)および標準入力(stdin)のブロック方針が強化されました。人が手動でコマンドを叩く分には問題ありませんが、Shell ス크립トを使ってバックグラウンドで実行すると、ターミナルが入出力のデッドロック状態に陥ります。
チームメンバーからの環境構築に関する問い合わせで自分の業務フローまで中断されているなら、スクリプトにいくつかの環境変数と例外処理を直接組み込む必要があります。
Homebrew 6.0 は、TTY(対話型ターミナル)接続がない状態でパッケージをインストールする際、予期せぬ入出力待ちを発生させます。ターミナルのフリーズ現象を遮断し、完全な無人実行環境を構築するには、スクリプトの最上部に専用の環境変数を明記する必要があります。
スクリプトの最上部に以下の変数を追加すると、管理者権限の要求を除くすべての対話型プロンプトとヒント出力が無効化されます。
`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 "すでにインストール済み: {formula}"; then
echo "エラー発生: ${formula} のインストールに失敗" >&2
return 1
fi
fi
}
safe_brew_install "git"
safe_brew_install "jq"
`
.zshrc ファイルではなく Homebrew 組み込みの設定ファイルである brew.env を使用する場合は、export キーワードを除外し、HOMEBREW_NO_ENV_HINTS=1 のようなキー・バリュー形式のみで記述しないと文法エラーが発生します。
6.0 バージョンからは、サプライチェーン攻撃対策として「Tap Trust Model」がデフォルトで適用されます。検証されていない外部の Custom Tap や、MD5、SHA-1 を使用している古いパッケージはロード自体がブロックされます。
社内ツール配布用の Formula には SHA-256 ダイジェストの記述が必須となり、brew audit --strict 検査をパスしなければ CI/CD パ이프라인が落ちてしまいます。
`ruby
class InternalApiCli < Formula
desc "사내 인프라 API 제어 및 배포 자동화 CLI 도구"
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
`
社内配布用 Formula(internal-api-cli.rb)ファイル内に、SPDX 規格のライセンス識別子(license "Proprietary")と正確な url、desc フィールドを記載しておきます。CI/CD パイプラインでファイルダウンロード後に shasum -a 256 で値を抽出し、sed で自動更新するように組んでおくと便利です。
開発者のローカル Mac では brew trust company/tools を一度実行して社内 Tap を信頼済みソースとして登録しておけば、セキュリティ警告なしで即座にインストールされます。
VS Code ターミナルや古いターミナルエミュレータが Intel(x86_64)バイナリで動作している場合、M シリーズの Mac を使用していても uname -m の結果が x86_64 と表示されます。この状態で Homebrew パッケージをインストールすると、/usr/local 配下に x86 バイナリがインストールされ、mach-o file, but is an incompatible architecture というエラーを出力します。
ターミナル環境が Rosetta 2 上で動作しているかを確認し、直ちに 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 "サポートされていないアーキテクチャ: ${SYSTEM_ARCH}" >&2
exit 1
fi
eval "{HOMEBREW_PREFIX}/bin/brew shellenv)"
`
カーネルパラメータ sysctl -n sysctl.proc_translated を照会して 1 が返される場合は Rosetta 2 状態です。この時 exec arch -arm64 /bin/zsh "$0" "$@" を実行すると、スクリプト全体が arm64 シェルに切り替わり、/opt/homebrew パスに正しいバイナリがインストールされます。
開発者ごとに Homebrew のバージョンやインストールされているパッケージが異なると、「自分の環境では動くのに」という状況が頻発します。宣言型(declarative)の Brewfile と brew bundle check の組み合わせをスクリプトに入れておけば、新しく入社した人もコマンド 1 行でセットアップを完了できます。
`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 "Brewfile のすべての依存関係は最新の状態です。"
else
brew bundle install --file="${BREWFILE_PATH}"
fi
`
社内の Dotfiles リポジトリを $HOME/.dotfiles に同期した後、brew bundle check で未インストールのパッケージがあるかを先に確認します。不足しているパッケージがある場合のみ brew bundle install を実行するように構成すれば、スクリプトを何度繰り返し実行しても常に同一の環境が保持されます。