1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
#!/usr/bin/env python
import sys
from argparse import ArgumentParser
from jlp import SocketLock
from settings import LOCK_NAME, JENKINS_URL, logger
from launchpad import LaunchpadTrigger
import os
LAUNCHPADLIB_DIR_PREFIX = os.path.expanduser('~/.launchpadlib')
def trigger_ci_build(branch, job, jenkins_url, launchpadlib_dir):
"""Trigger a CI build."""
launchpad_trigger = LaunchpadTrigger(launchpadlib_dir)
mps = launchpad_trigger.get_merge_proposals(branch, ['Needs review'])
launchpad_trigger.trigger_ci_build(mps, job, jenkins_url)
def trigger_al_build(branch, job, jenkins_url, fasttrack_merge,
launchpadlib_dir):
"""Trigger an autolanding build."""
launchpad_trigger = LaunchpadTrigger(launchpadlib_dir)
mps = launchpad_trigger.get_merge_proposals(branch, ['Approved'])
launchpad_trigger.trigger_al_build(mps, job, jenkins_url, fasttrack_merge)
def trigger_jenkins(branch,
autoland=False,
trigger_ci=False,
job=None,
jenkins_url=None,
fasttrack_merge=False,
lock_name=''):
"""Trigger a Jenkins build."""
if jenkins_url is None:
jenkins_url = JENKINS_URL
launchpadlib_dir = '{}-{}'.format(LAUNCHPADLIB_DIR_PREFIX, lock_name)
logger.debug('Using "{}" as launchpadlib cache directory.'.format(
launchpadlib_dir))
if trigger_ci:
trigger_ci_build(branch, job, jenkins_url, launchpadlib_dir)
elif autoland:
trigger_al_build(branch, job, jenkins_url, fasttrack_merge,
launchpadlib_dir)
return 1
def main():
parser = ArgumentParser(
description="Trigger a Jenkins job resulting from a merge proposal.")
parser.add_argument('-b', '--branch', required=True,
help="the proposed Launchpad branch to merge")
parser.add_argument('-t', '--trigger-ci',
action='store_true',
help="trigger a 'CI' build")
parser.add_argument('-l', '--autoland',
action='store_true',
help="trigger an autolanding build")
parser.add_argument('-j', '--job', required=True,
help="name of the Jenkins job to trigger")
parser.add_argument('-e', '--jenkins-url',
help="URL of the Jenkins job to trigger")
parser.add_argument('-f', '--fasttrack-merge',
default=False,
action='store_true',
help='''skip the build process for simple branch
changes (i.e. changelog only updates)''')
parser.add_argument('-L', '--lock-name',
default='launchpadTrigger',
help='''Name of the lock and launchpadlib cache
to be used''')
args = vars(parser.parse_args())
if not args['trigger_ci'] and not args['autoland']:
parser.error(
'You need to specify one of --trigger-ci (-t) or --autoland (-l)')
# this is here because launchpadlib is not thread safe (yet)
# (see also lp:459418 and lp:1025153) and also to limit the
# amount of concurrent connections to launchpad
trigger_lock_name = '{prefix}-{instance_name}'.format(
prefix=LOCK_NAME,
instance_name=args['lock_name'])
logger.debug('Going to acquire launchpad lock "{}"'
' for launchpadTrigger'.format(trigger_lock_name))
with SocketLock(trigger_lock_name):
logger.debug('Lock acquired for launchpadTrigger')
return trigger_jenkins(**args)
if __name__ == "__main__":
sys.exit(main())
|