【保存版】Capistranoで実現する5ステップの最強Rubyデプロイ自動化ガイド

Capistranoとは?デプロイ自動化の決定版ツールを徹底解説

Rubyプロジェクトに最適な自動デプロイツール

Capistranoは、Rubyコミュニティで広く採用されているデプロイ自動化ツールです。2009年にJamis Buck氏によって開発が開始され、現在も活発に開発が続けられています。特にRuby on Railsプロジェクトとの親和性が高く、多くの企業の本番環境で利用されています。

Capistranoの基本的な仕組みは、SSHを使用してリモートサーバーに接続し、事前に定義された一連のタスクを実行することです。これにより、以下のようなデプロイ作業を自動化できます:

  • Gitリポジトリからの最新コードの取得
  • 依存ライブラリのインストール
  • データベースマイグレーション
  • アセットのプリコンパイル
  • アプリケーションサーバーの再起動

主要な機能と特徴を理解しよう

1. 柔軟なタスク定義

Capistranoでは、独自のデプロイタスクを簡単に定義できます。以下は基本的なタスク定義の例です:

# config/deploy.rb
namespace :deploy do
  desc 'アプリケーションの再起動'
  task :restart do
    on roles(:app) do
      execute :touch, release_path.join('tmp/restart.txt')
    end
  end

  desc 'データベースの設定ファイルをアップロード'
  task :upload_database_yml do
    on roles(:app) do
      execute :mkdir, '-p', "#{shared_path}/config"
      upload! 'config/database.yml', "#{shared_path}/config/database.yml"
    end
  end
end

2. マルチステージデプロイ対応

開発環境、ステージング環境、本番環境など、複数の環境に対するデプロイ設定を個別に管理できます:

# config/deploy/production.rb
server 'production.example.com',
  user: 'deploy',
  roles: %w{app db web},
  ssh_options: {
    keys: %w(/home/user/.ssh/id_rsa),
    forward_agent: true
  }

# config/deploy/staging.rb
server 'staging.example.com',
  user: 'deploy',
  roles: %w{app db web}

3. ロールベースの実行制御

サーバーごとに役割(ロール)を定義し、特定のタスクを特定のロールを持つサーバーでのみ実行するように制御できます:

# アプリケーションサーバーのみで実行
on roles(:app) do
  # アプリケーション固有のタスク
end

# データベースサーバーのみで実行
on roles(:db) do
  # データベース関連のタスク
end

4. 強力なフック機能

デプロイの各フェーズで独自の処理を挟み込むことができます:

# デプロイ開始前の処理
before 'deploy:starting', 'check_write_permissions'

# デプロイ完了後の処理
after 'deploy:finished', 'notify_slack'

# 特定のタスクの前後で実行
before :deploy, 'deploy:check_write_permissions'
after  :deploy, 'deploy:cleanup'

5. バージョン管理と高速ロールバック

Capistranoは、デプロイされたアプリケーションのバージョンを管理し、問題が発生した場合に以前のバージョンへ素早くロールバックできる機能を備えています:

# 最新のデプロイを取り消し、前回のバージョンに戻す
cap production deploy:rollback

これらの機能により、Capistranoは以下のような特徴を持つプロジェクトで特に威力を発揮します:

  • 複数のサーバーにデプロイが必要なプロジェクト
  • 定期的なデプロイが発生するアジャイル開発環境
  • 複雑なデプロイ手順を持つエンタープライズアプリケーション
  • 高可用性が求められるミッションクリティカルなシステム

Capistranoは単なるデプロイツールではなく、アプリケーションのライフサイクル管理を支援する総合的な自動化基盤として機能します。次のセクションでは、このツールを導入することで得られる具体的なメリットについて詳しく見ていきましょう。

Capistranoによるデプロイ自動化の具体的メリット

手作業デプロイと比較した工数削減効果

