JVM
JVM エコシステムにおける取り決めについて活発な議論が行われています。 貢献の仕方は contribute を参照してください。
JVM エコシステムはさまざまなプログラミング言語やビルドツールを提供します。 JVM 自体は再現性と親和性が低いので(ファイルの並び順やタイムスタンプの変動する jar 形式や zip 形式が第一級のデータになっているため)、再現性のあるビルドを実現するにはそれぞれのビルドツールの対応が必要です。
Reproducible Central
さまざまなビルドツールは、ビルドしたアーティファクトのバイナリを、グループID、アーティファクトID、バージョンからなる Maven 2 のリポジトリ形式で、インターネットからアクセスできる Maven リポジトリに公開しています(Maven Central や Google’s Android Repository など)。
Reproducible Central は、Maven Central に公開されたアーティファクトを再ビルドして、再現性のあるビルドになっているかチェックするプロジェクトです。
貢献したければ、Maven Central に公開されたアーティファクトを再ビルドして比較するための .buildspec
file を作成してください。
再現性のあるビルドを実現するためのビルドツールの設定
Maven
Maven で再現性のあるビルドを実現するにはプラグインの設定が必要です。 詳しくは Maven - Guide to Configuring for Reproducible Builds を参照してください。
Gradle
Gradle はバージョン 3.4 から reproducible archives に対応しました。
zip 形式や jar 形式のアーカイブを生成するとき、JVM アーティファクトが非決定論的な結果を生成する主要因であるファイルのタイムスタンプ(固定します)、とファイルの並び順(固定します)を変更します。
sbt
Scala プロジェクトの一般的なビルドツールである sbt を使用するときは、アーティファクトと付随するビルド情報を、sbt-reproducible-builds で省略できます。
.buildinfo
ファイル
JVM における .buildinfo
ファイルの形式は 2018 年から検討されており、”Reproducible Builds for the JVM” プロジェクトの初期から使われています。
同じビルド結果を出力するために必要なビルドに関連する全ての情報(ソースコードや環境)を記述することで、別々の人が、別々にビルドした結果を、簡単に比較できるようにするためでした。
Reproducible Builds を始めてから3年経ち、より適切なファイル形式が発見されました。
Reproducible Central プロジェクトにおける .buildspec
形式です。
.buildinfo
はビルドの方法と再現性があるかどうかしか記述できなかったのですが、.buildspec
にはそれ以上の内容を記述できます。
歴史的な経緯を参照できるよう、バージョン 1.0-SNAPSHOT
の Buildinfo 形式を紹介します。
Java のプロパティファイルと同じ形式 で記述するようになっていました。
#### Work In Progress ####
buildinfo.version=1.0-SNAPSHOT
name=<name of the artifact>
group-id=<groupId coordinates in repository>
artifact-id=<artifactId coordinates in repository>
version=<version coordinates in repository>
# source information for rebuilders, as source tarball artifact in repository and/or url and/or scm coordinates
source.artifact=<groupId>:<artifactId>:<version>:<classifier>:<extension>
source.url=<url where to download official source tarball>
source.scm.uri=<source control uri, typically corresponding to the project.scm.developerConnection or project.scm.connection in the pom.xml>
source.scm.tag=<source control tag as in pom.xml>
# build instructions
build-tool=<mvn|sbt|...>
build.setup=<optional url of documentation explaining specific additional setup when necessary: will be enhanced in a future buildinfo format version>
# effective recorded build environment information
java.version=<Java version taken from "java.version" system property>
java.vendor=<Java vendor taken from "java.vendor" system property>
os.name=<Operating System name taken from "os.name" system property>
source.used=<artifact|url|scm, depending on which has been used for the build>
# Each build tool or plugin is free to add additional entries to the buildinfo,
# both for build instructions and effective recorded build environment.
# For example, the sbt plugin may add the following for Scala:
sbt.version=1.2.3
scala.version=2.12.6
# and Maven could add data on rebuild instructions and effective recorded environment:
mvn.rebuild-args=-Dmaven.test.skip package
mvn.build-root=<groupId>:<artifactId>:<version>
mvn.version=Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
mvn.minimum.version=<minimum Maven version to rebuild if known>
# A buildinfo file can contain checksums for multiple output files, for
# example for the main jar and the accompanying pom.xml (when generated):
outputs.0.filename=<file name in the repository, ${artifactId}-${version}[-${classifier}].${extension}>
outputs.0.length=<file size>
outputs.0.checksums.sha512=<sha512 lowercase>
outputs.1.filename=<file name in the repository>
outputs.1.length=<file size>
outputs.1.checksums.sha512=<sha512 lowercase>
...
Maven リポジトリに公開される ${artifactId}-${version}-sources.jar
ファイルは、ビルドできるソースコードではなく、IDE の使用するソースコード です。
ビルドするためのソースコードアーカイブを Maven リポジトリに公開することは滅多にありません。 しかし、次のような伝統的なファイル名規約は残っています。
${artifactId}-${version}-source-release.zip
(Maven Central にソースコードアーカイブを公開しているアーティファクト を参照してください)${artifactId}-${version}-src.zip
(Maven Central にソースコードアーカイブを公開しているアーティファクト を参照してください)
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