Skip to content

Commit

Permalink
Gitian unit e (#511)
Browse files Browse the repository at this point in the history
Adapted gitian to Unit-e

* Added option to build for windows without gui
* Set version in gitian descriptors to 0.0.1
* Bumped minimal OS versions
* Made version and signer regular options

Addresses #466

Signed-off-by: Mateusz Morusiewicz <[email protected]>
  • Loading branch information
Ruteri authored Jan 31, 2019
1 parent 8acf9c0 commit f3c9480
Show file tree
Hide file tree
Showing 9 changed files with 143 additions and 81 deletions.
12 changes: 11 additions & 1 deletion Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -70,14 +70,24 @@ COVERAGE_INFO = baseline.info \
dist-hook:
-$(GIT) archive --format=tar HEAD -- src/clientversion.cpp | $(AMTAR) -C $(top_distdir) -xf -

if ENABLE_QT
$(UNITE_WIN_INSTALLER): all-recursive
$(MKDIR_P) $(top_builddir)/release
STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(UNITED_BIN) $(top_builddir)/release
STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(UNITE_QT_BIN) $(top_builddir)/release
STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(UNITE_CLI_BIN) $(top_builddir)/release
@test -f $(MAKENSIS) && $(MAKENSIS) -V2 $(top_builddir)/share/setup.nsi -DWithGui || \
( echo error: could not build $@ && exit 1 )
@echo built $@
else
$(UNITE_WIN_INSTALLER): all-recursive
$(MKDIR_P) $(top_builddir)/release
STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(UNITED_BIN) $(top_builddir)/release
STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(UNITE_CLI_BIN) $(top_builddir)/release
@test -f $(MAKENSIS) && $(MAKENSIS) -V2 $(top_builddir)/share/setup.nsi || \
echo error: could not build $@
( echo error: could not build $@ && exit 1 )
@echo built $@
endif

$(OSX_APP)/Contents/PkgInfo:
$(MKDIR_P) $(@D)
Expand Down
30 changes: 15 additions & 15 deletions contrib/devtools/symbol-check.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,30 +17,30 @@
import sys
import os

# Debian 6.0.9 (Squeeze) has:
# Debian 8.11 (jessie) has:
#
# - g++ version 4.4.5 (https://packages.debian.org/search?suite=default&section=all&arch=any&searchon=names&keywords=g%2B%2B)
# - libc version 2.11.3 (https://packages.debian.org/search?suite=default&section=all&arch=any&searchon=names&keywords=libc6)
# - libstdc++ version 4.4.5 (https://packages.debian.org/search?suite=default&section=all&arch=any&searchon=names&keywords=libstdc%2B%2B6)
# - g++ version 4.9.2 (https://packages.debian.org/search?suite=default&section=all&arch=any&searchon=names&keywords=g%2B%2B)
# - libc version 2.19-18 (https://packages.debian.org/search?suite=default&section=all&arch=any&searchon=names&keywords=libc6)
# - libstdc++ version 4.9.2 (https://packages.debian.org/search?suite=default&section=all&arch=any&searchon=names&keywords=libstdc%2B%2B6)
#
# Ubuntu 10.04.4 (Lucid Lynx) has:
# Ubuntu 14.04.5 (trusty tahr) has:
#
# - g++ version 4.4.3 (http://packages.ubuntu.com/search?keywords=g%2B%2B&searchon=names&suite=lucid&section=all)
# - libc version 2.11.1 (http://packages.ubuntu.com/search?keywords=libc6&searchon=names&suite=lucid&section=all)
# - libstdc++ version 4.4.3 (http://packages.ubuntu.com/search?suite=lucid&section=all&arch=any&keywords=libstdc%2B%2B&searchon=names)
# - g++ version 4.8.2 (https://packages.ubuntu.com/search?suite=trusty&arch=any&searchon=names&keywords=g%2B%2B)
# - libc version 2.19.0 (http://packages.ubuntu.com/search?keywords=libc6&searchon=names&suite=lucid&section=all)
# - libstdc++ version 4.8.2 (http://packages.ubuntu.com/search?suite=lucid&section=all&arch=any&keywords=libstdc%2B%2B&searchon=names)
#
# Taking the minimum of these as our target.
#
# According to GNU ABI document (http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html) this corresponds to:
# GCC 4.4.0: GCC_4.4.0
# GCC 4.4.2: GLIBCXX_3.4.13, CXXABI_1.3.3
# (glibc) GLIBC_2_11
# GCC 4.8.0: GCC_4.8.0
# GCC 4.8.0: GLIBCXX_3.4.18, CXXABI_1.3.7
# (glibc) GLIBC_2_19
#
MAX_VERSIONS = {
'GCC': (4,4,0),
'CXXABI': (1,3,3),
'GLIBCXX': (3,4,13),
'GLIBC': (2,11)
'GCC': (4,8,0),
'CXXABI': (1,3,7),
'GLIBCXX': (3,4,18),
'GLIBC': (2,19)
}
# See here for a description of _IO_stdin_used:
# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=634261#109
Expand Down
127 changes: 86 additions & 41 deletions contrib/gitian-build.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#!/usr/bin/env python3
# Copyright (c) 2018-2019 The Bitcoin Core developers
# Copyright (c) 2019 The Unit-e developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or https://opensource.org/licenses/MIT.

Expand All @@ -8,33 +9,68 @@
import subprocess
import sys

def setup():
global args, workdir
programs = ['ruby', 'git', 'apt-cacher-ng', 'make', 'wget']
import platform

def install_linux_deps():
global args
subprocess.check_call(['sudo', 'apt-get', 'update', '-qq'])
programs = ['ruby', 'git', 'make', 'wget']
if args.kvm:
programs += ['python-vm-builder', 'qemu-kvm', 'qemu-utils']
programs += ['apt-cacher-ng', 'python-vm-builder', 'qemu-kvm', 'qemu-utils']
elif args.docker:
dockers = ['docker.io', 'docker-ce']
for i in dockers:
return_code = subprocess.call(['sudo', 'apt-get', 'install', '-qq', i])
if return_code == 0:
break
if return_code != 0:
print('Cannot find any way to install docker', file=sys.stderr)
exit(1)
if subprocess.call(['docker', '--version']) != 0:
dockers = ['docker.io', 'docker-ce']
for i in dockers:
return_code = subprocess.call(['sudo', 'apt-get', 'install', '-qq', i])
if return_code == 0:
break
if return_code != 0:
print('Cannot find any way to install docker', file=sys.stderr)
exit(1)
else:
programs += ['lxc', 'debootstrap']
programs += ['apt-cacher-ng', 'lxc', 'debootstrap']

subprocess.check_call(['sudo', 'apt-get', 'install', '-qq'] + programs)
if not os.path.isdir('gitian.sigs'):
subprocess.check_call(['git', 'clone', 'https://github.com/dtr-org/unit-e-sigs.git'])
if not os.path.isdir('unit-e-detached-sigs'):
subprocess.check_call(['git', 'clone', 'https://github.com/dtr-org/unit-e-detached-sigs.git'])

def install_mac_deps():
global args
if not args.docker:
print('Mac can only work with docker, re-run with --docker flag.', file=sys.stderr)
exit(1)

if subprocess.call(['docker', '--version']) != 0:
# TODO: check if it's enough (docker-machine?)
if subprocess.call(['brew', 'install', 'docker']) != 0:
print('Please install docker manually.', file=sys.stderr)
exit(1)

subprocess.check_call(['brew', 'install', 'ruby', 'coreutils'])

def install_deps():
global args
system_str = platform.system()
if system_str == 'Linux':
install_linux_deps()
elif system_str == 'Darwin':
install_mac_deps()
else:
print('Unsupported system.', file=sys.stderr)
exit(1)


def setup():
global args, workdir

install_deps()

if not os.path.isdir('unit-e-sigs'):
subprocess.check_call(['git', 'clone', '[email protected]:dtr-org/unit-e-sigs.git'])
if not os.path.isdir('gitian-builder'):
subprocess.check_call(['git', 'clone', 'https://github.com/devrandom/gitian-builder.git'])
if not os.path.isdir('unit-e'):
subprocess.check_call(['git', 'clone', 'https://github.com/dtr-org/unit-e.git'])
subprocess.check_call(['git', 'clone', args.url, 'unit-e'])
os.chdir('gitian-builder')
make_image_prog = ['bin/make-base-vm', '--suite', 'bionic', '--arch', 'amd64']
make_image_prog = ['bin/make-base-vm', '--suite', 'trusty', '--arch', 'amd64']
if args.docker:
make_image_prog += ['--docker']
elif not args.kvm:
Expand Down Expand Up @@ -63,28 +99,28 @@ def build():
if args.linux:
print('\nCompiling ' + args.version + ' Linux')
subprocess.check_call(['bin/gbuild', '-j', args.jobs, '-m', args.memory, '--commit', 'unit-e='+args.commit, '--url', 'unit-e='+args.url, '../unit-e/contrib/gitian-descriptors/gitian-linux.yml'])
subprocess.check_call(['bin/gsign', '-p', args.sign_prog, '--signer', args.signer, '--release', args.version+'-linux', '--destination', '../gitian.sigs/', '../unit-e/contrib/gitian-descriptors/gitian-linux.yml'])
subprocess.check_call(['bin/gsign', '-p', args.sign_prog, '--signer', args.signer, '--release', args.version+'-linux', '--destination', '../unit-e-sigs/', '../unit-e/contrib/gitian-descriptors/gitian-linux.yml'])
subprocess.check_call('mv build/out/unite-*.tar.gz build/out/src/unite-*.tar.gz ../unit-e-binaries/'+args.version, shell=True)

if args.windows:
print('\nCompiling ' + args.version + ' Windows')
subprocess.check_call(['bin/gbuild', '-j', args.jobs, '-m', args.memory, '--commit', 'unit-e='+args.commit, '--url', 'unit-e='+args.url, '../unit-e/contrib/gitian-descriptors/gitian-win.yml'])
subprocess.check_call(['bin/gsign', '-p', args.sign_prog, '--signer', args.signer, '--release', args.version+'-win-unsigned', '--destination', '../gitian.sigs/', '../unit-e/contrib/gitian-descriptors/gitian-win.yml'])
subprocess.check_call(['bin/gsign', '-p', args.sign_prog, '--signer', args.signer, '--release', args.version+'-win-unsigned', '--destination', '../unit-e-sigs/', '../unit-e/contrib/gitian-descriptors/gitian-win.yml'])
subprocess.check_call('mv build/out/unite-*-win-unsigned.tar.gz inputs/', shell=True)
subprocess.check_call('mv build/out/unite-*.zip build/out/unite-*.exe ../unit-e-binaries/'+args.version, shell=True)

if args.macos:
print('\nCompiling ' + args.version + ' MacOS')
subprocess.check_call(['bin/gbuild', '-j', args.jobs, '-m', args.memory, '--commit', 'unit-e='+args.commit, '--url', 'unit-e='+args.url, '../unit-e/contrib/gitian-descriptors/gitian-osx.yml'])
subprocess.check_call(['bin/gsign', '-p', args.sign_prog, '--signer', args.signer, '--release', args.version+'-osx-unsigned', '--destination', '../gitian.sigs/', '../unit-e/contrib/gitian-descriptors/gitian-osx.yml'])
subprocess.check_call(['bin/gsign', '-p', args.sign_prog, '--signer', args.signer, '--release', args.version+'-osx-unsigned', '--destination', '../unit-e-sigs/', '../unit-e/contrib/gitian-descriptors/gitian-osx.yml'])
subprocess.check_call('mv build/out/unite-*-osx-unsigned.tar.gz inputs/', shell=True)
subprocess.check_call('mv build/out/unite-*.tar.gz build/out/unite-*.dmg ../unit-e-binaries/'+args.version, shell=True)

os.chdir(workdir)

if args.commit_files:
print('\nCommitting '+args.version+' Unsigned Sigs\n')
os.chdir('gitian.sigs')
os.chdir('unit-e-sigs')
subprocess.check_call(['git', 'add', args.version+'-linux/'+args.signer])
subprocess.check_call(['git', 'add', args.version+'-win-unsigned/'+args.signer])
subprocess.check_call(['git', 'add', args.version+'-osx-unsigned/'+args.signer])
Expand All @@ -99,22 +135,22 @@ def sign():
print('\nSigning ' + args.version + ' Windows')
subprocess.check_call('cp inputs/unite-' + args.version + '-win-unsigned.tar.gz inputs/unite-win-unsigned.tar.gz', shell=True)
subprocess.check_call(['bin/gbuild', '-i', '--commit', 'signature='+args.commit, '../unit-e/contrib/gitian-descriptors/gitian-win-signer.yml'])
subprocess.check_call(['bin/gsign', '-p', args.sign_prog, '--signer', args.signer, '--release', args.version+'-win-signed', '--destination', '../gitian.sigs/', '../unit-e/contrib/gitian-descriptors/gitian-win-signer.yml'])
subprocess.check_call(['bin/gsign', '-p', args.sign_prog, '--signer', args.signer, '--release', args.version+'-win-signed', '--destination', '../unit-e-sigs/detached', '../unit-e/contrib/gitian-descriptors/gitian-win-signer.yml'])
subprocess.check_call('mv build/out/unite-*win64-setup.exe ../unit-e-binaries/'+args.version, shell=True)
subprocess.check_call('mv build/out/unite-*win32-setup.exe ../unit-e-binaries/'+args.version, shell=True)

if args.macos:
print('\nSigning ' + args.version + ' MacOS')
subprocess.check_call('cp inputs/unite-' + args.version + '-osx-unsigned.tar.gz inputs/unite-osx-unsigned.tar.gz', shell=True)
subprocess.check_call(['bin/gbuild', '-i', '--commit', 'signature='+args.commit, '../unit-e/contrib/gitian-descriptors/gitian-osx-signer.yml'])
subprocess.check_call(['bin/gsign', '-p', args.sign_prog, '--signer', args.signer, '--release', args.version+'-osx-signed', '--destination', '../gitian.sigs/', '../unit-e/contrib/gitian-descriptors/gitian-osx-signer.yml'])
subprocess.check_call(['bin/gsign', '-p', args.sign_prog, '--signer', args.signer, '--release', args.version+'-osx-signed', '--destination', '../unit-e-sigs/detached', '../unit-e/contrib/gitian-descriptors/gitian-osx-signer.yml'])
subprocess.check_call('mv build/out/unite-osx-signed.dmg ../unit-e-binaries/'+args.version+'/unite-'+args.version+'-osx.dmg', shell=True)

os.chdir(workdir)

if args.commit_files:
print('\nCommitting '+args.version+' Signed Sigs\n')
os.chdir('gitian.sigs')
os.chdir('unit-e-sigs')
subprocess.check_call(['git', 'add', args.version+'-win-signed/'+args.signer])
subprocess.check_call(['git', 'add', args.version+'-osx-signed/'+args.signer])
subprocess.check_call(['git', 'commit', '-a', '-m', 'Add '+args.version+' signed binary sigs for '+args.signer])
Expand All @@ -125,25 +161,25 @@ def verify():
os.chdir('gitian-builder')

print('\nVerifying v'+args.version+' Linux\n')
subprocess.check_call(['bin/gverify', '-v', '-d', '../gitian.sigs/', '-r', args.version+'-linux', '../unit-e/contrib/gitian-descriptors/gitian-linux.yml'])
subprocess.check_call(['bin/gverify', '-v', '-d', '../unit-e-sigs/', '-r', args.version+'-linux', '../unit-e/contrib/gitian-descriptors/gitian-linux.yml'])
print('\nVerifying v'+args.version+' Windows\n')
subprocess.check_call(['bin/gverify', '-v', '-d', '../gitian.sigs/', '-r', args.version+'-win-unsigned', '../unit-e/contrib/gitian-descriptors/gitian-win.yml'])
subprocess.check_call(['bin/gverify', '-v', '-d', '../unit-e-sigs/', '-r', args.version+'-win-unsigned', '../unit-e/contrib/gitian-descriptors/gitian-win.yml'])
print('\nVerifying v'+args.version+' MacOS\n')
subprocess.check_call(['bin/gverify', '-v', '-d', '../gitian.sigs/', '-r', args.version+'-osx-unsigned', '../unit-e/contrib/gitian-descriptors/gitian-osx.yml'])
subprocess.check_call(['bin/gverify', '-v', '-d', '../unit-e-sigs/', '-r', args.version+'-osx-unsigned', '../unit-e/contrib/gitian-descriptors/gitian-osx.yml'])
print('\nVerifying v'+args.version+' Signed Windows\n')
subprocess.check_call(['bin/gverify', '-v', '-d', '../gitian.sigs/', '-r', args.version+'-win-signed', '../unit-e/contrib/gitian-descriptors/gitian-win-signer.yml'])
subprocess.check_call(['bin/gverify', '-v', '-d', '../unit-e-sigs/', '-r', args.version+'-win-signed', '../unit-e/contrib/gitian-descriptors/gitian-win-signer.yml'])
print('\nVerifying v'+args.version+' Signed MacOS\n')
subprocess.check_call(['bin/gverify', '-v', '-d', '../gitian.sigs/', '-r', args.version+'-osx-signed', '../unit-e/contrib/gitian-descriptors/gitian-osx-signer.yml'])
subprocess.check_call(['bin/gverify', '-v', '-d', '../unit-e-sigs/', '-r', args.version+'-osx-signed', '../unit-e/contrib/gitian-descriptors/gitian-osx-signer.yml'])

os.chdir(workdir)

def main():
global args, workdir

parser = argparse.ArgumentParser(usage='%(prog)s [options] signer version')
parser = argparse.ArgumentParser(usage='%(prog)s [options]')
parser.add_argument('-c', '--commit', action='store_true', dest='commit', help='Indicate that the version argument is for a commit or branch')
parser.add_argument('-p', '--pull', action='store_true', dest='pull', help='Indicate that the version argument is the number of a github repository pull request')
parser.add_argument('-u', '--url', dest='url', default='https://github.com/dtr-org/unit-e', help='Specify the URL of the repository. Default is %(default)s')
parser.add_argument('-u', '--url', dest='url', default='git@github.com:dtr-org/unit-e.git', help='Specify the URL of the repository. Default is %(default)s')
parser.add_argument('-v', '--verify', action='store_true', dest='verify', help='Verify the Gitian build')
parser.add_argument('-b', '--build', action='store_true', dest='build', help='Do a Gitian build')
parser.add_argument('-s', '--sign', action='store_true', dest='sign', help='Make signed binaries for Windows and MacOS')
Expand All @@ -156,8 +192,8 @@ def main():
parser.add_argument('-S', '--setup', action='store_true', dest='setup', help='Set up the Gitian building environment. Uses LXC. If you want to use KVM, use the --kvm option. Only works on Debian-based systems (Ubuntu, Debian)')
parser.add_argument('-D', '--detach-sign', action='store_true', dest='detach_sign', help='Create the assert file for detached signing. Will not commit anything.')
parser.add_argument('-n', '--no-commit', action='store_false', dest='commit_files', help='Do not commit anything to git')
parser.add_argument('signer', help='GPG signer to sign each build assert file')
parser.add_argument('version', help='Version number, commit, or branch to build. If building a commit or branch, the -c option must be specified')
parser.add_argument('--signer', dest='signer', help='GPG signer to sign each build assert file. Required to build, sign or verify')
parser.add_argument('--version', dest='version', help='Version number, commit, or branch to build. If building a commit or branch, the -c option must be specified. Required to build, sign or verify')

args = parser.parse_args()
workdir = os.getcwd()
Expand All @@ -166,7 +202,7 @@ def main():
args.windows = 'w' in args.os
args.macos = 'm' in args.os

args.is_bionic = b'bionic' in subprocess.check_output(['lsb_release', '-cs'])
args.is_bionic = platform.dist() == ('Ubuntu', '18.04', 'bionic')

if args.buildsign:
args.build=True
Expand All @@ -180,8 +216,12 @@ def main():
# Set environment variable USE_LXC or USE_DOCKER, let gitian-builder know that we use lxc or docker
if args.docker:
os.environ['USE_DOCKER'] = '1'
os.environ['USE_LXC'] = ''
os.environ['USE_VBOX'] = ''
elif not args.kvm:
os.environ['USE_LXC'] = '1'
os.environ['USE_DOCKER'] = ''
os.environ['USE_VBOX'] = ''
if not 'GITIAN_HOST_IP' in os.environ.keys():
os.environ['GITIAN_HOST_IP'] = '10.0.3.1'
if not 'LXC_GUEST_IP' in os.environ.keys():
Expand All @@ -192,13 +232,21 @@ def main():
print('Cannot build for MacOS, SDK does not exist. Will build for other OSes')
args.macos = False

if args.setup:
setup()

if not args.build and not args.sign and not args.verify:
return

script_name = os.path.basename(sys.argv[0])

# Signer and version shouldn't be empty
if args.signer == '':
if not args.signer:
print(script_name+': Missing signer.')
print('Try '+script_name+' --help for more information')
exit(1)
if args.version == '':

if not args.version:
print(script_name+': Missing version.')
print('Try '+script_name+' --help for more information')
exit(1)
Expand All @@ -208,9 +256,6 @@ def main():
raise Exception('Cannot have both commit and pull')
args.commit = ('' if args.commit else 'v') + args.version

if args.setup:
setup()

os.chdir('unit-e')
if args.pull:
subprocess.check_call(['git', 'fetch', args.url, 'refs/pull/'+args.version+'/merge'])
Expand Down
10 changes: 5 additions & 5 deletions contrib/gitian-descriptors/gitian-linux.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
name: "unite-linux-0.16"
name: "unite-linux-0.0.1"
enable_cache: true
suites:
- "trusty"
Expand Down Expand Up @@ -28,14 +28,14 @@ packages:
- "ca-certificates"
- "python"
remotes:
- "url": "https://github.com/unite/unite.git"
"dir": "unite"
- "url": "git@github.com:dtr-org/unit-e.git"
"dir": "unit-e"
files: []
script: |
WRAP_DIR=$HOME/wrapped
HOSTS="i686-pc-linux-gnu x86_64-linux-gnu arm-linux-gnueabihf aarch64-linux-gnu"
CONFIGFLAGS="--enable-glibc-back-compat --enable-reduce-exports --disable-bench --disable-gui-tests"
CONFIGFLAGS="--enable-glibc-back-compat --enable-reduce-exports --disable-bench --disable-gui-tests --with-gui=no"
FAKETIME_HOST_PROGS=""
FAKETIME_PROGS="date ar ranlib nm"
HOST_CFLAGS="-O2 -g"
Expand Down Expand Up @@ -113,7 +113,7 @@ script: |
chmod +x ${WRAP_DIR}/${prog}
done
cd unite
cd unit-e
BASEPREFIX=`pwd`/depends
# Build dependencies for each host
for i in $HOSTS; do
Expand Down
Loading

0 comments on commit f3c9480

Please sign in to comment.