はじめに
とあるSaaSの会社に入社し、入社後すぐにRailsのプロダクトを1人で見ていくことになったときのお話。記事のタイトルどおり、すでにそのプロダクトのPostgresqlにpg_bigmという拡張機能が入っていて、CircleCi上でビルドする際にかなり苦戦したので、その時の対応手順の備忘録を記す。
壁1:ビルド中のマイグレーションに失敗
まずは普通にCircleCiの公式サイトを調べて、config.ymlを書いてみる。
すると、マイグレーションの部分で躓く。
Caused by:
ActiveRecord::StatementInvalid: PG::Error: ERROR: operator class "gin_bigm_ops" does not exist for access method "gin"
: CREATE INDEX CONCURRENTLY item_keywords_bigm_idx ON item_keywords USING gin (keyword gin_bigm_ops)
一次対応
まずはエラーの意味を解釈。
「pg_bigmのインデックスを貼りに行こうとしたが、その途中でメソッドが存在しないからコケた」
で、そもそもpg_bigmってなにか?このプロダクトにおいてはどうやって導入されたのかを調べてみる。
pg_bigmを認識する
シンプルに言うと日本語の検索を早くしてくれる拡張機能。Postgresqlに標準に搭載されているものではなく、自らPostgresqlにインストールして有効にし、テーブルの日本語カラムにpg_bigmのIndexを貼り、データ検索を高速化できる。似たようなものにpg_trgmというものがある(日本語の検索にはあまり優れていない)
なるほど。Railsレベルではなく、Postgresqlに直接なにかを施したものか。
このプロダクトもおそらくそういう経緯があったのだろう。つまりは、DBイメージに対して、pg_bigmをインストールし、有効にしてやる必要があるらしい。
二次対応
どうやって、CircleCi上にpg_bigmを入れるか。
=> Ci上のcommandで、wgetから拡張ファイルをインストールして、展開、導入するか
まずはMultipathを自分のMac(M1)に導入し、今試行錯誤するために、CircleCi上で使っているDockerのrubyのイメージとPostgresqlのイメージを導入してpg_bigmの導入を試してみて、うまくいくコマンドの黄金ルートを検証する(導入方法:https://pgbigm.osdn.jp/pg_bigm-1-2.html)
壁2:インストールはできているが有効化されない
結局同じエラーに引っかかる。でも、ログを見たところインストール自体はできている。
CREATE EXTENSION
name | default_version | installed_version | comment
---------+-----------------+-------------------+------------------------------------------------------------------
pg_bigm | 1.2 | 1.2 | text similarity measurement and index searching based on bigrams
confファイルに
shared_preload_libraries = 'pg_bigm'
の記述をした後に、再起動が必要っぽい。だが、CircleCi上のDBイメージに対してで再起動なんかするものなのか?
コマンドを試し、色々調べたが、あんまりそういう例が出てこないことから、別の方法を探す。
基本的にクソほど調べて、自分が思うような対応方法でカスリもしなかったら、そもそもソリューションの方向性が間違っていることが多い。
3次対応
コマンドでCircleCi上のDBイメージにpg_bigmを入れることをベースにしたソリューションを考えていたが、発想の転換して、「もともとpg_bigmが入っているイメージがあったりしないだろうか」と考えた。こういう脳に切り替えた後、情報の見え方が違う。何なら自らイメージを作ってDockerHubにアップする人もおったりする模様。今回自分は「maruta/postgresql-bigm:9.4-bigm1.2」というイメージが自分のプロダクトに完全に一致していたのでこちらを採用。するとうまくいった!!