Help us understand the problem. What is going on with this article?

CapistranoでSCMを使わずローカルファイルをデプロイする

More than 3 years have passed since last update.

IDCF Advent Calendarの20日目の記事です:sob:

はじめに

リモートサーバで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を使うと簡単にローカルファイルをデプロイすることができます :laughing:
ネットワークに制限がある環境や、CIでビルドするアプリケーションなどでぜひ使ってみてください :sparkles:

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away