炊きたてのご飯が食べたい

定時に帰れるっていいね。自宅勤務できるっていいね。子どもと炊きたてのご飯が食べられる。アクトインディでは積極的にエンジニアを募集中です。

mac 環境の vagrant で capstrano の rails ( github ) のデプロイを試す


あるRailsプロジェクトで、 capstrano を使ってRails の本番デプロイをしているとのことだったので、勉強の為、capstranoの実行を試してみました。この記事では、capstranoを詳しく知ることではなく、capstranoを使って、ローカル環境から本番環境にソースをデプロイする方法を書いています。まずは触れてみて、これから勉強していきたいと思います。

Vagrant
Debian GNU/Linux 8
rbenv 0.4.0
ruby 2.1.0
Bundler version 1.10.6
git version 2.1.4
IP: 192.168.33.10
Mac
Vagrant 1.7.4
ワークフォルダ
ローカル環境 railsプロジェクト
~/work/blog
リモート環境 vagrant
~/vagrant/capstrano

vagrantbox から Debian の box 取ってきて、rails環境を構築。

1. vagrantbox のサイトから取ってきてDebianを設定する

2. git のインストール

vagrant@debian:~$ sudo apt-get install git-core git-doc

Debian での git のインストールは git-core git-doc なのね。sudo apt-get install git じゃない

3. rbenv , ruby-build の設定

こちらを参考にさせていただきました。 Debianでrbenvを使ってRailsの環境を作る。

4. ruby のインストール

vagrant@debian:~$ rbenv install 2.1.0

以下が必要だと怒られる。
ERROR: Ruby install aborted due to missing extensions
Try running `apt-get install -y libssl-dev libreadline-dev zlib1g-dev` to fetch missing dependencies.
sudo apt-get install -y libssl-dev libreadline-dev zlib1g-dev

改めて ruby のインストール

vagrant@debian:~$ rbenv install 2.1.0

