はじめに
Webアプリケーションの開発をする時に、各種ライブラリを使うことは今では必須のことです。一方で、各ライブラリはそれぞれ頻度は異なるもののバグ修正やセキュリティ対応のようなメンテナンスが日々行われており、それぞれの対応ごとに新しいバージョンが公開されます。そして、この更新情報をキャッチアップし続けていくことはそれなりの工数を必要とします。そのため、これらの更新を人間に代わって行ってくれるソリューションはいくつかあります。例えば、Dependabotがそれですが、DependabotはScalaに対応されていないため、Scalaで開発をする場合には、その他のソリューションが必要となります。
scala-stewardとは
https://github.com/scala-steward-org/scala-steward
scala-stewardは、Scalaのsbtプロジェクトが依存するライブラリの更新があれば、アップデートするPRを自動作成してくれます。github-actionを利用することで、privateなレポジトリに対して定期実行をしてくれるbotとして動作させることができます。この記事では、scala-stewardを導入してみて、気づいたことをいくつか紹介したいと思います。
scalafmtの更新はするけど、フォーマットはしてくれない
https://github.com/scalameta/scalafmt
Scalaの有名なフォーマッタライブラリですが、このバージョンが上がった時も、scala-stewardは教えてくれます。しかし、scalafmtのデフォルトのルールが変わって、フォーマットを適用し直す必要があっても、scala-stewardはそこまではしてくれません。あくまで、バージョンを更新するPRを作るのみです。これは、フォーマットがかかっていないコミットに、CIでエラーとする設定をしている場合には、とても不親切に感じます。これについてはコミュニティの中でも、以下のIssueの中で議論がされている通り、そもそもフォーマットまでをすべきかどうか意見が分かれている状況でした。
https://github.com/scala-steward-org/scala-steward/issues/1056
最近、以下のPRでこのIssueが対応され、現在ではconfigで選択可能となりました。
https://github.com/scala-steward-org/scala-steward/pull/1673
バイナリ互換を考慮してくれない
例えば、akkaや、akka-httpは、それらに依存するライブラリ間で同じバージョンに依存している必要があります。しかし、scala-stewardは、そういった互換性を考慮してくれません。従って、こういった互換性の検知の仕組みがない場合には、うっかりPRをマージしてしまう危険性があります。これについては、以下に、Issueが上がっているため、将来対応される可能性がありますが、現時点で使用する場合には注意が必要です。
https://github.com/scala-steward-org/scala-steward/issues/815
なお、こういった互換性を気にする必要のあるライブラリはscala-stewardが無視するような設定が可能です。詳細はドキュメントを参考にしてください。
コメントに反応してしまう
以下のようなコメントを残しておいたりしていると、それに反応してしまいます。
- "com.typesafe.akka" %% "akka-http-spray-json" % akkaHttpVersion, // remove this line when akka-management will support akka-http 10.1.12
+ "com.typesafe.akka" %% "akka-http-spray-json" % akkaHttpVersion, // remove this line when akka-management will support akka-http 10.2.0
こちらもIssueには上がっているので、将来対応される可能性がありますが、コメントにバージョンを記載する場合は注意が必要です。
https://github.com/scala-steward-org/scala-steward/issues/1651
まとめ
実際に使ってみて、こうした考慮する点はあるもののライブラリの更新情報を自前で追いかける必要がなくなり、とても快適になりました。是非、導入してみることをお勧めします。