Skip to content

Commit f49b8d4

Browse files
author
MarcoFalke
committed
Merge #13998: Scripts and tools: gitian-build.py improvements and corrections
0f22a0c Fix gitian-build.py --verify option (Hennadii Stepanov) 4c56a79 Set/unset USE_LXC, USE_VBOX, USE_DOCKER explicitly (Hennadii Stepanov) cbbd988 Fix Docker related issues for gitian-build.py (Hennadii Stepanov) Pull request description: 1. The Docker does not depend on `apt-cacher-ng` package. Ref: #14002. 2. Do not try to install the Docker if `docker.service` is detected on the system (e.g., the Docker was installed manually). Fix bitcoin/bitcoin#13623 (comment) by **Sjors**. 3. Prevent the setting of more than one environment variable for the `gitian-builder` (an alternative to #13999). E.g., USE_LXC being set shadows USE_DOCKER; for details see [`gitian-builder/libexec/make-clean-vm`](https://github.com/devrandom/gitian-builder/blob/93a62c7d7d018c66c02a19bac3d751144043cfec/libexec/make-clean-vm#L7): ```sh VMSW=KVM if [ -n "$USE_LXC" ]; then VMSW=LXC elif [ -n "$USE_VBOX" ]; then VMSW=VBOX elif [ -n "$USE_DOCKER" ]; then VMSW=DOCKER fi ``` 4. The [`gitian-builder/bin/gverify`](https://github.com/devrandom/gitian-builder/blob/master/bin/gverify) script returns the exit code 1 if a signature verification ends with 'BAD SIGNATURE' or 'MISMATCH' by design. This PR allows to see the verification results for all signatures without a premature fail of the `gitian-build.py` script. Ref: #14014. ACKs for commit 0f22a0: Tree-SHA512: 55f8a5cffa20d0c745f51a687f3199cea015fa616e56a0aee4c25b5ca0985036c61e8cf1922515338d8c6a85f873674ebe7a9a56a5069d65a187e383150f1a83
2 parents 149b347 + 0f22a0c commit f49b8d4

File tree

1 file changed

+41
-21
lines changed

1 file changed

+41
-21
lines changed

contrib/gitian-build.py

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,20 @@
77

88
def setup():
99
global args, workdir
10-
programs = ['ruby', 'git', 'apt-cacher-ng', 'make', 'wget']
10+
programs = ['ruby', 'git', 'make', 'wget']
1111
if args.kvm:
12-
programs += ['python-vm-builder', 'qemu-kvm', 'qemu-utils']
13-
elif args.docker:
12+
programs += ['apt-cacher-ng', 'python-vm-builder', 'qemu-kvm', 'qemu-utils']
13+
elif args.docker and not os.path.isfile('/lib/systemd/system/docker.service'):
1414
dockers = ['docker.io', 'docker-ce']
1515
for i in dockers:
1616
return_code = subprocess.call(['sudo', 'apt-get', 'install', '-qq', i])
1717
if return_code == 0:
1818
break
1919
if return_code != 0:
20-
print('Cannot find any way to install docker', file=sys.stderr)
21-
exit(1)
20+
print('Cannot find any way to install Docker.', file=sys.stderr)
21+
sys.exit(1)
2222
else:
23-
programs += ['lxc', 'debootstrap']
23+
programs += ['apt-cacher-ng', 'lxc', 'debootstrap']
2424
subprocess.check_call(['sudo', 'apt-get', 'install', '-qq'] + programs)
2525
if not os.path.isdir('gitian.sigs'):
2626
subprocess.check_call(['git', 'clone', 'https://github.com/bitcoin-core/gitian.sigs.git'])
@@ -41,7 +41,7 @@ def setup():
4141
if args.is_bionic and not args.kvm and not args.docker:
4242
subprocess.check_call(['sudo', 'sed', '-i', 's/lxcbr0/br0/', '/etc/default/lxc-net'])
4343
print('Reboot is required')
44-
exit(0)
44+
sys.exit(0)
4545

4646
def build():
4747
global args, workdir
@@ -118,20 +118,36 @@ def sign():
118118

119119
def verify():
120120
global args, workdir
121+
rc = 0
121122
os.chdir('gitian-builder')
122123