ruby を確認すると 以下のように怒られる
vagrant@debian:~$ ruby -v
rbenv: version `system' is not installed (set by RBENV_VERSION environment variable)

globalを設定

vagrant@debian:~$ rbenv global 2.1.0
vagrant@debian:~$ ruby -v
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-linux]

5. rails環境の設定

gem install bundler
gem install rails

capstrano のインストール

Mac側の作業
ローカル環境

1. 適当な rails プロジェクトを準備して github に push

cd ~/work/
rails new blog
cd blog
rails generate scaffold article title:string text:string
mac$ rake db:migrate

動くことを確認
rails s
http://localhost:3000/article

github に push

mac$ git init
mac$ git add .
mac$ git commit -m "first commit"
mac$ git remote add origin git@github.com:takanamishi/blog.git
mac$ git push -u origin master

2. railsプロジェクトに capstrano 用の gem を記述

blog の Gemfile に以下の3行を追加

gem 'capistrano'
gem 'capistrano-rails'
# vagrant環境でbundlerを使っている為
gem 'capistrano-bundler'

bundle install を実行してインストールする

簡単なコマンドを実行する capstrano を試してみる

1. Capstrano の設定ファイルの作成

mac$ cap install
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
mac$ 

2. Capstrano が正しく動作するか確認する

Capstrano では、リモート環境にログインして処理を行うため、ssh vagrant@192.168.33.10 でパスワードなしでログインできるように鍵を設定します。ローカルのVM環境なので、 MAC で使っている github 用の鍵を使い回すことにします。

mac$ cp ~/.ssh/id_rsa.pub ~/vagrant/capstrano/
mac$ vagrant ssh

vagrant@debian:~$ mv /vagrant/id_rsa.pub ~/.ssh/
vagrant@debian:~$ cd ~/.ssh/
vagrant@debian:~/.ssh$ ls -l
total 8
-rw------- 1 vagrant vagrant 389 Nov 12 02:16 authorized_keys
-rw-r--r-- 1 vagrant vagrant 402 Nov 12 02:21 id_rsa.pub

vagrant@debian:~/.ssh$ cat id_rsa.pub >> authorized_keys 
vagrant@debian:~/.ssh$ rm id_rsa.pub 
vagrant@debian:~/.ssh$ exit

mac$ ssh -i ~/.ssh/id_rsa vagrant@192.168.33.10
vagrant@debian:~$ 

3. config/deploy/production.rb を編集する

The server-based syntax can be used to override options: のエリアのコメントアウトは外し、以下のように編集

server '192.168.33.10',
  user: 'vagrant',
  roles: %w{web app},
  ssh_options: {
    user: 'vagrant', # overrides user setting above
    keys: %w(~/.ssh/id_rsa),
    forward_agent: false,
    auth_methods: %w(publickey)
    # password: 'please use keys'
  }

config/deploy.rb のバックアップと取って、 deploy.rb を以下の内容にする

cp config/deploy.rb.bak config/deploy.rb.org
task :list do
    on roles(:app), in: :sequence do
        execute "ls -la"
    end
end

cap production list を実行して以下のように ls の結果が出れば、リモート環境にログインして、処理が行えていることを確認することができます。

mac$ cap production list
INFO [8981708f] Running /usr/bin/env ls -la as vagrant@192.168.33.10
DEBUG [8981708f] Command: ls -la
DEBUG [8981708f]  total 40
DEBUG [8981708f]  drwxr-xr-x  5 vagrant vagrant 4096 Nov 12 03:06 .
DEBUG [8981708f]  drwxr-xr-x  3 root    root    4096 Jul  3 10:30 ..
DEBUG [8981708f]  -rw-------  1 vagrant vagrant  924 Nov 12 03:34 .bash_history
DEBUG [8981708f]  -rw-r--r--  1 vagrant vagrant  220 Jul  3 10:30 .bash_logout
DEBUG [8981708f]  -rw-r--r--  1 vagrant vagrant   60 Nov 12 02:34 .bash_profile
DEBUG [8981708f]  -rw-r--r--  1 vagrant vagrant 3515 Jul  3 10:30 .bashrc
DEBUG [8981708f]  drwxr-xr-x  3 vagrant vagrant 4096 Nov 12 03:06 .gem
DEBUG [8981708f]  -rw-r--r--  1 vagrant vagrant  675 Jul  3 10:30 .profile
DEBUG [8981708f]  drwxr-xr-x 12 vagrant vagrant 4096 Nov 12 03:02 .rbenv
DEBUG [8981708f]  drwx------  2 vagrant vagrant 4096 Nov 12 02:23 .ssh
INFO [8981708f] Finished in 2.571 seconds with exit status 0 (successful).
mac$ 

github のソースをもとにデプロイされることを確認する

MAC
ローカル環境

github からソースを持ってくるので、ローカルで使っている鍵をコピーする

mac$ cp ~/.ssh/id_rsa ~/vagrant/capstrano/
mac$ cd ~/vagrant/capstrano/
mac$ vagrant ssh
vagrant@debian:~$ mv /vagrant/id_rsa ~/.ssh/
vagrant@debian:~$ exit
mac$ 

(本当は鍵を作って、githubに登録した方がいいですね)

Capstrano の設定ファイルを編集する

  • 先ほどテストで作った deploy.rb を削除し、デフォルトの deploy.rb に戻して編集
  • Capfile に最低限の変更を加える
# config valid only for current version of Capistrano
lock '3.4.0'

set :application, 'blog'
set :repo_url, 'git@github.com:takanamishi/blog.git'

# Default branch is :master
# ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp

# Default deploy_to directory is /var/www/my_app_name
set :deploy_to, '/home/vagrant/projects/blog'

# Default value for :scm is :git
set :scm, :git

# Default value for :format is :pretty
# set :format, :pretty

# Default value for :log_level is :debug
# set :log_level, :debug

# Default value for :pty is false
# set :pty, true

# Default value for :linked_files is []
# set :linked_files, fetch(:linked_files, []).push('config/database.yml', 'config/secrets.yml')

# Default value for linked_dirs is []
# set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system')

# Default value for default_env is {}
# set :default_env, { path: "/opt/ruby/bin:$PATH" }

# Default value for keep_releases is 5
# set :keep_releases, 5

namespace :deploy do

  after :restart, :clear_cache do
    on roles(:web), in: :groups, limit: 3, wait: 10 do
      # Here we can do anything such as:
      # within release_path do
      #   execute :rake, 'cache:clear'
      # end
    end
  end

end

Capfile の中身(必要あれば)

Capistano の実行

mac$ cap production deploy

ソースが配置されているかリモート環境に入って確認する

vagrant@debian:~$ ls -la projects/blog/
total 24
drwxr-xr-x 5 vagrant vagrant 4096 Nov 12 05:22 .
drwxr-xr-x 3 vagrant vagrant 4096 Nov 12 05:22 ..
lrwxrwxrwx 1 vagrant vagrant   51 Nov 12 05:22 current -> /home/vagrant/projects/blog/releases/20151112042229
drwxr-xr-x 3 vagrant vagrant 4096 Nov 12 05:22 releases
drwxr-xr-x 7 vagrant vagrant 4096 Nov 12 05:22 repo
-rw-r--r-- 1 vagrant vagrant   74 Nov 12 05:22 revisions.log
drwxr-xr-x 2 vagrant vagrant 4096 Nov 12 05:22 shared

railsプロジェクトが動くか確認

vagrant@debian:~$ cd ~/projects/blog/current
vagrant@debian:~/projects/blog/current$ rails s -b 0.0.0.0

以下怒られる
Could not find rake-10.4.2 in any of the sources
Run `bundle install` to install missing gems.
vagrant@debian:~/projects/blog/current$ bundle install

bundle install をしろとのことなので、bundle installを実行。が、以下怒られる

An error occurred while installing sqlite3 (1.3.11), and Bundler cannot continue.
Make sure that `gem install sqlite3 -v '1.3.11'` succeeds before bundling.

sqlite3 が必要なので、sqlite3をインストールする

vagrant@debian:~/projects/blog/current$ sudo aptitude install libsqlite3-dev

sudo aptitude install sqlite3 ではないんですね。再度 rails s -b 0.0.0.0 でサイトが立ちがることを確認。が、以下怒られる。

/home/vagrant/.rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/execjs-2.6.0/lib/execjs/runtimes.rb:48:in `autodetect': Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)

rails server 時に `autodetect': Could not find a JavaScript runtime が出たら。

これで、githubにあるコードをリモート環境に設置するところまで完了しました。

nginx を入れ、rails s しなくてもサイトが確認できるようにする

vagrant@debian:~/projects/blog/current$ sudo aptitude install nginx

お任せrubyunicornとnginxをセットアップする

現在やり方調査中

参考にさせていただいたサイト

全体的に参考に http://qiita.com/ea54595/items/12ab7b3a8213b35cca10

Capistranoのテストに http://qiita.com/mosson/items/1a4cfd01cb538f2d8f0e