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 アプリのデプロイを完全に自動化できます。
コメント
コメントを投稿