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
.secpkg
file of thisbinpkg
repository to the.secdep
directory of your package (asbinpkg.secpkg
). - Add a Makefile that calls
binpkg download
formake
,binpkg install
formake install
, andbinpkg uninstall
formake uninstall
. Also make sure to pass through the$prefix
variable frommake
to the-p
option for thebinpkg install
andbinpkg uninstall
commands (seeMakefile
example). - Add the configuration file
config.binpkg
as described below. - Add a distribution file
$GOOS_$GOARCH.binpkg
for 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
*.binpkg
files 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:
binpkg
is optional.package_name
is the name of the package (optional).$GOOS_$GOARCH
is the platform string (mandatory, but not part of URL inconfig.binpkg
).treehash
is the tree hash in hex notation (lowercase) of all installed files for this platform andtreehash.tar.gz
contains the corresponding directory tree as a.tar.gz
archive.
prefix ?= /usr/local
.PHONY: all install uninstall
all:
binpkg download
install:
binpkg install -p $(prefix)
uninstall:
binpkg uninstall -p $(prefix)