123124
print('\nVerifying v'+args.version+' Linux\n')
124-
subprocess.check_call(['bin/gverify', '-v', '-d', '../gitian.sigs/', '-r', args.version+'-linux', '../bitcoin/contrib/gitian-descriptors/gitian-linux.yml'])
125+
if subprocess.call(['bin/gverify', '-v', '-d', '../gitian.sigs/', '-r', args.version+'-linux', '../bitcoin/contrib/gitian-descriptors/gitian-linux.yml']):
126+
print('Verifying v'+args.version+' Linux FAILED\n')
127+
rc = 1
128+
125129
print('\nVerifying v'+args.version+' Windows\n')
126-
subprocess.check_call(['bin/gverify', '-v', '-d', '../gitian.sigs/', '-r', args.version+'-win-unsigned', '../bitcoin/contrib/gitian-descriptors/gitian-win.yml'])
130+
if subprocess.call(['bin/gverify', '-v', '-d', '../gitian.sigs/', '-r', args.version+'-win-unsigned', '../bitcoin/contrib/gitian-descriptors/gitian-win.yml']):
131+
print('Verifying v'+args.version+' Windows FAILED\n')
132+
rc = 1
133+
127134
print('\nVerifying v'+args.version+' MacOS\n')
128-
subprocess.check_call(['bin/gverify', '-v', '-d', '../gitian.sigs/', '-r', args.version+'-osx-unsigned', '../bitcoin/contrib/gitian-descriptors/gitian-osx.yml'])
135+
if subprocess.call(['bin/gverify', '-v', '-d', '../gitian.sigs/', '-r', args.version+'-osx-unsigned', '../bitcoin/contrib/gitian-descriptors/gitian-osx.yml']):
136+
print('Verifying v'+args.version+' MacOS FAILED\n')
137+
rc = 1
138+
129139
print('\nVerifying v'+args.version+' Signed Windows\n')
130-
subprocess.check_call(['bin/gverify', '-v', '-d', '../gitian.sigs/', '-r', args.version+'-win-signed', '../bitcoin/contrib/gitian-descriptors/gitian-win-signer.yml'])
140+
if subprocess.call(['bin/gverify', '-v', '-d', '../gitian.sigs/', '-r', args.version+'-win-signed', '../bitcoin/contrib/gitian-descriptors/gitian-win-signer.yml']):
141+
print('Verifying v'+args.version+' Signed Windows FAILED\n')
142+
rc = 1
143+
131144
print('\nVerifying v'+args.version+' Signed MacOS\n')
132-
subprocess.check_call(['bin/gverify', '-v', '-d', '../gitian.sigs/', '-r', args.version+'-osx-signed', '../bitcoin/contrib/gitian-descriptors/gitian-osx-signer.yml'])
145+
if subprocess.call(['bin/gverify', '-v', '-d', '../gitian.sigs/', '-r', args.version+'-osx-signed', '../bitcoin/contrib/gitian-descriptors/gitian-osx-signer.yml']):
146+
print('Verifying v'+args.version+' Signed MacOS FAILED\n')
147+
rc = 1
133148

134149
os.chdir(workdir)
150+
return rc
135151

136152
def main():
137153
global args, workdir
@@ -149,7 +165,7 @@ def main():
149165
parser.add_argument('-m', '--memory', dest='memory', default='2000', help='Memory to allocate in MiB. Default %(default)s')
150166
parser.add_argument('-k', '--kvm', action='store_true', dest='kvm', help='Use KVM instead of LXC')
151167
parser.add_argument('-d', '--docker', action='store_true', dest='docker', help='Use Docker instead of LXC')
152-
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)')
168+
parser.add_argument('-S', '--setup', action='store_true', dest='setup', help='Set up the Gitian building environment. Only works on Debian-based systems (Ubuntu, Debian)')
153169
parser.add_argument('-D', '--detach-sign', action='store_true', dest='detach_sign', help='Create the assert file for detached signing. Will not commit anything.')
154170
parser.add_argument('-n', '--no-commit', action='store_false', dest='commit_files', help='Do not commit anything to git')
155171
parser.add_argument('signer', help='GPG signer to sign each build assert file')
@@ -165,22 +181,26 @@ def main():
165181
args.is_bionic = b'bionic' in subprocess.check_output(['lsb_release', '-cs'])
166182

167183
if args.buildsign:
168-
args.build=True
169-
args.sign=True
184+
args.build = True
185+
args.sign = True
170186

171187
if args.kvm and args.docker:
172188
raise Exception('Error: cannot have both kvm and docker')
173189

174190
args.sign_prog = 'true' if args.detach_sign else 'gpg --detach-sign'
175191

176-
# Set environment variable USE_LXC or USE_DOCKER, let gitian-builder know that we use lxc or docker
192+
# Ensure no more than one environment variable for gitian-builder (USE_LXC, USE_VBOX, USE_DOCKER) is set as they
193+
# can interfere (e.g., USE_LXC being set shadows USE_DOCKER; for details see gitian-builder/libexec/make-clean-vm).
194+
os.environ['USE_LXC'] = ''
195+
os.environ['USE_VBOX'] = ''
196+
os.environ['USE_DOCKER'] = ''
177197
if args.docker:
178198
os.environ['USE_DOCKER'] = '1'
179199
elif not args.kvm:
180200
os.environ['USE_LXC'] = '1'
181-
if not 'GITIAN_HOST_IP' in os.environ.keys():
201+
if 'GITIAN_HOST_IP' not in os.environ.keys():
182202
os.environ['GITIAN_HOST_IP'] = '10.0.3.1'
183-
if not 'LXC_GUEST_IP' in os.environ.keys():
203+
if 'LXC_GUEST_IP' not in os.environ.keys():
184204
os.environ['LXC_GUEST_IP'] = '10.0.3.5'
185205

186206
# Disable for MacOS if no SDK found
@@ -193,11 +213,11 @@ def main():
193213
if args.signer == '':
194214
print(script_name+': Missing signer.')
195215
print('Try '+script_name+' --help for more information')
196-
exit(1)
216+
sys.exit(1)
197217
if args.version == '':
198218
print(script_name+': Missing version.')
199219
print('Try '+script_name+' --help for more information')
200-
exit(1)
220+
sys.exit(1)
201221

202222
# Add leading 'v' for tags
203223
if args.commit and args.pull:
@@ -233,7 +253,7 @@ def main():
233253
os.chdir('gitian.sigs')
234254
subprocess.check_call(['git', 'pull'])
235255
os.chdir(workdir)
236-
verify()
256+
sys.exit(verify())
237257

238258
if __name__ == '__main__':
239259
main()

0 commit comments

Comments
 (0)