Documentation index

JVM

JVM エコシステムにおける取り決めについて活発な議論が行われています。 貢献の仕方は contribute を参照してください。

JVM エコシステムはさまざまなプログラミング言語やビルドツールを提供します。 JVM 自体は再現性と親和性が低いので(ファイルの並び順やタイムスタンプの変動する jar 形式や zip 形式が第一級のデータになっているため)、再現性のあるビルドを実現するにはそれぞれのビルドツールの対応が必要です。

Reproducible Central

さまざまなビルドツールは、ビルドしたアーティファクトのバイナリを、グループID、アーティファクトID、バージョンからなる Maven 2 のリポジトリ形式で、インターネットからアクセスできる Maven リポジトリに公開しています(Maven CentralGoogle’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 リポジトリに公開することは滅多にありません。 しかし、次のような伝統的なファイル名規約は残っています。


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