こなさんみんばんわ。
音楽系の話は多少ネタはあるんですが、どれも 2 月に入らないと進展がなさそうなので、もうしばらく技術ネタで埋めてみようかと思います。

で、今回は長いことやってなかった homebrew で入れたライブラリのアップデート作業をしたらこのサイトの開発環境に問題が発生してしまい、それを直すために色々やってみたけどさらに深みにハマり、最終的にはあきらめて応急処置を施すだけにした、という話を書きます。どんなん😭

あとは本質的な解決策を今後どうやって取っていこうかな、みたいな内容ですね。

brew upgrade したら jekyll build が終わらなくなった

先日ふと「そういえば最近 brew upgrade とか全然してないなぁ」とか思い出しまして、何も考えずにおもむろに brew upgrade しましたら、けっこうな数のパッケージが更新されたんですね。

その日はそれだけで作業を終わりにしたので何とも思ってなかったんですが、今日になってブログを書こうと思ってローカルの開発環境を立ち上げたら、一向に jekyll build が完了する気配がない😭
なんかずっと Rebuilding index... という表示のままで止まっています。

ああ、これはいつか見たことがある症状だ、そうですよ、去年の 2 月に関連記事を表示させるために何やかんややった時に、試しに rb-gsl を入れずに --lsi オプション付けてビルドしてみたら 2 時間以上経っても終わんなかった、あの時の状況と一緒ですよ。

調べたら GSL のバージョンが v2.8 になっていた

先週くらいまでは普通に動作してたものが動かなくなった訳ですから、どう考えても先日の brew upgrade が何らかの影響を与えていることは間違いなさそう。そして --lsi オプションで止まるということは rb-gsl に関係するライブラリ…って GSL しかないですが…に何か原因があるのではないかな、と当たりをつけました。

ということでチェックしてみると、brew upgrade 実行後のバージョンは v2.8 になっていることが確認できました。Release History を読むと、このバージョンがリリースされたのは昨年の 5 月。2 月に新規で rb-gsl をインストールしたのはそれより前の話ですから、上の履歴からその時のバージョンは v2.7 だったというのも想定できます。

で、rb-gsl は native extension を必要とする gem ですから、GSL がアップデートされたことで既存の native extension が動作しなくなり、そのせいで Jekyll は rb-gsl を使えず、それでも関連記事用のインデックスを作ろうとするので時間がかかる = いつまで経ってもビルドが終わらない、という流れではないかなぁ…と考えられます。

再ビルドのために rb-gsl を一旦削除…したのが運の尽き

GSL のバージョンが上がったことで native extension が動作しないのなら、新しい v2.8 を使用する native extension をビルドし直せば解決しそうな気がします。そう思いまして一旦 rb-gsl を削除することにします…が、bundler でプロジェクト用にインストールした gem ってどうやって削除したらいいん?😅
そういえば一度もそんなシチュエーションに陥ったことがなかったですね。

分からなかったので調べてみましたら、こうするらしいです。へー。ちなみにどこのサイトで見かけたかは失念しました…

bundle exec gem uninstall rb-gsl

これであらためて bundle install して rb-gsl を入れれば、v2.8 の GSL を使って native extension を作り直したものが入るはず!

と思ったら、make でコケてインストールが完了しませんでした😱

解決方法がさっぱり分からない(ていうか、ないかも)

ビルドのログファイルが保存されているそうなのでいちおう見てみましたが、C 言語で書かれたライブラリのビルドとかまったくの門外漢なので、それを見たところでじゃあどう修正すればビルドが通りそうか? などが分かるはずもありません😭1

かといって Web 検索で探してみても、同じような事象に遭遇してこうしたら解決した、というような事例は全然出てきません。唯一出てきたのは classifier-reborn でも推奨となっている Numo に変更したというブログ記事ですが、このサイトでその手法を取るためには色々と懸案事項があってこのあと補足で説明ハイではすぐにそうしましょう! という訳にもいかんし…