従来の手動デプロイプロセスと比較して、Capistranoによる自動化では大幅な工数削減が実現できます。以下に具体的な比較データを示します:

デプロイ作業時間の比較

作業内容手動デプロイCapistrano利用削減時間
コードの配置15-20分2-3分約85%
依存関係の解決10-15分3-4分約75%
設定ファイルの配置5-10分1分以下約90%
アプリケーション再起動5-10分1分以下約90%
合計35-55分7-9分約85%

この時間削減により、以下のような具体的なメリットが生まれます:

  • リリース頻度の向上(週1回→毎日可能に)
  • 開発者の作業時間の有効活用
  • 急なバグ修正への迅速な対応
  • デプロイ待ち時間の削減によるCI/CDパイプラインの効率化

ヒューマンエラーのリスクを大幅に低減

手動デプロイでよく発生する以下のようなミスを、自動化により防止できます:

  1. 設定ファイルの配置忘れ
# config/deploy.rb
append :linked_files, 
  'config/database.yml',
  'config/master.key',
  '.env'
  1. デプロイ手順の実行順序ミス
# 自動的に正しい順序で実行
before 'deploy:assets:precompile', 'deploy:yarn_install'
after 'deploy:updated', 'deploy:migrate'
  1. 環境固有の設定忘れ
# config/deploy/production.rb
set :rails_env, 'production'
set :branch, 'main'
set :keep_releases, 5

これらの自動化により、以下のような具体的な改善が見られます:

  • デプロイ失敗率: 20%→1%未満に低下
  • 設定ミスによるダウンタイム: 月平均2時間→ほぼゼロに
  • 緊急対応の必要性: 月平均3-4回→1回未満に減少

チーム全体のデプロイ品質が向上する理由

Capistranoの導入は、単なる自動化以上の効果をチームにもたらします:

1. 標準化された実行環境

# サーバー環境の一貫性を確保
set :rbenv_type, :user
set :rbenv_ruby, '3.2.2'
set :rbenv_prefix, "RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}/bin/rbenv exec"

2. 透明性の向上

  • デプロイログの自動記録
  • 実行された操作の可視化
  • エラー発生時の原因特定が容易

3. 知識の共有と移転

# タスクの説明をコードに記述
desc 'Nginxの設定を更新し再起動'
task :update_nginx_config do
  on roles(:web) do
    # タスクの内容が明確に記述される
    execute :sudo, :cp, 'nginx.conf', '/etc/nginx/sites-available/app'
    execute :sudo, 'systemctl restart nginx'
  end
end

4. チーム全体の生産性向上

  • 新メンバーの学習曲線の短縮(1ヶ月→1週間)
  • デプロイ関連の質問対応時間の削減(週平均5時間→1時間)
  • チーム間の連携強化(開発・運用・QAの連携がスムーズに)

これらの改善により、以下のような組織的な効果が得られます:

  • リリースサイクルの短縮(月2回→週3回に増加)
  • デプロイ関連の技術的負債の削減
  • チームのスケーラビリティ向上(新規メンバーの追加がスムーズに)
  • 運用コストの最大40%削減

以上のメリットは、特に以下のような状況で顕著な効果を発揮します:

  • マイクロサービスアーキテクチャの運用
  • 複数環境(開発・ステージング・本番)の管理
  • 分散チームでの開発
  • 頻繁なリリースが必要なアジャイル開発

次のセクションでは、これらのメリットを実現するための具体的な実装手順について、5つのステップで詳しく解説していきます。

環境構築からデプロイまでの5ステップ

1. Capistranoのインストールと初期設定

まず、プロジェクトにCapistranoを導入します。Gemfileに以下の記述を追加します:

group :development do
  gem 'capistrano', '~> 3.17'
  gem 'capistrano-rails', '~> 1.6'
  gem 'capistrano-rbenv', '~> 2.2'
  gem 'capistrano-bundler', '~> 2.1'
  gem 'capistrano3-puma', '~> 5.2'
