Capistrano deploy file for Thin & NginX & SCM Git

지금 프로젝트에서 사용중인 Capistrano Deploy File.

잡다한 작업은 plugin에 맡기니 일이 확실히 줄어든다. Capistrano Bells Plugin 사용.

# pty setting
default_run_options[:pty] = true

# General configuration settiongs, required for all recipes!
set :application, "#{application_name}"
role :web, "#{webserver_domain}"
role :app, "#{appserver_domain}"
role :db, "#{dbserver_domain}", :primary => true

# User Setting
set :user, "production"

# Deployment Settings
set :repository, "#{repository_location}"
set :scm, :git
set :deploy_to, "#{deploy_location}"
set :deploy_via, :remote_cache
set :config_files, %w()

# Change this to :thin if you want to use Thin instead.
set :app_server, :thin

# =============================================================
# Application Server Settings (Thin or Mongrel)
# =============================================================
set :thin_servers, 3
set :thin_port, 7007
set :thin_environment, 'production'
set :thin_address, '127.0.0.1'
set :thin_conf, "#{shared_path}/config/thin.yml"

# =============================================================
# Nginx Settings
# =============================================================
set :nginx_sites_available, "/etc/nginx/sites-available"
set :nginx_sites_enabled, "/etc/nginx/sites-enabled"

after "deploy:update_code", "db:symlink"
after "db:symlink", "attachment:symlink"

namespace :db do
  desc "Make symlink for database yaml"
  task :symlink do
    run "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml"
  end
end

namespace :attachment do
  desc "Make symlink for attachment directory"
  task :symlink do
    run "ln -nfs #{shared_path}/attachments/article_images #{release_path}/public/images/article_images"
  end
end

Posted by Kenny Thu, 24 Apr 2008 08:41:00 GMT


Capistrano 2.1

원문

생각했던 것 보다 많이 늦게 Capistrano 2.1이 출시되었습니다. (Capistrano는 여러대의 머신에서 병렬로 명령어 처리를 하기 위한 유틸리티입니다. 레일스 개발자들은 배포를 자동화하기 위해 Capistrano를 사용하고 있습니다.) 재밌을 만한 몇몇 기능을 포함해서 이번 릴리즈에는 꽤 많은 일을 해냈습니다. 언제나 처럼 RubyGems를 통해 설치해 주세요.

gem install capistrano

새로운 기능은 다음과 같습니다. (대충 중요도 순입니다.)

기본 PTY가 없습니다. 2.1이전에는, Capistrano는 각각의 명령어를 가상 터미널 장치(Pseudo-Terminal-Driver)를 통해 전달했습니다. 이 방식은 사용자의 프로필 스크립트가 실행되지 않는다는 부작용이 있었는데요, 이제는 아닙니다! 2.1부터 Capistrano는 명령어를 PTY를 통해 전달하지 않습니다. 따라서 사용자의 .profile(혹은 .bashrc 등의 개별 사용자 프로필 파일)이 정상적으로 로드됩니다. 다만, 어떤 시스템에서는 PTY가 할당되지 않았을 경우 명령어가 사용자의 입력을 받을 수 없는(non-interactive) 상황이 일어날 수 있습니다. svn이나 passwd같은 명령어가 생각했던 방식으로 동작하지 않는다면, capfile에 다음 설정을 입력하여 예전 방식을 사용하실 수 있습니다.

default_run_options[:pty] = true

sh Wrapping을 끌 수 있습니다. 어떤 호스트에서는 POSIX 셸이 Capistrano 2.0 부터 사용하는 독립적인 명렁어 실행을 할 수 없게 되어 있습니다. 그런 호스트에서 작업중이시라면 capfile에 다음 설정을 입력하면 됩니다.

default_run_options[:shell] = false

설정이 적용되면, Capistrano는 “sh -c” 명령으로 감싸는 대신 직접 명령을 실행할 겁니다. 이렇게 사용하신다면 원격지 사용자 계정의 기본 셸이 POSIX 호환이어야 합니다. 아닐경우 알수 없는 에러가 날테니까요.

Git SCM 지원. Garry Dolley, Geoffrey Grosenbach, Scott Chacon의 노력으로 Capistrano에 Git SCM 모듈이 추가되었습니다. Git를 쓰신다면, 이제 설정파일에 SCM을 Git로 지정해 줄 수 있습니다.

