$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

capistranoでperlアプリケーションを簡単にデプロイ

自分の作ったアプリケーションをデプロイするのって結構大変ですよね。今回は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を使って、デプロイする方法を説明しました。コマンド一発でデプロイできたり、定義したタスクを実行できたりするので、便利ですね。さらにいろいろ使ってみたいと思ってます。