いけむランド

はてダからやってきました

ruby-3.4.7 have been uploaded to the Cygwin distribution

ようやく cygwin setup.exe から ruby の (執筆時での) 最新安定版である 3.4.7 をインストールすることができるようになりました。*1

cygwin.com

そもそも、もう年末に 4.0 が出るのに今さら !? というツッコミがありそうですが

  • バイナリパッケージのマイナーアップデート対応はそれなりに調査するため、ある程度の時間がかかる。
  • 3.4.7 をリリースする前のバージョンは 3.2.2 だった。
    • 3.2 系は既にノーマルメンテナンスが終了 & 2026 年春が EOL のため、セキュリティ的に放っておくことはまずいかなと思っていた。
  • 関連パッケージのリリースも含めて最後にやったのが 2 年半も前であるため、ノウハウを本当にいろいろと忘れているから 4.0 に向けて思い出したかった。

あたりがこのタイミングでやった経緯になります。

ちなみに (当然ですが) いきなり 3.2.2 から 3.4.7 にアップデートしたのではなく、常日頃からパッチバージョンアップのたびに test 版として CI によるバイナリパッケージ化はしており、それをローカルにインストールして

  • SEGV しないか?
  • gem のインストールはできるか? *2
  • gem の内容物が変なパスにインストールされないか?

みたいな確認はしていました。

cygwin.com

www.cygwin.com

前回は本当に何もわからないところから調べて、手探りでパッケージ作成からテスト、配布までをかなりぶっつけ本番でやって、かなりドキドキしましたが、今回はパッケージのフラグを test から stable に変更するだけで、(上述の通り) mirror に配布済みのバイナリはローカルではある程度動くことは確認済みであったため、そこは気が楽でした。

それでも ruby の新しいバイナリパッケージの配布がやや億劫だったのは、その後に控える native extension のある gem ベースのバイナリパッケージのアップデートという怒濤の作業があったためです。

ruby 3.2 系向けにビルドしていたものはすべて 3.4 系に再ビルドする必要がありました。*3

とはいえ、こちらも事前準備はしていたため、version の変更 (とわずかな patch の付与) をした各 cygport レシピファイルを commit & push しては CI に丸投げすると、mirror への配布からアナウンス ML への連絡まで自動でやってくれるため、何かの合間にちょいちょい git コマンドを入力するだけで困ることはありませんでした。*4

この作業の最初に CI のビルドスクリプトの方で gem コマンドが必要であるという旨をレシピ内に記載しているにもかかわらず rubygems をデフォルトでインストールしてくれないという考慮漏れがあったため、PR を出して対応してもらいました。

github.com

latest ではない ruby マイナーバージョンへの依存があるもののリストは公式がパッケージメンテナ向けに setup.ini から自動的に生成してくれます。そのため、更新忘れがないかはここでチェックできました。

cygwin.com

作業が終わって、ML にバグ報告も流れていないから大丈夫だろうと思っていたら、本家の方で CI がコケていました。

github.com

調べてみたら、こちらも rubygems パッケージをインストールしないといけなくなっていたということだったため、PR を投げました。

github.com

ruby 3.2.2 の時は ruby バイナリパッケージが rubygems パッケージに依存していることになっていた *5 ため、rubygems パッケージも一緒に CI の setup でインストールされていたのですが、ruby 3.4.7 では依存がなくなっている *6 ため、rubygems パッケージを明示しないといけなくなったというオチでした。

とりあえず、これでいきなりメジャーバージョンアップという、修羅の道を歩まないといけない危険性はなくなったのでヨシッ!

*1:阻害要因が解消してから、しばらくあとのこのタイミングになったのは主に Vana'diel のせいです。

*2:長らく gem での native extension のインストールができなかったことが 2 年半というブランクの主な原因ではあります。

*3:その数なんと 33

*4:要するに時間だけがかかるやーつ

*5:そもそもパッケージ作成当時にこのような依存ができていることを自分は認識していませんでした。今思うと、現パッケージのようにない方が適切な気がします。

*6:ここらへんは自分でいじっていないため、おそらく cygport が「rubyrubygems に依存しない」と判断するようにパッケージ内容物が変わったせいだと思われます。