c829353037b65980b1c00c6a8ce76b30a5647df1
[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 import lib
14
15 from deb import lib as deb_lib
16 from rpm import lib as rpm_lib
17
18 if __name__ == "__main__":
19     # Accept a build definition via args
20     parent_parser = argparse.ArgumentParser(
21         add_help=False,
22         description="Package OpenDaylight build as RPM/deb.")
23     parent_parser._optionals.title = "Package type (required)"
24
25     # All builds require a package-type arg
26     pkg_type_group = parent_parser.add_mutually_exclusive_group(required=True)
27     pkg_type_group.add_argument("--rpm", action="store_true",
28                                 help="package build as RPM")
29     pkg_type_group.add_argument("--deb", action="store_true",
30                                 help="package build as deb")
31
32     # All builds accept optional changelog name/email, sysd commit args
33     opt_args_group = parent_parser.add_argument_group(
34         "Additional config (optional)")
35     opt_args_group.add_argument(
36         "--sysd_commit", help="version of ODL systemd unit file to package")
37     opt_args_group.add_argument("--changelog_name", default="Jenkins",
38                                 help="name of person who defined package")
39     opt_args_group.add_argument("--changelog_email",
40                                 default="jenkins-donotreply@opendaylight.org",
41                                 help="email of person who defined package")
42
43     # Use subparsers to accept args specific to build location
44     subparsers = parent_parser.add_subparsers(
45         title="Build location (required)")
46
47     # Create subparser for defining builds directly from a URL
48     direct_parser = subparsers.add_parser("direct",
49                                           help="package build at URL")
50
51     direct_parser._optionals.title = "Options"
52
53     # Direct builds require an archive URL
54     direct_parser.add_argument("--download_url", required=True,
55                                help="URL to tar/zip build archive to package")
56
57     # Create subparser for building latest snapshot from a given branch
58     latest_snap_parser = subparsers.add_parser(
59         "latest_snap",
60         help="package latest snapshot build of given major version")
61
62     latest_snap_parser._optionals.title = "Options"
63
64     # Latest-snapshot builds require a major version to pkg last build from
65     latest_snap_parser.add_argument(
66         "--major", required=True,
67         help="major version to package latest snapshot from")
68
69     # Print help if no arguments are given
70     if len(sys.argv) == 1:
71         parent_parser.print_help()
72         sys.exit(1)
73
74     # Extract passed args
75     args = parent_parser.parse_args()
76
77     # Build definition, populated below
78     build = {}
79
80     # Add changelog name to build definition
81     if not args.changelog_name:
82         # If empty string passed, as happens when a bash script calls this
83         # script with unset var, use default
84         build.update({"changelog_name": "Jenkins"})
85     else:
86         build.update({"changelog_name": args.changelog_name})
87
88     # Add changelog email to build definition
89     if not args.changelog_email:
90         # If empty string passed, as happens when a bash script calls this
91         # script with unset var, use default
92         build.update(
93             {"changelog_email": "jenkins-donotreply@opendaylight.org"})
94     else:
95         build.update({"changelog_email": args.changelog_email})
96
97     # Depending on pkg type, add appropriate-format changelog date to build def
98     if args.rpm:
99         build.update({"changelog_date": lib.get_changelog_date("rpm")})
100     if args.deb:
101         build.update({"changelog_date": lib.get_changelog_date("deb")})
102
103     # If hash of systemd unit file given add to build def, else use latest hash
104     if args.sysd_commit:
105         build.update({"sysd_commit": args.sysd_commit})
106     else:
107         build.update({"sysd_commit": lib.get_sysd_commit()})
108
109     # Argparse rules imply args.major will only be present for latest_snap
110     # builds and args.download_url will only be present for generic builds.
111     # If doing a latest-snap build, find latest build tarball URL for given
112     # major version and add to build definition. Else, add URL directly.
113     if hasattr(args, "major"):
114         build.update({"download_url": lib.get_snap_url(args.major)})
115     else:
116         build.update({"download_url": args.download_url})
117
118     # Use download_url to find pkg version, add to build def
119     build.update(lib.extract_version(build["download_url"]))
120
121     # Karaf 3 distros use distribution-karaf-, Karaf 4 uses karaf-
122     build.update({"distro_name_prefix": lib.get_distro_name_prefix(
123         build['version_major'], build['download_url'])})
124
125     # Update build definition with Java version required by ODL version
126     build.update({"java_version": lib.get_java_version(
127         build['version_major'])})
128
129     # Use package-specific helper logic to do the specified build
130     if args.rpm:
131         rpm_lib.build_rpm(build)
132     elif args.deb:
133         deb_lib.build_deb(build)