brewのHOMEBREW_ENV_FILTERINGフラグを知った

brewが実行のたびにcurlエラーという状況になり、しばしはまったのでメモ。

以下のよう現象になった。
brewのたびにエラーが起きるので何もできない。

1
2
3
4
5
6
$ brew
==> Downloading https://homebrew.bintray.com/bottles-portable/portable-ruby-2.3.3.leopard_64.bottle.1.tar.gz
curl: (51) SSL: certificate verification failed (result: 5)
Error: Download failed: https://homebrew.bintray.com/bottles-portable/portable-ruby-2.3.3.leopard_64.bottle.1.tar.gz
Error: Failed to install vendor Ruby.

エラー内容からCURL_CA_BUNDLE あたりを疑い、パスとcurlのバージョン、certあたりを確認し、SSL_CERT_FILEが設定されていることがわかり、unsetするもいっこうに解消しない。

他の環境変数が影響しているのか、結局原因がわからないままになったが、同様の現象でissueがあり、HOMEBREW_ENV_FILTERINGで環境変数をフィルタリングすることを知り試してみると、無事に解消した。

1
2
3
4
$ HOMEBREW_ENV_FILTERING=1 brew
==> Downloading https://homebrew.bintray.com/bottles-portable/portable-ruby-2.3.3.leopard_64.bottle.1.tar.gz
######################################################################## 100.0%
==> Pouring portable-ruby-2.3.3.leopard_64.bottle.1.tar.gz

HOMEBREW_ENV_FILTERINGに関してはv1.11で追加されており、実装は以下の通り。

https://github.com/Homebrew/brew/blob/b2e2e4b917805b8cf0a86bbc4a1517146a1f0d33/bin/brew#L61-L71

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if [[ -n "$HOMEBREW_ENV_FILTERING" ]]
then
PATH="/usr/bin:/bin:/usr/sbin:/sbin"
FILTERED_ENV=()
for VAR in HOME SHELL PATH TERM LOGNAME USER "${[email protected]}"
do
FILTERED_ENV+=( "${VAR}=${!VAR}" )
done
/usr/bin/env -i "${FILTERED_ENV[@]}" /bin/bash "$HOMEBREW_LIBRARY/Homebrew/brew.sh" "[email protected]"
else
source "$HOMEBREW_LIBRARY/Homebrew/brew.sh"
fi

で実際に手元でやってみると以下のようになる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ HOMEBREW_ENV_FILTERING=1 brew config
HOMEBREW_VERSION: 1.3.6
ORIGIN: https://github.com/Homebrew/brew
HEAD: 270b752f5d9d218bfbed6fe85b6974fa653fb25f
Last commit: 10 days ago
Core tap ORIGIN: https://github.com/Homebrew/homebrew-core
Core tap HEAD: b6e963c1ce72391194f9b81126afc400885f1bc5
Core tap last commit: 25 minutes ago
HOMEBREW_PREFIX: /usr/local
HOMEBREW_REPOSITORY: /usr/local/Homebrew
HOMEBREW_CELLAR: /usr/local/Cellar
HOMEBREW_BOTTLE_DOMAIN: https://homebrew.bintray.com
CPU: quad-core 64-bit broadwell
Homebrew Ruby: 2.3.3 => /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.3.3/bin/ruby
Clang: 8.0 build 800
Git: 2.10.1 => /Applications/Xcode.app/Contents/Developer/usr/bin/git
Perl: /usr/bin/perl
Python: /usr/bin/python
Ruby: /usr/bin/ruby => /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby
Java: 1.6.0_65-b14-468
macOS: 10.11.6-x86_64
Xcode: 8.2.1
CLT: 8.2.0.0.1.1480973914
X11: 2.7.9 => /opt/X11
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ brew config
HOMEBREW_VERSION: 1.3.6
ORIGIN: https://github.com/Homebrew/brew
HEAD: 270b752f5d9d218bfbed6fe85b6974fa653fb25f
Last commit: 10 days ago
Core tap ORIGIN: https://github.com/Homebrew/homebrew-core
Core tap HEAD: b6e963c1ce72391194f9b81126afc400885f1bc5
Core tap last commit: 44 minutes ago
HOMEBREW_PREFIX: /usr/local
HOMEBREW_REPOSITORY: /usr/local/Homebrew
HOMEBREW_CELLAR: /usr/local/Cellar
HOMEBREW_BOTTLE_DOMAIN: https://homebrew.bintray.com
CPU: quad-core 64-bit broadwell
Homebrew Ruby: 2.3.3 => /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.3.3/bin/ruby
Clang: 8.0 build 800
Git: 2.14.3 => /usr/local/bin/git
Perl: /usr/bin/perl
Python: /usr/bin/python
Ruby: /Users/XXX/.rbenv/shims/ruby => /Users/XXX/.rbenv/versions/2.3.3/bin/ruby
Java: 1.6.0_65-b14-468
macOS: 10.11.6-x86_64
Xcode: 8.2.1
CLT: 8.2.0.0.1.1480973914
X11: 2.7.9 => /opt/X11
1
2
3
4
5
6
7
8
15c15
< Git: 2.14.3 => /usr/local/bin/git
---
> Git: 2.10.1 => /Applications/Xcode.app/Contents/Developer/usr/bin/git
18c18
< Ruby: /Users/XXX/.rbenv/shims/ruby => /Users/XXX/.rbenv/versions/2.3.3/bin/ruby
---
> Ruby: /usr/bin/ruby => /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby

というように手元の環境をフィルタリングしてデフォルトのものを使う感じになのかな。
まずbrewがトラブった場合は試してみるとよさそう。

Comments