actions/setup-ruby が archived になっていた

GitHub Actionsでrubyを使うにはどうすればいいかということでハマった経緯から、以前いくつか記事を書きました。

mstshiwasaki.hatenablog.com

mstshiwasaki.hatenablog.com

この話は ruby/setup-ruby が登場した段階で実質的に完了したと捉えていて、後はいつ actions/setup-ruby が deprecated になるのかのかとしばらくwatchしていたものの、相変わらずGitHub側のactionが遅かったので途中からwatchを外してました。

そんな中、先週ruby-jpのSlackを除いたらCIチャンネルで actions/setup-ruby がarchivedになったことを知りました。

github.com

ということで、しばらくwatchしてなかったのでその間の動きをざっとチェックしてみました。まず、前回記事までのあらすじはこんな感じです。

  • GitHub Actionsとしては各言語は公式が提供するバイナリを各プラットフォームのVMがダウンロードすることを想定していた
  • だが、RubyPythonはそれが難しいので事前にVMに含めるというアプローチをとった
    • actions/setup-ruby はこの事前にインストールされている各バージョンのRubyにパスを通すことをしているだけ
  • このアプローチにより、VM側でRubyが更新・新規追加されるまで新しいバージョンが使えないという問題が発生
  • 大半のユーザはそんな事情を知らないので actions/setup-ruby に「最新のRubyが使えない!」という苦情・要望が溢れる
    • しかもパッチバージョンは最新のものしかサポートしてないので「勝手にパッチバージョンが上がって困る」などの意見も出る
  • actions/setup-rubyRubyコミッターがメンテナとして入って改良しようという案も出たが、GitHub Actions Team側としては難しかった模様
  • Rubyコミッターのeregonがビルドされたrubyバイナリをビルド&インストールするactionを作り、ruby/setup-ruby としてオフィシャルのrubyバイナリが提供されることになった
    • 実務的にはもうここで移行してしまえば完了

このruby/setup-rubyが出たタイミングで2020/04にはdeprecateする方向性が打ち出されてました。

github.com

この時点でstarter workflowは ruby/setup-ruby を使うようになっていたようなので、この時点から後で新規にGitHub ActionsでRubyを使う人は最初から ruby/setup-ruby を使っているかもしれません。

github.com

その後、本件を主導していた eregon からも2020/08にはdeprecatedにしようというissueが立ち、

github.com

2020/10には再度GitHub Actions Teamと思われる人からdeprecatedに向けて動くというコメントがつきました。

これを受けて、2020/11になってVMの構成を管理している actions/virtual-environments リポジトリLinux / macOS / Windows のそれぞれで ruby/ruby-builder (ruby/setup-ruby がインストールするバイナリをビルドしているaction)が生成したバイナリをVMにプリインストールするためのPRが出されて、マージされています。

github.com

github.com

github.com

Windowsについては actions/setup-ruby でも議論に参加していた MSP-Gregruby/ruby-builder で生成されるバイナリを使うことについてissueを立てていたようです。

github.com

ruby/setup-ruby が出来てからも actions/setup-ruby のREADMEは相変わらず ruby/setup-ruby については触れられていなかったので、上のあらすじで挙げたような問題に遭遇する度にissueやPRが立っていたのですが、これらにコメントして ruby/setup-ruby の利用を促していたのも、主に eregonとMSP-Gregでした。ほんとお疲れ様でした。

さて、ここで「GitHub側が想定してようにコミュニティ公式のバイナリが提供されるようになってVMにも入ったんだったら actions/setup-ruby を引き続き使うのでもいいんじゃないの?」という疑問が沸くかもしれません。しかし、VMで用意しているのは各バージョンで最新パッチバージョンのものだけです。パッチバージョンまで含めて全部入れていたらVMのサイズが肥大化してしまいますからね。

actions/setup-ruby としては、ここで actions/setup-node みたいにtoolcache に無かったら公式から落としてくる機能をつけるという手も選択肢としてはあったんだろうと思います。しかし、またここで actions/setup-ruby が復活となるとユーザに更なる混乱が生じたことでしょう。似たような機能のactionを併存させず、ruby/setup-ruby を推奨するという判断は正しかったんじゃないでしょうか。ruby/setup-ruby.ruby-version への対応やインストールしたgemのキャッシュなんかも対応してくれてますしね。

こうして、晴れて全プラットフォームのVMRubyコミュニティが提供する公式バイナリに一本化された後で、actions/setup-ruby はarchivedされました。引き続きactions/setup-ruby を使っても、ruby/setup-rubyに乗り換えても使われるバイナリは同じということになりますから、丁寧な移行ですね。action実行時にdeprecatedのメッセージが出るようになったので、これまで ruby/setup-ruby の存在を知らなかった開発者も乗換えをしているようです。VMのtoolcacheに入っているRubyバイナリは actions/setup-ruby を使わなければ自力でPATHを通さない限り使われることはないはずなので、今後新しくVMとして追加されるOSでは toolcacheにそもそもRubyが入らない(必要無い)ということになるかもしれません。