set :scm, :git

Accurev SCM 지원. Doug Barth의 노력으로, Accurev 사용자들도 Capistrano를 편하게 쓰실 수 있습니다. 설정파일의 SCM을 accurev로 지정하시면 됩니다.

set :scm, :accurev

레일스 플러그인을 지원합니다. 이제 capify로 생성된 Capfile에는 vender/plugins/*/recipes/*.rb를 자동 로드하는 부분이 있습니다. 이 기능이 필요하지만 이미 Capfile이 있고, 직접 수정한 부분을 잃어도 된다면 그냥 기존 Capfile을 지우고 capify명령을 다시 실행시키세요. 직접 수정한 부분이 중요하다면, “config/deploy”를 읽어오는 부분 이전에 다음 줄을 넣으시면 됩니다.

Dir['vender/plugins/*/recipes/*.rb'].each { |plugin| load(plugin) }

윈도우에서 안전한 파일 읽기. 이제 Capistrano는 파일을 읽을때마다 “b”옵션을 설정합니다. 따라서, 윈도우의 경우에도 바이너리 형식으로 정상적으로 읽을 수 있습니다.

Cap shell과 sudo. Capistrano shell은 이제 sudo 명령을 알아듣고, 정확하게 암호를 물어볼 겁니다.

의존성 확인을 위해 ‘match’를 사용. deploy:check:”match”라는 원격 의존성 확인 메소드가 추가되었습니다. 환경설정이 제대로 되어 있는지 확인하기 위해 명령어 출력 결과에 별도의 정규표현식을 적용하실 수 있습니다.

depend :remote, :match, "rake -V", /version 0\.7/

Namespaces#top. 어떤 태스크에서 다른 태스크를 실행시켜야 할 때가 있습니다. 그런데, 실행시킬 태스크의 부모 네임스페이스가 현재 네임스페이스의 이름과 유사하다면, 잘못된 작업이 실행될 수 있습니다. 이제 “top” 메소드를 이용해서, 네임스페이스 계층구조의 최상위로 접근하실 수 있습니다.

namespace :apache do
  namespace :deploy do
    task :restart do
      run "restart apache"
      top.deploy.restart
    end
  end
end

나머지 변경 사항들. 소소한 버그 수정이나 변경들도 있습니다.

  • 업로드 시에 기본 권한이 0660에서 0664로 변경되었습니다.
  • deploy:pending 태스크를 실행시켰을때 최근의 변경된 리비전을 참조하도록 해서 마지막으로 배포된 변경사항이 중복 출력되는 문제를 해결했습니다.
  • Subversion에 최근 리비전을 조회할때, “Revision” 대신 “Last Chaged Rev”를 사용합니다.
  • copy_test 시에 “stringio” 를 명시적으로 require하게 변경하였습니다.
  • Subversion#query_revision이 실패하였을시, 좀 더 도움되는 에러가 출력됩니다.
  • 실 운영 서버가 아닌 경우에는 update:revision을 실행시키지 마십시오.
  • subversion 연결시에 기본적으로 -password 옵션을 사용합니다. command-line에서 직접 암호를 보내길 원치 않는 사람들을 위해 :scmpreferprompt 변수가 추가되었습니다.
  • 예측이 가능한 sudo 작업에 대해서는 sudo -p 옵션을 사용합니다.
  • 동일 루비 프로세스에 대해 같은 작업을 해야 할때 필요한 설정들을 별도의 독립적인 설정 파일로 관리할 수 있게 하였습니다.
  • :scmauthcache 변수를 통해 subversion 접근 권한을 캐싱 할 수 있도록 하였습니다.
  • Don’t let a task trigger itself when used as the source for an “on” hook.
  • versiondir, currentdir, shared_dir 변수가 추가되어서 배포시의 디렉토리 구조를 변경할 수 있습니다.
  • deploy:restart 시에 프로세스를 실행시킬 사용자명을 :runner 변수에 추가할 수 있도록 변경되었습니다.
  • “-h” 옵션의 출력을 변경하였습니다. 이제 “-q”는 기본값이 아닙니다.

잘 사용하세요! 버그를 발견하시면 Rails trac 의 “Capistrano” 컴포넌트에 올려 주시길 부탁드립니다.

Posted by Kenny Sun, 14 Oct 2007 09:43:00 GMT