Add option to run gitian-build.py on non-debian os

This commits adds the `--no-apt` flag to the gitian-build.py script.
This allows gitian builds to be run without root access and non-debian
based operating systems.
This commit is contained in:
TheCharlatan 2019-06-11 20:08:53 +02:00
parent 51766d026b
commit afbf05bc58
2 changed files with 25 additions and 21 deletions

View file

@ -80,14 +80,23 @@ Building in docker does not require much setup. Install docker on your host, the
```bash ```bash
sudo apt-get install git make curl sudo apt-get install git make curl
sudo usermod -aG docker gitianuser
``` ```
Optionally add yourself to the docker group. Note that this will give docker root access to your system.
```bash
sudo usermod -aG docker gitianuser
```
Manual and Building Manual and Building
------------------- -------------------
The instructions below use the automated script [gitian-build.py](gitian-build.py) which only works in Ubuntu. The instructions below use the automated script [gitian-build.py](gitian-build.py) which only works in Ubuntu.
=======
The script automatically installs some packages with apt. If you are not running it on a debian-like system, pass `--no-apt` along with the other
arguments to it. It calls all available .yml descriptors, which in turn pass the build configurations for different platforms to gitian.
The instructions below use the automated script [gitian-build.py](gitian-build.py) which is tested to work on Ubuntu.
It calls all available .yml descriptors, which in turn pass the build configurations for different platforms to gitian. It calls all available .yml descriptors, which in turn pass the build configurations for different platforms to gitian.
Help for the build steps taken can be accessed with `./gitian-build.py --help`. Help for the build steps taken can be accessed with `./gitian-build.py --help`.

View file

@ -7,21 +7,13 @@ import sys
def setup(): def setup():
global args, workdir global args, workdir
programs = ['ruby', 'git', 'apt-cacher-ng', 'make', 'wget'] programs = ['apt-cacher-ng', 'ruby', 'git', 'make', 'wget']
if args.kvm: if args.kvm:
programs += ['python-vm-builder', 'qemu-kvm', 'qemu-utils'] programs += ['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)
else: else:
programs += ['lxc', 'debootstrap'] programs += ['lxc', 'debootstrap']
subprocess.check_call(['sudo', 'apt-get', 'install', '-qq'] + programs) if not args.no_apt:
subprocess.check_call(['sudo', 'apt-get', 'install', '-qq'] + programs)
if not os.path.isdir('gitian.sigs'): if not os.path.isdir('gitian.sigs'):
subprocess.check_call(['git', 'clone', 'https://github.com/monero-project/gitian.sigs.git']) subprocess.check_call(['git', 'clone', 'https://github.com/monero-project/gitian.sigs.git'])
if not os.path.isdir('gitian-builder'): if not os.path.isdir('gitian-builder'):
@ -32,6 +24,8 @@ def setup():
subprocess.check_call(['git', 'checkout', '963322de8420c50502c4cc33d4d7c0d84437b576']) subprocess.check_call(['git', 'checkout', '963322de8420c50502c4cc33d4d7c0d84437b576'])
make_image_prog = ['bin/make-base-vm', '--suite', 'bionic', '--arch', 'amd64'] make_image_prog = ['bin/make-base-vm', '--suite', 'bionic', '--arch', 'amd64']
if args.docker: if args.docker:
if not subprocess.call(['docker', '--help'], shell=False, stdout=subprocess.DEVNULL):
print("Please install docker first manually")
make_image_prog += ['--docker'] make_image_prog += ['--docker']
elif not args.kvm: elif not args.kvm:
make_image_prog += ['--lxc'] make_image_prog += ['--lxc']
@ -40,7 +34,7 @@ def setup():
if args.is_bionic and not args.kvm and not args.docker: if args.is_bionic and not args.kvm and not args.docker:
subprocess.check_call(['sudo', 'sed', '-i', 's/lxcbr0/br0/', '/etc/default/lxc-net']) subprocess.check_call(['sudo', 'sed', '-i', 's/lxcbr0/br0/', '/etc/default/lxc-net'])
print('Reboot is required') print('Reboot is required')
exit(0) sys.exit(0)
def build(): def build():
global args, workdir global args, workdir
@ -100,7 +94,7 @@ def verify():
def main(): def main():
global args, workdir global args, workdir
parser = argparse.ArgumentParser(usage='%(prog)s [options] signer version') parser = argparse.ArgumentParser(description='Script for running full Gitian builds.', usage='%(prog)s [options] signer version')
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('-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('-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/monero-project/monero', help='Specify the URL of the repository. Default is %(default)s') parser.add_argument('-u', '--url', dest='url', default='https://github.com/monero-project/monero', help='Specify the URL of the repository. Default is %(default)s')
@ -112,11 +106,12 @@ def main():
parser.add_argument('-m', '--memory', dest='memory', default='2000', help='Memory to allocate in MiB. Default %(default)s') parser.add_argument('-m', '--memory', dest='memory', default='2000', help='Memory to allocate in MiB. Default %(default)s')
parser.add_argument('-k', '--kvm', action='store_true', dest='kvm', help='Use KVM instead of LXC') parser.add_argument('-k', '--kvm', action='store_true', dest='kvm', help='Use KVM instead of LXC')
parser.add_argument('-d', '--docker', action='store_true', dest='docker', help='Use Docker instead of LXC') parser.add_argument('-d', '--docker', action='store_true', dest='docker', help='Use Docker instead of LXC')
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('-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. If you run this script on a non-debian based system, pass the --no-apt flag')
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('-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('-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('signer', nargs='?', help='GPG signer to sign each build assert file')
parser.add_argument('version', help='Version number, commit, or branch to build.') parser.add_argument('version', nargs='?', help='Version number, commit, or branch to build.')
parser.add_argument('-a', '--no-apt', action='store_true', dest='no_apt', help='Indicate that apt is not installed on the system')
args = parser.parse_args() args = parser.parse_args()
workdir = os.getcwd() workdir = os.getcwd()
@ -128,8 +123,8 @@ def main():
args.is_bionic = b'bionic' in subprocess.check_output(['lsb_release', '-cs']) args.is_bionic = b'bionic' in subprocess.check_output(['lsb_release', '-cs'])
if args.buildsign: if args.buildsign:
args.build=True args.build = True
args.sign=True args.sign = True
if args.kvm and args.docker: if args.kvm and args.docker:
raise Exception('Error: cannot have both kvm and docker') raise Exception('Error: cannot have both kvm and docker')
@ -156,11 +151,11 @@ def main():
if args.signer == '': if args.signer == '':
print(script_name+': Missing signer.') print(script_name+': Missing signer.')
print('Try '+script_name+' --help for more information') print('Try '+script_name+' --help for more information')
exit(1) sys.exit(1)
if args.version == '': if args.version == '':
print(script_name+': Missing version.') print(script_name+': Missing version.')
print('Try '+script_name+' --help for more information') print('Try '+script_name+' --help for more information')
exit(1) sys.exit(1)
# Add leading 'v' for tags # Add leading 'v' for tags
if args.commit and args.pull: if args.commit and args.pull: