Add code to flag PR with the results from the CI pipeline
Signed-off-by: Pierre-Yves Chibon <pingou@pingoured.fr>
This commit is contained in:
parent
93a33ac797
commit
fed379c81b
3 changed files with 148 additions and 0 deletions
|
@ -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}
|
||||
|
113
playbooks/roles/flag_ci_pr/files/flag_ci_pr.py
Normal file
113
playbooks/roles/flag_ci_pr/files/flag_ci_pr.py
Normal file
|
@ -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 <pingou@pingoured.fr>
|
||||
|
||||
"""
|
||||
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))
|
21
playbooks/roles/flag_ci_pr/tasks/main.yml
Normal file
21
playbooks/roles/flag_ci_pr/tasks/main.yml
Normal file
|
@ -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 }}"
|
Loading…
Add table
Add a link
Reference in a new issue