LoginSignup
4
2

More than 5 years have passed since last update.

Capistranoデプロイ時にinvalid byte sequenceエラーになる

Last updated at Posted at 2017-04-11

事象

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などのタイミングでふいに書き換わってしまうのかなと思った。

参考

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2