Scalaの依存ライブラリ更新はRenovateでもけっこうイケる
この記事は, はてなエンジニア Advent Calendar 2020の20日目です. 昨日は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上にソースコードがある場合でもリリースタグの命名規則が揺れていてうまく差分を取れないものがある
release-なんとか
というパターンは対応したけどキリがないので他は諦めた- scala-stewardでも同じ問題があるはず?
- ライブラリのサイトのトップページ以外の情報がない場合がある
project/build.properties
は更新してくれない気がする- プルリクチャンス!!!
あるいはFAQとしては以下がありそうですが、大丈夫そうです.
- Q.
project/plugins.sbt
も更新してくれるの?- A. してくれます
- Q.
.sbt
を分割してても大丈夫?- A. 大丈夫そうです
Scala界隈で激しく使うともっと細かい不満がいろいろ出てくる可能性はありますが, そういう場合はpull requestを出して改善していきましょう!
あと言っておきたいこととしては, みんなライブラリを公開するときはPOMの<scm>
とか<url>
のところはちゃんと埋めようね, そしてリリースタグはvなんとか
で打ちSemantic Versioningに従おうね, ということくらいです.