Windows環境でcron設定をeb deployする時はtext eol=lfにする

Laravelのスケジュールタスクが動かない

以下のようなcron.dの設定を用意し、Windows10からElastic Beanstalk環境にデプロイしたところ正常に動かなかった。

.ebextensions/crontab/laravel-schedule.txt

* * * * * root /usr/bin/php /var/www/html/artisan schedule:run > /dev/null 2>&1

cron.d配下のファイルは末尾に改行を入れないと正常に動かないが、laravel-schedule.txtの末尾には改行を入れていたのでそこは問題なかった。

.ebextensions/1-crontab.config

container_commands:
  01_laravel_cron_job:
    command: "cat .ebextensions/crontab/laravel-schedule.txt > /etc/cron.d/laravel-schedule && chmod 644 /etc/cron.d/laravel-schedule"
    leader_only: true

/var/log/cron でログを確認したところ、走らせるコマンドの末尾に^Mが付いていた。これはCR(キャリッジリターン)。これのせいでコマンド自体が走らず失敗していたようだ。

core.autocrlf=true なのに何故?

core.autocrlf=trueの設定をしていれば、gitでプッシュする際に改行コードはLFへ自動変換される。ただ、今回のケースではCRが残っていた。未だに原因がよく分からないけど、「たまに改行コードが ^M(CRのみ)」になるらしい。そんなんアリか…

git での改行コード – Qiita

対策

.gitattributesでtxtファイルを強制的にLFの正規化にかけた。

.gitattributes

# text : テキスト属性をtrueにする(改行コード変換の対象とする)
# eol=lf : 改行コードをLFに正規化してチェックイン(プッシュする)

*.txt text eol=lf

あと気をつけたほうが良さそうなことの引用↓

eol=lfが「改行コードをLFに正規化してチェックインする」と明言しているのに対し、eol=crlfは「改行コードを正規化してチェックインする」としか言っていない。あくまでも「チェックアウト時にCRLFに変換する」機能なので、リポジトリにCRLFで格納することを強制する用途で使うことはできない。

.gitattributesのeol=crlfは改行コードをCRLFに変換してチェックインするものではない | standards for me

おわりに

こんなんで3時間もハマってしまったので私にWindowsは早すぎたようです。