Corriger un script d'intégration Mac bloqué par la mise à jour Homebrew 6.0
2026年7月29日
0
Computing/SoftwareComments (0)
Log in to leave a comment
No posts yet
Log in to leave a comment
No posts yet
En arrivant au bureau ce matin, je découvre des dizaines de messages Slack m'informant que le script d'intégration pour les nouveaux arrivants est bloqué. En ouvrant le terminal, je constate qu'il reste indéfiniment figé lors du brew install, en attente d'une saisie utilisateur.
Depuis le passage à Homebrew 6.0, l'interface interactive (mode Ask) et les politiques de blocage de l'entrée standard (stdin) ont été renforcées. Lorsqu'une personne tape les commandes manuellement, tout fonctionne parfaitement ; mais exécuté en arrière-plan via un script Shell, le terminal entre dans un état de blocage des entrées/sorties.
Si les demandes de configuration d'environnement de vos coéquipiers interrompent continuellement votre propre travail, il est temps d'intégrer directement quelques variables d'environnement et gestions d'exceptions dans le script.
Homebrew 6.0 provoque une attente d'entrée/sortie inattendue lors de l'installation de paquets en l'absence de connexion TTY (terminal interactif). Pour bloquer ce phénomène et créer un environnement d'exécution totalement automatisé, vous devez déclarer explicitement des variables d'environnement dédiées au tout début du script.
En ajoutant les variables suivantes au sommet de votre script, vous désactiverez tous les invites interactives et les affichages de conseils, à l'exception des demandes de privilèges administrateur.
`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 "Déjà installé : {formula}"; then
echo "Erreur : échec de l'installation de ${formula}" >&2
return 1
fi
fi
}
safe_brew_install "git"
safe_brew_install "jq"
`
Si vous utilisez le fichier de configuration intégré de Homebrew (brew.env) au lieu du fichier .zshrc, n'utilisez pas le mot-clé export et écrivez simplement des paires clé-valeur sous la forme HOMEBREW_NO_ENV_HINTS=1 pour éviter toute erreur de syntaxe.
À partir de la version 6.0, le « Tap Trust Model » est appliqué par défaut pour des raisons de sécurité de la chaîne d'approvisionnement. Les Taps externes non vérifiés ou les anciens paquets utilisant MD5 ou SHA-1 ne s'exécutent tout simplement plus.
Les formules destinées au déploiement d'outils internes doivent obligatoirement spécifier une empreinte SHA-256 et réussir le contrôle brew audit --strict afin d'éviter de faire échouer votre pipeline 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
`
Incluez un identifiant de licence conforme à la norme SPDX (license "Proprietary") ainsi que des champs url et desc précis au sein du fichier de formule interne (internal-api-cli.rb). Il est pratique de configurer votre pipeline CI/CD pour qu'il extrait la valeur via shasum -a 256 après avoir téléchargé le fichier, puis qu'il la mette à jour automatiquement avec sed.
Sur le Mac local d'un développeur, exécuter une fois brew trust company/tools permet d'enregistrer le Tap interne comme source de confiance, évitant ainsi tout avertissement de sécurité lors de l'installation.
Si le terminal VS Code ou un ancien émulateur de terminal fonctionne sous un binaire Intel (x86_64), le résultat de uname -m renverra x86_64, même sur un Mac équipé d'une puce série M. Si vous installez des paquets Homebrew dans cet état, les binaires x86 s'installeront sous /usr/local et renverront l'erreur mach-o file, but is an incompatible architecture.
Il est nécessaire d'insérer une condition qui vérifie si l'environnement du terminal s'exécute sous Rosetta 2 et relance immédiatement le processus de manière native en 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 "Architecture non prise en charge : ${SYSTEM_ARCH}" >&2
exit 1
fi
eval "{HOMEBREW_PREFIX}/bin/brew shellenv)"
`
Si la requête sur le paramètre noyau sysctl -n sysctl.proc_translated renvoie 1, vous êtes sous Rosetta 2. Dans ce cas, l'exécution de exec arch -arm64 /bin/zsh "$0" "$@" bascule l'ensemble du script dans un shell arm64, permettant d'installer les bons binaires dans le répertoire /opt/homebrew.
Si chaque développeur utilise une version différente de Homebrew et possède des paquets différents, la situation du type « mais ça marche sur ma machine ! » se répétera sans cesse. En associant un Brewfile déclaratif à la commande brew bundle check dans votre script, un nouveau venu pourra terminer sa configuration en une seule ligne de commande.
`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 "Toutes les dépendances du Brewfile sont à jour."
else
brew bundle install --file="${BREWFILE_PATH}"
fi
`
Après avoir synchronisé le dépôt Dotfiles de l'entreprise dans $HOME/.dotfiles, vérifiez d'abord avec brew bundle check s'il manque des paquets. En configurant le script pour qu'il n'exécute brew bundle install que lorsque des paquets sont manquants, vous garantissez le maintien d'un environnement identique, peu importe le nombre de fois où le script est exécuté.