某スクールの最終課題をEC2で自動デプロイする時に発生した事象。
自動デプロイツール「Capistrano」を導入し、自動デプロイを実行した際に発生したエラーの詳細と解決方法について記載します。
導入目的:デプロイ時に必要なコマンド操作が1回で済み、手動デプロイする場合に起こりうる下記問題を解消することができる。
手動デプロイで起こりがちな問題
・コマンドの打ち間違い、手順の間違いが発生する可能性がある
・手順が多く、煩わしい
発生したエラー
自動デプロイを実行する為に、ローカルターミナルで以下コマンドを実行したところ、
% bundle exec cap production deploy
以下エラーメッセージが出現。メッセージを見ると、「Bundler::GemNotFound: Could not find date-3.3.3 in any of the sources(gemfileの中に"date-3.3.3”が見つからないよ。)」とのこと。
** DEPLOY FAILED
** Refer to log/capistrano.log for details. Here are the last 20 lines:
<省略>
DEBUG [e60eb18b] bundler: failed to load command: rake
(/var/www/<レポジトリ名>/shared/bundle/ruby/2.6.0/bin/rake)
DEBUG [e60eb18b] Bundler::GemNotFound: Could not find date-3.3.3 in any of the sources
"date-3.3.3"がgemfile内にないことが原因でエラーが発生していると推測し、gemfile内に以下を記述し、ローカル環境でbundle installを実施した上で、再度「bundle exec cap production deploy」コマンドを試したが、同じエラーが発生。
gem 'date', '~> 3.3', '>= 3.3.3'
エラーの原因
1人では考えても埒が明かなかったのでメンターに相談したところ、
2022/12/3にrailsの必須gemの一つであるmailが2.7.1から2.8にアップデートされたことで、
このgemバージョンで使用するdateというgemが、EC2側で取得できておらずエラーが発生しているとのこと。
解決方法
メンターに教えて頂いた以下の手順を踏めば、問題なく自動デプロイが完了しました。
①Gemfileの末尾に「gem 'mail', '2.7.1'」を追記。(mailのバージョンを下げる指定をすることで、dateのgemを取得しないようにする為。)
*Gemfileに「gem 'date', '~> 3.3', '>= 3.3.3'」を記述した場合は、gem 'date'の記述を削除。
②Gemfile.lockの削除
③ローカルでbundle install
④コミットプッシュ
⑤EC2内で自動デプロイ実行(% bundle exec cap production deploy)