おじさんにしか受けないビルドの話をもうひとつ。ビルドを完全に再現するにはどうしたらいいかという話だ。
ひと月前にリリースしたバージョンに深刻なバグが報告されたとしよう。まず試してみるのはその問題が再現するかだろう。当該のバージョンで再現することがわかったら、最新のツリーで再現するか試してみる。これで再現できれば、とりあえずメインのブランチで直すところから始めればいい。
が、もし最新のツリーで再現しなければ、リリースしたときに作ったリリースブランチからビルドして問題を再現させなければいけない。これは一見、簡単そうだけど、ひと月前の状態と全く同じようにビルドするには案外むずかしいものだ。
たとえば、自分たちのツリーに入っていないコードはどうしたらいいだろうか?サードパーティのコードを静的にリンクしているなら、ひと月前と全く同じリビジョンを使う必要がある。これを一番シンプルにやる方法は、サードパーティのコードも全部自分たちのツリーに入れてしまうことだ。これならリリースブランチにすべて必要なコードが入っている。
が、これをやるとツリーがでかくなるので、サードパーティのコードのどのリビジョンを使っているか、という情報を記録してそれをツリーに入れておくという方法もある。この情報がリリースブランチに入っていれば、ひと月前と全く同じリビジョンを取ってきて使えるというわけだ。
コード以外の問題もある。ひと月前と現在では、ビルドの環境が変わっているかもしれないのだ。たとえば、コンパイラのバージョンが変わっていたら、完全に同じバイナリを作ることはできないだろう。
この問題の一つの解決策は、コンパイラのバイナリを全部ツリーに入れてしまうという方法だ。コンパイラだけではなく、リンカや make など、ビルドに使うツールもひと通り入れておく。これでビルドの再現性がかなり高まってきた。こうやって完全な再現性を求めたビルド環境は hermetic build と呼ばれる。密封ビルドとでも訳そう。
密封ビルドがあれば、数年前のバージョンでも、ビルドしてデバッグすることができる。できればそういうことはやりたくないけども。。