MAGAZINE

ルーターマガジン

Ruby

bundler 2.0.1に潜む落とし穴

2022.04.20
Pocket

Ruby開発にbundlerはつきものでしょう。この記事の読者の皆様はきっと新しめのbundlerを使って開発を進めていることと思います。

ところで、ひと月ほど前にGitHubがgit://ではじまるプロトコルを廃止したことをご存じでしょうか? これはGitHubのブログでも紹介されているように、ある程度段階を踏んで進められていた計画で、2022/03/15をもって廃止が永続的なものとなったということでした。

これとbundlerにいったい何の関係があるのかとお思いになったでしょうか。

事のあらまし

ご存じの通り、bundlerは1.x系と2.x系でGitHubショートハンドを用いたGitHubリポジトリからのGem導入の挙動が異なります。 gem "rack", github: "rack/rack"のような記述の時です。

参考: Announcing Bundler 2.0

1.x系まで
既定でgit://で始まるURLを見に行く
2.0から
既定でhttps://で始まるURLを見に行く
ということでした。

ちょうどそのころbundler2.0.1を利用しているプロダクトに参加していて、私もこの間の03/15まで(正確には一日だけgitプロトコルが止めれられた01/11ですが)、gitプロトコルの廃止は自分にはあまり関係ないことだと思っていました。しかしどういうわけでしょうか。bundler2.0.1で実行したbundle installは見事に例外終了してしまいました。

fatal: remote error: 
  The unauthenticated git protocol on port 9418 is no longer supported.
Please see https://github.blog/2021-09-01-improving-git-protocol-security-github/ for more information.

原因

バージョン2.0.1より上のものを使っているプロダクトでは問題が生じていなかったこともあり、2.0.1が悪いのではないかという予想が立ちました。 実際、bundler2.2.7などで再現するか確かめてみたところ、こちらでは問題なく完了しました。

ちなみに、異なるバージョンのbundlerを触るときはbundle _2.2.27_ installなどと指定できたりします。

早速bundlerのリポジトリを見に行きましょう。CHANGELOG.mdの2.0.1あたりを読んでみると、一つ上の2.0.2の変更ログになにやら怪しいことが書いてあります。

Fixed an issue where the github source was not using https by default that we mentioned in the 2.0 release (#7182)

https://github.com/rubygems/bundler/blob/master/CHANGELOG.md#202-2019-06-13

2.0リリースのgithub参照のデフォルトがhttpsになっていなかった問題の修正とのこと。issueではマージのミスのようにも記されているようですね。実際のコードはこのような感じでした。

さらに、 などから、2.0.1までは1.xの時と同様、configのgithub.httpsの値を参照し、2.0.2からは自身のメジャーバージョンが2以上であることを条件として分岐が行われているようでした。

結論

長々と書きましたが、bundler2.0.1まではGitHubショートハンドを使う場合、デフォルトではgit://から始まるURLを見に行くということです。もし現在2.0.0や2.0.1を使っていたり、1.x系からバージョンを上げること検討しているなら2.0.2以上を検討することをおすすめします。

なお、bundler2.0.1でgitプロトコルの廃止に立ち向かう方法は1.x系と同様で、github.httpsのフラグを立てるか、2.0.2以上にバージョンを上げることになると思われます。

bundle config github.https 1
Pocket

CONTACT

お問い合わせ・ご依頼はこちらから