Capistrano を使用して Ruby On Rails アプリケーションのデプロイを自動化する方法

導入


すでに同じ退屈なタスクを繰り返してアプリケーションサーバーを更新してプロジェクトをオンラインにすることにうんざりしていない場合、おそらく最終的にうんざりするでしょう。プロジェクトを開発する際に感じる喜びは、システム管理の退屈な部分(たとえば、コードベースのアップロード、構成の修正、何度もコマンドを実行するなど)になる傾向があります。

しかし、心配しないでください!タスク自動化ツールであるCapistranoが助けに来ています。

このDigitalOceanの記事では、最新バージョンのCentOSを実行して、NginxとPassengerを使用してRuby-on-Railsアプリケーションをホストするための堅牢なサーバーセットアップを作成します。そして、Rubyベースの自動化ツールCapistranoを使用して、展開と更新のプロセスを自動化する方法を学習します。

注意: この記事は、過去の Capistrano 記事での知識に基づいています:Capistrano を使ったデプロイの自動化: 入門。このツールを使用する予定の場合は、この記事を続ける前にそれを読むことを強くお勧めします。同様に、Passenger(および Nginx)を使用した Rails ベースのアプリケーションのデプロイのための新しいドロップレットの準備について詳しく学びたい場合は、Passenger と Nginx を使用した Rails アプリのデプロイ方法記事をご覧ください。

注意: Capistrano はデプロイメントに Git を依存しています。詳細については、デジタルオーシャンのコミュニティ記事をこちらでクリックして読んでみてください。

用語集


1. デプロイメントサーバーの準備


  1. オペレーティングシステムの更新と準備
  2. Ruby 環境と Rails のセットアップ
  3. アプリケーションと HTTP サーバーのダウンロードとインストール
  4. Nginx管理スクリプトの作成
  5. アプリケーション展開のためのNginxの設定
  6. Capistranoのダウンロードとインストール
  7. 展開用のシステムユーザーの作成

2. GitベースのCapistrano展開のためのRailsアプリケーションの準備


  1. 基本的なRuby-On-Railsアプリケーションの作成
  2. Gitリポジトリの作成

3. Capistranoを使用した展開の自動化


  1. プロジェクトディレクトリ内にCapistranoのインストール
  2. プロジェクトディレクトリ内のconfig/deploy.rbの操作
  3. プロジェクトディレクトリ内のconfig/deploy/production.rbの操作
  4. 本番サーバーへの展開

展開サーバーの準備


注意: 以下のセクションをより良く理解するために、主題に関するフル記事をチェックしてください:PassengerとNginxを使用してRailsアプリをデプロイする方法

オペレーティングシステムの更新と準備


次のコマンドを実行して、CentOSベースのドロップレットのデフォルトツールを更新します:

yum -y update

次のコマンドを実行して、開発ツールが含まれるバンドルをインストールします:

yum groupinstall -y 'development tools'

このチュートリアルで必要ないくつかのパッケージ(例: libyaml-devel、nginxなど)は、公式のCentOSリポジトリにはありません

EPELリポジトリを追加するには、次のコマンドを実行してください:

sudo su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm'

yum -y update

最後に、追加のライブラリとツールをインストールするために、次のコマンドを実行してください:

yum install -y curl-devel nano sqlite-devel libyaml-devel

Ruby環境とRailsの設定


注意: このセクションは、当社の専用記事 CentOS 6.5にRuby 2.1.0をインストールする方法 の要約です。

以下の2つのコマンドを実行して、RVMをインストールし、Rubyのシステム環境を作成します:

curl -L get.rvm.io | bash -s stable

source /etc/profile.d/rvm.sh
rvm reload
rvm install 2.1.0

RailsにはJavaScriptインタプリターが必要なので、Node.jsもセットアップする必要があります。

次のコマンドを実行して、yumを使用してnodejsをダウンロードし、インストールします:

yum install -y nodejs

RubyGemsのgemを使用して、次のコマンドを実行してrailsをダウンロードし、インストールします:

gem install bundler rails

アプリケーションおよびHTTPサーバーのダウンロードとインストール


注意: VPSのRAMが1 GB未満の場合は、一時的なデータ保持領域(RAMの代替)として使用するSWAPディスクスペースを準備するために、以下の簡単な手順を実行する必要があります。DigitalOceanサーバーは高速SSDディスクが付属しているため、サーバーアプリケーションのインストールタスクを実行する際には実際には問題になりません。

# 1024 MBのSWAPスペースを作成
sudo dd if=/dev/zero of=/swap bs=1M count=1024
sudo mkswap /swap
sudo swapon /swap

Phusion Passenger


