Scalaの依存ライブラリ更新はRenovateでもけっこうイケる

この記事は, はてなエンジニア Advent Calendar 202020日目です. 昨日はid:Pasta-Kによるウェブブラウザにバグ報告をするときにやることでした. 明日の担当はid:motemenです.

Scalaで, 依存ライブラリのバージョンを上げるpull requestを自動的に作ってもらうソリューションとしてはscala-stewardがあります. ScalaのことはScalaでやるのが確実そうなので安心感がありますね. ただ, scala-stewardを自分でホストするのは面倒だし, かと言ってGitHub Actionsで動くようにするのもそれなりに面倒なようです.

Scalaに特化しない方法としてはRenovateがあります. これはいろんな言語のライブラリ等のバージョンをぜんぶ面倒見てくれてべんりです. GitHub Appsになっているのでポチポチ設定するだけで導入できます. 考えてみれば, ScalaのプロジェクトだってどうせDockerfileなども置いたりしているだろうし, Scalaのライブラリのバージョンだけ上げられればいいということの方が稀だと思います. だったらぜんぶRenovateに任せてしまえる方がいい. 不安要素としてはScalaに対するケアがどれくらい行き届いているか.

この記事では, Scalaで書かれたプロダクトで実際にRenovateを使ってみて行き当たった不安要素と, その解決を見ていきます.

バージョンを変数で定義している場合

ScalaおよびJavaのライブラリは, 細かく分割されている中からいくつか使い, それらは同じバージョンを指定して揃えたいということがよくあります. そうすると同じバージョンを何回も書きたくないのでいったん変数(定数)として定義してから使うことになるでしょう. こういう感じに.

val CirceVersion = "0.13.0"
    libraryDependencies ++= Seq(
      "io.circe" %% "circe-core" % CirceVersion,
      "io.circe" %% "circe-generic" % CirceVersion,
      "io.circe" %% "circe-generic-extras" % CirceVersion,
      "io.circe" %% "circe-parser" % CirceVersion,
    ),

このパターン自体は, Renovateのsbt対応が入ったときにサポートされていましたが, scalaVersionの指定で変数を参照している場合は考慮されないという問題がありました.

最初そこで諦めて「scalaVersionを変数に書いてる場合に対応してないからRenovateダメだわ」と, 同僚であり社内でRenovate推し活動をしていたid:ikesyoに愚痴ったところ, なんと彼が対応するpull requestを出してくれました!


リッチな差分の表示

そこまでしてもらったら使わないのも申し訳ないのでチームでRenovateを使いはじめました. 使ってみてわかったのは, Scalaのライブラリの場合だと, リリースノートの情報やソースコードの差分へのリンクをpull requestに表示してくれないため, バージョンを上げても大丈夫かどうかの判断材料を探しに行くのがかなり手間ということでした.

たしかに, GitHub等から直接インストールするわけではないので, バージョンの情報からソースコードの差分やリリースノートに辿り着くのは難しいよな...... いや待てよ, POMにSCMのURLとかあるからそこから復元すればいけるでしょ. と考えてちょちょいとスクリプトを書いてみたらイケそうでした. ここまできたら, あとはこれをTypeScriptで書いたらいいだけ. ということで自らpull requestを出しました.

こういう感じで出ます.

あとでscala-stewardのソースコードを見たらだいたい同じようなことをしてそうでした. POMの情報の取得はCoursierに任せていたりしてちょっとずるい羨しいなという気はしましたが.

実際に使ってみてどうか

べんりに使えています. 細かい不満としては以下くらいでしょうか.

  • GitHub上にソースコードがある場合でもリリースタグの命名規則が揺れていてうまく差分を取れないものがある
  • ライブラリのサイトのトップページ以外の情報がない場合がある
    • とくにJavaのライブラリ
    • scala-stewardでも同じ問題があるはず
  • project/build.propertiesは更新してくれない気がする
    • プルリクチャンス!!!

あるいはFAQとしては以下がありそうですが、大丈夫そうです.

  • Q. project/plugins.sbtも更新してくれるの?
    • A. してくれます
  • Q. .sbtを分割してても大丈夫?

Scala界隈で激しく使うともっと細かい不満がいろいろ出てくる可能性はありますが, そういう場合はpull requestを出して改善していきましょう!

あと言っておきたいこととしては, みんなライブラリを公開するときはPOMの<scm>とか<url>のところはちゃんと埋めようね, そしてリリースタグはvなんとかで打ちSemantic Versioningに従おうね, ということくらいです.