end

必要なファイルを生成します:

# Capistranoの初期化
bundle exec cap install

# 生成されるファイル構成
├── Capfile
├── config
│   ├── deploy.rb
│   └── deploy
│       ├── production.rb
│       └── staging.rb

Capfileを以下のように設定します:

# Capfile
require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
require 'capistrano/puma'

install_plugin Capistrano::Puma

2. デプロイ設定ファイルの作成と構成

deploy.rbに基本設定を記述します:

# config/deploy.rb
lock "~> 3.17.3"

set :application, "your_app_name"
set :repo_url, "git@github.com:username/repository.git"

# デプロイ先のディレクトリ構成
set :deploy_to, "/var/www/#{fetch(:application)}"

# 保持するバージョン数
set :keep_releases, 5

# 共有するディレクトリ/ファイル
append :linked_dirs, 
  'log',
  'tmp/pids',
  'tmp/cache',
  'tmp/sockets',
  'vendor/bundle',
  'public/system',
  'public/uploads'

append :linked_files,
  'config/database.yml',
  'config/master.key'

# デプロイ設定
set :rbenv_type, :user
set :rbenv_ruby, '3.2.2'
set :rbenv_prefix, "RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}/bin/rbenv exec"

# タスクの定義
namespace :deploy do
  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      invoke 'puma:restart'
    end
  end

  after :publishing, :restart
end

3. 本番環境の接続設定とSSHキーの管理

production.rbで本番環境の設定を行います:

# config/deploy/production.rb
server 'your.server.com',
  user: 'deploy',
  roles: %w{app db web},
  ssh_options: {
    keys: %w(~/.ssh/id_rsa),
    forward_agent: true,
    auth_methods: %w(publickey),
    verify_host_key: :secure
  }

set :rails_env, 'production'
set :branch, 'main'

SSHキーの設定手順:

  1. デプロイ用キーの生成
ssh-keygen -t rsa -b 4096 -f ~/.ssh/deploy_key
  1. 公開キーをサーバーに登録
ssh-copy-id -i ~/.ssh/deploy_key.pub deploy@your.server.com
  1. SSH設定ファイルの作成
# ~/.ssh/config
Host your.server.com
  HostName your.server.com
  User deploy
  IdentityFile ~/.ssh/deploy_key
  ForwardAgent yes

4. デプロイタスクのカスタマイズ方法

プロジェクト固有のタスクを定義します:

# lib/capistrano/tasks/setup.rake
namespace :deploy do
  namespace :check do
    before :linked_files, :set_master_key do
      on roles(:app), in: :sequence, wait: 10 do
        unless test("[ -f #{shared_path}/config/master.key ]")
          upload! 'config/master.key', "#{shared_path}/config/master.key"
        end
      end
    end
  end

  desc 'Runs any pending migrations'
  task :migrate_db do
    on roles(:db) do
      within release_path do
        execute :rake, 'db:migrate RAILS_ENV=production'
      end
    end
  end

  desc 'Seed the database'
  task :seed_db do
    on roles(:db) do
      within release_path do
        execute :rake, 'db:seed RAILS_ENV=production'
      end
    end
  end

  desc 'Clear application cache'
  task :clear_cache do
    on roles(:app) do
      within release_path do
        execute :rake, 'tmp:cache:clear'
      end
    end
  end
end

5. 自動デプロイの実行とログの確認

デプロイの実行コマンド:

# 本番環境の準備確認
bundle exec cap production deploy:check

# 本番環境へのデプロイ
bundle exec cap production deploy

# 特定のタスクの実行
bundle exec cap production deploy:migrate_db
bundle exec cap production deploy:seed_db

デプロイログの確認:

# サーバー上のログファイル
tail -f /var/www/your_app_name/current/log/capistrano.log

# デプロイ履歴の確認
ls -l /var/www/your_app_name/releases

重要なログファイルの場所:

