Refactor package building CLI
[integration/packaging.git] / packages / build.py
1 #!/usr/bin/env python
2 ##############################################################################
3 # Copyright (c) 2016 Daniel Farrell and Others.  All rights reserved.
4 #
5 # This program and the accompanying materials are made available under the
6 # terms of the Eclipse Public License v1.0 which accompanies this distribution,
7 # and is available at http://www.eclipse.org/legal/epl-v10.html
8 ##############################################################################
9
10 import argparse
11 import sys
12
13 from deb import build as build_deb
14 from rpm import build as build_rpm
15 import vars
16
17 if __name__ == "__main__":
18     # Accept a build definition via args
19     parent_parser = argparse.ArgumentParser(
20         add_help=False,
21         description="Package OpenDaylight build as RPM/deb.")
22     parent_parser._optionals.title = "Package type (required)"
23
24     # All builds require a package-type arg
25     pkg_type_group = parent_parser.add_mutually_exclusive_group(required=True)
26     pkg_type_group.add_argument("--rpm", action="store_true",
27                                 help="package build as RPM")
28     pkg_type_group.add_argument("--deb", action="store_true",
29                                 help="package build as deb")
30
31     # All builds accept optional changelog name/email, sysd commit args
32     opt_args_group = parent_parser.add_argument_group(
33         "Additional config (optional)")
34     opt_args_group.add_argument(
35         "--sysd_commit", help="version of ODL systemd unit file to package")
36     opt_args_group.add_argument("--changelog_name", default="Jenkins",
37                                 help="name of person who defined package")
38     opt_args_group.add_argument("--changelog_email",
39                                 default="jenkins-donotreply@opendaylight.org",
40                                 help="email of person who defined package")
41
42     # Use subparsers to accept args specific to build location
43     subparsers = parent_parser.add_subparsers(
44         title="Build location (required)")
45
46     # Create subparser for defining builds directly from a URL
47     direct_parser = subparsers.add_parser("direct",
48                                           help="package build at URL")
49
50     direct_parser._optionals.title = "Options"
51
52     # Direct builds require a archive URL
53     direct_parser.add_argument("--download_url", required=True,
54                                help="URL to tar/zip build archive to package")
55
56     # Create subparser for building latest snapshot from a given branch
57     latest_snap_parser = subparsers.add_parser(
58         "latest_snap",
59         help="package latest snapshot build of given major version")
60
61     latest_snap_parser._optionals.title = "Options"
62
63     # Latest-snapshot builds require a major version to pkg last build from
64     latest_snap_parser.add_argument(
65         "--major", required=True,
66         help="major version to package latest snapshot from")
67
68     # Print help if no arguments are given
69     if len(sys.argv) == 1:
70         parent_parser.print_help()
71         sys.exit(1)
72
73     # Extract passed args
74     args = parent_parser.parse_args()
75
76     # Build definition, populated below
77     build = {}
78
79     # Add changelog name/email to build definition
80     build.update({"changelog_name": args.changelog_name,
81                   "changelog_email": args.changelog_email})
82
83     # Depending on pkg type, add appropriate-format changelog date to build def
84     if args.rpm:
85         build.update({"changelog_date": vars.get_changelog_date("rpm")})
86     if args.deb:
87         build.update({"changelog_date": vars.get_changelog_date("deb")})
88
89     # If hash of systemd unit file given add to build def, else use latest hash
90     if args.sysd_commit:
91         build.update({"sysd_commit": args.sysd_commit})
92     else:
93         build.update({"sysd_commit": vars.get_sysd_commit()})
94
95     # Argparse rules imply args.major will only be present for latest_snap
96     # builds and args.download_url will only be present for generic builds.
97     # If doing a latest-snap build, find latest build tarball URL for given
98     # major version and add to build definition. Else, add URL directly.
99     if hasattr(args, "major"):
100         # FIXME: In the process of removing minor_version, pass None for now
101         build.update({"download_url": vars.get_snap_url(args.major, None)})
102     else:
103         build.update({"download_url": args.download_url})
104
105     # Use download_url to find pkg version, add to build def
106     build.update(vars.extract_version(build["download_url"]))
107
108     # Karaf 3 distros use distribution-karaf-, Karaf 4 uses karaf-
109     build.update({"distro_name_prefix": vars.get_distro_name_prefix(
110         build['version_major'])})
111
112     # Update build definition with Java version required by ODL version
113     build.update({"java_version": vars.get_java_version(
114         build['version_major'])})
115
116     # Use package-specific helper logic to do the specified build
117     if args.rpm:
118         build_rpm.build_rpm(build)
119     elif args.deb:
120         build_deb.build_deb(build)