X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=packages%2Fbuild.py;h=3bedc6a2df735b65683bced84ca7d3f21f56cc01;hb=0457d62d378931bb7f6a078add46583feca0ad0b;hp=ed1a9dca59e3448558300a45c139565d2a105374;hpb=e29cf36568db5863457e4b541ad2e17aa8768c99;p=integration%2Fpackaging.git diff --git a/packages/build.py b/packages/build.py index ed1a9dc..3bedc6a 100755 --- a/packages/build.py +++ b/packages/build.py @@ -1,5 +1,4 @@ #!/usr/bin/env python - ############################################################################## # Copyright (c) 2016 Daniel Farrell and Others. All rights reserved. # @@ -11,98 +10,131 @@ import argparse import sys -from deb import build as build_deb -from rpm import build as build_rpm -import vars +import lib + +from deb import lib as deb_lib +from rpm import lib as rpm_lib if __name__ == "__main__": - # Accept the version(s) of the build(s) to perform as args - # TODO: More docs on ArgParser and argument - parser = argparse.ArgumentParser(add_help=False, - conflict_handler='resolve') - parser._optionals.title = "Required Arguments" - - package_build_group = parser.add_mutually_exclusive_group(required=True) - package_build_group.add_argument("--rpm", action="store_true", - help="Builds RPM package") - package_build_group.add_argument("--deb", action="store_true", - help="Builds DEB package") - - new_build_group = parser.add_argument_group("New build") - new_build_group.add_argument( - "--download_url", help="Tarball to repackage into package") - new_build_group.add_argument( - "--sysd_commit", help="Version of ODL unitfile to package") - new_build_group.add_argument( - "--changelog_name", help="Name of person who defined package") - new_build_group.add_argument( - "--changelog_email", help="Email of person who defined package") - - # Arguments needed to build RPM from latest snapshot - # given a stable major branch - latest_snap_group = parser.add_argument_group("Latest snapshot build") - latest_snap_group.add_argument("--build-latest-snap", action='store_true', - help="Build package from the latest snpashot") - latest_snap_group.add_argument("--major", help="Stable branch from which " - "to build the snapshot") - latest_snap_group.add_argument("--minor", help="Minor version of the " - "stable branch to build the snapshot") - latest_snap_group.add_argument("--sysd_commit", - help="Version of ODL unitfile to package") - latest_snap_group.add_argument("--changelog_name", - help="Name of person who defined package") - latest_snap_group.add_argument("--changelog_email", - help="Email of person who defined package") + # Accept a build definition via args + parent_parser = argparse.ArgumentParser( + add_help=False, + description="Package OpenDaylight build as RPM/deb.") + parent_parser._optionals.title = "Package type (required)" + + # All builds require a package-type arg + pkg_type_group = parent_parser.add_mutually_exclusive_group(required=True) + pkg_type_group.add_argument("--rpm", action="store_true", + help="package build as RPM") + pkg_type_group.add_argument("--deb", action="store_true", + help="package build as deb") + + # All builds accept optional changelog name/email, sysd commit args + opt_args_group = parent_parser.add_argument_group( + "Additional config (optional)") + opt_args_group.add_argument( + "--sysd_commit", help="version of ODL systemd unit file to package") + opt_args_group.add_argument("--changelog_name", default="Jenkins", + help="name of person who defined package") + opt_args_group.add_argument("--changelog_email", + default="jenkins-donotreply@opendaylight.org", + help="email of person who defined package") + + # Use subparsers to accept args specific to build location + subparsers = parent_parser.add_subparsers( + title="Build location (required)") + + # Create subparser for defining builds directly from a URL + direct_parser = subparsers.add_parser("direct", + help="package build at URL") + + direct_parser._optionals.title = "Options" + + # Direct builds require an archive URL + direct_parser.add_argument("--download_url", required=True, + help="URL to tar/zip build archive to package") + direct_parser.add_argument( + "--pkg_version", help="Override autodetected package component of RPM version (maj.min.pat-pkg)'") + + # Create subparser for building latest snapshot from a given branch + latest_snap_parser = subparsers.add_parser( + "latest_snap", + help="package latest snapshot build of given major version") + + latest_snap_parser._optionals.title = "Options" + + # Latest-snapshot builds require a major version to pkg last build from + latest_snap_parser.add_argument( + "--major", required=True, + help="major version to package latest snapshot from") + # Print help if no arguments are given if len(sys.argv) == 1: - parser.print_help() + parent_parser.print_help() sys.exit(1) - # Parse the given args - args = parser.parse_args() + # Extract passed args + args = parent_parser.parse_args() - # A dictionary containing essential build variables + # Build definition, populated below build = {} - # Depending on package type, create an appropriate changelog datetime + # Add changelog name to build definition + if not args.changelog_name: + # If empty string passed, as happens when a bash script calls this + # script with unset var, use default + build.update({"changelog_name": "Jenkins"}) + else: + build.update({"changelog_name": args.changelog_name}) + + # Add changelog email to build definition + if not args.changelog_email: + # If empty string passed, as happens when a bash script calls this + # script with unset var, use default + build.update( + {"changelog_email": "jenkins-donotreply@opendaylight.org"}) + else: + build.update({"changelog_email": args.changelog_email}) + + # Depending on pkg type, add appropriate-format changelog date to build def if args.rpm: - build.update({"changelog_date": vars.get_changelog_date("rpm")}) + build.update({"changelog_date": lib.get_changelog_date("rpm")}) if args.deb: - build.update({"changelog_date": vars.get_changelog_date("deb")}) - - # Check if `sysd_commit` has been passed as an arg - # Use latest Int/Pack repo commit hash as sysd_commit var - # unless passed by param - if not args.sysd_commit: - args.sysd_commit = vars.get_sysd_commit() - - # If the flag `--build-latest-snap` is true, extract information - # from the snapshot URL using major version and minor version(optional) - if args.build_latest_snap: - if args.major: - build.update({'version_major': args.major}) - if args.minor: - build.update({'version_minor': args.minor}) - args.download_url = vars.get_snap_url(args.major, args.minor) - - # If download_url is given, update version info - if args.download_url: + build.update({"changelog_date": lib.get_changelog_date("deb")}) + + # If hash of systemd unit file given add to build def, else use latest hash + if args.sysd_commit: + build.update({"sysd_commit": args.sysd_commit}) + else: + build.update({"sysd_commit": lib.get_sysd_commit()}) + + # Argparse rules imply args.major will only be present for latest_snap + # builds and args.download_url will only be present for generic builds. + # If doing a latest-snap build, find latest build tarball URL for given + # major version and add to build definition. Else, add URL directly. + if hasattr(args, "major"): + build.update({"download_url": lib.get_snap_url(args.major)}) + else: build.update({"download_url": args.download_url}) - version = vars.extract_version(args.download_url) - build.update(version) - - java_version_required = vars.get_java_version(build['version_major']) - - # Common parameters for all new and snapshot builds - build.update({"download_url": args.download_url, - "sysd_commit": args.sysd_commit, - "java_version": java_version_required, - "changelog_name": args.changelog_name, - "changelog_email": args.changelog_email, - }) + + # Use download_url to find pkg version, add to build def + build.update(lib.extract_version(build["download_url"])) + + # Override automatically extracted package version with param if passed + if (hasattr(args, "pkg_version") and args.pkg_version is not None and + args.pkg_version is not ""): + build['pkg_version'] = args.pkg_version + + # Karaf 3 distros use distribution-karaf-, Karaf 4 uses karaf- + build.update({"distro_name_prefix": lib.get_distro_name_prefix( + build['version_major'], build['download_url'])}) + + # Update build definition with Java version required by ODL version + build.update({"java_version": lib.get_java_version( + build['version_major'])}) + + # Use package-specific helper logic to do the specified build if args.rpm: - build_rpm.build_rpm(build) + rpm_lib.build_rpm(build) elif args.deb: - build_deb.build_deb(build) - else: - raise ValueError("Unknown package type") + deb_lib.build_deb(build)