distributed buildについて

typesafe社が(これ書いている2014-02-23現在) closed sourceで開発してるソフトウェア
を勝手に紹介する謎エントリです。

追記: 2014-09-22にオープンソースになったようです!
https://github.com/typesafehub/dbuild


現状ソースはclosedだけれど、以下のサイトでドキュメントは公開されてます。また、jarがあるリポジトリもpublicです。なので、ソースがclosedなだけで、使おうと思えば誰でも使えます

http://typesafehub.github.io/distributed-build

http://repo.typesafe.com/typesafe/temp-distributed-build-snapshots/com.typesafe.dbuild


おもにScala2.11の開発において、バグの早期発見のなどのために役立てているみたいです。開発始まって、使われ始めたのもたぶんここ一年くらいだと思います。その設定ファイルも公開されてます。jsonっぽい形式です。*1

https://github.com/typesafehub/community-builds

scala-internalのメーリングリスト読んでると、けっこう頻繁にでてきます。なんでclosedなソフトウェアの解説書いているかというと、twitterScala開発者の人がtweetしてたり

積極的に宣伝していないとはいえ、全く隠す感じではないし、ソース以外のバイナリやドキュメントはpublicだし、(全く勝手な予想ですが)ソースの公開も時間の問題だと思うからです。



さて、そもそもどんなソフトウェアなのか?というと
「並列に、複数のプロジェクトをまとめてビルドする」
ためのソフトウェアです。
「Scala2.11の開発において、バグの早期発見」
と書きましたが、もう少し具体的にいうと

  • ScalaのSNAPSHOTをビルド
  • その後 https://github.com/typesafehub/community-builds で設定されている主要なScalaのライブラリを、そのSNAPSHOTのScalaでビルド
  • それらはもちろん依存関係があるわけだが、独自に依存グラフを解析する機能とかもあるみたい
    • たとえば、community-buildsの設定ファイルには、scalazとspecs2両方書いてある
    • specs2はscalazに依存してるので、scalazをビルドしてからspecs2をビルドする
  • sbtのマルチプロジェクトになっている場合に、特定のプロジェクトのみをビルドする、テストを実行するかしないか?などの、様々な細かい設定ができるらしい
  • おそらく、それぞれのプロジェクトをビルドするためのsbtのversion自体も独自に変更できるみたい?


そして、その「主要なライブラリをSNAPSHOTのScalaでビルドする」というのが、jenkinsで自動化されているようです。
https://jenkins-dbuild.typesafe.com:8499/



また、そのビルドの結果によってなにをしているのかというと

  • 意図せずソース互換が崩れてしまった場合(つまりScala本体側のバグが見つかった場合)は、早期にバグ発見して直せるというメリットがある
    • できるだけ多くのサードパーティのライブラリを最新版で自動ですぐにビルド*2することにより、Scala本体のバグ発見の確率が上がる
  • ソース互換が崩れたとしても、Scala2.11のSNAPSHOTの変更のほうが正しく、クロスビルドするためにライブラリ側のコードを修正するべき場合は、Scala開発者の人自らライブラリにpull reqを送る

ということが行われています。Scalaz始め、いくつかそういった「Scala開発者の人が自らpull reqする」というのを個人的に観測しています。たとえばこの前書いたこれ

SI-7475 アップキャストするとコンパイル通るようになるのが気持ち悪い

を最初に知ったのも、Scala開発者の人が、scalazにpull reqを送っていたからです。また、internalのMLでも
「dbuildでこの件(SI-7475)に関して、ソース互換崩れるライブラリが見つかったよ(akkaとscalaz)」
というような話題がでてたりします。

https://groups.google.com/d/topic/scala-internals/h8ztMqw-3Xg/discussion
https://github.com/akka/akka/pull/2006



と、まあ、Scala2.11の開発では、Scala2.10のときにはやっていなかった面白い試みがされているわけです。


また、このdbuildというソフトウェアは、Scala本体の開発者が使うだけでなく、
「新しいScalaのversionに対応したバイナリがpublishされてない」
ライブラリに対して
「ユーザーがソースからビルドする」
のに使えるのではないか?と思うのですが、どうなるんでしょうね。


たまに

  • Scalaはversion毎に互換がない
  • versionあげるときに、それぞれの依存ライブラリが新しいversionのScalaでpublishされてるか、など考えないといけなくて面倒

という話の流れで
「毎回ユーザー側で、すべてのライブラリをソースコードからビルドすればいいじゃん!」
という案がでることがあります。
で、それは確かに不可能ではないのですが、うまくいくか微妙だし、自分が知る限りScalaにおいて誰もその方法をあまり真面目に試した人は見たことありません。
しかし、
dbuildはある意味それをすでに実現できている


気がします。まぁソースはclosedだし、実際自分はまだ試してないのでどのくらいその辺り柔軟性があるのかわかりませんが。


はやくopen sourceにならないかなぁ・・・。migration managerというtypesafeが以前しばらくclosedで作っていたソフトも、結構後になって公開された経緯があります。
たぶんこのdbuildも、それほど誰もが使うようなソフトウェアではなく、わりと特殊な用途でまだ完成度が高くなく、公開しても面倒が増える割にはそこまでメリットがない?という判断なのでしょうかね。

*1:jsonっぽいけど、スラッシュ2つでコメント書いてあったりするのでjsonじゃないみたい。たぶんtypesafeのconfigの形式かな?

*2:milestoneやRCのリリースをしてから、それぞれのライブラリ作者がビルドするより、かなり短いサイクルで