[Astro #21] Warnings 0への執念:500記事のMDX浄化とGitHub Actionsでのrimraf罠

[Astro #21] Warnings 0への執念:500記事のMDX浄化とGitHub Actionsでのrimraf罠

はじめに

HugoからAstroへの移行を終え、500記事以上のMDXファイルが稼働する当サイト(lain-lab.com)。 しかし、ビルドログには常に大量の警告(Warnings)が吹き荒れていた。「ブロックチャンク」「不揃いな括弧」などのLaTeXやShikiによるパースエラーの残骸たちだ。

「この警告を全部潰せば、Astroのビルドは劇的に速くなるのではないか?」

そう思い立ち、朝4時から全記事の微細な不備を修正する「大掃除」を開始した。
これが今年一番不毛な半日の幕開けになるとも知らずに……。

1. 500記事の「文字の泥沼」を這う

Astroへの移行後、ローカルで npm run build を叩くたびにターミナルを埋め尽くす「黄色い警告(Warnings)」の奔流。それはまるで、整理されていない屋根裏部屋で常に何かがきしんでいるような、形容しがたい居心地の悪さでした。

「これをすべて消し去れば、ビルドプロセスは最適化され、爆速の静寂が訪れるのではないか?」

そんな淡い期待を胸に、500記事を超えるMDXファイルという名の「泥沼」に足を踏み入れました。

執念の「ノイズ」除去

修正すべき対象は、数年間の蓄積が生んだ多種多様な不純物です。

  • 全角スペースの潜伏: コードブロック内に紛れ込み、Shiki(シンタックスハイライター)の解析を狂わせる「見えない敵」。
  • LaTeXの構文エラー: $ ... $$$...$$ の使い分けミスや、エスケープ漏れ。特にKaTeXが解釈できない記述があると、ログには「不揃いな括弧」や「謎の記号」が吐き出され続けます。
  • Shikiのパース不能: 特定の言語指定や、特殊な記号の組み合わせでハイライトが停止してしまう箇所の特定。

これを、VS Codeの正規表現置換と、最後は執念の目視によって一ファイルずつ「浄化」していきました。ファイル数が多いだけに、一箇所を直してはビルドを回し、また別のエラーを見つける……その繰り返し。

訪れた「静寂」、そして非情な数字

数時間に及ぶ格闘の末、ついにその瞬間が訪れました。ターミナルには黄色い文字が一行も現れず、ただ白いログだけが淡々と流れていく。完全なる「Warnings 0」の達成です。

溢れんばかりの期待と共に、ストップウォッチを確認します。 「これだけノイズが消えたんだ、さぞかし速くなったことだろう」

ビルド時間:1分9秒

……。 警告が大量に出ていた昨日と、コンマ一秒の狂いもなく同じタイムでした。

エンジン内の異音をすべて修理し、外装もピカピカに磨き上げたのに、最高速度が1km/hも変わらなかったような虚無感。時間は短縮されませんでした。けれど、この「不毛な努力」の後に、さらなる追い打ちが待っていたのです。

2. 最後の罠:CIで rimraf: not found

「ビルド速度は変わらなかった。けれど、コードの純度は上がった。これでいいんだ……」と自分に言い聞かせ、重い腰を上げてターミナルを叩きました。

gpush "fix: LaTeX and Shiki"

500記事の浄化を終えた達成感と共に、GitHubに全てを託してPCを閉じようとしたその時。GitHub Actionsのステータスは見事に、そして無慈悲に「赤色(Failed)」へと染まりました。

なぜローカルでは動き、CIでは落ちるのか

エラーログを確認すると、そこには耳を疑うような一行が。 sh: 1: rimraf: not found

原因は単純でした。ビルドコマンドの冒頭に入れていた rimraf dist。 ローカル環境では過去の遺産としてグローバルにインストールされていたり、古い依存関係の残骸として動いていた rimraf ですが、真っさらな環境で実行されるGitHub Actionsには、そんな気の利いたものは用意されていません。

「LaTeXの修正とは全く関係ないところでビルドが止まる」という、エンジニアなら誰もが一度は経験する、あの乾いた笑いが出る瞬間です。

【解決策:依存関係を減らす】

ここで再び npm install -D rimraf を叩くのは簡単です。しかし、今日という不毛な一日を経て、私は「これ以上、得体の知れない依存関係を増やしたくない」という極致に達していました。

そこで、Node.jsの標準機能だけでディレクトリを削除するように package.jsonscripts を書き換えました。

"build": "node -e \"fs.rmSync('dist', { recursive: true, force: true })\" && astro build --remote"

node -e を使えば、追加のパッケージなしでOSを問わず(WindowsでもLinuxでも)確実に dist を消し去ることができます。わざわざ rimraf というためだけに外部ライブラリを担ぎ出す必要などなかったのです。

この一行に書き換えたことで、ビルドパイプラインはより「純粋」で、より「堅牢」なものへと進化しました。

3. $0.35のアクションと、ログの静寂

修正を終え、祈るような気持ちで再び push を送りました。GitHub Actionsの画面を見守ること数分。無機質な黄色い歯車が回転を止め、鮮やかな「グリーン(Success)」のマークが灯りました。

ふと請求画面を確認すると、昨日からの格闘でGitHub Actionsが消費したマシンパワーは累計で「57分間」。かかったコストは、わずか $0.35。

日本円にして数十円。それが、500記事以上の泥沼を這いずり回り、私の半日を飲み込んだ「戦いの代償」でした。

数字には表れない「静寂」の価値

結局のところ、当初目的としていたビルド時間の短縮は叶いませんでした。ストップウォッチが刻む数字は、昨日と同じ「1分9秒」のまま。

しかし、その中身は劇的に変化しました。

  • 一切のノイズの消失: ターミナルを埋め尽くしていた「ブロックチャンク」や「不揃いな括弧」といった、パーサーの悲鳴はもう聞こえません。
  • 正確なインデックス: Pagefindが、一切の不純物を含まない37,555単語を美しくインデックスし、サイトの検索精度を盤石なものにしました。
  • 致命的なエラーへの即応性: ログが「無音」になったことで、今後もし本当にヤバいエラーが出たとき、ノイズに埋もれることなく一瞬でその異常に気づける環境が整いました。

結び:意味のない修正に宿る意味

一見すると見た目も速度も変わらない、本当に不毛な半日だったかもしれません。 けれど、技術的負債を完全にゼロにし、自分のブログの「土台」への信頼度を100%にするためには、避けては通れない儀式でした。

12:41。デプロイ完了の通知と共に、私の長い朝がようやく終わりました。

時間は稼げなかった。けれど、私は「秩序」を手に入れた。 この静まり返ったビルドログこそが、エンジニアである私への、そして $0.35 分のマシンリソースを使い切った自分への、最高のご褒美なのかもしれません。