Red Hat LinuxのデフォルトのパッケージマネージャーRPM(RPM Package Manager)は、.rpmファイルに含まれるアプリケーションを配信します。残念ながら、Passengerの場合、これらはかなり古くなっています。そのため、Passengerの最新バージョンであるバージョン4をダウンロードし、インストールするために、再びRubyGemを使用します。

以下のコマンドを使用して、簡単にPassengerをダウンロードしてインストールします:

gem install passenger

Nginx


注意:通常、Nginxをダウンロードしてインストールするには、EPELリポジトリを追加して(すでに行っています)yum経由でNginxを取得します。ただし、NginxをPassengerと共に使用するためには、必要なモジュールを備えたソースをコンパイルする必要があります。

ネイティブのPassengerモジュールでNginxをコンパイルするには、次のコマンドを実行します:

passenger-install-nginx-module

コマンドを実行したら、Enterキーを押して言語(今回はRuby)を選択し、矢印キーとスペースバーを使用して必要に応じてRubyのみを選択できます。

Use <space> to select.
If the menu doesn't display correctly, ensure that your terminal supports UTF-8.

 ‣ ⬢  Ruby
   ⬢  Python
   ⬢  Node.js
   ⬡  Meteor

次に、Item 1を選択してEnterキーを押します:

1. Yes: download, compile and install Nginx for me. (recommended)
    The easiest way to get started. A stock Nginx 1.4.4 with Passenger
    support, but with no other additional third party modules, will be
    installed for you to a directory of your choice.

これで、Nginxのソースがダウンロードされ、コンパイルされ、Passengerのサポートを含めてインストールされます。

注意:この操作には少し時間がかかる場合があります。おそらく、期待しているよりも長い時間がかかるかもしれません。

Nginx管理スクリプトの作成


Nginxをコンパイルした後、簡単に制御するために、シンプルな管理スクリプトを作成する必要があります。

以下のコマンドを実行して、スクリプトを作成します:

nano /etc/rc.d/init.d/nginx

以下の内容をコピーして貼り付けます:

#!/bin/sh
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
[ "$NETWORKING" = "no" ] && exit 0

nginx="/opt/nginx/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"

lockfile=/var/lock/subsys/nginx

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    start
}

