RailsにCapistranoによる自動デプロイの導入
RailsにCapistranoによる自動デプロイを導入する方法を記事にしてみました。
Gemfileの追記
Gemfileに下記を追加し、
1 2 3 | gem 'capistrano' gem 'capistrano-rails' gem 'capistrano-bundler' |
bunlde installを実行します。
configファイルの生成
capistranoのconfigファイルの初期化を行います。
1 | cap install |
下記ファイルが作成されます。
1 2 3 4 5 6 7 | 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 |
何も設定せずに実行すると、
config/deploy/staging.rb
config/deploy/production.rb
staging、productionといったような環境ごとの設定ファイルが生成されますが、
1 | cap install STAGES=development,vagrant,localhost |
などように、環境を指定することも可能です。
Capfileの設定
初期状態では下図のようになっているので、使用するものをコメントアウトになっている部分を外します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | # Load DSL and set up stages require "capistrano/setup" # Include default deployment tasks require "capistrano/deploy" # Include tasks from other gems included in your Gemfile # # For documentation on these, see for example: # # https://github.com/capistrano/rvm # https://github.com/capistrano/rbenv # https://github.com/capistrano/chruby # https://github.com/capistrano/bundler # https://github.com/capistrano/rails # https://github.com/capistrano/passenger # # require 'capistrano/rvm' # require 'capistrano/rbenv' # require 'capistrano/chruby' # require 'capistrano/bundler' # require 'capistrano/rails/assets' # require 'capistrano/rails/migrations' # require 'capistrano/passenger' # Load custom tasks from `lib/capistrano/tasks` if you have any defined Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r } |
rbenvなどを使用している場合やbundle installも自動実行する場合は、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | # Load DSL and set up stages require "capistrano/setup" # Include default deployment tasks require "capistrano/deploy" set :rbenv_type, :system set :rbenv_ruby, '2.3.0' # Include tasks from other gems included in your Gemfile # # For documentation on these, see for example: # # https://github.com/capistrano/rvm # https://github.com/capistrano/rbenv # https://github.com/capistrano/chruby # https://github.com/capistrano/bundler # https://github.com/capistrano/rails # https://github.com/capistrano/passenger # # require 'capistrano/rvm' require 'capistrano/rbenv' # require 'capistrano/chruby' require 'capistrano/bundler' require 'capistrano/rails/assets' require 'capistrano/rails/migrations' require 'capistrano/passenger' # Load custom tasks from `lib/capistrano/tasks` if you have any defined Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r } |
のような設定になります。
環境ごとの設定ファイル
Railsのstagingやproductionといった環境設定ごとにデプロイの設定ファイルが下記にて設定できるので、設定していきます。
1 2 | config/deploy/staging.rb config/deploy/production.rb |
例えば、config/deploy/staging.rbはデフォルトでは下記のようになっており、それぞれの環境に見合った設定を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | # server-based syntax # ====================== # Defines a single server with a list of roles and multiple properties. # You can define all roles on a single server, or split them: # server 'example.com', user: 'deploy', roles: %w{app db web}, my_property: :my_value # server 'example.com', user: 'deploy', roles: %w{app web}, other_property: :other_value # server 'db.example.com', user: 'deploy', roles: %w{db} # role-based syntax # ================== # Defines a role with one or multiple servers. The primary server in each # group is considered to be the first unless any hosts have the primary # property set. Specify the username and a domain or IP for the server. # Don't use `:all`, it's a meta role. # role :app, %w{deploy@example.com}, my_property: :my_value # role :web, %w{user1@primary.com user2@additional.com}, other_property: :other_value # role :db, %w{deploy@example.com} # Configuration # ============= # You can set any configuration variable like in config/deploy.rb # These variables are then only loaded and set in this stage. # For available Capistrano configuration variables see the documentation page. # http://capistranorb.com/documentation/getting-started/configuration/ # Feel free to add new variables to customise your setup. # Custom SSH Options # ================== # You may pass any option but keep in mind that net/ssh understands a # limited set of options, consult the Net::SSH documentation. # http://net-ssh.github.io/net-ssh/classes/Net/SSH.html#method-c-start # # Global options # -------------- # set :ssh_options, { # keys: %w(/home/rlisowski/.ssh/id_rsa), # forward_agent: false, # auth_methods: %w(password) # } # # The server-based syntax can be used to override options: # ------------------------------------ # server 'example.com', # user: 'user_name', # roles: %w{web app}, # ssh_options: { # user: 'user_name', # overrides user setting above # keys: %w(/home/user_name/.ssh/id_rsa), # forward_agent: false, # auth_methods: %w(publickey password) # # password: 'please use keys' # } |
deploy.rbの編集
gitのリポジトリやブランチ、デプロイ先の設定をします。
デフォルトでは下記のようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | # cat config/deploy.rb # config valid only for current version of Capistrano lock '3.6.1' set :application, 'my_app_name' set :repo_url, 'git@example.com:me/my_repo.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, '/var/www/my_app_name' # Default value for :scm is :git # set :scm, :git # Default value for :format is :airbrussh. # set :format, :airbrussh # You can configure the Airbrussh format using :format_options. # These are the defaults. # set :format_options, command_output: true, log_file: 'log/capistrano.log', color: :auto, truncate: :auto # Default value for :pty is false # set :pty, true # Default value for :linked_files is [] # append :linked_files, 'config/database.yml', 'config/secrets.yml' # Default value for linked_dirs is [] # append :linked_dirs, 'log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', '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 |
passengerを使用している場合は、
1 | set :passenger_restart_with_touch, true |
などを設定します。
デプロイ
以上の編集が終われば、デプロイの準備はほぼ完了です。
例えば、ステージング環境にデプロイしたいという場合は、
1 | cap staging deploy |
を実行すれば、設定した環境にデプロイされます。
参考
A remote server automation and deployment tool written in Ruby.
GitHub – capistrano/capistrano: Remote multi-server automation tool
Author Profile
スターフィールド編集部
SHARE