cli.py
273 lines
| 7.4 KiB
| text/x-python
|
PythonLexer
|
r42191 | # cli.py - Command line interface for automation | ||
# | ||||
# Copyright 2019 Gregory Szorc <gregory.szorc@gmail.com> | ||||
# | ||||
# This software may be used and distributed according to the terms of the | ||||
# GNU General Public License version 2 or any later version. | ||||
# no-check-code because Python 3 native. | ||||
import argparse | ||||
import os | ||||
import pathlib | ||||
from . import ( | ||||
aws, | ||||
HGAutomation, | ||||
windows, | ||||
) | ||||
SOURCE_ROOT = pathlib.Path(os.path.abspath(__file__)).parent.parent.parent.parent | ||||
DIST_PATH = SOURCE_ROOT / 'dist' | ||||
def bootstrap_windows_dev(hga: HGAutomation, aws_region): | ||||
c = hga.aws_connection(aws_region) | ||||
image = aws.ensure_windows_dev_ami(c) | ||||
print('Windows development AMI available as %s' % image.id) | ||||
def build_inno(hga: HGAutomation, aws_region, arch, revision, version): | ||||
c = hga.aws_connection(aws_region) | ||||
image = aws.ensure_windows_dev_ami(c) | ||||
DIST_PATH.mkdir(exist_ok=True) | ||||
with aws.temporary_windows_dev_instances(c, image, 't3.medium') as insts: | ||||
instance = insts[0] | ||||
windows.synchronize_hg(SOURCE_ROOT, revision, instance) | ||||
for a in arch: | ||||
windows.build_inno_installer(instance.winrm_client, a, | ||||
DIST_PATH, | ||||
version=version) | ||||
def build_wix(hga: HGAutomation, aws_region, arch, revision, version): | ||||
c = hga.aws_connection(aws_region) | ||||
image = aws.ensure_windows_dev_ami(c) | ||||
DIST_PATH.mkdir(exist_ok=True) | ||||
with aws.temporary_windows_dev_instances(c, image, 't3.medium') as insts: | ||||
instance = insts[0] | ||||
windows.synchronize_hg(SOURCE_ROOT, revision, instance) | ||||
for a in arch: | ||||
windows.build_wix_installer(instance.winrm_client, a, | ||||
DIST_PATH, version=version) | ||||
def build_windows_wheel(hga: HGAutomation, aws_region, arch, revision): | ||||
c = hga.aws_connection(aws_region) | ||||
image = aws.ensure_windows_dev_ami(c) | ||||
DIST_PATH.mkdir(exist_ok=True) | ||||
with aws.temporary_windows_dev_instances(c, image, 't3.medium') as insts: | ||||
instance = insts[0] | ||||
windows.synchronize_hg(SOURCE_ROOT, revision, instance) | ||||
for a in arch: | ||||
windows.build_wheel(instance.winrm_client, a, DIST_PATH) | ||||
def build_all_windows_packages(hga: HGAutomation, aws_region, revision): | ||||
c = hga.aws_connection(aws_region) | ||||
image = aws.ensure_windows_dev_ami(c) | ||||
DIST_PATH.mkdir(exist_ok=True) | ||||
with aws.temporary_windows_dev_instances(c, image, 't3.medium') as insts: | ||||
instance = insts[0] | ||||
winrm_client = instance.winrm_client | ||||
windows.synchronize_hg(SOURCE_ROOT, revision, instance) | ||||
for arch in ('x86', 'x64'): | ||||
windows.purge_hg(winrm_client) | ||||
windows.build_wheel(winrm_client, arch, DIST_PATH) | ||||
windows.purge_hg(winrm_client) | ||||
windows.build_inno_installer(winrm_client, arch, DIST_PATH) | ||||
windows.purge_hg(winrm_client) | ||||
windows.build_wix_installer(winrm_client, arch, DIST_PATH) | ||||
def terminate_ec2_instances(hga: HGAutomation, aws_region): | ||||
c = hga.aws_connection(aws_region) | ||||
aws.terminate_ec2_instances(c.ec2resource) | ||||
def purge_ec2_resources(hga: HGAutomation, aws_region): | ||||
c = hga.aws_connection(aws_region) | ||||
aws.remove_resources(c) | ||||
def run_tests_windows(hga: HGAutomation, aws_region, instance_type, | ||||
python_version, arch, test_flags): | ||||
c = hga.aws_connection(aws_region) | ||||
image = aws.ensure_windows_dev_ami(c) | ||||
with aws.temporary_windows_dev_instances(c, image, instance_type, | ||||
disable_antivirus=True) as insts: | ||||
instance = insts[0] | ||||
windows.synchronize_hg(SOURCE_ROOT, '.', instance) | ||||
windows.run_tests(instance.winrm_client, python_version, arch, | ||||
test_flags) | ||||
def get_parser(): | ||||
parser = argparse.ArgumentParser() | ||||
parser.add_argument( | ||||
'--state-path', | ||||
default='~/.hgautomation', | ||||
help='Path for local state files', | ||||
) | ||||
parser.add_argument( | ||||
'--aws-region', | ||||
help='AWS region to use', | ||||
default='us-west-1', | ||||
) | ||||
subparsers = parser.add_subparsers() | ||||
sp = subparsers.add_parser( | ||||
'bootstrap-windows-dev', | ||||
help='Bootstrap the Windows development environment', | ||||
) | ||||
sp.set_defaults(func=bootstrap_windows_dev) | ||||
sp = subparsers.add_parser( | ||||
'build-all-windows-packages', | ||||
help='Build all Windows packages', | ||||
) | ||||
sp.add_argument( | ||||
'--revision', | ||||
help='Mercurial revision to build', | ||||
default='.', | ||||
) | ||||
sp.set_defaults(func=build_all_windows_packages) | ||||
sp = subparsers.add_parser( | ||||
'build-inno', | ||||
help='Build Inno Setup installer(s)', | ||||
) | ||||
sp.add_argument( | ||||
'--arch', | ||||
help='Architecture to build for', | ||||
choices={'x86', 'x64'}, | ||||
nargs='*', | ||||
default=['x64'], | ||||
) | ||||
sp.add_argument( | ||||
'--revision', | ||||
help='Mercurial revision to build', | ||||
default='.', | ||||
) | ||||
sp.add_argument( | ||||
'--version', | ||||
help='Mercurial version string to use in installer', | ||||
) | ||||
sp.set_defaults(func=build_inno) | ||||
sp = subparsers.add_parser( | ||||
'build-windows-wheel', | ||||
help='Build Windows wheel(s)', | ||||
) | ||||
sp.add_argument( | ||||
'--arch', | ||||
help='Architecture to build for', | ||||
choices={'x86', 'x64'}, | ||||
nargs='*', | ||||
default=['x64'], | ||||
) | ||||
sp.add_argument( | ||||
'--revision', | ||||
help='Mercurial revision to build', | ||||
default='.', | ||||
) | ||||
sp.set_defaults(func=build_windows_wheel) | ||||
sp = subparsers.add_parser( | ||||
'build-wix', | ||||
help='Build WiX installer(s)' | ||||
) | ||||
sp.add_argument( | ||||
'--arch', | ||||
help='Architecture to build for', | ||||
choices={'x86', 'x64'}, | ||||
nargs='*', | ||||
default=['x64'], | ||||
) | ||||
sp.add_argument( | ||||
'--revision', | ||||
help='Mercurial revision to build', | ||||
default='.', | ||||
) | ||||
sp.add_argument( | ||||
'--version', | ||||
help='Mercurial version string to use in installer', | ||||
) | ||||
sp.set_defaults(func=build_wix) | ||||
sp = subparsers.add_parser( | ||||
'terminate-ec2-instances', | ||||
help='Terminate all active EC2 instances managed by us', | ||||
) | ||||
sp.set_defaults(func=terminate_ec2_instances) | ||||
sp = subparsers.add_parser( | ||||
'purge-ec2-resources', | ||||
help='Purge all EC2 resources managed by us', | ||||
) | ||||
sp.set_defaults(func=purge_ec2_resources) | ||||
sp = subparsers.add_parser( | ||||
'run-tests-windows', | ||||
help='Run tests on Windows', | ||||
) | ||||
sp.add_argument( | ||||
'--instance-type', | ||||
help='EC2 instance type to use', | ||||
default='t3.medium', | ||||
) | ||||
sp.add_argument( | ||||
'--python-version', | ||||
help='Python version to use', | ||||
choices={'2.7', '3.5', '3.6', '3.7', '3.8'}, | ||||
default='2.7', | ||||
) | ||||
sp.add_argument( | ||||
'--arch', | ||||
help='Architecture to test', | ||||
choices={'x86', 'x64'}, | ||||
default='x64', | ||||
) | ||||
sp.add_argument( | ||||
'--test-flags', | ||||
help='Extra command line flags to pass to run-tests.py', | ||||
) | ||||
sp.set_defaults(func=run_tests_windows) | ||||
return parser | ||||
def main(): | ||||
parser = get_parser() | ||||
args = parser.parse_args() | ||||
local_state_path = pathlib.Path(os.path.expanduser(args.state_path)) | ||||
automation = HGAutomation(local_state_path) | ||||
if not hasattr(args, 'func'): | ||||
parser.print_help() | ||||
return | ||||
kwargs = dict(vars(args)) | ||||
del kwargs['func'] | ||||
del kwargs['state_path'] | ||||
args.func(automation, **kwargs) | ||||