/var/www/your_app_name/current/log/production.log  # Railsアプリケーションログ
/var/www/your_app_name/current/log/capistrano.log  # デプロイログ
/var/www/your_app_name/current/log/puma.log        # Pumaサーバーログ

これらの5ステップを完了することで、安定した自動デプロイ環境が構築できます。次のセクションでは、この環境を最大限活用するためのベストプラクティスについて解説します。

現場で役立つCapistranoのベストプラクティス

デプロイ失敗を防ぐための設定方法

1. デプロイ前のヘルスチェック実装

# lib/capistrano/tasks/health_check.rake
namespace :deploy do
  desc 'サーバーの状態チェック'
  task :health_check do
    on roles(:all) do
      # ディスク容量チェック
      disk_space = capture('df -h / | tail -1 | awk \'{print $5}\' | sed \'s/%//\'').to_i
      if disk_space > 90
        error "ディスク使用率が90%を超えています: #{disk_space}%"
        exit 1
      end

      # メモリ使用量チェック
      free_memory = capture('free -m | grep Mem | awk \'{print $4}\'').to_i
      if free_memory < 512
        error "空きメモリが不足しています: #{free_memory}MB"
        exit 1
      end

      # プロセス数チェック
      process_count = capture('ps aux | wc -l').to_i
      if process_count > 300
        error "プロセス数が多すぎます: #{process_count}"
        exit 1
      end
    end
  end

  before :starting, :health_check
end

2. ロールバックポイントの確実な設定

# config/deploy.rb
set :keep_releases, 3  # 最低3つの過去バージョンを保持

# デプロイ失敗時の自動ロールバック
namespace :deploy do
  after :failed, :fix_permissions do
    on roles(:app) do
      execute :chmod, '-R', '755', release_path
    end
  end

  after :failed, :rollback do
    invoke 'deploy:revert_release'
  end
end

ロールバック機能の効果的な活用術

1. 段階的ロールバック戦略

namespace :deploy do
  desc 'アプリケーションの段階的ロールバック'
  task :phased_rollback do
    on roles(:app) do
      # トラフィックの制限
      execute 'sudo nginx -s reload'  # メンテナンスページ表示

      # データベースのロールバック
      within current_path do
        execute :rake, 'db:rollback STEP=1'
      end

      # コードのロールバック
      invoke 'deploy:revert_release'

      # アセットのロールバック
      within current_path do
        execute :rake, 'assets:precompile'
      end

      # アプリケーションの再起動
      invoke 'puma:restart'

      # トラフィックの復旧
      execute 'sudo nginx -s reload'
    end
  end
end

2. ロールバック前後の状態監視

# lib/capistrano/tasks/monitoring.rake
namespace :monitor do
  desc 'アプリケーションの状態確認'
  task :check_status do
    on roles(:app) do
      # アプリケーションの応答確認
      response_code = capture("curl -s -o /dev/null -w '%{http_code}' http://localhost/health_check")
      if response_code != "200"
        error "アプリケーションが正常に応答していません: #{response_code}"
      end

      # エラーログのチェック
      recent_errors = capture("tail -n 50 #{current_path}/log/production.log | grep ERROR | wc -l").to_i
      if recent_errors > 0
        warning "最近のエラー数: #{recent_errors}"
      end
    end
  end
end

大規模プロジェクトでの運用のコツ

1. 環境別の設定管理

# config/deploy/production.rb
set :stage_settings do
  {
    web: {
      instances: 4,
      server_config: 'config/nginx/production.conf'
    },
    worker: {
      instances: 2,
      queue_prefix: 'production'
    },
    db: {
      primary: 'db-primary.example.com',
      replica: 'db-replica.example.com'
    }
  }
end

# サーバー設定の動的生成
fetch(:stage_settings)[:web][:instances].times do |i|
  server "web-#{i}.example.com",
    roles: %w{app web},
    ssh_options: fetch(:ssh_options)
end

