入力データの順序を固定する(Stable order for inputs)
ソフトウェアをビルドするとき、複数の入力を同時に処理しなければならないとしたら、何回ビルドしてもその順番が同じになるようにしなければなりません。
例えば、あるディレクトリのコンテンツをまとめたアーカイブを作成する場合があるでしょう。 ほとんどのファイルシステムは、ディレクトリに含まれるファイルを列挙するとき、常に同じ順序になることを保証していません。
Makefile の場合
次の Makefile
が生成する結果は再現性のないビルド1 です。
解決方法は2つあります。
(a) 全ての入力ファイルを明示的に列挙して、同じ順番で処理されるようにする。
(b) 入力ファイルを並び替える。
ロケールに関連する問題
入力を並び替えるとしても、システムのロケールに依存しないようにしなければなりません。 ロケールによっては大文字と小文字を区別しない場合があるので難しい問題です。
例えば、tar
はディレクトリを下に向かって降りていくとき、初期設定ではファイルシステムの返す順序に従うようになっています。
find
と sort
を組み合わせればいいのですが、次のコード例ではまだロケールによる影響を取り除けていません。
並び順が変化して驚かされたくないなら、ファイルを並び替えるときにロケールを指定するようにします。
Tar などでアーカイブを作成する 場合だけでなく、メタデータを埋め込むような場合も変更が必要になります。
Introduction
Achieve deterministic builds
- SOURCE_DATE_EPOCH
- 確実なビルドシステム(Deterministic build systems)
- 揮発性のある入力データは消える場合がある(Volatile inputs can disappear)
- 入力データの順序を固定する(Stable order for inputs)
- 値を初期化する(Value initialization)
- バージョン情報(Version information)
- タイムスタンプ(Timestamps)
- タイムゾーン(Timezones)
- ロケール(Locales)
- アーカイブのメタデータ(Archive metadata)
- 出力データの順序を固定する(Stable order for outputs)
- 無作為性(Randomness)
- ビルド時のファイルシステムパス(Build path)
- システムイメージ(System images)
- JVM
Define a build environment
- ビルド環境に含む要素(What's in a build environment?)
- ビルド環境を記録する(Recording the build environment)
- ビルド環境の定義における戦略(Definition strategies)
- Proprietary operating systems
Distribute the environment
Verification
Specifications
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