CapistranoとCircleCIを使用した自動デプロイの構築
目次
- はじめに
- Capistranoの基本
- Capistranoでのデプロイ設定
- CircleCIの基本
- CircleCIでの自動デプロイ設定
- CapistranoとCircleCIの統合
- トラブルシューティング
- まとめ
- 付録
1. はじめに
自動デプロイの重要性
自動デプロイは、開発の効率を向上させ、ヒューマンエラーを減少させるための重要な手段です。手動でのデプロイ作業は時間がかかるだけでなく、ミスのリスクも伴います。自動デプロイを導入することで、これらの問題を大幅に軽減することができます。
CapistranoとCircleCIの概要
-
Capistrano: Rubyで書かれたリモートサーバーへのデプロイツール。設定ファイルやタスクを定義することで、一貫したデプロイプロセスを実現します。
-
CircleCI: クラウドベースの継続的インテグレーションと継続的デリバリーサービス。GitHubやBitbucketとの統合が容易で、自動テストやデプロイをサポートしています。
2. Capistranoの基本
Capistranoとは?
Capistranoは、複数のサーバーに対して一貫したデプロイを行うためのツールです。SSHを使用してリモートサーバーに接続し、事前に定義されたタスクを実行します。
Capistranoのインストールと初期設定
gem install capistrano
cap install
上記のコマンドでCapistranoをインストールし、初期設定を行います。
デプロイのフローとタスクの概要
デプロイは、以下のステップで行われます。
- ソースコードのチェックアウト
- 依存関係のインストール
- アセットのコンパイル
- データベースのマイグレーション
- アプリケーションの再起動
これらのステップは、Capistranoのタスクとして定義され、cap deploy
コマンドで自動的に実行されます。
3. Capistranoでのデプロイ設定
deploy.rb
の基本設定
deploy.rb
は、デプロイの全体的な設定を行うファイルです。アプリケーションの名前、リポジトリのURL、デプロイ先のディレクトリなど、デプロイに関する基本的な情報をこのファイルに記述します。
set :application, "my_app_name"
set :repo_url, "git@example.com:me/my_repo.git"
環境固有の設定(例:deploy/production.rb
)
各環境(例:production、staging)ごとの設定は、deploy
ディレクトリ内の対応するファイルに記述します。
server 'example.com', user: 'deploy', roles: %w{app db web}
Passengerの再起動タスクの設定
CapistranoとPassengerを統合することで、デプロイ後にPassengerを自動的に再起動することができます。これには、capistrano-passenger
gemをインストールし、Capfile
に以下の行を追加する必要があります。
require 'capistrano/passenger'
これにより、デプロイ時にPassengerの再起動タスクが自動的に実行されます。
4. CircleCIの基本
CircleCIとは?
CircleCIは、ソフトウェアのビルド、テスト、デプロイを自動化
するためのクラウドベースのサービスです。GitHubやBitbucketのリポジトリと統合して、コードの変更ごとに自動的にビルドやテストを実行します。
CircleCIの設定ファイル .circleci/config.yml
の概要
CircleCIの動作は、.circleci/config.yml
ファイルに記述された設定に基づいて行われます。このファイルには、使用するDockerイメージ、実行するコマンド、ワークフローなどの設定を記述します。
5. CircleCIでの自動デプロイ設定
ワークフローの設定
ワークフローは、ジョブの実行順序や依存関係を定義します。例えば、テストジョブが成功した後にデプロイジョブを実行するように設定することができます。
workflows:
version: 2
build-deploy:
jobs:
- build
- deploy:
requires:
- build
テスト、Lint、その他の前提タスク
テストやLintは、デプロイ前にコードの品質を確認するための重要なステップです。CircleCIでは、これらのタスクを自動的に実行する設定を行うことができます。
jobs:
lint:
steps:
- run: yarn lint
test:
steps:
- run: yarn test
デプロイジョブの設定
デプロイジョブは、テストやLintが成功した後に実行されるジョブです。このジョブで、Capistranoを使用してアプリケーションをデプロイします。
jobs:
deploy:
steps:
- run: bundle exec cap production deploy
6. CapistranoとCircleCIの統合
SSHキーの設定
CircleCIからリモートサーバーにデプロイするためには、SSHキーの設定が必要です。CircleCIのダッシュボードでSSHキーを追加し、そのキーをリモートサーバーにも登録します。
CircleCIからCapistranoタスクを実行
CircleCIのデプロイジョブ内で、Capistranoのデプロイタスクを実行することで、自動デプロイを実現します。
7. トラブルシューティング
よくある問題とその解決策
- デプロイが途中で停止する: ネットワークの問題やリモートサーバーの設定ミスが考えられます。ログを確認して、原因を特定しましょう。
- テストが失敗する: テストコードの問題や、環境固有の問題が考えられます。テストコードを確認し、必要に応じて修正しましょう。
ログの確認方法
CircleCIのダッシュボードで、ジョブの詳細ページにアクセスすることで、実行されたコマンドのログを確認することができます。
8. まとめ
自動デプロイのメリット再確認
自動デプロイを導入することで、デプロイの効率を向上させるだけでなく、ヒューマンエラーを減少させることができます。これにより、開発チームはより迅速に、かつ安全に新しい機能や修正を本番環境にリリースすることができます。
今後の拡張ポイント
自動デプロイの設定は、プロジェクトの要件やチームのニーズに応じてカスタマ
イズすることができます。例えば、デプロイ後に自動的にスモークテストを実行する設定や、特定のブランチだけをデプロイする設定など、さまざまな拡張が考えられます。
付録
A. capistrano/passenger
capistrano/passenger
は、CapistranoとPhusion Passengerを統合するためのgemです。このgemを使用することで、デプロイ後にPassengerを自動的に再起動するタスクを追加することができます。
B. capistrano/sidekiq
capistrano/sidekiq
は、CapistranoとSidekiqを統合するためのgemです。このgemを使用することで、デプロイ時にSidekiqのプロセスを管理するタスクを追加することができます。