reload() {
    configtest || return $?
    echo -n $”Reloading $prog: ”
    killproc $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
    $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac

CTRL+X を押し、Y で保存して終了を確認します。

この管理スクリプトのモードを実行可能に設定します:

chmod +x /etc/rc.d/init.d/nginx

アプリケーションデプロイメントのための Nginx の設定


サーバーの設定の最終段階では、Nginx サーバーブロックを作成する必要があります。これはおおよそ Apache のバーチャルホストに相当します。

おそらく Passenger の Nginx インストール中に見たかもしれませんが、この手順は Nginx の設定ファイル nginx.conf にコードブロックを追加することで構成されます。デフォルトでは、指定がない限り、このファイルは /opt/nginx/conf/nginx.conf の下にあります。

この設定ファイルをテキストエディタ nano で編集するために、以下のコマンドを入力してください:

nano /opt/nginx/conf/nginx.conf

最初のステップとして、http { ノードを検索し、passenger_root および passenger_ruby ディレクティブの直後に以下を追加します:

# 開発目的のみに使用します。
# 実際のアプリケーションをアップロードするときには、この行を削除してください。
# * テスト * 用途のみ。
passenger_app_env development;    

ファイルをスクロールして server { .. を見つけます。デフォルトの場所、つまり:

..

#    location / {
#            root   html;
#            index  index.html index.htm;
#        }

..

をコメントアウトし、デフォルトのアプリケーションルートを定義します:

# アプリケーションを展開するフォルダーを設定します。
# 使用しているのは:/home/deployer/apps/my_app
root              /home/deployer/apps/my_app/public;
passenger_enabled on;

CTRL+Xを押して、Yで保存して終了してください。

次のコマンドを実行して、新しいアプリケーション設定でNginxをリロードします:

# !! Nginx管理スクリプトを作成することを忘れないでください
#    CentOS用のメインのRails展開記事に従って
#    このセクションの冒頭にリンクされています。

/etc/init.d/nginx restart

Nginxの状態を確認するには、次を使用できます:

/etc/init.d/nginx status

注意: Nginxについて詳しくは、VPS上でNginx Webサーバーを構成する方法を参照してください。

Capistranoのダウンロードとインストール


システムが準備できたら、RubyGemsのおかげでCapistranoの最新バージョンを手に入れるのは簡単です。

次のコマンドを使用して、Capistranoのバージョン3を取得できます:

gem install capistrano

展開用のシステムユーザーの作成


このステップでは、デプロイメントのアクションを実行するためのCentOSシステムユーザーを作成します。これは、Capistranoが使用するユーザーになります。

注意:シンプルにするために、必要な権限を持つdeployerユーザーを作成します。より完全なセットアップを行うには、Capistranoの導入チュートリアルのgroupsの例を使用してください。

新しいシステムユーザーdeployerを作成します:

adduser deployer

deployerのパスワードを設定します:

passwd deployer

# パスワードを入力
# パスワードを確認

テキストエディタnanoを使用して/etc/sudoersを編集します:

nano /etc/sudoers

ファイルをスクロールして、rootが定義されている場所を見つけます:

..

## COMMANDSセクションには他のオプションが追加されている可能性があります。
##
## rootにどこでも任意のコマンドを実行することを許可します。
root    ALL=(ALL)	ALL

..

次の行をroot ALL=(ALL) ALLの直後に追加します:

deployer ALL=(ALL) ALL

この/etc/sudoersファイルのセクションは、次のようになります:

..

## COMMANDSセクションには他のオプションが追加されている可能性があります。
##
## rootにどこでも任意のコマンドを実行することを許可します。
root     ALL=(ALL)	ALL
deployer ALL=(ALL) ALL

..

CTRL+Xを押してYで保存して終了します。

GitベースのCapistranoデプロイメント用のRailsアプリケーションの準備


システムが準備され、必要なアプリケーションが設定され、正しく動作している場合、サンプルとして使用する優れたRailsアプリケーションを作成できます。

第2段階では、Gitリポジトリを作成し、コードベースを中央のアクセス可能な場所にプッシュし、Capistranoがデプロイに使用するGithubに配置します。

注意:ここでは、サンプルアプリケーションを作成しています。実際のデプロイでは、これらのアクションをバックアップ済みであることを確認した後に、独自に実行する必要があります。念のため!また、Capistranoをアプリケーションを展開するサーバーとは異なる場所から実行する必要があることに注意してください。

基本的なRuby-On-Railsアプリケーションの作成


注意:以下の手順は、Capistranoを試すための代替Railsアプリケーションを作成するためのものです。

RubyとRailsがすでにインストールされている場合、開始するための単一のコマンドが残されています。

次のコマンドを実行して、Railsにmy_appという名前の新しいアプリケーションを作成します:

# サンプルRailsアプリケーションを作成
rails new my_app

# アプリケーションディレクトリに移動
cd my_app

# サンプルリソースを作成
rails generate scaffold Task title:string note:text

# サンプルデータベースを作成
RAILS_ENV=development rake db:migrate

アプリケーションが正しく設定され、すべてが正常に動作していることをテストするには、アプリケーションディレクトリに移動してrails sを使用してシンプルなサーバーを実行します:

# アプリケーションディレクトリに移動
cd my_app

# シンプルなサーバーを実行
rails s

# これで、
# 訪問してアクセスできるはずです:http://[あなたのドロップレットのIP]:3000

# サーバープロセスを終了するには、
# CTRL+Cを押します

Gitリポジトリの作成


注意: Gitの使用方法について詳しくは、DigitalOceanのコミュニティページにあるGitの効果的な使用方法チュートリアルを参照してください。

注意: このセクションに従うには、Githubアカウントが必要です。 代わりに、独自のGitリポジトリをホストするためにドロップレットを設定することもできます。 その場合は、デプロイメントファイルで関連するURLを使用してください。これ DigitalOceanの記事に従います。 もし選択するならば。

私たちは、ソースリポジトリを作成するためのGithubから提供されたサンプルの手順を使用します。

リポジトリを初期化するために、my_appディレクトリ内で以下の説明に従うコマンドを実行します:

#!! これらのコマンドは
 # で実行する必要があります。開発マシンから
 # デプロイ先のサーバーに。
 # 選択したオペレーティングシステムによって
 # 手順が若干異なる場合があります。
#
 # アプリケーションの正しいパスを設定してください
 # それ以外の場合、Nginxがそれを見つけることができない場合があります。

 # リポジトリを初期化する
git init

 # すべてのファイルをリポジトリに追加
git add .

 # 変更をコミットする
git commit -m "first commit"

 # Githubリポジトリのリンクを追加 
 # 例:git remote add origin [email protected]:[ユーザー名]/ [プロジェクト名] .git
git remote add origin [email protected]:user123/my_app.git

 # RSA / SSHキーを作成する
 # 画面の指示に従ってください
ssh-keygen -t rsa

 # キーの内容を表示して、それをGithubに追加します
 # 現在のリモートセッションからコピーして貼り付けることで
 # 訪問:https://github.com/settings/ssh
 # プロセスの詳細については、
 # 訪問:https://help.github.com/articles/generating-ssh-keys
cat /root/.ssh/id_rsa.pub

 # Github情報を設定する
# Username:
 # 使用法:git config --global user.name "[あなたのユーザー名]"
git config --global user.name "user123"

# Email:
 # 使用法:git config --global user.email "[あなたのメール]"
git config --global user.email "[email protected]"

 # プロジェクトのソースコードをGithubアカウントにプッシュします
git push -u origin master

Capistranoを使用してデプロイを自動化する方法


最初のCapistranoの記事からおぼえているかもしれませんが、ライブラリを使用する方法は、プロジェクトディレクトリ内にそれをインストールすることです。このセクションでは、それを行う方法と、サーバーを設定するために必要なファイルを作成する方法を見ていきます。

プロジェクトディレクトリ内でCapistranoをインストールする


当社の記事のさらに簡単なステップは、Capistranoファイルをインストールすることです。以下のコマンドを実行すると、ツールがデプロイに使用するいくつかのディレクトリとファイルが枠組みになります。

次のコマンドを実行して、Capistranoファイルを初期化します(すなわち、インストールします):

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
# Capified

プロジェクトディレクトリ内のconfig/deploy.rbとの作業


ファイルdeploy.rbには、デプロイメントサーバーに関連する引数や設定が含まれています。ここでは、Capistranoにどのサーバーに接続してデプロイするか、およびどのように行うかを指示します。

注意: ファイルを編集する(または構成を定義する)際に、それらをコメントアウトするか、新しい行を追加するかできます。追加している設定が上書きされないように、例の設定を持っていないことを確認してください。

nano config/deploy.rb

以下のブロックのコードを追加し、独自の設定に合わせて修正してください:

# アプリケーションの名前を定義します
set :application, 'my_app'

# Capistranoがソースリポジトリにアクセスできる場所を定義します
# set :repo_url, 'https://github.com/[ユーザー名]/[アプリケーション名].git'
set :scm, :git
set :repo_url, 'https://github.com/user123/my_app.git'

# アプリケーションコードを配置する場所を定義します
set :deploy_to, "/home/deployer/apps/my_app"

set :pty, true

set :format, :pretty

# デプロイ後の手順をここに設定します。
# デプロイが完了すると、Capistrano
# が記述されているように手順を実行し始めます。
# タスクの作成についての詳細は、
# を確認してください:
# http://capistranorb.com/

# namespace: deploy do

#   desc 'アプリケーションを再起動します'
#   task :restart do
#     on roles(:app), in: :sequence, wait: 5 do
#       # 例えば、ここに再起動のメカニズムを記述します:
#       execute :touch, release_path.join('tmp/restart.txt')
#     end
#   end

#   after :publishing, :restart

#   after :restart, :clear_cache do
#     on roles(:web), in: :groups, limit: 3, wait: 10 do
#       # ここでは、次のようなことができます:
#       # within release_path do
#       #   execute :rake, 'cache:clear'
#       # end
#     end
#   end

# end

CTRL+X を押して、Y で保存して終了します。

プロジェクトディレクトリ内の config/deploy/production.rb で作業する


注意: deploy.rb と同様に、production.rb ファイルにいくつかの変更を加える必要があります。以下のブロックを追記する代わりにコードを修正する方が良いでしょう。

次のコマンドを実行して、nano テキストエディタでファイルを編集します:

nano config/deploy/production.rb

以下のように、サーバーの設定を入力してください:

# デプロイメントサーバーの役割、ユーザー、およびIPアドレスを定義します
# role :name, %{[user]@[IP adde.]}
role :app, %w{[email protected]}
role :web, %w{[email protected]}
role :db,  %w{[email protected]}

# サーバーを定義します
server '162.243.74.190', user: 'deployer', roles: %w{web}

# SSHオプション
# さらなるオプションについては、ファイル内のコメントアウトされた例を参照してください
# さらなるオプションについては、ファイル内のコメントアウトされた例を参照してください
set :ssh_options, {
    forward_agent: false,
    auth_methods: %w(password),
    password: 'user_deployers_password',
    user: 'deployer',
}

CTRL+X を押して Y で保存して終了してください。

本番サーバーにデプロイする


設定が完了したら、デプロイの準備が整いました。

開発マシンで以下のコードを実行して、本番サーバーにデプロイします。上記のファイルで定義されているように、Capistrano は以下の操作を行います:

  • デプロイメントサーバーに接続します

  • アプリケーションのソースをダウンロードします

  • デプロイメントアクションを実行します(つまり、パッセンジャーを再起動します)

cap production deploy

Capistranoの詳細やその機能については、Capistranoのドキュメントを参照してください。

<div class=“author”>提供者:<a href=“https://twitter.com/ostezer”>O.S. Tezer</a></div>

Source:
https://www.digitalocean.com/community/tutorials/how-to-automate-ruby-on-rails-application-deployments-using-capistrano