Windows でだけ Linux サーバへの Chef のプロビジョニングが失敗する問題への対処

invalid byte sequence in UTF-8

とか言われて表題のような事象に悩んでる人向けに解決法を残しておく。

Cookbook を Git で管理していて、 git config core.autocrlf が true の場合、チェックアウト時に LF => CRLF 変換をかけてしまう。そのため、Linux サーバへのプロビジョニング時に問題が発生する場合がある (files でスクリプトを設置するときは特に注意が必要)

core.autocrlf

ProGit 引用

自分が Windows で開発していたり、チームの中に Windows で開発している人がいたりといった場合に、改行コードの問題に巻き込まれることがありがちです。Windows ではキャリッジリターンとラインフィードでファイルの改行を表すのですが、MacLinux ではラインフィードだけで改行を表すという違いが原因です。ささいな違いではありますが、さまざまなプラットフォームにまたがる作業では非常に面倒なものです。 Git はこの問題に対処するために、コミットする際には行末の CRLF を LF に自動変換し、ファイルシステム上にチェックアウトするときには逆の変換を行うようにすることができます。この機能を使うには core.autocrlf を設定します。Windows で作業をするときにこれを true に設定すると、コードをチェックアウトするときに行末の LF を CRLF に自動変換してくれます。

対策

.gitattributes ファイルで改行コードを固定したいファイルを指定して変換しないようにする

参考 https://help.github.com/articles/dealing-with-line-endings/

# Linux サーバ上に配置するスクリプトを想定
*.sh eol=lf
# そもそも全部 lf でいいやという場合
*.* eol=lf

または、ディレクトリ以下のファイルの変換を行わないようにする

# 例えば、cookbooks/ に設置
* eol=lf

既にリポジトリをチェックアウトしている場合は、対象のファイル・ディレクトリを一旦削除してから git chekout -- hogehoge.sh とかしてチェックアウトしなおすと、指定した改行コードのファイルで再作成してくれる。