Corrigindo o script de onboarding para Mac travado pela atualização do Homebrew 6.0
29 juillet 2026
0
Computing/SoftwareComments (0)
Log in to leave a comment
No posts yet
Log in to leave a comment
No posts yet
Quando cheguei ao trabalho de manhã, havia dezenas de mensagens no Slack acumuladas dizendo que o script de onboarding dos novos funcionários tinha travado. Ao abrir o terminal, vi que a situação era de travamento indeterminado durante o brew install, aguardando a entrada do usuário.
Com a atualização para o Homebrew 6.0, a interface interativa (Ask mode) e as políticas de bloqueio de entrada padrão (stdin) foram reforçadas. Quando uma pessoa digita os comandos diretamente, não há problema, mas ao executar em segundo plano via Shell script, o terminal entra em um estado de deadlock de E/S.
Se o seu próprio fluxo de trabalho está sendo interrompido por dúvidas dos membros da equipe sobre a configuração do ambiente, é preciso inserir diretamente algumas variáveis de ambiente e tratamentos de exceção no script.
O Homebrew 6.0 causa esperas imprevisíveis de E/S ao instalar pacotes sem uma conexão TTY (terminal interativo). Para bloquear esse travamento do terminal e criar um ambiente de execução autônomo e perfeito, é necessário especificar variáveis de ambiente dedicadas no topo do script.
Adicionar as seguintes variáveis ao início do script desativará todos os prompts interativos e exibições de dicas, exceto as solicitações de privilégios de administrador.
`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"
`
Ao usar o arquivo de configuração embutido do Homebrew, brew.env, em vez do arquivo .zshrc, você deve remover a palavra-chave export e escrever apenas como pares chave-valor no formato HOMEBREW_NO_ENV_HINTS=1 para evitar erros de sintaxe.
A partir da versão 6.0, o "Tap Trust Model" é aplicado por padrão por razões de segurança da cadeia de suprimentos. Taps customizados externos não verificados ou pacotes antigos que usam MD5 ou SHA-1 têm seu carregamento completamente bloqueado.
As Formulas para distribuição de ferramentas internas exigem a inclusão do digest SHA-256 e precisam passar pela verificação do brew audit --strict para não quebrar o pipeline de 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
`
Insira o identificador de licença no padrão SPDX (license "Proprietary"), além dos campos exatos de url e desc, dentro do arquivo da Formula para distribuição interna (internal-api-cli.rb). É conveniente fazer com que o pipeline de CI/CD extraia o valor com shasum -a 256 após baixar o arquivo e o atualize automaticamente usando sed.
No Mac local dos desenvolvedores, basta executar brew trust company/tools uma vez para registrar o Tap interno como uma fonte confiável, permitindo a instalação imediata sem avisos de segurança.
Se o terminal do VS Code ou um emulador de terminal antigo estiver rodando como um binário Intel (x86_64), o resultado de uname -m será x86_64, mesmo que você esteja usando um Mac da série M. Se você instalar pacotes do Homebrew nesse estado, os binários x86 serão instalados em /usr/local, lançando o erro mach-o file, but is an incompatible architecture.
É necessária uma instrução condicional para verificar se o ambiente do terminal está rodando sob o Rosetta 2 e reiniciar imediatamente o processo de forma nativa em 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)"
`
Se o retorno da consulta ao parâmetro do kernel sysctl -n sysctl.proc_translated for 1, significa que o sistema está em estado Rosetta 2. Nesses casos, ao executar exec arch -arm64 /bin/zsh "$0" "$@", todo o script é alternado para um shell arm64, garantindo a instalação dos binários corretos no caminho /opt/homebrew.
Se a versão do Homebrew e os pacotes instalados variarem de desenvolvedor para desenvolvedor, a situação do tipo "na minha máquina funciona" se repetirá. Ao incluir no script a combinação de um Brewfile declarativo e o comando brew bundle check, até mesmo os novos membros conseguirão concluir a configuração com uma única linha de comando.
`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
`
Após sincronizar o repositório de Dotfiles interno em $HOME/.dotfiles, verifique primeiro se há pacotes não instalados usando brew bundle check. Fazer com que o brew bundle install seja executado apenas quando houver pacotes ausentes garante que o mesmo ambiente seja mantido, independentemente de quantas vezes você execute o script.