binpkg allows to install binaries as secure packages with
Codechain.
Adding binaries directly to a Codechain secure package would increase its size too much and binaries cannot be reviewed in a meaningful way anyway.
Under normal circumstances building from source is preferable, but in
the rare cases where you want to distributed binaries in a secure and
multiparty reviewed way, you can use binpkg as follows:
- Add the
.secpkgfile of thisbinpkgrepository to the.secdepdirectory of your package (asbinpkg.secpkg). - Add a Makefile that calls
binpkg downloadformake,binpkg installformake install, andbinpkg uninstallformake uninstall. Also make sure to pass through the$prefixvariable frommaketo the-poption for thebinpkg installandbinpkg uninstallcommands (seeMakefileexample). - Add the configuration file
config.binpkgas described below. - Add a distribution file
$GOOS_$GOARCH.binpkgfor every platform you want to support (with the help ofbinpkg generate, see below). - Upload the distribution archives to the configured web server paths
(as displayed by
binpkg generate). - Add all
*.binpkgfiles to Codechain, review them, and publish the secure package.
This ensures multiparty signatures of the hashes of all installed
binaries. Without Reproducible
Builds this just records in an
unmodifiable way which binaries have been pushed by the developers. With
Reproducible Builds these binaries could be audited with the
corresponding source code, but the specifics of such a procedure are
outside of the scope of binpkg.
Using Codechain secure dependencies allows to extend Codechain with binary packages without blowing up Codechain itself unnecessarily.
Download binary package for current platform, see specification for details.
Install downloaded binary package for current platform, see specification for details.
Uninstall installed binary package for current platform, see specification for details.
Generate binary package for $bindir directory, see
specification
for details.
A binary package configuration file (config.binpkg) contains a JSON
object with the following keys:
{
"URLs": [
"list of binary package download URLs"
]
}
Example config.binpkg file:
{
"URLs": [
"http://example.com/binpkg/testpackage",
"http://example.net/binpkg/testpackage",
"http://example.org/binpkg/testpackage"
]
}
A $GOOS_$GOARCH.binpkg file (e.g., linux_amd64.binpkg) contains a
tree list of
all files in their relative directories and their hashes that are
installed by binpkg install for this platform.
Example linux_amd64.binpkg file:
x 1c9d23c245ef06a87f178c5d82221b702084540fe072b329c6a992d6036e6649 bin/testbin
x e39447e1a9d87131b62ee4f5fcfe0bd11aa5a8c545b706424d38ca7a23d24f9c bin/testbin2
binpkg uses the directory tree under .codechain/binpkg for temporary
data. By being under the .codechain hierarchy the temporary data is
excluded from Codechain's hash chain.
.codechain/binpkg/archives is used for storing package archive files.
.codechain/binpkg/$GOOS_$GOARCH directories are used to extract
package archives for the corresponding platform in order to check the
contents and prepare for the installation.
A common path on a web server would like this:
URL/binpkg/package_name/$GOOS_$GOARCH/treehash.tar.gz
where:
binpkgis optional.package_nameis the name of the package (optional).$GOOS_$GOARCHis the platform string (mandatory, but not part of URL inconfig.binpkg).treehashis the tree hash in hex notation (lowercase) of all installed files for this platform andtreehash.tar.gzcontains the corresponding directory tree as a.tar.gzarchive.
prefix ?= /usr/local
.PHONY: all install uninstall
all:
binpkg download
install:
binpkg install -p $(prefix)
uninstall:
binpkg uninstall -p $(prefix)