Skip to content
Latchkey

再現可能なビルドとは何か?

再現可能なビルドは、同じソースからビット単位で同一の出力を生成します - 誰が、どこで、いつbuildしても同じです。

同じコミットを2回buildして異なるバイナリが得られるなら、そのバイナリがそのソースから来たことを証明できません。再現可能なビルドは変動の要因を取り除き、出力を決定的にします。これは検証可能なサプライチェーンの基盤です。

何が再現性を壊すのか

  • 埋め込まれたタイムスタンプやbuild日時。
  • 非決定的な順序(ファイルシステム、hash map)。
  • 出力に焼き付けられた絶対パスやhostname。
  • 固定されていない依存関係やtoolchainのバージョン。

チームはどうやってそれを実現するか

すべての入力を固定し(lockfile、固定されたツールバージョン)、タイムスタンプを正規化し(例えば SOURCE_DATE_EPOCH)、入力を決定的にソートし、絶対パスを取り除きます。目標は、出力に影響を与えるのがソースだけになることです。

小さな例

同じコミットの2回のCI実行が、埋め込まれたタイムスタンプだけが異なるアーカイブを生成するとします。SOURCE_DATE_EPOCH をコミット時刻に設定し、ファイルエントリをソートすると、2つのアーカイブは同一のhashになります - 違いがコードではなく偶発的なものだったことが証明されます。

なぜそれが重要なのか

再現性により、独立した第三者が再ビルドし、公開されたartifactがそのソースと一致することを確認できます - 改ざんされたbuildパイプラインに対する重要な防御であり、強力な出所証明の前提条件です。

再現可能 vs 十分に決定的

完全なビット単位の再現性は理想ですが、部分的な決定性でもcacheやデバッグに役立ちます。多くのチームは、非決定性の要因を1つずつ取り除きながら、段階的にこれを追求します。

重要なポイント

  • 再現可能なビルドは、同一のソースから同一の出力を生み出します。
  • タイムスタンプ、順序、固定されていない入力が通常の原因です。
  • 検証可能で改ざん耐性のあるサプライチェーンを支えます。

関連ガイド