Capistrano에서 SCM을 사용하지 않고 로컬 파일 배포

6989 단어 capistrano3Capistrano
IDCF Advent Calendar의 20 일째 기사입니다

소개



리모트 서버로 Git를 사용할 수 없는 상황이라든지, CI 로컬로 빌드해 Git에는 커밋 하지 않는 때라든지, Capistrano로 로컬의 파일을 SCM 사용하지 않고 배포하고 싶을 때는 상당히 있지요.
Capistrano 3에서 SCM을 사용하지 않고 로컬 파일을 배포하는 정보는별로 없는 것 같아서 소개합니다.

capistrano-scm-copy



물론 스스로 가리가리 태스크를 쓰면 실현할 수 있습니다만, capistrano-scm-copy 라고 하는 Gem을 사용하면 매우 간단하게 실현할 수 있습니다.
CI 서비스Wercker가 내고 있는 Gem입니다.

capistrano-scm-copy를 사용하면 Capistrano 2 deploy_via :copy처럼 보일 수 있습니다.

로컬로 tararchive.tar.gz 라고 하는 파일을 작성해, 그것을 리모트 서버에 Upload 해 릴리스 패스에 전개하는 단순한 구조입니다.

사용법





이번에 배포하는 앱은 기본적인 Ruby 애플리케이션을 생각하지만 Ruby가 아닌 프로젝트에서도 기본은 동일합니다.
다음과 같은 디렉토리 구성이 있습니다.
$ tree . -L 2
├── Gemfile
├── Gemfile.lock
├── bin
│   └── example
└── lib
    └── example.rb

Capistrano 설정



Gemfile에 Capistrano의 Gem을 추가합니다.

Gemfile
group :development, :test do
  gem "capistrano"
  gem "capistrano-scm-copy"
end
bnndle install Capistrano 초기화를 수행합니다.
$ bundle install
$ bundle exec cap install STAGES=staging,production
mkdir -p config/deploy
create config/deploy.rb
create config/deploy/staging.rb
create config/deploy/production.rb
mkdir -p lib/capistrano/tasks
create Capfile
Capified
Capfilerequire 'capistrano/copy'를 추가합니다.

Capfile
# Load DSL and set up stages
require 'capistrano/setup'

# Include default deployment tasks
require 'capistrano/deploy'
require 'capistrano/copy'

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

새 디렉토리 구성



설치 후 디렉토리 구성은 다음과 같습니다.
숨겨진 파일도 표시됩니다.
$ tree . -a -L 2
.
├── .bundle
│   └── config
├── .gitignore
├── .vagrant
│   └── machines
├── Capfile
├── Gemfile
├── Gemfile.lock
├── Vagrantfile
├── bin
│   └── example
├── config
│   ├── deploy
│   └── deploy.rb
└── lib
    ├── capistrano
    └── example.rb

11 directories, 11 files

config/deploy.rb


config/deploy.rb에 배포 설정을 작성합니다.

config/deploy.rb
# config valid only for current version of Capistrano
lock '3.4.0'

set :application, "example"
set :deploy_to, "~/example"
set :keep_releases, 5
set :log_level, :info

set :bundle_without, %i(development test)

# capistrano-scm-copyの設定
set :scm, :copy

옵션도 몇 가지 있습니다.
  • exclude_dir : 배포하지 않을 파일과 디렉터리를 지정할 수 있습니다
  • include_dir : 배포할 파일과 디렉터리를 지정할 수 있습니다. 기본적으로 *이므로 모든 파일이 배포됩니다
  • .
  • tar_verbose : tar 명령의 중간 경과를 출력하는 옵션입니다.

  • config/deploy/production.rb



    이 샘플에서는 Vagrant로 만든 VM에 배포하는 설정을 작성했습니다.
    적당히 읽어 주세요.

    config/deploy/production.rb
    role :server, %w(127.0.0.1)
    set(
      :ssh_options,
      port: 2222,
      auth_methods: %w(publickey),
      keys: [File.expand_path("../../../.vagrant/machines/default/virtualbox/private_key", __FILE__)],
      user: "vagrant"
    )
    

    배포



    배포는 매우 간단하며 평소와 같이 명령을 실행하기 만하면됩니다.
    bundle exec cap production deploy
    

    이번 샘플이라면 배포 전에 Vagrant의 기동이 필요합니다.
    vagrant up
    

    결론



    이번에 사용한 파일은 GitHub에 있습니다.

    따라서 capistrano-scm-copy를 사용하면 로컬 파일을 쉽게 배포 할 수 있습니다
    네트워크에 제한이 있는 환경이나 CI로 빌드하는 애플리케이션 등에서 꼭 사용해 보세요

    좋은 웹페이지 즐겨찾기