@@ -140,6 +140,29 @@ common-steps:
140140 make $PKG_NAME
141141 ls ~/debbuild/packaging/*.deb
142142
143+ - &builddebianpackagefromexistingtarball
144+ run :
145+ name : Build debian package from committed tarball
146+ command : |
147+ export PKG_PATH=~/project/tarballs/$PKG_NAME-$PKG_VERSION.tar.gz
148+
149+ # Every tarball should be signed
150+ gpg --import ~/project/pubkeys/release_key.pub
151+ gpg --verify $PKG_PATH.asc
152+
153+ # Build debian package
154+ make $PKG_NAME
155+ export PKG_HASH_1=$(shasum -a 256 ~/debbuild/packaging/$PKG_NAME*.deb | awk '{print $1}')
156+ echo $PKG_HASH_1
157+
158+ # Build debian package again
159+ make $PKG_NAME
160+ export PKG_HASH_2=$(shasum -a 256 ~/debbuild/packaging/$PKG_NAME*.deb | awk '{print $1}')
161+ echo $PKG_HASH_2
162+
163+ # Fail build if hashes aren’t equal
164+ python -c "import os, sys; sys.exit(os.environ['PKG_HASH_1'] != os.environ['PKG_HASH_2'])"
165+
143166 - &addsshkeys
144167 add_ssh_keys :
145168 fingerprints :
@@ -457,6 +480,47 @@ jobs:
457480 - *setmetapackageversion
458481 - *builddebianpackage
459482
483+ reproducibility-checks :
484+ docker :
485+ - image : circleci/python:3.7-buster
486+ steps :
487+ - checkout
488+ - *removevirtualenv
489+ - *installdeps
490+ - run : git lfs pull
491+ - run :
492+ name : Test build process reproducibility on latest securedrop-client tarball
493+ command : |
494+ export TARBALL=$(ls ~/project/tarballs/securedrop-client-*.tar.gz)
495+ echo ${TARBALL%.tar.gz} | awk -F "-" '{ print $3 }' > ~/sd_version
496+ echo 'export PKG_NAME=securedrop-client' >> $BASH_ENV
497+ echo 'export PKG_VERSION=$(cat ~/sd_version)' >> $BASH_ENV
498+ - *builddebianpackagefromexistingtarball
499+ - run :
500+ name : Test build process reproducibility on latest securedrop-proxy tarball
501+ command : |
502+ export TARBALL=$(ls ~/project/tarballs/securedrop-proxy-*.tar.gz)
503+ echo ${TARBALL%.tar.gz} | awk -F "-" '{ print $3 }' > ~/sd_version
504+ echo 'export PKG_NAME=securedrop-proxy' >> $BASH_ENV
505+ echo 'export PKG_VERSION=$(cat ~/sd_version)' >> $BASH_ENV
506+ - *builddebianpackagefromexistingtarball
507+ - run :
508+ name : Test build process reproducibility on latest securedrop-log tarball
509+ command : |
510+ export TARBALL=$(ls ~/project/tarballs/securedrop-log-*.tar.gz)
511+ echo ${TARBALL%.tar.gz} | awk -F "-" '{ print $3 }' > ~/sd_version
512+ echo 'export PKG_NAME=securedrop-log' >> $BASH_ENV
513+ echo 'export PKG_VERSION=$(cat ~/sd_version)' >> $BASH_ENV
514+ - *builddebianpackagefromexistingtarball
515+ - run :
516+ name : Test build process reproducibility on latest securedrop-export tarball
517+ command : |
518+ export TARBALL=$(ls ~/project/tarballs/securedrop-export-*.tar.gz)
519+ echo ${TARBALL%.tar.gz} | awk -F "-" '{ print $3 }' > ~/sd_version
520+ echo 'export PKG_NAME=securedrop-export' >> $BASH_ENV
521+ echo 'export PKG_VERSION=$(cat ~/sd_version)' >> $BASH_ENV
522+ - *builddebianpackagefromexistingtarball
523+
460524workflows :
461525 build-packages :
462526 jobs :
@@ -470,6 +534,7 @@ workflows:
470534 - build-buster-securedrop-workstation-config
471535 - build-buster-securedrop-keyring
472536 - make-dom0-rpm
537+ - reproducibility-checks
473538
474539 # Nightly jobs for each package are run in series to ensure there are no
475540 # conflicts or race conditions when committing deb packages to git-lfs.
0 commit comments