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パイプラインの効率化
ヒューマンエラーのリスクを大幅に低減
手動デプロイでよく発生する以下のようなミスを、自動化により防止できます:
- 設定ファイルの配置忘れ
# config/deploy.rb append :linked_files, 'config/database.yml', 'config/master.key', '.env'
- デプロイ手順の実行順序ミス
# 自動的に正しい順序で実行 before 'deploy:assets:precompile', 'deploy:yarn_install' after 'deploy:updated', 'deploy:migrate'
- 環境固有の設定忘れ
# 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キーの設定手順:
- デプロイ用キーの生成
ssh-keygen -t rsa -b 4096 -f ~/.ssh/deploy_key
- 公開キーをサーバーに登録
ssh-copy-id -i ~/.ssh/deploy_key.pub deploy@your.server.com
- 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
これらのベストプラクティスを実装することで、以下のような効果が期待できます:
- デプロイ成功率の向上(99.9%以上)
- 障害発生時の平均復旧時間(MTTR)の短縮
- 大規模システムでのスケーラブルな運用
- チーム間の連携強化
次のセクションでは、実際の運用で遭遇する可能性のある問題とその解決方法について詳しく解説します。
実践的なトラブルシューティング集
よくあるデプロイエラーとその解決方法
1. Permission Denied エラー
# エラーメッセージ例 Permission denied (publickey,password)
解決手順:
- SSHキーの確認
# ローカルでの確認 ssh-add -l # キーの追加 ssh-add ~/.ssh/deploy_key
- サーバー側の権限設定
# 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
これらの問題解決方法と最適化設定により、以下のような効果が期待できます:
- デプロイ失敗の迅速な解決(平均解決時間15分以内)
- システムリソースの効率的な使用
- セキュリティリスクの最小化
- 運用コストの削減
次のセクションでは、これらの知識を活用して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
これらの設定により、以下のような継続的デリバリーの体制が構築できます:
- 自動化されたデプロイパイプライン
- コミット→テスト→デプロイの自動化
- 複数環境への段階的デプロイ
- 品質保証の自動化
- 自動テストの実行
- セキュリティチェック
- パフォーマンステスト
- 監視体制の確立
- リアルタイムの監視
- インシデントの早期発見
- チーム間の迅速な情報共有
このような体制により、より安全で効率的な継続的デプロイメントが実現できます。