長年メンテされてない rb-gsl に修正が入ることは期待薄

これが活発に開発がされている gem であれば、issue を出したりすれば開発チームが手を入れてくれる可能性はありますが、そもそも rb-gsl という gem 自体もう何年もメンテナンスされておらず2、いくらお願いしたところで v2.8 に対応した修正版がリリースされることはまずなさそう…というのが現実かと思います。

そうなると、あとは自分でフォークして修正して…しかありませんが、そんな腕はない。涙

もう詰んだので、数時間前にロールバックして応急処置

仕方ないので、作業を続けて何とか v2.8 に対応させるというのはもうあきらめることにしまして😭
かといって、このまま放置していては今後の更新も立ち行かなくなるので、何とかローカル作業がまともにできる状態にまでは復帰させないといけません。

ということで、次のような応急処置を行いました。

  1. Time Machime バックアップから $HOME/.rbenv/versions/2.7.2 以下を rb-gsl を削除する前の状態に戻す(念のために bundle install もかけた)
  2. このままではまた jekyll build が終わらない状態に戻ってしまうので、_config.yml から lsi: true の行を削除して LSI を無効にする
  3. 今度はこのままだと Netlify(デプロイ先)でも LSI 無効のままビルドされてしまうので、package.json の jekyll build を走らせるための npm script に --lsi オプションを追加する

今回は単にローカル環境がおかしくなっただけで Netlify 側には何の影響もありませんから、とりあえずここまでやれば少なくともデプロイ先にはちゃんとした関連記事リストが入ったページが出力されます。ローカル環境で関連記事がまともに表示されない点は、当面目をつぶっておくしかありませんね。

補足: 今すぐ Numo を使えない理由

本来であればこんな応急処置ではなくて、推奨されている Numo の方を使うように変更するのが一番いいとは思います。でもこのサイトはデプロイに Netlify を使っているので、Netlify のビルド・イメージに依存ライブラリ3が入ってないと、いくらローカルで大丈夫でもデプロイができないという状態になってしまうんですよね…

で、少なくとも現在使用している Focal イメージ(Ubuntu 20.04 ベース)には、デフォルトでこの 2 つが入ってないことがその Dockerfile から確認が取れます。より新しい(今後デフォルトになる)Noble イメージ(同 24.04 ベース)に関しては、言語やツール類の確認は取れるものの、ライブラリに関しては情報がなくてまったく分からない状態です。

そんな感じなので、Numo に乗り換えるにはローカル側の作業以外にも、ライブラリ関係で超えないといけない壁がたくさんありまして、ちょっとこの短期間では簡単に移行という訳にはいきませんでした(´・_・`)

とはいえ、このまま放置していても問題は解決しませんし、Focal イメージのサポートは 2025 年 4 月までと宣言されており、いずれは乗り越えないといけない壁ですから、ここから先は時間を見つけては、少しずつ移行作業の段取りを進めておかないといけないなぁ、とは思っております。

まぁその辺の話はいずれ後日。

そんな訳で

本日は brew upgrade で思わぬ GSL のアップグレードが発生してしまい、その影響で Jekyll の --lsi オプションに問題が起きて元に戻すまでに苦労した! という話でした。

まぁウチはすでに rb-gsl を入れていたのでこうなりましたが、この先もし Jekyll でサイトを作るとなった場合 homebrew では GSL v2.8 以降しか入れられないと思うので、今後はもう関連記事表示のためには Numo を使いましょう!FA ということでいいと思います。

とりあえず、色々と大変だったのは確かで疲れました。いやー最近ブログを更新できてなかったのも実はこれが原因…すみません今嘘つきました、これは単にやる気が出んかっただけ。涙

  1. どの辺でエラーが出てるか? くらいは分かりましたよ、“error” ってキーワードで検索するだけなので。涙 

  2. だからこそ classifier-reborn のドキュメントでも Numo の方を使ってくれと書かれている訳ですが。 

  3. LAPACKEOpenBLAS