初心者プログラマのひとり勉強部屋

若葉マークのプログラマー☺️

【ruby on rails AWSデプロイ】Capistranoでの自動デプロイとcapタスク作成

前回でrailsの手動でのデプロイの設定が終わりましたので、今回はCapistranoを用いた自動デプロイを備忘録します。

※これまでの点も色々と抜けている点があるとも思いますが、追記していきます。

 

 

AWSの無料枠

・EC2の解放(AWSの登録は省略します)

Linuxサーバの設定

アプリケーションサーバUnicorn設定

・webサーバNginx設定

------------

・【自動デプロイ】capistrano設定 ←今回はここ

・IAMユーザの登録

・S3(ストレージ)の設定

 

 

Capistrano

自動デプロイツール

development環境から簡単にデプロイ作業ができます。

今回は設定からcapタスクを作成してローカルからデプロイ作業を行えるようにします。

-Capistrano設定

-capタスクの設定

 

 

     ■capistranoの導入

・gemfileのdevelopment環境とtest環境に追記します。

group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
//略
gem 'capistrano-rbenv'
gem 'capistrano-bundler'
gem 'capistrano3-unicorn' # unicornの起動を簡単に行えるらしい
end

$bundle install

 

capistranoの設定ファイルを追加します。

$cap install

 ※以下のファイルが作成されます

mkdir -p config/deploy

create config/deploy.rb //capistrano全体の設定ファイル

create config/deploy/staging.rb //staging環境の設定ファイル

create config/deploy/production.rb //production環境の設定ファイル

mkdir -p lib/capistrano/tasks

create Capfile //設定ファイル

Capified

 

・Capfileの設定変更(初期設定)

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

 ↓

require "capistrano/setup" //capistranoの設定を読み込む
require "capistrano/deploy" //デプロイフレームワークを読み込む
require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
require 'capistrano3/unicorn'
 
# Load custom tasks from `lib/capistrano/tasks` if you have any defined
//タスクを読み込む(今回は使っていない)
Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }

 

 

・config/deploy.rb(capistrano全体の設定ファイル)の編集

# config valid only for current version of Capistrano
lock '3.11.2'

#アプリケーション名
set :application, 'captest'

#gitのリポジトリ設定
set :repo_url, 'git@github.com:test/captest'
 
# デプロイ先のshared配下のリンクを/current/配下にシンボリックリンクをはる ※注①
set :linked_dirs, fetch(:linked_dirs, ).push('log', 'tmp/pids', 'tmp/cache',
'tmp/sockets', 'vendor/bundle', 'public/system', 'public/uploads')

set :rbenv_type, :user
set :rbenv_ruby, '2.5.1'

# どの公開鍵を利用してデプロイするか
set :ssh_options, auth_methods: ['publickey'],
keys: ['~/.ssh/****.pem']
 
set :unicorn_pid, -> { "#{shared_path}/tmp/pids/unicorn.pid" }
set :unicorn_config_path, -> { "#{current_path}/config/unicorn.rb" }
# 何世代前までリリースを残しておくか
set :keep_releases, 5

set :linked_files, fetch(:linked_files, ).push("config/master.key")

# デプロイ後に実行する処理
after 'deploy:publishing', 'deploy:restart'
namespace :deploy do
task :restart do
 
invoke 'unicorn:start'
end
end

備忘録

・set :名前,値 で設定し、fetch :名前 で取り出す invoke 呼び出し

・current:releases(デプロイするたびにファイルを配置されている)に入っている最新のディレクトリに対するシンボリックリンク(releasesの最新フォルダ→current)

シンボリックリンク特定のファイルやディレクトリを指し示す別のファイルを作成し、それを通じて本体を参照できるようにする(つまりショートカット)

注① EC2上の/var/www/アプリ名 の配下にsharedフォルダ、currentフォルダ、releasesフォルダがあり、sharedフォルダ配下の全てのフォルダにリンクを張っています(unicorn.rbの設定の時shared配下におくよう記載しています)

github

https://github.com/capistrano/rails 

※すごく詳しい参考サイトさま

https://qiita.com/syou007/items/9b8a2f4d1ff099c64fc5

 

・config/deploy/production.rb(production環境の設定ファイル)

# サーバ情報を記載・webとappのroleを付与
server 'IPアドレス', user: 'EC2user名', roles: %w{app db web}

set :rails_env, "production"
set :unicorn_rack_env, "production"

 設定の参考サイトさま

https://qiita.com/aplifyjp/items/5d24394dbd03712a2f1f

 

※注意点

Capistranoを入れると、現在のEC2のアプリが入っているフォルダ(例:/var/www配下)にcurrentフォルダか作成され、今後は /var/www/current配下を参照することになります。

設定やログファイルなども移動しますので、間違えないようにした方が良いです。

 

 

     ■capタスクの設定

・タスク一覧の表示

$bundle exec cap -T

------------------------

cap deploy:finished                # Finished

cap deploy:finishing               # Finish the deployment, clean up server(s)

cap deploy:finishing_rollback      # Finish the rollback, clean up server(s)

cap deploy:log_revision            # Log details of the deploy

cap deploy:migrate                 # Runs rake db:migrate if migrations are set

cap deploy:migrating               # Runs rake db:migrate

------------------------

 

【例】自動デプロイコマンドだと

cap deploy                         # Deploy a new release

→$bundle exec cap production deploy

【例】マイグレーションコマンドだと

cap deploy:migrating               # Runs rake db:migrate

→$bundle exec cap production deploy:migrating

 

今回はrake seedを実行したかったため、config/deploy.rb(capistrano全体の設定ファイル)に以下4つのrakeタスクを設定しました。

f:id:mocomo012:20200313180422p:plain

seedデータのcapタスク作成

 

上の記述で4つのseedデータの取り込みコマンドがローカルから実行できます。 

※登録したコマンドrake seedの設定はrakeタスクとして別に作成したものを使用しています。rake taskの作成については別記事に記載します。(まだまだ勉強中ですが,,)

 

$bundle exec cap -T

------------------------略

cap deploy:seed_category           # reload the database with category_seed data

cap deploy:seed_other              # reload the database with other_seed data

cap deploy:seed_product            # reload the database with product_seed data

cap deploy:seed_user               # reload the database with user_seed data 

//4つ増えた!

------------------------略

実行例:$bundle exec cap production deploy:seed_other

 

capコマンドに登録しなければEC2上からrake seedしないといけないのでしょうか。そこは分かりませんが,,

 

 

設定してタスク・流れの参考にさせていただいました

https://labs.gree.jp/blog/2013/12/10084/

https://easyramble.com/capistrano3-rake-db-seed.html

※(2020.3追記)

capistranoマイグレーションのcapタスクがこちらに記載されています。参考に

https://github.com/capistrano/rails/blob/5f112183dad808078a56c8558046d84d182eddf6/lib/capistrano/tasks/migrations.rake#L5-L14

 

※記載中のコードのスペースがうまく反映されていませんがすみません🙇‍♀️