1
2
3 import json
4 import zmq
5 import sys
6 import os
7 import logging
8
9 sys.path.append(
10 os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
11 )
12
13 from coprs import db, app, models
14 from coprs.logic.coprs_logic import CoprsLogic
15 from coprs.logic.builds_logic import BuildsLogic
16
17 logging.basicConfig(
18 filename='{0}/src-fp-stg-ci.log'.format(app.config.get('LOG_DIR')),
19 format='[%(asctime)s][%(levelname)6s]: %(message)s',
20 level=logging.DEBUG)
21 log = logging.getLogger(__name__)
22 log.addHandler(logging.StreamHandler(sys.stdout))
23
24 ENDPOINT = 'tcp://hub.fedoraproject.org:9940'
25 TOPIC = 'io.pagure.prod.pagure.pull-request.new'
26 CLONE_URL_TEMPLATE = 'https://pagure.io/{path}.git'
27 CHROOTS = ['fedora-rawhide-x86_64', 'fedora-rawhide-ppc64le',
28 'fedora-27-x86_64', 'fedora-27-ppc64le',
29 'fedora-26-x86_64', 'fedora-26-ppc64le',
30 'fedora-26-x86_64', 'fedora-26-ppc64le',
31 'epel-7-x86_64', 'epel-7-ppc64le']
32
34 log.debug('Setting up poller...')
35 ctx = zmq.Context()
36 s = ctx.socket(zmq.SUB)
37 s.connect(ENDPOINT)
38
39 s.setsockopt_string(zmq.SUBSCRIBE, TOPIC)
40
41 poller = zmq.Poller()
42 poller.register(s, zmq.POLLIN)
43
44 while True:
45 log.debug('Polling...')
46 evts = poller.poll(10000)
47 if not evts:
48 continue
49
50 log.debug('Receiving...')
51 _, msg_bytes = s.recv_multipart()
52 msg = msg_bytes.decode("utf-8")
53
54 log.debug('Parsing...')
55 msg = json.loads(msg)
56
57 log.debug('Handling pagure msg %r' % msg.get('msg_id', None))
58 prid = msg['msg']['pullrequest']['id']
59 package = msg['msg']['pullrequest']['repo_from']['name']
60 namespace = msg['msg']['pullrequest']['repo_from']['namespace']
61 url_path = msg['msg']['pullrequest']['repo_from']['fullname']
62 commit = msg['msg']['pullrequest']['commit_stop']
63 username = msg['msg']['pullrequest']['repo_from']['user']['name']
64 clone_url = CLONE_URL_TEMPLATE.format(path=url_path)
65
66 log.info('RECEIVED DATA:')
67 log.info('prid = {}'.format(prid))
68 log.info('username = {}'.format(username))
69 log.info('package = {}'.format(package))
70 log.info('namespace = {}'.format(namespace))
71 log.info('url_path = {}'.format(url_path))
72 log.info('commit = {}'.format(commit))
73 log.info('clone_url = {}'.format(clone_url))
74
75 if namespace:
76 coprname = '{namespace}-{package}-PR{prid}'.format(**{
77 'namespace': namespace,
78 'package': package,
79 'prid': prid
80 })
81 else:
82 coprname = '{package}-PR{prid}'.format(**{
83 'package': package,
84 'prid': prid
85 })
86
87 user = models.User.query.filter(models.User.username == username).first()
88
89 if not user:
90 user = models.User(
91 username=username, mail="")
92 db.session.add(user)
93
94 copr = (models.Copr.query
95 .filter(models.Copr.name == coprname)
96 .filter(models.Copr.user_id == user.id)).first()
97
98 if not copr:
99 copr = CoprsLogic.add(
100 name=coprname,
101 user=user,
102 selected_chroots=CHROOTS,
103 check_for_duplicates=True)
104 db.session.add(copr)
105
106 build = BuildsLogic.create_new_from_scm(user, copr, 'git', clone_url, commit)
107
108 log.info('Starting build for PR {prid} in {user}/{project}'.format(
109 prid=prid, user=username, project=coprname))
110 db.session.commit()
111
112
113 if __name__ == '__main__':
114 while True:
115 try:
116 ci_listener()
117 except KeyboardInterrupt:
118 sys.exit(1)
119 except:
120 log.exception('Error in fedmsg loop. Restarting it.')
121