2. 並列デプロイの最適化

# config/deploy.rb
set :max_parallels, 3  # 同時デプロイ数の制限

# デプロイ処理の並列化設定
namespace :deploy do
  task :parallel_deploy do
    on roles(:app), in: :groups, limit: fetch(:max_parallels) do
      # アセットのプリコンパイル
      execute :rake, 'assets:precompile'

      # データベースマイグレーション(プライマリノードのみ)
      if host.properties.primary
        within current_path do
          execute :rake, 'db:migrate'
        end
      end
    end
  end
end

3. キャッシュ戦略の実装

# lib/capistrano/tasks/cache.rake
namespace :cache do
  desc 'キャッシュの段階的クリア'
  task :smart_clear do
    on roles(:app) do
      within current_path do
        # ページキャッシュのクリア
        execute :rake, 'tmp:cache:clear'

        # Redisキャッシュの選択的クリア
        execute :redis-cli, "KEYS 'cache:*' | xargs redis-cli DEL"

        # CDNキャッシュのパージ
        execute :rake, 'cdn:purge:selective'
      end
    end
  end
end

これらのベストプラクティスを実装することで、以下のような効果が期待できます:

  1. デプロイ成功率の向上(99.9%以上)
  2. 障害発生時の平均復旧時間(MTTR)の短縮
  3. 大規模システムでのスケーラブルな運用
  4. チーム間の連携強化

次のセクションでは、実際の運用で遭遇する可能性のある問題とその解決方法について詳しく解説します。

実践的なトラブルシューティング集

よくあるデプロイエラーとその解決方法

1. Permission Denied エラー

# エラーメッセージ例
Permission denied (publickey,password)

解決手順:

  1. SSHキーの確認
# ローカルでの確認
ssh-add -l
# キーの追加
ssh-add ~/.ssh/deploy_key
  1. サーバー側の権限設定
# lib/capistrano/tasks/fix_permissions.rake
namespace :deploy do
  desc '権限の修正'
  task :fix_permissions do
    on roles(:app) do
      execute :chmod, "g+rx,u+rwx", deploy_to
      execute :chown, "-R", "#{fetch(:deploy_user)}:#{fetch(:deploy_group)}", deploy_to
    end
  end
end

2. Bundlerに関連するエラー

# エラーメッセージ例
bundler: command not found: bundle

解決策:

# config/deploy.rb
set :default_env, {
  'PATH' => "/usr/local/rbenv/shims:/usr/local/rbenv/bin:$PATH",
  'BUNDLER_VERSION' => '2.4.10'
}

# Bundlerのインストールを確実に
namespace :deploy do
  before 'deploy:check', :ensure_bundler do
    on roles(:app) do
      execute :gem, 'install bundler -v', fetch(:bundler_version)
    end
  end
end

3. アセットプリコンパイルの失敗

# config/deploy.rb
# メモリ不足対策
set :assets_roles, [:web, :app]
set :assets_prefix, 'packs'

namespace :deploy do
  namespace :assets do
    task :precompile do
      on roles(fetch(:assets_roles)) do
        within release_path do
          with rails_env: fetch(:rails_env), rails_groups: 'assets' do
            # メモリ制限付きでプリコンパイル
            execute :nice, "-n 19 bundle exec rake assets:precompile"
          end
        end
      end
    end
  end
end

パフォーマンス最適化のためのチューニングポイント

1. デプロイ速度の改善

# config/deploy.rb
# 並列処理の設定
set :format, :pretty
set :log_level, :debug
set :pty, false  # 並列処理を有効に

# 高速化のための設定
set :git_shallow_clone, 1  # シャロークローン
set :git_copy_strategy, :clone  # 高速なクローン戦略

# 不要なタスクのスキップ
namespace :deploy do
  Rake::Task["deploy:assets:backup_manifest"].clear_actions
end

2. メモリ使用量の最適化

