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
みたいなことができます。
ローカルでtar
でarchive.tar.gz
というファイルを作成し、それをリモートサーバにUploadしてリリースパスに展開するというシンプルな仕組みです。
使い方
アプリ
今回デプロイするアプリは基本的なRubyアプリケーションを考えますが、Rubyじゃないプロジェクトでも基本は同じです。
次のようなディレクトリ構成になっています。
$ tree . -L 2
├── Gemfile
├── Gemfile.lock
├── bin
│ └── example
└── lib
└── example.rb
Capistranoセットアップ
GemfileにCapistranoのGemを追加します。
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
Capfile
にrequire 'capistrano/copy'
を追加します。
# 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 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にデプロイする設定を書いています。
適当に読み替えてください。
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でビルドするアプリケーションなどでぜひ使ってみてください