デプロイ、自動化するってよ (EOTD No.6)

公開:2020/12/08
更新:2020/12/08
2 min読了の目安(約2400字TECH技術記事

こちらAmetaです! 第6回目のEOTD(Error Of The Day)です。


以下、余談です。

今日はデプロイをテーマに選んだので、記事のアイコンを選ぶときに"deploy"で検索してみると、
何故なんだか上の船の絵が出てきて驚きました。

気になったのでググった所、デプロイには"展開する"という意味以外に

(部隊・兵力などを)配置する /source:Weblio英和辞典

という意味があるみたいです。

特に海軍の軍事展開の事を"Navy Deployment"と呼ぶらしく、恐らくここに船のアイコンが
由来しているんじゃないのかい?と思いました。

ちなみに、アメリカの海兵の方々は海軍学校で様々なトレーニングを積んだ後、
なんと6,7ヶ月以上もかけて船や潜水艦の配置をしていくらしいです。

https://www.militaryonesource.mil/military-life-cycle/friends-extended-family/deployment-basics-by-service-branch/

...カッコいい。

以上、余談でした。

というわけで、早速参りましょう。。。

本日のエラー

シチュエーション

このエラーは、Capistranoと呼ばれる自動デプロイツールを使用するときに発生しました。

https://en.wikipedia.org/wiki/Capistrano_(software)

それまでは、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自体は便利なツールだと感じたので使いこなせるようにしていきたいです。

これまでのエラーと異なり、今回のような二つの環境を跨ぐ操作はエラーの原因を特定するのが難しい。今日の学びです。。

もしエラーの原因に目星がつく方がいらっしゃいましたら、コメント欄でご教授願います!