Script src_fp_stg_ci_py
[hide private]
[frames] | no frames]

Source Code for Script script-src_fp_stg_ci_py

  1  #!/usr/bin/env python3 
  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  CLONE_URL_TEMPLATE = 'https://src.stg.fedoraproject.org/{path}.git' 
 25  #ENDPOINT = 'tcp://hub.fedoraproject.org:9940' 
 26  ENDPOINT = 'tcp://stg.fedoraproject.org:9940' 
 27  TOPIC = 'org.fedoraproject.stg.pagure.pull-request.new' 
 28  CHROOTS = ['fedora-rawhide-x86_64', 'fedora-rawhide-ppc64le', 
 29             'fedora-27-x86_64', 'fedora-27-ppc64le', 
 30             'fedora-26-x86_64', 'fedora-26-ppc64le', 
 31             'fedora-26-x86_64', 'fedora-26-ppc64le', 
 32             'epel-7-x86_64', 'epel-7-ppc64le'] 
 33   
34 -def ci_listener():
35 log.debug('Setting up poller...') 36 ctx = zmq.Context() 37 s = ctx.socket(zmq.SUB) 38 s.connect(ENDPOINT) 39 40 s.setsockopt_string(zmq.SUBSCRIBE, TOPIC) 41 42 poller = zmq.Poller() 43 poller.register(s, zmq.POLLIN) 44 45 while True: 46 log.debug('Polling...') 47 evts = poller.poll(10000) 48 if not evts: 49 continue 50 51 log.debug('Receiving...') 52 _, msg_bytes = s.recv_multipart() 53 msg = msg_bytes.decode("utf-8") 54 55 log.debug('Parsing...') 56 msg = json.loads(msg) 57 58 log.debug('Handling pagure msg %r' % msg.get('msg_id', None)) 59 prid = msg['msg']['pullrequest']['id'] 60 package = msg['msg']['pullrequest']['repo_from']['name'] 61 namespace = msg['msg']['pullrequest']['repo_from']['namespace'] 62 url_path = msg['msg']['pullrequest']['repo_from']['fullname'] 63 commit = msg['msg']['pullrequest']['commit_stop'] 64 username = msg['msg']['pullrequest']['repo_from']['user']['name'] 65 clone_url = CLONE_URL_TEMPLATE.format(path=url_path) 66 67 log.info('RECEIVED DATA:') 68 log.info('prid = {}'.format(prid)) 69 log.info('username = {}'.format(username)) 70 log.info('package = {}'.format(package)) 71 log.info('namespace = {}'.format(namespace)) 72 log.info('url_path = {}'.format(url_path)) 73 log.info('commit = {}'.format(commit)) 74 log.info('clone_url = {}'.format(clone_url)) 75 76 if namespace: 77 coprname = '{namespace}-{package}'.format(**{ 78 'namespace': namespace, 79 'package': package, 80 }) 81 else: 82 coprname = '{package}'.format(**{ 83 'package': package, 84 }) 85 86 user = models.User.query.filter(models.User.username == username).first() 87 88 if not user: 89 user = models.User( 90 username=username, mail="") 91 db.session.add(user) 92 93 copr = (models.Copr.query 94 .filter(models.Copr.name == coprname) 95 .filter(models.Copr.user_id == user.id)).first() 96 97 if not copr: 98 copr = CoprsLogic.add( 99 name=coprname, 100 user=user, 101 selected_chroots=CHROOTS, 102 check_for_duplicates=True) 103 db.session.add(copr) 104 105 build = BuildsLogic.create_new_from_scm(user, copr, 'git', clone_url, commit) 106 107 log.info('Starting build for PR {prid} in {user}/{project}'.format( 108 prid=prid, user=username, project=coprname)) 109 db.session.commit()
110 111 112 if __name__ == '__main__': 113 while True: 114 try: 115 ci_listener() 116 except KeyboardInterrupt: 117 sys.exit(1) 118 except: 119 log.exception('Error in fedmsg loop. Restarting it.') 120