Capistranoにキャピキャピ(死語)してみた

Ruby

ぬにょす(挨拶)。

自動デプロイツールのCapistranoを使って、ステージング環境にデプロイしてみます。

前提条件

  • デプロイ元
    • Railsアプリケーションを構築済み。
    • デプロイ先へのSSH疎通確認済み。
    • GitHubへのSSH疎通確認済み。
    • GitHubにRailsアプリケーションのリポジトリを作成済み。
  • デプロイ先
    • Railsアプリケーションの稼働環境(Ruby, MariaDB, Nginx等)を構築済み。
    • Railsアプリケーションが使用するデータベースを作成済み。
    • GitHubへのSSH疎通確認済み。

Capistranoのインストール

RailsプロジェクトのGemfileを編集します。

group :development do
  # 追記ここから
  gem "capistrano", "~> 3.11"
  gem "capistrano-rails", "~> 1.4"
  gem 'capistrano-rbenv', '~> 2.1'
  gem 'capistrano-bundler', '~> 1.5'
  gem "capistrano3-puma"
  gem 'ed25519'
  gem 'bcrypt_pbkdf'
  # 追記ここまで
end

Bundlerでインストールします。

$ bundle install

基本的な設定ファイルを生成します。

$ bundle exec cap install
$ echo "require 'capistrano/rails'" >> Capfile
$ echo "require 'capistrano/rbenv'" >> Capfile
$ echo "require 'capistrano/bundler'" >> Capfile
$ echo "require 'capistrano/puma'" >> Capfile
$ echo "install_plugin Capistrano::Puma" >> Capfile

deploy.rbの編集

config/deploy.rbを編集します。

set :application, "my_app_name"
set :repo_url, "git@example.com:me/my_app_name.git"
set :deploy_to, "/var/www/my_app_name"
set :format, :airbrusshset :log_level, :debug
set :format_options, truncate: false
append :linked_files, 'config/database.yml', 'config/master.key'
append :linked_dirs, 'log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', '.bundle', 'public/system', 'public/uploads'

set :rbenv_type, :user
set :rbenv_ruby, '2.6.2'

namespace :deploy do
  desc "Make sure local git is in sync with remote."
  task :confirm do
    on roles(:app) do
      puts "This stage is '#{fetch(:stage)}'. Deploying branch is '#{fetch(:branch)}'."
      puts 'Are you sure? [y/n]'
      ask :answer, 'n'
      if fetch(:answer) != 'y'
        puts 'deploy stopped'
        exit
      end
    end
  end
  desc "Push shared files"
  task :init_files do
    on roles(:app) do
      fetch(:linked_files).each do |file|
        unless test "[ -f #{shared_path.join file} ]"
          upload! file, "#{shared_path.join file}"
        end
      end
    end
  end
  desc "Initial Deploy"
  task :initial do
    on roles(:app) do
      before 'deploy:check:linked_files', :init_files
      invoke 'deploy'
    end
  end
  before :starting, :confirm
end

デプロイ先への接続情報の設定

config/deploy 配下の staging.rb を編集します。

server "example.com", user: "deploy", roles: %w{app db web}
set :ssh_options, keys: %w(/home/deploy/.ssh/id_rsa)

その他のファイルの準備

config/environments/production.rb を staging.rb としてコピーします。

$ cp -a config/environments/production.rb config/environments/staging.rb

config/database.yml にステージング環境のDB情報を追加します。

staging:
  <<
: *default
  database
: my_app_name

デプロイの実行

ファイル一式をGitHubにプッシュしてから実行します。

$ bundle exec cap staging deploy:initial

2回目以降は deploy だけで良い。

$ bundle exec cap staging deploy

staging を production に変えれば本番環境へのデプロイになるはずです。

コメント

タイトルとURLをコピーしました