gitian: add --rebuild option

Avoids delays when sourceforge is slow to respond; allows rebuilding
when disconnected from networks.
This commit is contained in:
Howard Chu 2019-11-03 13:48:55 +00:00
parent d904ffbaca
commit 32d5146689
No known key found for this signature in database
GPG Key ID: FD2A70B44AB11BA7
2 changed files with 48 additions and 12 deletions

View File

@ -226,3 +226,19 @@ To get all build options run:
./gitian-build.py --help ./gitian-build.py --help
``` ```
Doing Successive Builds
-----------------------
If you need to do multiple iterations (while developing/testing) you can use the
`--rebuild` option instead of `--build` on subsequent iterations. This skips the
initial check for the freshness of the depends tools. In particular, doing this
check all the time prevents rebuilding when you have no network access.
Local-Only Builds
-----------------
If you need to run builds while disconnected from the internet, make sure you have
local up-to-date repos in advance. Then specify your local repo using the `--url`
option when building. This will avoid attempts to git pull across a network.

View File

@ -46,19 +46,11 @@ def setup():
print('Reboot is required') print('Reboot is required')
sys.exit(0) sys.exit(0)
def build(): def rebuild():
global args, workdir global args, workdir
os.makedirs('out/' + args.version, exist_ok=True)
print('\nBuilding Dependencies\n') print('\nBuilding Dependencies\n')
os.chdir('builder') os.makedirs('out/' + args.version, exist_ok=True)
os.makedirs('inputs', exist_ok=True)
subprocess.check_call(['wget', '-N', '-P', 'inputs', 'https://downloads.sourceforge.net/project/osslsigncode/osslsigncode/osslsigncode-1.7.1.tar.gz'])
subprocess.check_call(['wget', '-N', '-P', 'inputs', 'https://bitcoincore.org/cfields/osslsigncode-Backports-to-1.7.1.patch'])
subprocess.check_output(["echo 'a8c4e9cafba922f89de0df1f2152e7be286aba73f78505169bc351a7938dd911 inputs/osslsigncode-Backports-to-1.7.1.patch' | sha256sum -c"], shell=True)
subprocess.check_output(["echo 'f9a8cdb38b9c309326764ebc937cba1523a3a751a7ab05df3ecc99d18ae466c9 inputs/osslsigncode-1.7.1.tar.gz' | sha256sum -c"], shell=True)
subprocess.check_call(['make', '-C', 'inputs/monero/contrib/depends', 'download', 'SOURCES_PATH=' + os.getcwd() + '/cache/common'])
if args.linux: if args.linux:
print('\nCompiling ' + args.version + ' Linux') print('\nCompiling ' + args.version + ' Linux')
@ -96,6 +88,23 @@ def build():
subprocess.check_call(['git', 'commit', '-m', 'Add '+args.version+' unsigned sigs for '+args.signer]) subprocess.check_call(['git', 'commit', '-m', 'Add '+args.version+' unsigned sigs for '+args.signer])
os.chdir(workdir) os.chdir(workdir)
def build():
global args, workdir
print('\nChecking Depends Freshness\n')
os.chdir('builder')
os.makedirs('inputs', exist_ok=True)
subprocess.check_call(['wget', '-N', '-P', 'inputs', 'https://downloads.sourceforge.net/project/osslsigncode/osslsigncode/osslsigncode-1.7.1.tar.gz'])
subprocess.check_call(['wget', '-N', '-P', 'inputs', 'https://bitcoincore.org/cfields/osslsigncode-Backports-to-1.7.1.patch'])
subprocess.check_output(["echo 'a8c4e9cafba922f89de0df1f2152e7be286aba73f78505169bc351a7938dd911 inputs/osslsigncode-Backports-to-1.7.1.patch' | sha256sum -c"], shell=True)
subprocess.check_output(["echo 'f9a8cdb38b9c309326764ebc937cba1523a3a751a7ab05df3ecc99d18ae466c9 inputs/osslsigncode-1.7.1.tar.gz' | sha256sum -c"], shell=True)
subprocess.check_call(['make', '-C', 'inputs/monero/contrib/depends', 'download', 'SOURCES_PATH=' + os.getcwd() + '/cache/common'])
rebuild()
def verify(): def verify():
global args, workdir global args, workdir
os.chdir('builder') os.chdir('builder')
@ -121,6 +130,8 @@ def main():
parser.add_argument('-b', '--build', action='store_true', dest='build', help='Do a Gitian build') parser.add_argument('-b', '--build', action='store_true', dest='build', help='Do a Gitian build')
parser.add_argument('-B', '--buildsign', action='store_true', dest='buildsign', help='Build both signed and unsigned binaries') parser.add_argument('-B', '--buildsign', action='store_true', dest='buildsign', help='Build both signed and unsigned binaries')
parser.add_argument('-o', '--os', dest='os', default='lawm', help='Specify which Operating Systems the build is for. Default is %(default)s. l for Linux, a for Android, w for Windows, m for MacOS') parser.add_argument('-o', '--os', dest='os', default='lawm', help='Specify which Operating Systems the build is for. Default is %(default)s. l for Linux, a for Android, w for Windows, m for MacOS')
parser.add_argument('-r', '--rebuild', action='store_true', dest='rebuild', help='Redo a Gitian build')
parser.add_argument('-R', '--rebuildsign', action='store_true', dest='rebuildsign', help='Redo and sign a Gitian build')
parser.add_argument('-j', '--jobs', dest='jobs', default='2', help='Number of processes to use. Default %(default)s') parser.add_argument('-j', '--jobs', dest='jobs', default='2', help='Number of processes to use. Default %(default)s')
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')
@ -146,6 +157,10 @@ def main():
args.build = True args.build = True
args.sign = True args.sign = True
if args.rebuildsign:
args.rebuild = 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')
@ -162,9 +177,10 @@ def main():
os.environ['LXC_GUEST_IP'] = '10.0.3.5' os.environ['LXC_GUEST_IP'] = '10.0.3.5'
# Disable MacOS build if no SDK found # Disable MacOS build if no SDK found
if args.build and args.macos and not os.path.isfile('builder/inputs/MacOSX10.11.sdk.tar.gz'): if args.macos and not os.path.isfile('builder/inputs/MacOSX10.11.sdk.tar.gz'):
print('Cannot build for MacOS, SDK does not exist. Will build for other OSes')
args.macos = False args.macos = False
if args.build:
print('Cannot build for MacOS, SDK does not exist. Will build for other OSes')
script_name = os.path.basename(sys.argv[0]) script_name = os.path.basename(sys.argv[0])
# Signer and version shouldn't be empty # Signer and version shouldn't be empty
@ -199,6 +215,10 @@ def main():
if args.build: if args.build:
build() build()
if args.rebuild:
os.chdir('builder')
rebuild()
if args.verify: if args.verify:
verify() verify()