mind.

学んだことの記録

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"]

参考記事

zenn.dev

作業手順

テンプレートリポジトリを作成したときに使ったコマンドを雑に列挙します。

概略

  1. Rubyのアップデート
  2. Railsのアップデート
  3. rails new
  4. 各種Gemの初期設定

コマンド

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で実行してプロジェクトを作成することもできます。

zenn.dev

感想

テンプレートができたので今後新しいプロダクトを作り始めるときの心理的ハードルが下がりました。
今回触ったGemに対して解像度が高まったように思います。
Dockerに関して、可能な限り自動で作成されたものを使用したかったのでかなり時間を使ってマルチステージビルド等の設定を調べましたがもう少し早めに見限って今の形にした方が良かったかもしれません。
どの道Dockerfileはプロダクトの環境に応じて書き直すことになりますしね。

この記事はkb advent calendar24日目の記事です。

adventar.org