Capistrano3에서 rails를 deploy 해보십시오.

14893 단어 루비Capistrano
Capistrano는 오픈 소스 Ruby 소프트웨어 배포 도구입니다.



여러 서버에 소프트웨어 배포를 자동화할 수 있습니다.
rails를 대상으로 자주 사용되지만 rails 등의 프레임워크나 언어에 한하지 않고 배포할 수 있습니다.
현재 최신판은 3.0.1입니다. (2014/1/12 현재)
또한 Capistrano는 2에서 3으로 변경시 파라미터를 잡는 방법 등이 바뀌어 호환성이 없어지고 있습니다. 이번은 3 이후의 기술로 실시합니다.
공식 페이지


이번 환경


CentOS6.4

루비 2.1

rbenv


1. 설치



gem을 사용하여 capistrano를 설치합니다. root가 아닌 경우는 sudo 도 붙여 주세요.
rails가 아니라면 capistrano-rails가 필요하지 않습니다.
gem install capistrano
gem install capistrano-rails
gem install capistrano-rbenv #またはcapistrano-rvm

bundler를 사용하는 경우 아래 설명을 Gemfile에 추가하여 bundler install을 실행하십시오.
gem 'capistrano', '~> 3.0.1'
gem 'capistrano-rails'
gem 'capistrano-bundler'

2. 설정 파일 작성



구성 파일을 만듭니다. rails의 루트 디렉토리에서 다음 명령을 실행하십시오.
cap install

이제 다음 파일이 생성됩니다.
railsルート
├─  Capfile
├─  config
│ ├─  deploy
│ │ ├─production.rb
│ │ └─staging.rb
│ └─deploy.rb
└─  lib
    └─capistrano
        └─tasks

3.Capfile 묘사



먼저 Capfile을 작성합니다.
초기에는 코멘트 아웃이 있으므로 필요한 것을 코멘트 아웃으로부터 제외합니다.

Capfile
# Load DSL and Setup Up Stages
require 'capistrano/setup'

# Includes default deployment tasks
require 'capistrano/deploy'

# Includes tasks from other gems included in your Gemfile
#
# For documentation on these, see for example:
#
#   https://github.com/capistrano/rvm
#   https://github.com/capistrano/rbenv
#   https://github.com/capistrano/chruby
#   https://github.com/capistrano/bundler
#   https://github.com/capistrano/rails/tree/master/assets
#   https://github.com/capistrano/rails/tree/master/migrations
#
# require 'capistrano/rvm' #rvmならこちらを外す
require 'capistrano/rbenv' #rbenvならこちらを外す
set :rbenv_type, :system # or :system, depends on your rbenv setup
set :rbenv_ruby, '2.1.0' #rubyのバージョンを指定
# require 'capistrano/chruby'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'

# Loads custom tasks from `lib/capistrano/tasks' if you have any defined.
Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }

4.deploy/{환경}.rb 설명



deploy 폴더 아래에 production.rb나 staging 등이 초기입니다.
추가하고 싶다면 development.rb 등을 추가합니다.

development.rb
set :stage, :production #環境名
#各サーバの役割を記述
role :app, %w{[email protected]} #アプリケーションサーバ
role :web, %w{[email protected]} #webサーバ
role :db,  %w{[email protected]} #DBサーバ
#サーバ情報記述
server 'example.com', #サーバ名
user: 'deploy', #実行ユーザ
roles: %w{web app db}, # サーバの役割
ssh_options: {
    keys: %w(~/.ssh/xxxxx/private_key),
    auth_methods: %w(publickey), # 認証方法 passwordも可能
    #password: 'xxxxx' #password指定
}

4. 외부 파일에 작업 작성



deploy.rb의 외부 파일에 작업을 작성할 수 있습니다.
lib/capistrano/tasks 아래에 XXXX.cap 파일을 만듭니다.
이번에는 unicorn의 시작 작업 unicorn.rb로 작성하겠습니다.

unicorn.rb
namespace :unicorn do
  task :environment do
    set :unicorn_pid, "#{shared_path}/tmp/pids/unicorn.pid"
    set :unicorn_config, "#{current_path}/config/unicorn/#{fetch(:rails_env)}/unicorn.rb"
  end

  def start_unicorn
    within current_path do
      execute :bundle, :exec, :unicorn_rails, "-c #{fetch(:unicorn_config)} -E #{fetch(:rails_env)} -p 8080 -D"
    end
  end

  def stop_unicorn
    execute :kill, "-s QUIT $(< #{fetch(:unicorn_pid)})"
  end

  def reload_unicorn
    execute :kill, "-s USR2 $(< #{fetch(:unicorn_pid)})"
  end

  def force_stop_unicorn
    execute :kill, "$(< #{fetch(:unicorn_pid)})"
  end

  desc "Start unicorn server"
  task :start => :environment do
    on roles(:app) do
      start_unicorn
    end
  end

  desc "Stop unicorn server gracefully"
  task :stop => :environment do
    on roles(:app) do
      stop_unicorn
    end
  end

  desc "Restart unicorn server gracefully"
  task :restart => :environment do
    on roles(:app) do
      if test("[ -f #{fetch(:unicorn_pid)} ]")
        reload_unicorn
      else
        start_unicorn
      end
    end
  end

  desc "Stop unicorn server immediately"
  task :force_stop => :environment do
    on roles(:app) do
      force_stop_unicorn
    end
  end
end

5.deploy.rb 설명



deploy.rb에 배포시 작업을 설명합니다.
여기에서는 각 환경 공통의 처리, 변수를 기술합니다.set :対象変数 에서 변수에 값을 설정합니다. 이 값은 fetch :対象変数 에서 사용할 수 있습니다.

deploy.rb
#アプリケーション名
set :application,'test'
#レポジトリURL
set :repo_url, '[email protected]:xxxxxx/test.git'
#対象ブランチ masterに固定
set :branch, 'master'
#デプロイ先ディレクトリ フルパスで指定
set :deploy_to, '/var/www/test'
#バージョン管理方法 subverion, git, mercurial, cvs, bzrなど
set :scm, :git
#情報レベル info or debug
set :log_level, :debug
#sudoに必要 これをtrueにするとssh -tで実行される
set :pty, true
#sharedに入るものを指定
set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets bundle public/system public/assets}
#capistrano用bundleするのに必要
set :default_env, { path: "/usr/local/rbenv/shims:/usr/local/rbenv/bin:$PATH" }
#5回分のreleasesを保持する
set :keep_releases, 5 

#タスク定義
namespace :deploy do #タスクnamespace
    #desc 'タスク説明'
    #task :restart do #タスク定義 
        #ここにタスク処理内容を記述
    #end
  #after :finishing, 'deploy:cleanup' #task実行タイミングを指定できます。詳細は下記
  #http://capistranorb.com/documentation/getting-started/flow/
    #サンプルにunicorn再起動タスク
    desc 'Restart application'
    task :restart do
      invoke 'unicorn:restart' #lib/capustrano/tasks/unicorn.cap内処理を実行
    end
  after :finishing, 'deploy:cleanup'
end

6. 실행



실행합니다.
cap <対象環境名> deploy

그러면 대상 서버에 배포가 수행됩니다.
Capistrano는 실행하면 아래와 같은 배치가 됩니다.
railsルート
├─current #releases内最新のシンボリックリンク
├─  releases #配下に現在時刻に基づく名前のサブディレクトリが作成され最新コードがチェックアウトされる
└─  shared #リリース間で共用するファイルを置いておく

좋은 웹페이지 즐겨찾기