Mac-Onboarding-Skript reparieren, das durch das Homebrew 6.0 Update hängt
29 de julho de 2026
0
Computing/SoftwareComments (0)
Log in to leave a comment
No posts yet
Log in to leave a comment
No posts yet
Als ich morgens im Büro ankam, sammelten sich bereits Dutzende Slack-Nachrichten: Das Onboarding-Skript für neue Mitarbeiter sei hängengeblieben. Beim Blick ins Terminal stellte sich heraus, dass der Prozess während brew install unendlich lange auf eine Benutzereingabe wartete.
Mit dem Upgrade auf Homebrew 6.0 wurden die Richtlinien für die interaktive Benutzeroberfläche (Ask-Modus) und die Blockierung der Standardeingabe (stdin) verschärft. Wenn ein Mensch Befehle manuell eingibt, gibt es kein Problem; wird dies jedoch per Shell-Skript im Hintergrund ausgeführt, gerät das Terminal in einen I/O-Deadlock.
Wenn Ihr eigener Arbeitsablauf ständig durch Umgebungs-Setup-Anfragen von Teammitgliedern unterbrochen wird, ist es an der Zeit, ein paar Umgebungsvariablen und Fehlerbehandlungen direkt in das Skript einzubauen.
Homebrew 6.0 verursacht unerwartete E/A-Wartezeiten, wenn Pakete ohne eine TTY-Verbindung (interaktives Terminal) installiert werden. Um diese Terminal-Wartezeiten zu unterbinden und eine vollständig unbeaufsichtigte Ausführungsumgebung zu schaffen, müssen Sie spezifische Umgebungsvariablen ganz oben im Skript angeben.
Wenn Sie die folgenden Variablen am Anfang des Skripts hinzufügen, werden alle interaktiven Eingabeaufforderungen und Hinweise – mit Ausnahme von Administratorrechten-Anfragen – deaktiviert.
`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"
`
Wenn Sie statt der Datei .zshrc die integrierte Homebrew-Konfigurationsdatei brew.env verwenden, müssen Sie das Schlüsselwort export weglassen und die Angaben als Schlüssel-Wert-Paare wie HOMEBREW_NO_ENV_HINTS=1 schreiben, um Syntaxfehler zu vermeiden.
Ab Version 6.0 wird aus Gründen der Lieferkettensicherheit standardmäßig das "Tap Trust Model" angewendet. Unverifizierte externe Custom Taps oder veraltete Pakete, die MD5 oder SHA-1 verwenden, werden am Laden gehindert.
Formulae für die interne Werkzeugverteilung müssen zwingend einen SHA-256-Digest enthalten und die Prüfung brew audit --strict bestehen, damit die CI/CD-Pipeline nicht fehlschlägt.
`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
`
Tragen Sie in der Datei der internen Formula (internal-api-cli.rb) eine SPDX-konforme Lizenzkennung (license "Proprietary") sowie die exakten url- und desc-Felder ein. Es ist praktisch, in der CI/CD-Pipeline den Wert nach dem Dateidownload mittels shasum -a 256 zu extrahieren und per sed automatisch zu aktualisieren.
Auf den lokalen Macs der Entwickler genügt es, einmalig brew trust company/tools auszuführen, um den internen Tap als vertrauenswürdige Quelle zu registrieren – so erfolgt die Installation ohne Sicherheitshinweise.
Wenn das VS Code-Terminal oder ein älterer Terminal-Emulator als Intel (x86_64)-Binärdatei läuft, gibt uname -m selbst auf einem M-Series Mac x86_64 zurück. Wenn Sie in diesem Zustand Homebrew-Pakete installieren, werden x86-Binärdateien unter /usr/local abgelegt, was zu dem Fehler mach-o file, but is an incompatible architecture führt.
Es ist eine Bedingung erforderlich, die prüft, ob die Terminalumgebung unter Rosetta 2 läuft, und den Prozess gegebenenfalls sofort nativ unter arm64 neu startet.
`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)"
`
Wenn die Abfrage des Kernelparameters sysctl -n sysctl.proc_translated den Wert 1 liefert, befindet sich das System im Rosetta 2-Modus. Die Ausführung von exec arch -arm64 /bin/zsh "$0" "$@" wechselt das gesamte Skript in eine arm64-Shell, sodass die korrekten Binärdateien im Pfad /opt/homebrew installiert werden.
Wenn Homebrew-Versionen und installierte Pakete von Entwickler zu Entwickler variieren, wiederholt sich ständig das Szenario "Auf meinem Rechner funktioniert es aber". Die Einbindung eines deklarativen Brewfile zusammen mit brew bundle check in das Skript ermöglicht es neuen Mitarbeitern, das Setup mit einem einzigen Befehl abzuschließen.
`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
`
Nachdem das interne Dotfiles-Repository nach $HOME/.dotfiles synchronisiert wurde, prüft brew bundle check zunächst, ob nicht installierte Pakete vorhanden sind. Wenn brew bundle install nur dann ausgeführt wird, wenn Pakete fehlen, bleibt die Umgebung auch bei mehrmaliger Ausführung des Skripts stets identisch.