capistranoのタスクでディレクトリ内のファイルをリモートに上げる処理を↓のように書いていたところ
# lib/capistrano/tasks/uploads.rake
namespace :uploads do
task :wpuploads do
ask(:upload_path, nil)
on roles(:web) do
upload!('wp-content/uploads/', "/var/www/html/app_name/shared/wp-content/uploads/", via: :scp, recursive: true)
end
end
end
しばらくは順調に進んでいたのですが、一部の日本語ファイルをアップロードしようとした時このようなエラーが出てしまいました。
(Backtrace restricted to imported tasks)
cap aborted!
Encoding::CompatibilityError: incompatible character encodings: ASCII-8BIT and UTF-8
/Users/user_name/chef/app_name/lib/capistrano/tasks/uploads.rake:18:in `block (3 levels) in '
Tasks: TOP => uploads:wpuploads
(See full trace by running task with --trace)
net-scpで起きるエラーのようで、下記のようにforce_encodingを追加したら問題なく進むようになりました。
# lib/capistrano/tasks/uploads.rake
module Net
module SSH
class Buffer
def write(*data_list)
data_list.each do |data|
@content << data.dup.force_encoding('ASCII-8BIT')
end
self
end
end
end
end
namespace :uploads do
task :wpuploads do
ask(:upload_path, nil)
on roles(:web) do
upload!('wp-content/uploads/', "/var/www/html/app_name/shared/wp-content/uploads/", via: :scp, recursive: true)
end
end
end
書く場所はもう少し工夫する必要がありそうです。