diff --git a/playbooks/org.centos.prod.ci.pipeline.allpackages-pr.complete.yml b/playbooks/org.centos.prod.ci.pipeline.allpackages-pr.complete.yml new file mode 100644 index 0000000..7e0412d --- /dev/null +++ b/playbooks/org.centos.prod.ci.pipeline.allpackages-pr.complete.yml @@ -0,0 +1,14 @@ +--- +- name: buildsys.build.state.change + hosts: localhost + gather_facts: false + + vars_files: + - "/srv/private/vars_loopabull.yml" + + tasks: + - debug: var=msg + + roles: + - {role: flag_ci_pr, msg: msg} + diff --git a/playbooks/roles/flag_ci_pr/files/flag_ci_pr.py b/playbooks/roles/flag_ci_pr/files/flag_ci_pr.py new file mode 100644 index 0000000..0b6d6e2 --- /dev/null +++ b/playbooks/roles/flag_ci_pr/files/flag_ci_pr.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python + +# -*- coding: utf-8 -*- + +""" +This script takes as input the fedmsg messages published under the topic +``ci.pipeline.allpackages-pr.complete`` and flag the corresponding PR in +dist-git with the result of the tests. + +Authors: Pierre-Yves Chibon + +""" +from __future__ import unicode_literals + +import json +import os +import sys + +import requests +from requests.packages.urllib3.util import retry + + + +def main(msg): + """ Check if the build was successful and if so, flag the commit in + pagure. + """ + + timeout = (30, 30) + retries = 3 + requests_session = requests.Session() + retry_conf = retry.Retry( + total=retries, connect=retries, read=retries, backoff_factor=1) + retry_conf.BACKOFF_MAX = 5 + requests_session.mount( + 'http://', requests.adapters.HTTPAdapter(max_retries=retry_conf)) + requests_session.mount( + 'https://', requests.adapters.HTTPAdapter(max_retries=retry_conf)) + + done_states = { + 'SUCCESS': 'success', + 'UNSTABLE': 'failed', + 'FAILURE': 'error', + } + state = msg['status'] + if state not in done_states: + print('Build is not in one of the expected status, ignoring') + return + + pr_id = msg['rev'].partition('PR-')[2] + if not pr_id: + print( + 'Invalid revision: %s, could not extract the PR id from it' % + msg['rev']) + return + + + data = { + 'username': 'All packages PR', + 'status': done_states[state], + 'comment': 'Package tests: %s' % (done_states[state]), + 'url': _koji_link(msg), + } + + pagure_url = 'https://src.fedoraproject.org' + env_var = 'API_TOKEN' + if '.stg.' in request: + pagure_url = 'https://src.stg.fedoraproject.org' + env_var = 'API_TOKEN_STG' + + target_url = '/'.join([ + 'api', + '0', + msg['namespace'], + msg['repo'], + 'pull-request', + pr_id, + 'flag' + ]) + flag_url = pagure_url + '/' + target_url + print('Flagging commit at: %s' % flag_url) + + headers = { + "Authorization": "token " + os.environ.get(env_var), + 'User-Agent': 'loopabull@fedora-infra', + } + + print('payload: %s' % data) + + req = requests_session.request( + method='POST', + url=flag_url, + headers=headers, + data=data, + ) + print('Request to %s returned: %s' % (pagure_url, req.status_code)) + if not req.ok: + print(req.text) + return 1 + else: + print('All clear') + print('User-URL: %s' % pagure_url + '/' + '/'.join([ + msg['namespace'], + msg['repo'], + 'pull-request', + pr_id, + ])) + + +if __name__ == '__main__': + msg = sys.argv[1] + msg = json.loads(msg) + sys.exit(main(msg)) diff --git a/playbooks/roles/flag_ci_pr/tasks/main.yml b/playbooks/roles/flag_ci_pr/tasks/main.yml new file mode 100644 index 0000000..43896e8 --- /dev/null +++ b/playbooks/roles/flag_ci_pr/tasks/main.yml @@ -0,0 +1,21 @@ +- name: Install required packages + package: name="{{ item }}" state=present + with_items: + - python2-requests + +- name: Install script flagging PRs on dist-git upon test results being published + copy: + src: files/flag_ci_pr.py + dest: /usr/local/bin/flag_ci_pr.py + mode: 0755 + +- name: Run the script + command: /usr/local/bin/flag_ci_pr.py '{{ msg | to_json }}' + register: output + environment: + API_TOKEN: "{{ api_token_flag_pr_build }}" + API_TOKEN_STG: "{{ api_token_flag_pr_build_stg }}" + +- name: Show the output of the script + debug: + msg: "Output of the script: {{ output }}"