4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ridgepoleの導入手順と使い方

Posted at

はじめに

自己紹介
 未経験からWEB系エンジニアへの転職を目指している者です。現在はRuby on Railsを学習中です。

この記事を書いたきっかけ
 現在、ポートフォリオとしてRailsアプリを開発している中でRidgepoleを導入したので、導入手順と使い方、自身が詰まったところなどを備忘録として残すため記事にしました。

動作環境

  • mac OS Sonoma 14.4
  • ruby 3.2.2
  • rails 7.0.7
  • mysql:8.0.34

目次

1. Ridgepoleとは
2. 導入手順
3. Ridgepoleの使い方
4. Ridgepoleを導入したらGithub ActionsのCIが通らなくなった話

Ridgepoleとは

公式リポジトリのREADMEを直訳すると以下のように書いています。

RidgepoleはDBスキーマを管理するツールである。
Rails DSLを使ってDBスキーマを定義し、DSLに従ってDBスキーマを更新します。

DSLとは
  • Domain Specific Languageの略称で日本語ではドメイン固有言語と呼ばれる
  • 特定の作業や問題解決を目的に設計されたプログラミング言語
  • :page_facing_up:DSLの解説

Railsではマイグレーションファイルでスキーマを管理できるのに、なんでRidgepoleが作られたんだろうと思ったので違いをまとめました。

<従来のRailsマイグレーション>

  • DBスキーマを変更する場合、新しいmigrationファイルを作成してそのファイルに差分を記述する
  • マイグレーションファイルが一つずつ順番に適用され、既に適用されたマイグレーションがある場合はスキップされる

<Ridgepoleを使ったマイグレーション>

  • DBスキーマの変更はSchemafile1つだけで管理する
  • Schemafileに記述されたスキーマ定義と実際のDBスキーマを比較し、差分がある場合にのみ変更を適用する

つまり、Ridgepoleを使うとスキーマが変更されるたびにマイグレーションファイルが増えることなく、1つのSchemafileでバージョン管理できて便利ということ。

導入手順

Ridgepoleをインストールする

Gemfileにridgepoleを追加する。
開発環境で使う場合は、group :development doブロック内に記述する。

Gemfile
group :development do
  # Github: https://github.com/ridgepole/ridgepole
  gem 'ridgepole'
end

dockerコンテナをビルドする。
念のため、Dockerfile内でRUN bundle installの記述があることを確認する。

$ docker-compose build

dockerコンテナに入る。

$ docker exec -it <コンテナ名> bash

Ridgepoleのバージョンを確認する。
ridgepole 2.02のようにバージョンが表示されればOK!

$ ridgepole -v

Schemafileを作成する

dbディレクトリ下にSchemafileを作成する。

$ touch db/Schemafile

現在のテーブル定義をSchemafileに書き出す。

$ ridgepole --config config/database.yml --export --output db/Schemafile

SchemafileのエンコーディングをUTF-8に設定するため、一番上の行にコメントを追加する。

Schemafile
# encoding: utf-8

SchemafileをDBに適用する。

$ ridgepole --config config/database.yml --file db/Schemafile --apply

# 変更箇所がない場合は"No change"と出力される。
Apply `db/Schemafile`
No change

不要となったschema.rbを削除する。

$ rm db/schema.rb

以上の設定で、Schemafileを使ってDBスキーマを変更できるようになりました!

Ridgepoleの使い方

SchemafileをDBに適用する方法

Schemafileを編集後、以下のコマンドを実行する。

$ ridgepole --config config/database.yml --file db/Schemafile --apply

Ridgepoleコマンドのオプション

Ridgepoleでよく使いそうなコマンドのオプションをまとめました。

オプション 短縮形 解説
--config -c DBの接続情報を含む設定ファイルのパスを指定する。
--file -f DBのスキーマ定義が記述されたファイルのパスを指定する。
--apply -a Schemafileに記述されたスキーマの定義をDBに適用する。
--export -e DBの現在のスキーマをSchemafileにエクスポートする。
--dry-run スキーマの適用をシミュレートし、発行されるSQLを見ること
ができる。変更は行われない。
--merge -m ローカルのSchemafileとDBのスキーマを比較してマージする。
--env -E マイグレーションを適用する環境を指定する。
development,test, productionが指定できる。

Ridgepoleを導入したらGithub ActionsのCIが通らなくなった話

Github ActionsでCIを実装しているのですが、Ridgepoleを導入したらCIに落ちるようになったので、備忘録として解決までの経緯をまとめます。

以下は、CIに落ちた箇所のログです。

/app/db/schema.rb doesn't exist yet. Run `bin/rails db:migrate` to create it, then try again. If you do not intend to use a database, you should instead alter /app/config/application.rb to limit the frameworks that will be loaded.
Error: Process completed with exit code 1.

エラー文を見ると、「rails db:migrateを実行しようとしたけど、/app/db/schema.rbがないよ!」と怒っています。
Ridgepoleを導入する際に消したのであるはずがないですし、そもそもマイグレーションの方法が変わったのでgithub-action.ymlの修正しないといけないですね。
Github Actionsごめんよ。
ということで、github-action.ymlを以下のように修正しました。
修正前

github-action.yml
steps:
	- name: DB migrate              # DBをマイグレート
		run: |
			docker compose run app rake db:schema:load

修正後

github-action.yml
steps:
	- name: DB migrate              # DBをマイグレート
		run: |
			docker compose run app bundle exec ridgepole --config config/database.yml --file db/Schemafile --apply

これで、もう一度Pushしたのですが今度はRSpecに落ちるようになりました。
エラーの詳細は省略しますが、「DBにテーブルがないよ!」と怒られました。
マイグレーションは成功しているのに、なぜテーブルが存在しないのか分からず詰まってしまいました。

結局自分では解決できず、友人に相談して分かったのですが、
ridgepole --config config/database.yml --file db/Schemafile --applyはデフォルトで開発環境のDBに実行されることが原因でした。
RSpecはテスト環境のDBを使うのでマイグレーションされてなかったということですね。
ということで、-Eオプションでテスト環境を指定します。
再修正後

github-action.yml
steps:
	- name: DB migrate              # DBをマイグレート
		run: |
			docker compose run app bundle exec ridgepole --config config/database.yml --file db/Schemafile --apply -E test

もう一度、Pushしたら無事CIに通りました!

まとめ

今回はスキーマ管理ツールのRidgepoleを導入する手順や使い方について解説しました。
初めて使うGemを導入すると躓くことが多々ありますが、少しずつでも自分で解決できるようになりたいです!
今後も開発に役立つGemがあれば積極的に使って,記事にしていければと考えています。

最後までお読みいただきありがとうございます!

参考

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?