Documentation index

タイムスタンプ(Timestamps)

タイムスタンプ(時刻印)は再現性のあるビルドにとって一番の難問です。 ほとんどのビルドツールはビルドを実行したときの日付と時刻を記録しています。 ファイルシステムもそうですし、ほとんどのアーカイブ形式 はその時のタイムスタンプを変更日時へ設定するようになっています。 ビルドしたときの日付をソフトウェア自体に格納しておくことが慣習とされている場合もあるのです。

タイムスタンプは避けたほうがよい

ビルドしたソースコードのバージョンや、ビルドしたツールの情報を、ビルドした日時で近似する場合が(よく)あります。 再現性のあるビルドにおいて、ビルドした日時を記録する必要はありません。 タイムスタンプより正確な方法でソースコードを追跡しなければならないからです。 また、ビルド環境を定義したり、より詳細に記録しなければなりません。

ユーザーに、いつソフトウェアが作られたのか伝えるには、ビルドした日時よりソースコードの日時(を変更した日時?)を伝えたほうがいいでしょう。 そうすれば、古いソフトウェアが常に古いことを伝えられるからです。 バージョン情報 のように、バージョン管理システムや 変更履歴(changelog) から取得するのが一番です。

外部ツール

ソースコードジェネレータやドキュメントジェネレータのようなツールがタイムスタンプを書き込むせいで、ビルド結果の再現性を損ねる場合があります。

「再現性のあるビルド」の枠組みとして、環境変数 SOURCE_DATE_EPOCH を使用する方法を提案しています。 対応しているツール1は、ビルド時の日時の代わりに1970年1月1日0時0分0秒(UTC)からの経過秒数を使用します。 広く普及してもらうための 公式な定義 も存在します。

(初めて SOURCE_DATE_EPOCH を採用したのは Debian の関係者たちで、広く使われるようになりました)

SOURCE_DATE_EPOCH に対応するための変更は少ないし簡単です。 未対応のツールのための修正パッチは、再現性のあるビルド を望んでいる全てのユーザーに喜んで受け入れられるでしょう。

何らかの理由で対応できないときは、ビルド結果を後処理する方法も考えられます。 完全にタイムスタンプを削除するか、準備した日付と時刻で正規化するのです。 strip-nondeterminism コマンドは、さまざまな形式のファイルについて日付と時刻を正規化するための拡張用プログラムです。

もう1つの方法として、libfaketime を使用してツールを実行する方法があります。 このライブラリを環境変数 LD_PRELOAD で読み込むようにすると、現在日時を取得する関数呼び出しに割り込んで、指定した日時を返すことができるのです。 場合によっては、ビルドシステムを大幅に変更することなく、目的を達成できるでしょう。 しかし、ビルドプロセスのどこかが時刻の差異に依存しているとしたら、おそらく失敗します。 Tor Browser のビルドの再現性に関する問題 では、libfaketime と並列コンパイルの不適合が原因として指摘されています。 利用するときは注意が必要です。

  1. 2015年10月26日から help2man と Sphinx が SOURCE_DATE_EPOCH に対応しました。Debian プロジェクトが独自に対応したツール はこちらです。 


Documentation index

Follow us on Twitter @ReproBuilds, Mastodon @reproducible_builds@fosstodon.org & Reddit and please consider making a donation. • Content licensed under CC BY-SA 4.0, style licensed under MIT. Templates and styles based on the Tor Styleguide. Logos and trademarks belong to their respective owners. • Patches welcome via our Git repository (instructions) or via our mailing list. • Full contact info