# lib/capistrano/tasks/optimize_memory.rake
namespace :optimize do
  desc 'メモリ使用量の最適化'
  task :memory do
    on roles(:app) do
      # Railsのガベージコレクション設定
      execute "echo 'RUBY_GC_HEAP_GROWTH_MAX_SLOTS=40000' >> #{shared_path}/.env"
      execute "echo 'RUBY_GC_HEAP_INIT_SLOTS=600000' >> #{shared_path}/.env"

      # Pumaワーカー数の最適化
      execute :sed, "-i", "'s/workers .*/workers #{fetch(:puma_workers)}/g'",
              "#{shared_path}/config/puma.rb"
    end
  end
end

セキュリティを考慮した設定のポイント

1. 機密情報の安全な管理

# config/deploy.rb
# 環境変数の安全な管理
set :linked_files, %w{.env config/master.key}

namespace :deploy do
  namespace :check do
    before :linked_files, :upload_env do
      on roles(:app) do
        unless test("[ -f #{shared_path}/.env ]")
          upload! '.env.production', "#{shared_path}/.env"
        end
      end
    end
  end
end

2. セキュアなデプロイ設定

# config/deploy/production.rb
# SSHのセキュリティ強化
set :ssh_options, {
  forward_agent: true,
  auth_methods: %w(publickey),
  keys: %w(~/.ssh/deploy_key),
  verify_host_key: :secure,
  compression: false,
  config: false
}

# sudo権限の制限
set :use_sudo, false
set :deploy_user, 'deploy'

3. デプロイログの監査

# lib/capistrano/tasks/audit.rake
namespace :deploy do
  desc 'デプロイ監査ログの記録'
  task :audit_log do
    on roles(:app) do
      within release_path do
        execute :logger,
                "-t capistrano " \
                "'Deploy completed by #{ENV['USER']} " \
                "at #{Time.now} " \
                "from #{fetch(:branch)} " \
                "to #{fetch(:stage)}'"
      end
    end
  end

  after :finished, :audit_log
end

これらの問題解決方法と最適化設定により、以下のような効果が期待できます:

  1. デプロイ失敗の迅速な解決(平均解決時間15分以内)
  2. システムリソースの効率的な使用
  3. セキュリティリスクの最小化
  4. 運用コストの削減

次のセクションでは、これらの知識を活用してCI/CDパイプラインを構築する方法について解説します。

Capistranoを使った継続的デリバリーの実現

CI/CDパイプラインとの連携方法

GitHubActionsとの連携例

# .github/workflows/deploy.yml
name: Deploy to Production

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: '3.2.2'
          bundler-cache: true

      - name: Install SSH key
        uses: shimataro/ssh-key-action@v2
        with:
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          known_hosts: ${{ secrets.KNOWN_HOSTS }}

      - name: Deploy to production
        run: |
          gem install capistrano
          bundle install
          bundle exec cap production deploy
        env:
          RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}

CircleCIとの連携例

# .circleci/config.yml
version: 2.1

jobs:
  deploy:
    docker:
      - image: cimg/ruby:3.2.2
    steps:
      - checkout
      - add_ssh_keys:
          fingerprints:
            - "xx:xx:xx:xx:xx:xx:xx:xx"
      - run:
          name: Bundle Install
          command: bundle install
      - run:
          name: Deploy to Production
          command: bundle exec cap production deploy

workflows:
  version: 2
  build-deploy:
    jobs:
      - deploy:
          filters:
            branches:
              only: main

自動テストとの効果的な組み合わせ方

デプロイ前のテスト実行

# lib/capistrano/tasks/test.rake
namespace :deploy do
  desc 'デプロイ前のテスト実行'
  task :run_tests do
    on roles(:app) do
      within release_path do
        with rails_env: fetch(:rails_env) do
          # システムテスト
          execute :bundle, "exec rspec spec/system"

          # 負荷テスト
          execute :bundle, "exec rake performance:check"

          # セキュリティテスト
          execute :bundle, "exec brakeman -q -z"
        end
      end
    end
  end

  before 'deploy:migrate', :run_tests
