build-binary-artifact.py
is a simple binary artifact generator. It
creates zip files with specific filename formats, a content signature,
and a manifest for trackability.
build-binary-artifact.py
is basically a glorified zip creator. To
use it normally:
build-binary-artifact.py --name foo --base-version 1.0 --build-id 1 <FILE_OR_DIR>...
That creates a file foo-1.0-1-2018.10.11-<sha>.zip
where the SHA is
the signature of the dir's contents. base-version
is the version of
the thing you're packaging. The created zip file just contains the dir
itself, and a foo-manifest
file for tracking, containing all the
metadata (name, version, build date, build machine, git SHA if
available, etc.)
Why is it better than just using zip? Mainly because it names the resulting file uniquely, which makes everything totally trackable. And on the target system you can check the manifest file from where you unzipped it to see what's actually there, find out when/where/who built it, etc.
It's scriptable so it's easy to include in any build tool.
To use the resulting binary artifact files: they're just standard Zip files, so unzip and do whatever you'd normally do.
Download this repo and copy build-binary-artifact.py
somewhere on
your path.
usage: build-binary-artifact.py [-h] --base-version BASE_VERSION --name NAME
[--bits BITS] [--build-id BUILD_ID]
[--build-branch BUILD_BRANCH]
[--build-date BUILD_DATE]
[--build-machine BUILD_MACHINE] [--os OS]
[--build-os BUILD_OS] [--note NOTE]
[--author AUTHOR] [--chdir CHDIR]
[--outdir OUTDIR] [--silent] [--tar]
[--name-only] [--hash-only] [--validate]
[--exclude EXCLUDE]
dir [dir ...]
Binary Artifact builder
Make a zip/tarfile called NAME-VER-BUILD-DATE-HASH.tgz from all the files in dirs.
Include a generated manifest, so the result looks like:
filename: NAME-VER-BUILD-DATE-HASH.tgz/.zip
contents:
NAME-VER-BUILD-DATE-HASH/
NAME-manifest.txt
dir1/
dir2/
...
positional arguments:
dir dirs to collect into the binary artifact
optional arguments:
-h, --help show this help message and exit
--base-version BASE_VERSION, -B BASE_VERSION
Base version for manifest (default: None)
--name NAME, -n NAME Artifact name (human readable). E.g. 'libfoo-mac'.
(default: None)
--bits BITS, -b BITS bits (32 or 64) (default: 64)
--build-id BUILD_ID, -i BUILD_ID
Build ID (default: git SHA)
--build-branch BUILD_BRANCH, --branch BUILD_BRANCH
Build branch (default: git branch)
--build-date BUILD_DATE, --date BUILD_DATE, -D BUILD_DATE
Build date (default: now)
--build-machine BUILD_MACHINE, --machine BUILD_MACHINE, -m BUILD_MACHINE
Build machine (default: machine name)
--os OS, -o OS Build machine OS (default: current OS)
--build-os BUILD_OS, -O BUILD_OS
Build machine OS (default: current OS)
--note NOTE, -N NOTE Note to put in manifest (one line) (default: None)
--author AUTHOR, -a AUTHOR
Person (username/email) building the archive (default:
guessed username)
--chdir CHDIR, -C CHDIR
Change to this dir before starting to archive files.
Useful if dir is in a subdir or elsewhere on disk and
you don't want the intervening dir names in the final
archive. (default: None)
--outdir OUTDIR Directory in which to create the output zip/tar file.
(default: .)
--silent, -s Skip printing the manifest file contents on stdout
(default: False)
--tar, -T Create a tar (tgz) file instead of zip (default:
False)
--name-only Don't build the archive; just return the name of the
tar/zip file. (Requires hashing contents.) (default:
False)
--hash-only Don't build the archive; just return the hash of the
given dir. (default: False)
--validate Validate an unpacked archive by checking its hash
against the manifest. (default: False)
--exclude EXCLUDE Exclude this filename from the archive. May be
repeated. (default: None)
--top-dir-name TOP_DIR_NAME, -t TOP_DIR_NAME
Top dir of the resulting zip: Default=None means use
the full name of the zip. A string means use that name
as the top dir. '.' means no top dir; put the manifest
and contents at top level. (default: None)
The following arguments are required: --base-version
/-B
, --name
/-n
, dir
.
If git
is available, the tool tries to inspect the dir and infer
build-branch
and build-id
from git. It defaults build-machine
from the current machine name, build-date
defaults to now, and
build-os
defaults to the current OS.
build-binary-artifact.py
has three additional modes besides creating
the artifact:
validate
: verifies an existing unpacked archive by checking the content hash against the manifestname-only
: don't build, just return the filename. This is useful for build systems that want to know the names of targets before they're created.hash-only
: don't build, just return the content hash.
This packages build-binary-artifact itself (the git working dir) as a
binary artifact. It excludes the .git
folder.
% ls
binary-artifact
% python binary-artifact/build-binary-artifact.py --base-version 1.0 \
--build-id 1 --exclude .git --name build-binary-artifact binary-artifact
Created binary artifact ./build-binary-artifact-1.0-1-2018.10.17-99b6130f5a6f51a3.zip
base-version: 1.0
name: build-binary-artifact
os: Windows
bits: 64
author: garyo
build-id: 1
build-branch: None
build-date: Wed Oct 17 10:29:54 2018
build-machine: tower1
build-os: Windows 10 10.0.17134 AMD64
note: None
fullname: build-binary-artifact-1.0-1-2018.10.17-99b6130f5a6f51a3
content-hash: 99b6130f5a6f51a3
Wrote .\build-binary-artifact-1.0-1-2018.10.17-99b6130f5a6f51a3.zip
%
Python 2.7 or 3.6+
Eventually this tool will be installable via pip install build-binary-artifact
but for now, just download the repo.
TBD
Pull requests and issues gratefully accepted!
- Gary Oberbrunner at Boris FX, Inc. (current maintainer)
This project is licensed under the MIT License - see the LICENSE file for details