ビルド環境に含む要素(What's in a build environment?)
再現性のあるビルドは、なんらかのソースコードがいかなる場合も同じバイト列になることを保証するわけではありません。 そもそも実現できない場合があるからです。 コンパイラのバージョンによっては、より最適化が進んだなどの理由で異なる出力になる場合があるからです。
その代わり、再現性のあるビルドでは ビルド環境 を定義します。 具体的なバージョンを指定したさまざまなツールだけでなく、OSやOSの設定に関する想定事項も含みます。 ビルド環境は 記録 した内容に基づいて構成し、バイナリ形式の配布パッケージへ同梱するべきです。
要求事項
それぞれのプロジェクトにおいて、ビルド環境に差異をもたらす要因はなんでしょうか。 単一のリリースがさまざまなOSに対応する場合、ビルド環境も複数になるでしょう。 しかし、全ての環境に共通する重要な要素があるはずです。
それは 簡単にインストールできること です。 ビルド環境とマッチするユーザーのシステムには、簡単にインストールできるようでなければならないのです。 インターネット経由で取得できる自由なソフトウェアだけで実現できるのが理想的です。 最も良い方法は、ビルド環境を説明するドキュメントと、ビルド環境を簡単に作成する手順(スクリプト)を公開することです。
それらは 監査可能 でなければなりません。 ビルド環境にどのようなツールが含まれるのかすぐに分かるようにしなければなりません。 また、レビューや再ビルドが容易になっていることが理想的です。
中身
ビルド環境は、ビルドシステムをどれだけ 決定論的に 構築できるか、という度合いに応じて、適切な範囲で定義しなければなりません。
少なくともビルドプロセスで使用するツールとそのバージョンは含めなければなりません。
それ以外の部分は、プロジェクトによって、あるいは、再現性のあるビルドを求めているユーザーの需要によって、求められる内容は異なるでしょう。
- OS(特にクロスコンパルできない場合など)
- ビルドシステムのアーキテクチャ(特にクロスコンパルできない場合など)
- ビルドを実行するディレクトリ
- ビルドを実行するユーザー
- ロケール
- タイムゾーン
- 必要な環境変数(
SOURCE_DATE_EPOCH
など)
仮想マシンやコンテナを推奨するビルド環境にすれば、特定のOSや構成を保証するのが簡単になります。 ただし、環境に対する前提条件の一部を隠してしまう場合があるため注意が必要です。 システムの認識しているCPU種類 に応じた最適化が有効になる場合があったりします。
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