事象
capistranoのデプロイ時に以下のエラーになる。
bundle exec cap development deploy
...
Tasks: TOP => deploy:updated => bundler:install
(See full trace by running task with --trace)
The deploy has failed with an error: Exception while executing as deployer@develop: bundle exit status: 1
bundle stdout: /usr/local/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/ui/shell.rb:99:in `[]': invalid byte sequence in US-ASCII (ArgumentError)
from /usr/local/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/ui/shell.rb:99:in `strip_leading_spaces'
from /usr/local/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/ui/shell.rb:104:in `word_wrap'
from /usr/local/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/ui/shell.rb:90:in `tell_me'
from /usr/local/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/ui/shell.rb:35:in `error'
from /usr/local/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/friendly_errors.rb:21:in `log_error'
from /usr/local/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/friendly_errors.rb:100:in `rescue in with_friendly_errors'
from /usr/local/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/friendly_errors.rb:98:in `with_friendly_errors'
from /usr/local/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/exe/bundle:19:in `<top (required)>'
from /usr/local/rbenv/versions/2.3.1/bin/bundle:23:in `load'
from /usr/local/rbenv/versions/2.3.1/bin/bundle:23:in `<main>'
bundle stderr: Nothing written
原因
Macローカルのlocale設定 LC_CTYPE="UTF-8"
がssh時にサーバ側に転送され、サーバ側では UTF-8
というロケールが存在しないため。
# ローカル
/Users/yamy% locale
LANG="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_CTYPE="UTF-8"
# 開発機
[yamy@develop ~]$ locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: LC_ALL??????????????????: ??????????????????????
LANG=ja_JP.UTF-8
LC_CTYPE=UTF-8 <= これが原因
[deployer@develop ~]$ locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
対処方法
2種類ある。
- サーバ側の
LC_CTYPE
を修正して、かつローカルから送らないようにする - ローカルから正しい値を送るようにする
前者はサーバーの再起動が必要になりそうだったため、後者を選択した。
手元の .bashrc
などで LC_CTYPE
を追加する。
screen などを使用している場合は再起動させる。
/.zshrc
# users generic .zshrc file for zsh(1)
## Environment variable configuration
#
# LANG
#
export LANG=ja_JP.UTF-8
export LC_CTYPE=ja_JP.UTF-8 <= これを追加
export LESSCHARSET=utf-8
ローカルのlocaleがサーバ側で設定される理由
参考元を引用します。
- Mac の Terminal.app の Settings > Advanced > Set locale environment variables on startup がオンになっていると、 Mac 側で LC_CTYPE=UTF-8 が設定される
- Mac の /etc/ssh_config で SendEnv LANG LC_* になっているので、 LC_CTYPE が ssh サーバに送信される
- サーバーの /etc/ssh/sshd_config で AcceptEnv LANG LC_* になっているので、 Mac からの LC_CTYPE がサーバーに渡される
- UTF-8 というロケールはない (正しくは en_US.UTF-8 とか ja_JP.UTF-8) ので怒られる
ひとこと
以前は普通にデプロイ出来ていたので、MacのSoftware Updateなどのタイミングでふいに書き換わってしまうのかなと思った。