Merge lp:~heber013/qakit/launch-job-package into lp:qakit

Proposed by Heber Parrucci
Status: Merged
Merged at revision: 266
Proposed branch: lp:~heber013/qakit/launch-job-package
Merge into: lp:qakit
Diff against target: 156 lines (+152/-0)
1 file modified
qakit/ust/launch_tests_for_package.py (+152/-0)
To merge this branch: bzr merge lp:~heber013/qakit/launch-job-package
Reviewer Review Type Date Requested Status
Jean-Baptiste Lallement Approve
Review via email: mp+337438@code.launchpad.net

Commit message

Adding script for launching jenkins job for a package

Description of the change

Script to launch a given ust jenkins job when a new version of a particular package, in a particular pocket for a particular distro series is available.

To post a comment you must log in.
267. By Heber Parrucci

Fix tests to run parameter when running for first time

268. By Heber Parrucci

adding parameters for tests job

269. By Heber Parrucci

adding tests branch parameter

Revision history for this message
Jean-Baptiste Lallement (jibel) wrote :

LGTM. Thanks!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file 'qakit/ust/launch_tests_for_package.py'
2--- qakit/ust/launch_tests_for_package.py 1970-01-01 00:00:00 +0000
3+++ qakit/ust/launch_tests_for_package.py 2018-02-15 21:34:39 +0000
4@@ -0,0 +1,152 @@
5+#!/usr/bin/python
6+"""
7+Verify if there is a new version of a particular package
8+in a particular pocket for a particular series in Ubuntu
9+
10+"""
11+import argparse
12+import logging
13+from launchpadlib.launchpad import Launchpad
14+
15+from jenkins import Jenkins
16+
17+from qakit.config import Config
18+
19+DEBUGLEVEL = logging.DEBUG
20+SERIES_VERSION = ''
21+SERIES_NAME = ''
22+JOB_NAME = 'ust-ubuntu-{}-gnome-software'
23+PARAMETER_NAME = 'GNOME_SOFTWARE_VERSION'
24+TESTS_TO_RUN = 'ubuntu_system_tests.tests'
25+TESTS_BRANCH = 'lp:ubuntu-system-tests'
26+
27+
28+def set_logging(debugmode=False):
29+ """Initialize logging"""
30+ logging.basicConfig(
31+ level=logging.DEBUG if debugmode else logging.INFO,
32+ format="%(asctime)s %(levelname)s %(message)s")
33+ logging.debug('Debug mode enabled')
34+
35+
36+def get_package_version(source_name, pocket, distro_series, exact_match=True, order_by_date=True):
37+ global SERIES_VERSION, SERIES_NAME
38+ lp = Launchpad.login_anonymously('check-pkg-version', 'production')
39+ ubuntu = lp.distributions["ubuntu"]
40+ archive = ubuntu.main_archive
41+ if distro_series == 'current_series':
42+ series = getattr(ubuntu, distro_series)
43+ else:
44+ series = ubuntu.getSeries(name_or_version=distro_series)
45+ SERIES_VERSION = series.version
46+ SERIES_NAME = series.name
47+ return archive.getPublishedSources(source_name=source_name,
48+ pocket=pocket.capitalize(),
49+ distro_series=series,
50+ exact_match=exact_match,
51+ order_by_date=order_by_date)[0].source_package_version
52+
53+
54+def launch_job(source_name,
55+ pocket,
56+ distro_series,
57+ exact_match=True,
58+ order_by_date=True,
59+ job=JOB_NAME,
60+ parameter=PARAMETER_NAME,
61+ tests=TESTS_TO_RUN,
62+ tests_branch=TESTS_BRANCH):
63+ """
64+ Check if there is a new version of the package available and run the jenkins job accordingly
65+ :param source_name: Source package name
66+ :param pocket: The pocket into which this entry is published
67+ :param distro_series: Distro series name
68+ :param exact_match: Whether or not to filter source names by exact matching.
69+ :param order_by_date: Order by creation date. Return newest results first
70+ :param job: Jenkins job name to trigger tests if necessary
71+ :param parameter: Jenkins parameter name that represents package under test version
72+ :param tests: Tests to execute in the jenkins job
73+ :param tests_branch: Tests branch to use in the jenkins job
74+ """
75+ conf = Config()
76+ jenkins = Jenkins(conf.parser.get('jenkins', 'server'),
77+ conf.parser.get('jenkins', 'username'),
78+ conf.parser.get('jenkins', 'password'))
79+ current_version = get_package_version(source_name, pocket,
80+ distro_series,
81+ exact_match,
82+ order_by_date)
83+ job = job.format(SERIES_NAME)
84+ last_complete_build = jenkins.get_job_info(job)['lastCompletedBuild']
85+ if last_complete_build:
86+ last_build_number = last_complete_build['number']
87+ build_info = jenkins.get_build_info(job, last_build_number)
88+ last_version_tested = filter(
89+ lambda a: a['name'] == parameter,
90+ filter(lambda p: 'parameters' in p.keys(),
91+ build_info['actions'])[0]['parameters'])[0]['value']
92+ if last_version_tested != current_version:
93+ logging.debug('New version found for package: %s, '
94+ 'pocket: %s, distro_series: %s, version: %s. Running Jenkins job: %s',
95+ source_name, pocket, SERIES_VERSION, current_version, job)
96+ jenkins.build_job(job, {parameter: current_version,
97+ 'TESTS_TO_RUN': tests,
98+ 'POCKET': pocket,
99+ 'PACKAGE_NAME': source_name,
100+ 'UBUNTU_SYSTEM_TESTS_BRANCH': tests_branch})
101+ else:
102+ logging.debug('No complete build was found in Jenkins for package: %s, '
103+ 'pocket: %s, distro_series: %s, version: %s. Running Jenkins job: %s',
104+ source_name, pocket, SERIES_VERSION, current_version, job)
105+ jenkins.build_job(job, {parameter: current_version,
106+ 'TESTS_TO_RUN': tests,
107+ 'POCKET': pocket,
108+ 'PACKAGE_NAME': source_name,
109+ 'UBUNTU_SYSTEM_TESTS_BRANCH': tests_branch})
110+
111+
112+def _parse_arguments():
113+ """Parse command-line args, returning an argparse dict."""
114+
115+ parser = argparse.ArgumentParser("Check whether there is a new version of a particular package")
116+ parser.add_argument('-d', '--debug', action='store_true',
117+ default=False, help='enable debug mode')
118+ parser.add_argument('-s', '--source_name',
119+ help='Source package name')
120+ parser.add_argument('-p', '--pocket', default='proposed',
121+ help='The pocket into which this entry is published')
122+ parser.add_argument('--distro_series', default='current_series',
123+ help='Distro series name')
124+ parser.add_argument('-e', '--exact_match', action='store_true', default=True,
125+ help='Whether or not to filter source names by exact matching.')
126+ parser.add_argument('-o', '--order_by_date', action='store_true', default=True,
127+ help='Order by creation date. Return newest results first')
128+ parser.add_argument('-j', '--job', default=JOB_NAME,
129+ help='Jenkins job name to trigger tests if necessary')
130+ parser.add_argument('--parameter', default=PARAMETER_NAME,
131+ help='Jenkins parameter name that represents package under test version')
132+ parser.add_argument('-t', '--tests', default=TESTS_TO_RUN,
133+ help='Tests to execute in the jenkins job')
134+ parser.add_argument('-b', '--tests_branch', default=TESTS_BRANCH,
135+ help='Tests branch to use in the jenkins job')
136+ return parser.parse_args()
137+
138+
139+def main():
140+ """ Main routine """
141+ args = _parse_arguments()
142+ set_logging(args.debug)
143+ launch_job(
144+ args.source_name,
145+ args.pocket,
146+ args.distro_series,
147+ args.exact_match,
148+ args.order_by_date,
149+ args.job,
150+ args.parameter,
151+ args.tests,
152+ args.tests_branch)
153+
154+
155+if __name__ == "__main__":
156+ exit(main())

Subscribers

People subscribed via source and target branches