こんにちは。もんしょー(@sima199407)です。
という疑問にお答えしたいと思います。
実のところ、このデプロイ作業で3日ほど時間を使いました笑
なので、少しでもヒントになるような情報を提供できればと思います。
「GCPからデプロイするときに10000ファイルまでしかあげられない」というトラップに引っかかってしまった。。
SFTPで作業をしてきた人間としてなかなかしんどいですが、その現場にあったカタチに対応しないといけないですね?
— もんしょー@新卒2社でweb担当 (@sima199407) August 15, 2019
「GCPからデプロイするときに10000ファイルまでしかあげられない」というトラップに引っかかってしまった。。
SFTPで作業をしてきた人間としてなかなかしんどいですが、その現場にあったカタチに対応しないといけないですね?
こんな感じで苦戦してました。。。
開発環境
MacOS Mojave 10.14
laravel 5.7
GAE
基本的にMacbook で開発してますので、windowsだと多少は変わるのかもしれません。(Cloud SDKの設定とか?)
基本のデプロイ方法
ローカル→GAEなら「Cloud SDK」を使うのがいいとおもいます。
「Cloud SDK をダウンロード」を参考にしながらインストールができます。
デプロイのコマンドとしては設定ファイルapp.yamlのある階層で
gcloud app deploy
を叩けばオッケーです。
このデプロイ完了までが結構時間がかかります。僕のlaravelの場合3分弱かかりました。。
デプロイするまでに発生したエラー集
開発環境を構築するときに必ずと言っていいほどエラーに出くわすと思いますが、僕が今回直面したのは以下の通り。
(解決法)をクリックすると該当のページに移動します。
[box02 title="GAEのデプロイ時のエラー"]
ターミナル上のエラー
・This deployment has too many files.~(解決法)
・ERROR: gcloud crashed (UnicodeEncodeError): 'ascii' codec can't encode characters~(解決法)
・ERROR: gcloud crashed (MultiError): One or more errors occurred:
・ERROR: (gcloud.beta.app.deploy) Error Response: [9] Cloud build ~ (解決法)
デプロイした後のエラー
・file_put_contents(/var/www/storage/framework/sessions/~(解決法)
・Please provide a valid cache path.(解決法)(解決法-2)
[/box02]
という上記の通りです。
「This deployment has too many files.~」のエラー
GAEのデプロイ時には10000ファイルまでしか一度にアップロードできないのがお約束になってます。
そこまで多くのファイルを上げることはほとんどないかと思いますが、「こんなエラーもあるんだな」と覚えておいてほしいです。
解決法
不要なファイルを削除 or skip_filesとして追加します。
skip_filesはapp.yaml内に追記できるのですがこれも若干クセ者なので使い方に注意です。
公式ページの「app.yaml リファレンス」に書いてあるとおりなのですが、後述するUnicodeEncodeErrorに引っかかてしまったみたいでうまく行かなかったです。
不要なファイルを削除することが一番。(消すのは慎重に!)
「ERROR: gcloud crashed (UnicodeEncodeError): 'ascii' codec can't encode characters~」のエラー
これはapp.yamlにskip_filesを正規表現で追加していったときに出たエラーでして、これで3回くらい苦しめられました。
これをググってもGAEでの事例は出てこないかと思います。
解決法
正規表現も大事なんですが、公式のリファレンスを見たほうがいいです。
「app.yaml リファレンス」
正規表現に気をつけるべし
「gcloud crashed (MultiError): One or more errors~」と「(gcloud.beta.app.deploy) Error Response: [9] Cloud build ~ 」のエラー
これはskip_filesをいじっていたときに出てきたエラーでして、わりとここらへんのエラーはハマってしまい意気消沈していたところです。
解決法
skip_filesに入れてはいけないディレクトリを入れていたみたいです。
例えば、以下の2つはスキップできないものになります。
・- vendor/
・- database/
vendorとか無駄にファイル数多いのでスキップしたくなりますけど、skip_filesに入れる必要はないです。
skip_filesに入れてはいけないファイルが含まれている可能性がある
「file_put_contents(/var/www/storage/framework/sessions/~」のエラー
デプロイができてからも油断ができません。GAEのページから実際にアクセスできるかどうかを確認しましょう。
全部で3回デプロイしたのですが一度目のアップロードでこのようなエラーが出てきました。
laravelのキャッシュ問題ですね。デプロイしたファイルには含まれないものを読み込もうとしてたみたいで、「No such file or ~」と出ていました。
解決法
デプロイ前にキャッシュをきれいにしておきましょう。
以下のコマンドを叩いてみましょう。
php artisan cache:clear
そうすると、/storage/framework/sessions/内のファイルが削除されるかと思います。
キャッシュをクリアに。
「Please provide a valid cache path.」のエラー
laravelのキャッシュを消してから再度デプロイしたら、今度は上記のようなエラーになりました。
本来キャッシュを保存するディレクトリがデプロイできてないみたいです。
「アップロードするときにはあったはずなのに!」と思ったのですが、ビルド履歴からソースコードを見たらアップロードされていませんでした。
解決法
storageディレクトリを確認しましょう。
ファイルの有無でエラーが出てしまうのなら、DBでセッションを管理する方法もあります。
「Laravelのセッション管理をデータベースに変更」が詳しく書いてあるので是非参考してみてください。
解決法-2
storageディレクトリのパーミッションの問題もあるかもです。
チェックする項目は以下の部分
chmod 777 bootstrap/cache
chmod 777 storage/app/public
chmod 777 storage/framework/cache
chmod 777 storage/framework/sessions
chmod 777 storage/framework/views
chmod 777 storage/logs
参考:Laravel:file_put_contentsエラーでViewが開かない
777で開けるのはちょっと危険かもしれないので、757などにするのもアリです。
確信はありませんがこっちも確認してみてください。
キャッシュとパーミッションの確認をする。
まとめ
ここまでやっていくとlaravelのエラーを対処できるヒントが有るかと思います。
最後にエラー対処のポイントまとめで締めさせていただきます。
[box03 title="エラー対処の原則"]
・ドキュメントを見直す
・エラー文をググる
・国内外問わず記事を探す(AWSのときも同じだったけど、日本語の情報だと足りない)
[/box03]
という感じになります。
最後まで読んでいただきありがとうございます。