end

スモークテストの実装

# lib/capistrano/tasks/smoke_test.rake
namespace :deploy do
  desc 'デプロイ後のスモークテスト'
  task :smoke_test do
    on roles(:web) do |host|
      # 基本的な疎通確認
      response = Net::HTTP.get_response(URI("https://#{host}/health_check"))
      unless response.code == "200"
        raise "Health check failed on #{host}"
      end

      # 重要な機能の確認
      crucial_endpoints = %w(
        /api/v1/status
        /api/v1/users
        /api/v1/products
      )

      crucial_endpoints.each do |endpoint|
        response = Net::HTTP.get_response(URI("https://#{host}#{endpoint}"))
        unless response.code.start_with?("2")
          raise "Endpoint #{endpoint} failed on #{host}"
        end
      end
    end
  end

  after 'deploy:finished', :smoke_test
end

デプロイ監視と通知の設定方法

Slackへの通知設定

# lib/capistrano/tasks/notify.rake
require 'net/http'
require 'json'

namespace :deploy do
  desc 'Slack通知の送信'
  task :notify_slack do
    on roles(:app) do
      webhook_url = fetch(:slack_webhook_url)
      environment = fetch(:stage)
      revision = capture("cd #{current_path} && git rev-parse --short HEAD")

      message = {
        text: ":rocket: デプロイが完了しました",
        attachments: [{
          color: "good",
          fields: [
            {
              title: "Environment",
              value: environment,
              short: true
            },
            {
              title: "Branch",
              value: fetch(:branch),
              short: true
            },
            {
              title: "Revision",
              value: revision,
              short: true
            },
            {
              title: "Deployer",
              value: ENV['USER'],
              short: true
            }
          ]
        }]
      }

      uri = URI(webhook_url)
      http = Net::HTTP.new(uri.host, uri.port)
      http.use_ssl = true

      request = Net::HTTP::Post.new(
        uri.path,
        'Content-Type' => 'application/json'
      )
      request.body = message.to_json

      http.request(request)
    end
  end

  after 'deploy:finished', :notify_slack
end

メトリクス監視の実装

# lib/capistrano/tasks/monitoring.rake
namespace :deploy do
  desc 'デプロイ後のメトリクス監視'
  task :monitor_metrics do
    on roles(:app) do
      # New Relicへのデプロイマーカー設定
      within current_path do
        execute :bundle, "exec newrelic deployment"
      end

      # Datadogへのイベント送信
      api_key = fetch(:datadog_api_key)
      app_key = fetch(:datadog_app_key)

      event_data = {
        title: "Deployment to #{fetch(:stage)}",
        text: "Deployed #{fetch(:application)} to #{fetch(:stage)}",
        tags: ["environment:#{fetch(:stage)}", "deployer:#{ENV['USER']}"],
        alert_type: "info"
      }

      uri = URI("https://api.datadoghq.com/api/v1/events")
      request = Net::HTTP::Post.new(uri)
      request["Content-Type"] = "application/json"
      request["DD-API-KEY"] = api_key
      request["DD-APPLICATION-KEY"] = app_key
      request.body = event_data.to_json

      Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
        http.request(request)
      end
    end
  end

  after 'deploy:finished', :monitor_metrics
end

これらの設定により、以下のような継続的デリバリーの体制が構築できます:

  1. 自動化されたデプロイパイプライン
  • コミット→テスト→デプロイの自動化
  • 複数環境への段階的デプロイ
  1. 品質保証の自動化
  • 自動テストの実行
  • セキュリティチェック
  • パフォーマンステスト
  1. 監視体制の確立
  • リアルタイムの監視
  • インシデントの早期発見
  • チーム間の迅速な情報共有

このような体制により、より安全で効率的な継続的デプロイメントが実現できます。