CapistranoとCircleCIを使用した自動デプロイの構築

# CapistranoとCircleCIを使用した自動デプロイの構築

### 目次

- [**はじめに**](#はじめに)
  - [自動デプロイの重要性](#自動デプロイの重要性)
  - [CapistranoとCircleCIの概要](#capistranoとcircleciの概要)
- [**Capistranoの基本**](#capistranoの基本)
  - [Capistranoとは？](#capistranoとは)
  - [Capistranoのインストールと初期設定](#capistranoのインストールと初期設定)
  - [デプロイのフローとタスクの概要](#デプロイのフローとタスクの概要)
- [**Capistranoでのデプロイ設定**](#capistranoでのデプロイ設定)
  - [`deploy.rb`の基本設定](#deployrbの基本設定)
  - [環境固有の設定（例：`deploy/production.rb`）](#環境固有の設定例deployproductionrb)
  - [Passengerの再起動タスクの設定](#passengerの再起動タスクの設定)
- [**CircleCIの基本**](#circleciの基本)
  - [CircleCIとは？](#circleciとは)
  - [CircleCIの設定ファイル `.circleci/config.yml` の概要](#circleciの設定ファイル-circleciconfigyml-の概要)
- [**CircleCIでの自動デプロイ設定**](#circleciでの自動デプロイ設定)
  - [ワークフローの設定](#ワークフローの設定)
  - [テスト、Lint、その他の前提タスク](#テストlintその他の前提タスク)
  - [デプロイジョブの設定](#デプロイジョブの設定)
- [**CapistranoとCircleCIの統合**](#capistranoとcircleciの統合)
  - [SSHキーの設定](#sshキーの設定)
  - [CircleCIからCapistranoタスクを実行](#circleciからcapistranoタスクを実行)
- [**トラブルシューティング**](#トラブルシューティング)
  - [よくある問題とその解決策](#よくある問題とその解決策)
  - [ログの確認方法](#ログの確認方法)
- [**まとめ**](#まとめ)
  - [自動デプロイのメリット再確認](#自動デプロイのメリット再確認)
  - [今後の拡張ポイント](#今後の拡張ポイント)
- [**付録**](#付録)
  - [**Capistrano Passengerの設定**](#capistrano-passengerの設定)
    - [Passengerとは？](#passengerとは)
    - [CapistranoでのPassengerの設定方法](#capistranoでのpassengerの設定方法)
    - [Passengerの再起動タスクの詳細](#passengerの再起動タスクの詳細)
  - [**Capistrano Sidekiqの設定**](#capistrano-sidekiqの設定)
    - [Sidekiqとは？](#sidekiqとは)
    - [CapistranoでのSidekiqの設定方法](#capistranoでのsidekiqの設定方法)
    - [Sidekiqのタスクの詳細](#sidekiqのタスクの詳細)


## 1. はじめに

### 自動デプロイの重要性

自動デプロイは、開発の効率を向上させ、ヒューマンエラーを減少させるための重要な手段です。手動でのデプロイ作業は時間がかかるだけでなく、ミスのリスクも伴います。自動デプロイを導入することで、これらの問題を大幅に軽減することができます。

### CapistranoとCircleCIの概要

- **Capistrano**: Rubyで書かれたリモートサーバーへのデプロイツール。設定ファイルやタスクを定義することで、一貫したデプロイプロセスを実現します。
  
- **CircleCI**: クラウドベースの継続的インテグレーションと継続的デリバリーサービス。GitHubやBitbucketとの統合が容易で、自動テストやデプロイをサポートしています。

## 2. Capistranoの基本

### Capistranoとは？

Capistranoは、複数のサーバーに対して一貫したデプロイを行うためのツールです。SSHを使用してリモートサーバーに接続し、事前に定義されたタスクを実行します。

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

```bash
gem install capistrano
cap install
```

上記のコマンドでCapistranoをインストールし、初期設定を行います。

### デプロイのフローとタスクの概要

デプロイは、以下のステップで行われます。

1. ソースコードのチェックアウト
2. 依存関係のインストール
3. アセットのコンパイル
4. データベースのマイグレーション
5. アプリケーションの再起動

これらのステップは、Capistranoのタスクとして定義され、`cap deploy`コマンドで自動的に実行されます。

## 3. Capistranoでのデプロイ設定

### `deploy.rb`の基本設定

`deploy.rb`は、デプロイの全体的な設定を行うファイルです。アプリケーションの名前、リポジトリのURL、デプロイ先のディレクトリなど、デプロイに関する基本的な情報をこのファイルに記述します。

```ruby
set :application, "my_app_name"
set :repo_url, "git@example.com:me/my_repo.git"
```

### 環境固有の設定（例：`deploy/production.rb`）

各環境（例：production、staging）ごとの設定は、`deploy`ディレクトリ内の対応するファイルに記述します。

```ruby
server 'example.com', user: 'deploy', roles: %w{app db web}
```

### Passengerの再起動タスクの設定

CapistranoとPassengerを統合することで、デプロイ後にPassengerを自動的に再起動することができます。これには、`capistrano-passenger` gemをインストールし、`Capfile`に以下の行を追加する必要があります。

```ruby
require 'capistrano/passenger'
```

これにより、デプロイ時にPassengerの再起動タスクが自動的に実行されます。

## 4. CircleCIの基本

### CircleCIとは？

CircleCIは、ソフトウェアのビルド、テスト、デプロイを自動化

するためのクラウドベースのサービスです。GitHubやBitbucketのリポジトリと統合して、コードの変更ごとに自動的にビルドやテストを実行します。

### CircleCIの設定ファイル `.circleci/config.yml` の概要

CircleCIの動作は、`.circleci/config.yml`ファイルに記述された設定に基づいて行われます。このファイルには、使用するDockerイメージ、実行するコマンド、ワークフローなどの設定を記述します。

## 5. CircleCIでの自動デプロイ設定

### ワークフローの設定

ワークフローは、ジョブの実行順序や依存関係を定義します。例えば、テストジョブが成功した後にデプロイジョブを実行するように設定することができます。

```yaml
workflows:
  version: 2
  build-deploy:
    jobs:
      - build
      - deploy:
          requires:
            - build
```

### テスト、Lint、その他の前提タスク

テストやLintは、デプロイ前にコードの品質を確認するための重要なステップです。CircleCIでは、これらのタスクを自動的に実行する設定を行うことができます。

```yaml
jobs:
  lint:
    steps:
      - run: yarn lint
  test:
    steps:
      - run: yarn test
```

### デプロイジョブの設定

デプロイジョブは、テストやLintが成功した後に実行されるジョブです。このジョブで、Capistranoを使用してアプリケーションをデプロイします。

```yaml
jobs:
  deploy:
    steps:
      - run: bundle exec cap production deploy
```

## 6. CapistranoとCircleCIの統合

### SSHキーの設定

CircleCIからリモートサーバーにデプロイするためには、SSHキーの設定が必要です。CircleCIのダッシュボードでSSHキーを追加し、そのキーをリモートサーバーにも登録します。

### CircleCIからCapistranoタスクを実行

CircleCIのデプロイジョブ内で、Capistranoのデプロイタスクを実行することで、自動デプロイを実現します。

## 7. トラブルシューティング

### よくある問題とその解決策

1. **デプロイが途中で停止する**: ネットワークの問題やリモートサーバーの設定ミスが考えられます。ログを確認して、原因を特定しましょう。
2. **テストが失敗する**: テストコードの問題や、環境固有の問題が考えられます。テストコードを確認し、必要に応じて修正しましょう。

### ログの確認方法

CircleCIのダッシュボードで、ジョブの詳細ページにアクセスすることで、実行されたコマンドのログを確認することができます。

## 8. まとめ

### 自動デプロイのメリット再確認

自動デプロイを導入することで、デプロイの効率を向上させるだけでなく、ヒューマンエラーを減少させることができます。これにより、開発チームはより迅速に、かつ安全に新しい機能や修正を本番環境にリリースすることができます。

### 今後の拡張ポイント

自動デプロイの設定は、プロジェクトの要件やチームのニーズに応じてカスタマ

イズすることができます。例えば、デプロイ後に自動的にスモークテストを実行する設定や、特定のブランチだけをデプロイする設定など、さまざまな拡張が考えられます。

## 付録

### A. `capistrano/passenger`

`capistrano/passenger`は、CapistranoとPhusion Passengerを統合するためのgemです。このgemを使用することで、デプロイ後にPassengerを自動的に再起動するタスクを追加することができます。

### B. `capistrano/sidekiq`

`capistrano/sidekiq`は、CapistranoとSidekiqを統合するためのgemです。このgemを使用することで、デプロイ時にSidekiqのプロセスを管理するタスクを追加することができます。