スキップしてメイン コンテンツに移動

Rubyデプロイ自動化術

Rubyデプロイ自動化術

Ruby応用とデプロイの課題

Ruby on Rails は開発速度と柔軟性で人気がありますが、本番環境へのデプロイは依存関係や設定ファイルの差異に悩まされがちです。環境変数の管理、Gemfile.lock の整合性、データベースマイグレーションの順序など、手動で行うとミスが発生しやすい作業です。自動化ツールを導入することで、デプロイの信頼性とスピードを大幅に向上させることができます。

Capistranoでの自動化

Capistrano は Ruby 社で広く使われるデプロイツールで、リリースごとにコードをサーバへ転送し、必要なタスクを実行します。以下は典型的な Capistrano 設定例です。

# config/deploy.rb
set :application, "my_app"
set :repo_url, "git@github.com:user/my_app.git"
set :deploy_to, "/var/www/my_app"

namespace :deploy do
  task :restart do
    on roles(:app) do
      execute :touch, release_path.join("tmp/restart.txt")
    end
  end
end

Capistrano は SSH を使って複数サーバへ同時にデプロイでき、ロールベースでタスクを分割できます。これにより、Ruby アプリのデプロイを一元管理し、手動操作を最小化します。

Dockerで環境統一

Docker を使うと、開発環境と本番環境を同一のコンテナで構築できます。Ruby 公式イメージをベースに、必要な gem と依存ライブラリをインストールした Dockerfile を作成します。

FROM ruby:3.2
WORKDIR /app
COPY Gemfile Gemfile.lock ./
RUN bundle install --without development test
COPY . .
CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]

この Dockerfile をビルドし、Docker Hub や ECR にプッシュすれば、どこでも同じ環境で動作します。Capistrano と組み合わせることで、コンテナイメージのデプロイも自動化できます。

Kubernetesでスケール

Kubernetes はコンテナオーケストレーションの標準です。Ruby アプリをデプロイする際は、Deployment と Service を定義し、水平スケーリングを自動化します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: web
        image: myrepo/my_app:latest
        ports:
        - containerPort: 3000

Horizontal Pod Autoscaler を設定すれば、CPU 使用率に応じてレプリカ数を自動で増減できます。これにより、トラフィックの急増にも柔軟に対応できます。

AWS/Herokuでの運用

AWS では ECS/EKS、RDS、S3 などを組み合わせて Ruby アプリを構築できます。Heroku は PaaS で、Git push だけでデプロイが完了します。Heroku では Buildpack を使って Ruby 環境を自動構築し、Dyno でスケールします。

Heroku の自動スケール機能を使えば、トラフィックに応じて Dyno 数を増減できます。AWS では Auto Scaling Group と Load Balancer を組み合わせることで同様のスケーリングが可能です。

CI/CDとGitHub Actionsで自動化

GitHub Actions を使えば、コードのプッシュからテスト、ビルド、デプロイまでをワークフローで自動化できます。以下は簡易的なワークフロー例です。

name: CI/CD

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Set up Ruby
      uses: ruby/setup-ruby@v1
      with:
        ruby-version: 3.2
    - name: Install dependencies
      run: bundle install --jobs 4 --retry 3
    - name: Run tests
      run: bundle exec rspec
    - name: Build Docker image
      run: docker build -t myrepo/my_app:${{ github.sha }} .
    - name: Push to registry
      run: |
        echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
        docker push myrepo/my_app:${{ github.sha }}
    - name: Deploy to Kubernetes
      uses: azure/k8s-deploy@v1
      with:
        manifests: |
          deployment.yaml
        images: |
          myrepo/my_app:${{ github.sha }}

このワークフローは、コードが main ブランチにマージされるたびに自動でテスト・ビルド・デプロイを実行します。CI/CD と GitHub Actions を組み合わせることで、Ruby アプリのデプロイを完全に自動化できます。

この記事はAIによって作成されました。

コメント