Rails APIモードのテンプレートリポジトリを作った【解説編】
概要
前回の記事の解説です。
learning-mind.hatenablog.com
テンプレートリポジトリ
github.com
Gemの選定について
「Rails Gem おすすめ」で検索してヒットした記事をいくつか読みつつ、普段仕事で使っているGemと合わせて選びました。
どんなプロダクトでも必要になると思われるものを選んだつもりです。
Gemの中にはコードの保守性を高めたり脆弱性を検知するものをいくつか含めています。
- rubycritic
- rubocop
- bundler-audit
- bullet
- rails_best_practices
- brakeman
これらは後から導入すると既存のコードの大部分を変更しなければならないケースが多いです。
初めから入れておいて型にはまったコーディングができれば、長期的に見たときに開発効率が高まると考えて選びました。
もしチーム開発を前提とするならやはりこういうGemは先に入れてメンバー間の認識を早期に固めておいた方が気持ちよく開発作業が進むと思います。
Docker
前回の記事で
rails newで作成したファイルに極力変更を加えない
と書きましたがDockerfileだけはそのままでは動かせず、シンプルなものをゼロベースで作成しました。
参考としてRailsが自動で作成するものを以下に記載します。
# syntax = docker/dockerfile:1 # Make sure RUBY_VERSION matches the Ruby version in .ruby-version and Gemfile ARG RUBY_VERSION=3.2.2 FROM registry.docker.com/library/ruby:$RUBY_VERSION-slim as base # Rails app lives here WORKDIR /rails # Set production environment ENV RAILS_ENV="production" \ BUNDLE_DEPLOYMENT="1" \ BUNDLE_PATH="/usr/local/bundle" \ BUNDLE_WITHOUT="development" # Throw-away build stage to reduce size of final image FROM base as build # Install packages needed to build gems RUN apt-get update -qq && \ apt-get install --no-install-recommends -y build-essential git libpq-dev libvips pkg-config # Install application gems COPY Gemfile Gemfile.lock ./ RUN bundle install && \ rm -rf ~/.bundle/ "${BUNDLE_PATH}"/ruby/*/cache "${BUNDLE_PATH}"/ruby/*/bundler/gems/*/.git && \ bundle exec bootsnap precompile --gemfile # Copy application code COPY . . # Precompile bootsnap code for faster boot times RUN bundle exec bootsnap precompile app/ lib/ # Final stage for app image FROM base # Install packages needed for deployment RUN apt-get update -qq && \ apt-get install --no-install-recommends -y curl libvips postgresql-client && \ rm -rf /var/lib/apt/lists /var/cache/apt/archives # Copy built artifacts: gems, application COPY --from=build /usr/local/bundle /usr/local/bundle COPY --from=build /rails /rails # Run and own only the runtime files as a non-root user for security RUN useradd rails --create-home --shell /bin/bash && \ chown -R rails:rails db log storage tmp USER rails:rails # Entrypoint prepares the database. ENTRYPOINT ["/rails/bin/docker-entrypoint"] # Start the server by default, this can be overwritten at runtime EXPOSE 3000 CMD ["./bin/rails", "server"]
参考記事
作業手順
テンプレートリポジトリを作成したときに使ったコマンドを雑に列挙します。
概略
コマンド
brew update & brew upgrade rbenv install 3.2.2 rbenv rehash rbenv global 3.2.2 rbenv versions ruby -v gem update --system gem search -l rails gem search rails | grep "^rails (" gem install rails -N rails -v brew install postgresql gem install pg -v 0.18.4 rails new rails-api-template --api -d postgresql # 以下Gem初期設定 docker compose run web rails generate rspec:install docker compose run web bundle exec rails g rswag:api:install docker compose run web bundle exec rails g rswag:ui:install docker compose run web bundle exec rails g rswag:specs:install docker compose run web bundle exec rails g bullet:install docker compose run web bundle exec rubocop --auto-gen-config
今回はローカルPCでrails newを実行しましたが、dockerで実行してプロジェクトを作成することもできます。
感想
テンプレートができたので今後新しいプロダクトを作り始めるときの心理的ハードルが下がりました。
今回触ったGemに対して解像度が高まったように思います。
Dockerに関して、可能な限り自動で作成されたものを使用したかったのでかなり時間を使ってマルチステージビルド等の設定を調べましたがもう少し早めに見限って今の形にした方が良かったかもしれません。
どの道Dockerfileはプロダクトの環境に応じて書き直すことになりますしね。
この記事はkb advent calendar24日目の記事です。