デプロイ、自動化するってよ (EOTD No.6)
こちらAmetaです! 第6回目のEOTD(Error Of The Day)です。
今日はデプロイをテーマに選んだので、記事のアイコンを選ぶときに"deploy"で検索してみると、
何故なんだか上の船の絵が出てきて驚きました。
気になったのでググった所、デプロイには"展開する"という意味以外に
(部隊・兵力などを)配置する /source:Weblio英和辞典
という意味があるみたいです。
特に海軍の軍事展開の事を"Navy Deployment"と呼ぶらしく、恐らくここに船のアイコンが
由来しているんじゃないのかい?と思いました。
ちなみに、アメリカの海兵の方々は海軍学校で様々なトレーニングを積んだ後、
なんと6,7ヶ月以上もかけて船や潜水艦の配置をしていくらしいです。
...カッコいい。
というわけで、早速参りましょう。。。
本日のエラー
シチュエーション
このエラーは、Capistranoと呼ばれる自動デプロイツールを使用するときに発生しました。
それまでは、AWSにて生成したEC2インスタンスにログインをして、本番環境のアプリケーションを手動でデプロイしていました。
EC2インスタンスとは?
AWS上で生成できる仮想のサーバー。仮想マシンというソフトを利用してLinuxのサーバーを仮想的に生み出している。なおデフォルトのシェルはzshではなくbashとなっているため、環境構築に用いるコマンドはそれに対応する必要がある。一方でzshをシェルに指定する方法もあるらしい。。
ただこのCapistranoを使えば、EC2のインスタンス上にアクセスすることなく、ローカルからワンコマンドでデプロイすることができる。素敵。。
そのコマンドがこちら。
% bundle exec cap production deploy
しかし、このコマンドがエラーの引き金となりました。。
考察
**DEPLOY FAILED
のメッセージの下にCapistranoのログ最新20行が表示されているようなので、まずは確認してみました。
すると怪しい1行を発見。
Gem::Exception: can't find executable unicorn for gem unicorn. unicorn is not included in the bundle.
unicornがバンドラーに入っていない。。
どうして?(手動でデプロイしたときにunicorn_rails
コマンドは使えたのに)
そう思ったのですが、Gemfileを見に行ってみると...
group :test do
gem 'unicorn', '5.4.1'
end
あ!本番(production)じゃなくてテスト(test)になってる。
この箇所を修正しました。
group :production do
gem 'unicorn', '5.4.1'
end
上記の変更をmasterブランチにpushした後、再び例のコマンドを試しましたが同じエラーが。。
その後、EC2の方でUnicornやWebサーバーを再起動させてみましたが反応は変わらず。
EC2の方でログインし、unicorn.logをチェックしたものの異常なし。
こりゃどうしたものか。。。
解決(?)
結論はEC2インスタンスの方でmasterブランチをpullした後、
% bundle exec cap production deploy
再度ローカル環境から上のコマンドを実行した所、本番環境でデプロイすることができました!
ただ、Capistranoを使えばEC2インスタンスにアクセスしなくてもデプロイが出来る!
という所が魅力なので、根本的な解決とは言えないような、、、
今日は良しとしましょう。。(穏やかに眠るために)
SOTD(Summary Of The Day)
今回の解決策はなんとも腑に落ちないものになりました。
ただ、Capistrano自体は便利なツールだと感じたので使いこなせるようにしていきたいです。
Discussion