~fginther/jenkins-launchpad-plugin/indirect-team-membership

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())