自分の作ったアプリケーションをデプロイするのって結構大変ですよね。今回はcapistranoを使って、perlのアプリケーションをデプロイ出来るようにしてみたので、そのやり方をまとめてみました。
capistranoとは
「複数の環境に同じ処理を同時に実行させる」ためのツールです。これを利用して複数環境へのデプロイやテスト実行などが簡単に行うことができます。
capistranoのインストール
gemで提供されているので、そちらからインストールします。ruby, gemはインストールされてるとして、次のコマンド。
$ gem install capistrano
capistrano用ユーザの作成(追記)
capistranoは全てのサーバでユーザとパスワードを揃えておかないといけません。次のコマンドでユーザを作ってください。もしgitosisなどを作っている場合はさらに公開鍵などの設定をします。
useradd -m capistrano sudo passwd capistrano
capistrano用設定ファイルの作成
capistranoはCapfileというファイルの設定を読み込んで、コマンドを実行します。今回はCapfileとconfig/deploy.rbというファイルを作成します。プロジェクトのルートから作ってください。
Capfile
load 'deploy' if respond_to?(:namespace) # cap2 differentiator Dir['vendor/plugins/*/recipes/*.rb'].each { |plugin| load(plugin) } load 'config/deploy' # remove this line to skip loading any of the default tasks
config/deploy.rb
# base setting set :user, 'capistrano' set :group, 'servers' set :domain, '192.168.1.10' set :application, 'Sample' # file paths set :repository, "git@#{domain}:projects/#{application}.git" set :deploy_to, "/var/www/#{application}" # distribute your applications across servers (the instructions below put them # all on the same server, defined above as 'domain', adjust as necessary) role :app, domain role :web, domain role :db, domain, :primary => true # miscellaneous options set :deploy_via, :checkout set :scm, 'git' set :branch, 'master' set :scm_verbose, true set :use_sudo, false namespace :deploy do desc <<-DESC overridden for perl environment. DESC task :finalize_update, :except => { :no_release => true } do run "chmod -R g+w #{latest_release}" if fetch(:group_writable, true) # mkdir -p is making sure that the directories are there for some SCM's that don't # save empty folders run <<-CMD rm -rf #{latest_release}/log && ln -s #{shared_path}/log #{latest_release}/log CMD end desc <<-DESC this task needed for rails application. so delete it. DESC task :restart, :roles => :app, :except => { :no_release => true } do end end
この二つのファイルの説明をします。
まずCapfileは必要なファイルの読み込みだけ行うようにして、処理の部分は他のファイルに切り出すようになっています。
二つ目のconfig/deploy.rbはデプロイのための設定とrails依存タスク(残ってるとエラーが出る)の上書きを行っています。deploy:finalize_updateはそもそもはpublic/cssなどrailsでは作成されている構造を前提として実行します。そのため、その依存の部分を削除して、logディレクトリにシンボリックリンクを作るところだけ残し、上書きしています。deploy:restartもrailsを再起動するためのコードがあるので、一旦何もしないように上書きしています。これでエラーは出なくなります。
このファイルを作る以外にも、サーバ側でユーザを作成するとか鍵ファイルを作成するとかいろいろやらなきゃいけないんですが、そのあたりは他の記事でもわかると思うので割愛します。以下の記事を参考にしてみてください。あとCapistranoのソースを見てみると説明があったりします。
デプロイの実行
まず、初回デプロイ前にサーバの構成をセットアップするため、
$ cap deploy:setup
を実行します。
その後は、次のコマンドをうつだけで、最新バージョンがデプロイされるようになります。
$ cap deploy
サーバ上では指定したディレクトリの下にcurrent, releases, sharedというディレクトリが出来て、
- 現在のバージョンはcurrentからシンボリックリンク
- releases下にこれまでデプロイした構成がtimestampのついたディレクトリに格納
- 全てのデプロイで共有するファイル(logファイルとか)はsharedというディレクトリに格納され、それぞれからシンボリックリンクされる
というようにデプロイされます。
まとめ
というわけで今回はperlの環境でcapistranoを使って、デプロイする方法を説明しました。コマンド一発でデプロイできたり、定義したタスクを実行できたりするので、便利ですね。さらにいろいろ使ってみたいと思ってます。